[
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# How to Contribute\n\nGreat to see you! Help us out by [filing bugs or feature requests](#work-with-issues), assisting others [in our forums](https://forum.bpmn.io/), or [contributing improvements](#contribute-improvements).\n\n## Table of Contents\n\n* [Work with Issues](#work-with-issues)\n  * [Create an Issue](#create-an-issue)\n  * [Help Out](#help-out)\n* [Contribute Improvements](#contribute-improvements)\n  * [Setup the Project](#setup-the-project)\n  * [Build and Run the Project](#build-and-run-the-project)\n  * [Discuss Code Changes](#discuss-code-changes)\n  * [Adhere to the Unit Test Style](#adhere-to-the-unit-test-style)\n  * [Create a Pull Request](#create-a-pull-request)\n\n## Work with Issues\n\nWe use our [issue tracker](https://github.com/bpmn-io/bpmn-js/issues) for project communication, discussion, and planning.\n\n### Create an Issue\n\nFile bug reports or feature requests via [our issue tracker](https://github.com/bpmn-io/bpmn-js/issues/new/choose). Please mind the existing issue templates. These guide you and ensure you provide the details needed for us to follow up on your issue.\n\n### Help Out\n\n* Share your perspective on issues\n* Be helpful and respect others when commenting\n\n## Contribute Improvements\n\nLearn how to set up the project locally, make changes, and contribute bug fixes and new features through pull requests.\n\n### Setup the Project\n\nThe project development runs on top of the [diagram-js](https://github.com/bpmn-io/diagram-js) `develop` branch. The following code snippet sets up both libraries linking diagram-js to bpmn-js.\n\n```sh\nmkdir bpmn.io\ncd bpmn.io\n\ngit clone git@github.com:bpmn-io/diagram-js.git -b develop\n(cd diagram-js && npm i)\n\ngit clone git@github.com:bpmn-io/bpmn-js.git\n(cd bpmn-js && npm install && npm link ../diagram-js)\n```\n\nFor details consult our in depth [setup guide](../docs/project/SETUP.md).\n\n### Build and Run the Project\n\nSpin up a single modeler instance for local inspection:\n\n```sh\nnpm start\n```\n\nSpin up the development environment, re-run tests with every file change:\n\n```sh\nnpm run dev\n```\n\nYou may also run against different browsers:\n\n```sh\nTEST_BROWSERS=Firefox npm run dev\n```\n\nBuild, lint, and test the project, just as the CI does.\n\n```sh\nnpm run all\n```\n\n### Discuss Code Changes\n\nCreate a [pull request](#create-a-pull-request) if you would like to have an in-depth discussion about some piece of code.\n\n### Adhere to the Unit Test Style\n\nIn order to retrieve a sign-off for your contribution, it needs to be sufficiently and well tested. Please structure your unit tests into __given__, __when__ and __then__ ([ModelerSpec example](https://github.com/bpmn-io/bpmn-js/blob/develop/test/spec/ModelerSpec.js#L116), [ResizeBehaviorSpec example](https://github.com/bpmn-io/bpmn-js/blob/develop/test/spec/features/modeling/behavior/ResizeBehaviorSpec.js#L38)). To increase overall readability and understandability please also leave two empty lines before `describe(...)`, `it(...)` or _setup_ blocks on the same indentation level ([ModelerSpec example](https://github.com/bpmn-io/bpmn-js/blob/develop/test/spec/ModelerSpec.js#L49), [ResizeBehaviorSpec example](https://github.com/bpmn-io/bpmn-js/blob/develop/test/spec/features/modeling/behavior/ResizeBehaviorSpec.js#L36)).\n\n### Create a Pull Request\n\nWe use pull requests for feature additions and bug fixes. If you are not yet familiar with pull requests, [read this excellent guide](https://gun.io/blog/how-to-github-fork-branch-and-pull-request).\n\nSome things that make it easier for us to accept your pull requests\n\n* The code adheres to our conventions\n  * spaces instead of tabs\n  * single-quotes\n  * ...\n* The code is tested\n* The `npm run all` build passes (executes tests + linting)\n* The work is combined into a single commit\n* The commit messages adhere to the [conventional commits guidelines](https://www.conventionalcommits.org)\n\nWe'd be glad to assist you if you do not get these things right in the first place.\n\n---\n\nThanks for your interest in our library.\n\n:heart: from the bpmn.io team.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/BUG_REPORT.md",
    "content": "---\nname: Bug report\nabout: Report a problem and help us fix it.\nlabels: \"bug\"\n---\n\n\n### Describe the Bug\n\n<!-- A clear and concise description of what the bug is. -->\n\n\n### Steps to Reproduce\n\n1. do this\n2. do that\n\n<!--\nIf you report a modeling related issue, ensure you can reproduce it on [demo.bpmn.io](https://demo.bpmn.io/new)\n\nWhen reporting a library error, try to build an example that reproduces your problem. You can use our playgrounds for [viewer](https://jsfiddle.net/07envcu1/) or [modeler](https://jsfiddle.net/bg97r61t/) as a starting point or put a demo up on [GitHub](https://github.com/) for inspection.\n-->\n\n### Expected Behavior\n\n<!-- A clear and concise description of what you expected to happen. -->\n\n\n### Environment\n\n - Browser: [e.g. IE 11, Chrome 69]\n - OS: [e.g. Windows 7]\n - Library version: [e.g. 2.0.0]\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/FEATURE_REQUEST.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea or general improvement.\nlabels: \"enhancement\"\n---\n\n\n### Is your feature request related to a problem? Please describe.\n\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n\n### Describe the solution you'd like\n\nA clear and concise description of what you want to happen.\n\n### Describe alternatives you've considered\n\nA clear and concise description of any alternative solutions or features you've considered.\n\n\n### Additional context\n\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/TASK.md",
    "content": "---\nname: Task\nabout: Describe a generic activity we should carry out.\n---\n\n\n### What should we do?\n\n<!-- Clearly describe the activity we should carry out. -->\n\n\n### Why should we do it?\n\n<!-- Argue why doing it is a healthy investment of our time. -->"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: Ask a question\n    url: https://forum.bpmn.io\n    about: Head over to our community forum to ask questions and get answers."
  },
  {
    "path": ".github/merge-me.yml",
    "content": "reviewTeams:\n- modeling-dev\n- modeling-design\n"
  },
  {
    "path": ".github/workflows/CI.yml",
    "content": "name: CI\non: [ push, pull_request ]\njobs:\n  build_browsers:\n\n    strategy:\n      fail-fast: false\n      matrix:\n        os: [ ubuntu-latest ]\n        browser: [ Firefox, ChromeHeadless ]\n\n    runs-on: ${{ matrix.os }}\n\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v6\n    - name: Use Node.js\n      uses: actions/setup-node@v6\n      with:\n        node-version: 24\n        cache: 'npm'\n    - name: Install dependencies\n      run: npm ci\n    - name: Setup project\n      uses: bpmn-io/actions/setup@latest\n    - name: Build (with coverage)\n      if: matrix.browser == 'ChromeHeadless'\n      env:\n        COVERAGE: 1\n        TEST_BROWSERS: ${{ matrix.browser }}\n      run: npm run all\n    - name: Build\n      if: matrix.browser == 'Firefox'\n      env:\n        TEST_BROWSERS: ${{ matrix.browser }}\n      run: xvfb-run npm run all\n    - name: Upload coverage\n      if: matrix.browser == 'ChromeHeadless'\n      uses: codecov/codecov-action@v5\n      with:\n        fail_ci_if_error: true\n      env:\n        CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}\n\n  build_os:\n\n    strategy:\n      fail-fast: false\n      matrix:\n        os: [ macos-latest, windows-latest ]\n        browser: [ ChromeHeadless ]\n\n    runs-on: ${{ matrix.os }}\n\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v6\n    - name: Use Node.js\n      uses: actions/setup-node@v6\n      with:\n        node-version: 24\n        cache: 'npm'\n    - name: Install dependencies\n      run: npm ci\n    - name: Setup project\n      uses: bpmn-io/actions/setup@latest\n    - name: Build\n      env:\n        TEST_BROWSERS: ${{ matrix.browser }}\n      run: npm run all\n"
  },
  {
    "path": ".github/workflows/CODE_SCANNING.yml",
    "content": "name: \"Code Scanning\"\n\non:\n  push:\n    branches: [ main, develop ]\n  pull_request:\n    branches: [ main, develop ]\n    paths-ignore:\n      - '**/*.md'\n\njobs:\n  codeql-build:\n    # CodeQL runs on ubuntu-latest, windows-latest, and macos-latest\n    runs-on: ubuntu-latest\n\n    permissions:\n      # required for all workflows\n      security-events: write\n\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n\n      # Initializes the CodeQL tools for scanning.\n      - name: Initialize CodeQL\n        uses: github/codeql-action/init@v4\n        with:\n          languages: javascript\n          config: |\n            paths-ignore:\n              - '**/test'\n\n      - name: Perform CodeQL Analysis\n        uses: github/codeql-action/analyze@v4\n"
  },
  {
    "path": ".github/workflows/COMMENT_TARGETS_MAIN.yml",
    "content": "name: COMMENT_TARGETS_MAIN\non:\n  pull_request:\n    types:\n      - opened\n    branches:\n      - main\npermissions:\n  pull-requests: write\njobs:\n  comment:\n    name: Comment on targeting main branch\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n    steps:\n      - name: Create comment\n        env:\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          GH_REPO: ${{ github.repository }}\n          NUMBER: ${{ github.event.number }}\n          BODY: |\n            This pull request targets the `main` branch. Please target `main` for bug fixes only. Target `develop` for regular feature development.\n        run: gh issue comment \"$NUMBER\" --body \"$BODY\""
  },
  {
    "path": ".github/workflows/MERGE_MAIN_TO_DEVELOP.yml",
    "content": "name: MERGE_MAIN_TO_DEVELOP\non:\n  push:\n    branches:\n    - \"main\"\n\njobs:\n  merge_main_to_develop:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n\n    steps:\n    - name: Checkout develop\n      uses: actions/checkout@v6\n      with:\n        token: ${{ secrets.BPMN_IO_TOKEN }}\n        persist-credentials: true\n        ref: develop\n        fetch-depth: 0\n    - name: Merge main to develop and push\n      run: |\n        git config user.name '${{ secrets.BPMN_IO_USERNAME }}'\n        git config user.email '${{ secrets.BPMN_IO_EMAIL }}'\n        git merge -m 'chore: merge main to develop' --no-edit origin/main\n        git push\n\n    - name: Notify failure on Slack\n      if: failure()\n      uses: slackapi/slack-github-action@v3\n      with:\n        method: chat.postMessage\n        token: ${{ secrets.SLACK_BOT_TOKEN }}\n        payload: |\n          channel: ${{ secrets.SLACK_CHANNEL_ID }}\n          text: \"Automatic merge of <https://github.com/${{ github.repository }}/tree/${{ github.ref }}|${{ github.ref }}> to <https://github.com/${{ github.repository }}/tree/develop|${{ github.repository }}#develop> failed.\"\n"
  },
  {
    "path": ".github/workflows/POST_RELEASE.yml",
    "content": "name: POST_RELEASE\non:\n  push:\n    tags:\n      - 'v[0-9]+.[0-9]+.[0-9]+'\n\njobs:\n  post_release:\n\n    strategy:\n      matrix:\n        os: [ ubuntu-latest ]\n        node-version: [ 20 ]\n\n    runs-on: ${{ matrix.os }}\n    steps:\n\n    - name: Checkout\n      uses: actions/checkout@v6\n\n    - name: Use Node.js\n      uses: actions/setup-node@v6\n      with:\n        node-version: ${{ matrix.node-version }}\n        cache: 'npm'\n        \n    - name: Setup project\n      uses: bpmn-io/actions/setup@latest\n\n    - name: Set TAG\n      run: echo \"TAG=$(git describe --tags --abbrev=0)\" >> $GITHUB_ENV\n\n    - name: Wait for published\n      env:\n        PKG: 'bpmn-js@${{ env.TAG }}'\n      run: tasks/stages/await-published\n\n    - name: Update integration test\n      env:\n        BPMN_IO_TOKEN: ${{ secrets.BPMN_IO_TOKEN }}\n        BPMN_IO_EMAIL: ${{ secrets.BPMN_IO_EMAIL }}\n        BPMN_IO_USERNAME: ${{ secrets.BPMN_IO_USERNAME }}\n      run: tasks/stages/update-integration-test\n\n    - name: Update demo\n      env:\n        BPMN_IO_TOKEN: ${{ secrets.BPMN_IO_TOKEN }}\n        BPMN_IO_EMAIL: ${{ secrets.BPMN_IO_EMAIL }}\n        BPMN_IO_USERNAME: ${{ secrets.BPMN_IO_USERNAME }}\n        BPMN_IO_DEMO_ENDPOINT: ${{ secrets.BPMN_IO_DEMO_ENDPOINT }}\n      run: tasks/stages/update-demo\n\n    - name: Update examples\n      env:\n        BPMN_IO_TOKEN: ${{ secrets.BPMN_IO_TOKEN }}\n        BPMN_IO_EMAIL: ${{ secrets.BPMN_IO_EMAIL }}\n        BPMN_IO_USERNAME: ${{ secrets.BPMN_IO_USERNAME }}\n      run: tasks/stages/update-examples\n\n    - name: Update website\n      env:\n        BPMN_IO_TOKEN: ${{ secrets.BPMN_IO_TOKEN }}\n        BPMN_IO_EMAIL: ${{ secrets.BPMN_IO_EMAIL }}\n        BPMN_IO_USERNAME: ${{ secrets.BPMN_IO_USERNAME }}\n      run: tasks/stages/update-website\n\n    - name: Update translations\n      env:\n        GITHUB_TOKEN: ${{ secrets.BPMN_IO_TOKEN }}\n        BPMN_IO_EMAIL: ${{ secrets.BPMN_IO_EMAIL }}\n        BPMN_IO_USERNAME: ${{ secrets.BPMN_IO_USERNAME }}\n        REVIEWERS: 'bpmn-io/modeling-dev'\n        TAG: ${{ env.TAG }}\n      run: tasks/stages/update-translations\n"
  },
  {
    "path": ".github/workflows/RELEASE.yml",
    "content": "name: RELEASE\non:\n  push:\n    branches:\n      - main\n      - develop\njobs:\n  release_please:\n    outputs:\n      release_created: ${{ steps.release.outputs.release_created }}\n      tag: ${{ steps.release.outputs.tag_name }}\n    permissions:\n      contents: write # to create release commit (google-github-actions/release-please-action)\n      pull-requests: write # to create release PR (google-github-actions/release-please-action)\n\n    runs-on: ubuntu-latest\n    steps:\n      - uses: google-github-actions/release-please-action@v4\n        id: release\n        with:\n          token: ${{ secrets.GITHUB_TOKEN }}\n          target-branch: main\n          release-type: node\n\n  publish:\n    needs: release_please\n    if: ${{ needs.release_please.outputs.release_created }}\n\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v6\n      - name: Use Node.js\n        uses: actions/setup-node@v6\n        with:\n          node-version: 24\n          cache: 'npm'\n          registry-url: 'https://registry.npmjs.org'\n      - name: Install dependencies\n        run: npm ci\n      - run: npm publish\n        env:\n          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}"
  },
  {
    "path": ".gitignore",
    "content": "node_modules/\ndist/\ncoverage/\nlib/**/*.d.ts\n.idea\n*.iml\n.DS_Store"
  },
  {
    "path": ".release-please-manifest.json",
    "content": "{\n  \"pull-request-title-pattern\": \"chore: release v${version}\",\n  \"changelog-sections\": \"[{\\\"type\\\":\\\"feat\\\",\\\"section\\\":\\\"Features\\\",\\\"hidden\\\":false},{\\\"type\\\":\\\"fix\\\",\\\"section\\\":\\\"Bug Fixes\\\",\\\"hidden\\\":false},{\\\"type\\\":\\\"deps\\\",\\\"section\\\":\\\"Dependency Updates\\\",\\\"hidden\\\":false}]\",\n  \"changelog-type\": \"github\",\n  \".\": \"18.13.0\"\n}"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\n\nAll notable changes to [bpmn-js](https://github.com/bpmn-io/bpmn-js) are documented here. We use [semantic versioning](http://semver.org/) for releases.\n\n## Unreleased\n\n___Note:__ Yet to be released changes appear here._\n\n* `FIX`: disable grouping in popup menu during search ([bpmn-io/diagram-js#1014](https://github.com/bpmn-io/diagram-js/pull/1014))\n* `FIX`: correct handling of annotations during sub-process collapse/expand, copy/paste, and remove actions ([#2388](https://github.com/bpmn-io/bpmn-js/pull/2388))\n* `FIX`: allow undo of pasted sub-process ([#2388](https://github.com/bpmn-io/bpmn-js/pull/2388), [#2269](https://github.com/bpmn-io/bpmn-js/issues/2269))\n* `DEPS`: update to `diagram-js@15.10.0`\n\n## 18.13.1\n\n* `FIX`: correct sequence flow layout for corner boundary events whose target is strictly axis-aligned ([#2270](https://github.com/bpmn-io/bpmn-js/issues/2270))\n\n## 18.13.0\n\n* `FEAT`: allow to create child elements from the context pad ([#2391](https://github.com/bpmn-io/bpmn-js/issues/2391))\n\n## 18.12.1\n\n* `FIX`: correctly replace non-interrupting event with an interrupting one ([#2313](https://github.com/bpmn-io/bpmn-js/issues/2313))\n\n## 18.12.0\n\n* `FEAT`: activate wheel zoom/scoll on `mouseover` ([#1008](https://github.com/bpmn-io/diagram-js/pull/1008))\n* `FEAT`: prevent keyboard movement for boundary events without host ([#2386](https://github.com/bpmn-io/bpmn-js/pull/2386))\n* `FIX`: prevent accidental creation of intermediate events during keyboard move ([#1803](https://github.com/bpmn-io/bpmn-js/issues/1803), [#1876](https://github.com/bpmn-io/bpmn-js/issues/1876))\n* `DEPS`: update to `diagram-js@15.9.0`\n\n## 18.11.0\n\n* `FEAT`: add `cut` action and keyboard shortcut ([bpmn-io/diagram-js#1006](https://github.com/bpmn-io/diagram-js/pull/1006))\n* `DEPS`: update to `diagram-js@15.7.0`\n* `DEPS`: update to `bpmn-moddle@10.0.0`\n* `DEPS`: update to `min-dash@5.0.0`\n* `DEPS`: update to `ids@3.0.0`\n* `DEPS`: update to `tiny-svg@4.1.4`\n* `DEPS`: update to `diagram-js-direct-editing@3.3.0`\n* `DEPS`: update to `min-dom@5.2.0`\n\n## 18.10.1\n\n* `DEPS`: update to `min-dash@4.2.3`\n* `DEPS`: update to `tiny-svg@3.1.3`\n\n## 18.10.0\n\n* `FEAT`: add ability to duplicate elements ([bpmn-io/diagram-js#998](https://github.com/bpmn-io/diagram-js/pull/998))\n* `DEPS`: update to `diagram-js@15.5.0`\n\n## 18.9.1\n\n* `FIX`: only draw links for currently selected elements ([#2365](https://github.com/bpmn-io/bpmn-js/pull/2365))\n\n## 18.9.0\n\n* `FEAT`: visually link external label with its target ([#2328](https://github.com/bpmn-io/bpmn-js/pull/2328))\n* `FEAT`: add support for labels to `OutlineProvider#getOutline`\n* `FIX`: ensure `BpmnRenderer#getShapePath` returns correct path for labels\n\n## 18.8.0\n\n* `FEAT`: allow copying data object references and `isCollection` property ([#2348](https://github.com/bpmn-io/bpmn-js/pull/2348))\n\n## 18.7.0\n\n* `FEAT`: support disabled entries in popup menu ([bpmn-io/diagram-js#987](https://github.com/bpmn-io/diagram-js/pull/987))\n* `DEPS`: update to `diagram-js@15.4.0`\n\n## 18.6.5\n\n* `FIX`: ensure popup menu keyboard navigation accounts for group order ([bpmn-io/diagram-js#989](https://github.com/bpmn-io/diagram-js/pull/989))\n* `DEPS`: update to `diagram-js@15.3.1`\n\n## 18.6.4\n\n* `FIX`: revert `AdHocSubProcess#cancelRemainingInstances` default value removal ([bpmn-io/bpmn-moddle#132](https://github.com/bpmn-io/bpmn-moddle/pull/132))\n* `DEPS`: update to `bpmn-moddle@9.0.4`\n\n## 18.6.3\n\n* `FIX`: remove `AdHocSubProcess#cancelRemainingInstances` default value ([bpmn-io/bpmn-moddle#131](https://github.com/bpmn-io/bpmn-moddle/issues/131))\n* `DEPS`: update to `bpmn-moddle@9.0.3`\n\n## 18.6.2\n\n* `FIX`: center task markers ([#1995](https://github.com/bpmn-io/bpmn-js/issues/1995))\n\n## 18.6.1\n\n* `FIX`: copy error, escalation, message and signal references when copying elements ([#1906](https://github.com/bpmn-io/bpmn-js/issues/1906), [#2249](https://github.com/bpmn-io/bpmn-js/issues/2249), [#2301](https://github.com/bpmn-io/bpmn-js/pull/2301))\n\n## 18.6.0\n\n* `FEAT`: support searching through arrays in popup menu ([bpmn-io/diagram-js#970](https://github.com/bpmn-io/diagram-js/pull/970))\n* `FEAT`: prioritize `search` over `description` when matching popup menu entries ([bpmn-io/diagram-js#963](https://github.com/bpmn-io/diagram-js/pull/963))\n* `FEAT`: sort `search` terms across all keys ([bpmn-io/diagram-js#963](https://github.com/bpmn-io/diagram-js/pull/963))\n* `FIX`: always select first search entry ([bpmn-io/diagram-js#967](https://github.com/bpmn-io/diagram-js/pull/967))\n* `DEPS`: update to `diagram-js@15.3.0`\n\n## 18.5.0\n\n* `FEAT`: allow text annotations for message flows ([#2281](https://github.com/bpmn-io/bpmn-js/issues/2281))\n\n## 18.4.0\n\n* `FEAT`: render collapsed event subprocess icons ([#50](https://github.com/bpmn-io/bpmn-js/issues/50))\n\n## 18.3.2\n\n* `FIX`: remove default start event for ad-hoc subprocess ([#2295](https://github.com/bpmn-io/bpmn-js/issues/2295))\n* `FIX`: show modeling feedback error for data objects ([#2290](https://github.com/bpmn-io/bpmn-js/pull/2290))\n\n## 18.3.1\n\n* `FIX`: move artifacts when a participant is resized by space tool ([#2285](https://github.com/bpmn-io/bpmn-js/pull/2285))\n\n## 18.3.0\n\n* `FEAT`: allow to replace between variants of typed events ([#2282](https://github.com/bpmn-io/bpmn-js/pull/2282))\n\n## 18.2.0\n\n* `FEAT`: add ad-hoc subprocess option to replace menu ([#2276](https://github.com/bpmn-io/bpmn-js/pull/2276))\n\n## 18.1.2\n\n* `FIX`: canvas `autoFocus` must explicitly be enabled ([bpmn-io/diagram-js#956](https://github.com/bpmn-io/diagram-js/pull/956))\n* `FIX`: properly integrate `zoomscroll` with canvas focus ([bpmn-io/diagram-js#956](https://github.com/bpmn-io/diagram-js/pull/956))\n* `FIX`: properly integrate `movecanvas` with canvas focus ([bpmn-io/diagram-js#956](https://github.com/bpmn-io/diagram-js/pull/956))\n\n## 18.1.1\n\n* `FIX`: adjust search to prioritize start of word and exact matches ([bpmn-io/diagram-js#953](https://github.com/bpmn-io/diagram-js/pull/953))\n* `FIX`: ignore whitespace when searching ([bpmn-io/diagram-js#954](https://github.com/bpmn-io/diagram-js/pull/954))\n\n## 18.1.0\n\n* `FIX`: clear selection when opening search pad ([bpmn-io/diagram-js#947](https://github.com/bpmn-io/diagram-js/pull/947))\n* `FIX`: correct dangling selection after search pad interaction ([bpmn-io/diagram-js#947](https://github.com/bpmn-io/diagram-js/pull/947))\n* `DEPS`: update to `diagram-js@15.2.2`\n\n## 18.0.0\n\n* `FEAT`: remove `outline` from `Viewer` modules ([#2135](https://github.com/bpmn-io/bpmn-js/issues/2135))\n* `FEAT`: make `Canvas` a focusable element ([bpmn-io/diagram-js#662](https://github.com/bpmn-io/diagram-js/pull/662))\n* `FEAT`: implicit keyboard binding ([bpmn-io/diagram-js#662](https://github.com/bpmn-io/diagram-js/pull/662))\n* `FEAT`: integrate with global `search` ([#2235](https://github.com/bpmn-io/bpmn-js/pull/2235))\n* `FEAT`: integrate `popup-menu` with `search` ([bpmn-io/diagram-js#932](https://github.com/bpmn-io/diagram-js/pull/932))\n* `FEAT`: recognize modern `search` tokens in `search-pad` ([bpmn-io/diagram-js#932](https://github.com/bpmn-io/diagram-js/pull/932))\n* `FIX`: correctly handle duplicate entries and whitespace in `search` ([bpmn-io/diagram-js#932](https://github.com/bpmn-io/diagram-js/pull/932))\n* `FIX`: find `search` terms across all keys ([bpmn-io/diagram-js#932](https://github.com/bpmn-io/diagram-js/pull/932))\n* `FIX`: `search` always returns tokens for matched items ([bpmn-io/diagram-js#932](https://github.com/bpmn-io/diagram-js/pull/932))\n* `FIX`: prevent crash during label adjustment ([#2239](https://github.com/bpmn-io/bpmn-js/issues/2239))\n* `FIX`: keep existing loop characteristics when toggling through the replace menu ([#2251](https://github.com/bpmn-io/bpmn-js/pull/2251))\n* `FIX`: prevent covering multi selection with black box in `Viewer` ([#2135](https://github.com/bpmn-io/bpmn-js/issues/2135))\n* `FIX`: generate types for main entry ([`986e2bb`](https://github.com/bpmn-io/bpmn-js/commit/986e2bb51ea301e6e0df56f3606a27424fb90179))\n* `FIX`: correct handling of group name with whitespace only ([#2231](https://github.com/bpmn-io/bpmn-js/issues/2231))\n* `DEPS`: update to `bpmn-moddle@9` ([#2114](https://github.com/bpmn-io/bpmn-js/pull/2114))\n* `DEPS`: update to `diagram-js@15.1.0`\n* `DEPS`: update to `diagram-js-direct-editing@3.2.0`\n\n### Breaking Changes\n\n* Require `Node >= 20`\n* `Canvas` is now a focusable element and provides better support for native browser behaviors. Focus can be controlled with new `focus` and `restoreFocus` APIs ([bpmn-io/diagram-js#662](https://github.com/bpmn-io/diagram-js/pull/662)).\n* Keyboard is now implicitly bound to canvas SVG element. Calls to `keyboard.bind` and `keyboard.bindTo` now result with a descriptive console error and have no effect ([bpmn-io/diagram-js#662](https://github.com/bpmn-io/diagram-js/pull/662)).\n* Selection outline is no longer included in the viewer. If needed, add it as an additional module ([#2253](https://github.com/bpmn-io/bpmn-js/pull/2253)).\n\n## 17.11.1\n\n* `FIX`: handle searching elements without labels ([#2232](https://github.com/bpmn-io/bpmn-js/issues/2232), [#2234](https://github.com/bpmn-io/bpmn-js/pull/2234))\n\n## 17.11.0\n\n* `FEAT`: align search styles with other popups ([#2187](https://github.com/bpmn-io/bpmn-js/pull/2187))\n* `FEAT`: prioritize start of tokens in search results ([#2187](https://github.com/bpmn-io/bpmn-js/pull/2187))\n* `FIX`: do not commit viewport changes on `ESC` ([#2189](https://github.com/bpmn-io/bpmn-js/issues/2189), [#2187](https://github.com/bpmn-io/bpmn-js/pull/2187))\n* `DEPS`: update to `diagram-js@14.10.0`\n\n## 17.10.0\n\n* `CHORE`: correct various type hints ([#2228](https://github.com/bpmn-io/bpmn-js/issues/2228))\n* `FIX`: pasting compensation activity without boundary event ([#2070](https://github.com/bpmn-io/bpmn-js/issues/2070))\n* `FIX`: lane resize constraints for se and nw direction ([#2209](https://github.com/bpmn-io/bpmn-js/issues/2209))\n* `FIX`: auto place elements vertically in sub-processes ([#2127](https://github.com/bpmn-io/bpmn-js/issues/2127))\n* `FIX`: hide lane label during direct editing\n* `DEPS`: update to `diagram-js@14.9.0`\n\n## 17.9.2\n\n* `FIX`: keep direction when collapsing pools ([#2208](https://github.com/bpmn-io/bpmn-js/issues/2208))\n\n## 17.9.1\n\n* `FIX`: show delete action for labels ([#2163](https://github.com/bpmn-io/bpmn-js/issues/2163))\n\n## 17.9.0\n\n* `FIX`: remove incorrect attribute in replace menu ([#2196](https://github.com/bpmn-io/bpmn-js/pull/2196))\n* `DEPS`: update to diagram-js@14.7.2\n\n## 17.8.3\n\n* `FIX`: add accessible label to drill down button ([#2194](https://github.com/bpmn-io/bpmn-js/pull/2194))\n\n## 17.8.2\n\n* `FIX`: do not suggest root elements in search ([#2143](https://github.com/bpmn-io/bpmn-js/issues/2143))\n\n## 17.8.1\n\n* `FIX`: gracefully handle missing process DI in drilldown ([#2180](https://github.com/bpmn-io/bpmn-js/pull/2180))\n* `FIX`: do not cause HTML validation errors on move preview ([#2179](https://github.com/bpmn-io/bpmn-js/issues/2179))\n* `DEPS`: update to `diagram-js@14.7.1`\n\n## 17.8.0\n\n* `FEAT`: keep global elements when deleting last participant ([#2175](https://github.com/bpmn-io/bpmn-js/pull/2175))\n* `FIX`: allow undo after deleting last participants and data store ([#1676](https://github.com/bpmn-io/bpmn-js/issues/1676))\n* `FIX`: allow styling markers with `canvas.addMarker` and css ([#2173](https://github.com/bpmn-io/bpmn-js/pull/2173))\n* `CHORE`: render flow markers as part of `djs-visual` ([#2173](https://github.com/bpmn-io/bpmn-js/pull/2173))\n* `DEPS`: update to `diagram-js@14.7.0`\n\n## 17.7.1\n\n* `FIX`: correct call activity outline ([#2167](https://github.com/bpmn-io/bpmn-js/issues/2167))\n* `FIX`: gracefully handle missing `BPMNDiagram#plane` ([#2172](https://github.com/bpmn-io/bpmn-js/pull/2172), [#2171](https://github.com/bpmn-io/bpmn-js/pull/2171))\n\n## 17.7.0\n\n* `DEPS`: update to `diagram-js@14.6.0`\n\n## 17.6.4\n\n* `DEPS`: update to `diagram-js@14.5.4`\n\n## 17.6.3\n\n* `DEPS`: update to `diagram-js@14.5.3`\n\n## 17.6.2\n\n* `DEPS`: update to `diagram-js@14.5.2` ([#2158](https://github.com/bpmn-io/bpmn-js/pull/2158))\n\n## 17.6.1\n\n* `DEPS`: update to `diagram-js@14.5.1` ([#2157](https://github.com/bpmn-io/bpmn-js/pull/2157))\n\n## 17.6.0\n\n* `FEAT`: add ability to type services and events ([#2121](https://github.com/bpmn-io/bpmn-js/issues/2121), [#2153](https://github.com/bpmn-io/bpmn-js/pull/2153))\n* `FIX`: remove preview on context pad close ([#2150](https://github.com/bpmn-io/bpmn-js/issues/2150))\n* `FIX`: use tagged template in error logging ([#2151](https://github.com/bpmn-io/bpmn-js/pull/2151))\n\n## 17.5.0\n\n* `FEAT`: remove direct editing outline for embedded labels ([#2147](https://github.com/bpmn-io/bpmn-js/pull/2147))\n* `FEAT`: do not translate technical errors ([#2145](https://github.com/bpmn-io/bpmn-js/pull/2145))\n* `DEPS`: update to `diagram-js-direct-editing@3.0.1`\n\n## 17.4.0\n\n* `FEAT`: do not scale popup menu and context pad\n* `DEPS`: update to `diagram-js@14.4.1`\n\n## 17.3.0\n\n* `FEAT`: auto-place elements vertically ([#2110](https://github.com/bpmn-io/bpmn-js/issues/2110))\n\n## 17.2.2\n\n* `FIX`: correct navigated viewer outline ([#2133](https://github.com/bpmn-io/bpmn-js/issues/2133))\n\n## 17.2.1\n\n* `FIX`: render popup menu on top\n* `DEPS`: update to `diagram-js@14.3.1`\n\n## 17.2.0\n\n* `FEAT`: make popup menu keyboard navigatable\n* `FIX`: address various accessibility issues\n* `FIX`: correct various typing issues\n* `DEPS`: update to `diagram-js@14.3.0`\n* `DEPS`: update to `diagram-js-direct-editing@2.1.2`\n\n## 17.1.0\n\n* `FEAT`: handle splitting vertical lanes ([#2101](https://github.com/bpmn-io/bpmn-js/pull/2101))\n\n## 17.0.2\n\n* `FIX`: create hit boxes for vertical lanes ([#2093](https://github.com/bpmn-io/bpmn-js/issues/2093))\n\n## 17.0.1\n\n* `FIX`: fix rendering of gateway without marker ([#2102](https://github.com/bpmn-io/bpmn-js/pull/2102))\n\n## 17.0.0\n\n* `FEAT`: add to selection through SHIFT ([bpmn-io/diagram-js#796](https://github.com/bpmn-io/diagram-js/pull/851), [#2053](https://github.com/bpmn-io/bpmn-js/issues/2053))\n* `CHORE`: remove broken touch interaction ([bpmn-io/diagram-js#796](https://github.com/bpmn-io/diagram-js/issues/796))\n* `DEPS`: update to `diagram-js@14.0.0`\n\n### Breaking Changes\n\n* Migrated to `diagram-js@14` which removes touch interaction module, and dependency on unsupported `hammerjs` package. If you rely on touch interaction, you need to support touch interaction on your own.\n\n## 16.5.0\n\n* `FEAT`: handle adding vertical lanes ([#2086](https://github.com/bpmn-io/bpmn-js/issues/2086))\n* `FIX`: don't fill multiple parallel events ([#2085](https://github.com/bpmn-io/bpmn-js/issues/2085))\n\n## 16.4.0\n\n* `FEAT`: handle resizing of vertical lanes ([#2062](https://github.com/bpmn-io/bpmn-js/issues/2062))\n* `FEAT`: allow text annotations to overlap with the borders of subprocesses and pools ([#2049](https://github.com/bpmn-io/bpmn-js/issues/2049))\n* `FEAT`: support modeling of gateway without marker ([#2063](https://github.com/bpmn-io/bpmn-js/issues/2063))\n* `FIX`: correctly remove vertical lanes ([#2081](https://github.com/bpmn-io/bpmn-js/pull/2081))\n* `FIX`: do not set label on planes ([#2033](https://github.com/bpmn-io/bpmn-js/issues/2033))\n\n## 16.3.2\n\n* `FIX`: support core replace in compensation behavior ([#2073](https://github.com/bpmn-io/bpmn-js/issues/2073))\n\n## 16.3.1\n\n* `FIX`: do not remove connection that is being created when pasting compensation boundary event and handler ([#2069](https://github.com/bpmn-io/bpmn-js/pull/2069))\n\n## 16.3.0\n\n* `FEAT`: improve handling of compensation association ([#2038](https://github.com/bpmn-io/bpmn-js/issues/2038))\n\n## 16.2.0\n\n* `DEPS`: update to `bpmn-moddle@8.1.0`\n\n## 16.1.0\n\n* `DEPS`: update to `diagram-js@13.4.0`\n* `DEPS`: update to `diagram-js-direct-editing@2.1.1`\n* `DEPS`: drop unused `object-refs` dependency\n\n## 16.0.0\n\n* `FEAT`: render vertical pools and lanes ([#2024](https://github.com/bpmn-io/bpmn-js/pull/2024))\n* `FEAT`: sentence case titles and labels ([#2023](https://github.com/bpmn-io/bpmn-js/issues/2023))\n* `FIX`: ensure all error translations are collected ([#2040](https://github.com/bpmn-io/bpmn-js/pull/2040))\n* `DEPS` update to diagram-js@13.0.0\n\n### Breaking Changes\n\n* Major updates to [diagram-js@13](https://github.com/bpmn-io/diagram-js/blob/develop/CHANGELOG.md#1300) and [didi@10](https://github.com/nikku/didi/blob/main/CHANGELOG.md#1000). Make sure to check out the linked changelog updates.\n* Multiple translation labels has been updated to sentence case. If you rely on the old casing, you need to update your translations.\n\n## 15.2.2\n\n* `FIX`: use correct types in BpmnRenderUtil ([#2036](https://github.com/bpmn-io/bpmn-js/pull/2036))\n\n## 15.2.1\n\n* `DEPS`: update to `diagram-js@13.8.1`\n\n## 15.2.0\n\n* `FEAT`: remove selection outline from connections ([diagram-js#826](https://github.com/bpmn-io/diagram-js/pull/826))\n* `FEAT`: position context pad according to last waypoint for connections ([diagram-js#826](https://github.com/bpmn-io/diagram-js/pull/826))\n* `FIX`: prevent access of non-existing connection bounds ([diagram-js#824](https://github.com/bpmn-io/diagram-js/pull/824))\n* `FIX`: correct selection outline size for end event ([#2026](https://github.com/bpmn-io/bpmn-js/pull/2026))\n* `DEPS`: update to `diagram-js@13.8.0`\n\n## 15.1.3\n\n* `FIX`: revert `djs-dragging` CSS class changes ([#2016](https://github.com/bpmn-io/bpmn-js/pull/2016))\n* `FIX`: clear context pad hover timeout on close ([#2016](https://github.com/bpmn-io/bpmn-js/pull/2016))\n* `DEPS`: update to `diagram-js@12.7.2`\n\n## 15.1.2\n\n* `FIX`: revert selection outline removal for connections ([#2011](https://github.com/bpmn-io/bpmn-js/pull/2011))\n* `DEPS`: update to `diagram-js@12.7.1`\n\n## 15.1.1\n\n* `FIX`: adjust selection outline to external label ([#2001](https://github.com/bpmn-io/bpmn-js/issues/2001))\n\n## 15.1.0\n\n* `FEAT`: add toggle for non-interrupting events ([#2000](https://github.com/bpmn-io/bpmn-js/pull/2000))\n* `FEAT`: keep events non-interrupting when using `bpmnReplace` by default ([#2000](https://github.com/bpmn-io/bpmn-js/pull/2000))\n* `DEPS`: update to `diagram-js@12.7.0`\n\n## 15.0.0\n\n* `FEAT`: align selection outline with element's shape ([#1996](https://github.com/bpmn-io/bpmn-js/issues/1996))\n* `FEAT`: preview append on hover ([#1985](https://github.com/bpmn-io/bpmn-js/pull/1985))\n* `FEAT`: allow overriding `fill`, `stroke`, `width` and `height` when rendering elements ([#1985](https://github.com/bpmn-io/bpmn-js/pull/1985))\n* `FIX`: renderer only renders actual flow elements ([#1985](https://github.com/bpmn-io/bpmn-js/pull/1985))\n* `DEPS`: update to `diagram-js@12.6.0`\n\n### Breaking Changes\n\n* `BpmnRenderer` only renders actual flow elements (e.g. `bpmn:IntermediateCatchEvent` but not `bpmn:MessageEventDefinition`)\n\n## 14.2.0\n\n* `FEAT`: make spacetool local per default ([bpmn-io/diagram-js#811](https://github.com/bpmn-io/diagram-js/pull/811), [#1975](https://github.com/bpmn-io/bpmn-js/issues/1975))\n* `FEAT`: add complex preview feature ([bpmn-io/diagram-js#807](https://github.com/bpmn-io/diagram-js/pull/807))\n* `CHORE`: mark connection as dragging when moving bendpoint ([bpmn-io/diagram-js#807](https://github.com/bpmn-io/diagram-js/pull/807))\n* `DEPS`: update to `diagram-js@12.5.0`\n\n## 14.1.3\n\n* `CHORE`: correctly output tag in [#1982](https://github.com/bpmn-io/bpmn-js/pull/1982)\n\n## 14.1.2\n\n* `CHORE`: fix POST_RELEASE job in [#1980](https://github.com/bpmn-io/bpmn-js/pull/1980)\n\n## 14.1.1\n\n* `FIX`: asset path by [__@nikku__](https://github.com/nikku) in [#1977](https://github.com/bpmn-io/bpmn-js/pull/1977)\n\n## 14.1.0\n\n* `FEAT`: ensure lanes aren't resized when using space tool in [#1972](https://github.com/bpmn-io/bpmn-js/pull/1972)\n* `DOCS`: update translations for v14.0.0 by [__@bpmn-io-bot__](https://github.com/bpmn-io-bot) in [#1948](https://github.com/bpmn-io/bpmn-js/pull/1948)\n\n## 14.0.0\n\n* `FEAT`: do not hide overlays on canvas move per default ([diagram-js#798](https://github.com/bpmn-io/diagram-js/issues/798))\n* `FEAT`: translate _Append TextAnnotation_ context pad action ([#1932](https://github.com/bpmn-io/bpmn-js/pull/1932))\n* `FIX`: allow to create connection + event-based gateway ([#1490](https://github.com/bpmn-io/bpmn-js/issues/1490))\n* `FIX`: make breadcrumb styling more robust ([#1945](https://github.com/bpmn-io/bpmn-js/pull/1945))\n* `FIX`: correct copy of default sequence flow elements ([#1935](https://github.com/bpmn-io/bpmn-js/issues/1935))\n* `CHORE`: extract `modeling-feedback` into dedicated module ([#1940](https://github.com/bpmn-io/bpmn-js/pull/1940))\n* `CHORE`: drop deprecated callback support from public API\n* `CHORE`: drop deprecated `import.parse.complete` event member `context`\n* `DEPS`: update to `diagram-js@12.3.0`\n* `DEPS`: update to `bpmn-moddle@8.0.1`\n* `DEPS`: update to `ids@1.0.3`\n\n### Breaking Changes\n\n* Deprecated callback style API removed. Migrate to promise-based APIs, released with `v7.0.0`.\n* Deprecated `import.parse.complete` event member `context` removed. Access the same information via the event itself, as released with `v7.0.0`.\n\n## 13.2.2\n\n* `FIX`: do not vertically resize empty pools using the space tool ([#1769](https://github.com/bpmn-io/bpmn-js/issues/1769))\n\n## 13.2.1\n\n* `FIX`: improve regular expression ([#1927](https://github.com/bpmn-io/bpmn-js/pull/1927))\n* `FIX`: show non-interrupting event version in replace menu ([#1924](https://github.com/bpmn-io/bpmn-js/pull/1924))\n\n## 13.2.0\n\n* `CHORE`: provide align and distribute context pad and popup menu icons as html ([#1920](https://github.com/bpmn-io/bpmn-js/pull/1920))\n* `DEPS`: update to `diagram-js@12.2.0`\n\n## 13.1.0\n\n* `FEAT`: allow event rendering without icons ([#1917](https://github.com/bpmn-io/bpmn-js/pull/1917))\n\n## 13.0.9\n\n* `CHORE`: update translations infra\n\n## 13.0.8\n\n_Republish of v13.0.7._\n\n## 13.0.7\n\n_Republish of v13.0.6._\n\n## 13.0.6\n\n* `DOCS`: update translations\n\n## 13.0.5\n\n* `DEPS`: update to `diagram-js@12.1.0`\n\n## 13.0.4\n\n* `DEPS`: bump to `diagram-js@12.0.2`\n\n## 13.0.3\n\n* `FIX`: update label on `modeling.updateModdleProperties` ([#1872](https://github.com/bpmn-io/bpmn-js/issues/1872))\n\n## 13.0.2\n\n* `FIX`: export types as `type` ([#1897](https://github.com/bpmn-io/bpmn-js/pull/1897))\n* `DEPS`: bump to `diagram-js@12.0.1`\n\n## 13.0.1\n\n* `FIX`: correct some type definitions ([#1896](https://github.com/bpmn-io/bpmn-js/pull/1896))\n\n## 13.0.0\n\n* `FEAT`: rework and complete type definitions ([#1886](https://github.com/bpmn-io/bpmn-js/pull/1886))\n* `DEPS`: update to `diagram-js@12.0.0`\n\n## 12.1.1\n\n* `DEPS`: update to `diagram-js@11.13.0`\n\n## 12.1.0\n\n* `FIX`: correct `Viewer#saveXML` type definition ([#1885](https://github.com/bpmn-io/bpmn-js/pull/1885))\n* `FIX`: correct `Viewer` constructor type definition ([#1882](https://github.com/bpmn-io/bpmn-js/issues/1882))\n\n## 12.0.0\n\n* `FEAT`: move `create-append-anything` to [external module](https://github.com/bpmn-io/bpmn-js-create-append-anything) ([#1873](https://github.com/bpmn-io/bpmn-js/pull/1873), [#1862](https://github.com/bpmn-io/bpmn-js/issues/1862))\n* `CHORE`: use `diagram-js@11.11.0` built-in selection after replace feature ([#1857](https://github.com/bpmn-io/bpmn-js/pull/1857))\n* `DEPS`: update to `diagram-js@11.12.0`\n\n### Breaking Changes\n\n* The create/append anything features moved to an [external module](https://github.com/bpmn-io/bpmn-js-create-append-anything). Include it to restore the `v11` create/append behavior.\n\n## 11.5.0\n\n* `FEAT`: add root elements to definitions when provided via `modeling#update(Moddle)Properties`\n\n## 11.4.1\n\n* `FIX`: correct redo triggering on international keyboard layouts ([#1842](https://github.com/bpmn-io/bpmn-js/issues/1842))\n\n## 11.4.0\n\n* `FEAT`: translate append menu entry labels and groups ([#1810](https://github.com/bpmn-io/bpmn-js/pull/1810))\n* `FEAT`: activate direct editing on participant creation ([#1845](https://github.com/bpmn-io/bpmn-js/pull/1845))\n* `FIX`: dragging append menu entries creates element connection ([#1843](https://github.com/bpmn-io/bpmn-js/pull/1843))\n* `FIX`: append shortcut triggers create menu if append not allowed ([#1840](https://github.com/bpmn-io/bpmn-js/issues/1840))\n* `FIX`: restore marker rendering workaround ([`9c6e475`](https://github.com/bpmn-io/bpmn-js/commit/9c6e475681dd6b6a418b2fbc1dac19a9df360953))\n\n## 11.3.1\n\n_Republish of `v11.3.0`._\n\n## 11.3.0\n\n* `FEAT`: feature `service` and `user` tasks more prominently in replace menu ([#1836](https://github.com/bpmn-io/bpmn-js/pull/1836))\n* `FEAT`: hide rare items initially from create/append menus ([#1836](https://github.com/bpmn-io/bpmn-js/pull/1836))\n* `FEAT`: retrieve instantiation modules with context ([#1835](https://github.com/bpmn-io/bpmn-js/pull/1835))\n* `DEPS`: update to `diagram-js@11.9.0`\n\n## 11.2.0\n\n_Adds create/append anything._\n\n* `FEAT`: append menu available via context pad ([#1802](https://github.com/bpmn-io/bpmn-js/pull/1802), [#1809](https://github.com/bpmn-io/bpmn-js/pull/1809), [#1815](https://github.com/bpmn-io/bpmn-js/pull/1815), [#1818](https://github.com/bpmn-io/bpmn-js/pull/1818), [#1831](https://github.com/bpmn-io/bpmn-js/pull/1831))\n* `FEAT`: create menu available via palette ([#1811](https://github.com/bpmn-io/bpmn-js/pull/1811), [#1809](https://github.com/bpmn-io/bpmn-js/pull/1809), [#1817](https://github.com/bpmn-io/bpmn-js/pull/1817))\n* `FEAT`: simplify connection-multi icon ([#1822](https://github.com/bpmn-io/bpmn-js/pull/1822))\n* `FEAT`: join paths `round` by default ([1827](https://github.com/bpmn-io/bpmn-js/pull/1827))\n* `FEAT`: improved BPMN symbol rendering ([#1830](https://github.com/bpmn-io/bpmn-js/pull/1830))\n* `FEAT`: round connection corners ([#1828](https://github.com/bpmn-io/bpmn-js/pull/1828))\n* `FEAT`: improve visibility of popup menu ([#1812](https://github.com/bpmn-io/bpmn-js/issues/1812))\n* `FIX`: missing special attributes in `bpmnElementFactory` ([#1807](https://github.com/bpmn-io/bpmn-js/pull/1807))\n* `FIX`: handle `bpmn:DataObjectReference` without data object in replace menu ([#1823](https://github.com/bpmn-io/bpmn-js/pull/1823))\n* `DEPS`: update to `diagram-js@11.8.0`\n\n## 11.1.1\n\n* `FIX`: correct popup menu display in fullscreen ([#1795](https://github.com/bpmn-io/bpmn-js/issues/1795))\n* `DEPS`: update to `diagram-js@11.4.3`\n\n## 11.1.0\n\n* `FEAT`: add replace element keyboard binding ([#1785](https://github.com/bpmn-io/bpmn-js/pull/1785))\n* `FEAT`: add `replaceElement` editor action ([#1785](https://github.com/bpmn-io/bpmn-js/pull/1785))\n* `DEPS`: update to `diagram-js@11.4.1`\n\n## 11.0.5\n\n* `DEPS`: update to `diagram-js@11.3.0`\n\n## 11.0.4\n\n* `DEPS`: update to `diagram-js@11.2.0`\n\n## 11.0.3\n\n_Re-release of `v11.0.2`._\n\n## 11.0.2\n\n* `FIX`: correct test for replace options ([#1787](https://github.com/bpmn-io/bpmn-js/pull/1787))\n\n## 11.0.1\n\n* `DEPS`: update to `diagram-js@11.1.1`\n\n## 11.0.0\n\n_Reworks popup menu UI._\n\n* `FEAT`: integrate new popup menu UI ([#1776](https://github.com/bpmn-io/bpmn-js/pull/1776))\n* `DEPS`: update to `diagram-js@11.1.0` ([#1776](https://github.com/bpmn-io/bpmn-js/pull/1776))\n\n### Breaking Changes\n\n* New popup menu UI introduced with `diagram-js@11`. See [`diagram-js` breaking changes and migration guide](https://github.com/bpmn-io/diagram-js/blob/develop/CHANGELOG.md#breaking-changes).\n* Keyboard-related features no longer use `KeyboardEvent#keyCode`. Use a polyfill (e.g. [keyboardevent-key-polyfill](https://www.npmjs.com/package/keyboardevent-key-polyfill)) if you need to support old browsers.\n\n## 10.3.0\n\n* `FEAT`: add BPMN specific space tool ([#1344](https://github.com/bpmn-io/bpmn-js/pull/1344))\n* `FIX`: do not resize `bpmn:TextAnnotation` when using space tool ([#1344](https://github.com/bpmn-io/bpmn-js/pull/1344))\n* `FIX`: correct attachers left hanging when using space tool ([#1344](https://github.com/bpmn-io/bpmn-js/pull/1344))\n* `FIX`: stick labels to label targets when using space tool ([#1344](https://github.com/bpmn-io/bpmn-js/pull/1344), [#1302](https://github.com/bpmn-io/bpmn-js/issues/1302))\n* `DEPS`: update to `diagram-js@10`\n\n## 10.2.1\n\n* `FIX`: correct preserving of outgoing connections on event-based gateway morph ([#1738](https://github.com/bpmn-io/bpmn-js/issues/1738))\n\n## 10.2.0\n\n* `DEPS`: update to `bpmn-moddle@8`\n\n## 10.1.0\n\n* `DEPS`: update to `diagram-js@9.1.0`\n\n## 10.0.0\n\n_Updates the library target to ES2018._\n\n* `FEAT`: use ES2018 syntax ([#1737](https://github.com/bpmn-io/bpmn-js/pull/1737))\n\n### Breaking Changes\n\n* Migrated to ES2018 syntax. [Read the blog post with details and a migration guide](https://bpmn.io/blog/posts/2022-migration-to-es2018.html).\n\n## 9.4.1\n\n* `FIX`: ignore elements which cannot be colored ([#1734](https://github.com/bpmn-io/bpmn-js/pull/1734))\n\n## 9.4.0\n\n* `FEAT`: allow clipboard to be serialized ([#1707](https://github.com/bpmn-io/bpmn-js/pull/1707))\n* `FEAT`: allow cloning of elements ([#1707](https://github.com/bpmn-io/bpmn-js/pull/1707))\n* `FEAT`: copy groups in a safe manner ([#1707](https://github.com/bpmn-io/bpmn-js/pull/1707))\n* `FIX`: make clipboard contents immutable ([#1707](https://github.com/bpmn-io/bpmn-js/pull/1707))\n* `FIX`: do not alter inputs passed to `ElementFactory#create` ([#1711](https://github.com/bpmn-io/bpmn-js/pull/1711))\n* `FIX`: prevent bogus meta-data to be attached on paste ([#1707](https://github.com/bpmn-io/bpmn-js/pull/1707))\n* `FIX`: only claim existing IDs ([#1707](https://github.com/bpmn-io/bpmn-js/pull/1707))\n* `FIX`: prevent double paste on label creation ([#1707](https://github.com/bpmn-io/bpmn-js/pull/1707))\n* `FIX`: move labels when collapsing sub-process ([#1695](https://github.com/bpmn-io/bpmn-js/issues/1695))\n* `FIX`: assign default size when expanding element ([#1687](https://github.com/bpmn-io/bpmn-js/issues/1687))\n* `FIX`: render sequence flows always on top ([#1716](https://github.com/bpmn-io/bpmn-js/issues/1716))\n* `DEPS`: update to `diagram-js@8.9.0`\n* `DEPS`: update to `bpmn-moddle@7.1.3`\n\n## 9.3.2\n\n* `FIX`: prevent unnecessary scrollbar ([#1692](https://github.com/bpmn-io/bpmn-js/issues/1692))\n* `FIX`: check for replacement using actual target ([#1699](https://github.com/bpmn-io/bpmn-js/pull/1699))\n* `DEPS`: update to `diagram-js@8.7.1`\n\n## 9.3.1\n\n* `FIX`: properly size icons for distribute/align menu ([#1694](https://github.com/bpmn-io/bpmn-js/pull/1694))\n\n## 9.3.0\n\n* `FEAT`: add aligment and distribution menu ([#1680](https://github.com/bpmn-io/bpmn-js/issues/1680), [#1691](https://github.com/bpmn-io/bpmn-js/issues/1691))\n* `DEPS`: update to `diagram-js@8.7.0`\n\n## 9.2.2\n\n* `FIX`: correctly toggle loop characteristics ([#1673](https://github.com/bpmn-io/bpmn-js/issues/1673))\n\n## 9.2.1\n\n* `FIX`: cancel direct editing before shape deletion ([#1677](https://github.com/bpmn-io/bpmn-js/issues/1677))\n\n## 9.2.0\n\n* `FEAT`: rework select and hover interaction on the diagram ([#1616](https://github.com/bpmn-io/bpmn-js/issues/1616), [#640](https://github.com/bpmn-io/diagram-js/pull/640), [#643](https://github.com/bpmn-io/diagram-js/pull/643))\n* `FEAT`: rework diagram interaction handles ([#640](https://github.com/bpmn-io/diagram-js/pull/640))\n* `FEAT`: clearly distinguish select and hover states ([#1616](https://github.com/bpmn-io/bpmn-js/issues/1616))\n* `FEAT`: allow text annotation on sequence flows ([#1652](https://github.com/bpmn-io/bpmn-js/pull/1652))\n* `FEAT`: add multi-element context pad ([#1525](https://github.com/bpmn-io/bpmn-js/pull/1525))\n* `FEAT`: change default color to off black ([#1656](https://github.com/bpmn-io/bpmn-js/pull/1656))\n* `FEAT`: select connection after connect ([#644](https://github.com/bpmn-io/diagram-js/pull/644))\n* `FIX`: copy elements with `string` extension properties ([#1518](https://github.com/bpmn-io/bpmn-js/issues/1518))\n* `FIX`: cancel direct editing before shape deletion ([#1664](https://github.com/bpmn-io/bpmn-js/issues/1664))\n* `FIX`: remove connection on source connection deletion ([#1663](https://github.com/bpmn-io/bpmn-js/issues/1663))\n* `FIX`: set correct label color when batch coloring elements ([#1653](https://github.com/bpmn-io/bpmn-js/issues/1653))\n* `FIX`: always reconnect labels and associations ([#1659](https://github.com/bpmn-io/bpmn-js/pull/1659))\n* `FIX`: correct connection drop highlighting\n* `DEPS`: replace `inherits` with `inherits-browser`\n* `DEPS`: bump to `diagram-js@8.5.0`\n\n## 9.1.0\n\n* `FEAT`: allow to select participant and subprocess via click on body ([#1646](https://github.com/bpmn-io/bpmn-js/pull/1646))\n* `FIX`: comply with strict style-src CSP ([#1625](https://github.com/bpmn-io/bpmn-js/issues/1625))\n* `FIX`: complete direct editing when selection changes ([#1648](https://github.com/bpmn-io/bpmn-js/pull/1648))\n* `DEPS`: update to `diagram-js@8.3.0`\n* `DEPS`: update to `min-dom@3.2.0`\n\n## 9.0.4\n\n* `FIX`: remove `label` property on empty label ([#1637](https://github.com/bpmn-io/bpmn-js/issues/1637))\n* `FIX`: create drilldown overlays on `viewer.open` ([`574a67438`](https://github.com/bpmn-io/bpmn-js/commit/574a674381d6449b509396b6d17c4ca94674ea1c))\n* `FIX`: render data association inside collapsed sub-processes ([#1619](https://github.com/bpmn-io/bpmn-js/issues/1619))\n* `FIX`: preserve multi-instance properties when toggling between parallel and sequential ([#1581](https://github.com/bpmn-io/bpmn-js/issues/1581))\n* `FIX`: correct hanging sequence flow label after collapsing sub-process ([#1617](https://github.com/bpmn-io/bpmn-js/issues/1617))\n* `FIX`: correct start event not added to newly created sub-process ([#1631](https://github.com/bpmn-io/bpmn-js/issues/1631))\n\n## 9.0.3\n\n* `FIX`: submit direct editing result on drilldown ([#1609](https://github.com/bpmn-io/bpmn-js/issues/1609))\n* `DEPS`: bump to `diagram-js@8.2.0` ([2bac149](https://github.com/bpmn-io/bpmn-js/commit/2bac1495058601fec203c134b41efe5600e5fc97))\n\n## 9.0.2\n\n* `FIX`: support modeling of groups in collapsed subporcesses ([#1606](https://github.com/bpmn-io/bpmn-js/issues/1606))\n* `FIX`: override default padding of breadcrumb element ([#1608](https://github.com/bpmn-io/bpmn-js/pull/1608))\n\n## 9.0.1\n\n* `FIX`: use ES5 everywhere ([#1605](https://github.com/bpmn-io/bpmn-js/pull/1605))\n* `FIX`: support DIs without associated business object ([#1605](https://github.com/bpmn-io/bpmn-js/pull/1605))\n* `DEPS`: bump to `diagram-js@8.1.2` ([bdf9cf3](https://github.com/bpmn-io/bpmn-js/commit/bdf9cf3e752254a4c8172031d8a493955a9fca9c))\n\n## 9.0.0\n\n* `FEAT`: support drilldown and modeling of collapsed subprocesses ([#1443](https://github.com/bpmn-io/bpmn-js/issues/1443))\n* `FEAT`: update embedded label bounds when shape is moved ([#1586](https://github.com/bpmn-io/bpmn-js/pull/1586))\n* `FIX`: create di for embedded labels ([#1579](https://github.com/bpmn-io/bpmn-js/pull/1579))\n* `CHORE`: expose `BpmnRenderer` extension points ([#1585](https://github.com/bpmn-io/bpmn-js/pull/1585))\n* `DEPS`: bump to `diagram-js@8.1.1`\n\n### Breaking Changes\n\n* Reworked the link of elements to bpmn DIs. You must access the `di` directly from the diagram element instead of the `businessObject` [#1472](https://github.com/bpmn-io/bpmn-js/issues/1472).\n* Reworked `viewer.open` behavior for single planes ([#1576](https://github.com/bpmn-io/bpmn-js/pull/1576)).\n* Reworked import and `BpmnFactory` APIs [#1472](https://github.com/bpmn-io/bpmn-js/issues/1472).\n* Added `bpmn-js.css`, which is required to display drilldown overlays correctly.\n\n## 8.10.0\n\n* `CHORE`: provide `ModelUtil#isAny` utility ([#1604](https://github.com/bpmn-io/bpmn-js/pull/1604))\n* `CHORE`: provide `ModelUtil#getDi` utility ([#1604](https://github.com/bpmn-io/bpmn-js/pull/1604))\n\n## 8.9.1\n\n* `FIX`: re-use process for redo of first participant ([#1439](https://github.com/bpmn-io/bpmn-js/issues/1439))\n* `FIX`: ensure IDs are claimed when used ([#1555](https://github.com/bpmn-io/bpmn-js/issues/1555))\n* `FIX`: prevent morphing data stores outside participants ([#1508](https://github.com/bpmn-io/bpmn-js/issues/1508))\n\n## 8.9.0\n\n* `FEAT`: select newly created sub-process ([`6214772b`](https://github.com/bpmn-io/bpmn-js/commit/6214772b8519cb82f61c4867b16c112bc6344922))\n* `FEAT`: select newly created group for immediate resizing ([`56eb34cc`](https://github.com/bpmn-io/bpmn-js/commit/56eb34cc826ca0dc8ee788575a504d5fda301292))\n* `FEAT`: simplify color scheme\n* `FIX`: set label color on `bpmndi:BPMNLabel#color` ([#1543](https://github.com/bpmn-io/bpmn-js/pull/1543))\n* `FIX`: don't create illegal `bpmndi:BPMNEdge#waypoints` property ([#1544](https://github.com/bpmn-io/bpmn-js/issues/1544))\n* `FIX`: correct direct editing on touch devices\n* `DEPS`: update to `diagram-js@7.8.2`\n\n## 8.8.3\n\n* `FIX`: correct resize handles hidden behind element ([#1520](https://github.com/bpmn-io/bpmn-js/issues/1520))\n* `FIX`: handle close to source or target drop on flow ([#1541](https://github.com/bpmn-io/bpmn-js/issues/1541))\n* `CHORE`: bump to `diagram-js@7.6.3`\n\n## 8.8.2\n\n* `FIX`: properly re-use ID of a copied element if available ([#1503](https://github.com/bpmn-io/bpmn-js/pull/1509))\n\n## 8.8.1\n\n* `FIX`: re-use ID of a copied element if available ([#1503](https://github.com/bpmn-io/bpmn-js/pull/1503))\n* `CHORE`: unbuild circular dependency with `ResizeUtil` ([#1500](https://github.com/bpmn-io/bpmn-js/pull/1500))\n\n## 8.8.0\n\n* `FEAT`: give `keyboard` fine-grained control over which events to handle ([#1493](https://github.com/bpmn-io/bpmn-js/issues/1493))\n* `FIX`: correct keyboard shortcuts not working in direct editing mode ([#1493](https://github.com/bpmn-io/bpmn-js/issues/1493))\n* `DEPS`: update to `diagram-js@7.15`\n\n## 8.7.3\n\n* `FIX`: convert file to `ES6` module ([#1478](https://github.com/bpmn-io/bpmn-js/pull/1478))\n\n## 8.7.2\n\n* `CHORE`: improve error recovery in ordering provider\n* `DEPS`: update build dependencies\n\n## 8.7.1\n\n* `FIX`: allow connecting `bpmn:MessageFlow` to `bpmn:CallActivity` ([#1467](https://github.com/bpmn-io/bpmn-js/issues/1467))\n* `DEPS`: update to `bpmn-moddle@7.1.2`\n\n## 8.7.0\n\n* `FEAT`: support BPMN in Color ([#1453](https://github.com/bpmn-io/bpmn-js/pull/1453))\n* `DEPS`: update to `bpmn-moddle@7.1.1`\n\n## 8.6.2\n\n* `DEPS`: update diagram-js-direct-editing to v1.6.3\n\n## 8.6.1\n\n* `FIX`: serialize `bpmn:DataStoreReference` correctly in case if first participant is an empty pool ([#1456](https://github.com/bpmn-io/bpmn-js/issues/1456))\n\n## 8.6.0\n\n* `FEAT`: support Promise in `inject` test helper ([#1450](https://github.com/bpmn-io/bpmn-js/pull/1450))\n* `DEPS`: update to `hosted-git@2.8.9` ([#1447](https://github.com/bpmn-io/bpmn-js/pull/1447))\n\n## 8.5.0\n\n* `FEAT`: reconnect message flows when participant is collapsed ([#1432](https://github.com/bpmn-io/bpmn-js/pull/1432))\n* `FEAT`: replace elements on create ([#1340](https://github.com/bpmn-io/bpmn-js/issues/1340))\n* `FEAT`: show message name on message flow ([#777](https://github.com/bpmn-io/bpmn-js/issues/777))\n* `FEAT`: ensure auto-placed elements are visible\n* `FIX`: fix reversed connection preview ([#1431](https://github.com/bpmn-io/bpmn-js/issues/1431))\n* `FIX`: copy root element references on replace ([#1430](https://github.com/bpmn-io/bpmn-js/issues/1431))\n* `DEPS`: update to `diagram-js@7.3.0`\n\n## 8.4.0\n\n* `FIX`: disallow inserting multiple elements on a sequence flow ([#1440](https://github.com/bpmn-io/bpmn-js/issues/1440))\n\n## 8.3.1\n\n* `FIX`: correctly serialize `xml` attributes on `Any` elements\n* `DEPS`: update bump to `bpmn-moddle@7.0.5`\n\n## 8.3.0\n\n* `FEAT`: enable connection tool for text annotations ([#1428](https://github.com/bpmn-io/bpmn-js/pull/1428))\n\n## 8.2.2\n\n* `FIX`: always emit `saveXML.done`\n* `FIX`: correct path intersections not being detected in certain cases\n* `CHORE`: bump to `diagram-js@7.2.3`\n\n## 8.2.1\n\n* `FIX`: prevent bendpoint hover error ([#1387](https://github.com/bpmn-io/bpmn-js/issues/1387))\n\n## 8.2.0\n\n* `FIX`: correct label colors on connect / hover ([#1380](https://github.com/bpmn-io/bpmn-js/issues/1380))\n* `FIX`: correct new parent indicator when leaving lane ([#1413](https://github.com/bpmn-io/bpmn-js/issues/1413))\n* `CHORE`: update to `diagram-js@7.2.0`\n\n## 8.1.0\n\n* `TEST`: simplify markup created by built-in test helpers\n\n## 8.0.1\n\n* `FIX`: activate, not toggle global connect tool on palette click\n* `FIX`: only allow cancel boundary events on transactions\n* `CHORE`: add `npm start` script for demo purposes\n\n## 8.0.0\n\n* `FEAT`: improve replace label for collapsed pools ([`8faee2bd`](https://github.com/bpmn-io/bpmn-js/commit/8faee2bde9a74b75b4b6bb9b003507652e75c9c5))\n* `FEAT`: allow participant multiplicity marker to be toggled ([#533](https://github.com/bpmn-io/bpmn-js/issues/533))\n* `FEAT`: support soft breaks / discretionary hyphens in labels ([#1383](https://github.com/bpmn-io/bpmn-js/issues/1383))\n* `FEAT`: improve tool activation via keyboard shortcuts or editor actions\n* `FEAT`: allow components to react to auxiliary mouse button interactions\n* `FEAT`: move canvas on auxiliary button mouse down\n* `CHORE`: bump to `diagram-js@7`\n\n### Breaking Changes\n\n* Auxiliary mouse button events will now be passed as `element.*` mouse events to components. You must filter your event listeners to prevent reactions to these events ([`1063f7c1`](https://github.com/bpmn-io/diagram-js/commit/1063f7c18474096d3d7c9e400ce82a1bf762a157)).\n\n## 7.5.0\n\n* `FEAT`: update translatable strings ([#1364](https://github.com/bpmn-io/bpmn-js/pull/1364))\n* `FEAT`: add collection marker to DataObjectReference ([#381](https://github.com/bpmn-io/bpmn-js/issues/381))\n* `FEAT`: provide generic command for updating moddle properties ([#1376](https://github.com/bpmn-io/bpmn-js/pull/1376))\n* `FEAT`: add switch between DataStoreReference and DataObjectReference in replace menu ([#1372](https://github.com/bpmn-io/bpmn-js/issues/1372))\n* `FIX`: align collection and parallel instance markers style ([#1371](https://github.com/bpmn-io/bpmn-js/issues/1371))\n\n## 7.4.2\n\n* `FIX`: correctly emit out `element.event` after drop-on-flow ([#1366](https://github.com/bpmn-io/bpmn-js/issues/1366))\n\n## 7.4.1\n\n* `FIX`: correct keyboard zoom in key on international keyboard shortcuts ([#1362](https://github.com/bpmn-io/bpmn-js/issues/1362))\n\n## 7.4.0\n\n* `CHORE`: bump to `diagram-js@6.8.0`\n* `CHORE`: migrate to `travis-ci.com`\n\n## 7.3.1\n\n* `CHORE`: bump to `diagram-js@6.7.1`\n\n## 7.3.0\n\n* `FEAT`: disallow typed start events inside non-event based sub processes ([#831](https://github.com/bpmn-io/bpmn-js/issues/831))\n* `CHORE`: bump to `diagram-js@6.7.0`\n\n## 7.2.1\n\n* `FIX`: disallow boundary events as message flow targets ([#1300](https://github.com/bpmn-io/bpmn-js/issues/1300))\n\n## 7.2.0\n\n_Republish of `v7.1.0`._\n\n## 7.1.0\n\n* `FEAT`: allow annotating groups ([#1327](https://github.com/bpmn-io/bpmn-js/issues/1327))\n\n## 7.0.1\n\n* `FIX`: roundtrip default `xml` namespace ([#1319](https://github.com/bpmn-io/bpmn-js/issues/1319))\n* `CHORE`: bump to `bpmn-moddle@7.0.3`\n\n## 7.0.0\n\n* `FEAT`: make import and export APIs awaitable ([#812](https://github.com/bpmn-io/bpmn-js/issues/812))\n* `FEAT`: update watermark ([#1281](https://github.com/bpmn-io/bpmn-js/pull/1281))\n* `CHORE`: deprecated `import.parse.complete` context payload ([`157aec6e`](https://github.com/bpmn-io/bpmn-js/commit/157aec6e))\n* `CHORE`: clarify license terms ([`bc98a637`](https://github.com/bpmn-io/bpmn-js/commit/bc98a63712f6ac5c66d39f59bf93e296e59ad1e0))\n* `CHORE`: bump to `bpmn-moddle@7.0.1`\n\n### Breaking Changes\n\n* The toolkit now requires the ES6 `Promise` to be present. To support IE11 you must polyfill it.\n\n## 6.5.1\n\n* `FIX`: correct namespaces being removed on diagram export ([#1310](https://github.com/bpmn-io/bpmn-js/issues/1310))\n* `CHORE`: bump to `bpmn-moddle@6.0.6`\n\n## 6.5.0\n\n* `FEAT`: prefer straight layout for sub-process connections ([#1309](https://github.com/bpmn-io/bpmn-js/pull/1309))\n* `FEAT`: move common auto-place feature to diagram-js, add BPMN-specific auto-place feature ([#1284](https://github.com/bpmn-io/bpmn-js/pull/1284))\n* `CHORE`: make bpmn-font a development dependency ([`63045bdf`](https://github.com/bpmn-io/bpmn-js/commit/63045bdfa87b9f1989a2a7a509facbeb4616acda))\n* `CHORE`: bump to `diagram-js@6.6.1`\n\n## 6.4.2\n\n* `CHORE`: bump to `bpmn-moddle@6.0.5`\n\n## 6.4.1\n\n* `FIX`: parse `>` in attribute names and body tag\n* `CHORE`: bump to `bpmn-moddle@6.0.4`\n\n## 6.4.0\n\n* `FEAT`: serialize link events with an empty name ([#1296](https://github.com/bpmn-io/bpmn-js/issues/1296))\n\n## 6.3.5\n\n* `FIX`: correct accidental resizing of label target ([#1294](https://github.com/bpmn-io/bpmn-js/issues/1294))\n\n## 6.3.4\n\n* `FIX`: export BPMNDI in correct order ([#985](https://github.com/bpmn-io/bpmn-js/issues/985))\n\n## 6.3.3\n\n* `FIX`: resize empty text annotations\n* `CHORE`: bump `min-dom` version\n* `CHORE`: bump to `diagram-js@6.4.1`\n\n## 6.3.2\n\n* `FIX`: correctly move flows when adding lane ([#1287](https://github.com/bpmn-io/bpmn-js/pull/1287))\n* `FIX`: restore semantic IDs for non flow nodes ([#1285](https://github.com/bpmn-io/bpmn-js/issues/1285))\n\n## 6.3.1\n\n* `FIX`: prevent editor crash in some strict execution environments ([#1283](https://github.com/bpmn-io/bpmn-js/pull/1283))\n\n## 6.3.0\n\n* `FEAT`: generate more generic IDs for new elements ([`035bb0c1`](https://github.com/bpmn-io/bpmn-js/commit/035bb0c1fd01adbaab8a340cb1075aa57736540d))\n* `FEAT`: copy referenced root elements (message, signal, ...) ([`dc5a566e`](https://github.com/bpmn-io/bpmn-js/commit/dc5a566e107bc156505a40de3331b3832afc4b8d))\n* `FEAT`: ensure minimum size when resizing elements with space tool ([`7ee304f4`](https://github.com/bpmn-io/bpmn-js/commit/7ee304f424d1c9db46633523165d25ca1fabba1b))\n* `FIX`: correct interaction events inside `bpmn:Group` elements ([#1278](https://github.com/bpmn-io/bpmn-js/issues/1278))\n* `FIX`: correct copy and paste of collapsed sub-processes ([#1270](https://github.com/bpmn-io/bpmn-js/issues/1270))\n* `FIX`: correct various space tool related issues ([#1019](https://github.com/bpmn-io/bpmn-js/issues/1019), [#878](https://github.com/bpmn-io/bpmn-js/issues/878))\n* `CHORE`: rework space tool\n* `CHORE`: update to `diagram-js@6.4.0`\n\n## 6.2.1\n\n* `FIX`: correct serialization of `DataAssociation#assignment`\n* `CHORE`: update to `bpmn-moddle@6.0.2`\n\n## 6.2.0\n\n* `FIX`: keep non-duplicate outgoing connection when dropping on flows ([#1263](https://github.com/bpmn-io/bpmn-js/issues/1263))\n* `FIX`: properly reconnect message flows when collapsing participant\n* `CHORE`: update to `diagram-js@6.3.0`\n* `CHORE`: update to `bpmn-moddle@6.0.1`\n\n## 6.1.2\n\n* `FIX`: translate _Append ReceiveTask_\n* `FIX`: allow associations where data associations are allowed, too ([`4a675b37`](https://github.com/bpmn-io/bpmn-js/commit/4a675b378027532db413186ea292daeac087285b))\n* `FIX`: correct origin snapping on multi-element create ([`27fec8bd`](https://github.com/bpmn-io/bpmn-js/commit/27fec8bdf1c6236e7ca09b5721b74b1b45b45d39))\n* `CHORE`: update to `diagram-js@6.2.2`\n\n## 6.1.1\n\n_Republish of `v6.1.0`._\n\n## 6.1.0\n\n* `FEAT`: copy signals, escalations and errors ([#1245](https://github.com/bpmn-io/bpmn-js/pull/1245))\n* `FEAT`: provide base viewer / modeler distributions ([`bb94b206`](https://github.com/bpmn-io/bpmn-js/commit/bb94b206a7c9ab3b80e283d6513600a9591c437d))\n* `FEAT`: add horizontal and vertical resize handles\n* `FEAT`: improve connection cropping (bump to `path-intersection@2`)\n* `FIX`: correctly mark elements as changed on `{shape|connection}.create` undo\n* `FIX`: do not open replace menu after multi create ([#1255](https://github.com/bpmn-io/bpmn-js/pull/1255))\n* `CHORE`: update to `diagram-js@6.2.0`\n\n## 6.0.7\n\n* `FIX`: disable waypoints-cropping after pasting connections ([`9f8a724e`](https://github.com/bpmn-io/bpmn-js/commit/9f8a724e9a3ff66bfce14e06ab38066189111a95))\n\n## 6.0.6\n\n* `FIX`: create nested lanes in the correct parent again ([#1256](https://github.com/bpmn-io/bpmn-js/issues/1256), [#1253](https://github.com/bpmn-io/bpmn-js/issues/1253), [#1254](https://github.com/bpmn-io/bpmn-js/issues/1254))\n\n## 6.0.5\n\n* `FIX`: only update `Lane#flownNodeRefs` once during paste ([`4455c3fc`](https://github.com/bpmn-io/bpmn-js/commit/4455c3fc35290e51220566fb6539a1efc4d3612f))\n* `FIX`: do not adjust labels on paste ([`b2b607f5`](https://github.com/bpmn-io/bpmn-js/commit/b2b607f5582d3409c789d831a0896aaa55949899))\n* `FIX`: do not snap connection waypoints on paste ([`d769e6dd`](https://github.com/bpmn-io/bpmn-js/commit/d769e6ddb0cb2dc8befb2e7b31682925089ba8f1))\n\n## 6.0.4\n\n* `FIX`: correctly fix hover on cleanup ([#1247](https://github.com/bpmn-io/bpmn-js/pull/1247))\n\n## 6.0.3\n\n* `FIX`: render colored BPMN groups ([#1246](https://github.com/bpmn-io/bpmn-js/pull/1246))\n* `CHORE`: bump to `diagram-js@6.0.2`\n\n## 6.0.2\n\n* `CHORE`: bump `diagram-js-direct-editing` dependency\n\n## 6.0.1\n\n* `CHORE`: bump to `diagram-js@6.0.1`\n\n## 6.0.0\n\n* `FEAT`: rework (re-)connecting of shapes ([#427](https://github.com/bpmn-io/bpmn-js/pull/1230))\n\n### Breaking Changes\n\nConnecting and re-connecting shapes got reworked via [#427](https://github.com/bpmn-io/bpmn-js/pull/1230):\n\n* The rules `connection.reconnectStart` and `connection.reconnectEnd` got replaced with `connection.reconnect` rule\n* `BpmnLayouter#layoutConnection` waypoints can be specified via hint\n\n## 5.1.2\n\n* `FIX`: account for label pasting in label behavior ([#1227](https://github.com/bpmn-io/bpmn-js/issues/1227))\n\n## 5.1.1\n\n* `FIX`: re-select only existing elements when dragging is finished ([#1225](https://github.com/bpmn-io/bpmn-js/issues/1225))\n* `FIX`: correctly hide nested children of a collapsed shape\n* `CHORE`: bump to [`diagram-js@5.1.1`](https://github.com/bpmn-io/diagram-js/blob/develop/CHANGELOG.md#511)\n\n## 5.1.0\n\n* `FEAT`: adjust label position post creation ([`41c6af18`](https://github.com/bpmn-io/bpmn-js/commit/41c6af183014626a0f84e0bda0f8e39018f9151e))\n* `FEAT`: copy and paste boundary events ([`2e27d743`](https://github.com/bpmn-io/bpmn-js/commit/2e27d7430642439e30806941d0df43018ca729eb))\n* `FIX`: ordering after moving boundary events between hosts ([#1207](https://github.com/bpmn-io/bpmn-js/issues/1207))\n* `FIX`: do not remove sequence flow condition on type change ([`b2900786`](https://github.com/bpmn-io/bpmn-js/commit/b290078600ae4e45e7c72bd37919732e3f8fcbea))\n* `FIX`: do not remove default sequence flow on type change ([`37bcd070`](https://github.com/bpmn-io/bpmn-js/commit/37bcd070e8406a43a7316893c6b68debeaae5e26))\n* `FIX`: do not duplicate flow node references ([`168a1493`](https://github.com/bpmn-io/bpmn-js/commit/168a1493b26c3059d2440a70f7aa5991745b51e5))\n* `FIX`: ignore labels that are being created in adaptive label positioning ([`44cceb5d`](https://github.com/bpmn-io/bpmn-js/commit/44cceb5da287a0ad01d9389f475284c88eda7f7b))\n\n## 5.0.5\n\n* `FIX`: snap connections to task mid ([`86c61b0`](https://github.com/bpmn-io/bpmn-js/commit/86c61b0c0d6dcf776adda94b6d72b621644c2abe))\n* `FIX`: snap connections to sub process mid ([`83e9f05`](https://github.com/bpmn-io/bpmn-js/commit/83e9f05efab6fbe57100e11d0443291a561bdfe4))\n* `FIX`: complete direct editing when auto place starts ([`dcf440b`](https://github.com/bpmn-io/bpmn-js/commit/dcf440b07684339bdb52ba97cd1c83f9eb234044))\n* `FIX`: do not clear diagram if no diagram to clear ([#1181](https://github.com/bpmn-io/bpmn-js/issues/1181))\n* `FIX`: copy boundary events attachments ([#1190](https://github.com/bpmn-io/bpmn-js/issues/1190))\n* `FIX`: do not copy generic properties ([`a74d83`](https://github.com/bpmn-io/bpmn-js/commit/a74d838dc78aceddf88e07231cf85a4cf9e0dd95))\n\n## 5.0.4\n\n* `FIX`: correct sequence flow layout after drop on flow ([#1178](https://github.com/bpmn-io/bpmn-js/issues/1178))\n\n## 5.0.3\n\n_Republish of `v5.0.2`._\n\n## 5.0.2\n\n* `FIX`: allow reconnecting to loops ([#1121](https://github.com/bpmn-io/bpmn-js/issues/1121))\n* `CHORE`: bump to `diagram-js@5.0.1`\n\n## 5.0.1\n\n* `FIX`: import boundary event associations ([#1170](https://github.com/bpmn-io/bpmn-js/issues/1170))\n\n## 5.0.0\n\n* `FEAT`: add two-step copy and paste ([#1137](https://github.com/bpmn-io/bpmn-js/pull/1137))\n* `FEAT` add `elements.create` rule for creating multiple elements ([#1137](https://github.com/bpmn-io/bpmn-js/pull/1137))\n* `FEAT`: make containers draggable via their borders / labels only ([#1097](https://github.com/bpmn-io/bpmn-js/pull/1097), [#957](https://github.com/bpmn-io/bpmn-js/issues/957))\n* `FEAT`: allow copied elements to be filtered ([#888](https://github.com/bpmn-io/bpmn-js/issues/888))\n* `FIX`: prevent accidental dragging of participants and sub-processes ([#1097](https://github.com/bpmn-io/bpmn-js/pull/1097), [#957](https://github.com/bpmn-io/bpmn-js/issues/957))\n* `FIX`: keep labels during pool extraction ([#921](https://github.com/bpmn-io/bpmn-js/issues/921))\n* `FIX`: duplicate `bpmn:CategoryValue` when copying groups ([#1055](https://github.com/bpmn-io/bpmn-js/issues/1055))\n* `FIX`: translate group creation entry in palette ([#1146](https://github.com/bpmn-io/bpmn-js/issues/1146))\n* `CHORE`: use `element.copyProperty` event to copy category value when copying group ([`12bedca5`](https://github.com/bpmn-io/bpmn-js/pull/1137/commits/12bedca5ba2a05791591e53f554dc2310f6c1a6f))\n* `CHORE`: bump to `diagram-js@5`\n\n### Breaking Changes\n\nCopy and paste as well as create is completely reworked:\n\n* `CopyPaste`: remove `ModelCloneHelper` in favor of `ModdleCopy` service, remove `property.clone` event, add `moddleCopy.canCopyProperties`, `moddleCopy.canCopyProperty` and `moddleCopy.canSetCopiedProperty` event\n* `BpmnRules`: removed `elements.paste` rule in favor of `elements.create` rule\n* `BpmnRules`: removed `element.paste` rule\n* `ElementFactory`: use `attrs.di` property instead of `attrs.colors` for fill and stroke when creating element through `ElementFactory#createBpmnElement`\n* To prevent additional behavior on create after paste you should check for the `createElementsBehavior` hint, cf. [`bf180321`](https://github.com/bpmn-io/bpmn-js/commit/bf180321a3a40428c3f87b639b87cc3fc578066e#diff-2f0de25761fb7459e88071f83fd845c5R22)\n\n## 4.0.4\n\n* `FIX`: creating `bpmn:Participant` on single `bpmn:Group` throwing error ([#1133](https://github.com/bpmn-io/bpmn-js/issues/1133))\n* `CHORE`: bump to `diagram-js@4.0.3`\n\n## 4.0.3\n\n* `FIX`: prevent dropping on labels and `bpmn:Group` elements ([#1131](https://github.com/bpmn-io/bpmn-js/pull/1131))\n\n## 4.0.2\n\n* `FIX`: correct element positioning update ([#1129](https://github.com/bpmn-io/bpmn-js/issues/1129))\n* `CHORE`: bump to `diagram-js@4.0.2`\n\n## 4.0.1\n\n* `FIX`: prevent adding lane from crashing IE ([#746](https://github.com/bpmn-io/bpmn-js/issues/746))\n* `FIX`: correct inverse space tool visuals ([#1105](https://github.com/bpmn-io/bpmn-js/issues/1105))\n* `CHORE`: update `diagram-js-direct-editing` to prevent install warning\n* `CHORE`: update to `diagram-js@4.0.1`\n\n## 4.0.0\n\n* `FEAT`: add top, right, bottom, left snapping with container elements ([#1108](https://github.com/bpmn-io/bpmn-js/pull/1108))\n* `FEAT`: add grid snapping ([#987](https://github.com/bpmn-io/bpmn-js/pull/987))\n* `FEAT`: allow modeling of groups ([#343](https://github.com/bpmn-io/bpmn-js/issues/343))\n* `FEAT`: improve modeling rules behind event-based gateways ([#1006](https://github.com/bpmn-io/bpmn-js/pull/1006))\n* `FEAT`: adjust default collapsed pool to standard height ([`5affe2570`](https://github.com/bpmn-io/bpmn-js/commit/5affe25705082937beace6b4a568f176a0527baf))\n* `FEAT`: add connection previews ([#743](https://github.com/bpmn-io/bpmn-js/issues/743))\n* `FEAT`: create expanded sub-process with start event included ([#1039](https://github.com/bpmn-io/bpmn-js/pull/1039))\n* `FEAT`: improve automatic label adjustment for boundary events ([#1064](https://github.com/bpmn-io/bpmn-js/pull/1064))\n* `FEAT`: improve creation of initial participant ([#1046](https://github.com/bpmn-io/bpmn-js/pull/1046))\n* `FEAT`: improve boundary to host loop layout ([#1070](https://github.com/bpmn-io/bpmn-js/pull/1070))\n* `FEAT`: make connection segment move the primary connection drag behavior\n* `FEAT`: allow label and group movement everywhere ([#1080](https://github.com/bpmn-io/bpmn-js/pull/1080))\n* `FEAT`: improve message flow to participant connection in the presence of lanes ([#950](https://github.com/bpmn-io/bpmn-js/issues/950))\n* `FEAT`: allow detaching of boundary and attaching of intermediate events ([#1045](https://github.com/bpmn-io/bpmn-js/issues/1045))\n* `FEAT`: simplify requested palette and context pad translations ([#1027](https://github.com/bpmn-io/bpmn-js/pull/1027))\n* `FEAT`: simplify participant dragging in the presence of nested lanes ([`fdb299dc`](https://github.com/bpmn-io/bpmn-js/commit/fdb299dc888a7dcdb3f7674b6ed2a857864df457))\n* `FEAT`: correctly render all kinds of multiple events ([#1091](https://github.com/bpmn-io/bpmn-js/pull/1091))\n* `CHORE`: validate BPMN 2.0 XML ids as QNames ([`92c03679a`](https://github.com/bpmn-io/bpmn-js/commit/92c03679a4fd3c92a1c5ce3c97f7d366e2a5753a))\n* `FIX`: correctly handle flow reconnection + type replacement ([#896](https://github.com/bpmn-io/bpmn-js/issues/896), [#1008](https://github.com/bpmn-io/bpmn-js/issues/1008))\n\n### Breaking Changes\n\n* `CHORE`: bump to [`diagram-js@4.0.0`](https://github.com/bpmn-io/diagram-js/blob/main/CHANGELOG.md#400)\n\n## 3.5.0\n\n* `FEAT`: restore `Viewer#importDefinitions` and make it public API ([#1112](https://github.com/bpmn-io/bpmn-js/pull/1112))\n\n## 3.4.3\n\n* `FIX`: prevent HTML injection in search ([diagram-js#362](https://github.com/bpmn-io/diagram-js/pull/362))\n\n## 2.5.4\n\n* `FIX`: prevent HTML injection in search ([diagram-js#362](https://github.com/bpmn-io/diagram-js/pull/362))\n* `CHORE`: bump to `diagram-js@2.6.2`\n\n## 3.4.2\n\n* `FIX`: do not evaluate pasted text as HTML ([#1073](https://github.com/bpmn-io/bpmn-js/issues/1073))\n\n## 2.5.3\n\n* `FIX`: do not evaluate pasted text as HTML ([#1073](https://github.com/bpmn-io/bpmn-js/issues/1073))\n\n## 3.4.1\n\n_Republish of `v3.4.0` without `.git` folder._\n\n## 3.4.0\n\n* `FIX`: properly render colored connection markers ([#981](https://github.com/bpmn-io/bpmn-js/issues/981))\n* `FEAT`: add ability to open different DI diagrams ([#87](https://github.com/bpmn-io/bpmn-js/issues/87))\n* `FIX`: correctly layout straight boundary to target connections ([#891](https://github.com/bpmn-io/bpmn-js/issues/891))\n* `FEAT`: resize participant to standard size on collapse ([#975](https://github.com/bpmn-io/bpmn-js/pull/975))\n* `FEAT`: consistently layout connection on reconnect start and end ([#971](https://github.com/bpmn-io/bpmn-js/pull/971))\n* `FEAT`: layout connection on element removal ([#989](https://github.com/bpmn-io/bpmn-js/issues/989))\n* `FIX`: properly crop sequence flow ends on undo/redo ([#940](https://github.com/bpmn-io/bpmn-js/issues/940))\n* `CHORE`: bump to [`diagram-js@3.3.0`](https://github.com/bpmn-io/diagram-js/blob/main/CHANGELOG.md#330)\n\n## 3.3.1\n\n* `FIX`: ignore unchanged direct editing completion\n* `CHORE`: update to `diagram-js-direct-editing@1.4.2`\n\n## 3.3.0\n\n* `FEAT`: display `DataInput` / `DataOutput` labels ([`89719de3b`](https://github.com/bpmn-io/bpmn-js/commit/89719de3be50d9270227fd04216f7f19f0d018a2))\n* `FEAT`: support basic `DataInput` / `DataOutput` move ([#962](https://github.com/bpmn-io/bpmn-js/pull/962))\n* `FIX`: properly handle `DataInput` / `DataOutput` move ([#961](https://github.com/bpmn-io/bpmn-js/issues/961))\n\n## 3.2.3\n\n* `FIX`: update to `diagram-js-direct-editing@1.4.1` to trim trailing/leading whitespace in task names ([#763](https://github.com/bpmn-io/bpmn-js/issues/763))\n\n## 3.2.2\n\n* `FIX`: gracefully handle missing waypoints ([`45486f2`](https://github.com/bpmn-io/bpmn-js/commit/45486f2afe7f42fcac31be9ca477a7c94babe7d8))\n\n## 3.2.1\n\n* `FIX`: bump to `diagram-js@3.1.3` / `tiny-svg@2.2.1` to work around MS Edge bug ([`ed798a15`](https://github.com/bpmn-io/bpmn-js/commit/ed798a152539a613dbc9de9d61231ebbfb50987a))\n\n## 3.2.0\n\n* `FEAT`: set isHorizontal=true for new and updated participant/lane DIs ([#934](https://github.com/bpmn-io/bpmn-js/issues/934))\n\n## 3.1.1\n\n* `CHORE`: update to `diagram-js@3.1.1`\n\n## 3.1.0\n\n* `CHORE`: update to `diagram-js@3.1`\n\n## 3.0.4\n\n* `FIX`: render labels always on top ([#920](https://github.com/bpmn-io/bpmn-js/pull/920))\n\n## 3.0.3\n\n* `FIX`: do not join incoming/outgoing flows other than sequence flows on element deletion ([#917](https://github.com/bpmn-io/bpmn-js/issues/917))\n\n## 3.0.2\n\n* `FIX`: correct IE 11 delete keybinding ([#904](https://github.com/bpmn-io/bpmn-js/issues/904))\n\n## 3.0.1\n\n* `FIX`: restore copy-paste behavior\n\n## 3.0.0\n\n* `FEAT`: improve context pad tooltip titles for `EventBasedGateway` ([`350a5ab`](https://github.com/bpmn-io/bpmn-js/commit/350a5ab75ed675991599faff9615e4bbe184d491))\n* `FEAT`: display group names ([#844](https://github.com/bpmn-io/bpmn-js/issues/844))\n* `FEAT`: add ability to move selection with keyboard arrows ([#376](https://github.com/bpmn-io/bpmn-js/issues/376))\n* `FEAT`: support `SHIFT` modifier to move elements / canvas with keyboard arrows at accelerated speed\n* `FEAT`: require `Ctrl/Cmd` to be pressed as a modifier key to move the canvas via keyboard errors\n* `FEAT`: auto-expand elements when children resize ([#786](https://github.com/bpmn-io/bpmn-js/issues/786))\n* `CHORE`: bind editor actions and keyboard shortcuts for explicitly added features only ([#887](https://github.com/bpmn-io/bpmn-js/pull/887))\n* `CHORE`: update to [`diagram-js@3.0.0`](https://github.com/bpmn-io/diagram-js/blob/main/CHANGELOG.md#300)\n* `FIX`: disallow attaching of `BoundaryEvent` to a `ReceiveTask` following an `EventBasedGateway` ([#874](https://github.com/bpmn-io/bpmn-js/issues/874))\n* `FIX`: fix date in license ([#882](https://github.com/bpmn-io/bpmn-js/pull/882))\n\n### Breaking Changes\n\n* `BpmnGlobalConnect` provider got removed. Use `connection.start` rule to customize whether connection should allowed to be started ([#565](https://github.com/bpmn-io/bpmn-js/issues/565), [#870](https://github.com/bpmn-io/bpmn-js/issues/870))\n* `EditorActions` / `Keyboard` do not pull in features implicitly anymore. If you roll your own editor, include features you would like to ship with manually to provide the respective actions / keyboard bindings ([`645265ad`](https://github.com/bpmn-io/bpmn-js/commit/645265ad7e4a47e80657c671068a027752d7504f))\n* Moving the canvas with keyboard arrows now requires the `Ctrl/Cmd` modifiers to be pressed.\n\n## 2.5.2\n\n* `FIX`: correct horizontal embedded label padding\n\n## 2.5.1\n\n* `FIX`: prevent error to be thrown on lane move ([#855](https://github.com/bpmn-io/bpmn-js/issues/855))\n\n## 2.5.0\n\n* `FEAT`: snap message flows to `bpmn:Event` center during connect ([#850](https://github.com/bpmn-io/bpmn-js/issues/850))\n* `CHORE`: bump to `diagram-js@2.6.0`\n* `FIX`: allow label movement over message flow ([#849](https://github.com/bpmn-io/bpmn-js/issues/849))\n\n## 2.4.1\n\n* `FIX`: make viewer IE 9 compatible\n* `FIX`: prevent duplicate connections after drop on flow ([#774](https://github.com/bpmn-io/bpmn-js/issues/774))\n* `FIX`: fix rules not preventing redundant loop ([#836](https://github.com/bpmn-io/bpmn-js/issues/836))\n\n## 2.4.0\n\n* `FEAT`: improve layouting of boundary event to host loops ([#467](https://github.com/bpmn-io/bpmn-js/issues/467))\n* `FEAT`: allow circular activity to activity loops ([#824](https://github.com/bpmn-io/bpmn-js/issues/824))\n* `FEAT`: create label on appropriate free position ([#825](https://github.com/bpmn-io/bpmn-js/issues/825))\n* `CHORE`: bump to `diagram-js@2.5.0`\n* `FIX`: repair label position not being adapted on host move\n\n## 2.3.1\n\n* `FIX`: revert to `Arial` as the default rendering font ([#819](https://github.com/bpmn-io/bpmn-js/issues/819))\n* `FIX`: keep event definitions when switching from interrupting to non-interrupting boundary event ([#799](https://github.com/bpmn-io/bpmn-js/issues/799))\n\n## 2.3.0\n\n* `CHORE`: update to `diagram-js@2.4.0`\n\n## 2.2.1\n\n* `FIX`: correct updating of multiple data stores ([`300e7010`](https://github.com/bpmn-io/bpmn-js/commit/300e7010c4e1862394d147988dc4c4bcc09b07bc))\n\n## 2.2.0\n\n* `FEAT`: emit export events ([#813](https://github.com/bpmn-io/bpmn-js/issues/813))\n* `FEAT`: unset businessObject name if empty ([`6c081d85`](https://github.com/bpmn-io/bpmn-js/commit/6c081d854fa8a4e87eb7cdd1744be37c78652667))\n* `FEAT`: resize text annotation on text change ([`100f3fb2`](https://github.com/bpmn-io/bpmn-js/commit/100f3fb2ee6373cd4b7ad0b76e520a1afb70887e))\n* `FIX`: apply data store behavior in collaboration only ([`5cc28d5d`](https://github.com/bpmn-io/bpmn-js/commit/5cc28d5d5571287a798b189aed75095f1fd0189e))\n* `FIX`: create/update labels when updating element name via `Modeling#updateProperties` ([`4a0f6da8`](https://github.com/bpmn-io/bpmn-js/commit/4a0f6da814c45268e8a324e73a53479bd2435bbe))\n\n## 2.1.0\n\n* `FEAT`: support specifying `lineHeight` for text rendering ([#256](https://github.com/bpmn-io/diagram-js/pull/256))\n* `FEAT`: `bpmn:LaneSet` elements get an ID assigned on creation\n* `FEAT`: external labels can be deleted, clearing the elements name ([#791](https://github.com/bpmn-io/bpmn-js/pull/791))\n* `FEAT`: add ability to override default element colors ([#713](https://github.com/bpmn-io/bpmn-js/issues/713))\n* `FEAT`: add ability to override font family and size of rendered labels ([`4bb270f1`](https://github.com/bpmn-io/bpmn-js/commit/4bb270f19279db40f9cc3c179e09ee3a9a114e7c))\n\n## 2.0.1\n\n_Republish of `v2.0.0` due to registry error._\n\n## 2.0.0\n\n* `FEAT`: allow data store to be modeled between participants ([#483](https://github.com/bpmn-io/bpmn-js/issues/483))\n* `CHORE`: update to [`diagram-js@2.0.0`](https://github.com/bpmn-io/diagram-js/blob/main/CHANGELOG.md#200)\n* `FIX`: correctly handle missing `bpmndi:Label` bounds during model updating ([#794](https://github.com/bpmn-io/bpmn-js/issues/794))\n\n### Breaking Changes\n\n* The `PopupMenu` API got rewritten, cf. [`b1852e1d`](https://github.com/bpmn-io/diagram-js/pull/254/commits/b1852e1d71f67bd36ae1eb02748d2d0cbf124625)\n\n## 1.3.3\n\n* `CHORE`: update to [`bpmn-moddle@5.1.5`](https://github.com/bpmn-io/bpmn-moddle/blob/main/CHANGELOG.md#515)\n\n## 1.3.2\n\n* `FIX`: correctly serialize extension attributes on `bpmn:Expression`\n\n## 1.3.1\n\n* `FIX`: correctly auto-place from boundary events attached to host edges ([#788](https://github.com/bpmn-io/bpmn-js/issues/788))\n\n## 1.3.0\n\n* `FEAT`: expose additional `BpmnTreeWalker` APIs for advanced import use-cases\n* `CHORE`: bump diagram-js and object-refs version\n\n## 1.2.1\n\n* `FIX`: correct side-effects config to not include `*.css` files\n\n## 1.2.0\n\n* `FEAT`: add initial snapping when creating associations\n* `CHORE`: update to `diagram-js@1.3.0`\n* `FIX`: allow message flows between collapsed pools\n* `FIX`: complete direct editing on popup menu use\n* `FIX`: focus label editing box on element creation\n\n## 1.1.1\n\n* `FIX`: escape `data-element-id` in CSS selectors\n\n## 1.1.0\n\n* `FEAT`: show gateway icon on context pad without marker ([`15dfab6b`](https://github.com/bpmn-io/bpmn-js/commit/15dfab6b5b12dd184acf070f2ab3ad205d1b245c))\n\n## 1.0.4\n\n* `FIX`: properly wire `$parent` on copy + paste\n* `FIX`: improve boundary event rendering to correct SVG to image conversion\n\n## 1.0.3\n\n* `FIX`: re-expose `TestHelper#bootstrapBpmnJS` util\n\n## 1.0.2\n\n* `FIX`: correct library default export\n\n## 1.0.1\n\n_Republished 1.0.0 with CHANGELOG entries._\n\n## 1.0.0\n\n* `CHORE`: convert code base to ES modules\n* `CHORE`: update utility toolbelt\n\n### Breaking Changes\n\n* You must now configure a module transpiler such as Babel or Webpack to handle ES module imports and exports.\n\n## 0.31.0\n\n* `FEAT`: encode entities in body properties during XML export\n* `CHORE`: bump to [`bpmn-moddle@4.0.0`](https://github.com/bpmn-io/bpmn-moddle/releases/tag/v4.0.0)\n* `CHORE`: bump utility version\n\n## 0.30.0\n\n* `CHORE`: bump to [`diagram-js@0.31.0`](https://github.com/bpmn-io/diagram-js/releases/tag/v0.31.0)\n\n## ...\n\nCheck `git log` for earlier history.\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2014-present Camunda Services GmbH\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in the\nSoftware without restriction, including without limitation the rights to use, copy,\nmodify, merge, publish, distribute, sublicense, and/or sell copies of the Software,\nand to permit persons to whom the Software is furnished to do so, subject to the\nfollowing conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nThe source code responsible for displaying the bpmn.io project watermark that\nlinks back to https://bpmn.io as part of rendered diagrams MUST NOT be\nremoved or changed. When this software is being used in a website or application,\nthe watermark must stay fully visible and not visually overlapped by other elements.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\nINCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR\nPURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE\nOR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# bpmn-js - BPMN 2.0 for the web\n\n[![Build Status](https://github.com/bpmn-io/bpmn-js/workflows/CI/badge.svg)](https://github.com/bpmn-io/bpmn-js/actions?query=workflow%3ACI)\n\nView and edit BPMN 2.0 diagrams in the browser.\n\n[![bpmn-js screencast](./resources/screencast.gif \"bpmn-js in action\")](http://demo.bpmn.io/s/start)\n\n## Installation\n\nUse the library [pre-packaged](https://github.com/bpmn-io/bpmn-js-examples/tree/main/pre-packaged)\nor include it [via npm](https://github.com/bpmn-io/bpmn-js-examples/tree/main/bundling)\ninto your node-style web-application.\n\n## Usage\n\nTo get started, create a [bpmn-js](https://github.com/bpmn-io/bpmn-js) instance\nand render [BPMN 2.0 diagrams](https://www.omg.org/spec/BPMN/2.0.2/) in the browser:\n\n```javascript\nconst xml = '...'; // my BPMN 2.0 xml\nconst viewer = new BpmnJS({\n  container: 'body'\n});\n\ntry {\n  const { warnings } = await viewer.importXML(xml);\n\n  console.log('rendered');\n} catch (err) {\n  console.log('error rendering', err);\n}\n```\n\nCheckout our [examples](https://github.com/bpmn-io/bpmn-js-examples) for many\nmore supported usage scenarios.\n\n## Resources\n\n* [Demo](http://demo.bpmn.io)\n* [Issues](https://github.com/bpmn-io/bpmn-js/issues)\n* [Examples](https://github.com/bpmn-io/bpmn-js-examples)\n* [Forum](https://forum.bpmn.io)\n* [Changelog](./CHANGELOG.md)\n\n## Build and Run\n\nPrepare the project by installing all dependencies:\n\n```sh\nnpm install\n```\n\nThen, depending on your use-case you may run any of the following commands:\n\n```sh\n# build the library and run all tests\nnpm run all\n\n# spin up a single local modeler instance\nnpm start\n\n# run the full development setup\nnpm run dev\n```\n\nYou may need to perform [additional project setup](./docs/project/SETUP.md) when\nbuilding the latest development snapshot.\n\n## Related\n\nbpmn-js builds on top of a few powerful tools:\n\n* [bpmn-moddle](https://github.com/bpmn-io/bpmn-moddle): Read / write support for BPMN 2.0 XML in the browsers\n* [diagram-js](https://github.com/bpmn-io/diagram-js): Diagram rendering and editing toolkit\n\nIt is an extensible toolkit, complemented by many [additional utilities](https://github.com/bpmn-io/awesome-bpmn-io).\n\n## License\n\nUse under the terms of the [bpmn.io license](http://bpmn.io/license).\n"
  },
  {
    "path": "assets/bpmn-js.css",
    "content": ".bjs-container {\n  --bjs-font-family: Arial, sans-serif;\n\n  --color-grey-225-10-15: hsl(225, 10%, 15%);\n  --color-grey-225-10-35: hsl(225, 10%, 35%);\n  --color-grey-225-10-55: hsl(225, 10%, 55%);\n  --color-grey-225-10-75: hsl(225, 10%, 75%);\n  --color-grey-225-10-80: hsl(225, 10%, 80%);\n  --color-grey-225-10-85: hsl(225, 10%, 85%);\n  --color-grey-225-10-90: hsl(225, 10%, 90%);\n  --color-grey-225-10-95: hsl(225, 10%, 95%);\n  --color-grey-225-10-97: hsl(225, 10%, 97%);\n\n  --color-blue-205-100-45: hsl(205, 100%, 45%);\n  --color-blue-205-100-45-opacity-30: hsla(205, 100%, 45%, 30%);\n  --color-blue-205-100-50: hsl(205, 100%, 50%);\n  --color-blue-205-100-95: hsl(205, 100%, 95%);\n\n  --color-green-150-86-44: hsl(150, 86%, 44%);\n\n  --color-red-360-100-40: hsl(360, 100%, 40%);\n  --color-red-360-100-45: hsl(360, 100%, 45%);\n  --color-red-360-100-92: hsl(360, 100%, 92%);\n  --color-red-360-100-97: hsl(360, 100%, 97%);\n\n  --color-white: hsl(0, 0%, 100%);\n  --color-black: hsl(0, 0%, 0%);\n  --color-black-opacity-05: hsla(0, 0%, 0%, 5%);\n  --color-black-opacity-10: hsla(0, 0%, 0%, 10%);\n\n  --breadcrumbs-font-family: var(--bjs-font-family);\n  --breadcrumbs-item-color: var(--color-blue-205-100-50);\n  --breadcrumbs-arrow-color: var(--color-black);\n  --drilldown-fill-color: var(--color-white);\n  --drilldown-background-color: var(--color-blue-205-100-50);\n}\n\n.bjs-breadcrumbs {\n  position: absolute;\n  display: none;\n  flex-wrap: wrap;\n  align-items: center;\n  top: 30px;\n  left: 30px;\n  padding: 0px;\n  margin: 0px;\n  font-family: var(--breadcrumbs-font-family);\n  font-size: 16px;\n  line-height: normal;\n}\n\n.bjs-breadcrumbs-shown .bjs-breadcrumbs {\n  display: flex;\n}\n\n.djs-palette-shown .bjs-breadcrumbs {\n  left: 90px;\n}\n\n.djs-palette-shown.djs-palette-two-column .bjs-breadcrumbs {\n  left: 140px;\n}\n\n.bjs-breadcrumbs li {\n  display: inline-flex;\n  padding-bottom: 5px;\n  align-items: center;\n}\n\n.bjs-breadcrumbs li a {\n  cursor: pointer;\n  color: var(--breadcrumbs-item-color);\n}\n\n.bjs-breadcrumbs li:last-of-type a {\n  color: inherit;\n  cursor: default;\n}\n\n.bjs-breadcrumbs li:not(:first-child)::before {\n  content: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"17\" height=\"17\" viewBox=\"0 0 24 24\"><path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" /><path d=\"M0 0h24v24H0z\" fill=\"none\" /></svg>');\n  padding: 0 8px;\n  color: var(--breadcrumbs-arrow-color);\n  height: 1em;\n}\n\n.bjs-breadcrumbs .bjs-crumb {\n  display: inline-block;\n  max-width: 200px;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.bjs-drilldown {\n  width: 20px;\n  height: 20px;\n\n  padding: 0px;\n  margin-left: -20px;\n\n  cursor: pointer;\n  border: none;\n  border-radius: 2px;\n  outline: none;\n\n  fill: var(--drilldown-fill-color);\n  background-color: var(--drilldown-background-color);\n}\n\n.bjs-drilldown-empty {\n  display: none;\n}\n\n.selected .bjs-drilldown-empty {\n  display: inherit;\n}\n\n[data-popup=\"align-elements\"] .djs-popup-results {\n  display: flex;\n}\n\n[data-popup=\"align-elements\"] .djs-popup-body [data-group] + [data-group] {\n  border-left: 1px solid var(--popup-border-color);\n}\n\n[data-popup=\"align-elements\"] [data-group=\"align\"] {\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n}\n\n[data-popup=\"align-elements\"] .djs-popup-body .entry {\n  padding: 6px 8px;\n}\n\n[data-popup=\"align-elements\"] .djs-popup-body .entry:not(:first-child) {\n  margin-top: 0;\n}\n\n[data-popup=\"align-elements\"] .djs-popup-entry-icon {\n  display: block;\n  margin: 0;\n  height: 20px;\n  width: 20px;\n}\n"
  },
  {
    "path": "docs/project/SETUP.md",
    "content": "# Project Setup\n\nThis document describes the necessary steps to setup a `bpmn-js` development environment.\n\n## TLDR;\n\nOn Linux, OS X or Windows? [git](http://git-scm.com), [NodeJS](https://nodejs.org) and [npm](https://www.npmjs.org/doc/cli/npm.html) ready? Check out the [setup script section](#setup-via-script) below.\n\n## Manual Steps\n\nMake sure you have [git](http://git-scm.com), [NodeJS](https://nodejs.org) and [npm](https://www.npmjs.org/doc/cli/npm.html)  installed before you continue.\n\n### Get Project + Dependencies\n\nThe following projects from the [bpmn-io](https://github.com/bpmn-io) project on GitHub\n\n* [bpmn-js](https://github.com/bpmn-io/bpmn-js)\n* [diagram-js](https://github.com/bpmn-io/diagram-js)\n* [bpmn-moddle](https://github.com/bpmn-io/bpmn-moddle)\n\nand clone them into a common directory via\n\n```sh\ngit clone git@github.com:bpmn-io/bpmn-js.git\ngit clone git@github.com:bpmn-io/diagram-js.git\ngit clone git@github.com:bpmn-io/bpmn-moddle.git\n```\n\n### Link Projects\n\n[Link dependent projects](https://docs.npmjs.com/cli/link) between each other to pick up changes immediately.\n\n```plain\n.\n├─bpmn-js\n│   └─node_modules\n│       ├─diagram-js <link>\n│       └─bpmn-moddle <link>\n├─diagram-js\n├─bpmn-moddle\n```\n\n#### On OS X, Linux\n\nUse [npm-link](https://docs.npmjs.com/cli/link) or `ln -s <target> <link>`.\n\n#### On Windows\n\nUse `mklink /d <link> <target>` [(docs)](http://technet.microsoft.com/en-us/library/cc753194.aspx).\n\n### Install Dependencies\n\nExecute `npm install` on each of the projects to grab their dependencies.\n\n### Verify Things are O.K.\n\nExecute `npm run all` on each project. Things should be fine.\n\n### Setup via Script\n\nThe whole setup can be automated through setup scripts for [Linux/OS X](./setup.sh) and [Windows](./setup.bat).\n"
  },
  {
    "path": "docs/project/setup-alternative.sh",
    "content": "#!/bin/bash\n\n###\n# Setup script to be executed in a bpmn.io project root (some empty folder chosen by YOU). Use if you do not want to rely on npm link.\n###\n\nbase=`pwd`\n\necho cloning repositories\n\ngit clone git@github.com:bpmn-io/diagram-js.git\ngit clone git@github.com:bpmn-io/bpmn-js.git\ngit clone git@github.com:bpmn-io/bpmn-moddle.git\n\n\necho done.\n\necho setup diagram-js\n\ncd $base/diagram-js\nnpm install\n\n\necho setup bpmn-moddle\n\ncd $base/bpmn-moddle\nnpm install\n\n\necho setup bpmn-js\n\ncd $base/bpmn-js\nmkdir node_modules\nln -s $base/bpmn-moddle node_modules/bpmn-moddle\nln -s $base/diagram-js node_modules/diagram-js\nnpm install\n\n\ncd $base\n\necho all done.\n"
  },
  {
    "path": "docs/project/setup.bat",
    "content": "@echo off\n\nrem ###\nrem # Setup script to be executed in a bpmn.io project root (some empty folder chosen by YOU)\nrem ##\n\nset BASE=%CD%\n\necho cloning repositories\n\ngit clone git@github.com:bpmn-io/diagram-js.git\ngit clone git@github.com:bpmn-io/bpmn-js.git\ngit clone git@github.com:bpmn-io/bpmn-moddle.git\n\necho done.\n\n\necho setup diagram-js\n\ncd %BASE%\\diagram-js\nnpm install\n\n\necho setup bpmn-moddle\n\ncd %BASE%\\bpmn-moddle\nnpm install\n\n\necho prepare setup bpmn-js\n\nmkdir %BASE%\\bpmn-js\\node_modules\n\nrem link bpmn-js\nmklink /D %BASE%\\bpmn-js\\node_modules\\bpmn-moddle %BASE%\\bpmn-moddle\nmklink /D %BASE%\\bpmn-js\\node_modules\\diagram-js %BASE%\\diagram-js\n\n\necho setup bpmn-js\n\ncd %BASE%\\bpmn-js\nnpm install\n\n\ncd %BASE%\n"
  },
  {
    "path": "docs/project/setup.sh",
    "content": "#!/bin/bash\n\n###\n# Setup script to be executed in a bpmn.io project root (some empty folder chosen by YOU)\n###\n\nbase=`pwd`\n\necho cloning repositories\n\ngit clone git@github.com:bpmn-io/diagram-js.git\ngit clone git@github.com:bpmn-io/bpmn-js.git\ngit clone git@github.com:bpmn-io/bpmn-moddle.git\n\necho done.\n\n\necho setup diagram-js\n\ncd $base/diagram-js\nnpm install\n\n\necho setup bpmn-moddle\n\ncd $base/bpmn-moddle\nnpm install\n\n\necho setup bpmn-js\n\ncd $base/bpmn-js\nnpm install\nnpm link ../diagram-js\nnpm link ../bpmn-moddle\n\n\ncd $base\n\necho all done.\n"
  },
  {
    "path": "docs/translations.json",
    "content": "[\n  \"Activate create/remove space tool\",\n  \"Activate global connect tool\",\n  \"Activate hand tool\",\n  \"Activate lasso tool\",\n  \"Ad-hoc sub-process\",\n  \"Ad-hoc sub-process (collapsed)\",\n  \"Ad-hoc sub-process (expanded)\",\n  \"Add lane above\",\n  \"Add lane below\",\n  \"Add text annotation\",\n  \"Align elements\",\n  \"Align elements bottom\",\n  \"Align elements center\",\n  \"Align elements left\",\n  \"Align elements middle\",\n  \"Align elements right\",\n  \"Align elements top\",\n  \"Append compensation activity\",\n  \"Append conditional intermediate catch event\",\n  \"Append end event\",\n  \"Append gateway\",\n  \"Append intermediate/boundary event\",\n  \"Append message intermediate catch event\",\n  \"Append receive task\",\n  \"Append signal intermediate catch event\",\n  \"Append task\",\n  \"Append timer intermediate catch event\",\n  \"Business rule task\",\n  \"Call activity\",\n  \"Cancel boundary event\",\n  \"Cancel end event\",\n  \"Change element\",\n  \"Collection\",\n  \"Compensation boundary event\",\n  \"Compensation end event\",\n  \"Compensation intermediate throw event\",\n  \"Compensation start event\",\n  \"Complex gateway\",\n  \"Conditional boundary event\",\n  \"Conditional boundary event (non-interrupting)\",\n  \"Conditional flow\",\n  \"Conditional intermediate catch event\",\n  \"Conditional start event\",\n  \"Conditional start event (non-interrupting)\",\n  \"Connect to other element\",\n  \"Connect using association\",\n  \"Connect using data input association\",\n  \"Create data object reference\",\n  \"Create data store reference\",\n  \"Create end event\",\n  \"Create expanded sub-process\",\n  \"Create gateway\",\n  \"Create group\",\n  \"Create intermediate/boundary event\",\n  \"Create pool/participant\",\n  \"Create start event\",\n  \"Create task\",\n  \"Data object must be placed within a pool/participant.\",\n  \"Data object reference\",\n  \"Data store reference\",\n  \"Default flow\",\n  \"Delete\",\n  \"Distribute elements horizontally\",\n  \"Distribute elements vertically\",\n  \"Divide into three lanes\",\n  \"Divide into two lanes\",\n  \"Empty pool/participant\",\n  \"Empty pool/participant (removes content)\",\n  \"End event\",\n  \"Error boundary event\",\n  \"Error end event\",\n  \"Error start event\",\n  \"Escalation boundary event\",\n  \"Escalation boundary event (non-interrupting)\",\n  \"Escalation end event\",\n  \"Escalation intermediate throw event\",\n  \"Escalation start event\",\n  \"Escalation start event (non-interrupting)\",\n  \"Event sub-process\",\n  \"Event-based gateway\",\n  \"Exclusive gateway\",\n  \"Inclusive gateway\",\n  \"Intermediate throw event\",\n  \"Link intermediate catch event\",\n  \"Link intermediate throw event\",\n  \"Loop\",\n  \"Manual task\",\n  \"Message boundary event\",\n  \"Message boundary event (non-interrupting)\",\n  \"Message end event\",\n  \"Message intermediate catch event\",\n  \"Message intermediate throw event\",\n  \"Message start event\",\n  \"Message start event (non-interrupting)\",\n  \"Open {element}\",\n  \"Parallel gateway\",\n  \"Parallel multi-instance\",\n  \"Participant multiplicity\",\n  \"Receive task\",\n  \"Script task\",\n  \"Search in diagram\",\n  \"Send task\",\n  \"Sequence flow\",\n  \"Sequential multi-instance\",\n  \"Service task\",\n  \"Signal boundary event\",\n  \"Signal boundary event (non-interrupting)\",\n  \"Signal end event\",\n  \"Signal intermediate catch event\",\n  \"Signal intermediate throw event\",\n  \"Signal start event\",\n  \"Signal start event (non-interrupting)\",\n  \"Start event\",\n  \"Sub-process\",\n  \"Sub-process (collapsed)\",\n  \"Sub-process (expanded)\",\n  \"Task\",\n  \"Terminate end event\",\n  \"Timer boundary event\",\n  \"Timer boundary event (non-interrupting)\",\n  \"Timer intermediate catch event\",\n  \"Timer start event\",\n  \"Timer start event (non-interrupting)\",\n  \"Toggle non-interrupting\",\n  \"Transaction\",\n  \"User task\",\n  \"flow elements must be children of pools/participants\"\n]"
  },
  {
    "path": "eslint.config.mjs",
    "content": "import bpmnIoPlugin from 'eslint-plugin-bpmn-io';\n\nconst files = {\n  ignored: [\n    'dist',\n    'coverage'\n  ],\n  build: [\n    'test/config/*.js',\n    'tasks/**/*.mjs',\n    '*.js',\n    '*.mjs'\n  ],\n  test: [\n    'test/**/*.js'\n  ]\n};\n\nexport default [\n  {\n    ignores: files.ignored\n  },\n\n  // build\n  ...bpmnIoPlugin.configs.node.map(config => {\n\n    return {\n      ...config,\n      files: files.build\n    };\n  }),\n\n  // lib + test\n  ...bpmnIoPlugin.configs.browser.map(config => {\n\n    return {\n      ...config,\n      ignores: files.build\n    };\n  }),\n\n  // test\n  ...bpmnIoPlugin.configs.mocha.map(config => {\n\n    return {\n      ...config,\n      files: files.test,\n    };\n  }),\n  {\n    languageOptions: {\n      globals: {\n        sinon: true,\n        require: true\n      }\n    },\n    files: files.test\n  }\n];"
  },
  {
    "path": "lib/BaseModeler.js",
    "content": "import inherits from 'inherits-browser';\n\nimport { Ids } from 'ids';\n\nimport BaseViewer from './BaseViewer';\n\n\n/**\n * @typedef {import('./BaseViewer').BaseViewerOptions} BaseViewerOptions\n * @typedef {import('./BaseViewer').ModdleElementsById} ModdleElementsById\n *\n * @typedef {import('./model/Types').ModdleElement} ModdleElement\n */\n\n/**\n * A base modeler for BPMN 2.0 diagrams.\n *\n * See {@link bpmn-js/lib/Modeler} for a fully-featured modeler.\n *\n * @template [ServiceMap=null]\n *\n * @extends BaseViewer<ServiceMap>\n *\n * @param {BaseViewerOptions} [options] The options to configure the modeler.\n */\nexport default function BaseModeler(options) {\n  BaseViewer.call(this, options);\n\n  // hook ID collection into the modeler\n  this.on('import.parse.complete', function(event) {\n    if (!event.error) {\n      this._collectIds(event.definitions, event.elementsById);\n    }\n  }, this);\n\n  this.on('diagram.destroy', function() {\n    this.get('moddle').ids.clear();\n  }, this);\n}\n\ninherits(BaseModeler, BaseViewer);\n\n\n/**\n * Create a moddle instance, attaching IDs to it.\n *\n * @param {BaseViewerOptions} options\n *\n * @return {Moddle}\n */\nBaseModeler.prototype._createModdle = function(options) {\n  var moddle = BaseViewer.prototype._createModdle.call(this, options);\n\n  // attach ids to moddle to be able to track and validated ids in the BPMN 2.0\n  // XML document tree\n  moddle.ids = new Ids([ 32, 36, 1 ]);\n\n  return moddle;\n};\n\n/**\n * Collect IDs processed during parsing of the definitions object.\n *\n * @param {ModdleElement} definitions\n * @param {ModdleElementsById} elementsById\n */\nBaseModeler.prototype._collectIds = function(definitions, elementsById) {\n\n  var moddle = definitions.$model,\n      ids = moddle.ids,\n      id;\n\n  // remove references from previous import\n  ids.clear();\n\n  for (id in elementsById) {\n    ids.claim(id, elementsById[ id ]);\n  }\n};\n"
  },
  {
    "path": "lib/BaseModeler.spec.ts",
    "content": "import Canvas from 'diagram-js/lib/core/Canvas';\nimport EventBus from 'diagram-js/lib/core/EventBus';\n\nimport BaseModeler from './BaseModeler';\n\nimport { testViewer } from './BaseViewer.spec';\n\nconst modeler = new BaseModeler({\n  container: 'container'\n});\n\ntestViewer(modeler);\n\n\nconst otherModeler = new BaseModeler({\n  container: 'container'\n});\n\nconst extendedModeler = new BaseModeler({\n  container: 'container',\n  alignToOrigin: false,\n  propertiesPanel: {\n    attachTo: '#properties-panel'\n  }\n});\n\n\n// typed API usage\n\ntype FooEvent = {\n  /**\n   * Very cool field!\n   */\n  foo: string;\n};\n\ntype EventMap = {\n\n  foo: FooEvent\n};\n\ntype TypeMap = {\n  canvas: Canvas,\n  eventBus: EventBus<EventMap>\n};\n\nconst typedModeler = new BaseModeler<TypeMap>();\n\nconst bus = typedModeler.get('eventBus');\n\nconst canvas = typedModeler.get('canvas');\n\ncanvas.zoom('fit-viewport');\n\ntypedModeler.on('foo', event => {\n  console.log(event.foo);\n});\n\ntypedModeler.get('eventBus').on('foo', e => console.log(e.foo));"
  },
  {
    "path": "lib/BaseViewer.js",
    "content": "/**\n * The code in the <project-logo></project-logo> area\n * must not be changed.\n *\n * @see http://bpmn.io/license for more information.\n */\nimport {\n  assign,\n  find,\n  isNumber,\n  omit\n} from 'min-dash';\n\nimport {\n  domify,\n  assignStyle,\n  query as domQuery,\n  remove as domRemove\n} from 'min-dom';\n\nimport {\n  innerSVG\n} from 'tiny-svg';\n\nimport Diagram from 'diagram-js';\nimport { BpmnModdle } from 'bpmn-moddle';\n\nimport inherits from 'inherits-browser';\n\nimport {\n  importBpmnDiagram\n} from './import/Importer';\n\n/**\n * @template T\n *\n * @typedef { import('diagram-js/lib/core/EventBus').default<T> } EventBus\n */\n\n/**\n * @template T\n *\n * @typedef {import('diagram-js/lib/core/EventBus').EventBusEventCallback<T>} EventBusEventCallback\n */\n\n/**\n * @typedef {import('didi').ModuleDeclaration} ModuleDeclaration\n *\n * @typedef {import('./model/Types').Moddle} Moddle\n * @typedef {import('./model/Types').ModdleElement} ModdleElement\n * @typedef {import('./model/Types').ModdleExtension} ModdleExtension\n *\n * @typedef { {\n *   width?: number|string;\n *   height?: number|string;\n *   position?: string;\n *   container?: string|HTMLElement;\n *   moddleExtensions?: ModdleExtensions;\n *   additionalModules?: ModuleDeclaration[];\n * } & Record<string, any> } BaseViewerOptions\n *\n * @typedef {Record<string, ModdleElement>} ModdleElementsById\n *\n * @typedef { {\n *   [key: string]: ModdleExtension;\n * } } ModdleExtensions\n *\n * @typedef { {\n *   warnings: string[];\n * } } ImportXMLResult\n *\n * @typedef {ImportXMLResult & Error} ImportXMLError\n *\n * @typedef {ImportXMLResult} ImportDefinitionsResult\n *\n * @typedef {ImportXMLError} ImportDefinitionsError\n *\n * @typedef {ImportXMLResult} OpenResult\n *\n * @typedef {ImportXMLError} OpenError\n *\n * @typedef { {\n *   format?: boolean;\n *   preamble?: boolean;\n * } } SaveXMLOptions\n *\n * @typedef { {\n *   xml?: string;\n *   error?: Error;\n * } } SaveXMLResult\n *\n * @typedef { {\n *   svg: string;\n * } } SaveSVGResult\n *\n * @typedef { {\n *   xml: string;\n * } } ImportParseStartEvent\n *\n * @typedef { {\n *   error?: ImportXMLError;\n *   definitions?: ModdleElement;\n *   elementsById?: ModdleElementsById;\n *   references?: ModdleElement[];\n *   warnings: string[];\n * } } ImportParseCompleteEvent\n *\n * @typedef { {\n *   error?: ImportXMLError;\n *   warnings: string[];\n * } } ImportDoneEvent\n *\n * @typedef { {\n *   definitions: ModdleElement;\n * } } SaveXMLStartEvent\n *\n * @typedef {SaveXMLResult} SaveXMLDoneEvent\n *\n * @typedef { {\n *   error?: Error;\n *   svg: string;\n * } } SaveSVGDoneEvent\n */\n\n/**\n * @template Type\n *\n * @typedef { Type extends { eventBus: EventBus<infer X> } ? X : never } EventMap\n */\n\n/**\n * A base viewer for BPMN 2.0 diagrams.\n *\n * Have a look at {@link bpmn-js/lib/Viewer}, {@link bpmn-js/lib/NavigatedViewer} or {@link bpmn-js/lib/Modeler} for\n * bundles that include actual features.\n *\n * @template [ServiceMap=null]\n *\n * @extends Diagram<ServiceMap>\n *\n * @param {BaseViewerOptions} [options] The options to configure the viewer.\n */\nexport default function BaseViewer(options) {\n\n  /**\n   * @type {BaseViewerOptions}\n   */\n  options = assign({}, DEFAULT_OPTIONS, options);\n\n  /**\n   * @type {Moddle}\n   */\n  this._moddle = this._createModdle(options);\n\n  /**\n   * @type {HTMLElement}\n   */\n  this._container = this._createContainer(options);\n\n  this._init(this._container, this._moddle, options);\n\n  /* <project-logo> */\n\n  addProjectLogo(this._container);\n\n  /* </project-logo> */\n}\n\ninherits(BaseViewer, Diagram);\n\n/**\n * Parse and render a BPMN 2.0 diagram.\n *\n * Once finished the viewer reports back the result to the\n * provided callback function with (err, warnings).\n *\n * ## Life-Cycle Events\n *\n * During import the viewer will fire life-cycle events:\n *\n *   * import.parse.start (about to read model from XML)\n *   * import.parse.complete (model read; may have worked or not)\n *   * import.render.start (graphical import start)\n *   * import.render.complete (graphical import finished)\n *   * import.done (everything done)\n *\n * You can use these events to hook into the life-cycle.\n *\n * @throws {ImportXMLError} An error thrown during the import of the XML.\n *\n * @fires BaseViewer#ImportParseStartEvent\n * @fires BaseViewer#ImportParseCompleteEvent\n * @fires Importer#ImportRenderStartEvent\n * @fires Importer#ImportRenderCompleteEvent\n * @fires BaseViewer#ImportDoneEvent\n *\n * @param {string} xml The BPMN 2.0 XML to be imported.\n * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or Id of the BPMN diagram to open.\n *\n * @return {Promise<ImportXMLResult>} A promise resolving with warnings that were produced during the import.\n */\nBaseViewer.prototype.importXML = async function importXML(xml, bpmnDiagram) {\n\n  const self = this;\n\n  function ParseCompleteEvent(data) {\n    return self.get('eventBus').createEvent(data);\n  }\n\n  let aggregatedWarnings = [];\n  try {\n\n    // hook in pre-parse listeners +\n    // allow xml manipulation\n\n    /**\n     * A `import.parse.start` event.\n     *\n     * @event BaseViewer#ImportParseStartEvent\n     * @type {ImportParseStartEvent}\n     */\n    xml = this._emit('import.parse.start', { xml: xml }) || xml;\n\n    let parseResult;\n    try {\n      parseResult = await this._moddle.fromXML(xml, 'bpmn:Definitions');\n    } catch (error) {\n      this._emit('import.parse.complete', {\n        error\n      });\n\n      throw error;\n    }\n\n    let definitions = parseResult.rootElement;\n    const references = parseResult.references;\n    const parseWarnings = parseResult.warnings;\n    const elementsById = parseResult.elementsById;\n\n    aggregatedWarnings = aggregatedWarnings.concat(parseWarnings);\n\n    // hook in post parse listeners +\n    // allow definitions manipulation\n\n    /**\n     * A `import.parse.complete` event.\n     *\n     * @event BaseViewer#ImportParseCompleteEvent\n     * @type {ImportParseCompleteEvent}\n     */\n    definitions = this._emit('import.parse.complete', ParseCompleteEvent({\n      error: null,\n      definitions: definitions,\n      elementsById: elementsById,\n      references: references,\n      warnings: aggregatedWarnings\n    })) || definitions;\n\n    const importResult = await this.importDefinitions(definitions, bpmnDiagram);\n\n    aggregatedWarnings = aggregatedWarnings.concat(importResult.warnings);\n\n    /**\n     * A `import.parse.complete` event.\n     *\n     * @event BaseViewer#ImportDoneEvent\n     * @type {ImportDoneEvent}\n     */\n    this._emit('import.done', { error: null, warnings: aggregatedWarnings });\n\n    return { warnings: aggregatedWarnings };\n  } catch (err) {\n    let error = err;\n    aggregatedWarnings = aggregatedWarnings.concat(error.warnings || []);\n    addWarningsToError(error, aggregatedWarnings);\n\n    error = checkValidationError(error);\n\n    this._emit('import.done', { error, warnings: error.warnings });\n\n    throw error;\n  }\n};\n\n\n/**\n * Import parsed definitions and render a BPMN 2.0 diagram.\n *\n * Once finished the viewer reports back the result to the\n * provided callback function with (err, warnings).\n *\n * ## Life-Cycle Events\n *\n * During import the viewer will fire life-cycle events:\n *\n *   * import.render.start (graphical import start)\n *   * import.render.complete (graphical import finished)\n *\n * You can use these events to hook into the life-cycle.\n *\n * @throws {ImportDefinitionsError} An error thrown during the import of the definitions.\n *\n * @param {ModdleElement} definitions The definitions.\n * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or ID of the BPMN diagram to open.\n *\n * @return {Promise<ImportDefinitionsResult>} A promise resolving with warnings that were produced during the import.\n */\nBaseViewer.prototype.importDefinitions = async function importDefinitions(definitions, bpmnDiagram) {\n  this._setDefinitions(definitions);\n  const result = await this.open(bpmnDiagram);\n\n  return { warnings: result.warnings };\n};\n\n\n/**\n * Open diagram of previously imported XML.\n *\n * Once finished the viewer reports back the result to the\n * provided callback function with (err, warnings).\n *\n * ## Life-Cycle Events\n *\n * During switch the viewer will fire life-cycle events:\n *\n *   * import.render.start (graphical import start)\n *   * import.render.complete (graphical import finished)\n *\n * You can use these events to hook into the life-cycle.\n *\n * @throws {OpenError} An error thrown during opening.\n *\n * @param {ModdleElement|string} bpmnDiagramOrId The diagram or Id of the BPMN diagram to open.\n *\n * @return {Promise<OpenResult>} A promise resolving with warnings that were produced during opening.\n */\nBaseViewer.prototype.open = async function open(bpmnDiagramOrId) {\n\n  const definitions = this._definitions;\n  let bpmnDiagram = bpmnDiagramOrId;\n\n  if (!definitions) {\n    const error = new Error('no XML imported');\n    addWarningsToError(error, []);\n\n    throw error;\n  }\n\n  if (typeof bpmnDiagramOrId === 'string') {\n    bpmnDiagram = findBPMNDiagram(definitions, bpmnDiagramOrId);\n\n    if (!bpmnDiagram) {\n      const error = new Error('BPMNDiagram <' + bpmnDiagramOrId + '> not found');\n      addWarningsToError(error, []);\n\n      throw error;\n    }\n  }\n\n  // clear existing rendered diagram\n  // catch synchronous exceptions during #clear()\n  try {\n    this.clear();\n  } catch (error) {\n    addWarningsToError(error, []);\n\n    throw error;\n  }\n\n  // perform graphical import\n  const { warnings } = await importBpmnDiagram(this, definitions, bpmnDiagram);\n\n  return { warnings };\n};\n\n/**\n * Export the currently displayed BPMN 2.0 diagram as\n * a BPMN 2.0 XML document.\n *\n * ## Life-Cycle Events\n *\n * During XML saving the viewer will fire life-cycle events:\n *\n *   * saveXML.start (before serialization)\n *   * saveXML.serialized (after xml generation)\n *   * saveXML.done (everything done)\n *\n * You can use these events to hook into the life-cycle.\n *\n * @throws {Error} An error thrown during export.\n *\n * @fires BaseViewer#SaveXMLStart\n * @fires BaseViewer#SaveXMLDone\n *\n * @param {SaveXMLOptions} [options] The options.\n *\n * @return {Promise<SaveXMLResult>} A promise resolving with the XML.\n */\nBaseViewer.prototype.saveXML = async function saveXML(options) {\n\n  options = options || {};\n\n  let definitions = this._definitions,\n      error, xml;\n\n  try {\n    if (!definitions) {\n      throw new Error('no definitions loaded');\n    }\n\n    // allow to fiddle around with definitions\n\n    /**\n     * A `saveXML.start` event.\n     *\n     * @event BaseViewer#SaveXMLStartEvent\n     * @type {SaveXMLStartEvent}\n     */\n    definitions = this._emit('saveXML.start', {\n      definitions\n    }) || definitions;\n\n    const result = await this._moddle.toXML(definitions, options);\n    xml = result.xml;\n\n    xml = this._emit('saveXML.serialized', {\n      xml\n    }) || xml;\n  } catch (err) {\n    error = err;\n  }\n\n  const result = error ? { error } : { xml };\n\n  /**\n   * A `saveXML.done` event.\n   *\n   * @event BaseViewer#SaveXMLDoneEvent\n   * @type {SaveXMLDoneEvent}\n   */\n  this._emit('saveXML.done', result);\n\n  if (error) {\n    throw error;\n  }\n\n  return result;\n};\n\n\n/**\n * Export the currently displayed BPMN 2.0 diagram as\n * an SVG image.\n *\n * ## Life-Cycle Events\n *\n * During SVG saving the viewer will fire life-cycle events:\n *\n *   * saveSVG.start (before serialization)\n *   * saveSVG.done (everything done)\n *\n * You can use these events to hook into the life-cycle.\n *\n * @throws {Error} An error thrown during export.\n *\n * @fires BaseViewer#SaveSVGDone\n *\n * @return {Promise<SaveSVGResult>} A promise resolving with the SVG.\n */\nBaseViewer.prototype.saveSVG = async function saveSVG() {\n  this._emit('saveSVG.start');\n\n  let svg, err;\n\n  try {\n    const canvas = this.get('canvas');\n\n    const contentNode = canvas.getActiveLayer(),\n          defsNode = domQuery(':scope > defs', canvas._svg);\n\n    const contents = innerSVG(contentNode),\n          defs = defsNode ? '<defs>' + innerSVG(defsNode) + '</defs>' : '';\n\n    const bbox = contentNode.getBBox();\n\n    svg =\n      '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' +\n      '<!-- created with bpmn-js / http://bpmn.io -->\\n' +\n      '<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n' +\n      '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" ' +\n      'width=\"' + bbox.width + '\" height=\"' + bbox.height + '\" ' +\n      'viewBox=\"' + bbox.x + ' ' + bbox.y + ' ' + bbox.width + ' ' + bbox.height + '\" version=\"1.1\">' +\n      defs + contents +\n      '</svg>';\n  } catch (e) {\n    err = e;\n  }\n\n  /**\n   * A `saveSVG.done` event.\n   *\n   * @event BaseViewer#SaveSVGDoneEvent\n   * @type {SaveSVGDoneEvent}\n   */\n  this._emit('saveSVG.done', {\n    error: err,\n    svg: svg\n  });\n\n  if (err) {\n    throw err;\n  }\n\n  return { svg };\n};\n\nBaseViewer.prototype._setDefinitions = function(definitions) {\n  this._definitions = definitions;\n};\n\n/**\n * Return modules to instantiate with.\n *\n * @return {ModuleDeclaration[]} The modules.\n */\nBaseViewer.prototype.getModules = function() {\n  return this._modules;\n};\n\n/**\n * Remove all drawn elements from the viewer.\n *\n * After calling this method the viewer can still be reused for opening another\n * diagram.\n */\nBaseViewer.prototype.clear = function() {\n  if (!this.getDefinitions()) {\n\n    // no diagram to clear\n    return;\n  }\n\n  // remove drawn elements\n  Diagram.prototype.clear.call(this);\n};\n\n/**\n * Destroy the viewer instance and remove all its remainders from the document\n * tree.\n */\nBaseViewer.prototype.destroy = function() {\n\n  // diagram destroy\n  Diagram.prototype.destroy.call(this);\n\n  // dom detach\n  domRemove(this._container);\n};\n\n/**\n * @overlord\n *\n * Register an event listener for events with the given name.\n *\n * The callback will be invoked with `event, ...additionalArguments`\n * that have been passed to {@link EventBus#fire}.\n *\n * Returning false from a listener will prevent the events default action\n * (if any is specified). To stop an event from being processed further in\n * other listeners execute {@link Event#stopPropagation}.\n *\n * Returning anything but `undefined` from a listener will stop the listener propagation.\n *\n * @template T\n *\n * @param {string|string[]} events The event(s) to listen to.\n * @param {number} [priority] The priority with which to listen.\n * @param {EventBusEventCallback<T>} callback The callback.\n * @param {any} [that] Value of `this` the callback will be called with.\n */\n/**\n * Register an event listener for events with the given name.\n *\n * The callback will be invoked with `event, ...additionalArguments`\n * that have been passed to {@link EventBus#fire}.\n *\n * Returning false from a listener will prevent the events default action\n * (if any is specified). To stop an event from being processed further in\n * other listeners execute {@link Event#stopPropagation}.\n *\n * Returning anything but `undefined` from a listener will stop the listener propagation.\n *\n * @template {keyof EventMap<ServiceMap>} EventName\n *\n * @param {EventName} events to subscribe to\n * @param {number} [priority=1000] listen priority\n * @param {EventBusEventCallback<(EventMap<ServiceMap>)[EventName]>} callback\n * @param {any} [that] callback context\n */\nBaseViewer.prototype.on = function(events, priority, callback, that) {\n  return this.get('eventBus').on(events, priority, callback, that);\n};\n\n/**\n * Remove an event listener.\n *\n * @param {string|string[]} events The event(s).\n * @param {Function} [callback] The callback.\n */\nBaseViewer.prototype.off = function(events, callback) {\n  this.get('eventBus').off(events, callback);\n};\n\n/**\n * Attach the viewer to an HTML element.\n *\n * @param {HTMLElement} parentNode The parent node to attach to.\n */\nBaseViewer.prototype.attachTo = function(parentNode) {\n\n  if (!parentNode) {\n    throw new Error('parentNode required');\n  }\n\n  // ensure we detach from the\n  // previous, old parent\n  this.detach();\n\n  // unwrap jQuery if provided\n  if (parentNode.get && parentNode.constructor.prototype.jquery) {\n    parentNode = parentNode.get(0);\n  }\n\n  if (typeof parentNode === 'string') {\n    parentNode = domQuery(parentNode);\n  }\n\n  parentNode.appendChild(this._container);\n\n  this._emit('attach', {});\n\n  this.get('canvas').resized();\n};\n\n/**\n * Get the definitions model element.\n *\n * @return {ModdleElement} The definitions model element.\n */\nBaseViewer.prototype.getDefinitions = function() {\n  return this._definitions;\n};\n\n/**\n * Detach the viewer.\n *\n * @fires BaseViewer#DetachEvent\n */\nBaseViewer.prototype.detach = function() {\n\n  const container = this._container,\n        parentNode = container.parentNode;\n\n  if (!parentNode) {\n    return;\n  }\n\n  /**\n   * A `detach` event.\n   *\n   * @event BaseViewer#DetachEvent\n   * @type {Object}\n   */\n  this._emit('detach', {});\n\n  parentNode.removeChild(container);\n};\n\nBaseViewer.prototype._init = function(container, moddle, options) {\n\n  const baseModules = options.modules || this.getModules(options),\n        additionalModules = options.additionalModules || [],\n        staticModules = [\n          {\n            bpmnjs: [ 'value', this ],\n            moddle: [ 'value', moddle ]\n          }\n        ];\n\n  const diagramModules = [].concat(staticModules, baseModules, additionalModules);\n\n  const diagramOptions = assign(omit(options, [ 'additionalModules' ]), {\n    canvas: assign({}, options.canvas, { container: container }),\n    modules: diagramModules\n  });\n\n  // invoke diagram constructor\n  Diagram.call(this, diagramOptions);\n\n  if (options && options.container) {\n    this.attachTo(options.container);\n  }\n};\n\n/**\n * Emit an event on the underlying {@link EventBus}\n *\n * @param  {string} type\n * @param  {Object} event\n *\n * @return {Object} The return value after calling all event listeners.\n */\nBaseViewer.prototype._emit = function(type, event) {\n  return this.get('eventBus').fire(type, event);\n};\n\n/**\n * @param {BaseViewerOptions} options\n *\n * @return {HTMLElement}\n */\nBaseViewer.prototype._createContainer = function(options) {\n\n  const container = domify('<div class=\"bjs-container\"></div>');\n\n  assignStyle(container, {\n    width: ensureUnit(options.width),\n    height: ensureUnit(options.height),\n    position: options.position\n  });\n\n  return container;\n};\n\n/**\n * @param {BaseViewerOptions} options\n *\n * @return {Moddle}\n */\nBaseViewer.prototype._createModdle = function(options) {\n  const moddleOptions = assign({}, this._moddleExtensions, options.moddleExtensions);\n\n  return new BpmnModdle(moddleOptions);\n};\n\nBaseViewer.prototype._modules = [];\n\n// helpers ///////////////\n\nfunction addWarningsToError(err, warningsAry) {\n  err.warnings = warningsAry;\n  return err;\n}\n\nfunction checkValidationError(err) {\n\n  // check if we can help the user by indicating wrong BPMN 2.0 xml\n  // (in case he or the exporting tool did not get that right)\n\n  const pattern = /unparsable content <([^>]+)> detected([\\s\\S]*)$/;\n  const match = pattern.exec(err.message);\n\n  if (match) {\n    err.message =\n      'unparsable content <' + match[1] + '> detected; ' +\n      'this may indicate an invalid BPMN 2.0 diagram file' + match[2];\n  }\n\n  return err;\n}\n\nconst DEFAULT_OPTIONS = {\n  width: '100%',\n  height: '100%',\n  position: 'relative'\n};\n\n\n/**\n * Ensure the passed argument is a proper unit (defaulting to px)\n */\nfunction ensureUnit(val) {\n  return val + (isNumber(val) ? 'px' : '');\n}\n\n\n/**\n * Find BPMNDiagram in definitions by ID\n *\n * @param {ModdleElement<Definitions>} definitions\n * @param {string} diagramId\n *\n * @return {ModdleElement<BPMNDiagram>|null}\n */\nfunction findBPMNDiagram(definitions, diagramId) {\n  if (!diagramId) {\n    return null;\n  }\n\n  return find(definitions.diagrams, function(element) {\n    return element.id === diagramId;\n  }) || null;\n}\n\n\n/* <project-logo> */\n\nimport {\n  open as openPoweredBy,\n  BPMNIO_IMG,\n  LOGO_STYLES,\n  LINK_STYLES\n} from './util/PoweredByUtil';\n\nimport {\n  event as domEvent\n} from 'min-dom';\n\n/**\n * Adds the project logo to the diagram container as\n * required by the bpmn.io license.\n *\n * @see http://bpmn.io/license\n *\n * @param {Element} container\n */\nfunction addProjectLogo(container) {\n  const img = BPMNIO_IMG;\n\n  const linkMarkup =\n    '<a href=\"http://bpmn.io\" ' +\n    'target=\"_blank\" ' +\n    'class=\"bjs-powered-by\" ' +\n    'title=\"Powered by bpmn.io\" ' +\n    '>' +\n    img +\n    '</a>';\n\n  const linkElement = domify(linkMarkup);\n\n  assignStyle(domQuery('svg', linkElement), LOGO_STYLES);\n  assignStyle(linkElement, LINK_STYLES, {\n    position: 'absolute',\n    bottom: '15px',\n    right: '15px',\n    zIndex: '100'\n  });\n\n  container.appendChild(linkElement);\n\n  domEvent.bind(linkElement, 'click', function(event) {\n    openPoweredBy();\n\n    event.preventDefault();\n  });\n}\n\n/* </project-logo> */\n"
  },
  {
    "path": "lib/BaseViewer.spec.ts",
    "content": "import CommandStack from 'diagram-js/lib/command/CommandStack';\n\nimport EventBus, { Event } from 'diagram-js/lib/core/EventBus';\n\nimport BaseViewer, {\n  ImportDoneEvent,\n  ImportParseCompleteEvent,\n  ImportParseStartEvent,\n  SaveXMLDoneEvent,\n  SaveXMLStartEvent\n} from './BaseViewer';\n\nimport OverlaysModule from 'diagram-js/lib/features/overlays';\nimport Canvas from 'diagram-js/lib/core/Canvas';\n\nconst viewer = new BaseViewer();\n\nconst configuredViewer = new BaseViewer({\n  width: 100,\n  height: 100,\n  position: 'absolute',\n  container: 'container',\n  moddleExtensions: {\n    foo: {}\n  },\n  additionalModules: [\n    OverlaysModule\n  ]\n});\n\ntestViewer(viewer);\n\nconst extendedViewer = new BaseViewer({\n  container: 'container',\n  alignToOrigin: false,\n  propertiesPanel: {\n    attachTo: '#properties-panel'\n  }\n});\n\nexport function testViewer(viewer: BaseViewer) {\n  viewer.importXML('<?xml version=\"1.0\" encoding=\"UTF-8\"?>', 'BPMNDiagram_1');\n\n  viewer.importXML('<?xml version=\"1.0\" encoding=\"UTF-8\"?>')\n    .then(({ warnings }) => {\n      console.log(warnings);\n    })\n    .catch(error => {\n      const {\n        message,\n        warnings\n      } = error;\n\n      console.log(message, warnings);\n    });\n\n  viewer.importDefinitions({ $type: 'bpmn:Definitions' }, 'BPMNDiagram_1');\n\n  viewer.importDefinitions({ $type: 'bpmn:Definitions' })\n    .then(({ warnings }) => {\n      console.log(warnings);\n    })\n    .catch(error => {\n      const {\n        message,\n        warnings\n      } = error;\n\n      console.log(message, warnings);\n    });\n\n  viewer.open('BPMNDiagram_1');\n\n  viewer.open({ $type: 'bpmn:BPMNDiagram' })\n    .then(({ warnings }) => {\n      console.log(warnings);\n    })\n    .catch(error => {\n      const {\n        message,\n        warnings\n      } = error;\n\n      console.log(message, warnings);\n    });\n\n  viewer.saveXML({ format: true, preamble: false })\n    .then(({ xml, error }) => {\n      if (error) {\n        console.log(error);\n      } else {\n        console.log(xml);\n      }\n    })\n    .catch(error => {\n      console.log(error);\n    });\n\n  viewer.saveXML();\n\n  viewer.saveSVG();\n\n  viewer.getModules();\n\n  viewer.clear();\n\n  viewer.destroy();\n\n  viewer.get<CommandStack>('commandStack').undo();\n\n  viewer.invoke((commandStack: CommandStack) => commandStack.undo());\n\n  viewer.on('foo', () => console.log('foo'));\n\n  viewer.on([ 'foo', 'bar' ], () => console.log('foo'));\n\n  viewer.on('foo', 2000, () => console.log('foo'));\n\n  viewer.on('foo', 2000, () => console.log('foo'), { foo: 'bar' });\n\n  viewer.off('foo', () => console.log('foo'));\n\n  viewer.attachTo(document.createElement('div'));\n\n  viewer.getDefinitions();\n\n  viewer.detach();\n\n  viewer.on<ImportParseStartEvent>('import.parse.start', ({ xml }) => {\n    console.log(xml);\n  });\n\n  viewer.on<ImportParseCompleteEvent>('import.parse.complete', ({\n    error,\n    definitions,\n    elementsById,\n    references,\n    warnings\n  }) => {\n    if (error) {\n      console.error(error);\n    }\n\n    if (warnings.length) {\n      warnings.forEach(warning => console.log(warning));\n    }\n\n    console.log(definitions, elementsById, references);\n  });\n\n  viewer.on<ImportDoneEvent>('import.done', ({ error, warnings }) => {\n    if (error) {\n      console.error(error);\n    }\n\n    if (warnings.length) {\n      warnings.forEach(warning => console.log(warning));\n    }\n  });\n\n  viewer.on<SaveXMLStartEvent>('saveXML.start', ({ definitions }) => {\n    console.log(definitions);\n  });\n\n  viewer.on<SaveXMLDoneEvent>('saveXML.done', ({ error, xml }) => {\n    if (error) {\n      console.error(error);\n    } else {\n      console.log(xml);\n    }\n  });\n\n  viewer.on<Event>('detach', () => {});\n}\n\n// typed API usage\n\ntype FooEvent = {\n  /**\n   * Very cool field!\n   */\n  foo: string;\n};\n\ntype EventMap = {\n\n  foo: FooEvent\n};\n\ntype TypeMap = {\n  canvas: Canvas,\n  eventBus: EventBus<EventMap>\n};\n\nconst typedViewer = new BaseViewer<TypeMap>();\n\nconst bus = typedViewer.get('eventBus');\n\nconst canvas = typedViewer.get('canvas');\n\ncanvas.zoom('fit-viewport');\n\ntypedViewer.on('foo', event => {\n  console.log(event.foo);\n});\n\ntypedViewer.get('eventBus').on('foo', e => console.log(e.foo));\n"
  },
  {
    "path": "lib/Modeler.js",
    "content": "import inherits from 'inherits-browser';\n\nimport BaseModeler from './BaseModeler';\n\nimport Viewer from './Viewer';\nimport NavigatedViewer from './NavigatedViewer';\n\nimport KeyboardMoveModule from 'diagram-js/lib/navigation/keyboard-move';\nimport MoveCanvasModule from 'diagram-js/lib/navigation/movecanvas';\nimport ZoomScrollModule from 'diagram-js/lib/navigation/zoomscroll';\n\nimport AlignElementsModule from './features/align-elements';\nimport AutoPlaceModule from './features/auto-place';\nimport AutoResizeModule from './features/auto-resize';\nimport AutoScrollModule from 'diagram-js/lib/features/auto-scroll';\nimport BendpointsModule from 'diagram-js/lib/features/bendpoints';\nimport ConnectModule from 'diagram-js/lib/features/connect';\nimport ConnectionPreviewModule from 'diagram-js/lib/features/connection-preview';\nimport ContextPadModule from './features/context-pad';\nimport CopyPasteModule from './features/copy-paste';\nimport CreateModule from 'diagram-js/lib/features/create';\nimport DistributeElementsModule from './features/distribute-elements';\nimport EditorActionsModule from './features/editor-actions';\nimport GridSnappingModule from './features/grid-snapping';\nimport InteractionEventsModule from './features/interaction-events';\nimport KeyboardModule from './features/keyboard';\nimport KeyboardMoveSelectionModule from 'diagram-js/lib/features/keyboard-move-selection';\nimport LabelEditingModule from './features/label-editing';\nimport LabelLink from './features/label-link';\nimport ModelingModule from './features/modeling';\nimport ModelingFeedbackModule from './features/modeling-feedback';\nimport MoveModule from 'diagram-js/lib/features/move';\nimport PaletteModule from './features/palette';\nimport ReplacePreviewModule from './features/replace-preview';\nimport ResizeModule from 'diagram-js/lib/features/resize';\nimport SnappingModule from './features/snapping';\nimport SearchModule from './features/search';\nimport OutlineModule from './features/outline';\n\nvar initialDiagram =\n  '<?xml version=\"1.0\" encoding=\"UTF-8\"?>' +\n  '<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ' +\n                    'xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" ' +\n                    'xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" ' +\n                    'xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" ' +\n                    'targetNamespace=\"http://bpmn.io/schema/bpmn\" ' +\n                    'id=\"Definitions_1\">' +\n    '<bpmn:process id=\"Process_1\" isExecutable=\"false\">' +\n      '<bpmn:startEvent id=\"StartEvent_1\"/>' +\n    '</bpmn:process>' +\n    '<bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">' +\n      '<bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">' +\n        '<bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">' +\n          '<dc:Bounds height=\"36.0\" width=\"36.0\" x=\"173.0\" y=\"102.0\"/>' +\n        '</bpmndi:BPMNShape>' +\n      '</bpmndi:BPMNPlane>' +\n    '</bpmndi:BPMNDiagram>' +\n  '</bpmn:definitions>';\n\n\n/**\n * @typedef {import('./BaseViewer').BaseViewerOptions} BaseViewerOptions\n * @typedef {import('./BaseViewer').ImportXMLResult} ImportXMLResult\n */\n\n/**\n * A modeler for BPMN 2.0 diagrams.\n *\n * ## Extending the Modeler\n *\n * In order to extend the viewer pass extension modules to bootstrap via the\n * `additionalModules` option. An extension module is an object that exposes\n * named services.\n *\n * The following example depicts the integration of a simple\n * logging component that integrates with interaction events:\n *\n *\n * ```javascript\n *\n * // logging component\n * function InteractionLogger(eventBus) {\n *   eventBus.on('element.hover', function(event) {\n *     console.log()\n *   })\n * }\n *\n * InteractionLogger.$inject = [ 'eventBus' ]; // minification save\n *\n * // extension module\n * var extensionModule = {\n *   __init__: [ 'interactionLogger' ],\n *   interactionLogger: [ 'type', InteractionLogger ]\n * };\n *\n * // extend the viewer\n * var bpmnModeler = new Modeler({ additionalModules: [ extensionModule ] });\n * bpmnModeler.importXML(...);\n * ```\n *\n *\n * ## Customizing / Replacing Components\n *\n * You can replace individual diagram components by redefining them in override modules.\n * This works for all components, including those defined in the core.\n *\n * Pass in override modules via the `options.additionalModules` flag like this:\n *\n * ```javascript\n * function CustomContextPadProvider(contextPad) {\n *\n *   contextPad.registerProvider(this);\n *\n *   this.getContextPadEntries = function(element) {\n *     // no entries, effectively disable the context pad\n *     return {};\n *   };\n * }\n *\n * CustomContextPadProvider.$inject = [ 'contextPad' ];\n *\n * var overrideModule = {\n *   contextPadProvider: [ 'type', CustomContextPadProvider ]\n * };\n *\n * var bpmnModeler = new Modeler({ additionalModules: [ overrideModule ]});\n * ```\n *\n * @template [ServiceMap=null]\n *\n * @extends BaseModeler<ServiceMap>\n *\n * @param {BaseViewerOptions} [options] The options to configure the modeler.\n */\nexport default function Modeler(options) {\n  BaseModeler.call(this, options);\n}\n\ninherits(Modeler, BaseModeler);\n\n\nModeler.Viewer = Viewer;\nModeler.NavigatedViewer = NavigatedViewer;\n\n/**\n * Create a new diagram to start modeling.\n *\n * @throws {ImportXMLError} An error thrown during the import of the XML.\n *\n * @return {Promise<ImportXMLResult>} A promise resolving with warnings that were produced during the import.\n */\nModeler.prototype.createDiagram = function createDiagram() {\n  return this.importXML(initialDiagram);\n};\n\n\nModeler.prototype._interactionModules = [\n\n  // non-modeling components\n  KeyboardMoveModule,\n  MoveCanvasModule,\n  ZoomScrollModule\n];\n\nModeler.prototype._modelingModules = [\n\n  // modeling components\n  AlignElementsModule,\n  AutoPlaceModule,\n  AutoScrollModule,\n  AutoResizeModule,\n  BendpointsModule,\n  ConnectModule,\n  ConnectionPreviewModule,\n  ContextPadModule,\n  CopyPasteModule,\n  CreateModule,\n  DistributeElementsModule,\n  EditorActionsModule,\n  GridSnappingModule,\n  InteractionEventsModule,\n  KeyboardModule,\n  KeyboardMoveSelectionModule,\n  LabelEditingModule,\n  LabelLink,\n  ModelingModule,\n  ModelingFeedbackModule,\n  MoveModule,\n  PaletteModule,\n  ReplacePreviewModule,\n  ResizeModule,\n  SnappingModule,\n  SearchModule,\n  OutlineModule\n];\n\n\n// modules the modeler is composed of\n//\n// - viewer modules\n// - interaction modules\n// - modeling modules\n\nModeler.prototype._modules = [].concat(\n  Viewer.prototype._modules,\n  Modeler.prototype._interactionModules,\n  Modeler.prototype._modelingModules\n);\n"
  },
  {
    "path": "lib/Modeler.spec.ts",
    "content": "import Canvas from 'diagram-js/lib/core/Canvas';\nimport EventBus from 'diagram-js/lib/core/EventBus';\n\nimport Modeler from './Modeler';\n\nimport { testViewer } from './BaseViewer.spec';\n\nconst modeler = new Modeler({\n  container: 'container'\n});\n\ntestViewer(modeler);\n\nmodeler.createDiagram();\n\n\nconst otherModeler = new Modeler({\n  container: 'container'\n});\n\nconst extendedModeler = new Modeler({\n  container: 'container',\n  alignToOrigin: false,\n  propertiesPanel: {\n    attachTo: '#properties-panel'\n  }\n});\n\n\n// typed API usage\n\ntype FooEvent = {\n  /**\n   * Very cool field!\n   */\n  foo: string;\n};\n\ntype EventMap = {\n\n  foo: FooEvent\n};\n\ntype TypeMap = {\n  canvas: Canvas,\n  eventBus: EventBus<EventMap>\n};\n\nconst typedViewer = new Modeler<TypeMap>();\n\nconst bus = typedViewer.get('eventBus');\n\nconst canvas = typedViewer.get('canvas');\n\ncanvas.zoom('fit-viewport');\n\ntypedViewer.on('foo', event => {\n  console.log(event.foo);\n});\n\ntypedViewer.get('eventBus').on('foo', e => console.log(e.foo));"
  },
  {
    "path": "lib/NavigatedViewer.js",
    "content": "import inherits from 'inherits-browser';\n\nimport Viewer from './Viewer';\n\nimport KeyboardMoveModule from 'diagram-js/lib/navigation/keyboard-move';\nimport MoveCanvasModule from 'diagram-js/lib/navigation/movecanvas';\nimport ZoomScrollModule from 'diagram-js/lib/navigation/zoomscroll';\n\n/**\n * @typedef { import('./BaseViewer').BaseViewerOptions } BaseViewerOptions\n */\n\n/**\n * A viewer with mouse and keyboard navigation features.\n *\n * @template [ServiceMap=null]\n *\n * @extends Viewer<ServiceMap>\n *\n * @param {BaseViewerOptions} [options]\n */\nexport default function NavigatedViewer(options) {\n  Viewer.call(this, options);\n}\n\ninherits(NavigatedViewer, Viewer);\n\n\nNavigatedViewer.prototype._navigationModules = [\n  KeyboardMoveModule,\n  MoveCanvasModule,\n  ZoomScrollModule\n];\n\nNavigatedViewer.prototype._modules = [].concat(\n  Viewer.prototype._modules,\n  NavigatedViewer.prototype._navigationModules\n);"
  },
  {
    "path": "lib/NavigatedViewer.spec.ts",
    "content": "import Canvas from 'diagram-js/lib/core/Canvas';\nimport EventBus from 'diagram-js/lib/core/EventBus';\n\nimport NavigatedViewer from './NavigatedViewer';\n\nimport { testViewer } from './BaseViewer.spec';\n\nconst viewer = new NavigatedViewer({\n  container: 'container'\n});\n\ntestViewer(viewer);\n\nconst extendedViewer = new NavigatedViewer({\n  container: 'container',\n  alignToOrigin: false,\n  propertiesPanel: {\n    attachTo: '#properties-panel'\n  }\n});\n\n// typed API usage\n\ntype FooEvent = {\n  /**\n   * Very cool field!\n   */\n  foo: string;\n};\n\ntype EventMap = {\n\n  foo: FooEvent\n};\n\ntype TypeMap = {\n  canvas: Canvas,\n  eventBus: EventBus<EventMap>\n};\n\nconst typedViewer = new NavigatedViewer<TypeMap>();\n\nconst bus = typedViewer.get('eventBus');\n\nconst canvas = typedViewer.get('canvas');\n\ncanvas.zoom('fit-viewport');\n\ntypedViewer.on('foo', event => {\n  console.log(event.foo);\n});\n\ntypedViewer.get('eventBus').on('foo', e => console.log(e.foo));"
  },
  {
    "path": "lib/Viewer.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CoreModule from './core';\nimport DrilldownModdule from './features/drilldown';\nimport OverlaysModule from 'diagram-js/lib/features/overlays';\nimport SelectionModule from 'diagram-js/lib/features/selection';\nimport TranslateModule from 'diagram-js/lib/i18n/translate';\n\nimport BaseViewer from './BaseViewer';\n\n\n/**\n * @typedef { import('./BaseViewer').BaseViewerOptions } BaseViewerOptions\n */\n\n/**\n * A viewer for BPMN 2.0 diagrams.\n *\n * Have a look at {@link bpmn-js/lib/NavigatedViewer} or {@link bpmn-js/lib/Modeler} for bundles that include\n * additional features.\n *\n *\n * ## Extending the Viewer\n *\n * In order to extend the viewer pass extension modules to bootstrap via the\n * `additionalModules` option. An extension module is an object that exposes\n * named services.\n *\n * The following example depicts the integration of a simple\n * logging component that integrates with interaction events:\n *\n *\n * ```javascript\n *\n * // logging component\n * function InteractionLogger(eventBus) {\n *   eventBus.on('element.hover', function(event) {\n *     console.log()\n *   })\n * }\n *\n * InteractionLogger.$inject = [ 'eventBus' ]; // minification save\n *\n * // extension module\n * var extensionModule = {\n *   __init__: [ 'interactionLogger' ],\n *   interactionLogger: [ 'type', InteractionLogger ]\n * };\n *\n * // extend the viewer\n * var bpmnViewer = new Viewer({ additionalModules: [ extensionModule ] });\n * bpmnViewer.importXML(...);\n * ```\n *\n * @template [ServiceMap=null]\n *\n * @extends BaseViewer<ServiceMap>\n *\n * @param {BaseViewerOptions} [options] The options to configure the viewer.\n */\nexport default function Viewer(options) {\n  BaseViewer.call(this, options);\n}\n\ninherits(Viewer, BaseViewer);\n\n// modules the viewer is composed of\nViewer.prototype._modules = [\n  CoreModule,\n  DrilldownModdule,\n  OverlaysModule,\n  SelectionModule,\n  TranslateModule\n];\n\n// default moddle extensions the viewer is composed of\nViewer.prototype._moddleExtensions = {};"
  },
  {
    "path": "lib/Viewer.spec.ts",
    "content": "import Canvas from 'diagram-js/lib/core/Canvas';\nimport EventBus from 'diagram-js/lib/core/EventBus';\n\nimport Viewer from './Viewer';\n\nimport { testViewer } from './BaseViewer.spec';\n\nconst viewer = new Viewer({\n  container: 'container'\n});\n\ntestViewer(viewer);\n\nconst extendedViewer = new Viewer({\n  container: 'container',\n  alignToOrigin: false,\n  propertiesPanel: {\n    attachTo: '#properties-panel'\n  }\n});\n\n\n// typed API usage\n\ntype FooEvent = {\n  /**\n   * Very cool field!\n   */\n  foo: string;\n};\n\ntype EventMap = {\n\n  foo: FooEvent\n};\n\ntype TypeMap = {\n  canvas: Canvas,\n  eventBus: EventBus<EventMap>\n};\n\nconst typedViewer = new Viewer<TypeMap>();\n\nconst bus = typedViewer.get('eventBus');\n\nconst canvas = typedViewer.get('canvas');\n\ncanvas.zoom('fit-viewport');\n\ntypedViewer.on('foo', event => {\n  console.log(event.foo);\n});\n\ntypedViewer.get('eventBus').on('foo', e => console.log(e.foo));"
  },
  {
    "path": "lib/core/index.js",
    "content": "import DrawModule from '../draw';\nimport ImportModule from '../import';\n\nexport default {\n  __depends__: [\n    DrawModule,\n    ImportModule\n  ]\n};"
  },
  {
    "path": "lib/draw/BpmnRenderUtil.js",
    "content": "import {\n  has,\n  some\n} from 'min-dash';\n\nimport {\n  getDi\n} from '../util/ModelUtil';\n\nimport {\n  componentsToPath\n} from 'diagram-js/lib/util/RenderUtil';\n\n\n/**\n * @typedef {import('../model').ModdleElement} ModdleElement\n * @typedef {import('../model').Element} Element\n *\n * @typedef {import('../model').ShapeLike} ShapeLike\n *\n * @typedef {import('diagram-js/lib/util/Types').Dimensions} Dimensions\n * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n */\n\n// re-export for compatibility\nexport {\n  getDi,\n  getBusinessObject as getSemantic\n} from '../util/ModelUtil';\n\n\nexport var black = 'hsl(225, 10%, 15%)';\nexport var white = 'white';\n\n// element utils //////////////////////\n\n/**\n * Checks if eventDefinition of the given element matches with semantic type.\n *\n * @param {ModdleElement} event\n * @param {string} eventDefinitionType\n *\n * @return {boolean}\n */\nexport function isTypedEvent(event, eventDefinitionType) {\n  return some(event.eventDefinitions, function(definition) {\n    return definition.$type === eventDefinitionType;\n  });\n}\n\n/**\n * Check if element is a throw event.\n *\n * @param {ModdleElement} event\n *\n * @return {boolean}\n */\nexport function isThrowEvent(event) {\n  return (event.$type === 'bpmn:IntermediateThrowEvent') || (event.$type === 'bpmn:EndEvent');\n}\n\n/**\n * Check if element is a throw event.\n *\n * @param {ModdleElement} element\n *\n * @return {boolean}\n */\nexport function isCollection(element) {\n  var dataObject = element.dataObjectRef;\n\n  return element.isCollection || (dataObject && dataObject.isCollection);\n}\n\n\n// color access //////////////////////\n\n/**\n * @param {Element} element\n * @param {string} [defaultColor]\n * @param {string} [overrideColor]\n *\n * @return {string}\n */\nexport function getFillColor(element, defaultColor, overrideColor) {\n  var di = getDi(element);\n\n  return overrideColor || di.get('color:background-color') || di.get('bioc:fill') || defaultColor || white;\n}\n\n/**\n * @param {Element} element\n * @param {string} [defaultColor]\n * @param {string} [overrideColor]\n *\n * @return {string}\n */\nexport function getStrokeColor(element, defaultColor, overrideColor) {\n  var di = getDi(element);\n\n  return overrideColor || di.get('color:border-color') || di.get('bioc:stroke') || defaultColor || black;\n}\n\n/**\n * @param {Element} element\n * @param {string} [defaultColor]\n * @param {string} [defaultStrokeColor]\n * @param {string} [overrideColor]\n *\n * @return {string}\n */\nexport function getLabelColor(element, defaultColor, defaultStrokeColor, overrideColor) {\n  var di = getDi(element),\n      label = di.get('label');\n\n  return overrideColor || (label && label.get('color:color')) || defaultColor ||\n    getStrokeColor(element, defaultStrokeColor);\n}\n\n// cropping path customizations //////////////////////\n\n/**\n * @param {ShapeLike} shape\n *\n * @return {string} path\n */\nexport function getCirclePath(shape) {\n\n  var cx = shape.x + shape.width / 2,\n      cy = shape.y + shape.height / 2,\n      radius = shape.width / 2;\n\n  var circlePath = [\n    [ 'M', cx, cy ],\n    [ 'm', 0, -radius ],\n    [ 'a', radius, radius, 0, 1, 1, 0, 2 * radius ],\n    [ 'a', radius, radius, 0, 1, 1, 0, -2 * radius ],\n    [ 'z' ]\n  ];\n\n  return componentsToPath(circlePath);\n}\n\n/**\n * @param {ShapeLike} shape\n * @param {number} [borderRadius]\n *\n * @return {string} path\n */\nexport function getRoundRectPath(shape, borderRadius) {\n\n  var x = shape.x,\n      y = shape.y,\n      width = shape.width,\n      height = shape.height;\n\n  var roundRectPath = [\n    [ 'M', x + borderRadius, y ],\n    [ 'l', width - borderRadius * 2, 0 ],\n    [ 'a', borderRadius, borderRadius, 0, 0, 1, borderRadius, borderRadius ],\n    [ 'l', 0, height - borderRadius * 2 ],\n    [ 'a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, borderRadius ],\n    [ 'l', borderRadius * 2 - width, 0 ],\n    [ 'a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, -borderRadius ],\n    [ 'l', 0, borderRadius * 2 - height ],\n    [ 'a', borderRadius, borderRadius, 0, 0, 1, borderRadius, -borderRadius ],\n    [ 'z' ]\n  ];\n\n  return componentsToPath(roundRectPath);\n}\n\n/**\n * @param {ShapeLike} shape\n *\n * @return {string} path\n */\nexport function getDiamondPath(shape) {\n\n  var width = shape.width,\n      height = shape.height,\n      x = shape.x,\n      y = shape.y,\n      halfWidth = width / 2,\n      halfHeight = height / 2;\n\n  var diamondPath = [\n    [ 'M', x + halfWidth, y ],\n    [ 'l', halfWidth, halfHeight ],\n    [ 'l', -halfWidth, halfHeight ],\n    [ 'l', -halfWidth, -halfHeight ],\n    [ 'z' ]\n  ];\n\n  return componentsToPath(diamondPath);\n}\n\n/**\n * @param {ShapeLike} shape\n *\n * @return {string} path\n */\nexport function getRectPath(shape) {\n  var x = shape.x,\n      y = shape.y,\n      width = shape.width,\n      height = shape.height;\n\n  var rectPath = [\n    [ 'M', x, y ],\n    [ 'l', width, 0 ],\n    [ 'l', 0, height ],\n    [ 'l', -width, 0 ],\n    [ 'z' ]\n  ];\n\n  return componentsToPath(rectPath);\n}\n\n/**\n * Get width and height from element or overrides.\n *\n * @param {Dimensions|Rect|ShapeLike} bounds\n * @param {Object} overrides\n *\n * @returns {Dimensions}\n */\nexport function getBounds(bounds, overrides = {}) {\n  return {\n    width: getWidth(bounds, overrides),\n    height: getHeight(bounds, overrides)\n  };\n}\n\n/**\n * Get width from element or overrides.\n *\n * @param {Dimensions|Rect|ShapeLike} bounds\n * @param {Object} overrides\n *\n * @returns {number}\n */\nexport function getWidth(bounds, overrides = {}) {\n  return has(overrides, 'width') ? overrides.width : bounds.width;\n}\n\n/**\n * Get height from element or overrides.\n *\n * @param {Dimensions|Rect|ShapeLike} bounds\n * @param {Object} overrides\n *\n * @returns {number}\n */\nexport function getHeight(bounds, overrides = {}) {\n  return has(overrides, 'height') ? overrides.height : bounds.height;\n}"
  },
  {
    "path": "lib/draw/BpmnRenderer.js",
    "content": "import inherits from 'inherits-browser';\n\nimport {\n  assign,\n  forEach,\n  isObject\n} from 'min-dash';\n\nimport BaseRenderer from 'diagram-js/lib/draw/BaseRenderer';\n\nimport {\n  isExpanded,\n  isHorizontal,\n  isEventSubProcess\n} from '../util/DiUtil';\n\nimport {\n  getLabel,\n  isLabel\n} from '../util/LabelUtil';\n\nimport {\n  is\n} from '../util/ModelUtil';\n\nimport {\n  createLine\n} from 'diagram-js/lib/util/RenderUtil';\n\nimport {\n  isTypedEvent,\n  isThrowEvent,\n  isCollection,\n  getBounds,\n  getDi,\n  getSemantic,\n  getCirclePath,\n  getRoundRectPath,\n  getDiamondPath,\n  getRectPath,\n  getFillColor,\n  getStrokeColor,\n  getLabelColor,\n  getHeight,\n  getWidth\n} from './BpmnRenderUtil';\n\nimport {\n  query as domQuery\n} from 'min-dom';\n\nimport {\n  append as svgAppend,\n  attr as svgAttr,\n  create as svgCreate,\n  classes as svgClasses\n} from 'tiny-svg';\n\nimport {\n  rotate,\n  transform,\n  translate\n} from 'diagram-js/lib/util/SvgTransformUtil';\n\nimport { Ids } from 'ids';\n\nimport { black } from './BpmnRenderUtil';\n\nvar markerIds = new Ids();\n\nvar ELEMENT_LABEL_DISTANCE = 10,\n    INNER_OUTER_DIST = 3,\n    PARTICIPANT_STROKE_WIDTH = 1.5,\n    TASK_BORDER_RADIUS = 10,\n    EXTERNAL_LABEL_BORDER_RADIUS = 4;\n\nvar DEFAULT_OPACITY = 0.95,\n    FULL_OPACITY = 1,\n    LOW_OPACITY = 0.25;\n\n/**\n * @typedef { Partial<{\n *   defaultFillColor: string,\n *   defaultStrokeColor: string,\n *   defaultLabelColor: string\n * }> } BpmnRendererConfig\n *\n * @typedef { Partial<{\n *   fill: string,\n *   stroke: string,\n *   width: string,\n *   height: string\n * }> } Attrs\n */\n\n/**\n * @typedef { import('../model/Types').Element } Element\n * @typedef { import('../model/Types').Shape } Shape\n * @typedef { import('../model/Types').Connection } Connection\n */\n\n/**\n * A renderer for BPMN elements\n *\n * @param {BpmnRendererConfig} config\n * @param {import('diagram-js/lib/core/EventBus').default} eventBus\n * @param {import('diagram-js/lib/draw/Styles').default} styles\n * @param {import('./PathMap').default} pathMap\n * @param {import('diagram-js/lib/core/Canvas').default} canvas\n * @param {import('./TextRenderer').default} textRenderer\n * @param {number} [priority]\n */\nexport default function BpmnRenderer(\n    config, eventBus, styles, pathMap,\n    canvas, textRenderer, priority) {\n\n  BaseRenderer.call(this, eventBus, priority);\n\n  var defaultFillColor = config && config.defaultFillColor,\n      defaultStrokeColor = config && config.defaultStrokeColor,\n      defaultLabelColor = config && config.defaultLabelColor;\n\n  function shapeStyle(attrs) {\n    return styles.computeStyle(attrs, {\n      strokeLinecap: 'round',\n      strokeLinejoin: 'round',\n      stroke: black,\n      strokeWidth: 2,\n      fill: 'white'\n    });\n  }\n\n  function lineStyle(attrs) {\n    return styles.computeStyle(attrs, [ 'no-fill' ], {\n      strokeLinecap: 'round',\n      strokeLinejoin: 'round',\n      stroke: black,\n      strokeWidth: 2\n    });\n  }\n\n  function addMarker(id, options) {\n    var {\n      ref = { x: 0, y: 0 },\n      scale = 1,\n      element,\n      parentGfx = canvas._svg\n    } = options;\n\n    var marker = svgCreate('marker', {\n      id: id,\n      viewBox: '0 0 20 20',\n      refX: ref.x,\n      refY: ref.y,\n      markerWidth: 20 * scale,\n      markerHeight: 20 * scale,\n      orient: 'auto'\n    });\n\n    svgAppend(marker, element);\n\n    var defs = domQuery(':scope > defs', parentGfx);\n\n    if (!defs) {\n      defs = svgCreate('defs');\n\n      svgAppend(parentGfx, defs);\n    }\n\n    svgAppend(defs, marker);\n  }\n\n  function marker(parentGfx, type, fill, stroke) {\n\n\n    var id = markerIds.nextPrefixed('marker-');\n\n    createMarker(parentGfx, id, type, fill, stroke);\n\n    return 'url(#' + id + ')';\n  }\n\n  function createMarker(parentGfx, id, type, fill, stroke) {\n\n    if (type === 'sequenceflow-end') {\n      var sequenceflowEnd = svgCreate('path', {\n        d: 'M 1 5 L 11 10 L 1 15 Z',\n        ...shapeStyle({\n          fill: stroke,\n          stroke: stroke,\n          strokeWidth: 1\n        })\n      });\n\n      addMarker(id, {\n        element: sequenceflowEnd,\n        ref: { x: 11, y: 10 },\n        scale: 0.5,\n        parentGfx\n      });\n    }\n\n    if (type === 'messageflow-start') {\n      var messageflowStart = svgCreate('circle', {\n        cx: 6,\n        cy: 6,\n        r: 3.5,\n        ...shapeStyle({\n          fill,\n          stroke: stroke,\n          strokeWidth: 1,\n\n          // fix for safari / chrome / firefox bug not correctly\n          // resetting stroke dash array\n          strokeDasharray: [ 10000, 1 ]\n        })\n      });\n\n      addMarker(id, {\n        element: messageflowStart,\n        ref: { x: 6, y: 6 },\n        parentGfx\n      });\n    }\n\n    if (type === 'messageflow-end') {\n      var messageflowEnd = svgCreate('path', {\n        d: 'm 1 5 l 0 -3 l 7 3 l -7 3 z',\n        ...shapeStyle({\n          fill,\n          stroke: stroke,\n          strokeWidth: 1,\n\n          // fix for safari / chrome / firefox bug not correctly\n          // resetting stroke dash array\n          strokeDasharray: [ 10000, 1 ]\n        })\n      });\n\n      addMarker(id, {\n        element: messageflowEnd,\n        ref: { x: 8.5, y: 5 },\n        parentGfx\n      });\n    }\n\n    if (type === 'association-start') {\n      var associationStart = svgCreate('path', {\n        d: 'M 11 5 L 1 10 L 11 15',\n        ...lineStyle({\n          fill: 'none',\n          stroke,\n          strokeWidth: 1.5,\n\n          // fix for safari / chrome / firefox bug not correctly\n          // resetting stroke dash array\n          strokeDasharray: [ 10000, 1 ]\n        })\n      });\n\n      addMarker(id, {\n        element: associationStart,\n        ref: { x: 1, y: 10 },\n        scale: 0.5,\n        parentGfx\n      });\n    }\n\n    if (type === 'association-end') {\n      var associationEnd = svgCreate('path', {\n        d: 'M 1 5 L 11 10 L 1 15',\n        ...lineStyle({\n          fill: 'none',\n          stroke,\n          strokeWidth: 1.5,\n\n          // fix for safari / chrome / firefox bug not correctly\n          // resetting stroke dash array\n          strokeDasharray: [ 10000, 1 ]\n        })\n      });\n\n      addMarker(id, {\n        element: associationEnd,\n        ref: { x: 11, y: 10 },\n        scale: 0.5,\n        parentGfx\n      });\n    }\n\n    if (type === 'conditional-flow-marker') {\n      var conditionalFlowMarker = svgCreate('path', {\n        d: 'M 0 10 L 8 6 L 16 10 L 8 14 Z',\n        ...shapeStyle({\n          fill,\n          stroke: stroke\n        })\n      });\n\n      addMarker(id, {\n        element: conditionalFlowMarker,\n        ref: { x: -1, y: 10 },\n        scale: 0.5,\n        parentGfx\n      });\n    }\n\n    if (type === 'conditional-default-flow-marker') {\n      var defaultFlowMarker = svgCreate('path', {\n        d: 'M 6 4 L 10 16',\n        ...shapeStyle({\n          stroke: stroke,\n          fill: 'none'\n        })\n      });\n\n      addMarker(id, {\n        element: defaultFlowMarker,\n        ref: { x: 0, y: 10 },\n        scale: 0.5,\n        parentGfx\n      });\n    }\n  }\n\n  function drawCircle(parentGfx, width, height, offset, attrs = {}) {\n\n    if (isObject(offset)) {\n      attrs = offset;\n      offset = 0;\n    }\n\n    offset = offset || 0;\n\n    attrs = shapeStyle(attrs);\n\n    var cx = width / 2,\n        cy = height / 2;\n\n    var circle = svgCreate('circle', {\n      cx: cx,\n      cy: cy,\n      r: Math.round((width + height) / 4 - offset),\n      ...attrs\n    });\n\n    svgAppend(parentGfx, circle);\n\n    return circle;\n  }\n\n  function drawRect(parentGfx, width, height, r, offset, attrs) {\n\n    if (isObject(offset)) {\n      attrs = offset;\n      offset = 0;\n    }\n\n    offset = offset || 0;\n\n    attrs = shapeStyle(attrs);\n\n    var rect = svgCreate('rect', {\n      x: offset,\n      y: offset,\n      width: width - offset * 2,\n      height: height - offset * 2,\n      rx: r,\n      ry: r,\n      ...attrs\n    });\n\n    svgAppend(parentGfx, rect);\n\n    return rect;\n  }\n\n  function drawDiamond(parentGfx, width, height, attrs) {\n\n    var x_2 = width / 2;\n    var y_2 = height / 2;\n\n    var points = [\n      { x: x_2, y: 0 },\n      { x: width, y: y_2 },\n      { x: x_2, y: height },\n      { x: 0, y: y_2 }\n    ];\n\n    var pointsString = points.map(function(point) {\n      return point.x + ',' + point.y;\n    }).join(' ');\n\n    attrs = shapeStyle(attrs);\n\n    var polygon = svgCreate('polygon', {\n      ...attrs,\n      points: pointsString\n    });\n\n    svgAppend(parentGfx, polygon);\n\n    return polygon;\n  }\n\n  /**\n   * @param {SVGElement} parentGfx\n   * @param {Point[]} waypoints\n   * @param {any} attrs\n   * @param {number} [radius]\n   *\n   * @return {SVGElement}\n   */\n  function drawLine(parentGfx, waypoints, attrs, radius) {\n    attrs = lineStyle(attrs);\n\n    var line = createLine(waypoints, attrs, radius);\n\n    svgAppend(parentGfx, line);\n\n    return line;\n  }\n\n  /**\n   * @param {SVGElement} parentGfx\n   * @param {Point[]} waypoints\n   * @param {any} attrs\n   *\n   * @return {SVGElement}\n   */\n  function drawConnectionSegments(parentGfx, waypoints, attrs) {\n    return drawLine(parentGfx, waypoints, attrs, 5);\n  }\n\n  function drawPath(parentGfx, d, attrs) {\n    attrs = lineStyle(attrs);\n\n    var path = svgCreate('path', {\n      ...attrs,\n      d\n    });\n\n    svgAppend(parentGfx, path);\n\n    return path;\n  }\n\n  function drawMarker(type, parentGfx, path, attrs) {\n    return drawPath(parentGfx, path, assign({ 'data-marker': type }, attrs));\n  }\n\n  function renderer(type) {\n    return handlers[type];\n  }\n\n  function as(type) {\n    return function(parentGfx, element, attrs) {\n      return renderer(type)(parentGfx, element, attrs);\n    };\n  }\n\n  var eventIconRenderers = {\n    'bpmn:MessageEventDefinition': function(parentGfx, element, attrs = {}, isThrowing) {\n      var pathData = pathMap.getScaledPath('EVENT_MESSAGE', {\n        xScaleFactor: 0.9,\n        yScaleFactor: 0.9,\n        containerWidth: attrs.width || element.width,\n        containerHeight: attrs.height || element.height,\n        position: {\n          mx: 0.235,\n          my: 0.315\n        }\n      });\n\n      var fill = isThrowing\n        ? getStrokeColor(element, defaultStrokeColor, attrs.stroke)\n        : getFillColor(element, defaultFillColor, attrs.fill);\n\n      var stroke = isThrowing\n        ? getFillColor(element, defaultFillColor, attrs.fill)\n        : getStrokeColor(element, defaultStrokeColor, attrs.stroke);\n\n      var messagePath = drawPath(parentGfx, pathData, {\n        fill,\n        stroke,\n        strokeWidth: 1\n      });\n\n      return messagePath;\n    },\n    'bpmn:TimerEventDefinition': function(parentGfx, element, attrs = {}) {\n      var baseWidth = attrs.width || element.width;\n      var baseHeight = attrs.height || element.height;\n\n      // use a lighter stroke for event suprocess icons\n      var strokeWidth = attrs.width ? 1 : 2;\n\n      var circle = drawCircle(parentGfx, baseWidth, baseHeight, 0.2 * baseHeight, {\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: strokeWidth\n      });\n\n      var pathData = pathMap.getScaledPath('EVENT_TIMER_WH', {\n        xScaleFactor: 0.75,\n        yScaleFactor: 0.75,\n        containerWidth: baseWidth,\n        containerHeight: baseHeight,\n        position: {\n          mx: 0.5,\n          my: 0.5\n        }\n      });\n\n      drawPath(parentGfx, pathData, {\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: strokeWidth\n      });\n\n      for (var i = 0; i < 12; i++) {\n        var linePathData = pathMap.getScaledPath('EVENT_TIMER_LINE', {\n          xScaleFactor: 0.75,\n          yScaleFactor: 0.75,\n          containerWidth: baseWidth,\n          containerHeight: baseHeight,\n          position: {\n            mx: 0.5,\n            my: 0.5\n          }\n        });\n\n        var width = baseWidth / 2,\n            height = baseHeight / 2;\n\n        drawPath(parentGfx, linePathData, {\n          strokeWidth: 1,\n          stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n          transform: 'rotate(' + (i * 30) + ',' + height + ',' + width + ')'\n        });\n      }\n\n      return circle;\n    },\n    'bpmn:EscalationEventDefinition': function(parentGfx, event, attrs = {}, isThrowing) {\n      var pathData = pathMap.getScaledPath('EVENT_ESCALATION', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: attrs.width || event.width,\n        containerHeight: attrs.height || event.height,\n        position: {\n          mx: 0.5,\n          my: 0.2\n        }\n      });\n\n      var fill = isThrowing\n        ? getStrokeColor(event, defaultStrokeColor, attrs.stroke)\n        : getFillColor(event, defaultFillColor, attrs.fill);\n\n      return drawPath(parentGfx, pathData, {\n        fill,\n        stroke: getStrokeColor(event, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1\n      });\n    },\n    'bpmn:ConditionalEventDefinition': function(parentGfx, event, attrs = {}) {\n      var pathData = pathMap.getScaledPath('EVENT_CONDITIONAL', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: attrs.width || event.width,\n        containerHeight: attrs.height || event.height,\n        position: {\n          mx: 0.5,\n          my: 0.222\n        }\n      });\n\n      return drawPath(parentGfx, pathData, {\n        fill: getFillColor(event, defaultFillColor, attrs.fill),\n        stroke: getStrokeColor(event, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1\n      });\n    },\n    'bpmn:LinkEventDefinition': function(parentGfx, event, attrs = {}, isThrowing) {\n      var pathData = pathMap.getScaledPath('EVENT_LINK', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: event.width,\n        containerHeight: event.height,\n        position: {\n          mx: 0.57,\n          my: 0.263\n        }\n      });\n\n      var fill = isThrowing\n        ? getStrokeColor(event, defaultStrokeColor, attrs.stroke)\n        : getFillColor(event, defaultFillColor, attrs.fill);\n\n      return drawPath(parentGfx, pathData, {\n        fill,\n        stroke: getStrokeColor(event, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1\n      });\n    },\n    'bpmn:ErrorEventDefinition': function(parentGfx, event, attrs = {}, isThrowing) {\n      var pathData = pathMap.getScaledPath('EVENT_ERROR', {\n        xScaleFactor: 1.1,\n        yScaleFactor: 1.1,\n        containerWidth: attrs.width || event.width,\n        containerHeight: attrs.height || event.height,\n        position: {\n          mx: 0.2,\n          my: 0.722\n        }\n      });\n\n      var fill = isThrowing\n        ? getStrokeColor(event, defaultStrokeColor, attrs.stroke)\n        : getFillColor(event, defaultFillColor, attrs.fill);\n\n      return drawPath(parentGfx, pathData, {\n        fill,\n        stroke: getStrokeColor(event, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1\n      });\n    },\n    'bpmn:CancelEventDefinition': function(parentGfx, event, attrs = {}, isThrowing) {\n      var pathData = pathMap.getScaledPath('EVENT_CANCEL_45', {\n        xScaleFactor: 1.0,\n        yScaleFactor: 1.0,\n        containerWidth: event.width,\n        containerHeight: event.height,\n        position: {\n          mx: 0.638,\n          my: -0.055\n        }\n      });\n\n      var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor, attrs.stroke) : 'none';\n\n      var path = drawPath(parentGfx, pathData, {\n        fill,\n        stroke: getStrokeColor(event, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1\n      });\n\n      rotate(path, 45);\n\n      return path;\n    },\n    'bpmn:CompensateEventDefinition': function(parentGfx, event, attrs = {}, isThrowing) {\n      var pathData = pathMap.getScaledPath('EVENT_COMPENSATION', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: attrs.width || event.width,\n        containerHeight: attrs.height || event.height,\n        position: {\n          mx: 0.22,\n          my: 0.5\n        }\n      });\n\n      var fill = isThrowing\n        ? getStrokeColor(event, defaultStrokeColor, attrs.stroke)\n        : getFillColor(event, defaultFillColor, attrs.fill);\n\n      return drawPath(parentGfx, pathData, {\n        fill,\n        stroke: getStrokeColor(event, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1\n      });\n    },\n    'bpmn:SignalEventDefinition': function(parentGfx, event, attrs = {}, isThrowing) {\n      var pathData = pathMap.getScaledPath('EVENT_SIGNAL', {\n        xScaleFactor: 0.9,\n        yScaleFactor: 0.9,\n        containerWidth: attrs.width || event.width,\n        containerHeight: attrs.height || event.height,\n        position: {\n          mx: 0.5,\n          my: 0.2\n        }\n      });\n\n      var fill = isThrowing\n        ? getStrokeColor(event, defaultStrokeColor, attrs.stroke)\n        : getFillColor(event, defaultFillColor, attrs.fill);\n\n      return drawPath(parentGfx, pathData, {\n        strokeWidth: 1,\n        fill,\n        stroke: getStrokeColor(event, defaultStrokeColor, attrs.stroke)\n      });\n    },\n    'bpmn:MultipleEventDefinition': function(parentGfx, event, attrs = {}, isThrowing) {\n      var pathData = pathMap.getScaledPath('EVENT_MULTIPLE', {\n        xScaleFactor: 1.1,\n        yScaleFactor: 1.1,\n        containerWidth: attrs.width || event.width,\n        containerHeight: attrs.height || event.height,\n        position: {\n          mx: 0.211,\n          my: 0.36\n        }\n      });\n\n      var fill = isThrowing\n        ? getStrokeColor(event, defaultStrokeColor, attrs.stroke)\n        : getFillColor(event, defaultFillColor, attrs.fill);\n\n      return drawPath(parentGfx, pathData, {\n        fill,\n        stroke: getStrokeColor(event, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1\n      });\n    },\n    'bpmn:ParallelMultipleEventDefinition': function(parentGfx, event, attrs = {}) {\n      var pathData = pathMap.getScaledPath('EVENT_PARALLEL_MULTIPLE', {\n        xScaleFactor: 1.2,\n        yScaleFactor: 1.2,\n        containerWidth: attrs.width || event.width,\n        containerHeight: attrs.height || event.height,\n        position: {\n          mx: 0.458,\n          my: 0.194\n        }\n      });\n\n      return drawPath(parentGfx, pathData, {\n        fill: getFillColor(event, defaultFillColor, attrs.fill),\n        stroke: getStrokeColor(event, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1\n      });\n    },\n    'bpmn:TerminateEventDefinition': function(parentGfx, element, attrs = {}) {\n      var circle = drawCircle(parentGfx, element.width, element.height, 8, {\n        fill: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 4\n      });\n\n      return circle;\n    }\n  };\n\n  function renderEventIcon(element, parentGfx, attrs = {}, proxyElement) {\n    var semantic = getSemantic(element),\n        isThrowing = isThrowEvent(semantic);\n\n    var nodeElement = proxyElement || element;\n\n    if (semantic.get('eventDefinitions') && semantic.get('eventDefinitions').length > 1) {\n      if (semantic.get('parallelMultiple')) {\n        return eventIconRenderers[ 'bpmn:ParallelMultipleEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);\n      }\n      else {\n        return eventIconRenderers[ 'bpmn:MultipleEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);\n      }\n    }\n\n    if (isTypedEvent(semantic, 'bpmn:MessageEventDefinition')) {\n      return eventIconRenderers[ 'bpmn:MessageEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);\n    }\n\n    if (isTypedEvent(semantic, 'bpmn:TimerEventDefinition')) {\n      return eventIconRenderers[ 'bpmn:TimerEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);\n    }\n\n    if (isTypedEvent(semantic, 'bpmn:ConditionalEventDefinition')) {\n      return eventIconRenderers[ 'bpmn:ConditionalEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);\n    }\n\n    if (isTypedEvent(semantic, 'bpmn:SignalEventDefinition')) {\n      return eventIconRenderers[ 'bpmn:SignalEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);\n    }\n\n    if (isTypedEvent(semantic, 'bpmn:EscalationEventDefinition')) {\n      return eventIconRenderers[ 'bpmn:EscalationEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);\n    }\n\n    if (isTypedEvent(semantic, 'bpmn:LinkEventDefinition')) {\n      return eventIconRenderers[ 'bpmn:LinkEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);\n    }\n\n    if (isTypedEvent(semantic, 'bpmn:ErrorEventDefinition')) {\n      return eventIconRenderers[ 'bpmn:ErrorEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);\n    }\n\n    if (isTypedEvent(semantic, 'bpmn:CancelEventDefinition')) {\n      return eventIconRenderers[ 'bpmn:CancelEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);\n    }\n\n    if (isTypedEvent(semantic, 'bpmn:CompensateEventDefinition')) {\n      return eventIconRenderers[ 'bpmn:CompensateEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);\n    }\n\n    if (isTypedEvent(semantic, 'bpmn:TerminateEventDefinition')) {\n      return eventIconRenderers[ 'bpmn:TerminateEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);\n    }\n\n    return null;\n  }\n\n  var taskMarkerRenderers = {\n    'ParticipantMultiplicityMarker': function(parentGfx, element, attrs = {}) {\n      var width = getWidth(element, attrs),\n          height = getHeight(element, attrs);\n\n      var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: width,\n        containerHeight: height,\n        position: {\n          mx: ((width / 2 - 6) / width),\n          my: (height - 15) / height\n        }\n      });\n\n      drawMarker('participant-multiplicity', parentGfx, markerPath, {\n        strokeWidth: 2,\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)\n      });\n    },\n    'SubProcessMarker': function(parentGfx, element, attrs = {}) {\n      var markerRect = drawRect(parentGfx, 14, 14, 0, {\n        strokeWidth: 1,\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)\n      });\n\n      translate(markerRect, element.width / 2 - 7.5, element.height - 20);\n\n      var markerPath = pathMap.getScaledPath('MARKER_SUB_PROCESS', {\n        xScaleFactor: 1.5,\n        yScaleFactor: 1.5,\n        containerWidth: element.width,\n        containerHeight: element.height,\n        position: {\n          mx: (element.width / 2 - 7.5) / element.width,\n          my: (element.height - 20) / element.height\n        }\n      });\n\n      drawMarker('sub-process', parentGfx, markerPath, {\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)\n      });\n    },\n    'ParallelMarker': function(parentGfx, element, attrs) {\n      var width = getWidth(element, attrs),\n          height = getHeight(element, attrs);\n\n      var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: width,\n        containerHeight: height,\n        position: {\n          mx: ((width / 2 + attrs.parallel) / width),\n          my: (height - 20) / height\n        }\n      });\n\n      drawMarker('parallel', parentGfx, markerPath, {\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)\n      });\n    },\n    'SequentialMarker': function(parentGfx, element, attrs) {\n      var markerPath = pathMap.getScaledPath('MARKER_SEQUENTIAL', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: element.width,\n        containerHeight: element.height,\n        position: {\n          mx: ((element.width / 2 + attrs.seq) / element.width),\n          my: (element.height - 19) / element.height\n        }\n      });\n\n      drawMarker('sequential', parentGfx, markerPath, {\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)\n      });\n    },\n    'CompensationMarker': function(parentGfx, element, attrs) {\n      var markerMath = pathMap.getScaledPath('MARKER_COMPENSATION', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: element.width,\n        containerHeight: element.height,\n        position: {\n          mx: ((element.width / 2 + attrs.compensation) / element.width),\n          my: (element.height - 13) / element.height\n        }\n      });\n\n      drawMarker('compensation', parentGfx, markerMath, {\n        strokeWidth: 1,\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)\n      });\n    },\n    'LoopMarker': function(parentGfx, element, attrs) {\n      var width = getWidth(element, attrs),\n          height = getHeight(element, attrs);\n\n      var markerPath = pathMap.getScaledPath('MARKER_LOOP', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: width,\n        containerHeight: height,\n        position: {\n          mx: ((width / 2 + attrs.loop) / width),\n          my: (height - 7) / height\n        }\n      });\n\n      drawMarker('loop', parentGfx, markerPath, {\n        strokeWidth: 1.5,\n        fill: 'none',\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeMiterlimit: 0.5\n      });\n    },\n    'AdhocMarker': function(parentGfx, element, attrs) {\n      var width = getWidth(element, attrs),\n          height = getHeight(element, attrs);\n\n      var markerPath = pathMap.getScaledPath('MARKER_ADHOC', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: width,\n        containerHeight: height,\n        position: {\n          mx: ((width / 2 + attrs.adhoc) / width),\n          my: (height - 15) / height\n        }\n      });\n\n      drawMarker('adhoc', parentGfx, markerPath, {\n        strokeWidth: 1,\n        fill: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)\n      });\n    }\n  };\n\n  function renderTaskMarker(type, parentGfx, element, attrs) {\n    taskMarkerRenderers[ type ](parentGfx, element, attrs);\n  }\n\n  function renderTaskMarkers(parentGfx, element, taskMarkers = [], attrs = {}) {\n    attrs = {\n      fill: attrs.fill,\n      stroke: attrs.stroke,\n      width: getWidth(element, attrs),\n      height: getHeight(element, attrs)\n    };\n\n    var semantic = getSemantic(element);\n\n    var subprocess = taskMarkers.includes('SubProcessMarker');\n\n    if (subprocess) {\n      attrs = {\n        ...attrs,\n        seq: -21,\n        parallel: -22,\n        compensation: -25,\n        loop: -18,\n        adhoc: 10\n      };\n    } else {\n      attrs = {\n        ...attrs,\n        seq: -5,\n        parallel: -6,\n        compensation: -7,\n        loop: 0,\n        adhoc: -8\n      };\n    }\n\n    if (semantic.get('isForCompensation')) {\n      taskMarkers.push('CompensationMarker');\n    }\n\n    if (is(semantic, 'bpmn:AdHocSubProcess')) {\n      taskMarkers.push('AdhocMarker');\n\n      if (!subprocess) {\n        assign(attrs, { compensation: attrs.compensation - 18 });\n      }\n    }\n\n    var loopCharacteristics = semantic.get('loopCharacteristics'),\n        isSequential = loopCharacteristics && loopCharacteristics.get('isSequential');\n\n    if (loopCharacteristics) {\n\n      assign(attrs, {\n        compensation: attrs.compensation - 18,\n      });\n\n      if (taskMarkers.includes('AdhocMarker')) {\n        assign(attrs, {\n          seq: -23,\n          loop: -18,\n          parallel: -24\n        });\n      }\n\n      if (isSequential === undefined) {\n        taskMarkers.push('LoopMarker');\n      }\n\n      if (isSequential === false) {\n        taskMarkers.push('ParallelMarker');\n      }\n\n      if (isSequential === true) {\n        taskMarkers.push('SequentialMarker');\n      }\n    }\n\n    if (taskMarkers.includes('CompensationMarker') && taskMarkers.length === 1) {\n      assign(attrs, {\n        compensation: -8\n      });\n    }\n\n    forEach(taskMarkers, function(marker) {\n      renderTaskMarker(marker, parentGfx, element, attrs);\n    });\n  }\n\n  function renderLabel(parentGfx, label, attrs = {}) {\n    attrs = assign({\n      size: {\n        width: 100\n      }\n    }, attrs);\n\n    var text = textRenderer.createText(label || '', attrs);\n\n    svgClasses(text).add('djs-label');\n\n    svgAppend(parentGfx, text);\n\n    return text;\n  }\n\n  function renderEmbeddedLabel(parentGfx, element, align, attrs = {}) {\n    var semantic = getSemantic(element);\n\n    var box = getBounds({\n      x: element.x,\n      y: element.y,\n      width: element.width,\n      height: element.height\n    }, attrs);\n\n    return renderLabel(parentGfx, semantic.name, {\n      align,\n      box,\n      padding: 7,\n      style: {\n        fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor, attrs.stroke)\n      }\n    });\n  }\n\n  function renderExternalLabel(parentGfx, element, attrs = {}) {\n    var box = {\n      width: 90,\n      height: 30,\n      x: element.width / 2 + element.x,\n      y: element.height / 2 + element.y\n    };\n\n    return renderLabel(parentGfx, getLabel(element), {\n      box: box,\n      fitBox: true,\n      style: assign(\n        {},\n        textRenderer.getExternalStyle(),\n        {\n          fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor, attrs.stroke)\n        }\n      )\n    });\n  }\n\n  function renderLaneLabel(parentGfx, text, element, attrs = {}) {\n    var isHorizontalLane = isHorizontal(element);\n\n    var textBox = renderLabel(parentGfx, text, {\n      box: {\n        height: 30,\n        width: isHorizontalLane ? getHeight(element, attrs) : getWidth(element, attrs),\n      },\n      align: 'center-middle',\n      style: {\n        fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor, attrs.stroke)\n      }\n    });\n\n    if (isHorizontalLane) {\n      var top = -1 * getHeight(element, attrs);\n      transform(textBox, 0, -top, 270);\n    }\n  }\n\n  function renderActivity(parentGfx, element, attrs = {}) {\n    var {\n      width,\n      height\n    } = getBounds(element, attrs);\n\n    return drawRect(parentGfx, width, height, TASK_BORDER_RADIUS, {\n      ...attrs,\n      fill: getFillColor(element, defaultFillColor, attrs.fill),\n      fillOpacity: DEFAULT_OPACITY,\n      stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)\n    });\n  }\n\n  function renderAssociation(parentGfx, element, attrs = {}) {\n    var semantic = getSemantic(element);\n\n    var fill = getFillColor(element, defaultFillColor, attrs.fill),\n        stroke = getStrokeColor(element, defaultStrokeColor, attrs.stroke);\n\n    if (semantic.get('associationDirection') === 'One' ||\n        semantic.get('associationDirection') === 'Both') {\n      attrs.markerEnd = marker(parentGfx, 'association-end', fill, stroke);\n    }\n\n    if (semantic.get('associationDirection') === 'Both') {\n      attrs.markerStart = marker(parentGfx, 'association-start', fill, stroke);\n    }\n\n    attrs = pickAttrs(attrs, [\n      'markerStart',\n      'markerEnd'\n    ]);\n\n    return drawConnectionSegments(parentGfx, element.waypoints, {\n      ...attrs,\n      stroke,\n      strokeDasharray: '0, 5'\n    });\n  }\n\n  function renderDataObject(parentGfx, element, attrs = {}) {\n    var fill = getFillColor(element, defaultFillColor, attrs.fill),\n        stroke = getStrokeColor(element, defaultStrokeColor, attrs.stroke);\n\n    var pathData = pathMap.getScaledPath('DATA_OBJECT_PATH', {\n      xScaleFactor: 1,\n      yScaleFactor: 1,\n      containerWidth: element.width,\n      containerHeight: element.height,\n      position: {\n        mx: 0.474,\n        my: 0.296\n      }\n    });\n\n    var dataObject = drawPath(parentGfx, pathData, {\n      fill,\n      fillOpacity: DEFAULT_OPACITY,\n      stroke\n    });\n\n    var semantic = getSemantic(element);\n\n    if (isCollection(semantic)) {\n      var collectionPathData = pathMap.getScaledPath('DATA_OBJECT_COLLECTION_PATH', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: element.width,\n        containerHeight: element.height,\n        position: {\n          mx: 0.33,\n          my: (element.height - 18) / element.height\n        }\n      });\n\n      drawPath(parentGfx, collectionPathData, {\n        strokeWidth: 2,\n        fill,\n        stroke\n      });\n    }\n\n    return dataObject;\n  }\n\n  function renderEvent(parentGfx, element, attrs = {}) {\n    return drawCircle(parentGfx, element.width, element.height, {\n      fillOpacity: DEFAULT_OPACITY,\n      ...attrs,\n      fill: getFillColor(element, defaultFillColor, attrs.fill),\n      stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)\n    });\n  }\n\n  function renderGateway(parentGfx, element, attrs = {}) {\n    return drawDiamond(parentGfx, element.width, element.height, {\n      fill: getFillColor(element, defaultFillColor, attrs.fill),\n      fillOpacity: DEFAULT_OPACITY,\n      stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)\n    });\n  }\n\n  function renderLane(parentGfx, element, attrs = {}) {\n    var lane = drawRect(parentGfx, getWidth(element, attrs), getHeight(element, attrs), 0, {\n      fill: getFillColor(element, defaultFillColor, attrs.fill),\n      fillOpacity: attrs.fillOpacity || DEFAULT_OPACITY,\n      stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n      strokeWidth: 1.5\n    });\n\n    var semantic = getSemantic(element);\n\n    if (is(semantic, 'bpmn:Lane')) {\n      var text = semantic.get('name');\n\n      renderLaneLabel(parentGfx, text, element, attrs);\n    }\n\n    return lane;\n  }\n\n  function renderSubProcess(parentGfx, element, attrs = {}) {\n    var activity = renderActivity(parentGfx, element, attrs);\n\n    var expanded = isExpanded(element);\n\n    if (isEventSubProcess(element)) {\n      svgAttr(activity, {\n        strokeDasharray: '0, 5.5',\n        strokeWidth: 2.5\n      });\n\n      if (!expanded) {\n        var flowElements = getSemantic(element).flowElements || [];\n        var startEvents = flowElements.filter(e => is(e, 'bpmn:StartEvent'));\n\n        if (startEvents.length === 1) {\n          renderEventSubProcessIcon(startEvents[0], parentGfx, attrs, element);\n        }\n      }\n    }\n\n    renderEmbeddedLabel(parentGfx, element, expanded ? 'center-top' : 'center-middle', attrs);\n\n    if (expanded) {\n      renderTaskMarkers(parentGfx, element, undefined, attrs);\n    } else {\n      renderTaskMarkers(parentGfx, element, [ 'SubProcessMarker' ], attrs);\n    }\n\n    return activity;\n  }\n\n  function renderEventSubProcessIcon(startEvent, parentGfx, attrs, proxyElement) {\n    var iconSize = 22;\n\n    // match the colors of the enclosing subprocess\n    var proxyAttrs = {\n      fill: getFillColor(proxyElement, defaultFillColor, attrs.fill),\n      stroke: getStrokeColor(proxyElement, defaultStrokeColor, attrs.stroke),\n      width: iconSize,\n      height: iconSize\n    };\n\n    var interrupting = getSemantic(startEvent).isInterrupting;\n    var strokeDasharray = interrupting ? 0 : 3;\n\n    // better visibility for non-interrupting events\n    var strokeWidth = interrupting ? 1 : 1.2;\n\n    // make the icon look larger by drawing a smaller circle\n    var circleSize = 20;\n    var shift = (iconSize - circleSize) / 2;\n    var transform = 'translate(' + shift + ',' + shift + ')';\n\n    drawCircle(parentGfx, circleSize, circleSize, {\n      fill: proxyAttrs.fill,\n      stroke: proxyAttrs.stroke,\n      strokeWidth,\n      strokeDasharray,\n      transform\n    });\n\n    renderEventIcon(startEvent, parentGfx, proxyAttrs, proxyElement);\n  }\n\n  function renderTask(parentGfx, element, attrs = {}) {\n    var activity = renderActivity(parentGfx, element, attrs);\n\n    renderEmbeddedLabel(parentGfx, element, 'center-middle', attrs);\n\n    renderTaskMarkers(parentGfx, element, undefined, attrs);\n\n    return activity;\n  }\n\n  var handlers = this.handlers = {\n    'bpmn:AdHocSubProcess': function(parentGfx, element, attrs = {}) {\n      if (isExpanded(element)) {\n        attrs = pickAttrs(attrs, [\n          'fill',\n          'stroke',\n          'width',\n          'height'\n        ]);\n      } else {\n        attrs = pickAttrs(attrs, [\n          'fill',\n          'stroke'\n        ]);\n      }\n\n      return renderSubProcess(parentGfx, element, attrs);\n    },\n    'bpmn:Association': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      return renderAssociation(parentGfx, element, attrs);\n    },\n    'bpmn:BoundaryEvent': function(parentGfx, element, attrs = {}) {\n      var { renderIcon = true } = attrs;\n\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var semantic = getSemantic(element),\n          cancelActivity = semantic.get('cancelActivity');\n\n      attrs = {\n        strokeWidth: 1.5,\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        fillOpacity: FULL_OPACITY,\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)\n      };\n\n      if (!cancelActivity) {\n        attrs.strokeDasharray = '6';\n      }\n\n      var event = renderEvent(parentGfx, element, attrs);\n\n      drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, {\n        ...attrs,\n        fill: 'none'\n      });\n\n      if (renderIcon) {\n        renderEventIcon(element, parentGfx, attrs);\n      }\n\n      return event;\n    },\n    'bpmn:BusinessRuleTask': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var task = renderTask(parentGfx, element, attrs);\n\n      var headerData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_MAIN', {\n        abspos: {\n          x: 8,\n          y: 8\n        }\n      });\n\n      var businessPath = drawPath(parentGfx, headerData);\n\n      svgAttr(businessPath, {\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1\n      });\n\n      var headerPathData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_HEADER', {\n        abspos: {\n          x: 8,\n          y: 8\n        }\n      });\n\n      var businessHeaderPath = drawPath(parentGfx, headerPathData);\n\n      svgAttr(businessHeaderPath, {\n        fill: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1\n      });\n\n      return task;\n    },\n    'bpmn:CallActivity': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      return renderSubProcess(parentGfx, element, {\n        strokeWidth: 5,\n        ...attrs\n      });\n    },\n    'bpmn:ComplexGateway': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var gateway = renderGateway(parentGfx, element, attrs);\n\n      var pathData = pathMap.getScaledPath('GATEWAY_COMPLEX', {\n        xScaleFactor: 0.5,\n        yScaleFactor:0.5,\n        containerWidth: element.width,\n        containerHeight: element.height,\n        position: {\n          mx: 0.46,\n          my: 0.26\n        }\n      });\n\n      drawPath(parentGfx, pathData, {\n        fill: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1\n      });\n\n      return gateway;\n    },\n    'bpmn:DataInput': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var arrowPathData = pathMap.getRawPath('DATA_ARROW');\n\n      var dataObject = renderDataObject(parentGfx, element, attrs);\n\n      drawPath(parentGfx, arrowPathData, {\n        fill: 'none',\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1\n      });\n\n      return dataObject;\n    },\n    'bpmn:DataInputAssociation': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      return renderAssociation(parentGfx, element, {\n        ...attrs,\n        markerEnd: marker(parentGfx, 'association-end', getFillColor(element, defaultFillColor, attrs.fill), getStrokeColor(element, defaultStrokeColor, attrs.stroke))\n      });\n    },\n    'bpmn:DataObject': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      return renderDataObject(parentGfx, element, attrs);\n    },\n    'bpmn:DataObjectReference': as('bpmn:DataObject'),\n    'bpmn:DataOutput': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var arrowPathData = pathMap.getRawPath('DATA_ARROW');\n\n      var dataObject = renderDataObject(parentGfx, element, attrs);\n\n      drawPath(parentGfx, arrowPathData, {\n        strokeWidth: 1,\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)\n      });\n\n      return dataObject;\n    },\n    'bpmn:DataOutputAssociation': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      return renderAssociation(parentGfx, element, {\n        ...attrs,\n        markerEnd: marker(parentGfx, 'association-end', getFillColor(element, defaultFillColor, attrs.fill), getStrokeColor(element, defaultStrokeColor, attrs.stroke))\n      });\n    },\n    'bpmn:DataStoreReference': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var dataStorePath = pathMap.getScaledPath('DATA_STORE', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: element.width,\n        containerHeight: element.height,\n        position: {\n          mx: 0,\n          my: 0.133\n        }\n      });\n\n      return drawPath(parentGfx, dataStorePath, {\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        fillOpacity: DEFAULT_OPACITY,\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 2\n      });\n    },\n    'bpmn:EndEvent': function(parentGfx, element, attrs = {}) {\n      var { renderIcon = true } = attrs;\n\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var event = renderEvent(parentGfx, element, {\n        ...attrs,\n        strokeWidth: 4\n      });\n\n      if (renderIcon) {\n        renderEventIcon(element, parentGfx, attrs);\n      }\n\n      return event;\n    },\n    'bpmn:EventBasedGateway': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var semantic = getSemantic(element);\n\n      var diamond = renderGateway(parentGfx, element, attrs);\n\n      drawCircle(parentGfx, element.width, element.height, element.height * 0.20, {\n        fill: getFillColor(element, 'none', attrs.fill),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1\n      });\n\n      var type = semantic.get('eventGatewayType'),\n          instantiate = !!semantic.get('instantiate');\n\n      function drawEvent() {\n\n        var pathData = pathMap.getScaledPath('GATEWAY_EVENT_BASED', {\n          xScaleFactor: 0.18,\n          yScaleFactor: 0.18,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.36,\n            my: 0.44\n          }\n        });\n\n        drawPath(parentGfx, pathData, {\n          fill: 'none',\n          stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n          strokeWidth: 2\n        });\n      }\n\n      if (type === 'Parallel') {\n        var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {\n          xScaleFactor: 0.4,\n          yScaleFactor: 0.4,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.474,\n            my: 0.296\n          }\n        });\n\n        drawPath(parentGfx, pathData, {\n          fill: 'none',\n          stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n          strokeWidth: 1\n        });\n      } else if (type === 'Exclusive') {\n        if (!instantiate) {\n          drawCircle(parentGfx, element.width, element.height, element.height * 0.26, {\n            fill: 'none',\n            stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n            strokeWidth: 1\n          });\n        }\n\n        drawEvent();\n      }\n\n\n      return diamond;\n    },\n    'bpmn:ExclusiveGateway': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var gateway = renderGateway(parentGfx, element, attrs);\n\n      var pathData = pathMap.getScaledPath('GATEWAY_EXCLUSIVE', {\n        xScaleFactor: 0.4,\n        yScaleFactor: 0.4,\n        containerWidth: element.width,\n        containerHeight: element.height,\n        position: {\n          mx: 0.32,\n          my: 0.3\n        }\n      });\n\n      var di = getDi(element);\n\n      if (di.get('isMarkerVisible')) {\n        drawPath(parentGfx, pathData, {\n          fill: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n          stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n          strokeWidth: 1\n        });\n      }\n\n      return gateway;\n    },\n    'bpmn:Gateway': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      return renderGateway(parentGfx, element, attrs);\n    },\n    'bpmn:Group': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke',\n        'width',\n        'height'\n      ]);\n\n      return drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, {\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1.5,\n        strokeDasharray: '10, 6, 0, 6',\n        fill: 'none',\n        pointerEvents: 'none',\n        width: getWidth(element, attrs),\n        height: getHeight(element, attrs)\n      });\n    },\n    'bpmn:InclusiveGateway': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var gateway = renderGateway(parentGfx, element, attrs);\n\n      drawCircle(parentGfx, element.width, element.height, element.height * 0.24, {\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 2.5\n      });\n\n      return gateway;\n    },\n    'bpmn:IntermediateEvent': function(parentGfx, element, attrs = {}) {\n      var { renderIcon = true } = attrs;\n\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var outer = renderEvent(parentGfx, element, {\n        ...attrs,\n        strokeWidth: 1.5\n      });\n\n      drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, {\n        fill: 'none',\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1.5\n      });\n\n      if (renderIcon) {\n        renderEventIcon(element, parentGfx, attrs);\n      }\n\n      return outer;\n    },\n    'bpmn:IntermediateCatchEvent': as('bpmn:IntermediateEvent'),\n    'bpmn:IntermediateThrowEvent': as('bpmn:IntermediateEvent'),\n    'bpmn:Lane': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke',\n        'width',\n        'height'\n      ]);\n\n      return renderLane(parentGfx, element, {\n        ...attrs,\n        fillOpacity: LOW_OPACITY\n      });\n    },\n    'bpmn:ManualTask': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var task = renderTask(parentGfx, element, attrs);\n\n      var pathData = pathMap.getScaledPath('TASK_TYPE_MANUAL', {\n        abspos: {\n          x: 17,\n          y: 15\n        }\n      });\n\n      drawPath(parentGfx, pathData, {\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 0.5\n      });\n\n      return task;\n    },\n    'bpmn:MessageFlow': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var semantic = getSemantic(element),\n          di = getDi(element);\n\n      var fill = getFillColor(element, defaultFillColor, attrs.fill),\n          stroke = getStrokeColor(element, defaultStrokeColor, attrs.stroke);\n\n      var path = drawConnectionSegments(parentGfx, element.waypoints, {\n        markerEnd: marker(parentGfx, 'messageflow-end', fill, stroke),\n        markerStart: marker(parentGfx, 'messageflow-start', fill, stroke),\n        stroke,\n        strokeDasharray: '10, 11',\n        strokeWidth: 1.5\n      });\n\n      if (semantic.get('messageRef')) {\n        var midPoint = path.getPointAtLength(path.getTotalLength() / 2);\n\n        var markerPathData = pathMap.getScaledPath('MESSAGE_FLOW_MARKER', {\n          abspos: {\n            x: midPoint.x,\n            y: midPoint.y\n          }\n        });\n\n        var messageAttrs = {\n          strokeWidth: 1\n        };\n\n        if (di.get('messageVisibleKind') === 'initiating') {\n          messageAttrs.fill = fill;\n          messageAttrs.stroke = stroke;\n        } else {\n          messageAttrs.fill = stroke;\n          messageAttrs.stroke = fill;\n        }\n\n        var message = drawPath(parentGfx, markerPathData, messageAttrs);\n\n        var messageRef = semantic.get('messageRef'),\n            name = messageRef.get('name');\n\n        var label = renderLabel(parentGfx, name, {\n          align: 'center-top',\n          fitBox: true,\n          style: {\n            fill: stroke\n          }\n        });\n\n        var messageBounds = message.getBBox(),\n            labelBounds = label.getBBox();\n\n        var translateX = midPoint.x - labelBounds.width / 2,\n            translateY = midPoint.y + messageBounds.height / 2 + ELEMENT_LABEL_DISTANCE;\n\n        transform(label, translateX, translateY, 0);\n      }\n\n      return path;\n    },\n    'bpmn:ParallelGateway': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var diamond = renderGateway(parentGfx, element, attrs);\n\n      var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {\n        xScaleFactor: 0.6,\n        yScaleFactor: 0.6,\n        containerWidth: element.width,\n        containerHeight: element.height,\n        position: {\n          mx: 0.46,\n          my: 0.2\n        }\n      });\n\n      drawPath(parentGfx, pathData, {\n        fill: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1\n      });\n\n      return diamond;\n    },\n    'bpmn:Participant': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke',\n        'width',\n        'height'\n      ]);\n\n      var participant = renderLane(parentGfx, element, attrs);\n\n      var expandedParticipant = isExpanded(element);\n      var horizontalParticipant = isHorizontal(element);\n\n      var semantic = getSemantic(element),\n          name = semantic.get('name');\n\n      if (expandedParticipant) {\n        var waypoints = horizontalParticipant ? [\n          {\n            x: 30,\n            y: 0\n          },\n          {\n            x: 30,\n            y: getHeight(element, attrs)\n          }\n        ] : [\n          {\n            x: 0,\n            y: 30\n          },\n          {\n            x: getWidth(element, attrs),\n            y: 30\n          }\n        ];\n\n        drawLine(parentGfx, waypoints, {\n          stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n          strokeWidth: PARTICIPANT_STROKE_WIDTH\n        });\n\n        renderLaneLabel(parentGfx, name, element, attrs);\n      } else {\n        var bounds = getBounds(element, attrs);\n\n        if (!horizontalParticipant) {\n          bounds.height = getWidth(element, attrs);\n          bounds.width = getHeight(element, attrs);\n        }\n\n        var textBox = renderLabel(parentGfx, name, {\n          box: bounds,\n          align: 'center-middle',\n          style: {\n            fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor, attrs.stroke)\n          }\n        });\n\n        if (!horizontalParticipant) {\n          var top = -1 * getHeight(element, attrs);\n          transform(textBox, 0, -top, 270);\n        }\n      }\n\n      if (semantic.get('participantMultiplicity')) {\n        renderTaskMarker('ParticipantMultiplicityMarker', parentGfx, element, attrs);\n      }\n\n      return participant;\n    },\n    'bpmn:ReceiveTask' : function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var semantic = getSemantic(element);\n\n      var task = renderTask(parentGfx, element, attrs);\n\n      var pathData;\n\n      if (semantic.get('instantiate')) {\n        drawCircle(parentGfx, 28, 28, 20 * 0.22, {\n          fill: getFillColor(element, defaultFillColor, attrs.fill),\n          stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n          strokeWidth: 1\n        });\n\n        pathData = pathMap.getScaledPath('TASK_TYPE_INSTANTIATING_SEND', {\n          abspos: {\n            x: 7.77,\n            y: 9.52\n          }\n        });\n      } else {\n        pathData = pathMap.getScaledPath('TASK_TYPE_SEND', {\n          xScaleFactor: 0.9,\n          yScaleFactor: 0.9,\n          containerWidth: 21,\n          containerHeight: 14,\n          position: {\n            mx: 0.3,\n            my: 0.4\n          }\n        });\n      }\n\n      drawPath(parentGfx, pathData, {\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1\n      });\n\n      return task;\n    },\n    'bpmn:ScriptTask': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var task = renderTask(parentGfx, element, attrs);\n\n      var pathData = pathMap.getScaledPath('TASK_TYPE_SCRIPT', {\n        abspos: {\n          x: 15,\n          y: 20\n        }\n      });\n\n      drawPath(parentGfx, pathData, {\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1\n      });\n\n      return task;\n    },\n    'bpmn:SendTask': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var task = renderTask(parentGfx, element, attrs);\n\n      var pathData = pathMap.getScaledPath('TASK_TYPE_SEND', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: 21,\n        containerHeight: 14,\n        position: {\n          mx: 0.285,\n          my: 0.357\n        }\n      });\n\n      drawPath(parentGfx, pathData, {\n        fill: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        stroke: getFillColor(element, defaultFillColor, attrs.fill),\n        strokeWidth: 1\n      });\n\n      return task;\n    },\n    'bpmn:SequenceFlow': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var fill = getFillColor(element, defaultFillColor, attrs.fill),\n          stroke = getStrokeColor(element, defaultStrokeColor, attrs.stroke);\n\n      var connection = drawConnectionSegments(parentGfx, element.waypoints, {\n        markerEnd: marker(parentGfx, 'sequenceflow-end', fill, stroke),\n        stroke\n      });\n\n      var semantic = getSemantic(element);\n\n      var { source } = element;\n\n      if (source) {\n        var sourceSemantic = getSemantic(source);\n\n        // conditional flow marker\n        if (semantic.get('conditionExpression') && is(sourceSemantic, 'bpmn:Activity')) {\n          svgAttr(connection, {\n            markerStart: marker(parentGfx, 'conditional-flow-marker', fill, stroke)\n          });\n        }\n\n        // default marker\n        if (sourceSemantic.get('default') && (is(sourceSemantic, 'bpmn:Gateway') || is(sourceSemantic, 'bpmn:Activity')) &&\n            sourceSemantic.get('default') === semantic) {\n          svgAttr(connection, {\n            markerStart: marker(parentGfx, 'conditional-default-flow-marker', fill, stroke)\n          });\n        }\n      }\n\n      return connection;\n    },\n    'bpmn:ServiceTask': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var task = renderTask(parentGfx, element, attrs);\n\n      drawCircle(parentGfx, 10, 10, {\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        stroke: 'none',\n        transform: 'translate(6, 6)'\n      });\n\n      var pathDataService1 = pathMap.getScaledPath('TASK_TYPE_SERVICE', {\n        abspos: {\n          x: 12,\n          y: 18\n        }\n      });\n\n      drawPath(parentGfx, pathDataService1, {\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1\n      });\n\n      drawCircle(parentGfx, 10, 10, {\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        stroke: 'none',\n        transform: 'translate(11, 10)'\n      });\n\n      var pathDataService2 = pathMap.getScaledPath('TASK_TYPE_SERVICE', {\n        abspos: {\n          x: 17,\n          y: 22\n        }\n      });\n\n      drawPath(parentGfx, pathDataService2, {\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1\n      });\n\n      return task;\n    },\n    'bpmn:StartEvent': function(parentGfx, element, attrs = {}) {\n      var { renderIcon = true } = attrs;\n\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var semantic = getSemantic(element);\n\n      if (!semantic.get('isInterrupting')) {\n        attrs = {\n          ...attrs,\n          strokeDasharray: '6'\n        };\n      }\n\n      var event = renderEvent(parentGfx, element, attrs);\n\n      if (renderIcon) {\n        renderEventIcon(element, parentGfx, attrs);\n      }\n\n      return event;\n    },\n    'bpmn:SubProcess': function(parentGfx, element, attrs = {}) {\n      if (isExpanded(element)) {\n        attrs = pickAttrs(attrs, [\n          'fill',\n          'stroke',\n          'width',\n          'height'\n        ]);\n      } else {\n        attrs = pickAttrs(attrs, [\n          'fill',\n          'stroke'\n        ]);\n      }\n\n      return renderSubProcess(parentGfx, element, attrs);\n    },\n    'bpmn:Task': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      return renderTask(parentGfx, element, attrs);\n    },\n    'bpmn:TextAnnotation': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke',\n        'width',\n        'height'\n      ]);\n\n      var {\n        width,\n        height\n      } = getBounds(element, attrs);\n\n      var textElement = drawRect(parentGfx, width, height, 0, 0, {\n        fill: 'none',\n        stroke: 'none'\n      });\n\n      var textPathData = pathMap.getScaledPath('TEXT_ANNOTATION', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: width,\n        containerHeight: height,\n        position: {\n          mx: 0.0,\n          my: 0.0\n        }\n      });\n\n      drawPath(parentGfx, textPathData, {\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)\n      });\n\n      var semantic = getSemantic(element),\n          text = semantic.get('text') || '';\n\n      renderLabel(parentGfx, text, {\n        align: 'left-top',\n        box: getBounds(element, attrs),\n        padding: 7,\n        style: {\n          fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor, attrs.stroke)\n        }\n      });\n\n      return textElement;\n    },\n    'bpmn:Transaction': function(parentGfx, element, attrs = {}) {\n      if (isExpanded(element)) {\n        attrs = pickAttrs(attrs, [\n          'fill',\n          'stroke',\n          'width',\n          'height'\n        ]);\n      } else {\n        attrs = pickAttrs(attrs, [\n          'fill',\n          'stroke'\n        ]);\n      }\n\n      var outer = renderSubProcess(parentGfx, element, {\n        strokeWidth: 1.5,\n        ...attrs\n      });\n\n      var innerAttrs = styles.style([ 'no-fill', 'no-events' ], {\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 1.5\n      });\n\n      var expanded = isExpanded(element);\n\n      if (!expanded) {\n        attrs = {};\n      }\n\n      drawRect(\n        parentGfx,\n        getWidth(element, attrs),\n        getHeight(element, attrs),\n        TASK_BORDER_RADIUS - INNER_OUTER_DIST,\n        INNER_OUTER_DIST,\n        innerAttrs\n      );\n\n      return outer;\n    },\n    'bpmn:UserTask': function(parentGfx, element, attrs = {}) {\n      attrs = pickAttrs(attrs, [\n        'fill',\n        'stroke'\n      ]);\n\n      var task = renderTask(parentGfx, element, attrs);\n\n      var x = 15;\n      var y = 12;\n\n      var pathDataUser1 = pathMap.getScaledPath('TASK_TYPE_USER_1', {\n        abspos: {\n          x: x,\n          y: y\n        }\n      });\n\n      drawPath(parentGfx, pathDataUser1, {\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 0.5\n      });\n\n      var pathDataUser2 = pathMap.getScaledPath('TASK_TYPE_USER_2', {\n        abspos: {\n          x: x,\n          y: y\n        }\n      });\n\n      drawPath(parentGfx, pathDataUser2, {\n        fill: getFillColor(element, defaultFillColor, attrs.fill),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 0.5\n      });\n\n      var pathDataUser3 = pathMap.getScaledPath('TASK_TYPE_USER_3', {\n        abspos: {\n          x: x,\n          y: y\n        }\n      });\n\n      drawPath(parentGfx, pathDataUser3, {\n        fill: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),\n        strokeWidth: 0.5\n      });\n\n      return task;\n    },\n    'label': function(parentGfx, element, attrs = {}) {\n      return renderExternalLabel(parentGfx, element, attrs);\n    }\n  };\n\n  // extension API, use at your own risk\n  this._drawPath = drawPath;\n\n  this._renderer = renderer;\n}\n\n\ninherits(BpmnRenderer, BaseRenderer);\n\nBpmnRenderer.$inject = [\n  'config.bpmnRenderer',\n  'eventBus',\n  'styles',\n  'pathMap',\n  'canvas',\n  'textRenderer'\n];\n\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nBpmnRenderer.prototype.canRender = function(element) {\n  return is(element, 'bpmn:BaseElement');\n};\n\n/**\n * Draw shape into parentGfx.\n *\n * @param {SVGElement} parentGfx\n * @param {Shape} shape\n * @param {Attrs} [attrs]\n *\n * @return {SVGElement} mainGfx\n */\nBpmnRenderer.prototype.drawShape = function(parentGfx, shape, attrs = {}) {\n  var { type } = shape;\n\n  var handler = this._renderer(type);\n\n  return handler(parentGfx, shape, attrs);\n};\n\n/**\n * Draw connection into parentGfx.\n *\n * @param {SVGElement} parentGfx\n * @param {Connection} connection\n * @param {Attrs} [attrs]\n *\n * @return {SVGElement} mainGfx\n */\nBpmnRenderer.prototype.drawConnection = function(parentGfx, connection, attrs = {}) {\n  var { type } = connection;\n\n  var handler = this._renderer(type);\n\n  return handler(parentGfx, connection, attrs);\n};\n\n/**\n * Get shape path.\n *\n * @param {Shape} shape\n *\n * @return {string} path\n */\nBpmnRenderer.prototype.getShapePath = function(shape) {\n\n  if (isLabel(shape)) {\n    return getRoundRectPath(shape, EXTERNAL_LABEL_BORDER_RADIUS);\n  }\n\n  if (is(shape, 'bpmn:Event')) {\n    return getCirclePath(shape);\n  }\n\n  if (is(shape, 'bpmn:Activity')) {\n    return getRoundRectPath(shape, TASK_BORDER_RADIUS);\n  }\n\n  if (is(shape, 'bpmn:Gateway')) {\n    return getDiamondPath(shape);\n  }\n\n  return getRectPath(shape);\n};\n\n/**\n * Pick attributes if they exist.\n *\n * @param {Object} attrs\n * @param {string[]} keys\n *\n * @returns {Object}\n */\nfunction pickAttrs(attrs, keys = []) {\n  return keys.reduce((pickedAttrs, key) => {\n    if (attrs[ key ]) {\n      pickedAttrs[ key ] = attrs[ key ];\n    }\n\n    return pickedAttrs;\n  }, {});\n}"
  },
  {
    "path": "lib/draw/PathMap.js",
    "content": "/**\n * Map containing SVG paths needed by BpmnRenderer\n */\nexport default function PathMap() {\n\n  /**\n   * Contains a map of path elements\n   *\n   * <h1>Path definition</h1>\n   * A parameterized path is defined like this:\n   * <pre>\n   * 'GATEWAY_PARALLEL': {\n   *   d: 'm {mx},{my} {e.x0},0 0,{e.x1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +\n          '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',\n   *   height: 17.5,\n   *   width:  17.5,\n   *   heightElements: [2.5, 7.5],\n   *   widthElements: [2.5, 7.5]\n   * }\n   * </pre>\n   * <p>It's important to specify a correct <b>height and width</b> for the path as the scaling\n   * is based on the ratio between the specified height and width in this object and the\n   * height and width that is set as scale target (Note x,y coordinates will be scaled with\n   * individual ratios).</p>\n   * <p>The '<b>heightElements</b>' and '<b>widthElements</b>' array must contain the values that will be scaled.\n   * The scaling is based on the computed ratios.\n   * Coordinates on the y axis should be in the <b>heightElement</b>'s array, they will be scaled using\n   * the computed ratio coefficient.\n   * In the parameterized path the scaled values can be accessed through the 'e' object in {} brackets.\n   *   <ul>\n   *    <li>The values for the y axis can be accessed in the path string using {e.y0}, {e.y1}, ....</li>\n   *    <li>The values for the x axis can be accessed in the path string using {e.x0}, {e.x1}, ....</li>\n   *   </ul>\n   *   The numbers x0, x1 respectively y0, y1, ... map to the corresponding array index.\n   * </p>\n   */\n  this.pathMap = {\n    'EVENT_MESSAGE': {\n      d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}',\n      height: 36,\n      width:  36,\n      heightElements: [ 6, 14 ],\n      widthElements: [ 10.5, 21 ]\n    },\n    'EVENT_SIGNAL': {\n      d: 'M {mx},{my} l {e.x0},{e.y0} l -{e.x1},0 Z',\n      height: 36,\n      width: 36,\n      heightElements: [ 18 ],\n      widthElements: [ 10, 20 ]\n    },\n    'EVENT_ESCALATION': {\n      d: 'M {mx},{my} l {e.x0},{e.y0} l -{e.x0},-{e.y1} l -{e.x0},{e.y1} Z',\n      height: 36,\n      width: 36,\n      heightElements: [ 20, 7 ],\n      widthElements: [ 8 ]\n    },\n    'EVENT_CONDITIONAL': {\n      d: 'M {e.x0},{e.y0} l {e.x1},0 l 0,{e.y2} l -{e.x1},0 Z ' +\n         'M {e.x2},{e.y3} l {e.x0},0 ' +\n         'M {e.x2},{e.y4} l {e.x0},0 ' +\n         'M {e.x2},{e.y5} l {e.x0},0 ' +\n         'M {e.x2},{e.y6} l {e.x0},0 ' +\n         'M {e.x2},{e.y7} l {e.x0},0 ' +\n         'M {e.x2},{e.y8} l {e.x0},0 ',\n      height: 36,\n      width:  36,\n      heightElements: [ 8.5, 14.5, 18, 11.5, 14.5, 17.5, 20.5, 23.5, 26.5 ],\n      widthElements:  [ 10.5, 14.5, 12.5 ]\n    },\n    'EVENT_LINK': {\n      d: 'm {mx},{my} 0,{e.y0} -{e.x1},0 0,{e.y1} {e.x1},0 0,{e.y0} {e.x0},-{e.y2} -{e.x0},-{e.y2} z',\n      height: 36,\n      width: 36,\n      heightElements: [ 4.4375, 6.75, 7.8125 ],\n      widthElements: [ 9.84375, 13.5 ]\n    },\n    'EVENT_ERROR': {\n      d: 'm {mx},{my} {e.x0},-{e.y0} {e.x1},-{e.y1} {e.x2},{e.y2} {e.x3},-{e.y3} -{e.x4},{e.y4} -{e.x5},-{e.y5} z',\n      height: 36,\n      width: 36,\n      heightElements: [ 0.023, 8.737, 8.151, 16.564, 10.591, 8.714 ],\n      widthElements: [ 0.085, 6.672, 6.97, 4.273, 5.337, 6.636 ]\n    },\n    'EVENT_CANCEL_45': {\n      d: 'm {mx},{my} -{e.x1},0 0,{e.x0} {e.x1},0 0,{e.y1} {e.x0},0 ' +\n        '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z',\n      height: 36,\n      width: 36,\n      heightElements: [ 4.75, 8.5 ],\n      widthElements: [ 4.75, 8.5 ]\n    },\n    'EVENT_COMPENSATION': {\n      d: 'm {mx},{my} {e.x0},-{e.y0} 0,{e.y1} z m {e.x1},-{e.y2} {e.x2},-{e.y3} 0,{e.y1} -{e.x2},-{e.y3} z',\n      height: 36,\n      width: 36,\n      heightElements: [ 6.5, 13, 0.4, 6.1 ],\n      widthElements: [ 9, 9.3, 8.7 ]\n    },\n    'EVENT_TIMER_WH': {\n      d: 'M {mx},{my} l {e.x0},-{e.y0} m -{e.x0},{e.y0} l {e.x1},{e.y1} ',\n      height: 36,\n      width:  36,\n      heightElements: [ 10, 2 ],\n      widthElements: [ 3, 7 ]\n    },\n    'EVENT_TIMER_LINE': {\n      d:  'M {mx},{my} ' +\n          'm {e.x0},{e.y0} l -{e.x1},{e.y1} ',\n      height: 36,\n      width:  36,\n      heightElements: [ 10, 3 ],\n      widthElements: [ 0, 0 ]\n    },\n    'EVENT_MULTIPLE': {\n      d:'m {mx},{my} {e.x1},-{e.y0} {e.x1},{e.y0} -{e.x0},{e.y1} -{e.x2},0 z',\n      height: 36,\n      width:  36,\n      heightElements: [ 6.28099, 12.56199 ],\n      widthElements: [ 3.1405, 9.42149, 12.56198 ]\n    },\n    'EVENT_PARALLEL_MULTIPLE': {\n      d:'m {mx},{my} {e.x0},0 0,{e.y1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +\n        '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',\n      height: 36,\n      width:  36,\n      heightElements: [ 2.56228, 7.68683 ],\n      widthElements: [ 2.56228, 7.68683 ]\n    },\n    'GATEWAY_EXCLUSIVE': {\n      d:'m {mx},{my} {e.x0},{e.y0} {e.x1},{e.y0} {e.x2},0 {e.x4},{e.y2} ' +\n                    '{e.x4},{e.y1} {e.x2},0 {e.x1},{e.y3} {e.x0},{e.y3} ' +\n                    '{e.x3},0 {e.x5},{e.y1} {e.x5},{e.y2} {e.x3},0 z',\n      height: 17.5,\n      width:  17.5,\n      heightElements: [ 8.5, 6.5312, -6.5312, -8.5 ],\n      widthElements:  [ 6.5, -6.5, 3, -3, 5, -5 ]\n    },\n    'GATEWAY_PARALLEL': {\n      d:'m {mx},{my} 0,{e.y1} -{e.x1},0 0,{e.y0} {e.x1},0 0,{e.y1} {e.x0},0 ' +\n        '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z',\n      height: 30,\n      width:  30,\n      heightElements: [ 5, 12.5 ],\n      widthElements: [ 5, 12.5 ]\n    },\n    'GATEWAY_EVENT_BASED': {\n      d:'m {mx},{my} {e.x0},{e.y0} {e.x0},{e.y1} {e.x1},{e.y2} {e.x2},0 z',\n      height: 11,\n      width:  11,\n      heightElements: [ -6, 6, 12, -12 ],\n      widthElements: [ 9, -3, -12 ]\n    },\n    'GATEWAY_COMPLEX': {\n      d:'m {mx},{my} 0,{e.y0} -{e.x0},-{e.y1} -{e.x1},{e.y2} {e.x0},{e.y1} -{e.x2},0 0,{e.y3} ' +\n        '{e.x2},0  -{e.x0},{e.y1} l {e.x1},{e.y2} {e.x0},-{e.y1} 0,{e.y0} {e.x3},0 0,-{e.y0} {e.x0},{e.y1} ' +\n        '{e.x1},-{e.y2} -{e.x0},-{e.y1} {e.x2},0 0,-{e.y3} -{e.x2},0 {e.x0},-{e.y1} -{e.x1},-{e.y2} ' +\n        '-{e.x0},{e.y1} 0,-{e.y0} -{e.x3},0 z',\n      height: 17.125,\n      width:  17.125,\n      heightElements: [ 4.875, 3.4375, 2.125, 3 ],\n      widthElements: [ 3.4375, 2.125, 4.875, 3 ]\n    },\n    'DATA_OBJECT_PATH': {\n      d:'m 0,0 {e.x1},0 {e.x0},{e.y0} 0,{e.y1} -{e.x2},0 0,-{e.y2} {e.x1},0 0,{e.y0} {e.x0},0',\n      height: 61,\n      width:  51,\n      heightElements: [ 10, 50, 60 ],\n      widthElements: [ 10, 40, 50, 60 ]\n    },\n    'DATA_OBJECT_COLLECTION_PATH': {\n      d: 'm{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10',\n      height: 10,\n      width: 10,\n      heightElements: [],\n      widthElements: []\n    },\n    'DATA_ARROW': {\n      d:'m 5,9 9,0 0,-3 5,5 -5,5 0,-3 -9,0 z',\n      height: 61,\n      width:  51,\n      heightElements: [],\n      widthElements: []\n    },\n    'DATA_STORE': {\n      d:'m  {mx},{my} ' +\n        'l  0,{e.y2} ' +\n        'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 ' +\n        'l  0,-{e.y2} ' +\n        'c -{e.x0},-{e.y1} -{e.x1},-{e.y1} -{e.x2},0' +\n        'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 ' +\n        'm  -{e.x2},{e.y0}' +\n        'c  {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0' +\n        'm  -{e.x2},{e.y0}' +\n        'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0',\n      height: 61,\n      width:  61,\n      heightElements: [ 7, 10, 45 ],\n      widthElements:  [ 2, 58, 60 ]\n    },\n    'TEXT_ANNOTATION': {\n      d: 'm {mx}, {my} m 10,0 l -10,0 l 0,{e.y0} l 10,0',\n      height: 30,\n      width: 10,\n      heightElements: [ 30 ],\n      widthElements: [ 10 ]\n    },\n    'MARKER_SUB_PROCESS': {\n      d: 'm{mx},{my} m 7,2 l 0,10 m -5,-5 l 10,0',\n      height: 10,\n      width: 10,\n      heightElements: [],\n      widthElements: []\n    },\n    'MARKER_PARALLEL': {\n      d: 'm{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10',\n      height: 10,\n      width: 10,\n      heightElements: [],\n      widthElements: []\n    },\n    'MARKER_SEQUENTIAL': {\n      d: 'm{mx},{my} m 0,3 l 10,0 m -10,3 l 10,0 m -10,3 l 10,0',\n      height: 10,\n      width: 10,\n      heightElements: [],\n      widthElements: []\n    },\n    'MARKER_COMPENSATION': {\n      d: 'm {mx},{my} 7,-5 0,10 z m 7.1,-0.3 6.9,-4.7 0,10 -6.9,-4.7 z',\n      height: 10,\n      width: 21,\n      heightElements: [],\n      widthElements: []\n    },\n    'MARKER_LOOP': {\n      d: 'm {mx},{my} c 3.526979,0 6.386161,-2.829858 6.386161,-6.320661 0,-3.490806 -2.859182,-6.320661 ' +\n        '-6.386161,-6.320661 -3.526978,0 -6.38616,2.829855 -6.38616,6.320661 0,1.745402 ' +\n        '0.714797,3.325567 1.870463,4.469381 0.577834,0.571908 1.265885,1.034728 2.029916,1.35457 ' +\n        'l -0.718163,-3.909793 m 0.718163,3.909793 -3.885211,0.802902',\n      height: 13.9,\n      width: 13.7,\n      heightElements: [],\n      widthElements: []\n    },\n    'MARKER_ADHOC': {\n      d: 'm {mx},{my} m 0.84461,2.64411 c 1.05533,-1.23780996 2.64337,-2.07882 4.29653,-1.97997996 2.05163,0.0805 ' +\n        '3.85579,1.15803 5.76082,1.79107 1.06385,0.34139996 2.24454,0.1438 3.18759,-0.43767 0.61743,-0.33642 ' +\n        '1.2775,-0.64078 1.7542,-1.17511 0,0.56023 0,1.12046 0,1.6807 -0.98706,0.96237996 -2.29792,1.62393996 ' +\n        '-3.6918,1.66181996 -1.24459,0.0927 -2.46671,-0.2491 -3.59505,-0.74812 -1.35789,-0.55965 ' +\n        '-2.75133,-1.33436996 -4.27027,-1.18121996 -1.37741,0.14601 -2.41842,1.13685996 -3.44288,1.96782996 z',\n      height: 4,\n      width: 15,\n      heightElements: [],\n      widthElements: []\n    },\n    'TASK_TYPE_SEND': {\n      d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}',\n      height: 14,\n      width:  21,\n      heightElements: [ 6, 14 ],\n      widthElements: [ 10.5, 21 ]\n    },\n    'TASK_TYPE_SCRIPT': {\n      d: 'm {mx},{my} c 9.966553,-6.27276 -8.000926,-7.91932 2.968968,-14.938 l -8.802728,0 ' +\n        'c -10.969894,7.01868 6.997585,8.66524 -2.968967,14.938 z ' +\n        'm -7,-12 l 5,0 ' +\n        'm -4.5,3 l 4.5,0 ' +\n        'm -3,3 l 5,0' +\n        'm -4,3 l 5,0',\n      height: 15,\n      width:  12.6,\n      heightElements: [ 6, 14 ],\n      widthElements: [ 10.5, 21 ]\n    },\n    'TASK_TYPE_USER_1': {\n      d: 'm {mx},{my} c 0.909,-0.845 1.594,-2.049 1.594,-3.385 0,-2.554 -1.805,-4.62199999 ' +\n        '-4.357,-4.62199999 -2.55199998,0 -4.28799998,2.06799999 -4.28799998,4.62199999 0,1.348 ' +\n        '0.974,2.562 1.89599998,3.405 -0.52899998,0.187 -5.669,2.097 -5.794,4.7560005 v 6.718 ' +\n        'h 17 v -6.718 c 0,-2.2980005 -5.5279996,-4.5950005 -6.0509996,-4.7760005 z' +\n        'm -8,6 l 0,5.5 m 11,0 l 0,-5'\n    },\n    'TASK_TYPE_USER_2': {\n      d: 'm {mx},{my} m 2.162,1.009 c 0,2.4470005 -2.158,4.4310005 -4.821,4.4310005 ' +\n        '-2.66499998,0 -4.822,-1.981 -4.822,-4.4310005 '\n    },\n    'TASK_TYPE_USER_3': {\n      d: 'm {mx},{my} m -6.9,-3.80 c 0,0 2.25099998,-2.358 4.27399998,-1.177 2.024,1.181 4.221,1.537 ' +\n        '4.124,0.965 -0.098,-0.57 -0.117,-3.79099999 -4.191,-4.13599999 -3.57499998,0.001 ' +\n        '-4.20799998,3.36699999 -4.20699998,4.34799999 z'\n    },\n    'TASK_TYPE_MANUAL': {\n      d: 'm {mx},{my} c 0.234,-0.01 5.604,0.008 8.029,0.004 0.808,0 1.271,-0.172 1.417,-0.752 0.227,-0.898 ' +\n        '-0.334,-1.314 -1.338,-1.316 -2.467,-0.01 -7.886,-0.004 -8.108,-0.004 -0.014,-0.079 0.016,-0.533 0,-0.61 ' +\n        '0.195,-0.042 8.507,0.006 9.616,0.002 0.877,-0.007 1.35,-0.438 1.353,-1.208 0.003,-0.768 -0.479,-1.09 ' +\n        '-1.35,-1.091 -2.968,-0.002 -9.619,-0.013 -9.619,-0.013 v -0.591 c 0,0 5.052,-0.016 7.225,-0.016 ' +\n        '0.888,-0.002 1.354,-0.416 1.351,-1.193 -0.006,-0.761 -0.492,-1.196 -1.361,-1.196 -3.473,-0.005 ' +\n        '-10.86,-0.003 -11.0829995,-0.003 -0.022,-0.047 -0.045,-0.094 -0.069,-0.139 0.3939995,-0.319 ' +\n        '2.0409995,-1.626 2.4149995,-2.017 0.469,-0.4870005 0.519,-1.1650005 0.162,-1.6040005 -0.414,-0.511 ' +\n        '-0.973,-0.5 -1.48,-0.236 -1.4609995,0.764 -6.5999995,3.6430005 -7.7329995,4.2710005 -0.9,0.499 ' +\n        '-1.516,1.253 -1.882,2.19 -0.37000002,0.95 -0.17,2.01 -0.166,2.979 0.004,0.718 -0.27300002,1.345 ' +\n        '-0.055,2.063 0.629,2.087 2.425,3.312 4.859,3.318 4.6179995,0.014 9.2379995,-0.139 13.8569995,-0.158 ' +\n        '0.755,-0.004 1.171,-0.301 1.182,-1.033 0.012,-0.754 -0.423,-0.969 -1.183,-0.973 -1.778,-0.01 ' +\n        '-5.824,-0.004 -6.04,-0.004 10e-4,-0.084 0.003,-0.586 10e-4,-0.67 z'\n    },\n    'TASK_TYPE_INSTANTIATING_SEND': {\n      d: 'm {mx},{my} l 0,8.4 l 12.6,0 l 0,-8.4 z l 6.3,3.6 l 6.3,-3.6'\n    },\n    'TASK_TYPE_SERVICE': {\n      d: 'm {mx},{my} v -1.71335 c 0.352326,-0.0705 0.703932,-0.17838 1.047628,-0.32133 ' +\n        '0.344416,-0.14465 0.665822,-0.32133 0.966377,-0.52145 l 1.19431,1.18005 1.567487,-1.57688 ' +\n        '-1.195028,-1.18014 c 0.403376,-0.61394 0.683079,-1.29908 0.825447,-2.01824 l 1.622133,-0.01 ' +\n        'v -2.2196 l -1.636514,0.01 c -0.07333,-0.35153 -0.178319,-0.70024 -0.323564,-1.04372 ' +\n        '-0.145244,-0.34406 -0.321407,-0.6644 -0.522735,-0.96217 l 1.131035,-1.13631 -1.583305,-1.56293 ' +\n        '-1.129598,1.13589 c -0.614052,-0.40108 -1.302883,-0.68093 -2.022633,-0.82247 l 0.0093,-1.61852 ' +\n        'h -2.241173 l 0.0042,1.63124 c -0.353763,0.0736 -0.705369,0.17977 -1.049785,0.32371 -0.344415,0.14437 ' +\n        '-0.665102,0.32092 -0.9635006,0.52046 l -1.1698628,-1.15823 -1.5667691,1.5792 1.1684265,1.15669 ' +\n        'c -0.4026573,0.61283 -0.68308,1.29797 -0.8247287,2.01713 l -1.6588041,0.003 v 2.22174 ' +\n        'l 1.6724648,-0.006 c 0.073327,0.35077 0.1797598,0.70243 0.3242851,1.04472 0.1452428,0.34448 ' +\n        '0.3214064,0.6644 0.5227339,0.96066 l -1.1993431,1.19723 1.5840256,1.56011 1.1964668,-1.19348 ' +\n        'c 0.6140517,0.40346 1.3028827,0.68232 2.0233517,0.82331 l 7.19e-4,1.69892 h 2.226848 z ' +\n        'm 0.221462,-3.9957 c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' +\n        '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' +\n        '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z'\n    },\n    'TASK_TYPE_SERVICE_FILL': {\n      d: 'm {mx},{my} c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' +\n        '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' +\n        '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z'\n    },\n    'TASK_TYPE_BUSINESS_RULE_HEADER': {\n      d: 'm {mx},{my} 0,4 20,0 0,-4 z'\n    },\n    'TASK_TYPE_BUSINESS_RULE_MAIN': {\n      d: 'm {mx},{my} 0,12 20,0 0,-12 z' +\n        'm 0,8 l 20,0 ' +\n        'm -13,-4 l 0,8'\n    },\n    'MESSAGE_FLOW_MARKER': {\n      d: 'm {mx},{my} m -10.5 ,-7 l 0,14 l 21,0 l 0,-14 z l 10.5,6 l 10.5,-6'\n    }\n  };\n\n  /**\n   * Return raw path for the given ID.\n   *\n   * @param {string} pathId\n   *\n   * @return {string} raw path\n   */\n  this.getRawPath = function getRawPath(pathId) {\n    return this.pathMap[pathId].d;\n  };\n\n  /**\n   * Scales the path to the given height and width.\n   * <h1>Use case</h1>\n   * <p>Use case is to scale the content of elements (event, gateways) based\n   * on the element bounding box's size.\n   * </p>\n   * <h1>Why not transform</h1>\n   * <p>Scaling a path with transform() will also scale the stroke and IE does not support\n   * the option 'non-scaling-stroke' to prevent this.\n   * Also there are use cases where only some parts of a path should be\n   * scaled.</p>\n   *\n   * @param {string} pathId The ID of the path.\n   * @param {Object} param <p>\n   *   Example param object scales the path to 60% size of the container (data.width, data.height).\n   *   <pre>\n   *   {\n   *     xScaleFactor: 0.6,\n   *     yScaleFactor:0.6,\n   *     containerWidth: data.width,\n   *     containerHeight: data.height,\n   *     position: {\n   *       mx: 0.46,\n   *       my: 0.2,\n   *     }\n   *   }\n   *   </pre>\n   *   <ul>\n   *    <li>targetpathwidth = xScaleFactor * containerWidth</li>\n   *    <li>targetpathheight = yScaleFactor * containerHeight</li>\n   *    <li>Position is used to set the starting coordinate of the path. M is computed:\n    *    <ul>\n    *      <li>position.x * containerWidth</li>\n    *      <li>position.y * containerHeight</li>\n    *    </ul>\n    *    Center of the container <pre> position: {\n   *       mx: 0.5,\n   *       my: 0.5,\n   *     }</pre>\n   *     Upper left corner of the container\n   *     <pre> position: {\n   *       mx: 0.0,\n   *       my: 0.0,\n   *     }</pre>\n   *    </li>\n   *   </ul>\n   * </p>\n   *\n   * @return {string} scaled path\n   */\n  this.getScaledPath = function getScaledPath(pathId, param) {\n    var rawPath = this.pathMap[pathId];\n\n    // positioning\n    // compute the start point of the path\n    var mx, my;\n\n    if (param.abspos) {\n      mx = param.abspos.x;\n      my = param.abspos.y;\n    } else {\n      mx = param.containerWidth * param.position.mx;\n      my = param.containerHeight * param.position.my;\n    }\n\n    var coordinates = {}; // map for the scaled coordinates\n    if (param.position) {\n\n      // path\n      var heightRatio = (param.containerHeight / rawPath.height) * param.yScaleFactor;\n      var widthRatio = (param.containerWidth / rawPath.width) * param.xScaleFactor;\n\n\n      // Apply height ratio\n      for (var heightIndex = 0; heightIndex < rawPath.heightElements.length; heightIndex++) {\n        coordinates['y' + heightIndex] = rawPath.heightElements[heightIndex] * heightRatio;\n      }\n\n      // Apply width ratio\n      for (var widthIndex = 0; widthIndex < rawPath.widthElements.length; widthIndex++) {\n        coordinates['x' + widthIndex] = rawPath.widthElements[widthIndex] * widthRatio;\n      }\n    }\n\n    // Apply value to raw path\n    var path = format(\n      rawPath.d, {\n        mx: mx,\n        my: my,\n        e: coordinates\n      }\n    );\n    return path;\n  };\n}\n\n// helpers //////////////////////\n\n// copied and adjusted from https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js\nvar tokenRegex = /\\{([^{}]+)\\}/g,\n    objNotationRegex = /(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g; // matches .xxxxx or [\"xxxxx\"] to run over object properties\n\nfunction replacer(all, key, obj) {\n  var res = obj;\n  key.replace(objNotationRegex, function(all, name, quote, quotedName, isFunc) {\n    name = name || quotedName;\n    if (res) {\n      if (name in res) {\n        res = res[name];\n      }\n      typeof res == 'function' && isFunc && (res = res());\n    }\n  });\n  res = (res == null || res == obj ? all : res) + '';\n\n  return res;\n}\n\nfunction format(str, obj) {\n  return String(str).replace(tokenRegex, function(all, key) {\n    return replacer(all, key, obj);\n  });\n}\n"
  },
  {
    "path": "lib/draw/TextRenderer.js",
    "content": "import { assign } from 'min-dash';\n\nimport TextUtil from 'diagram-js/lib/util/Text';\n\nvar DEFAULT_FONT_SIZE = 12;\nvar LINE_HEIGHT_RATIO = 1.2;\n\nvar MIN_TEXT_ANNOTATION_HEIGHT = 30;\n\n/**\n * @typedef { {\n *   fontFamily: string;\n *   fontSize: number;\n *   fontWeight: string;\n *   lineHeight: number;\n * } } TextRendererStyle\n *\n * @typedef { {\n *   defaultStyle?: Partial<TextRendererStyle>;\n *   externalStyle?: Partial<TextRendererStyle>;\n * } } TextRendererConfig\n *\n * @typedef { import('diagram-js/lib/util/Text').TextLayoutConfig } TextLayoutConfig\n *\n * @typedef { import('diagram-js/lib/util/Types').Rect } Rect\n */\n\n\n/**\n * Renders text and computes text bounding boxes.\n *\n * @param {TextRendererConfig} [config]\n */\nexport default function TextRenderer(config) {\n\n  var defaultStyle = assign({\n    fontFamily: 'Arial, sans-serif',\n    fontSize: DEFAULT_FONT_SIZE,\n    fontWeight: 'normal',\n    lineHeight: LINE_HEIGHT_RATIO\n  }, config && config.defaultStyle || {});\n\n  var fontSize = parseInt(defaultStyle.fontSize, 10) - 1;\n\n  var externalStyle = assign({}, defaultStyle, {\n    fontSize: fontSize\n  }, config && config.externalStyle || {});\n\n  var textUtil = new TextUtil({\n    style: defaultStyle\n  });\n\n  /**\n   * Get the new bounds of an externally rendered,\n   * layouted label.\n   *\n   * @param {Rect} bounds\n   * @param {string} text\n   *\n   * @return {Rect}\n   */\n  this.getExternalLabelBounds = function(bounds, text) {\n\n    var layoutedDimensions = textUtil.getDimensions(text, {\n      box: {\n        width: 90,\n        height: 30\n      },\n      style: externalStyle\n    });\n\n    // resize label shape to fit label text\n    return {\n      x: Math.round(bounds.x + bounds.width / 2 - layoutedDimensions.width / 2),\n      y: Math.round(bounds.y),\n      width: Math.ceil(layoutedDimensions.width),\n      height: Math.ceil(layoutedDimensions.height)\n    };\n\n  };\n\n  /**\n   * Get the new bounds of text annotation.\n   *\n   * @param {Rect} bounds\n   * @param {string} text\n   *\n   * @return {Rect}\n   */\n  this.getTextAnnotationBounds = function(bounds, text) {\n\n    var layoutedDimensions = textUtil.getDimensions(text, {\n      box: bounds,\n      style: defaultStyle,\n      align: 'left-top',\n      padding: 5\n    });\n\n    return {\n      x: bounds.x,\n      y: bounds.y,\n      width: bounds.width,\n      height: Math.max(MIN_TEXT_ANNOTATION_HEIGHT, Math.round(layoutedDimensions.height))\n    };\n  };\n\n  /**\n   * Create a layouted text element.\n   *\n   * @param {string} text\n   * @param {TextLayoutConfig} [options]\n   *\n   * @return {SVGElement} rendered text\n   */\n  this.createText = function(text, options) {\n    return textUtil.createText(text, options || {});\n  };\n\n  /**\n   * Get default text style.\n   */\n  this.getDefaultStyle = function() {\n    return defaultStyle;\n  };\n\n  /**\n   * Get the external text style.\n   */\n  this.getExternalStyle = function() {\n    return externalStyle;\n  };\n\n}\n\nTextRenderer.$inject = [\n  'config.textRenderer'\n];"
  },
  {
    "path": "lib/draw/TextRenderer.spec.ts",
    "content": "import TextRenderer from './TextRenderer';\n\nnew TextRenderer({\n  defaultStyle: {\n    fontFamily: 'foo'\n  }\n});\n\nconst textRenderer = new TextRenderer();\n\nconst externalLabelBounds = textRenderer.getExternalLabelBounds({\n  x: 100,\n  y: 100,\n  width: 100,\n  height: 100\n}, 'FOO\\nBAR\\n\\BAZ');\n\nconst textAnnotationBounds = textRenderer.getTextAnnotationBounds({\n  x: 100,\n  y: 100,\n  width: 100,\n  height: 100\n}, 'FOO\\nBAR\\n\\BAZ');\n\nlet text = textRenderer.createText('foo');\n\ntext = textRenderer.createText('foo', {\n  align: 'center-top',\n  padding: 10\n});\n\nconst defaultStyle = textRenderer.getDefaultStyle();\n\nconst externalStyle = textRenderer.getExternalStyle();"
  },
  {
    "path": "lib/draw/index.js",
    "content": "import BpmnRenderer from './BpmnRenderer';\nimport TextRenderer from './TextRenderer';\n\nimport PathMap from './PathMap';\n\nexport default {\n  __init__: [ 'bpmnRenderer' ],\n  bpmnRenderer: [ 'type', BpmnRenderer ],\n  textRenderer: [ 'type', TextRenderer ],\n  pathMap: [ 'type', PathMap ]\n};\n"
  },
  {
    "path": "lib/features/align-elements/AlignElementsContextPadProvider.js",
    "content": "import {\n  assign\n} from 'min-dash';\n\nimport ICONS from './AlignElementsIcons';\n\n/**\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n * @typedef {import('diagram-js/lib/features/context-pad/ContextPad').default} ContextPad\n * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').default} PopupMenu\n * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n *\n * @typedef {import('../../model/Types').Element} Element\n * @typedef {import('diagram-js/lib/features/context-pad/ContextPad').ContextPadEntries} ContextPadEntries\n * @typedef {import('diagram-js/lib/features/context-pad/ContextPadProvider').default<Element>} ContextPadProvider\n */\n\nvar LOW_PRIORITY = 900;\n\n/**\n * A provider for the `Align elements` context pad entry.\n *\n * @implements {ContextPadProvider}\n *\n * @param {ContextPad} contextPad\n * @param {PopupMenu} popupMenu\n * @param {Translate} translate\n * @param {Canvas} canvas\n */\nexport default function AlignElementsContextPadProvider(contextPad, popupMenu, translate, canvas) {\n\n  contextPad.registerProvider(LOW_PRIORITY, this);\n\n  this._contextPad = contextPad;\n  this._popupMenu = popupMenu;\n  this._translate = translate;\n  this._canvas = canvas;\n}\n\nAlignElementsContextPadProvider.$inject = [\n  'contextPad',\n  'popupMenu',\n  'translate',\n  'canvas'\n];\n\n/**\n * @param {Element[]} elements\n *\n * @return {ContextPadEntries}\n */\nAlignElementsContextPadProvider.prototype.getMultiElementContextPadEntries = function(elements) {\n  var actions = {};\n\n  if (this._isAllowed(elements)) {\n    assign(actions, this._getEntries(elements));\n  }\n\n  return actions;\n};\n\nAlignElementsContextPadProvider.prototype._isAllowed = function(elements) {\n  return !this._popupMenu.isEmpty(elements, 'align-elements');\n};\n\nAlignElementsContextPadProvider.prototype._getEntries = function() {\n  var self = this;\n\n  return {\n    'align-elements': {\n      group: 'align-elements',\n      title: self._translate('Align elements'),\n      html: `<div class=\"entry\">${ICONS['align']}</div>`,\n      action: {\n        click: function(event, target) {\n          var position = self._getMenuPosition(target);\n\n          assign(position, {\n            cursor: {\n              x: event.x,\n              y: event.y\n            }\n          });\n\n          self._popupMenu.open(target, 'align-elements', position);\n        }\n      }\n    }\n  };\n};\n\nAlignElementsContextPadProvider.prototype._getMenuPosition = function(elements) {\n  var Y_OFFSET = 5;\n\n  var pad = this._contextPad.getPad(elements).html;\n\n  var padRect = pad.getBoundingClientRect();\n\n  var pos = {\n    x: padRect.left,\n    y: padRect.bottom + Y_OFFSET\n  };\n\n  return pos;\n};\n"
  },
  {
    "path": "lib/features/align-elements/AlignElementsIcons.js",
    "content": "/**\n * To change the icons, modify the SVGs in `./resources`, execute `npx svgo -f resources --datauri enc -o dist`,\n * and then replace respective icons with the optimized data URIs in `./dist`.\n */\nvar icons = {\n  align:  `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 2000 2000\">\n              <line x1=\"200\" y1=\"150\" x2=\"200\" y2=\"1850\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n              <rect x=\"500\" y=\"150\" width=\"1300\" height=\"700\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n              <rect x=\"500\" y=\"1150\" width=\"700\" height=\"700\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`,\n  bottom: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n            <line x1=\"150\" y1=\"1650\" x2=\"1650\" y2=\"1650\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n            <rect x=\"150\" y=\"350\" width=\"600\" height=\"1300\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n            <rect x=\"1050\" y=\"850\" width=\"600\" height=\"800\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`,\n  center: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n            <line x1=\"900\" y1=\"150\" x2=\"900\" y2=\"1650\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n            <rect x=\"250\" y=\"150\" width=\"1300\" height=\"600\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n            <rect x=\"500\" y=\"1050\" width=\"800\" height=\"600\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`,\n  left:   `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n            <line x1=\"100\" y1=\"150\" x2=\"100\" y2=\"1650\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n            <rect x=\"100\" y=\"150\" width=\"1300\" height=\"600\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n            <rect x=\"100\" y=\"1050\" width=\"800\" height=\"600\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`,\n  right:  `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n            <line x1=\"1650\" y1=\"150\" x2=\"1650\" y2=\"1650\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n            <rect x=\"350\" y=\"150\" width=\"1300\" height=\"600\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n            <rect x=\"850\" y=\"1050\" width=\"800\" height=\"600\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`,\n  top:    `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n            <line x1=\"150\" y1=\"150\" x2=\"1650\" y2=\"150\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n            <rect x=\"150\" y=\"150\" width=\"600\" height=\"1300\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n            <rect x=\"1050\" y=\"150\" width=\"600\" height=\"800\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`,\n  middle: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n            <line x1=\"150\" y1=\"900\" x2=\"1650\" y2=\"900\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n            <rect x=\"150\" y=\"250\" width=\"600\" height=\"1300\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n            <rect x=\"1050\" y=\"500\" width=\"600\" height=\"800\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`\n};\n\nexport default icons;\n"
  },
  {
    "path": "lib/features/align-elements/AlignElementsMenuProvider.js",
    "content": "import ICONS from './AlignElementsIcons';\n\nimport {\n  assign,\n  forEach,\n} from 'min-dash';\n\n/**\n * @typedef {import('diagram-js/lib/features/align-elements/AlignElements').default} AlignElements\n * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').default} PopupMenu\n * @typedef {import('diagram-js/lib/features/rules/Rules').default} Rules\n * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n *\n * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').PopupMenuEntries} PopupMenuEntries\n * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').default} PopupMenuProvider\n * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').PopupMenuTarget} PopupMenuTarget\n */\n\nvar ALIGNMENT_OPTIONS = [\n  'left',\n  'center',\n  'right',\n  'top',\n  'middle',\n  'bottom'\n];\n\n/**\n * A provider for the `Align elements` popup menu.\n *\n * @implements {PopupMenuProvider}\n *\n * @param {PopupMenu} popupMenu\n * @param {AlignElements} alignElements\n * @param {Translate} translate\n * @param {Rules} rules\n */\nexport default function AlignElementsMenuProvider(popupMenu, alignElements, translate, rules) {\n\n  this._alignElements = alignElements;\n  this._translate = translate;\n  this._popupMenu = popupMenu;\n  this._rules = rules;\n\n  popupMenu.registerProvider('align-elements', this);\n}\n\nAlignElementsMenuProvider.$inject = [\n  'popupMenu',\n  'alignElements',\n  'translate',\n  'rules'\n];\n\n/**\n * @param {PopupMenuTarget} target\n *\n * @return {PopupMenuEntries}\n */\nAlignElementsMenuProvider.prototype.getPopupMenuEntries = function(target) {\n  var entries = {};\n\n  if (this._isAllowed(target)) {\n    assign(entries, this._getEntries(target));\n  }\n\n  return entries;\n};\n\nAlignElementsMenuProvider.prototype._isAllowed = function(target) {\n  return this._rules.allowed('elements.align', { elements: target });\n};\n\n/**\n * @param {PopupMenuTarget} target\n *\n * @return {PopupMenuEntries}\n */\nAlignElementsMenuProvider.prototype._getEntries = function(target) {\n  var alignElements = this._alignElements,\n      translate = this._translate,\n      popupMenu = this._popupMenu;\n\n  var entries = {};\n\n  forEach(ALIGNMENT_OPTIONS, function(alignment) {\n    entries[ 'align-elements-' + alignment ] = {\n      group: 'align',\n      title: translate('Align elements ' + alignment),\n      className: 'bjs-align-elements-menu-entry',\n      imageHtml: ICONS[ alignment ],\n      action: function() {\n        alignElements.trigger(target, alignment);\n        popupMenu.close();\n      }\n    };\n  });\n\n  return entries;\n};\n"
  },
  {
    "path": "lib/features/align-elements/BpmnAlignElements.js",
    "content": "import inherits from 'inherits-browser';\n\nimport RuleProvider from 'diagram-js/lib/features/rules/RuleProvider';\nimport { getParents } from 'diagram-js/lib/util/Elements';\n\nimport {\n  filter\n} from 'min-dash';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n */\n\n/**\n * Rule provider for aligning BPMN elements.\n *\n * @param {EventBus} eventBus\n */\nexport default function BpmnAlignElements(eventBus) {\n  RuleProvider.call(this, eventBus);\n}\n\nBpmnAlignElements.$inject = [ 'eventBus' ];\n\ninherits(BpmnAlignElements, RuleProvider);\n\nBpmnAlignElements.prototype.init = function() {\n  this.addRule('elements.align', function(context) {\n    var elements = context.elements;\n\n    // filter out elements which cannot be aligned\n    var filteredElements = filter(elements, function(element) {\n      return !(element.waypoints || element.host || element.labelTarget);\n    });\n\n    // filter out elements which are children of any of the selected elements\n    filteredElements = getParents(filteredElements);\n\n    if (filteredElements.length < 2) {\n      return false;\n    }\n\n    return filteredElements;\n  });\n};\n"
  },
  {
    "path": "lib/features/align-elements/index.js",
    "content": "import AlignElementsModule from 'diagram-js/lib/features/align-elements';\nimport ContextPadModule from 'diagram-js/lib/features/context-pad';\nimport PopupMenuModule from 'diagram-js/lib/features/popup-menu';\n\nimport AlignElementsContextPadProvider from './AlignElementsContextPadProvider';\nimport AlignElementsMenuProvider from './AlignElementsMenuProvider';\nimport BpmnAlignElements from './BpmnAlignElements';\n\nexport default {\n  __depends__: [\n    AlignElementsModule,\n    ContextPadModule,\n    PopupMenuModule\n  ],\n  __init__: [\n    'alignElementsContextPadProvider',\n    'alignElementsMenuProvider',\n    'bpmnAlignElements'\n  ],\n  alignElementsContextPadProvider: [ 'type', AlignElementsContextPadProvider ],\n  alignElementsMenuProvider: [ 'type', AlignElementsMenuProvider ],\n  bpmnAlignElements: [ 'type', BpmnAlignElements ]\n};\n"
  },
  {
    "path": "lib/features/append-preview/AppendPreview.js",
    "content": "import {\n  assign,\n  isNil\n} from 'min-dash';\n\nconst round = Math.round;\n\n/**\n * @typedef {import('diagram-js/lib/features/complex-preview/ComplexPreview').default} ComplexPreview\n * @typedef {import('diagram-js/lib/layout/ConnectionDocking').default} ConnectionDocking\n * @typedef {import('../modeling/ElementFactory').default} ElementFactory\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../modeling/BpmnLayouter').default} BpmnLayouter\n * @typedef {import('diagram-js/lib/features/rules/Rules').default} Rules\n *\n * @typedef {import('../../model/Types').Shape} Shape\n */\n\n/**\n * A preview for appending.\n *\n * @param {ComplexPreview} complexPreview\n * @param {ConnectionDocking} connectionDocking\n * @param {ElementFactory} elementFactory\n * @param {EventBus} eventBus\n * @param {BpmnLayouter} layouter\n * @param {Rules} rules\n */\nexport default function AppendPreview(complexPreview, connectionDocking, elementFactory, eventBus, layouter, rules) {\n  this._complexPreview = complexPreview;\n  this._connectionDocking = connectionDocking;\n  this._elementFactory = elementFactory;\n  this._eventBus = eventBus;\n  this._layouter = layouter;\n  this._rules = rules;\n}\n\n/**\n * Create a preview of appending a shape of the given type to the given source.\n *\n * @param {Shape} source\n * @param {string} type\n * @param {Partial<Shape>} options\n */\nAppendPreview.prototype.create = function(source, type, options) {\n  const complexPreview = this._complexPreview,\n        connectionDocking = this._connectionDocking,\n        elementFactory = this._elementFactory,\n        eventBus = this._eventBus,\n        layouter = this._layouter,\n        rules = this._rules;\n\n  const shape = elementFactory.createShape(assign({ type }, options));\n\n  const position = eventBus.fire('autoPlace', {\n    source,\n    shape\n  });\n\n  if (!position) {\n    return;\n  }\n\n  assign(shape, {\n    x: position.x - round(shape.width / 2),\n    y: position.y - round(shape.height / 2)\n  });\n\n  const connectionCreateAllowed = rules.allowed('connection.create', {\n    source,\n    target: shape,\n    hints: {\n      targetParent: source.parent\n    }\n  });\n\n  let connection = null;\n\n  if (connectionCreateAllowed) {\n    connection = elementFactory.createConnection(connectionCreateAllowed);\n\n    connection.waypoints = layouter.layoutConnection(connection, {\n      source,\n      target: shape\n    });\n\n    connection.waypoints = connectionDocking.getCroppedWaypoints(connection, source, shape);\n  }\n\n  complexPreview.create({\n    created: [\n      shape,\n      connection\n    ].filter((element) => !isNil(element))\n  });\n};\n\nAppendPreview.prototype.cleanUp = function() {\n  this._complexPreview.cleanUp();\n};\n\nAppendPreview.$inject = [\n  'complexPreview',\n  'connectionDocking',\n  'elementFactory',\n  'eventBus',\n  'layouter',\n  'rules'\n];"
  },
  {
    "path": "lib/features/append-preview/index.js",
    "content": "import AutoPlaceModule from '../auto-place';\nimport ComplexPreviewModule from 'diagram-js/lib/features/complex-preview';\nimport ModelingModule from '../modeling';\n\nimport AppendPreview from './AppendPreview';\n\nexport default {\n  __depends__: [\n    AutoPlaceModule,\n    ComplexPreviewModule,\n    ModelingModule\n  ],\n  __init__: [ 'appendPreview' ],\n  appendPreview: [ 'type', AppendPreview ]\n};\n"
  },
  {
    "path": "lib/features/auto-place/BpmnAutoPlace.js",
    "content": "import { getNewShapePosition } from './BpmnAutoPlaceUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n */\n\n/**\n * BPMN auto-place behavior.\n *\n * @param {EventBus} eventBus\n * @param {ElementRegistry} elementRegistry\n */\nexport default function AutoPlace(eventBus, elementRegistry) {\n  eventBus.on('autoPlace', function(context) {\n    var shape = context.shape,\n        source = context.source;\n\n    return getNewShapePosition(source, shape, elementRegistry);\n  });\n}\n\nAutoPlace.$inject = [ 'eventBus', 'elementRegistry' ];"
  },
  {
    "path": "lib/features/auto-place/BpmnAutoPlaceUtil.js",
    "content": "import { is } from '../../util/ModelUtil';\n\nimport {\n  isAny,\n  isDirectionHorizontal\n} from '../modeling/util/ModelingUtil';\n\nimport {\n  getMid,\n  asTRBL,\n  getOrientation\n} from 'diagram-js/lib/layout/LayoutUtil';\n\nimport {\n  findFreePosition,\n  generateGetNextPosition,\n  getConnectedDistance\n} from 'diagram-js/lib/features/auto-place/AutoPlaceUtil';\n\nimport { isConnection } from 'diagram-js/lib/util/ModelUtil';\n\n/**\n * @typedef {import('../../model/Types').Shape} Shape\n *\n * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n * @typedef {import('diagram-js/lib/util/Types').Point} Point\n * @typedef {import('diagram-js/lib/util/Types').DirectionTRBL} DirectionTRBL\n */\n\n/**\n * Get the position for given new target relative to the source it will be\n * connected to.\n *\n * @param  {Shape} source\n * @param  {Shape} element\n * @param  {ElementRegistry} elementRegistry\n *\n * @return {Point}\n */\nexport function getNewShapePosition(source, element, elementRegistry) {\n\n  var placeHorizontally = isDirectionHorizontal(source, elementRegistry);\n\n  if (is(element, 'bpmn:TextAnnotation')) {\n    return getTextAnnotationPosition(source, element, placeHorizontally);\n  }\n\n  if (isAny(element, [ 'bpmn:DataObjectReference', 'bpmn:DataStoreReference' ])) {\n    return getDataElementPosition(source, element, placeHorizontally);\n  }\n\n  if (is(element, 'bpmn:FlowNode')) {\n    return getFlowNodePosition(source, element, placeHorizontally);\n  }\n}\n\n/**\n * Get the position for given new flow node. Try placing the flow node right/bottom of\n * the source.\n *\n * @param {Shape} source\n * @param {Shape} element\n * @param {boolean} placeHorizontally Whether to place the new element horizontally\n *\n * @return {Point}\n */\nexport function getFlowNodePosition(source, element, placeHorizontally) {\n\n  var sourceTrbl = asTRBL(source);\n  var sourceMid = getMid(source);\n\n  var placement = placeHorizontally ? {\n    directionHint: 'e',\n    minDistance: 80,\n    baseOrientation: 'left',\n    boundaryOrientation: 'top',\n    start: 'top',\n    end: 'bottom'\n  } : {\n    directionHint: 's',\n    minDistance: 90,\n    baseOrientation: 'top',\n    boundaryOrientation: 'left',\n    start: 'left',\n    end: 'right'\n  };\n\n  var connectedDistance = getConnectedDistance(source, {\n    filter: function(connection) {\n      return is(connection, 'bpmn:SequenceFlow');\n    },\n    direction: placement.directionHint\n  });\n\n  var margin = 30,\n      minDistance = placement.minDistance,\n      orientation = placement.baseOrientation;\n\n  if (is(source, 'bpmn:BoundaryEvent')) {\n    orientation = getOrientation(source, source.host, -25);\n\n    if (orientation.indexOf(placement.boundaryOrientation) !== -1) {\n      margin *= -1;\n    }\n  }\n\n  var position = placeHorizontally ? {\n    x: sourceTrbl.right + connectedDistance + element.width / 2,\n    y: sourceMid.y + getDistance(orientation, minDistance, placement)\n  } : {\n    x: sourceMid.x + getDistance(orientation, minDistance, placement),\n    y: sourceTrbl.bottom + connectedDistance + element.height / 2\n  };\n\n  var nextPosition = {\n    margin: margin,\n    minDistance: minDistance\n  };\n\n  var nextPositionDirection = placeHorizontally ? {\n    y: nextPosition\n  } : {\n    x: nextPosition\n  };\n\n  return findFreePosition(source, element, position, generateGetNextPosition(nextPositionDirection));\n}\n\n/**\n * @param {DirectionTRBL} orientation\n * @param {number} minDistance\n * @param {{ start: DirectionTRBL, end: DirectionTRBL }} placement\n *\n * @return {number}\n */\nfunction getDistance(orientation, minDistance, placement) {\n  if (orientation.includes(placement.start)) {\n    return -1 * minDistance;\n  } else if (orientation.includes(placement.end)) {\n    return minDistance;\n  } else {\n    return 0;\n  }\n}\n\n\n/**\n * Get the position for given text annotation. Try placing the text annotation\n * top-right of the source (bottom-right in vertical layouts).\n *\n * @param {Shape} source\n * @param {Shape} element\n * @param {boolean} placeHorizontally Whether to place the new element horizontally\n *\n * @return {Point}\n */\nexport function getTextAnnotationPosition(source, element, placeHorizontally) {\n\n  var sourceTrbl = asTRBL(source);\n\n  var position = placeHorizontally ? {\n    x: sourceTrbl.right + element.width / 2,\n    y: sourceTrbl.top - 50 - element.height / 2\n  } : {\n    x: sourceTrbl.right + 50 + element.width / 2,\n    y: sourceTrbl.bottom + element.height / 2\n  };\n\n  if (isConnection(source)) {\n    position = getMid(source);\n    if (placeHorizontally) {\n      position.x += 100;\n      position.y -= 50;\n    } else {\n      position.x += 100;\n      position.y += 50;\n    }\n  }\n\n  var nextPosition = {\n    margin: placeHorizontally ? -30 : 30,\n    minDistance: 20\n  };\n  var nextPositionDirection = placeHorizontally ? {\n    y: nextPosition\n  } : {\n    x: nextPosition\n  };\n\n  return findFreePosition(source, element, position, generateGetNextPosition(nextPositionDirection));\n}\n\n\n/**\n * Get the position for given new data element. Try placing the data element\n * bottom-right of the source (bottom-left in vertical layouts).\n *\n * @param {Shape} source\n * @param {Shape} element\n * @param {boolean} placeHorizontally Whether to place the new element horizontally\n *\n * @return {Point}\n */\nexport function getDataElementPosition(source, element, placeHorizontally) {\n\n  var sourceTrbl = asTRBL(source);\n\n  var position = placeHorizontally ? {\n    x: sourceTrbl.right - 10 + element.width / 2,\n    y: sourceTrbl.bottom + 40 + element.width / 2\n  } : {\n    x: sourceTrbl.left - 40 - element.width / 2,\n    y: sourceTrbl.bottom - 10 + element.height / 2\n  };\n\n  var nextPosition = {\n    margin: 30,\n    minDistance: 30\n  };\n  var nextPositionDirection = placeHorizontally ? {\n    x: nextPosition\n  } : {\n    y: nextPosition\n  };\n\n  return findFreePosition(source, element, position, generateGetNextPosition(nextPositionDirection));\n}"
  },
  {
    "path": "lib/features/auto-place/index.js",
    "content": "import AutoPlaceModule from 'diagram-js/lib/features/auto-place';\n\nimport BpmnAutoPlace from './BpmnAutoPlace';\n\nexport default {\n  __depends__: [ AutoPlaceModule ],\n  __init__: [ 'bpmnAutoPlace' ],\n  bpmnAutoPlace: [ 'type', BpmnAutoPlace ]\n};"
  },
  {
    "path": "lib/features/auto-resize/BpmnAutoResize.js",
    "content": "import AutoResize from 'diagram-js/lib/features/auto-resize/AutoResize';\n\nimport inherits from 'inherits-browser';\n\nimport { is } from '../../util/ModelUtil';\n\n/**\n * @typedef {import('didi').Injector} Injector\n *\n * @typedef {import('../../model/Types').Shape} Shape\n *\n * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n */\n\n/**\n * BPMN-specific resize behavior.\n *\n * @param {Injector} injector\n */\nexport default function BpmnAutoResize(injector) {\n\n  injector.invoke(AutoResize, this);\n}\n\nBpmnAutoResize.$inject = [\n  'injector'\n];\n\ninherits(BpmnAutoResize, AutoResize);\n\n/**\n * Perform BPMN-specific resizing of participants.\n *\n * @param {Shape} target\n * @param {Rect} newBounds\n * @param {Object} [hints]\n * @param {string} [hints.autoResize]\n */\nBpmnAutoResize.prototype.resize = function(target, newBounds, hints) {\n\n  if (is(target, 'bpmn:Participant')) {\n    this._modeling.resizeLane(target, newBounds, null, hints);\n  } else {\n    this._modeling.resizeShape(target, newBounds, null, hints);\n  }\n};"
  },
  {
    "path": "lib/features/auto-resize/BpmnAutoResizeProvider.js",
    "content": "import { is } from '../../util/ModelUtil';\n\nimport { isLabel } from '../../util/LabelUtil';\n\nimport inherits from 'inherits-browser';\n\nimport { forEach } from 'min-dash';\n\nimport AutoResizeProvider from 'diagram-js/lib/features/auto-resize/AutoResizeProvider';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../modeling/Modeling').default} Modeling\n *\n * @typedef {import('../../model/Types').Shape} Shape\n */\n\n/**\n * BPMN-specific provider for automatic resizung.\n *\n * @param {EventBus} eventBus\n * @param {Modeling} modeling\n */\nexport default function BpmnAutoResizeProvider(eventBus, modeling) {\n  AutoResizeProvider.call(this, eventBus);\n\n  this._modeling = modeling;\n}\n\ninherits(BpmnAutoResizeProvider, AutoResizeProvider);\n\nBpmnAutoResizeProvider.$inject = [\n  'eventBus',\n  'modeling'\n];\n\n\n/**\n * BPMN-specific check whether given elements can be resized.\n *\n * @param {Shape[]} elements\n * @param {Shape} target\n *\n * @return {boolean}\n */\nBpmnAutoResizeProvider.prototype.canResize = function(elements, target) {\n\n  // do not resize plane elements:\n  // root elements, collapsed sub-processes\n  if (is(target.di, 'bpmndi:BPMNPlane')) {\n    return false;\n  }\n\n  if (!is(target, 'bpmn:Participant') && !is(target, 'bpmn:Lane') && !(is(target, 'bpmn:SubProcess'))) {\n    return false;\n  }\n\n  var canResize = true;\n\n  forEach(elements, function(element) {\n\n    if (is(element, 'bpmn:Lane') || isLabel(element)) {\n      canResize = false;\n      return;\n    }\n  });\n\n  return canResize;\n};\n"
  },
  {
    "path": "lib/features/auto-resize/index.js",
    "content": "import BpmnAutoResize from './BpmnAutoResize';\nimport BpmnAutoResizeProvider from './BpmnAutoResizeProvider';\n\n\nexport default {\n  __init__: [\n    'bpmnAutoResize',\n    'bpmnAutoResizeProvider'\n  ],\n  bpmnAutoResize: [ 'type', BpmnAutoResize ],\n  bpmnAutoResizeProvider: [ 'type', BpmnAutoResizeProvider ]\n};\n"
  },
  {
    "path": "lib/features/context-pad/ContextPadProvider.js",
    "content": "import {\n  assign,\n  forEach,\n  isArray,\n  every\n} from 'min-dash';\n\nimport {\n  is\n} from '../../util/ModelUtil';\n\nimport {\n  isExpanded,\n  isHorizontal,\n  isEventSubProcess\n} from '../../util/DiUtil';\n\nimport {\n  isAny\n} from '../modeling/util/ModelingUtil';\n\nimport {\n  getChildLanes\n} from '../modeling/util/LaneUtil';\n\nimport {\n  hasPrimaryModifier\n} from 'diagram-js/lib/util/Mouse';\n\n/**\n * @typedef {import('didi').Injector} Injector\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('diagram-js/lib/features/context-pad/ContextPad').default} ContextPad\n * @typedef {import('../modeling/Modeling').default} Modeling\n * @typedef {import('../modeling/ElementFactory').default} ElementFactory\n * @typedef {import('../append-preview/AppendPreview').default} AppendPreview\n * @typedef {import('diagram-js/lib/features/connect/Connect').default} Connect\n * @typedef {import('diagram-js/lib/features/create/Create').default} Create\n * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').default} PopupMenu\n * @typedef {import('diagram-js/lib/features/canvas/Canvas').default} Canvas\n * @typedef {import('diagram-js/lib/features/rules/Rules').default} Rules\n * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n *\n * @typedef {import('../../model/Types').Element} Element\n * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n *\n * @typedef {import('diagram-js/lib/features/context-pad/ContextPadProvider').default<Element>} BaseContextPadProvider\n * @typedef {import('diagram-js/lib/features/context-pad/ContextPadProvider').ContextPadEntries} ContextPadEntries\n * @typedef {import('diagram-js/lib/features/context-pad/ContextPadProvider').ContextPadEntry} ContextPadEntry\n *\n * @typedef { { autoPlace?: boolean; } } ContextPadConfig\n */\n\n/**\n * BPMN-specific context pad provider.\n *\n * @implements {BaseContextPadProvider}\n *\n * @param {ContextPadConfig} config\n * @param {Injector} injector\n * @param {EventBus} eventBus\n * @param {ContextPad} contextPad\n * @param {Modeling} modeling\n * @param {ElementFactory} elementFactory\n * @param {Connect} connect\n * @param {Create} create\n * @param {PopupMenu} popupMenu\n * @param {Canvas} canvas\n * @param {Rules} rules\n * @param {Translate} translate\n * @param {AppendPreview} appendPreview\n */\nexport default function ContextPadProvider(\n    config, injector, eventBus,\n    contextPad, modeling, elementFactory,\n    connect, create, popupMenu,\n    canvas, rules, translate, appendPreview) {\n\n  config = config || {};\n\n  contextPad.registerProvider(this);\n\n  this._contextPad = contextPad;\n\n  this._modeling = modeling;\n\n  this._elementFactory = elementFactory;\n  this._connect = connect;\n  this._create = create;\n  this._popupMenu = popupMenu;\n  this._canvas = canvas;\n  this._rules = rules;\n  this._translate = translate;\n  this._eventBus = eventBus;\n  this._appendPreview = appendPreview;\n\n  if (config.autoPlace !== false) {\n    this._autoPlace = injector.get('autoPlace', false);\n  }\n\n  eventBus.on('create.end', 250, function(event) {\n    var context = event.context,\n        shape = context.shape;\n\n    if (!hasPrimaryModifier(event) || !contextPad.isOpen(shape)) {\n      return;\n    }\n\n    var entries = contextPad.getEntries(shape);\n\n    if (entries.replace) {\n      entries.replace.action.click(event, shape);\n    }\n  });\n\n  eventBus.on('contextPad.close', function() {\n    appendPreview.cleanUp();\n  });\n}\n\nContextPadProvider.$inject = [\n  'config.contextPad',\n  'injector',\n  'eventBus',\n  'contextPad',\n  'modeling',\n  'elementFactory',\n  'connect',\n  'create',\n  'popupMenu',\n  'canvas',\n  'rules',\n  'translate',\n  'appendPreview'\n];\n\n/**\n * @param {Element[]} elements\n *\n * @return {ContextPadEntries}\n */\nContextPadProvider.prototype.getMultiElementContextPadEntries = function(elements) {\n  var modeling = this._modeling;\n\n  var actions = {};\n\n  if (this._isDeleteAllowed(elements)) {\n    assign(actions, {\n      'delete': {\n        group: 'edit',\n        className: 'bpmn-icon-trash',\n        title: this._translate('Delete'),\n        action: {\n          click: function(event, elements) {\n            modeling.removeElements(elements.slice());\n          }\n        }\n      }\n    });\n  }\n\n  return actions;\n};\n\n/**\n * @param {Element[]} elements\n *\n * @return {boolean}\n */\nContextPadProvider.prototype._isDeleteAllowed = function(elements) {\n\n  var baseAllowed = this._rules.allowed('elements.delete', {\n    elements: elements\n  });\n\n  if (isArray(baseAllowed)) {\n    return every(elements, el => baseAllowed.includes(el));\n  }\n\n  return baseAllowed;\n};\n\n/**\n * @param {Element} element\n *\n * @return {ContextPadEntries}\n */\nContextPadProvider.prototype.getContextPadEntries = function(element) {\n  var contextPad = this._contextPad,\n      modeling = this._modeling,\n      elementFactory = this._elementFactory,\n      connect = this._connect,\n      create = this._create,\n      popupMenu = this._popupMenu,\n      autoPlace = this._autoPlace,\n      translate = this._translate,\n      appendPreview = this._appendPreview;\n\n  var actions = {};\n\n  if (element.type === 'label') {\n    if (this._isDeleteAllowed([ element ])) {\n      assign(actions, deleteAction());\n    }\n\n    return actions;\n  }\n\n  var businessObject = element.businessObject;\n\n  function startConnect(event, element) {\n    connect.start(event, element);\n  }\n\n  function removeElement(e, element) {\n    modeling.removeElements([ element ]);\n  }\n\n  function deleteAction() {\n    return {\n      'delete': {\n        group: 'edit',\n        className: 'bpmn-icon-trash',\n        title: translate('Delete'),\n        action: {\n          click: removeElement\n        }\n      }\n    };\n  }\n\n  function getReplaceMenuPosition(element) {\n\n    var Y_OFFSET = 5;\n\n    var pad = contextPad.getPad(element).html;\n\n    var padRect = pad.getBoundingClientRect();\n\n    var pos = {\n      x: padRect.left,\n      y: padRect.bottom + Y_OFFSET\n    };\n\n    return pos;\n  }\n\n  /**\n   * Create an append action.\n   *\n   * @param {string} type\n   * @param {string} className\n   * @param {string} title\n   * @param {Object} [options]\n   *\n   * @return {ContextPadEntry}\n   */\n  function appendAction(type, className, title, options) {\n\n    function appendStart(event, element) {\n\n      var shape = elementFactory.createShape(assign({ type: type }, options));\n\n      create.start(event, shape, {\n        source: element\n      });\n    }\n\n    var append = autoPlace ? function(_, element) {\n      var shape = elementFactory.createShape(assign({ type: type }, options));\n\n      autoPlace.append(element, shape);\n    } : appendStart;\n\n    var previewAppend = autoPlace ? function(_, element) {\n\n      // mouseover\n      appendPreview.create(element, type, options);\n\n      return () => {\n\n        // mouseout\n        appendPreview.cleanUp();\n      };\n    } : null;\n\n    return {\n      group: 'model',\n      className: className,\n      title: title,\n      action: {\n        dragstart: appendStart,\n        click: append,\n        hover: previewAppend\n      }\n    };\n  }\n\n  function splitLaneHandler(count) {\n\n    return function(_, element) {\n\n      // actual split\n      modeling.splitLane(element, count);\n\n      // refresh context pad after split to\n      // get rid of split icons\n      contextPad.open(element, true);\n    };\n  }\n\n\n  if (isAny(businessObject, [ 'bpmn:Lane', 'bpmn:Participant' ]) && isExpanded(element)) {\n\n    var childLanes = getChildLanes(element);\n\n    assign(actions, {\n      'lane-insert-above': {\n        group: 'lane-insert-above',\n        className: 'bpmn-icon-lane-insert-above',\n        title: translate('Add lane above'),\n        action: {\n          click: function(event, element) {\n            modeling.addLane(element, 'top');\n          }\n        }\n      }\n    });\n\n    if (childLanes.length < 2) {\n\n      if (isHorizontal(element) ? element.height >= 120 : element.width >= 120) {\n        assign(actions, {\n          'lane-divide-two': {\n            group: 'lane-divide',\n            className: 'bpmn-icon-lane-divide-two',\n            title: translate('Divide into two lanes'),\n            action: {\n              click: splitLaneHandler(2)\n            }\n          }\n        });\n      }\n\n      if (isHorizontal(element) ? element.height >= 180 : element.width >= 180) {\n        assign(actions, {\n          'lane-divide-three': {\n            group: 'lane-divide',\n            className: 'bpmn-icon-lane-divide-three',\n            title: translate('Divide into three lanes'),\n            action: {\n              click: splitLaneHandler(3)\n            }\n          }\n        });\n      }\n    }\n\n    assign(actions, {\n      'lane-insert-below': {\n        group: 'lane-insert-below',\n        className: 'bpmn-icon-lane-insert-below',\n        title: translate('Add lane below'),\n        action: {\n          click: function(event, element) {\n            modeling.addLane(element, 'bottom');\n          }\n        }\n      }\n    });\n\n  }\n\n  if (is(businessObject, 'bpmn:FlowNode')) {\n\n    if (is(businessObject, 'bpmn:EventBasedGateway')) {\n\n      assign(actions, {\n        'append.receive-task': appendAction(\n          'bpmn:ReceiveTask',\n          'bpmn-icon-receive-task',\n          translate('Append receive task')\n        ),\n        'append.message-intermediate-event': appendAction(\n          'bpmn:IntermediateCatchEvent',\n          'bpmn-icon-intermediate-event-catch-message',\n          translate('Append message intermediate catch event'),\n          { eventDefinitionType: 'bpmn:MessageEventDefinition' }\n        ),\n        'append.timer-intermediate-event': appendAction(\n          'bpmn:IntermediateCatchEvent',\n          'bpmn-icon-intermediate-event-catch-timer',\n          translate('Append timer intermediate catch event'),\n          { eventDefinitionType: 'bpmn:TimerEventDefinition' }\n        ),\n        'append.condition-intermediate-event': appendAction(\n          'bpmn:IntermediateCatchEvent',\n          'bpmn-icon-intermediate-event-catch-condition',\n          translate('Append conditional intermediate catch event'),\n          { eventDefinitionType: 'bpmn:ConditionalEventDefinition' }\n        ),\n        'append.signal-intermediate-event': appendAction(\n          'bpmn:IntermediateCatchEvent',\n          'bpmn-icon-intermediate-event-catch-signal',\n          translate('Append signal intermediate catch event'),\n          { eventDefinitionType: 'bpmn:SignalEventDefinition' }\n        )\n      });\n    } else if (isEventType(businessObject, 'bpmn:BoundaryEvent', 'bpmn:CompensateEventDefinition')) {\n\n      assign(actions, {\n        'append.compensation-activity':\n            appendAction(\n              'bpmn:Task',\n              'bpmn-icon-task',\n              translate('Append compensation activity'),\n              {\n                isForCompensation: true\n              }\n            )\n      });\n    } else if (!is(businessObject, 'bpmn:EndEvent') &&\n        !businessObject.isForCompensation &&\n        !isEventType(businessObject, 'bpmn:IntermediateThrowEvent', 'bpmn:LinkEventDefinition') &&\n        !isEventSubProcess(businessObject)) {\n\n      assign(actions, {\n        'append.end-event': appendAction(\n          'bpmn:EndEvent',\n          'bpmn-icon-end-event-none',\n          translate('Append end event')\n        ),\n        'append.gateway': appendAction(\n          'bpmn:ExclusiveGateway',\n          'bpmn-icon-gateway-none',\n          translate('Append gateway')\n        ),\n        'append.append-task': appendAction(\n          'bpmn:Task',\n          'bpmn-icon-task',\n          translate('Append task')\n        ),\n        'append.intermediate-event': appendAction(\n          'bpmn:IntermediateThrowEvent',\n          'bpmn-icon-intermediate-event-none',\n          translate('Append intermediate/boundary event')\n        )\n      });\n    }\n  }\n\n  if (!popupMenu.isEmpty(element, 'bpmn-replace')) {\n\n    // Replace menu entry\n    assign(actions, {\n      'replace': {\n        group: 'edit',\n        className: 'bpmn-icon-screw-wrench',\n        title: translate('Change element'),\n        action: {\n          click: function(event, element) {\n\n            var position = assign(getReplaceMenuPosition(element), {\n              cursor: { x: event.x, y: event.y }\n            });\n\n            popupMenu.open(element, 'bpmn-replace', position, {\n              title: translate('Change element'),\n              width: 300,\n              search: true\n            });\n          }\n        }\n      }\n    });\n  }\n\n  if (is(businessObject, 'bpmn:SequenceFlow')) {\n    assign(actions, {\n      'append.text-annotation': appendAction(\n        'bpmn:TextAnnotation',\n        'bpmn-icon-text-annotation',\n        translate('Add text annotation')\n      )\n    });\n  }\n\n  if (is(businessObject, 'bpmn:MessageFlow')) {\n    assign(actions, {\n      'append.text-annotation': appendAction(\n        'bpmn:TextAnnotation',\n        'bpmn-icon-text-annotation',\n        translate('Add text annotation')\n      )\n    });\n  }\n\n  if (\n    isAny(businessObject, [\n      'bpmn:FlowNode',\n      'bpmn:InteractionNode',\n      'bpmn:DataObjectReference',\n      'bpmn:DataStoreReference',\n    ])\n  ) {\n    assign(actions, {\n      'append.text-annotation': appendAction(\n        'bpmn:TextAnnotation',\n        'bpmn-icon-text-annotation',\n        translate('Add text annotation')\n      ),\n      'connect': {\n        group: 'connect',\n        className: 'bpmn-icon-connection-multi',\n        title: translate('Connect to other element'),\n        action: {\n          click: startConnect,\n          dragstart: startConnect,\n        },\n      },\n    });\n  }\n\n  if (is(businessObject, 'bpmn:TextAnnotation')) {\n    assign(actions, {\n      'connect': {\n        group: 'connect',\n        className: 'bpmn-icon-connection-multi',\n        title: translate('Connect using association'),\n        action: {\n          click: startConnect,\n          dragstart: startConnect,\n        },\n      },\n    });\n  }\n\n  if (isAny(businessObject, [ 'bpmn:DataObjectReference', 'bpmn:DataStoreReference' ])) {\n    assign(actions, {\n      'connect': {\n        group: 'connect',\n        className: 'bpmn-icon-connection-multi',\n        title: translate('Connect using data input association'),\n        action: {\n          click: startConnect,\n          dragstart: startConnect\n        }\n      }\n    });\n  }\n\n  if (is(businessObject, 'bpmn:Group')) {\n    assign(actions, {\n      'append.text-annotation': appendAction(\n        'bpmn:TextAnnotation',\n        'bpmn-icon-text-annotation',\n        translate('Add text annotation')\n      )\n    });\n  }\n\n  if (this._isDeleteAllowed([ element ])) {\n    assign(actions, deleteAction());\n  }\n\n  return actions;\n};\n\n\n// helpers /////////\n\n/**\n * @param {ModdleElement} businessObject\n * @param {string} type\n * @param {string} eventDefinitionType\n *\n * @return {boolean}\n */\nfunction isEventType(businessObject, type, eventDefinitionType) {\n\n  var isType = businessObject.$instanceOf(type);\n  var isDefinition = false;\n\n  var definitions = businessObject.eventDefinitions || [];\n  forEach(definitions, function(def) {\n    if (def.$type === eventDefinitionType) {\n      isDefinition = true;\n    }\n  });\n\n  return isType && isDefinition;\n}\n"
  },
  {
    "path": "lib/features/context-pad/index.js",
    "content": "import AppendPreviewModule from '../append-preview';\nimport DirectEditingModule from 'diagram-js-direct-editing';\nimport ContextPadModule from 'diagram-js/lib/features/context-pad';\nimport SelectionModule from 'diagram-js/lib/features/selection';\nimport ConnectModule from 'diagram-js/lib/features/connect';\nimport CreateModule from 'diagram-js/lib/features/create';\nimport PopupMenuModule from '../popup-menu';\n\nimport ContextPadProvider from './ContextPadProvider';\n\nexport default {\n  __depends__: [\n    AppendPreviewModule,\n    DirectEditingModule,\n    ContextPadModule,\n    SelectionModule,\n    ConnectModule,\n    CreateModule,\n    PopupMenuModule\n  ],\n  __init__: [ 'contextPadProvider' ],\n  contextPadProvider: [ 'type', ContextPadProvider ]\n};"
  },
  {
    "path": "lib/features/copy-paste/BpmnCopyPaste.js",
    "content": "import {\n  getBusinessObject,\n  getDi,\n  is\n} from '../../util/ModelUtil';\n\nimport { collectElementsAnnotations } from '../../util/AnnotationUtil';\n\nimport {\n  forEach,\n  isArray,\n  isUndefined,\n  omit,\n  reduce\n} from 'min-dash';\n\nimport { isLabel } from '../../util/LabelUtil';\n\n/**\n * @typedef {import('../modeling/BpmnFactory').default} BpmnFactory\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('./ModdleCopy').default} ModdleCopy\n */\n\nfunction copyProperties(source, target, properties) {\n  if (!isArray(properties)) {\n    properties = [ properties ];\n  }\n\n  forEach(properties, function(property) {\n    if (!isUndefined(source[property])) {\n      target[property] = source[property];\n    }\n  });\n}\n\nvar LOW_PRIORITY = 750;\n\n/**\n * BPMN-specific copy & paste.\n *\n * @param {BpmnFactory} bpmnFactory\n * @param {EventBus} eventBus\n * @param {ModdleCopy} moddleCopy\n */\nexport default function BpmnCopyPaste(bpmnFactory, eventBus, moddleCopy) {\n\n  function copy(bo, clone) {\n    var targetBo = bpmnFactory.create(bo.$type);\n\n    return moddleCopy.copyElement(bo, targetBo, null, clone);\n  }\n\n  eventBus.on('copyPaste.copyElement', LOW_PRIORITY, function(context) {\n    var descriptor = context.descriptor,\n        element = context.element,\n        businessObject = getBusinessObject(element);\n\n    // do not copy business object + di for labels;\n    // will be pulled from the referenced label target\n    if (isLabel(element)) {\n      return descriptor;\n    }\n\n    var businessObjectCopy = descriptor.businessObject = copy(businessObject, true);\n    var diCopy = descriptor.di = copy(getDi(element), true);\n    diCopy.bpmnElement = businessObjectCopy;\n\n    copyProperties(businessObjectCopy, descriptor, 'name');\n    copyProperties(diCopy, descriptor, 'isExpanded');\n\n    // default sequence flow\n    if (businessObject.default) {\n      descriptor.default = businessObject.default.id;\n    }\n  });\n\n  var referencesKey = '-bpmn-js-refs';\n\n  function getReferences(cache) {\n    return (cache[referencesKey] = cache[referencesKey] || {});\n  }\n\n  function setReferences(cache, references) {\n    cache[referencesKey] = references;\n  }\n\n  function resolveReferences(descriptor, cache, references) {\n    var businessObject = getBusinessObject(descriptor);\n\n    // default sequence flows\n    if (descriptor.default) {\n\n      // relationship cannot be resolved immediately\n      references[ descriptor.default ] = {\n        element: businessObject,\n        property: 'default'\n      };\n    }\n\n    // boundary events\n    if (descriptor.host) {\n\n      // relationship can be resolved immediately\n      getBusinessObject(descriptor).attachedToRef = getBusinessObject(cache[ descriptor.host ]);\n    }\n\n    return omit(references, reduce(references, function(array, reference, key) {\n      var element = reference.element,\n          property = reference.property;\n\n      if (key === descriptor.id) {\n        element.set(property, businessObject);\n\n        array.push(descriptor.id);\n      }\n\n      return array;\n    }, []));\n  }\n\n  eventBus.on('copyPaste.pasteElement', function(context) {\n    var cache = context.cache,\n        descriptor = context.descriptor,\n        businessObject = descriptor.businessObject,\n        di = descriptor.di;\n\n    // wire existing di + businessObject for external label\n    if (isLabel(descriptor)) {\n      descriptor.businessObject = getBusinessObject(cache[ descriptor.labelTarget ]);\n      descriptor.di = getDi(cache[ descriptor.labelTarget ]);\n\n      return;\n    }\n\n    businessObject = descriptor.businessObject = copy(businessObject);\n\n    di = descriptor.di = copy(di);\n    di.bpmnElement = businessObject;\n\n    copyProperties(descriptor, businessObject, [\n      'isExpanded',\n      'name'\n    ]);\n\n    descriptor.type = businessObject.$type;\n  });\n\n  // copy + paste processRef with participant\n\n  eventBus.on('copyPaste.copyElement', LOW_PRIORITY, function(context) {\n    var descriptor = context.descriptor,\n        element = context.element;\n\n    if (!is(element, 'bpmn:Participant')) {\n      return;\n    }\n\n    var participantBo = getBusinessObject(element);\n\n    if (participantBo.processRef) {\n      descriptor.processRef = copy(participantBo.processRef, true);\n    }\n  });\n\n  eventBus.on('copyPaste.pasteElement', function(context) {\n    var descriptor = context.descriptor,\n        processRef = descriptor.processRef;\n\n    if (processRef) {\n      descriptor.processRef = copy(processRef);\n    }\n  });\n\n  eventBus.on('copyPaste.createTree', function(context) {\n    var element = context.element,\n        children = context.children;\n\n    if (!is(element, 'bpmn:SubProcess')) {\n      return;\n    }\n\n    // add TextAnnotations to copy the closure,\n    // since by default they are children of a global process, not subprocess\n    forEach(collectElementsAnnotations(children), (entry) => {\n      children.push(entry.annotation);\n    });\n  });\n\n  // resolve references\n\n  eventBus.on('copyPaste.pasteElement', LOW_PRIORITY, function(context) {\n    var cache = context.cache,\n        descriptor = context.descriptor;\n\n    // resolve references e.g. default sequence flow\n    setReferences(\n      cache,\n      resolveReferences(descriptor, cache, getReferences(cache))\n    );\n  });\n\n}\n\n\nBpmnCopyPaste.$inject = [\n  'bpmnFactory',\n  'eventBus',\n  'moddleCopy'\n];"
  },
  {
    "path": "lib/features/copy-paste/ModdleCopy.js",
    "content": "import {\n  find,\n  forEach,\n  has,\n  isArray,\n  isDefined,\n  isObject,\n  matchPattern,\n  reduce,\n  sortBy\n} from 'min-dash';\n\nimport { is } from '../../util/ModelUtil';\n\nconst DISALLOWED_PROPERTIES = [\n  'artifacts',\n  'dataInputAssociations',\n  'dataOutputAssociations',\n  'default',\n  'flowElements',\n  'lanes',\n  'incoming',\n  'outgoing',\n  'categoryValue'\n];\n\nconst ALLOWED_REFERENCES = [\n  'errorRef',\n  'escalationRef',\n  'messageRef',\n  'signalRef',\n  'dataObjectRef'\n];\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../modeling/BpmnFactory').default} BpmnFactory\n * @typedef {import('../../model/Types').Moddle} Moddle\n *\n * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n */\n\n/**\n * Utility for copying model properties from source element to target element.\n *\n * @param {EventBus} eventBus\n * @param {BpmnFactory} bpmnFactory\n * @param {Moddle} moddle\n */\nexport default function ModdleCopy(eventBus, bpmnFactory, moddle) {\n  this._bpmnFactory = bpmnFactory;\n  this._eventBus = eventBus;\n  this._moddle = moddle;\n\n  // copy extension elements last\n  eventBus.on('moddleCopy.canCopyProperties', (context) => {\n    const { propertyNames } = context;\n\n    if (!propertyNames || !propertyNames.length) {\n      return;\n    }\n\n    return sortBy(propertyNames, (propertyName) => {\n      return propertyName === 'extensionElements';\n    });\n  });\n\n  // default check whether property can be copied\n  eventBus.on('moddleCopy.canCopyProperty', (context) => {\n    const {\n      parent,\n      property,\n      propertyName\n    } = context;\n\n    const parentDescriptor = isObject(parent) && parent.$descriptor;\n\n    if (propertyName && ALLOWED_REFERENCES.includes(propertyName)) {\n\n      // allow copying reference\n      return property;\n    }\n\n    if (propertyName && DISALLOWED_PROPERTIES.includes(propertyName)) {\n\n      // disallow copying property\n      return false;\n    }\n\n    if (propertyName &&\n      parentDescriptor &&\n      !find(parentDescriptor.properties, matchPattern({ name: propertyName }))) {\n\n      // disallow copying property\n      return false;\n    }\n  });\n\n  // do NOT allow to copy empty extension elements\n  eventBus.on('moddleCopy.canSetCopiedProperty', (context) => {\n    const { property } = context;\n\n    if (is(property, 'bpmn:ExtensionElements') && (!property.values || !property.values.length)) {\n\n      // disallow setting copied property\n      return false;\n    }\n  });\n}\n\nModdleCopy.$inject = [\n  'eventBus',\n  'bpmnFactory',\n  'moddle'\n];\n\n/**\n * Copy model properties of source element to target element.\n *\n * @param {ModdleElement} sourceElement\n * @param {ModdleElement} targetElement\n * @param {string[]} [propertyNames]\n * @param {boolean} [clone=false]\n *\n * @return {ModdleElement}\n */\nModdleCopy.prototype.copyElement = function(sourceElement, targetElement, propertyNames, clone = false) {\n  if (propertyNames && !isArray(propertyNames)) {\n    propertyNames = [ propertyNames ];\n  }\n\n  propertyNames = propertyNames || getPropertyNames(sourceElement.$descriptor);\n\n  const canCopyProperties = this._eventBus.fire('moddleCopy.canCopyProperties', {\n    propertyNames: propertyNames,\n    sourceElement: sourceElement,\n    targetElement: targetElement,\n    clone: clone\n  });\n\n  if (canCopyProperties === false) {\n    return targetElement;\n  }\n\n  if (isArray(canCopyProperties)) {\n    propertyNames = canCopyProperties;\n  }\n\n  // copy properties\n  forEach(propertyNames, (propertyName) => {\n    let sourceProperty;\n\n    if (has(sourceElement, propertyName)) {\n      sourceProperty = sourceElement.get(propertyName);\n    }\n\n    const copiedProperty = this.copyProperty(sourceProperty, targetElement, propertyName, clone);\n\n    if (!isDefined(copiedProperty)) {\n      return;\n    }\n\n    const canSetProperty = this._eventBus.fire('moddleCopy.canSetCopiedProperty', {\n      parent: targetElement,\n      property: copiedProperty,\n      propertyName: propertyName\n    });\n\n    if (canSetProperty === false) {\n      return;\n    }\n\n    // TODO(nikku): unclaim old IDs if ID property is copied over\n    // this._moddle.getPropertyDescriptor(parent, propertyName)\n    targetElement.set(propertyName, copiedProperty);\n  });\n\n  return targetElement;\n};\n\n/**\n * Copy model property.\n *\n * @param {any} property\n * @param {ModdleElement} parent\n * @param {string} propertyName\n * @param {boolean} [clone=false]\n *\n * @return {any}\n */\nModdleCopy.prototype.copyProperty = function(property, parent, propertyName, clone = false) {\n\n  // allow others to copy property\n  let copiedProperty = this._eventBus.fire('moddleCopy.canCopyProperty', {\n    parent: parent,\n    property: property,\n    propertyName: propertyName,\n    clone: clone\n  });\n\n  // return if copying is NOT allowed\n  if (copiedProperty === false) {\n    return;\n  }\n\n  if (copiedProperty) {\n    if (isObject(copiedProperty) && copiedProperty.$type && !copiedProperty.$parent) {\n      copiedProperty.$parent = parent;\n    }\n\n    return copiedProperty;\n  }\n\n  const propertyDescriptor = this._moddle.getPropertyDescriptor(parent, propertyName);\n\n  // do NOT copy references\n  if (propertyDescriptor.isReference) {\n    return;\n  }\n\n  // copy id\n  if (propertyDescriptor.isId) {\n    return property && this._copyId(property, parent, clone);\n  }\n\n  // copy arrays\n  if (isArray(property)) {\n    return reduce(property, (childProperties, childProperty) => {\n\n      // recursion\n      const copiedProperty = this.copyProperty(childProperty, parent, propertyName, clone);\n\n      // copying might NOT be allowed\n      if (copiedProperty) {\n        return childProperties.concat(copiedProperty);\n      }\n\n      return childProperties;\n    }, []);\n  }\n\n  // copy model elements\n  if (isObject(property) && property.$type) {\n    if (this._moddle.getElementDescriptor(property).isGeneric) {\n      return;\n    }\n\n    copiedProperty = this._bpmnFactory.create(property.$type);\n\n    copiedProperty.$parent = parent;\n\n    // recursion\n    copiedProperty = this.copyElement(property, copiedProperty, null, clone);\n\n    return copiedProperty;\n  }\n\n  // copy primitive properties\n  return property;\n};\n\nModdleCopy.prototype._copyId = function(id, element, clone = false) {\n  if (clone) {\n    return id;\n  }\n\n  // disallow if already taken\n  if (this._moddle.ids.assigned(id)) {\n    return;\n  } else {\n\n    this._moddle.ids.claim(id, element);\n    return id;\n  }\n};\n\n// helpers //////////\n\nexport function getPropertyNames(descriptor, keepDefaultProperties) {\n  return reduce(descriptor.properties, (properties, property) => {\n\n    if (keepDefaultProperties && property.default) {\n      return properties;\n    }\n\n    return properties.concat(property.name);\n  }, []);\n}"
  },
  {
    "path": "lib/features/copy-paste/index.js",
    "content": "import CopyPasteModule from 'diagram-js/lib/features/copy-paste';\n\nimport BpmnCopyPaste from './BpmnCopyPaste';\nimport ModdleCopy from './ModdleCopy';\n\nexport default {\n  __depends__: [\n    CopyPasteModule\n  ],\n  __init__: [ 'bpmnCopyPaste', 'moddleCopy' ],\n  bpmnCopyPaste: [ 'type', BpmnCopyPaste ],\n  moddleCopy: [ 'type', ModdleCopy ]\n};\n"
  },
  {
    "path": "lib/features/di-ordering/BpmnDiOrdering.js",
    "content": "import { getDi } from '../../util/ModelUtil';\n\nimport {\n  filter,\n  forEach,\n  map\n} from 'min-dash';\n\nimport { selfAndAllChildren } from 'diagram-js/lib/util/Elements';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n */\n\nvar HIGH_PRIORITY = 2000;\n\n/**\n * @param {EventBus} eventBus\n * @param {Canvas} canvas\n */\nexport default function BpmnDiOrdering(eventBus, canvas) {\n\n  eventBus.on('saveXML.start', HIGH_PRIORITY, orderDi);\n\n  function orderDi() {\n    var rootElements = canvas.getRootElements();\n\n    forEach(rootElements, function(root) {\n      var rootDi = getDi(root),\n          elements,\n          diElements;\n\n      elements = selfAndAllChildren([ root ], false);\n\n      // only bpmndi:Shape and bpmndi:Edge can be direct children of bpmndi:Plane\n      elements = filter(elements, function(element) {\n        return element !== root && !element.labelTarget;\n      });\n\n      diElements = map(elements, getDi);\n\n      rootDi.set('planeElement', diElements);\n    });\n  }\n}\n\nBpmnDiOrdering.$inject = [ 'eventBus', 'canvas' ];\n"
  },
  {
    "path": "lib/features/di-ordering/index.js",
    "content": "import BpmnDiOrdering from '../di-ordering/BpmnDiOrdering';\n\nexport default {\n  __init__: [\n    'bpmnDiOrdering'\n  ],\n  bpmnDiOrdering: [ 'type', BpmnDiOrdering ]\n};"
  },
  {
    "path": "lib/features/distribute-elements/BpmnDistributeElements.js",
    "content": "import inherits from 'inherits-browser';\n\nimport RuleProvider from 'diagram-js/lib/features/rules/RuleProvider';\nimport { getParents } from 'diagram-js/lib/util/Elements';\n\nimport {\n  filter\n} from 'min-dash';\n\nimport {\n  isAny\n} from '../modeling/util/ModelingUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n */\n\n/**\n * Registers element exclude filters for elements that currently do not support\n * distribution.\n *\n * @param {EventBus} eventBus\n */\nexport default function BpmnDistributeElements(eventBus) {\n  RuleProvider.call(this, eventBus);\n}\n\nBpmnDistributeElements.$inject = [ 'eventBus' ];\n\ninherits(BpmnDistributeElements, RuleProvider);\n\nBpmnDistributeElements.prototype.init = function() {\n  this.addRule('elements.distribute', function(context) {\n    var elements = context.elements;\n\n    elements = filter(elements, function(element) {\n      var cannotDistribute = isAny(element, [\n        'bpmn:Association',\n        'bpmn:BoundaryEvent',\n        'bpmn:DataInputAssociation',\n        'bpmn:DataOutputAssociation',\n        'bpmn:Lane',\n        'bpmn:MessageFlow',\n        'bpmn:SequenceFlow',\n        'bpmn:TextAnnotation'\n      ]);\n\n      return !(element.labelTarget || cannotDistribute);\n    });\n\n    // filter out elements which are children of any of the selected elements\n    elements = getParents(elements);\n\n    if (elements.length < 3) {\n      return false;\n    }\n\n    return elements;\n  });\n};\n"
  },
  {
    "path": "lib/features/distribute-elements/DistributeElementsIcons.js",
    "content": "/**\n * To change the icons, modify the SVGs in `./resources`, execute `npx svgo -f resources --datauri enc -o dist`,\n * and then replace respective icons with the optimized data URIs in `./dist`.\n */\nvar icons = {\n  horizontal: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n                <polyline points=\"450 400 450 150 1350 150 1350 400\" style=\"fill:none;stroke:currentColor;stroke-width:100;stroke-linejoin:round;\"/>\n                <rect x=\"150\" y=\"450\" width=\"600\" height=\"1200\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n                <rect x=\"1050\" y=\"450\" width=\"600\" height=\"800\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n              </svg>`,\n  vertical: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n              <polyline points=\"400 1350 150 1350 150 450 400 450\" style=\"fill:none;stroke:currentColor;stroke-width:100;stroke-linejoin:round;\"/>\n              <rect x=\"450\" y=\"150\" width=\"1200\" height=\"600\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n              <rect x=\"450\" y=\"1050\" width=\"800\" height=\"600\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n            </svg>`\n};\n\nexport default icons;\n"
  },
  {
    "path": "lib/features/distribute-elements/DistributeElementsMenuProvider.js",
    "content": "import ICONS from './DistributeElementsIcons';\n\nimport { assign } from 'min-dash';\n\n/**\n * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').default} PopupMenu\n * @typedef {import('./BpmnDistributeElements').default} DistributeElements\n * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n * @typedef {import('diagram-js/lib/features/rules/Rules').default} Rules\n *\n * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').PopupMenuEntries} PopupMenuEntries\n * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').default} PopupMenuProvider\n * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').PopupMenuTarget} PopupMenuTarget\n */\n\nvar LOW_PRIORITY = 900;\n\n/**\n * A provider for the distribute elements popup menu.\n *\n * @implements {PopupMenuProvider}\n *\n * @param {PopupMenu} popupMenu\n * @param {DistributeElements} distributeElements\n * @param {Translate} translate\n * @param {Rules} rules\n */\nexport default function DistributeElementsMenuProvider(\n    popupMenu, distributeElements, translate, rules) {\n  this._distributeElements = distributeElements;\n  this._translate = translate;\n  this._popupMenu = popupMenu;\n  this._rules = rules;\n\n  popupMenu.registerProvider('align-elements', LOW_PRIORITY, this);\n}\n\nDistributeElementsMenuProvider.$inject = [\n  'popupMenu',\n  'distributeElements',\n  'translate',\n  'rules'\n];\n\n/**\n * @param {PopupMenuTarget} target\n *\n * @return {PopupMenuEntries}\n */\nDistributeElementsMenuProvider.prototype.getPopupMenuEntries = function(target) {\n  var entries = {};\n\n  if (this._isAllowed(target)) {\n    assign(entries, this._getEntries(target));\n  }\n\n  return entries;\n};\n\nDistributeElementsMenuProvider.prototype._isAllowed = function(elements) {\n  return this._rules.allowed('elements.distribute', { elements: elements });\n};\n\nDistributeElementsMenuProvider.prototype._getEntries = function(elements) {\n  var distributeElements = this._distributeElements,\n      translate = this._translate,\n      popupMenu = this._popupMenu;\n\n  var entries = {\n    'distribute-elements-horizontal': {\n      group: 'distribute',\n      title: translate('Distribute elements horizontally'),\n      className: 'bjs-align-elements-menu-entry',\n      imageHtml: ICONS['horizontal'],\n      action: function(event, entry) {\n        distributeElements.trigger(elements, 'horizontal');\n        popupMenu.close();\n      }\n    },\n    'distribute-elements-vertical': {\n      group: 'distribute',\n      title: translate('Distribute elements vertically'),\n      imageHtml: ICONS['vertical'],\n      action: function(event, entry) {\n        distributeElements.trigger(elements, 'vertical');\n        popupMenu.close();\n      }\n    },\n  };\n\n  return entries;\n};\n"
  },
  {
    "path": "lib/features/distribute-elements/index.js",
    "content": "import DistributeElementsModule from 'diagram-js/lib/features/distribute-elements';\nimport PopupMenuModule from 'diagram-js/lib/features/popup-menu';\n\nimport BpmnDistributeElements from './BpmnDistributeElements';\nimport DistributeElementsMenuProvider from './DistributeElementsMenuProvider';\n\n\nexport default {\n  __depends__: [\n    PopupMenuModule,\n    DistributeElementsModule\n  ],\n  __init__: [\n    'bpmnDistributeElements',\n    'distributeElementsMenuProvider'\n  ],\n  bpmnDistributeElements: [ 'type', BpmnDistributeElements ],\n  distributeElementsMenuProvider: [ 'type', DistributeElementsMenuProvider ]\n};\n"
  },
  {
    "path": "lib/features/drilldown/DrilldownBreadcrumbs.js",
    "content": "import { domify, classes } from 'min-dom';\nimport { find } from 'min-dash';\n\nimport { escapeHTML } from 'diagram-js/lib/util/EscapeUtil';\nimport { getBusinessObject, is } from '../../util/ModelUtil';\nimport {\n  getPlaneIdFromShape\n} from '../../util/DrilldownUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n *\n * @typedef {import('../../model/Types').Element} Element\n * @typedef {import('../../model/Types').Shape} Shape\n */\n\nvar OPEN_CLASS = 'bjs-breadcrumbs-shown';\n\n\n/**\n * Adds overlays that allow switching planes on collapsed subprocesses.\n *\n * @param {EventBus} eventBus\n * @param {ElementRegistry} elementRegistry\n * @param {Canvas} canvas\n */\nexport default function DrilldownBreadcrumbs(eventBus, elementRegistry, canvas) {\n  var breadcrumbs = domify('<ul class=\"bjs-breadcrumbs\"></ul>');\n  var container = canvas.getContainer();\n  var containerClasses = classes(container);\n  container.appendChild(breadcrumbs);\n\n  var businessObjectParents = [];\n\n  // update breadcrumbs if name or ID of the primary shape changes\n  eventBus.on('element.changed', function(event) {\n    var shape = event.element,\n        businessObject = getBusinessObject(shape);\n\n    var isPresent = find(businessObjectParents, function(element) {\n      return element === businessObject;\n    });\n\n    if (!isPresent) {\n      return;\n    }\n\n    updateBreadcrumbs();\n  });\n\n  /**\n   * Updates the displayed breadcrumbs. If no element is provided, only the\n   * labels are updated.\n   *\n   * @param {Element} [element]\n   */\n  function updateBreadcrumbs(element) {\n    if (element) {\n      businessObjectParents = getBusinessObjectParentChain(element);\n    }\n\n    var path = businessObjectParents.flatMap(function(parent) {\n      var parentPlane =\n        canvas.findRoot(getPlaneIdFromShape(parent)) ||\n        canvas.findRoot(parent.id);\n\n      // when the root is a collaboration, the process does not have a\n      // corresponding element in the elementRegisty. Instead, we search\n      // for the corresponding participant\n      if (!parentPlane && is(parent, 'bpmn:Process')) {\n        var participant = elementRegistry.find(function(element) {\n          var businessObject = getBusinessObject(element);\n\n          return businessObject && businessObject.get('processRef') === parent;\n        });\n\n        parentPlane = participant && canvas.findRoot(participant.id);\n      }\n\n      if (!parentPlane) {\n        return [];\n      }\n\n      var title = escapeHTML(parent.name || parent.id);\n      var link = domify('<li><span class=\"bjs-crumb\"><a title=\"' + title + '\">' + title + '</a></span></li>');\n\n      link.addEventListener('click', function() {\n        canvas.setRootElement(parentPlane);\n      });\n\n      return link;\n    });\n\n    breadcrumbs.innerHTML = '';\n\n    // show breadcrumbs and expose state to .djs-container\n    var visible = path.length > 1;\n\n    containerClasses.toggle(OPEN_CLASS, visible);\n\n    path.forEach(function(element) {\n      breadcrumbs.appendChild(element);\n    });\n  }\n\n  eventBus.on('root.set', function(event) {\n    updateBreadcrumbs(event.element);\n  });\n\n}\n\nDrilldownBreadcrumbs.$inject = [ 'eventBus', 'elementRegistry', 'canvas' ];\n\n\n// helpers //////////\n\n/**\n * Returns the parents for the element using the business object chain,\n * starting with the root element.\n *\n * @param {Shape} child\n *\n * @return {Shape}\n */\nfunction getBusinessObjectParentChain(child) {\n  var businessObject = getBusinessObject(child);\n\n  var parents = [];\n\n  for (var element = businessObject; element; element = element.$parent) {\n    if (is(element, 'bpmn:SubProcess') || is(element, 'bpmn:Process')) {\n      parents.push(element);\n    }\n  }\n\n  return parents.reverse();\n}"
  },
  {
    "path": "lib/features/drilldown/DrilldownCentering.js",
    "content": "import { is } from '../../util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n */\n\n/**\n * Move collapsed subprocesses into view when drilling down.\n *\n * Zoom and scroll are saved in a session.\n *\n * @param {EventBus} eventBus\n * @param {Canvas} canvas\n */\nexport default function DrilldownCentering(eventBus, canvas) {\n\n  var currentRoot = null;\n  var positionMap = new Map();\n\n  eventBus.on('root.set', function(event) {\n    var newRoot = event.element;\n    var currentViewbox = canvas.viewbox();\n    var storedViewbox = positionMap.get(newRoot);\n\n    positionMap.set(currentRoot, {\n      x: currentViewbox.x,\n      y: currentViewbox.y,\n      zoom: currentViewbox.scale\n    });\n\n    currentRoot = newRoot;\n\n    // Keep viewbox when replacing root elements\n    if (!is(newRoot, 'bpmn:SubProcess') && !storedViewbox) {\n      return;\n    }\n\n    storedViewbox = storedViewbox || { x: 0, y: 0, zoom: 1 };\n\n    var dx = (currentViewbox.x - storedViewbox.x) * currentViewbox.scale,\n        dy = (currentViewbox.y - storedViewbox.y) * currentViewbox.scale;\n\n    if (dx !== 0 || dy !== 0) {\n      canvas.scroll({\n        dx: dx,\n        dy: dy\n      });\n    }\n\n    if (storedViewbox.zoom !== currentViewbox.scale) {\n      canvas.zoom(storedViewbox.zoom, { x: 0, y: 0 });\n    }\n  });\n\n  eventBus.on('diagram.clear', function() {\n    positionMap.clear();\n    currentRoot = null;\n  });\n\n}\n\nDrilldownCentering.$inject = [ 'eventBus', 'canvas' ];\n\n\n/**\n * ES5 Map implementation. Works.\n */\nfunction Map() {\n\n  this._entries = [];\n\n  this.set = function(key, value) {\n\n    var found = false;\n\n    for (var k in this._entries) {\n      if (this._entries[k][0] === key) {\n        this._entries[k][1] = value;\n\n        found = true;\n\n        break;\n      }\n    }\n\n    if (!found) {\n      this._entries.push([ key, value ]);\n    }\n  };\n\n  this.get = function(key) {\n\n    for (var k in this._entries) {\n      if (this._entries[k][0] === key) {\n        return this._entries[k][1];\n      }\n    }\n\n    return null;\n  };\n\n  this.clear = function() {\n    this._entries.length = 0;\n  };\n\n  this.remove = function(key) {\n\n    var idx = -1;\n\n    for (var k in this._entries) {\n      if (this._entries[k][0] === key) {\n        idx = k;\n\n        break;\n      }\n    }\n\n    if (idx !== -1) {\n      this._entries.splice(idx, 1);\n    }\n  };\n}"
  },
  {
    "path": "lib/features/drilldown/DrilldownOverlayBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\nimport { getBusinessObject, is } from '../../util/ModelUtil';\nimport { classes, domify } from 'min-dom';\nimport { getPlaneIdFromShape } from '../../util/DrilldownUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('diagram-js/lib/features/overlays/Overlays').default} Overlays\n * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n *\n * @typedef {import('../../model/Types').Element} Element\n * @typedef {import('../../model/Types').Parent} Parent\n * @typedef {import('../../model/Types').Shape} Shape\n */\n\nvar LOW_PRIORITY = 250;\nvar ARROW_DOWN_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M4.81801948,3.50735931 L10.4996894,9.1896894 L10.5,4 L12,4 L12,12 L4,12 L4,10.5 L9.6896894,10.4996894 L3.75735931,4.56801948 C3.46446609,4.27512627 3.46446609,3.80025253 3.75735931,3.50735931 C4.05025253,3.21446609 4.52512627,3.21446609 4.81801948,3.50735931 Z\"/></svg>';\n\nvar EMPTY_MARKER = 'bjs-drilldown-empty';\n\n/**\n * @param {Canvas} canvas\n * @param {EventBus} eventBus\n * @param {ElementRegistry} elementRegistry\n * @param {Overlays} overlays\n * @param {Translate} translate\n */\nexport default function DrilldownOverlayBehavior(\n    canvas, eventBus, elementRegistry, overlays, translate\n) {\n  CommandInterceptor.call(this, eventBus);\n\n  this._canvas = canvas;\n  this._eventBus = eventBus;\n  this._elementRegistry = elementRegistry;\n  this._overlays = overlays;\n  this._translate = translate;\n\n  var self = this;\n\n  this.executed('shape.toggleCollapse', LOW_PRIORITY, function(context) {\n    var shape = context.shape;\n\n    // Add overlay to the collapsed shape\n    if (self._canDrillDown(shape)) {\n      self._addOverlay(shape);\n    } else {\n      self._removeOverlay(shape);\n    }\n  }, true);\n\n\n  this.reverted('shape.toggleCollapse', LOW_PRIORITY, function(context) {\n    var shape = context.shape;\n\n    // Add overlay to the collapsed shape\n    if (self._canDrillDown(shape)) {\n      self._addOverlay(shape);\n    } else {\n      self._removeOverlay(shape);\n    }\n  }, true);\n\n\n  this.executed([ 'shape.create', 'shape.move', 'shape.delete' ], LOW_PRIORITY,\n    function(context) {\n      var oldParent = context.oldParent,\n          newParent = context.newParent || context.parent,\n          shape = context.shape;\n\n      // Add overlay to the collapsed shape\n      if (self._canDrillDown(shape)) {\n        self._addOverlay(shape);\n      }\n\n      self._updateDrilldownOverlay(oldParent);\n      self._updateDrilldownOverlay(newParent);\n      self._updateDrilldownOverlay(shape);\n    }, true);\n\n\n  this.reverted([ 'shape.create', 'shape.move', 'shape.delete' ], LOW_PRIORITY,\n    function(context) {\n      var oldParent = context.oldParent,\n          newParent = context.newParent || context.parent,\n          shape = context.shape;\n\n      // Add overlay to the collapsed shape\n      if (self._canDrillDown(shape)) {\n        self._addOverlay(shape);\n      }\n\n      self._updateDrilldownOverlay(oldParent);\n      self._updateDrilldownOverlay(newParent);\n      self._updateDrilldownOverlay(shape);\n    }, true);\n\n\n  eventBus.on('import.render.complete', function() {\n    elementRegistry.filter(function(e) {\n      return self._canDrillDown(e);\n    }).map(function(el) {\n      self._addOverlay(el);\n    });\n  });\n\n}\n\ninherits(DrilldownOverlayBehavior, CommandInterceptor);\n\n/**\n * @param {Shape} shape\n */\nDrilldownOverlayBehavior.prototype._updateDrilldownOverlay = function(shape) {\n  var canvas = this._canvas;\n\n  if (!shape) {\n    return;\n  }\n\n  var root = canvas.findRoot(shape);\n\n  if (root) {\n    this._updateOverlayVisibility(root);\n  }\n};\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nDrilldownOverlayBehavior.prototype._canDrillDown = function(element) {\n  var canvas = this._canvas;\n\n  return is(element, 'bpmn:SubProcess') && canvas.findRoot(getPlaneIdFromShape(element));\n};\n\n/**\n * Update the visibility of the drilldown overlay. If the plane has no elements,\n * the drilldown will only be shown when the element is selected.\n *\n * @param {Parent} element The collapsed root or shape.\n */\nDrilldownOverlayBehavior.prototype._updateOverlayVisibility = function(element) {\n  var overlays = this._overlays;\n\n  var businessObject = getBusinessObject(element);\n\n  var overlay = overlays.get({ element: businessObject.id, type: 'drilldown' })[0];\n\n  if (!overlay) {\n    return;\n  }\n\n  var hasFlowElements = businessObject\n    && businessObject.get('flowElements')\n    && businessObject.get('flowElements').length;\n\n  classes(overlay.html).toggle(EMPTY_MARKER, !hasFlowElements);\n};\n\n/**\n * Add a drilldown button to the given element assuming the plane has the same\n * ID as the element.\n *\n * @param {Shape} element The collapsed shape.\n */\nDrilldownOverlayBehavior.prototype._addOverlay = function(element) {\n  var canvas = this._canvas,\n      overlays = this._overlays,\n      bo = getBusinessObject(element);\n\n  var existingOverlays = overlays.get({ element: element, type: 'drilldown' });\n\n  if (existingOverlays.length) {\n    this._removeOverlay(element);\n  }\n\n  var button = domify('<button type=\"button\" class=\"bjs-drilldown\">' + ARROW_DOWN_SVG + '</button>'),\n      elementName = bo.get('name') || bo.get('id'),\n      title = this._translate('Open {element}', { element: elementName });\n  button.setAttribute('title', title);\n\n  button.addEventListener('click', function() {\n    canvas.setRootElement(canvas.findRoot(getPlaneIdFromShape(element)));\n  });\n\n  overlays.add(element, 'drilldown', {\n    position: {\n      bottom: -7,\n      right: -8\n    },\n    html: button\n  });\n\n  this._updateOverlayVisibility(element);\n};\n\nDrilldownOverlayBehavior.prototype._removeOverlay = function(element) {\n  var overlays = this._overlays;\n\n  overlays.remove({\n    element: element,\n    type: 'drilldown'\n  });\n};\n\nDrilldownOverlayBehavior.$inject = [\n  'canvas',\n  'eventBus',\n  'elementRegistry',\n  'overlays',\n  'translate'\n];"
  },
  {
    "path": "lib/features/drilldown/SubprocessCompatibility.js",
    "content": "\nimport { asBounds, asTRBL } from 'diagram-js/lib/layout/LayoutUtil';\nimport { is, isAny } from '../../util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../../model/Types').Moddle} Moddle\n *\n * @typedef {import('../../model/Types').Element} Element\n * @typedef {import('../../model/Types').Shape} Shape\n *\n * @typedef {import('diagram-js/lib/core/Canvas').CanvasPlane} CanvasPlane\n *\n * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n */\n\nvar DEFAULT_POSITION = {\n  x: 180,\n  y: 160\n};\n\n/**\n * Hook into `import.render.start` and create new planes for diagrams with\n * collapsed subprocesses and all DI elements on the same plane.\n *\n * @param {EventBus} eventBus\n * @param {Moddle} moddle\n */\nexport default function SubprocessCompatibility(eventBus, moddle) {\n  this._eventBus = eventBus;\n  this._moddle = moddle;\n\n  var self = this;\n\n  eventBus.on('import.render.start', 1500, function(e, context) {\n    self._handleImport(context.definitions);\n  });\n}\n\n/**\n * @param {ModdleElement} definitions\n */\nSubprocessCompatibility.prototype._handleImport = function(definitions) {\n  if (!definitions.diagrams) {\n    return;\n  }\n\n  var self = this;\n  this._definitions = definitions;\n  this._processToDiagramMap = {};\n\n  definitions.diagrams.forEach(function(diagram) {\n    if (!diagram.plane || !diagram.plane.bpmnElement) {\n      return;\n    }\n\n    self._processToDiagramMap[diagram.plane.bpmnElement.id] = diagram;\n  });\n\n  var newDiagrams = definitions.diagrams\n    .filter(diagram => diagram.plane)\n    .flatMap(diagram => self._createNewDiagrams(diagram.plane));\n\n  newDiagrams.forEach(function(diagram) {\n    self._movePlaneElementsToOrigin(diagram.plane);\n  });\n};\n\n\n/**\n * Moves all DI elements from collapsed subprocesses to a new plane.\n *\n * @param {CanvasPlane} plane\n *\n * @return {ModdleElement[]} new diagrams created for the collapsed subprocesses\n */\nSubprocessCompatibility.prototype._createNewDiagrams = function(plane) {\n  var self = this;\n\n  var collapsedElements = [];\n  var elementsToMove = [];\n\n  plane.get('planeElement').forEach(function(diElement) {\n    var businessObject = diElement.bpmnElement;\n\n    if (!businessObject) {\n      return;\n    }\n\n    var parent = businessObject.$parent;\n\n    if (is(businessObject, 'bpmn:SubProcess') && !diElement.isExpanded) {\n      collapsedElements.push(businessObject);\n    }\n\n    if (shouldMoveToPlane(businessObject, plane)) {\n\n      // don't change the array while we iterate over it\n      elementsToMove.push({ diElement: diElement, parent: parent });\n    }\n  });\n\n  var newDiagrams = [];\n\n  // create new planes for all collapsed subprocesses, even when they are empty\n  collapsedElements.forEach(function(element) {\n    if (!self._processToDiagramMap[ element.id ]) {\n      var diagram = self._createDiagram(element);\n\n      self._processToDiagramMap[element.id] = diagram;\n\n      newDiagrams.push(diagram);\n    }\n  });\n\n  elementsToMove.forEach(function(element) {\n    var diElement = element.diElement;\n    var parent = element.parent;\n\n    // parent is expanded, get nearest collapsed parent\n    while (parent && collapsedElements.indexOf(parent) === -1) {\n      parent = parent.$parent;\n    }\n\n    // false positive, all parents are expanded\n    if (!parent) {\n      return;\n    }\n\n    var diagram = self._processToDiagramMap[ parent.id ];\n\n    self._moveToDiPlane(diElement, diagram.plane);\n  });\n\n  return newDiagrams;\n};\n\n/**\n * @param {CanvasPlane} plane\n */\nSubprocessCompatibility.prototype._movePlaneElementsToOrigin = function(plane) {\n  var elements = plane.get('planeElement');\n\n  // get bounding box of all elements\n  var planeBounds = getPlaneBounds(plane);\n\n  var offset = {\n    x: planeBounds.x - DEFAULT_POSITION.x,\n    y: planeBounds.y - DEFAULT_POSITION.y\n  };\n\n  elements.forEach(function(diElement) {\n    if (diElement.waypoint) {\n      diElement.waypoint.forEach(function(waypoint) {\n        waypoint.x = waypoint.x - offset.x;\n        waypoint.y = waypoint.y - offset.y;\n      });\n    } else if (diElement.bounds) {\n      diElement.bounds.x = diElement.bounds.x - offset.x;\n      diElement.bounds.y = diElement.bounds.y - offset.y;\n    }\n  });\n};\n\n/**\n * @param {ModdleElement} diElement\n * @param {CanvasPlane} newPlane\n */\nSubprocessCompatibility.prototype._moveToDiPlane = function(diElement, newPlane) {\n  var containingDiagram = findRootDiagram(diElement);\n\n  // remove DI from old Plane and add it to the new one\n  var parentPlaneElement = containingDiagram.plane.get('planeElement');\n\n  parentPlaneElement.splice(parentPlaneElement.indexOf(diElement), 1);\n\n  newPlane.get('planeElement').push(diElement);\n};\n\n/**\n * @param {ModdleElement} businessObject\n *\n * @return {ModdleElement}\n */\nSubprocessCompatibility.prototype._createDiagram = function(businessObject) {\n  var plane = this._moddle.create('bpmndi:BPMNPlane', {\n    bpmnElement: businessObject\n  });\n\n  var diagram = this._moddle.create('bpmndi:BPMNDiagram', {\n    plane: plane\n  });\n\n  plane.$parent = diagram;\n\n  plane.bpmnElement = businessObject;\n\n  diagram.$parent = this._definitions;\n\n  this._definitions.diagrams.push(diagram);\n\n  return diagram;\n};\n\nSubprocessCompatibility.$inject = [ 'eventBus', 'moddle' ];\n\n\n// helpers //////////\n\nfunction findRootDiagram(element) {\n  if (is(element, 'bpmndi:BPMNDiagram')) {\n    return element;\n  } else {\n    return findRootDiagram(element.$parent);\n  }\n}\n\n/**\n * @param {CanvasPlane} plane\n *\n * @return {Rect}\n */\nfunction getPlaneBounds(plane) {\n  var planeTrbl = {\n    top: Infinity,\n    right: -Infinity,\n    bottom: -Infinity,\n    left: Infinity\n  };\n\n  plane.planeElement.forEach(function(element) {\n    if (!element.bounds) {\n      return;\n    }\n\n    var trbl = asTRBL(element.bounds);\n\n    planeTrbl.top = Math.min(trbl.top, planeTrbl.top);\n    planeTrbl.left = Math.min(trbl.left, planeTrbl.left);\n  });\n\n  return asBounds(planeTrbl);\n}\n\n/**\n * @param {ModdleElement} businessObject\n * @param {CanvasPlane} plane\n *\n * @return {boolean}\n */\nfunction shouldMoveToPlane(businessObject, plane) {\n  var parent = businessObject.$parent;\n\n  // don't move elements that are already on the plane\n  if (!is(parent, 'bpmn:SubProcess') || parent === plane.bpmnElement) {\n    return false;\n  }\n\n  // dataAssociations are children of the subprocess but rendered on process level\n  // cf. https://github.com/bpmn-io/bpmn-js/issues/1619\n  if (isAny(businessObject, [ 'bpmn:DataInputAssociation', 'bpmn:DataOutputAssociation' ])) {\n    return false;\n  }\n\n  return true;\n}\n"
  },
  {
    "path": "lib/features/drilldown/index.js",
    "content": "import OverlaysModule from 'diagram-js/lib/features/overlays';\nimport ChangeSupportModule from 'diagram-js/lib/features/change-support';\nimport RootElementsModule from 'diagram-js/lib/features/root-elements';\n\nimport DrilldownBreadcrumbs from './DrilldownBreadcrumbs';\nimport DrilldownCentering from './DrilldownCentering';\nimport SubprocessCompatibility from './SubprocessCompatibility';\nimport DrilldownOverlayBehavior from './DrilldownOverlayBehavior';\n\nexport default {\n  __depends__: [ OverlaysModule, ChangeSupportModule, RootElementsModule ],\n  __init__: [ 'drilldownBreadcrumbs', 'drilldownOverlayBehavior', 'drilldownCentering', 'subprocessCompatibility' ],\n  drilldownBreadcrumbs: [ 'type', DrilldownBreadcrumbs ],\n  drilldownCentering: [ 'type', DrilldownCentering ],\n  drilldownOverlayBehavior: [ 'type', DrilldownOverlayBehavior ],\n  subprocessCompatibility: [ 'type', SubprocessCompatibility ]\n};"
  },
  {
    "path": "lib/features/editor-actions/BpmnEditorActions.js",
    "content": "import inherits from 'inherits-browser';\n\nimport EditorActions from 'diagram-js/lib/features/editor-actions/EditorActions';\n\nimport { filter } from 'min-dash';\n\nimport { is } from '../../util/ModelUtil';\n\nimport {\n  getBBox\n} from 'diagram-js/lib/util/Elements';\n\n/**\n * @typedef {import('didi').Injector} Injector\n */\n\n/**\n * Registers and executes BPMN specific editor actions.\n *\n * @param {Injector} injector\n */\nexport default function BpmnEditorActions(injector) {\n  injector.invoke(EditorActions, this);\n}\n\ninherits(BpmnEditorActions, EditorActions);\n\nBpmnEditorActions.$inject = [\n  'injector'\n];\n\n/**\n * Register default actions.\n *\n * @param {Injector} injector\n */\nBpmnEditorActions.prototype._registerDefaultActions = function(injector) {\n\n  // (0) invoke super method\n\n  EditorActions.prototype._registerDefaultActions.call(this, injector);\n\n  // (1) retrieve optional components to integrate with\n\n  var canvas = injector.get('canvas', false);\n  var elementRegistry = injector.get('elementRegistry', false);\n  var selection = injector.get('selection', false);\n  var spaceTool = injector.get('spaceTool', false);\n  var lassoTool = injector.get('lassoTool', false);\n  var handTool = injector.get('handTool', false);\n  var globalConnect = injector.get('globalConnect', false);\n  var distributeElements = injector.get('distributeElements', false);\n  var alignElements = injector.get('alignElements', false);\n  var directEditing = injector.get('directEditing', false);\n  var searchPad = injector.get('searchPad', false);\n  var modeling = injector.get('modeling', false);\n  var contextPad = injector.get('contextPad', false);\n\n  // (2) check components and register actions\n\n  if (canvas && elementRegistry && selection) {\n    this._registerAction('selectElements', function() {\n\n      // select all elements except for the invisible\n      // root element\n      var rootElement = canvas.getRootElement();\n\n      var elements = elementRegistry.filter(function(element) {\n        return element !== rootElement;\n      });\n\n      selection.select(elements);\n\n      return elements;\n    });\n  }\n\n  if (spaceTool) {\n    this._registerAction('spaceTool', function() {\n      spaceTool.toggle();\n    });\n  }\n\n  if (lassoTool) {\n    this._registerAction('lassoTool', function() {\n      lassoTool.toggle();\n    });\n  }\n\n  if (handTool) {\n    this._registerAction('handTool', function() {\n      handTool.toggle();\n    });\n  }\n\n  if (globalConnect) {\n    this._registerAction('globalConnectTool', function() {\n      globalConnect.toggle();\n    });\n  }\n\n  if (selection && distributeElements) {\n    this._registerAction('distributeElements', function(opts) {\n      var currentSelection = selection.get(),\n          type = opts.type;\n\n      if (currentSelection.length) {\n        distributeElements.trigger(currentSelection, type);\n      }\n    });\n  }\n\n  if (selection && alignElements) {\n    this._registerAction('alignElements', function(opts) {\n      var currentSelection = selection.get(),\n          aligneableElements = [],\n          type = opts.type;\n\n      if (currentSelection.length) {\n        aligneableElements = filter(currentSelection, function(element) {\n          return !is(element, 'bpmn:Lane');\n        });\n\n        alignElements.trigger(aligneableElements, type);\n      }\n    });\n  }\n\n  if (selection && modeling) {\n    this._registerAction('setColor', function(opts) {\n      var currentSelection = selection.get();\n\n      if (currentSelection.length) {\n        modeling.setColor(currentSelection, opts);\n      }\n    });\n  }\n\n  if (selection && directEditing) {\n    this._registerAction('directEditing', function() {\n      var currentSelection = selection.get();\n\n      if (currentSelection.length) {\n        directEditing.activate(currentSelection[0]);\n      }\n    });\n  }\n\n  if (searchPad) {\n    this._registerAction('find', function() {\n      searchPad.toggle();\n    });\n  }\n\n  if (canvas && modeling) {\n    this._registerAction('moveToOrigin', function() {\n      var rootElement = canvas.getRootElement(),\n          boundingBox,\n          elements;\n\n      if (is(rootElement, 'bpmn:Collaboration')) {\n        elements = elementRegistry.filter(function(element) {\n          return is(element.parent, 'bpmn:Collaboration');\n        });\n      } else {\n        elements = elementRegistry.filter(function(element) {\n          return element !== rootElement && !is(element.parent, 'bpmn:SubProcess');\n        });\n      }\n\n      boundingBox = getBBox(elements);\n\n      modeling.moveElements(\n        elements,\n        { x: -boundingBox.x, y: -boundingBox.y },\n        rootElement\n      );\n    });\n  }\n\n  if (selection && contextPad) {\n    this._registerAction('replaceElement', function(event) {\n      contextPad.triggerEntry('replace', 'click', event);\n    });\n  }\n\n};\n"
  },
  {
    "path": "lib/features/editor-actions/index.js",
    "content": "import EditorActionsModule from 'diagram-js/lib/features/editor-actions';\n\nimport BpmnEditorActions from './BpmnEditorActions';\n\nexport default {\n  __depends__: [\n    EditorActionsModule\n  ],\n  editorActions: [ 'type', BpmnEditorActions ]\n};\n"
  },
  {
    "path": "lib/features/grid-snapping/BpmnGridSnapping.js",
    "content": "import { isAny } from '../modeling/util/ModelingUtil';\r\n\r\n/**\r\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n */\r\n\r\n/**\r\n * @param {EventBus} eventBus\r\n */\r\nexport default function BpmnGridSnapping(eventBus) {\r\n  eventBus.on([\r\n    'create.init',\r\n    'shape.move.init'\r\n  ], function(event) {\r\n    var context = event.context,\r\n        shape = event.shape;\r\n\r\n    if (isAny(shape, [\r\n      'bpmn:Participant',\r\n      'bpmn:SubProcess',\r\n      'bpmn:TextAnnotation'\r\n    ])) {\r\n      if (!context.gridSnappingContext) {\r\n        context.gridSnappingContext = {};\r\n      }\r\n\r\n      context.gridSnappingContext.snapLocation = 'top-left';\r\n    }\r\n  });\r\n}\r\n\r\nBpmnGridSnapping.$inject = [ 'eventBus' ];"
  },
  {
    "path": "lib/features/grid-snapping/behavior/GridSnappingAutoPlaceBehavior.js",
    "content": "import { getNewShapePosition } from '../../auto-place/BpmnAutoPlaceUtil';\r\n\r\nimport { getMid } from 'diagram-js/lib/layout/LayoutUtil';\r\nimport { is } from '../../../util/ModelUtil';\r\n\r\n/**\r\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\r\n * @typedef {import('diagram-js/lib/features/grid-snapping/GridSnapping').default} GridSnapping\r\n *\r\n * @typedef {import('diagram-js/lib/util/Types').Axis} Axis\r\n */\r\n\r\nvar HIGH_PRIORITY = 2000;\r\n\r\n/**\r\n * @param {EventBus} eventBus\r\n * @param {GridSnapping} gridSnapping\r\n * @param {ElementRegistry} elementRegistry\r\n */\r\nexport default function GridSnappingAutoPlaceBehavior(eventBus, gridSnapping, elementRegistry) {\r\n  eventBus.on('autoPlace', HIGH_PRIORITY, function(context) {\r\n    var source = context.source,\r\n        sourceMid = getMid(source),\r\n        shape = context.shape;\r\n\r\n    var position = getNewShapePosition(source, shape, elementRegistry);\r\n\r\n    [ 'x', 'y' ].forEach(function(axis) {\r\n      var options = {};\r\n\r\n      // do not snap if x/y equal\r\n      if (position[ axis ] === sourceMid[ axis ]) {\r\n        return;\r\n      }\r\n\r\n      if (position[ axis ] > sourceMid[ axis ]) {\r\n        options.min = position[ axis ];\r\n      } else {\r\n        options.max = position[ axis ];\r\n      }\r\n\r\n      if (is(shape, 'bpmn:TextAnnotation')) {\r\n\r\n        if (isHorizontal(axis)) {\r\n          options.offset = -shape.width / 2;\r\n        } else {\r\n          options.offset = -shape.height / 2;\r\n        }\r\n\r\n      }\r\n\r\n      position[ axis ] = gridSnapping.snapValue(position[ axis ], options);\r\n\r\n    });\r\n\r\n    // must be returned to be considered by auto place\r\n    return position;\r\n  });\r\n}\r\n\r\nGridSnappingAutoPlaceBehavior.$inject = [\r\n  'eventBus',\r\n  'gridSnapping',\r\n  'elementRegistry'\r\n];\r\n\r\n// helpers //////////\r\n\r\n/**\r\n * @param {Axis} axis\r\n *\r\n * @return {boolean}\r\n */\r\nfunction isHorizontal(axis) {\r\n  return axis === 'x';\r\n}"
  },
  {
    "path": "lib/features/grid-snapping/behavior/GridSnappingLayoutConnectionBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport { pointsAligned } from 'diagram-js/lib/util/Geometry';\n\nimport {\n  assign\n} from 'min-dash';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('diagram-js/lib/features/grid-snapping/GridSnapping').default} GridSnapping\n * @typedef {import('../../modeling/Modeling').default} Modeling\n *\n * @typedef {import('diagram-js/lib/util/Types').Point} Point\n */\n\nvar HIGH_PRIORITY = 3000;\n\n\n/**\n * Snaps connections with Manhattan layout.\n *\n * @param {EventBus} eventBus\n * @param {GridSnapping} gridSnapping\n * @param {Modeling} modeling\n */\nexport default function GridSnappingLayoutConnectionBehavior(eventBus, gridSnapping, modeling) {\n  CommandInterceptor.call(this, eventBus);\n\n  this._gridSnapping = gridSnapping;\n\n  var self = this;\n\n  this.postExecuted([\n    'connection.create',\n    'connection.layout'\n  ], HIGH_PRIORITY, function(event) {\n    var context = event.context,\n        connection = context.connection,\n        hints = context.hints || {},\n        waypoints = connection.waypoints;\n\n    if (hints.connectionStart || hints.connectionEnd || hints.createElementsBehavior === false) {\n      return;\n    }\n\n    if (!hasMiddleSegments(waypoints)) {\n      return;\n    }\n\n    modeling.updateWaypoints(connection, self.snapMiddleSegments(waypoints));\n  });\n}\n\nGridSnappingLayoutConnectionBehavior.$inject = [\n  'eventBus',\n  'gridSnapping',\n  'modeling'\n];\n\ninherits(GridSnappingLayoutConnectionBehavior, CommandInterceptor);\n\n/**\n * Snap middle segments of a given connection.\n *\n * @param {Point[]} waypoints\n *\n * @return {Point[]}\n */\nGridSnappingLayoutConnectionBehavior.prototype.snapMiddleSegments = function(waypoints) {\n  var gridSnapping = this._gridSnapping,\n      snapped;\n\n  waypoints = waypoints.slice();\n\n  for (var i = 1; i < waypoints.length - 2; i++) {\n\n    snapped = snapSegment(gridSnapping, waypoints[i], waypoints[i + 1]);\n\n    waypoints[i] = snapped[0];\n    waypoints[i + 1] = snapped[1];\n  }\n\n  return waypoints;\n};\n\n\n// helpers //////////\n\n/**\n * Check whether a connection has a middle segments.\n *\n * @param {Point[]} waypoints\n *\n * @return {boolean}\n */\nfunction hasMiddleSegments(waypoints) {\n  return waypoints.length > 3;\n}\n\n/**\n * Check whether an alignment is horizontal.\n *\n * @param {string} aligned\n *\n * @return {boolean}\n */\nfunction horizontallyAligned(aligned) {\n  return aligned === 'h';\n}\n\n/**\n * Check whether an alignment is vertical.\n *\n * @param {string} aligned\n *\n * @return {boolean}\n */\nfunction verticallyAligned(aligned) {\n  return aligned === 'v';\n}\n\n/**\n * Get middle segments from a given connection.\n *\n * @param {Point[]} waypoints\n *\n * @return {Point[]}\n */\nfunction snapSegment(gridSnapping, segmentStart, segmentEnd) {\n\n  var aligned = pointsAligned(segmentStart, segmentEnd);\n\n  var snapped = {};\n\n  if (horizontallyAligned(aligned)) {\n\n    // snap horizontally\n    snapped.y = gridSnapping.snapValue(segmentStart.y);\n  }\n\n  if (verticallyAligned(aligned)) {\n\n    // snap vertically\n    snapped.x = gridSnapping.snapValue(segmentStart.x);\n  }\n\n  if ('x' in snapped || 'y' in snapped) {\n    segmentStart = assign({}, segmentStart, snapped);\n    segmentEnd = assign({}, segmentEnd, snapped);\n  }\n\n  return [ segmentStart, segmentEnd ];\n}"
  },
  {
    "path": "lib/features/grid-snapping/behavior/GridSnappingParticipantBehavior.js",
    "content": "import { is } from '../../../util/ModelUtil';\r\n\r\n/**\r\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\r\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n * @typedef {import('diagram-js/lib/features/grid-snapping/GridSnapping').default} GridSnapping\r\n */\r\n\r\nvar HIGHER_PRIORITY = 1750;\r\n\r\n/**\r\n * @param {Canvas} canvas\r\n * @param {EventBus} eventBus\r\n * @param {GridSnapping} gridSnapping\r\n */\r\nexport default function GridSnappingParticipantBehavior(canvas, eventBus, gridSnapping) {\r\n  eventBus.on([\r\n    'create.start',\r\n    'shape.move.start'\r\n  ], HIGHER_PRIORITY, function(event) {\r\n    var context = event.context,\r\n        shape = context.shape,\r\n        rootElement = canvas.getRootElement();\r\n\r\n    if (!is(shape, 'bpmn:Participant') ||\r\n      !is(rootElement, 'bpmn:Process') ||\r\n      !rootElement.children.length) {\r\n      return;\r\n    }\r\n\r\n    var createConstraints = context.createConstraints;\r\n\r\n    if (!createConstraints) {\r\n      return;\r\n    }\r\n\r\n    shape.width = gridSnapping.snapValue(shape.width, { min: shape.width });\r\n    shape.height = gridSnapping.snapValue(shape.height, { min: shape.height });\r\n  });\r\n}\r\n\r\nGridSnappingParticipantBehavior.$inject = [\r\n  'canvas',\r\n  'eventBus',\r\n  'gridSnapping'\r\n];"
  },
  {
    "path": "lib/features/grid-snapping/behavior/index.js",
    "content": "import GridSnappingAutoPlaceBehavior from './GridSnappingAutoPlaceBehavior';\r\nimport GridSnappingParticipantBehavior from './GridSnappingParticipantBehavior';\r\nimport GridSnappingLayoutConnectionBehavior from './GridSnappingLayoutConnectionBehavior';\r\n\r\nexport default {\r\n  __init__: [\r\n    'gridSnappingAutoPlaceBehavior',\r\n    'gridSnappingParticipantBehavior',\r\n    'gridSnappingLayoutConnectionBehavior',\r\n  ],\r\n  gridSnappingAutoPlaceBehavior: [ 'type', GridSnappingAutoPlaceBehavior ],\r\n  gridSnappingParticipantBehavior: [ 'type', GridSnappingParticipantBehavior ],\r\n  gridSnappingLayoutConnectionBehavior: [ 'type', GridSnappingLayoutConnectionBehavior ]\r\n};"
  },
  {
    "path": "lib/features/grid-snapping/index.js",
    "content": "import BpmnGridSnapping from './BpmnGridSnapping';\r\nimport GridSnappingModule from 'diagram-js/lib/features/grid-snapping';\r\n\r\nimport GridSnappingBehaviorModule from './behavior';\r\n\r\nexport default {\r\n  __depends__: [\r\n    GridSnappingModule,\r\n    GridSnappingBehaviorModule\r\n  ],\r\n  __init__: [ 'bpmnGridSnapping' ],\r\n  bpmnGridSnapping: [ 'type', BpmnGridSnapping ]\r\n};"
  },
  {
    "path": "lib/features/interaction-events/BpmnInteractionEvents.js",
    "content": "import { is } from '../../util/ModelUtil';\n\nimport {\n  isExpanded,\n  isHorizontal\n} from '../../util/DiUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('diagram-js/lib/features/interaction-events/InteractionEvents').default} InteractionEvents\n *\n * @typedef {import('../../model/Types').Element} Element\n * @typedef {import('../../model/Types').Shape} Shape\n */\n\nvar LABEL_WIDTH = 30,\n    LABEL_HEIGHT = 30;\n\n\n/**\n * BPMN-specific hit zones and interaction fixes.\n *\n * @param {EventBus} eventBus\n * @param {InteractionEvents} interactionEvents\n */\nexport default function BpmnInteractionEvents(eventBus, interactionEvents) {\n\n  this._interactionEvents = interactionEvents;\n\n  var self = this;\n\n  eventBus.on([\n    'interactionEvents.createHit',\n    'interactionEvents.updateHit'\n  ], function(context) {\n    var element = context.element,\n        gfx = context.gfx;\n\n    if (is(element, 'bpmn:Lane')) {\n      return self._createParticipantHit(element, gfx);\n    } else if (is(element, 'bpmn:Participant')) {\n      if (isExpanded(element)) {\n        return self._createParticipantHit(element, gfx);\n      } else {\n        return self._createDefaultHit(element, gfx);\n      }\n    } else if (is(element, 'bpmn:SubProcess')) {\n      if (isExpanded(element)) {\n        return self._createSubProcessHit(element, gfx);\n      } else {\n        return self._createDefaultHit(element, gfx);\n      }\n    }\n  });\n\n}\n\nBpmnInteractionEvents.$inject = [\n  'eventBus',\n  'interactionEvents'\n];\n\n/**\n * @param {Element} element\n * @param {SVGElement} gfx\n *\n * @return {boolean}\n */\nBpmnInteractionEvents.prototype._createDefaultHit = function(element, gfx) {\n  this._interactionEvents.removeHits(gfx);\n\n  this._interactionEvents.createDefaultHit(element, gfx);\n\n  // indicate that we created a hit\n  return true;\n};\n\n/**\n * @param {Shape} element\n * @param {SVGElement} gfx\n *\n * @return {boolean}\n */\nBpmnInteractionEvents.prototype._createParticipantHit = function(element, gfx) {\n\n  // remove existing hits\n  this._interactionEvents.removeHits(gfx);\n\n  // add body hit\n  this._interactionEvents.createBoxHit(gfx, 'no-move', {\n    width: element.width,\n    height: element.height\n  });\n\n  // add outline hit\n  this._interactionEvents.createBoxHit(gfx, 'click-stroke', {\n    width: element.width,\n    height: element.height\n  });\n\n  // add label hit\n  var box = isHorizontal(element) ? {\n    width: LABEL_WIDTH,\n    height: element.height\n  } : {\n    width: element.width,\n    height: LABEL_HEIGHT\n  };\n\n  this._interactionEvents.createBoxHit(gfx, 'all', box);\n\n  // indicate that we created a hit\n  return true;\n};\n\n/**\n * @param {Shape} element\n * @param {SVGElement} gfx\n *\n * @return {boolean}\n */\nBpmnInteractionEvents.prototype._createSubProcessHit = function(element, gfx) {\n\n  // remove existing hits\n  this._interactionEvents.removeHits(gfx);\n\n  // add body hit\n  this._interactionEvents.createBoxHit(gfx, 'no-move', {\n    width: element.width,\n    height: element.height\n  });\n\n  // add outline hit\n  this._interactionEvents.createBoxHit(gfx, 'click-stroke', {\n    width: element.width,\n    height: element.height\n  });\n\n  // add label hit\n  this._interactionEvents.createBoxHit(gfx, 'all', {\n    width: element.width,\n    height: LABEL_HEIGHT\n  });\n\n  // indicate that we created a hit\n  return true;\n};"
  },
  {
    "path": "lib/features/interaction-events/index.js",
    "content": "import BpmnInteractionEvents from './BpmnInteractionEvents';\n\nexport default {\n  __init__: [ 'bpmnInteractionEvents' ],\n  bpmnInteractionEvents: [ 'type', BpmnInteractionEvents ]\n};"
  },
  {
    "path": "lib/features/keyboard/BpmnKeyboardBindings.js",
    "content": "import inherits from 'inherits-browser';\n\nimport KeyboardBindings from 'diagram-js/lib/features/keyboard/KeyboardBindings';\n\n/**\n * @typedef {import('didi').Injector} Injector\n * @typedef {import('diagram-js/lib/features/editor-actions/EditorActions').default} EditorActions\n * @typedef {import('diagram-js/lib/features/keyboard/Keyboard').default} Keyboard\n */\n\n/**\n * BPMN 2.0 specific keyboard bindings.\n *\n * @param {Injector} injector\n */\nexport default function BpmnKeyboardBindings(injector) {\n  injector.invoke(KeyboardBindings, this);\n}\n\ninherits(BpmnKeyboardBindings, KeyboardBindings);\n\nBpmnKeyboardBindings.$inject = [\n  'injector'\n];\n\n\n/**\n * Register available keyboard bindings.\n *\n * @param {Keyboard} keyboard\n * @param {EditorActions} editorActions\n */\nBpmnKeyboardBindings.prototype.registerBindings = function(keyboard, editorActions) {\n\n  // inherit default bindings\n  KeyboardBindings.prototype.registerBindings.call(this, keyboard, editorActions);\n\n  /**\n   * Add keyboard binding if respective editor action\n   * is registered.\n   *\n   * @param {string} action name\n   * @param {Function} fn that implements the key binding\n   */\n  function addListener(action, fn) {\n\n    if (editorActions.isRegistered(action)) {\n      keyboard.addListener(fn);\n    }\n  }\n\n  // select all elements\n  // CTRL + A\n  addListener('selectElements', function(context) {\n\n    var event = context.keyEvent;\n\n    if (keyboard.isKey([ 'a', 'A' ], event) && keyboard.isCmd(event)) {\n      editorActions.trigger('selectElements');\n\n      return true;\n    }\n  });\n\n  // search labels\n  // CTRL + F\n  addListener('find', function(context) {\n\n    var event = context.keyEvent;\n\n    if (keyboard.isKey([ 'f', 'F' ], event) && keyboard.isCmd(event)) {\n      editorActions.trigger('find');\n\n      return true;\n    }\n  });\n\n  // activate space tool\n  // S\n  addListener('spaceTool', function(context) {\n\n    var event = context.keyEvent;\n\n    if (keyboard.hasModifier(event)) {\n      return;\n    }\n\n    if (keyboard.isKey([ 's', 'S' ], event)) {\n      editorActions.trigger('spaceTool');\n\n      return true;\n    }\n  });\n\n  // activate lasso tool\n  // L\n  addListener('lassoTool', function(context) {\n\n    var event = context.keyEvent;\n\n    if (keyboard.hasModifier(event)) {\n      return;\n    }\n\n    if (keyboard.isKey([ 'l', 'L' ], event)) {\n      editorActions.trigger('lassoTool');\n\n      return true;\n    }\n  });\n\n  // activate hand tool\n  // H\n  addListener('handTool', function(context) {\n\n    var event = context.keyEvent;\n\n    if (keyboard.hasModifier(event)) {\n      return;\n    }\n\n    if (keyboard.isKey([ 'h', 'H' ], event)) {\n      editorActions.trigger('handTool');\n\n      return true;\n    }\n  });\n\n  // activate global connect tool\n  // C\n  addListener('globalConnectTool', function(context) {\n\n    var event = context.keyEvent;\n\n    if (keyboard.hasModifier(event)) {\n      return;\n    }\n\n    if (keyboard.isKey([ 'c', 'C' ], event)) {\n      editorActions.trigger('globalConnectTool');\n\n      return true;\n    }\n  });\n\n  // activate direct editing\n  // E\n  addListener('directEditing', function(context) {\n\n    var event = context.keyEvent;\n\n    if (keyboard.hasModifier(event)) {\n      return;\n    }\n\n    if (keyboard.isKey([ 'e', 'E' ], event)) {\n      editorActions.trigger('directEditing');\n\n      return true;\n    }\n  });\n\n  // activate replace element\n  // R\n  addListener('replaceElement', function(context) {\n\n    var event = context.keyEvent;\n\n    if (keyboard.hasModifier(event)) {\n      return;\n    }\n\n    if (keyboard.isKey([ 'r', 'R' ], event)) {\n      editorActions.trigger('replaceElement', event);\n\n      return true;\n    }\n  });\n\n};"
  },
  {
    "path": "lib/features/keyboard/index.js",
    "content": "import KeyboardModule from 'diagram-js/lib/features/keyboard';\n\nimport BpmnKeyboardBindings from './BpmnKeyboardBindings';\n\nexport default {\n  __depends__: [\n    KeyboardModule\n  ],\n  __init__: [ 'keyboardBindings' ],\n  keyboardBindings: [ 'type', BpmnKeyboardBindings ]\n};\n"
  },
  {
    "path": "lib/features/label-editing/LabelEditingPreview.js",
    "content": "import {\n  append as svgAppend,\n  attr as svgAttr,\n  create as svgCreate,\n  remove as svgRemove\n} from 'tiny-svg';\n\nimport {\n  getDi,\n  is\n} from '../../util/ModelUtil';\n\nimport {\n  translate\n} from 'diagram-js/lib/util/SvgTransformUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../../draw/PathMap').default} PathMap\n */\n\nvar MARKER_HIDDEN = 'djs-element-hidden',\n    MARKER_LABEL_HIDDEN = 'djs-label-hidden';\n\n/**\n * @param {EventBus} eventBus\n * @param {Canvas} canvas\n * @param {PathMap} pathMap\n */\nexport default function LabelEditingPreview(eventBus, canvas, pathMap) {\n\n  var self = this;\n\n  var defaultLayer = canvas.getDefaultLayer();\n\n  var element, absoluteElementBBox, gfx;\n\n  eventBus.on('directEditing.activate', function(context) {\n    var activeProvider = context.active;\n\n    element = activeProvider.element.label || activeProvider.element;\n\n    // text annotation\n    if (is(element, 'bpmn:TextAnnotation')) {\n      absoluteElementBBox = canvas.getAbsoluteBBox(element);\n\n      gfx = svgCreate('g');\n\n      var textPathData = pathMap.getScaledPath('TEXT_ANNOTATION', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: element.width,\n        containerHeight: element.height,\n        position: {\n          mx: 0.0,\n          my: 0.0\n        }\n      });\n\n      var path = self.path = svgCreate('path');\n\n      svgAttr(path, {\n        d: textPathData,\n        strokeWidth: 2,\n        stroke: getStrokeColor(element)\n      });\n\n      svgAppend(gfx, path);\n\n      svgAppend(defaultLayer, gfx);\n\n      translate(gfx, element.x, element.y);\n    }\n\n    if (is(element, 'bpmn:TextAnnotation') ||\n        element.labelTarget) {\n      canvas.addMarker(element, MARKER_HIDDEN);\n    } else if (is(element, 'bpmn:Task') ||\n               is(element, 'bpmn:CallActivity') ||\n               is(element, 'bpmn:SubProcess') ||\n               is(element, 'bpmn:Participant') ||\n               is(element, 'bpmn:Lane')) {\n      canvas.addMarker(element, MARKER_LABEL_HIDDEN);\n    }\n  });\n\n  eventBus.on('directEditing.resize', function(context) {\n\n    // text annotation\n    if (is(element, 'bpmn:TextAnnotation')) {\n      var height = context.height,\n          dy = context.dy;\n\n      var newElementHeight = Math.max(element.height / absoluteElementBBox.height * (height + dy), 0);\n\n      var textPathData = pathMap.getScaledPath('TEXT_ANNOTATION', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: element.width,\n        containerHeight: newElementHeight,\n        position: {\n          mx: 0.0,\n          my: 0.0\n        }\n      });\n\n      svgAttr(self.path, {\n        d: textPathData\n      });\n    }\n  });\n\n  eventBus.on([ 'directEditing.complete', 'directEditing.cancel' ], function(context) {\n    var activeProvider = context.active;\n\n    if (activeProvider) {\n      canvas.removeMarker(activeProvider.element.label || activeProvider.element, MARKER_HIDDEN);\n      canvas.removeMarker(element, MARKER_LABEL_HIDDEN);\n    }\n\n    element = undefined;\n    absoluteElementBBox = undefined;\n\n    if (gfx) {\n      svgRemove(gfx);\n\n      gfx = undefined;\n    }\n  });\n}\n\nLabelEditingPreview.$inject = [\n  'eventBus',\n  'canvas',\n  'pathMap'\n];\n\n\n// helpers //////////\n\nfunction getStrokeColor(element, defaultColor) {\n  var di = getDi(element);\n\n  return di.get('stroke') || defaultColor || 'black';\n}"
  },
  {
    "path": "lib/features/label-editing/LabelEditingProvider.js",
    "content": "import {\n  assign\n} from 'min-dash';\n\nimport {\n  getLabel\n} from '../../util/LabelUtil';\n\nimport {\n  is\n} from '../../util/ModelUtil';\n\nimport { isAny } from '../modeling/util/ModelingUtil';\n\nimport {\n  isExpanded,\n  isHorizontal\n} from '../../util/DiUtil';\n\nimport {\n  getExternalLabelMid,\n  isLabelExternal,\n  hasExternalLabel,\n  isLabel\n} from '../../util/LabelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../modeling/BpmnFactory').default} BpmnFactory\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n * @typedef {import('diagram-js-direct-editing/lib/DirectEditing').default} DirectEditing\n * @typedef {import('../modeling/Modeling').default} Modeling\n * @typedef {import('diagram-js/lib/features/resize/ResizeHandles').default} ResizeHandles\n * @typedef {import('../../draw/TextRenderer').default} TextRenderer\n *\n * @typedef {import('../../model/Types').Element} Element\n *\n * @typedef { {\n *   bounds: {\n *     x: number;\n *     y: number;\n *     width: number;\n *     height: number;\n *     minWidth?: number;\n *     minHeight?: number;\n *   };\n *   style: Object;\n * } } DirectEditingContext\n */\n\nvar HIGH_PRIORITY = 2000;\n\n/**\n * @param {EventBus} eventBus\n * @param {BpmnFactory} bpmnFactory\n * @param {Canvas} canvas\n * @param {DirectEditing} directEditing\n * @param {Modeling} modeling\n * @param {ResizeHandles} resizeHandles\n * @param {TextRenderer} textRenderer\n */\nexport default function LabelEditingProvider(\n    eventBus, bpmnFactory, canvas, directEditing,\n    modeling, resizeHandles, textRenderer) {\n\n  this._bpmnFactory = bpmnFactory;\n  this._canvas = canvas;\n  this._modeling = modeling;\n  this._textRenderer = textRenderer;\n\n  directEditing.registerProvider(this);\n\n  // listen to dblclick on non-root elements\n  eventBus.on('element.dblclick', function(event) {\n    activateDirectEdit(event.element, true);\n  });\n\n  // complete on followup canvas operation\n  eventBus.on([\n    'autoPlace.start',\n    'canvas.viewbox.changing',\n    'drag.init',\n    'element.mousedown',\n    'popupMenu.open',\n    'root.set',\n    'selection.changed'\n  ], function() {\n    if (directEditing.isActive()) {\n      directEditing.complete();\n    }\n  });\n\n  eventBus.on([\n    'shape.remove',\n    'connection.remove'\n  ], HIGH_PRIORITY, function(event) {\n\n    if (directEditing.isActive(event.element)) {\n      directEditing.cancel();\n    }\n  });\n\n  // cancel on command stack changes\n  eventBus.on([ 'commandStack.changed' ], function(e) {\n    if (directEditing.isActive()) {\n      directEditing.cancel();\n    }\n  });\n\n\n  eventBus.on('directEditing.activate', function(event) {\n    resizeHandles.removeResizers();\n  });\n\n  eventBus.on('create.end', 500, function(event) {\n\n    var context = event.context,\n        element = context.shape,\n        canExecute = event.context.canExecute,\n        isTouch = event.isTouch;\n\n    // TODO(nikku): we need to find a way to support the\n    // direct editing on mobile devices; right now this will\n    // break for desworkflowediting on mobile devices\n    // as it breaks the user interaction workflow\n\n    // TODO(nikku): we should temporarily focus the edited element\n    // here and release the focused viewport after the direct edit\n    // operation is finished\n    if (isTouch) {\n      return;\n    }\n\n    if (!canExecute) {\n      return;\n    }\n\n    if (context.hints && context.hints.createElementsBehavior === false) {\n      return;\n    }\n\n    activateDirectEdit(element);\n  });\n\n  eventBus.on('autoPlace.end', 500, function(event) {\n    activateDirectEdit(event.shape);\n  });\n\n\n  function activateDirectEdit(element, force) {\n    if (force ||\n        isAny(element, [ 'bpmn:Task', 'bpmn:TextAnnotation', 'bpmn:Participant' ]) ||\n        isCollapsedSubProcess(element)) {\n\n      directEditing.activate(element);\n    }\n  }\n\n}\n\nLabelEditingProvider.$inject = [\n  'eventBus',\n  'bpmnFactory',\n  'canvas',\n  'directEditing',\n  'modeling',\n  'resizeHandles',\n  'textRenderer'\n];\n\n\n/**\n * Activate direct editing for activities and text annotations.\n *\n * @param {Element} element\n *\n * @return { {\n *   text: string;\n *   options?: {\n *     autoResize?: boolean;\n *     centerVertically?: boolean;\n *     resizable?: boolean;\n *   }\n * } & DirectEditingContext }\n */\nLabelEditingProvider.prototype.activate = function(element) {\n\n  // text\n  var text = getLabel(element);\n\n  if (text === undefined) {\n    return;\n  }\n\n  var context = {\n    text: text\n  };\n\n  // bounds\n  var bounds = this.getEditingBBox(element);\n\n  assign(context, bounds);\n\n  var options = {};\n  var style = context.style || {};\n\n  // Remove background and border\n  assign(style, {\n    backgroundColor: null,\n    border: null\n  });\n\n  // tasks\n  if (\n    isAny(element, [\n      'bpmn:Task',\n      'bpmn:Participant',\n      'bpmn:Lane',\n      'bpmn:CallActivity'\n    ]) ||\n    isCollapsedSubProcess(element)\n  ) {\n    assign(options, {\n      centerVertically: true\n    });\n  }\n\n  // external labels\n  if (isLabelExternal(element)) {\n    assign(options, {\n      autoResize: true\n    });\n\n    // keep background and border for external labels\n    assign(style, {\n      backgroundColor: '#ffffff',\n      border: '1px solid #ccc'\n    });\n  }\n\n  // text annotations\n  if (is(element, 'bpmn:TextAnnotation')) {\n    assign(options, {\n      resizable: true,\n      autoResize: true\n    });\n\n    // keep background and border for text annotations\n    assign(style, {\n      backgroundColor: '#ffffff',\n      border: '1px solid #ccc'\n    });\n  }\n\n  assign(context, {\n    options: options,\n    style: style\n  });\n\n  return context;\n};\n\n\n/**\n * Get the editing bounding box based on the element's size and position.\n *\n * @param {Element} element\n *\n * @return {DirectEditingContext}\n */\nLabelEditingProvider.prototype.getEditingBBox = function(element) {\n  var canvas = this._canvas;\n\n  var target = element.label || element;\n\n  var bbox = canvas.getAbsoluteBBox(target);\n\n  var mid = {\n    x: bbox.x + bbox.width / 2,\n    y: bbox.y + bbox.height / 2\n  };\n\n  // default position\n  var bounds = { x: bbox.x, y: bbox.y };\n\n  var zoom = canvas.zoom();\n\n  var defaultStyle = this._textRenderer.getDefaultStyle(),\n      externalStyle = this._textRenderer.getExternalStyle();\n\n  // take zoom into account\n  var externalFontSize = externalStyle.fontSize * zoom,\n      externalLineHeight = externalStyle.lineHeight,\n      defaultFontSize = defaultStyle.fontSize * zoom,\n      defaultLineHeight = defaultStyle.lineHeight;\n\n  var style = {\n    fontFamily: this._textRenderer.getDefaultStyle().fontFamily,\n    fontWeight: this._textRenderer.getDefaultStyle().fontWeight\n  };\n\n  // adjust for expanded pools AND lanes\n  if (is(element, 'bpmn:Lane') || isExpandedPool(element)) {\n    var isHorizontalLane = isHorizontal(element);\n\n    var laneBounds = isHorizontalLane ? {\n      width: bbox.height,\n      height: 30 * zoom,\n      x: bbox.x - bbox.height / 2 + (15 * zoom),\n      y: mid.y - (30 * zoom) / 2\n    } : {\n      width: bbox.width,\n      height: 30 * zoom\n    };\n\n    assign(bounds, laneBounds);\n\n    assign(style, {\n      fontSize: defaultFontSize + 'px',\n      lineHeight: defaultLineHeight,\n      paddingTop: (7 * zoom) + 'px',\n      paddingBottom: (7 * zoom) + 'px',\n      paddingLeft: (5 * zoom) + 'px',\n      paddingRight: (5 * zoom) + 'px',\n      transform: isHorizontalLane ? 'rotate(-90deg)' : null\n    });\n  }\n\n\n  // internal labels for collapsed participants\n  if (isCollapsedPool(element)) {\n    var isHorizontalPool = isHorizontal(element);\n\n    var poolBounds = isHorizontalPool ? {\n      width: bbox.width,\n      height: bbox.height\n    } : {\n      width: bbox.height,\n      height: bbox.width,\n      x: mid.x - bbox.height / 2,\n      y: mid.y - bbox.width / 2\n    };\n\n    assign(bounds, poolBounds);\n\n    assign(style, {\n      fontSize: defaultFontSize + 'px',\n      lineHeight: defaultLineHeight,\n      paddingTop: (7 * zoom) + 'px',\n      paddingBottom: (7 * zoom) + 'px',\n      paddingLeft: (5 * zoom) + 'px',\n      paddingRight: (5 * zoom) + 'px',\n      transform: isHorizontalPool ? null : 'rotate(-90deg)'\n    });\n  }\n\n\n  // internal labels for tasks and collapsed call activities\n  // and sub processes\n  if (isAny(element, [ 'bpmn:Task', 'bpmn:CallActivity' ]) ||\n      isCollapsedSubProcess(element)) {\n\n    assign(bounds, {\n      width: bbox.width,\n      height: bbox.height\n    });\n\n    assign(style, {\n      fontSize: defaultFontSize + 'px',\n      lineHeight: defaultLineHeight,\n      paddingTop: (7 * zoom) + 'px',\n      paddingBottom: (7 * zoom) + 'px',\n      paddingLeft: (5 * zoom) + 'px',\n      paddingRight: (5 * zoom) + 'px'\n    });\n  }\n\n\n  // internal labels for expanded sub processes\n  if (isExpandedSubProcess(element)) {\n    assign(bounds, {\n      width: bbox.width,\n      x: bbox.x\n    });\n\n    assign(style, {\n      fontSize: defaultFontSize + 'px',\n      lineHeight: defaultLineHeight,\n      paddingTop: (7 * zoom) + 'px',\n      paddingBottom: (7 * zoom) + 'px',\n      paddingLeft: (5 * zoom) + 'px',\n      paddingRight: (5 * zoom) + 'px'\n    });\n  }\n\n  var width = 90 * zoom,\n      paddingTop = 7 * zoom,\n      paddingBottom = 4 * zoom;\n\n  // external labels for events, data elements, gateways, groups and connections\n  if (target.labelTarget) {\n    assign(bounds, {\n      width: width,\n      height: bbox.height + paddingTop + paddingBottom,\n      x: mid.x - width / 2,\n      y: bbox.y - paddingTop\n    });\n\n    assign(style, {\n      fontSize: externalFontSize + 'px',\n      lineHeight: externalLineHeight,\n      paddingTop: paddingTop + 'px',\n      paddingBottom: paddingBottom + 'px'\n    });\n  }\n\n  // external label not yet created\n  if (isLabelExternal(target)\n      && !hasExternalLabel(target)\n      && !isLabel(target)) {\n\n    var externalLabelMid = getExternalLabelMid(element);\n\n    var absoluteBBox = canvas.getAbsoluteBBox({\n      x: externalLabelMid.x,\n      y: externalLabelMid.y,\n      width: 0,\n      height: 0\n    });\n\n    var height = externalFontSize + paddingTop + paddingBottom;\n\n    assign(bounds, {\n      width: width,\n      height: height,\n      x: absoluteBBox.x - width / 2,\n      y: absoluteBBox.y - height / 2\n    });\n\n    assign(style, {\n      fontSize: externalFontSize + 'px',\n      lineHeight: externalLineHeight,\n      paddingTop: paddingTop + 'px',\n      paddingBottom: paddingBottom + 'px'\n    });\n  }\n\n  // text annotations\n  if (is(element, 'bpmn:TextAnnotation')) {\n    assign(bounds, {\n      width: bbox.width,\n      height: bbox.height,\n      minWidth: 30 * zoom,\n      minHeight: 10 * zoom\n    });\n\n    assign(style, {\n      textAlign: 'left',\n      paddingTop: (5 * zoom) + 'px',\n      paddingBottom: (7 * zoom) + 'px',\n      paddingLeft: (7 * zoom) + 'px',\n      paddingRight: (5 * zoom) + 'px',\n      fontSize: defaultFontSize + 'px',\n      lineHeight: defaultLineHeight\n    });\n  }\n\n  return { bounds: bounds, style: style };\n};\n\n\nLabelEditingProvider.prototype.update = function(\n    element, newLabel,\n    activeContextText, bounds) {\n\n  var newBounds,\n      bbox;\n\n  if (is(element, 'bpmn:TextAnnotation')) {\n\n    bbox = this._canvas.getAbsoluteBBox(element);\n\n    newBounds = {\n      x: element.x,\n      y: element.y,\n      width: element.width / bbox.width * bounds.width,\n      height: element.height / bbox.height * bounds.height\n    };\n  }\n\n  if (isEmptyText(newLabel)) {\n    newLabel = null;\n  }\n\n  this._modeling.updateLabel(element, newLabel, newBounds);\n};\n\n\n\n// helpers //////////\n\nfunction isCollapsedSubProcess(element) {\n  return is(element, 'bpmn:SubProcess') && !isExpanded(element);\n}\n\nfunction isExpandedSubProcess(element) {\n  return is(element, 'bpmn:SubProcess') && isExpanded(element);\n}\n\nfunction isCollapsedPool(element) {\n  return is(element, 'bpmn:Participant') && !isExpanded(element);\n}\n\nfunction isExpandedPool(element) {\n  return is(element, 'bpmn:Participant') && isExpanded(element);\n}\n\nfunction isEmptyText(label) {\n  return !label || !label.trim();\n}"
  },
  {
    "path": "lib/features/label-editing/LabelUtil.js",
    "content": "export {\n  getLabel,\n  setLabel\n} from '../../util/LabelUtil';\n"
  },
  {
    "path": "lib/features/label-editing/cmd/UpdateLabelHandler.js",
    "content": "import {\n  setLabel,\n  getLabel\n} from '../../../util/LabelUtil';\n\nimport {\n  getExternalLabelMid,\n  isLabelExternal,\n  hasExternalLabel,\n  isLabel\n} from '../../../util/LabelUtil';\n\nimport {\n  is\n} from '../../../util/ModelUtil';\n\nvar NULL_DIMENSIONS = {\n  width: 0,\n  height: 0\n};\n\n/**\n * @typedef {import('../../modeling/Modeling').default} Modeling\n * @typedef {import('../../../draw/TextRenderer').default} TextRenderer\n * @typedef {import('../../modeling/BpmnFactory').default} BpmnFactory\n *\n * @typedef {import('../../../model/Types').Element} Element\n */\n\n/**\n * A handler that updates the text of a BPMN element.\n *\n * @param {Modeling} modeling\n * @param {TextRenderer} textRenderer\n * @param {BpmnFactory} bpmnFactory\n */\nexport default function UpdateLabelHandler(modeling, textRenderer, bpmnFactory) {\n\n  /**\n   * Set the label and return the changed elements.\n   *\n   * Element parameter can be label itself or connection (i.e. sequence flow).\n   *\n   * @param {Element} element\n   * @param {string} text\n   */\n  function setText(element, text) {\n\n    // external label if present\n    var label = element.label || element;\n\n    var labelTarget = element.labelTarget || element;\n\n    setLabel(label, text, labelTarget !== label);\n\n    return [ label, labelTarget ];\n  }\n\n  function preExecute(ctx) {\n    var element = ctx.element,\n        businessObject = element.businessObject,\n        newLabel = ctx.newLabel;\n\n    if (!isLabel(element)\n        && isLabelExternal(element)\n        && !hasExternalLabel(element)\n        && !isEmptyText(newLabel)) {\n\n      // create label\n      var paddingTop = 7;\n\n      var labelCenter = getExternalLabelMid(element);\n\n      labelCenter = {\n        x: labelCenter.x,\n        y: labelCenter.y + paddingTop\n      };\n\n      modeling.createLabel(element, labelCenter, {\n        id: businessObject.id + '_label',\n        businessObject: businessObject,\n        di: element.di\n      });\n    }\n  }\n\n  function execute(ctx) {\n    ctx.oldLabel = getLabel(ctx.element);\n    return setText(ctx.element, ctx.newLabel);\n  }\n\n  function revert(ctx) {\n    return setText(ctx.element, ctx.oldLabel);\n  }\n\n  function postExecute(ctx) {\n    var element = ctx.element,\n        label = element.label || element,\n        newLabel = ctx.newLabel,\n        newBounds = ctx.newBounds,\n        hints = ctx.hints || {};\n\n    // ignore internal labels for elements except text annotations\n    if (!isLabel(label) && !is(label, 'bpmn:TextAnnotation')) {\n      return;\n    }\n\n    if (isLabel(label) && isEmptyText(newLabel)) {\n\n      if (hints.removeShape !== false) {\n        modeling.removeShape(label, { unsetLabel: false });\n      }\n\n      return;\n    }\n\n    var text = getLabel(element);\n\n    // resize element based on label _or_ pre-defined bounds\n    if (typeof newBounds === 'undefined') {\n      newBounds = textRenderer.getExternalLabelBounds(label, text);\n    }\n\n    // setting newBounds to false or _null_ will\n    // disable the postExecute resize operation\n    if (newBounds) {\n      modeling.resizeShape(label, newBounds, NULL_DIMENSIONS);\n    }\n  }\n\n  // API\n\n  this.preExecute = preExecute;\n  this.execute = execute;\n  this.revert = revert;\n  this.postExecute = postExecute;\n}\n\nUpdateLabelHandler.$inject = [\n  'modeling',\n  'textRenderer',\n  'bpmnFactory'\n];\n\n\n// helpers //////////\n\nfunction isEmptyText(label) {\n  return !label || !label.trim();\n}"
  },
  {
    "path": "lib/features/label-editing/index.js",
    "content": "import ChangeSupportModule from 'diagram-js/lib/features/change-support';\nimport ResizeModule from 'diagram-js/lib/features/resize';\nimport DirectEditingModule from 'diagram-js-direct-editing';\n\nimport LabelEditingProvider from './LabelEditingProvider';\nimport LabelEditingPreview from './LabelEditingPreview';\n\n\nexport default {\n  __depends__: [\n    ChangeSupportModule,\n    ResizeModule,\n    DirectEditingModule\n  ],\n  __init__: [\n    'labelEditingProvider',\n    'labelEditingPreview'\n  ],\n  labelEditingProvider: [ 'type', LabelEditingProvider ],\n  labelEditingPreview: [ 'type', LabelEditingPreview ]\n};\n"
  },
  {
    "path": "lib/features/label-link/LabelLink.js",
    "content": "import { queryAll as domQueryAll } from 'min-dom';\n\nimport {\n  append as svgAppend,\n  attr as svgAttr,\n  remove as svgRemove,\n} from 'tiny-svg';\n\nimport { createLine, updateLine } from 'diagram-js/lib/util/RenderUtil';\nimport { getMid, getElementLineIntersection } from 'diagram-js/lib/layout/LayoutUtil';\nimport { getDistancePointPoint } from 'diagram-js/lib/features/bendpoints/GeometricUtil';\nimport { isLabel } from 'diagram-js/lib/util/ModelUtil';\n\nimport { isAny } from '../modeling/util/ModelingUtil';\nimport { getRoundRectPath, getCirclePath } from '../../draw/BpmnRenderUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n * @typedef {import('diagram-js/lib/core/GraphicsFactory').default} GraphicsFactory\n * @typedef {import('../outline/OutlineProvider').default} Outline\n * @typedef {import('diagram-js/lib/features/selection').default} Selection\n *\n * @typedef {import('diagram-js/lib/model/Types').Element} Element\n */\n\nconst ALLOWED_ELEMENTS = [ 'bpmn:Event', 'bpmn:SequenceFlow', 'bpmn:Gateway' ];\n\nconst LINE_STYLE = {\n  class: 'bjs-label-link',\n  stroke: 'var(--element-selected-outline-secondary-stroke-color)',\n  strokeDasharray: '5, 5',\n};\n\nconst DISTANCE_THRESHOLD = 15;\nconst PATH_OFFSET = 2;\n\n/**\n * Render a line between an external label and its target element,\n * when either is selected.\n *\n * @param {EventBus} eventBus\n * @param {Canvas} canvas\n * @param {GraphicsFactory} graphicsFactory\n * @param {Outline} outline\n */\nexport default function LabelLink(eventBus, canvas, graphicsFactory, outline, selection) {\n\n  const layer = canvas.getLayer('overlays');\n\n  eventBus.on([ 'selection.changed', 'shape.changed' ], function() {\n    cleanUp();\n  });\n\n  eventBus.on('selection.changed', function({ newSelection }) {\n\n    const allowedElements = newSelection.filter(element => isAny(element, ALLOWED_ELEMENTS));\n\n    if (allowedElements.length === 1) {\n      const element = allowedElements[0];\n      if (isLabel(element)) {\n        createLink(element, element.labelTarget, newSelection);\n      } else if (element.labels?.length) {\n        createLink(element.labels[0], element, newSelection);\n      }\n    }\n\n    // Only allowed when both label and its target are selected\n    if (allowedElements.length === 2) {\n      const label = allowedElements.find(isLabel);\n      const target = allowedElements.find(el => el.labels?.includes(label));\n      if (label && target) {\n        createLink(label, target, newSelection);\n      }\n    }\n  });\n\n  eventBus.on('shape.changed', function({ element }) {\n\n    if (!isAny(element, ALLOWED_ELEMENTS) || !isElementSelected(element)) {\n      return;\n    }\n\n    if (isLabel(element)) {\n      createLink(element, element.labelTarget, selection.get());\n    } else if (element.labels?.length) {\n      createLink(element.labels[0], element, selection.get());\n    }\n  });\n\n  /**\n   * Render a line between an external label and its target.\n   *\n   * @param {Element} label\n   * @param {Element} target\n   * @param {Element[]} selection\n   */\n  function createLink(label, target, selection = []) {\n\n    // Create an auxiliary line between label and target mid points\n    const line = createLine(\n      [ getMid(target), getMid(label) ],\n      LINE_STYLE\n    );\n    const linePath = line.getAttribute('d');\n\n    // Calculate the intersection point between line and label\n    const labelSelected = selection.includes(label);\n    const labelPath = labelSelected ? getElementOutlinePath(label) : getElementPath(label);\n    const labelInter = getElementLineIntersection(labelPath, linePath);\n\n    // Label on top of the target\n    if (!labelInter) {\n      return;\n    }\n\n    // Calculate the intersection point between line and label\n    // If the target is a sequence flow, there is no intersection,\n    // so we link to the middle of it.\n    const targetSelected = selection.includes(target);\n    const targetPath = targetSelected ? getElementOutlinePath(target) : getElementPath(target);\n    const targetInter = getElementLineIntersection(targetPath, linePath) || getMid(target);\n\n    // Do not draw a link if the points are too close\n    const distance = getDistancePointPoint(targetInter, labelInter);\n    if (distance < DISTANCE_THRESHOLD) {\n      return;\n    }\n\n    // Connect the actual closest points\n    updateLine(line, [ targetInter, labelInter ]);\n    svgAppend(layer, line);\n  }\n\n  /**\n   * Remove all existing label links.\n   */\n  function cleanUp() {\n    domQueryAll(`.${LINE_STYLE.class}`, layer).forEach(svgRemove);\n  }\n\n  /**\n   * Get element's slightly expanded outline path.\n   *\n   * @param {Element} element\n   * @returns {string} svg path\n   */\n  function getElementOutlinePath(element) {\n    const outlineShape = outline.getOutline(element);\n    const outlineOffset = outline.offset;\n\n    if (!outlineShape) {\n      return getElementPath(element);\n    }\n\n    if (outlineShape.x) {\n      const shape = {\n        x: element.x + parseSvgNumAttr(outlineShape, 'x') - PATH_OFFSET,\n        y: element.y + parseSvgNumAttr(outlineShape, 'y') - PATH_OFFSET,\n        width: parseSvgNumAttr(outlineShape, 'width') + PATH_OFFSET * 2,\n        height: parseSvgNumAttr(outlineShape, 'height') + PATH_OFFSET * 2\n      };\n\n      return getRoundRectPath(shape, parseSvgNumAttr(outlineShape, 'rx'));\n    }\n\n    if (outlineShape.cx) {\n      const shape = {\n        x: element.x - outlineOffset,\n        y: element.y - outlineOffset,\n        width: parseSvgNumAttr(outlineShape, 'r') * 2,\n        height: parseSvgNumAttr(outlineShape, 'r') * 2,\n      };\n\n      return getCirclePath(shape);\n    }\n  }\n\n  function getElementPath(element) {\n    return graphicsFactory.getShapePath(element);\n  }\n\n  function isElementSelected(element) {\n    return selection.get().includes(element);\n  }\n}\n\nLabelLink.$inject = [\n  'eventBus',\n  'canvas',\n  'graphicsFactory',\n  'outline',\n  'selection'\n];\n\n/**\n * Get numeric attribute from SVG element\n * or 0 if not present.\n *\n * @param {SVGElement} node\n * @param {string} attr\n * @returns {number}\n */\nfunction parseSvgNumAttr(node, attr) {\n  return parseFloat(svgAttr(node, attr) || 0);\n}\n"
  },
  {
    "path": "lib/features/label-link/index.js",
    "content": "import SelectionModule from 'diagram-js/lib/features/selection';\nimport OutlineModule from 'diagram-js/lib/features/outline';\n\nimport LabelLink from './LabelLink';\n\nexport default {\n  __depends__: [\n    SelectionModule,\n    OutlineModule\n  ],\n  __init__: [\n    'labelLink'\n  ],\n  labelLink: [ 'type', LabelLink ]\n};\n"
  },
  {
    "path": "lib/features/modeling/BpmnFactory.js",
    "content": "import {\n  map,\n  assign,\n  pick\n} from 'min-dash';\n\nimport {\n  isAny\n} from './util/ModelingUtil';\n\nimport {\n  is\n} from '../../util/ModelUtil';\n\n/**\n * @typedef {import('../../model/Types').Moddle} Moddle\n * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n *\n * @typedef {import('diagram-js/lib/util/Types').Point} Point\n */\n\n/**\n * A factory for BPMN elements.\n *\n * @param {Moddle} moddle\n */\nexport default function BpmnFactory(moddle) {\n  this._model = moddle;\n}\n\nBpmnFactory.$inject = [ 'moddle' ];\n\n/**\n * @param {ModdleElement} element\n *\n * @return {boolean}\n */\nBpmnFactory.prototype._needsId = function(element) {\n  return isAny(element, [\n    'bpmn:RootElement',\n    'bpmn:FlowElement',\n    'bpmn:MessageFlow',\n    'bpmn:DataAssociation',\n    'bpmn:Artifact',\n    'bpmn:Participant',\n    'bpmn:Lane',\n    'bpmn:LaneSet',\n    'bpmn:Process',\n    'bpmn:Collaboration',\n    'bpmndi:BPMNShape',\n    'bpmndi:BPMNEdge',\n    'bpmndi:BPMNDiagram',\n    'bpmndi:BPMNPlane',\n    'bpmn:Property',\n    'bpmn:CategoryValue'\n  ]);\n};\n\n/**\n * @param {ModdleElement} element\n */\nBpmnFactory.prototype._ensureId = function(element) {\n  if (element.id) {\n    this._model.ids.claim(element.id, element);\n    return;\n  }\n\n  // generate semantic ids for elements\n  // bpmn:SequenceFlow -> SequenceFlow_ID\n  var prefix;\n\n  if (is(element, 'bpmn:Activity')) {\n    prefix = 'Activity';\n  } else if (is(element, 'bpmn:Event')) {\n    prefix = 'Event';\n  } else if (is(element, 'bpmn:Gateway')) {\n    prefix = 'Gateway';\n  } else if (isAny(element, [ 'bpmn:SequenceFlow', 'bpmn:MessageFlow' ])) {\n    prefix = 'Flow';\n  } else {\n    prefix = (element.$type || '').replace(/^[^:]*:/g, '');\n  }\n\n  prefix += '_';\n\n  if (!element.id && this._needsId(element)) {\n    element.id = this._model.ids.nextPrefixed(prefix, element);\n  }\n};\n\n/**\n * Create BPMN element.\n *\n * @param {string} type\n * @param {Object} [attrs]\n *\n * @return {ModdleElement}\n */\nBpmnFactory.prototype.create = function(type, attrs) {\n  var element = this._model.create(type, attrs || {});\n\n  this._ensureId(element);\n\n  return element;\n};\n\n/**\n * @return {ModdleElement}\n */\nBpmnFactory.prototype.createDiLabel = function() {\n  return this.create('bpmndi:BPMNLabel', {\n    bounds: this.createDiBounds()\n  });\n};\n\n/**\n * @param {ModdleElement} semantic\n * @param {Object} [attrs]\n * @return {ModdleElement}\n */\nBpmnFactory.prototype.createDiShape = function(semantic, attrs) {\n  return this.create('bpmndi:BPMNShape', assign({\n    bpmnElement: semantic,\n    bounds: this.createDiBounds()\n  }, attrs));\n};\n\n/**\n * @return {ModdleElement}\n */\nBpmnFactory.prototype.createDiBounds = function(bounds) {\n  return this.create('dc:Bounds', bounds);\n};\n\n/**\n * @param {Point[]} waypoints\n *\n * @return {ModdleElement[]}\n */\nBpmnFactory.prototype.createDiWaypoints = function(waypoints) {\n  var self = this;\n\n  return map(waypoints, function(pos) {\n    return self.createDiWaypoint(pos);\n  });\n};\n\n/**\n * @param {Point} point\n *\n * @return {ModdleElement}\n */\nBpmnFactory.prototype.createDiWaypoint = function(point) {\n  return this.create('dc:Point', pick(point, [ 'x', 'y' ]));\n};\n\n/**\n * @param {ModdleElement} semantic\n * @param {Object} [attrs]\n *\n * @return {ModdleElement}\n */\nBpmnFactory.prototype.createDiEdge = function(semantic, attrs) {\n  return this.create('bpmndi:BPMNEdge', assign({\n    bpmnElement: semantic,\n    waypoint: this.createDiWaypoints([])\n  }, attrs));\n};\n\n/**\n * @param {ModdleElement} semantic\n * @param {Object} [attrs]\n *\n * @return {ModdleElement}\n */\nBpmnFactory.prototype.createDiPlane = function(semantic, attrs) {\n  return this.create('bpmndi:BPMNPlane', assign({\n    bpmnElement: semantic\n  }, attrs));\n};\n"
  },
  {
    "path": "lib/features/modeling/BpmnLayouter.js",
    "content": "import inherits from 'inherits-browser';\n\nimport {\n  assign\n} from 'min-dash';\n\nimport BaseLayouter from 'diagram-js/lib/layout/BaseLayouter';\n\nimport {\n  repairConnection,\n  withoutRedundantPoints\n} from 'diagram-js/lib/layout/ManhattanLayout';\n\nimport {\n  getMid,\n  getOrientation\n} from 'diagram-js/lib/layout/LayoutUtil';\n\nimport {\n  isExpanded\n} from '../../util/DiUtil';\n\nimport { is } from '../../util/ModelUtil';\n\nimport { isDirectionHorizontal } from './util/ModelingUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n *\n * @typedef {import('diagram-js/lib/util/Types').Point} Point\n *\n * @typedef {import('../../model/Types').Connection} Connection\n * @typedef {import('../../model/Types').Element} Element\n *\n * @typedef {import('diagram-js/lib/layout/BaseLayouter').LayoutConnectionHints} LayoutConnectionHints\n *\n * @typedef { {\n *   source?: Element;\n *   target?: Element;\n *   waypoints?: Point[];\n *   connectionStart?: Point;\n *   connectionEnd?: Point;\n * } & LayoutConnectionHints } BpmnLayoutConnectionHints\n */\n\nvar ATTACH_ORIENTATION_PADDING = -10,\n    BOUNDARY_TO_HOST_THRESHOLD = 40;\n\n// layout all connection between flow elements h:h, except for\n// (1) outgoing of boundary events -> layout based on attach orientation and target orientation\n// (2) incoming/outgoing of gateways -> v:h for outgoing, h:v for incoming\n// (3) loops connect sides clockwise\nvar PREFERRED_LAYOUTS_HORIZONTAL = {\n  default: [ 'h:h' ],\n  fromGateway: [ 'v:h' ],\n  toGateway: [ 'h:v' ],\n  loop: {\n    fromTop: [ 't:r' ],\n    fromRight: [ 'r:b' ],\n    fromLeft: [ 'l:t' ],\n    fromBottom: [ 'b:l' ]\n  },\n  boundaryLoop: {\n    alternateHorizontalSide: 'b',\n    alternateVerticalSide: 'l',\n    default: 'v'\n  },\n  messageFlow: [ 'straight', 'v:v' ],\n  subProcess: [ 'straight', 'h:h' ],\n  isHorizontal: true\n};\n\n// for vertical layouts, switch h and v and loop counter-clockwise\nvar PREFERRED_LAYOUTS_VERTICAL = {\n  default: [ 'v:v' ],\n  fromGateway: [ 'h:v' ],\n  toGateway: [ 'v:h' ],\n  loop: {\n    fromTop: [ 't:l' ],\n    fromRight: [ 'r:t' ],\n    fromLeft: [ 'l:b' ],\n    fromBottom: [ 'b:r' ]\n  },\n  boundaryLoop: {\n    alternateHorizontalSide: 't',\n    alternateVerticalSide: 'r',\n    default: 'h'\n  },\n  messageFlow: [ 'straight', 'h:h' ],\n  subProcess: [ 'straight', 'v:v' ],\n  isHorizontal: false\n};\n\nvar oppositeOrientationMapping = {\n  'top': 'bottom',\n  'top-right': 'bottom-left',\n  'top-left': 'bottom-right',\n  'right': 'left',\n  'bottom': 'top',\n  'bottom-right': 'top-left',\n  'bottom-left': 'top-right',\n  'left': 'right'\n};\n\nvar orientationDirectionMapping = {\n  top: 't',\n  right: 'r',\n  bottom: 'b',\n  left: 'l'\n};\n\nexport default function BpmnLayouter(elementRegistry) {\n  this._elementRegistry = elementRegistry;\n}\n\ninherits(BpmnLayouter, BaseLayouter);\n\n/**\n * Returns waypoints of laid out connection.\n *\n * @param {Connection} connection\n * @param {BpmnLayoutConnectionHints} [hints]\n *\n * @return {Point[]}\n */\nBpmnLayouter.prototype.layoutConnection = function(connection, hints) {\n  if (!hints) {\n    hints = {};\n  }\n\n  var source = hints.source || connection.source,\n      target = hints.target || connection.target,\n      waypoints = hints.waypoints || connection.waypoints,\n      connectionStart = hints.connectionStart,\n      connectionEnd = hints.connectionEnd,\n      elementRegistry = this._elementRegistry;\n\n  var manhattanOptions,\n      updatedWaypoints;\n\n  if (!connectionStart) {\n    connectionStart = getConnectionDocking(waypoints && waypoints[ 0 ], source);\n  }\n\n  if (!connectionEnd) {\n    connectionEnd = getConnectionDocking(waypoints && waypoints[ waypoints.length - 1 ], target);\n  }\n\n  if (is(connection, 'bpmn:Association') ||\n      is(connection, 'bpmn:DataAssociation')) {\n\n    if (waypoints && !isCompensationAssociation(source, target)) {\n      return [].concat([ connectionStart ], waypoints.slice(1, -1), [ connectionEnd ]);\n    }\n  }\n\n  var layout = isDirectionHorizontal(source, elementRegistry) ? PREFERRED_LAYOUTS_HORIZONTAL : PREFERRED_LAYOUTS_VERTICAL;\n\n  if (is(connection, 'bpmn:MessageFlow')) {\n    manhattanOptions = getMessageFlowManhattanOptions(source, target, layout);\n  } else if (is(connection, 'bpmn:SequenceFlow') || isCompensationAssociation(source, target)) {\n\n    if (source === target) {\n      manhattanOptions = {\n        preferredLayouts: getLoopPreferredLayout(source, connection, layout)\n      };\n    } else if (is(source, 'bpmn:BoundaryEvent')) {\n      manhattanOptions = {\n        preferredLayouts: getBoundaryEventPreferredLayouts(source, target, connectionEnd, layout)\n      };\n    } else if (isExpandedSubProcess(source) || isExpandedSubProcess(target)) {\n      manhattanOptions = {\n        preferredLayouts: layout.subProcess,\n        preserveDocking: getSubProcessPreserveDocking(source)\n      };\n    } else if (is(source, 'bpmn:Gateway')) {\n      manhattanOptions = {\n        preferredLayouts: layout.fromGateway\n      };\n    } else if (is(target, 'bpmn:Gateway')) {\n      manhattanOptions = {\n        preferredLayouts: layout.toGateway\n      };\n    } else {\n      manhattanOptions = {\n        preferredLayouts: layout.default\n      };\n    }\n  }\n\n  if (manhattanOptions) {\n    manhattanOptions = assign(manhattanOptions, hints);\n\n    updatedWaypoints = withoutRedundantPoints(repairConnection(\n      source,\n      target,\n      connectionStart,\n      connectionEnd,\n      waypoints,\n      manhattanOptions\n    ));\n  }\n\n  return updatedWaypoints || [ connectionStart, connectionEnd ];\n};\n\n\n// helpers //////////\n\nfunction getAttachOrientation(attachedElement) {\n  var hostElement = attachedElement.host;\n\n  return getOrientation(getMid(attachedElement), hostElement, ATTACH_ORIENTATION_PADDING);\n}\n\nfunction getMessageFlowManhattanOptions(source, target, layout) {\n  return {\n    preferredLayouts: layout.messageFlow,\n    preserveDocking: getMessageFlowPreserveDocking(source, target)\n  };\n}\n\nfunction getMessageFlowPreserveDocking(source, target) {\n\n  // (1) docking element connected to participant has precedence\n  if (is(target, 'bpmn:Participant')) {\n    return 'source';\n  }\n\n  if (is(source, 'bpmn:Participant')) {\n    return 'target';\n  }\n\n  // (2) docking element connected to expanded sub-process has precedence\n  if (isExpandedSubProcess(target)) {\n    return 'source';\n  }\n\n  if (isExpandedSubProcess(source)) {\n    return 'target';\n  }\n\n  // (3) docking event has precedence\n  if (is(target, 'bpmn:Event')) {\n    return 'target';\n  }\n\n  if (is(source, 'bpmn:Event')) {\n    return 'source';\n  }\n\n  return null;\n}\n\nfunction getSubProcessPreserveDocking(source) {\n  return isExpandedSubProcess(source) ? 'target' : 'source';\n}\n\nfunction getConnectionDocking(point, shape) {\n  return point ? (point.original || point) : getMid(shape);\n}\n\nfunction isCompensationAssociation(source, target) {\n  return is(target, 'bpmn:Activity') &&\n    is(source, 'bpmn:BoundaryEvent') &&\n    target.businessObject.isForCompensation;\n}\n\nfunction isExpandedSubProcess(element) {\n  return is(element, 'bpmn:SubProcess') && isExpanded(element);\n}\n\nfunction isSame(a, b) {\n  return a === b;\n}\n\nfunction isAnyOrientation(orientation, orientations) {\n  return orientations.indexOf(orientation) !== -1;\n}\n\nfunction getHorizontalOrientation(orientation) {\n  var matches = /right|left/.exec(orientation);\n\n  return matches && matches[0];\n}\n\nfunction getVerticalOrientation(orientation) {\n  var matches = /top|bottom/.exec(orientation);\n\n  return matches && matches[0];\n}\n\nfunction isOppositeOrientation(a, b) {\n  return oppositeOrientationMapping[a] === b;\n}\n\nfunction isOppositeHorizontalOrientation(a, b) {\n  var horizontalOrientation = getHorizontalOrientation(a);\n\n  var oppositeHorizontalOrientation = oppositeOrientationMapping[horizontalOrientation];\n\n  return b.indexOf(oppositeHorizontalOrientation) !== -1;\n}\n\nfunction isOppositeVerticalOrientation(a, b) {\n  var verticalOrientation = getVerticalOrientation(a);\n\n  var oppositeVerticalOrientation = oppositeOrientationMapping[verticalOrientation];\n\n  return b.indexOf(oppositeVerticalOrientation) !== -1;\n}\n\nfunction isHorizontalOrientation(orientation) {\n  return orientation === 'right' || orientation === 'left';\n}\n\nfunction getLoopPreferredLayout(source, connection, layout) {\n  var waypoints = connection.waypoints;\n\n  var orientation = waypoints && waypoints.length && getOrientation(waypoints[0], source);\n\n  if (orientation === 'top') {\n    return layout.loop.fromTop;\n  } else if (orientation === 'right') {\n    return layout.loop.fromRight;\n  } else if (orientation === 'left') {\n    return layout.loop.fromLeft;\n  }\n\n  return layout.loop.fromBottom;\n}\n\nfunction getBoundaryEventPreferredLayouts(source, target, end, layout) {\n  var sourceMid = getMid(source),\n      targetMid = getMid(target),\n      attachOrientation = getAttachOrientation(source),\n      sourceLayout,\n      targetLayout;\n\n  var isLoop = isSame(source.host, target);\n\n  var attachedToSide = isAnyOrientation(attachOrientation, [ 'top', 'right', 'bottom', 'left' ]);\n\n  var targetOrientation = getOrientation(targetMid, sourceMid, {\n    x: source.width / 2 + target.width / 2,\n    y: source.height / 2 + target.height / 2\n  });\n\n  if (isLoop) {\n    return getBoundaryEventLoopLayout(attachOrientation, attachedToSide, source, target, end, layout);\n  }\n\n  // source layout\n  sourceLayout = getBoundaryEventSourceLayout(attachOrientation, targetOrientation, attachedToSide, layout.isHorizontal);\n\n  // target layout\n  targetLayout = getBoundaryEventTargetLayout(attachOrientation, targetOrientation, attachedToSide, layout.isHorizontal);\n\n  return [ sourceLayout + ':' + targetLayout ];\n}\n\nfunction getBoundaryEventLoopLayout(attachOrientation, attachedToSide, source, target, end, layout) {\n  var orientation = attachedToSide ? attachOrientation : layout.isHorizontal ? getVerticalOrientation(attachOrientation) : getHorizontalOrientation(attachOrientation),\n      sourceLayout = orientationDirectionMapping[ orientation ],\n      targetLayout;\n\n  if (attachedToSide) {\n    if (isHorizontalOrientation(attachOrientation)) {\n      targetLayout = shouldConnectToSameSide('y', source, target, end) ? 'h' : layout.boundaryLoop.alternateHorizontalSide;\n    } else {\n      targetLayout = shouldConnectToSameSide('x', source, target, end) ? 'v' : layout.boundaryLoop.alternateVerticalSide;\n    }\n  } else {\n    targetLayout = layout.boundaryLoop.default;\n  }\n\n  return [ sourceLayout + ':' + targetLayout ];\n}\n\nfunction shouldConnectToSameSide(axis, source, target, end) {\n  var threshold = BOUNDARY_TO_HOST_THRESHOLD;\n\n  return !(\n    areCloseOnAxis(axis, end, target, threshold) ||\n    areCloseOnAxis(axis, end, {\n      x: target.x + target.width,\n      y: target.y + target.height\n    }, threshold) ||\n    areCloseOnAxis(axis, end, getMid(source), threshold)\n  );\n}\n\nfunction areCloseOnAxis(axis, a, b, threshold) {\n  return Math.abs(a[ axis ] - b[ axis ]) < threshold;\n}\n\nfunction getBoundaryEventSourceLayout(attachOrientation, targetOrientation, attachedToSide, isHorizontal) {\n\n  // attached to either top, right, bottom or left side\n  if (attachedToSide) {\n    return orientationDirectionMapping[ attachOrientation ];\n  }\n\n  // attached to either top-right, top-left, bottom-right or bottom-left corner\n\n  var verticalAttachOrientation = getVerticalOrientation(attachOrientation),\n      horizontalAttachOrientation = getHorizontalOrientation(attachOrientation),\n      verticalTargetOrientation = getVerticalOrientation(targetOrientation),\n      horizontalTargetOrientation = getHorizontalOrientation(targetOrientation);\n\n  if (isHorizontal) {\n\n    // same vertical or opposite horizontal orientation\n    if (\n      isSame(verticalAttachOrientation, verticalTargetOrientation) ||\n      isOppositeOrientation(horizontalAttachOrientation, horizontalTargetOrientation)\n    ) {\n      return orientationDirectionMapping[ verticalAttachOrientation ];\n    }\n  } else {\n\n    // same horizontal or opposite vertical orientation\n    if (\n      isSame(horizontalAttachOrientation, horizontalTargetOrientation) ||\n      isOppositeOrientation(verticalAttachOrientation, verticalTargetOrientation)\n    ) {\n      return orientationDirectionMapping[ horizontalAttachOrientation ];\n    }\n  }\n\n  // fallback\n  return orientationDirectionMapping[ isHorizontal ? horizontalAttachOrientation : verticalAttachOrientation ];\n}\n\nfunction getBoundaryEventTargetLayout(attachOrientation, targetOrientation, attachedToSide, isHorizontal) {\n\n  // attached to either top, right, bottom or left side\n  if (attachedToSide) {\n    if (isHorizontalOrientation(attachOrientation)) {\n\n      // orientation is right or left\n\n      // opposite horizontal orientation or same orientation\n      if (\n        isOppositeHorizontalOrientation(attachOrientation, targetOrientation) ||\n        isSame(attachOrientation, targetOrientation)\n      ) {\n        return 'h';\n      }\n\n      // fallback\n      return 'v';\n    } else {\n\n      // orientation is top or bottom\n\n      // opposite vertical orientation or same orientation\n      if (\n        isOppositeVerticalOrientation(attachOrientation, targetOrientation) ||\n        isSame(attachOrientation, targetOrientation)\n      ) {\n        return 'v';\n      }\n\n      // fallback\n      return 'h';\n    }\n  }\n\n  // attached to either top-right, top-left, bottom-right or bottom-left corner,\n  // or strictly above/below or left/right of the target. In the corner case,\n  // the orientation is compared on the counter-axis to decide the layout.\n\n  var verticalAttachOrientation = getVerticalOrientation(attachOrientation),\n      horizontalAttachOrientation = getHorizontalOrientation(attachOrientation),\n      verticalTargetOrientation = getVerticalOrientation(targetOrientation),\n      horizontalTargetOrientation = getHorizontalOrientation(targetOrientation);\n\n  // If the target is strictly above/below (no horizontal orientation)\n  if (verticalTargetOrientation && !horizontalTargetOrientation) {\n    return 'v';\n  }\n\n  // If the target is strictly left/right (no vertical orientation)\n  if (horizontalTargetOrientation && !verticalTargetOrientation) {\n    return 'h';\n  }\n\n\n  if (isHorizontal) {\n    if (isSame(verticalAttachOrientation, verticalTargetOrientation)) {\n      return 'h';\n    } else {\n      return 'v';\n    }\n  } else {\n    if (isSame(horizontalAttachOrientation, horizontalTargetOrientation)) {\n      return 'v';\n    } else {\n      return 'h';\n    }\n  }\n}\n\nBpmnLayouter.$inject = [ 'elementRegistry' ];\n"
  },
  {
    "path": "lib/features/modeling/BpmnUpdater.js",
    "content": "import {\n  assign,\n  forEach\n} from 'min-dash';\n\nimport inherits from 'inherits-browser';\n\nimport {\n  add as collectionAdd,\n  remove as collectionRemove\n} from 'diagram-js/lib/util/Collections';\n\nimport {\n  getBusinessObject,\n  getDi,\n  is\n} from '../../util/ModelUtil';\n\nimport { isAny } from './util/ModelingUtil';\n\nimport {\n  getLabel,\n  isLabel,\n  isLabelExternal\n} from '../../util/LabelUtil';\n\nimport { isPlane } from '../../util/DrilldownUtil';\n\nimport { delta } from 'diagram-js/lib/util/PositionUtil';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('./BpmnFactory').default} BpmnFactory\n * @typedef {import('diagram-js/lib/layout/CroppingConnectionDocking').default} CroppingConnectionDocking\n *\n * @typedef {import('../../model/Types').Connection} Connection\n * @typedef {import('../../model/Types').Element} Element\n * @typedef {import('../../model/Types').Shape} Shape\n * @typedef {import('../../model/Types').Parent} Parent\n * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n */\n\n/**\n * A handler responsible for updating the underlying BPMN 2.0 XML & DI\n * once changes on the diagram happen.\n *\n * @param {EventBus} eventBus\n * @param {BpmnFactory} bpmnFactory\n * @param {CroppingConnectionDocking} connectionDocking\n */\nexport default function BpmnUpdater(\n    eventBus,\n    bpmnFactory,\n    connectionDocking\n) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  this._bpmnFactory = bpmnFactory;\n\n  var self = this;\n\n\n  // connection cropping //////////////////////\n\n  // crop connection ends during create/update\n  function cropConnection(e) {\n    var context = e.context,\n        hints = context.hints || {},\n        connection;\n\n    if (!context.cropped && hints.createElementsBehavior !== false) {\n      connection = context.connection;\n      connection.waypoints = connectionDocking.getCroppedWaypoints(connection);\n      context.cropped = true;\n    }\n  }\n\n  this.executed([\n    'connection.layout',\n    'connection.create'\n  ], cropConnection);\n\n  this.reverted([ 'connection.layout' ], function(e) {\n    delete e.context.cropped;\n  });\n\n\n\n  // BPMN + DI update //////////////////////\n\n\n  // update parent\n  function updateParent(e) {\n    var context = e.context;\n\n    self.updateParent(context.shape || context.connection, context.oldParent);\n  }\n\n  function reverseUpdateParent(e) {\n    var context = e.context;\n\n    var element = context.shape || context.connection,\n\n        // oldParent is the (old) new parent, because we are undoing\n        oldParent = context.parent || context.newParent;\n\n    self.updateParent(element, oldParent);\n  }\n\n  this.executed([\n    'shape.move',\n    'shape.create',\n    'shape.delete',\n    'connection.create',\n    'connection.move',\n    'connection.delete'\n  ], ifBpmn(updateParent));\n\n  this.reverted([\n    'shape.move',\n    'shape.create',\n    'shape.delete',\n    'connection.create',\n    'connection.move',\n    'connection.delete'\n  ], ifBpmn(reverseUpdateParent));\n\n  /*\n   * ## Updating Parent\n   *\n   * When morphing a Process into a Collaboration or vice-versa,\n   * make sure that both the *semantic* and *di* parent of each element\n   * is updated.\n   *\n   */\n  function updateRoot(event) {\n    var context = event.context,\n        oldRoot = context.oldRoot,\n        children = oldRoot.children;\n\n    forEach(children, function(child) {\n      if (is(child, 'bpmn:BaseElement')) {\n        self.updateParent(child);\n      }\n    });\n  }\n\n  this.executed([ 'canvas.updateRoot' ], updateRoot);\n  this.reverted([ 'canvas.updateRoot' ], updateRoot);\n\n\n  // update bounds\n  function updateBounds(e) {\n    var shape = e.context.shape;\n\n    if (!is(shape, 'bpmn:BaseElement')) {\n      return;\n    }\n\n    self.updateBounds(shape);\n  }\n\n  this.executed([ 'shape.move', 'shape.create', 'shape.resize' ], ifBpmn(function(event) {\n\n    // exclude labels because they're handled separately during shape.changed\n    if (event.context.shape.type === 'label') {\n      return;\n    }\n\n    updateBounds(event);\n  }));\n\n  this.reverted([ 'shape.move', 'shape.create', 'shape.resize' ], ifBpmn(function(event) {\n\n    // exclude labels because they're handled separately during shape.changed\n    if (event.context.shape.type === 'label') {\n      return;\n    }\n\n    updateBounds(event);\n  }));\n\n  // Handle labels separately. This is necessary, because the label bounds have to be updated\n  // every time its shape changes, not only on move, create and resize.\n  eventBus.on('shape.changed', function(event) {\n    if (event.element.type === 'label') {\n      updateBounds({ context: { shape: event.element } });\n    }\n  });\n\n  // attach / detach connection\n  function updateConnection(e) {\n    self.updateConnection(e.context);\n  }\n\n  this.executed([\n    'connection.create',\n    'connection.move',\n    'connection.delete',\n    'connection.reconnect'\n  ], ifBpmn(updateConnection));\n\n  this.reverted([\n    'connection.create',\n    'connection.move',\n    'connection.delete',\n    'connection.reconnect'\n  ], ifBpmn(updateConnection));\n\n\n  // update waypoints\n  function updateConnectionWaypoints(e) {\n    self.updateConnectionWaypoints(e.context.connection);\n  }\n\n  this.executed([\n    'connection.layout',\n    'connection.move',\n    'connection.updateWaypoints',\n  ], ifBpmn(updateConnectionWaypoints));\n\n  this.reverted([\n    'connection.layout',\n    'connection.move',\n    'connection.updateWaypoints',\n  ], ifBpmn(updateConnectionWaypoints));\n\n  // update conditional/default flows\n  this.executed('connection.reconnect', ifBpmn(function(event) {\n    var context = event.context,\n        connection = context.connection,\n        oldSource = context.oldSource,\n        newSource = context.newSource,\n        connectionBo = getBusinessObject(connection),\n        oldSourceBo = getBusinessObject(oldSource),\n        newSourceBo = getBusinessObject(newSource);\n\n    // remove condition from connection on reconnect to new source\n    // if new source can NOT have condional sequence flow\n    if (connectionBo.conditionExpression && !isAny(newSourceBo, [\n      'bpmn:Activity',\n      'bpmn:ExclusiveGateway',\n      'bpmn:InclusiveGateway'\n    ])) {\n      context.oldConditionExpression = connectionBo.conditionExpression;\n\n      delete connectionBo.conditionExpression;\n    }\n\n    // remove default from old source flow on reconnect to new source\n    // if source changed\n    if (oldSource !== newSource && oldSourceBo.default === connectionBo) {\n      context.oldDefault = oldSourceBo.default;\n\n      delete oldSourceBo.default;\n    }\n  }));\n\n  this.reverted('connection.reconnect', ifBpmn(function(event) {\n    var context = event.context,\n        connection = context.connection,\n        oldSource = context.oldSource,\n        newSource = context.newSource,\n        connectionBo = getBusinessObject(connection),\n        oldSourceBo = getBusinessObject(oldSource),\n        newSourceBo = getBusinessObject(newSource);\n\n    // add condition to connection on revert reconnect to new source\n    if (context.oldConditionExpression) {\n      connectionBo.conditionExpression = context.oldConditionExpression;\n    }\n\n    // add default to old source on revert reconnect to new source\n    if (context.oldDefault) {\n      oldSourceBo.default = context.oldDefault;\n\n      delete newSourceBo.default;\n    }\n  }));\n\n  // update attachments\n  function updateAttachment(e) {\n    self.updateAttachment(e.context);\n  }\n\n  this.executed([ 'element.updateAttachment' ], ifBpmn(updateAttachment));\n  this.reverted([ 'element.updateAttachment' ], ifBpmn(updateAttachment));\n\n\n  // update BPMNLabel\n  this.executed('element.updateLabel', ifBpmn(updateBPMNLabel));\n  this.reverted('element.updateLabel', ifBpmn(updateBPMNLabel));\n\n  function updateBPMNLabel(event) {\n    const { element } = event.context,\n          label = getLabel(element);\n    const di = getDi(element),\n          diLabel = di && di.get('label');\n\n    if (isLabelExternal(element) || isPlane(element)) {\n      return;\n    }\n\n    if (label && !diLabel) {\n      di.set('label', bpmnFactory.create('bpmndi:BPMNLabel'));\n    } else if (!label && diLabel) {\n      di.set('label', undefined);\n    }\n  }\n}\n\ninherits(BpmnUpdater, CommandInterceptor);\n\nBpmnUpdater.$inject = [\n  'eventBus',\n  'bpmnFactory',\n  'connectionDocking'\n];\n\n\n// implementation //////////////////////\n\n/**\n * @param { {\n *   shape: Shape;\n *   host: Shape;\n * } } context\n */\nBpmnUpdater.prototype.updateAttachment = function(context) {\n\n  var shape = context.shape,\n      businessObject = shape.businessObject,\n      host = shape.host;\n\n  businessObject.attachedToRef = host && host.businessObject;\n};\n\n/**\n * @param {Element} element\n * @param {Parent} oldParent\n */\nBpmnUpdater.prototype.updateParent = function(element, oldParent) {\n\n  // do not update BPMN 2.0 label parent\n  if (isLabel(element)) {\n    return;\n  }\n\n  // data stores in collaborations are handled separately by DataStoreBehavior\n  if (is(element, 'bpmn:DataStoreReference') &&\n      element.parent &&\n      is(element.parent, 'bpmn:Collaboration')) {\n    return;\n  }\n\n  var parentShape = element.parent;\n\n  var businessObject = element.businessObject,\n      di = getDi(element),\n      parentBusinessObject = parentShape && parentShape.businessObject,\n      parentDi = getDi(parentShape);\n\n  if (is(element, 'bpmn:FlowNode')) {\n    this.updateFlowNodeRefs(businessObject, parentBusinessObject, oldParent && oldParent.businessObject);\n  }\n\n  if (is(element, 'bpmn:DataOutputAssociation')) {\n    if (element.source) {\n      parentBusinessObject = element.source.businessObject;\n    } else {\n      parentBusinessObject = null;\n    }\n  }\n\n  if (is(element, 'bpmn:DataInputAssociation')) {\n    if (element.target) {\n      parentBusinessObject = element.target.businessObject;\n    } else {\n      parentBusinessObject = null;\n    }\n  }\n\n  this.updateSemanticParent(businessObject, parentBusinessObject);\n\n  if (is(element, 'bpmn:DataObjectReference') && businessObject.dataObjectRef) {\n    this.updateSemanticParent(businessObject.dataObjectRef, parentBusinessObject);\n  }\n\n  this.updateDiParent(di, parentDi);\n};\n\n/**\n * @param {Shape} shape\n */\nBpmnUpdater.prototype.updateBounds = function(shape) {\n\n  var di = getDi(shape),\n      embeddedLabelBounds = getEmbeddedLabelBounds(shape);\n\n  // update embedded label bounds if possible\n  if (embeddedLabelBounds) {\n    var embeddedLabelBoundsDelta = delta(embeddedLabelBounds, di.get('bounds'));\n\n    assign(embeddedLabelBounds, {\n      x: shape.x + embeddedLabelBoundsDelta.x,\n      y: shape.y + embeddedLabelBoundsDelta.y\n    });\n  }\n\n  var target = isLabel(shape) ? this._getLabel(di) : di;\n\n  var bounds = target.bounds;\n\n  if (!bounds) {\n    bounds = this._bpmnFactory.createDiBounds();\n    target.set('bounds', bounds);\n  }\n\n  assign(bounds, {\n    x: shape.x,\n    y: shape.y,\n    width: shape.width,\n    height: shape.height\n  });\n};\n\n/**\n * @param {ModdleElement} businessObject\n * @param {ModdleElement} newContainment\n * @param {ModdleElement} oldContainment\n */\nBpmnUpdater.prototype.updateFlowNodeRefs = function(businessObject, newContainment, oldContainment) {\n\n  if (oldContainment === newContainment) {\n    return;\n  }\n\n  var oldRefs, newRefs;\n\n  if (is (oldContainment, 'bpmn:Lane')) {\n    oldRefs = oldContainment.get('flowNodeRef');\n    collectionRemove(oldRefs, businessObject);\n  }\n\n  if (is(newContainment, 'bpmn:Lane')) {\n    newRefs = newContainment.get('flowNodeRef');\n    collectionAdd(newRefs, businessObject);\n  }\n};\n\n/**\n * @param {Connection} connection\n * @param {Element} newSource\n * @param {Element} newTarget\n */\nBpmnUpdater.prototype.updateDiConnection = function(connection, newSource, newTarget) {\n  var connectionDi = getDi(connection),\n      newSourceDi = getDi(newSource),\n      newTargetDi = getDi(newTarget);\n\n  if (connectionDi.sourceElement && connectionDi.sourceElement.bpmnElement !== getBusinessObject(newSource)) {\n    connectionDi.sourceElement = newSource && newSourceDi;\n  }\n\n  if (connectionDi.targetElement && connectionDi.targetElement.bpmnElement !== getBusinessObject(newTarget)) {\n    connectionDi.targetElement = newTarget && newTargetDi;\n  }\n\n};\n\n/**\n * @param {ModdleElement} di\n * @param {ModdleElement} parentDi\n */\nBpmnUpdater.prototype.updateDiParent = function(di, parentDi) {\n\n  if (parentDi && !is(parentDi, 'bpmndi:BPMNPlane')) {\n    parentDi = parentDi.$parent;\n  }\n\n  if (di.$parent === parentDi) {\n    return;\n  }\n\n  var planeElements = (parentDi || di.$parent).get('planeElement');\n\n  if (parentDi) {\n    planeElements.push(di);\n    di.$parent = parentDi;\n  } else {\n    collectionRemove(planeElements, di);\n    di.$parent = null;\n  }\n};\n\n/**\n * @param {ModdleElement} element\n *\n * @return {ModdleElement}\n */\nfunction getDefinitions(element) {\n  while (element && !is(element, 'bpmn:Definitions')) {\n    element = element.$parent;\n  }\n\n  return element;\n}\n\n/**\n * @param {ModdleElement} container\n *\n * @return {ModdleElement}\n */\nBpmnUpdater.prototype.getLaneSet = function(container) {\n\n  var laneSet, laneSets;\n\n  // bpmn:Lane\n  if (is(container, 'bpmn:Lane')) {\n    laneSet = container.childLaneSet;\n\n    if (!laneSet) {\n      laneSet = this._bpmnFactory.create('bpmn:LaneSet');\n      container.childLaneSet = laneSet;\n      laneSet.$parent = container;\n    }\n\n    return laneSet;\n  }\n\n  // bpmn:Participant\n  if (is(container, 'bpmn:Participant')) {\n    container = container.processRef;\n  }\n\n  // bpmn:FlowElementsContainer\n  laneSets = container.get('laneSets');\n  laneSet = laneSets[0];\n\n  if (!laneSet) {\n    laneSet = this._bpmnFactory.create('bpmn:LaneSet');\n    laneSet.$parent = container;\n    laneSets.push(laneSet);\n  }\n\n  return laneSet;\n};\n\n/**\n * @param {ModdleElement} businessObject\n * @param {ModdleElement} newParent\n * @param {ModdleElement} visualParent\n */\nBpmnUpdater.prototype.updateSemanticParent = function(businessObject, newParent, visualParent) {\n\n  var containment;\n\n  if (businessObject.$parent === newParent) {\n    return;\n  }\n\n  if (is(businessObject, 'bpmn:DataInput') || is(businessObject, 'bpmn:DataOutput')) {\n\n    if (is(newParent, 'bpmn:Participant') && 'processRef' in newParent) {\n      newParent = newParent.processRef;\n    }\n\n    // already in correct ioSpecification\n    if ('ioSpecification' in newParent && newParent.ioSpecification === businessObject.$parent) {\n      return;\n    }\n  }\n\n  if (is(businessObject, 'bpmn:Lane')) {\n\n    if (newParent) {\n      newParent = this.getLaneSet(newParent);\n    }\n\n    containment = 'lanes';\n  } else if (is(businessObject, 'bpmn:FlowElement')) {\n\n    if (newParent) {\n\n      if (is(newParent, 'bpmn:Participant')) {\n        newParent = newParent.processRef;\n      } else if (is(newParent, 'bpmn:Lane')) {\n        do {\n\n          // unwrap Lane -> LaneSet -> (Lane | FlowElementsContainer)\n          newParent = newParent.$parent.$parent;\n        } while (is(newParent, 'bpmn:Lane'));\n\n      }\n    }\n\n    containment = 'flowElements';\n\n  } else if (is(businessObject, 'bpmn:Artifact')) {\n\n    while (newParent &&\n           !is(newParent, 'bpmn:Process') &&\n           !is(newParent, 'bpmn:SubProcess') &&\n           !is(newParent, 'bpmn:Collaboration')) {\n\n      if (is(newParent, 'bpmn:Participant')) {\n        newParent = newParent.processRef;\n        break;\n      } else {\n        newParent = newParent.$parent;\n      }\n    }\n\n    containment = 'artifacts';\n  } else if (is(businessObject, 'bpmn:MessageFlow')) {\n    containment = 'messageFlows';\n  } else if (is(businessObject, 'bpmn:Participant')) {\n    containment = 'participants';\n\n    // make sure the participants process is properly attached / detached\n    // from the XML document\n\n    var process = businessObject.processRef,\n        definitions;\n\n    if (process) {\n      definitions = getDefinitions(businessObject.$parent || newParent);\n\n      if (businessObject.$parent) {\n        collectionRemove(definitions.get('rootElements'), process);\n        process.$parent = null;\n      }\n\n      if (newParent) {\n        collectionAdd(definitions.get('rootElements'), process);\n        process.$parent = definitions;\n      }\n    }\n  } else if (is(businessObject, 'bpmn:DataOutputAssociation')) {\n    containment = 'dataOutputAssociations';\n  } else if (is(businessObject, 'bpmn:DataInputAssociation')) {\n    containment = 'dataInputAssociations';\n  }\n\n  if (!containment) {\n    throw new Error(`no parent for <${ businessObject.id }> in <${ newParent.id }>`);\n  }\n\n  var children;\n\n  if (businessObject.$parent) {\n\n    // remove from old parent\n    children = businessObject.$parent.get(containment);\n    collectionRemove(children, businessObject);\n  }\n\n  if (!newParent) {\n    businessObject.$parent = null;\n  } else {\n\n    // add to new parent\n    children = newParent.get(containment);\n    children.push(businessObject);\n    businessObject.$parent = newParent;\n  }\n\n  if (visualParent) {\n    var diChildren = visualParent.get(containment);\n\n    collectionRemove(children, businessObject);\n\n    if (newParent) {\n\n      if (!diChildren) {\n        diChildren = [];\n        newParent.set(containment, diChildren);\n      }\n\n      diChildren.push(businessObject);\n    }\n  }\n};\n\n/**\n * @param {Connection} connection\n */\nBpmnUpdater.prototype.updateConnectionWaypoints = function(connection) {\n  var di = getDi(connection);\n\n  di.set('waypoint', this._bpmnFactory.createDiWaypoints(connection.waypoints));\n};\n\n/**\n * @param { {\n *   connection: Connection;\n *   parent: Parent;\n *   newParent: Parent;\n * } } context\n */\nBpmnUpdater.prototype.updateConnection = function(context) {\n  var connection = context.connection,\n      businessObject = getBusinessObject(connection),\n      newSource = connection.source,\n      newSourceBo = getBusinessObject(newSource),\n      newTarget = connection.target,\n      newTargetBo = getBusinessObject(connection.target),\n      visualParent;\n\n  if (!is(businessObject, 'bpmn:DataAssociation')) {\n\n    var inverseSet = is(businessObject, 'bpmn:SequenceFlow');\n\n    if (businessObject.sourceRef !== newSourceBo) {\n      if (inverseSet) {\n        collectionRemove(businessObject.sourceRef && businessObject.sourceRef.get('outgoing'), businessObject);\n\n        if (newSourceBo && newSourceBo.get('outgoing')) {\n          newSourceBo.get('outgoing').push(businessObject);\n        }\n      }\n\n      businessObject.sourceRef = newSourceBo;\n    }\n\n    if (businessObject.targetRef !== newTargetBo) {\n      if (inverseSet) {\n        collectionRemove(businessObject.targetRef && businessObject.targetRef.get('incoming'), businessObject);\n\n        if (newTargetBo && newTargetBo.get('incoming')) {\n          newTargetBo.get('incoming').push(businessObject);\n        }\n      }\n\n      businessObject.targetRef = newTargetBo;\n    }\n  } else if (is(businessObject, 'bpmn:DataInputAssociation')) {\n\n    // handle obnoxious isMsome sourceRef\n    businessObject.get('sourceRef')[0] = newSourceBo;\n\n    visualParent = context.parent || context.newParent || newTargetBo;\n\n    this.updateSemanticParent(businessObject, newTargetBo, visualParent);\n  } else if (is(businessObject, 'bpmn:DataOutputAssociation')) {\n    visualParent = context.parent || context.newParent || newSourceBo;\n\n    this.updateSemanticParent(businessObject, newSourceBo, visualParent);\n\n    // targetRef = new target\n    businessObject.targetRef = newTargetBo;\n  }\n\n  this.updateConnectionWaypoints(connection);\n\n  this.updateDiConnection(connection, newSource, newTarget);\n};\n\n\n// helpers //////////////////////\n\nBpmnUpdater.prototype._getLabel = function(di) {\n  if (!di.label) {\n    di.label = this._bpmnFactory.createDiLabel();\n  }\n\n  return di.label;\n};\n\n\n/**\n * Call function if shape or connection is BPMN element.\n *\n * @param  {Function} fn\n *\n * @return {Function}\n */\nfunction ifBpmn(fn) {\n\n  return function(event) {\n\n    var context = event.context,\n        element = context.shape || context.connection || context.element;\n\n    if (is(element, 'bpmn:BaseElement')) {\n      fn(event);\n    }\n  };\n}\n\n/**\n * Return dc:Bounds of bpmndi:BPMNLabel if exists.\n *\n * @param {Shape} shape\n *\n * @return {ModdleElement|undefined}\n */\nfunction getEmbeddedLabelBounds(shape) {\n  if (!is(shape, 'bpmn:Activity')) {\n    return;\n  }\n\n  var di = getDi(shape);\n\n  if (!di) {\n    return;\n  }\n\n  var label = di.get('label');\n\n  if (!label) {\n    return;\n  }\n\n  return label.get('bounds');\n}"
  },
  {
    "path": "lib/features/modeling/ElementFactory.js",
    "content": "import {\n  assign,\n  forEach,\n  has,\n  isDefined,\n  isObject,\n  omit\n} from 'min-dash';\n\nimport inherits from 'inherits-browser';\n\nimport {\n  getBusinessObject,\n  getDi,\n  is\n} from '../../util/ModelUtil';\n\nimport {\n  isAny\n} from '../modeling/util/ModelingUtil';\n\nimport {\n  isExpanded\n} from '../../util/DiUtil';\n\nimport BaseElementFactory from 'diagram-js/lib/core/ElementFactory';\n\nimport {\n  DEFAULT_LABEL_SIZE\n} from '../../util/LabelUtil';\n\nimport {\n  ensureCompatDiRef\n} from '../../util/CompatibilityUtil';\n\n/**\n * @typedef {import('diagram-js/lib/util/Types').Dimensions} Dimensions\n *\n * @typedef {import('./BpmnFactory').default} BpmnFactory\n *\n * @typedef {import('../../model/Types').BpmnAttributes} BpmnAttributes\n * @typedef {import('../../model/Types').Connection} Connection\n * @typedef {import('../../model/Types').Element} Element\n * @typedef {import('../../model/Types').Label} Label\n * @typedef {import('../../model/Types').Root} Root\n * @typedef {import('../../model/Types').Shape} Shape\n * @typedef {import('../../model/Types').Moddle} Moddle\n * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n */\n\n/**\n * A BPMN-specific element factory.\n *\n * @template {Connection} [T=Connection]\n * @template {Label} [U=Label]\n * @template {Root} [V=Root]\n * @template {Shape} [W=Shape]\n *\n * @extends {BaseElementFactory<T, U, V, W>}\n *\n * @param {BpmnFactory} bpmnFactory\n * @param {Moddle} moddle\n */\nexport default function ElementFactory(bpmnFactory, moddle) {\n  BaseElementFactory.call(this);\n\n  this._bpmnFactory = bpmnFactory;\n  this._moddle = moddle;\n}\n\ninherits(ElementFactory, BaseElementFactory);\n\nElementFactory.$inject = [\n  'bpmnFactory',\n  'moddle'\n];\n\nElementFactory.prototype._baseCreate = BaseElementFactory.prototype.create;\n\n/**\n * Create a root element.\n *\n * @overlord\n * @param {'root'} elementType\n * @param {Partial<Root> & Partial<BpmnAttributes>} [attrs]\n * @return {V}\n */\n\n/**\n * Create a shape.\n *\n * @overlord\n * @param {'shape'} elementType\n * @param {Partial<Shape> & Partial<BpmnAttributes>} [attrs]\n * @return {W}\n */\n\n/**\n * Create a connection.\n *\n * @overlord\n * @param {'connection'} elementType\n * @param {Partial<Connection> & Partial<BpmnAttributes>} [attrs]\n * @return {T}\n */\n\n/**\n * Create a label.\n *\n * @param {'label'} elementType\n * @param {Partial<Label> & Partial<BpmnAttributes>} [attrs]\n * @return {U}\n */\nElementFactory.prototype.create = function(elementType, attrs) {\n\n  // no special magic for labels,\n  // we assume their businessObjects have already been created\n  // and wired via attrs\n  if (elementType === 'label') {\n    var di = attrs.di || this._bpmnFactory.createDiLabel();\n    return this._baseCreate(elementType, assign({ type: 'label', di: di }, DEFAULT_LABEL_SIZE, attrs));\n  }\n\n  return this.createElement(elementType, attrs);\n};\n\n/**\n * Create a BPMN root element.\n *\n * @overlord\n * @param {'root'} elementType\n * @param {Partial<Root> & Partial<BpmnAttributes>} [attrs]\n * @return {V}\n */\n\n/**\n * Create a BPMN shape.\n *\n * @overlord\n * @param {'shape'} elementType\n * @param {Partial<Shape> & Partial<BpmnAttributes>} [attrs]\n * @return {W}\n */\n\n/**\n * Create a BPMN connection.\n *\n * @param {'connection'} elementType\n * @param {Partial<Connection> & Partial<BpmnAttributes>} [attrs]\n * @return {T}\n */\nElementFactory.prototype.createElement = function(elementType, attrs) {\n\n  attrs = assign({}, attrs || {});\n\n  var size;\n\n  var businessObject = attrs.businessObject,\n      di = attrs.di;\n\n  if (!businessObject) {\n    if (!attrs.type) {\n      throw new Error('no shape type specified');\n    }\n\n    businessObject = this._bpmnFactory.create(attrs.type);\n\n    ensureCompatDiRef(businessObject);\n  }\n\n  if (!isModdleDi(di)) {\n    var diAttrs = assign(\n      {},\n      di || {},\n      { id: businessObject.id + '_di' }\n    );\n\n    if (elementType === 'root') {\n      di = this._bpmnFactory.createDiPlane(businessObject, diAttrs);\n    } else if (elementType === 'connection') {\n      di = this._bpmnFactory.createDiEdge(businessObject, diAttrs);\n    } else {\n      di = this._bpmnFactory.createDiShape(businessObject, diAttrs);\n    }\n  }\n\n  if (is(businessObject, 'bpmn:Group')) {\n    attrs = assign({\n      isFrame: true\n    }, attrs);\n  }\n\n  attrs = applyAttributes(businessObject, attrs, [\n    'processRef',\n    'isInterrupting',\n    'associationDirection',\n    'isForCompensation'\n  ]);\n\n  if (attrs.isExpanded) {\n    attrs = applyAttribute(di, attrs, 'isExpanded');\n  }\n\n  if (isAny(businessObject, [ 'bpmn:Lane', 'bpmn:Participant' ])) {\n    attrs = applyAttribute(di, attrs, 'isHorizontal');\n  }\n\n  if (is(businessObject, 'bpmn:SubProcess')) {\n    attrs.collapsed = !isExpanded(businessObject, di);\n  }\n\n  if (is(businessObject, 'bpmn:ExclusiveGateway')) {\n    if (has(di, 'isMarkerVisible')) {\n      if (di.isMarkerVisible === undefined) {\n        di.isMarkerVisible = false;\n      }\n    } else {\n      di.isMarkerVisible = true;\n    }\n  }\n\n  if (isDefined(attrs.triggeredByEvent)) {\n    businessObject.triggeredByEvent = attrs.triggeredByEvent;\n    delete attrs.triggeredByEvent;\n  }\n\n  if (isDefined(attrs.cancelActivity)) {\n    businessObject.cancelActivity = attrs.cancelActivity;\n    delete attrs.cancelActivity;\n  }\n\n  var eventDefinitions,\n      newEventDefinition;\n\n  if (attrs.eventDefinitionType) {\n    eventDefinitions = businessObject.get('eventDefinitions') || [];\n    newEventDefinition = this._bpmnFactory.create(attrs.eventDefinitionType, attrs.eventDefinitionAttrs);\n\n    if (attrs.eventDefinitionType === 'bpmn:ConditionalEventDefinition') {\n      newEventDefinition.condition = this._bpmnFactory.create('bpmn:FormalExpression');\n    }\n\n    eventDefinitions.push(newEventDefinition);\n\n    newEventDefinition.$parent = businessObject;\n    businessObject.eventDefinitions = eventDefinitions;\n\n    delete attrs.eventDefinitionType;\n  }\n\n  size = this.getDefaultSize(businessObject, di);\n\n  attrs = assign({\n    id: businessObject.id\n  }, size, attrs, {\n    businessObject: businessObject,\n    di: di\n  });\n\n  return this._baseCreate(elementType, attrs);\n};\n\n/**\n * Get the default size of a diagram element.\n *\n * @param {Element} element The element.\n * @param {ModdleElement} di The DI.\n *\n * @return {Dimensions} Default width and height of the element.\n */\nElementFactory.prototype.getDefaultSize = function(element, di) {\n\n  var bo = getBusinessObject(element);\n  di = di || getDi(element);\n\n  if (is(bo, 'bpmn:SubProcess')) {\n    if (isExpanded(bo, di)) {\n      return { width: 350, height: 200 };\n    } else {\n      return { width: 100, height: 80 };\n    }\n  }\n\n  if (is(bo, 'bpmn:Task')) {\n    return { width: 100, height: 80 };\n  }\n\n  if (is(bo, 'bpmn:Gateway')) {\n    return { width: 50, height: 50 };\n  }\n\n  if (is(bo, 'bpmn:Event')) {\n    return { width: 36, height: 36 };\n  }\n\n  if (is(bo, 'bpmn:Participant')) {\n    var isHorizontalPool = di.isHorizontal === undefined || di.isHorizontal === true;\n    if (isExpanded(bo, di)) {\n      if (isHorizontalPool) {\n        return { width: 600, height: 250 };\n      }\n      return { width: 250, height: 600 };\n    } else {\n      if (isHorizontalPool) {\n        return { width: 400, height: 60 };\n      }\n      return { width: 60, height: 400 };\n    }\n  }\n\n  if (is(bo, 'bpmn:Lane')) {\n    return { width: 400, height: 100 };\n  }\n\n  if (is(bo, 'bpmn:DataObjectReference')) {\n    return { width: 36, height: 50 };\n  }\n\n  if (is(bo, 'bpmn:DataStoreReference')) {\n    return { width: 50, height: 50 };\n  }\n\n  if (is(bo, 'bpmn:TextAnnotation')) {\n    return { width: 100, height: 30 };\n  }\n\n  if (is(bo, 'bpmn:Group')) {\n    return { width: 300, height: 300 };\n  }\n\n  return { width: 100, height: 80 };\n};\n\n\n/**\n * Create participant.\n *\n * @param {boolean|Partial<Shape> & Partial<BpmnAttributes>} [attrs]\n * Attributes or whether the participant is expanded.\n *\n * @return {W} The created participant.\n */\nElementFactory.prototype.createParticipantShape = function(attrs) {\n\n  if (!isObject(attrs)) {\n    attrs = { isExpanded: attrs };\n  }\n\n  attrs = assign({ type: 'bpmn:Participant' }, attrs || {});\n\n  // participants are expanded by default\n  if (attrs.isExpanded !== false) {\n    attrs.processRef = this._bpmnFactory.create('bpmn:Process');\n  }\n\n  return this.createShape(attrs);\n};\n\n\n// helpers //////////////////////\n\n/**\n * Apply attributes from a map to the given element, remove attribute from the\n * map on application.\n *\n * @param {Element} element\n * @param {Object} attrs (in/out map of attributes)\n * @param {string[]} attributeNames name of attributes to apply\n *\n * @return {Object} changed attrs\n */\nfunction applyAttributes(element, attrs, attributeNames) {\n\n  forEach(attributeNames, function(property) {\n    attrs = applyAttribute(element, attrs, property);\n  });\n\n  return attrs;\n}\n\n/**\n * Apply named property to element and drain it from the attrs collection.\n *\n * @param {Element} element\n * @param {Object} attrs (in/out map of attributes)\n * @param {string} attributeName to apply\n *\n * @return {Object} changed attrs\n */\nfunction applyAttribute(element, attrs, attributeName) {\n  if (attrs[attributeName] === undefined) {\n    return attrs;\n  }\n\n  element[attributeName] = attrs[attributeName];\n\n  return omit(attrs, [ attributeName ]);\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction isModdleDi(element) {\n  return isAny(element, [\n    'bpmndi:BPMNShape',\n    'bpmndi:BPMNEdge',\n    'bpmndi:BPMNDiagram',\n    'bpmndi:BPMNPlane',\n  ]);\n}\n"
  },
  {
    "path": "lib/features/modeling/ElementFactory.test.ts",
    "content": "import Modeler from '../../Modeler';\n\nimport ElementFactory from './ElementFactory';\n\nimport {\n  Connection,\n  Label,\n  Root,\n  Shape\n} from '../../model/Types';\n\nconst modeler = new Modeler();\n\nconst elementFactory = modeler.get<ElementFactory>('elementFactory');\n\nconst shape1 = elementFactory.create('shape', {\n  type: 'bpmn:Task',\n  id: 'shape1',\n  x: 100,\n  y: 100,\n  width: 100,\n  height: 100\n});\n\nconst shape2 = elementFactory.create('shape', {\n  type: 'bpmn:Task',\n  id: 'shape2',\n  x: 100,\n  y: 100,\n  width: 100,\n  height: 100\n});\n\nconst connection = elementFactory.create('connection', {\n  type: 'bpmn:SequenceFlow',\n  id: 'connection',\n  source: shape1,\n  target: shape2,\n  waypoints: []\n});\n\nelementFactory.create('root', {\n  type: 'bpmn:Process',\n  id: 'root'\n});\n\nelementFactory.create('label', {\n  type: 'bpmn:Task',\n  id: 'label'\n});\n\nelementFactory.create('shape', {\n  type: 'bpmn:Task'\n});\n\nelementFactory.create('connection', {\n  type: 'bpmn:SequenceFlow'\n});\n\nelementFactory.create('root', {\n  type: 'bpmn:Process'\n});\n\nelementFactory.create('label', {\n  type: 'bpmn:Task'\n});\n\nelementFactory.create('connection', {\n  type: 'bpmn:Association',\n  associationDirection: 'One'\n});\n\nelementFactory.create('shape', {\n  type: 'bpmn:BoundaryEvent',\n  cancelActivity: true,\n  eventDefinitionType: 'bpmn:ErrorEventDefinition'\n});\n\nelementFactory.create('shape', {\n  type: 'bpmn:Task',\n  isForCompensation: false\n});\n\nelementFactory.create('shape', {\n  type: 'bpmn:Participant',\n  processRef: {}\n});\n\nelementFactory.create('shape', {\n  type: 'bpmn:SubProcess',\n  triggeredByEvent: true\n});\n\nelementFactory.createElement('connection', {\n  type: 'bpmn:SequenceFlow'\n});\n\nelementFactory.createElement('root', {\n  type: 'bpmn:Process'\n});\n\nelementFactory.createElement('shape', {\n  type: 'bpmn:Task'\n});\n\nelementFactory.getDefaultSize(shape1, { type: 'bpmndi:BPMNShape' });\n\nelementFactory.getDefaultSize(connection, { type: 'bpmndi:BPMNEdge' });\n\nelementFactory.createParticipantShape();\n\nelementFactory.createParticipantShape(true);\n\nelementFactory.createParticipantShape({\n  type: 'bpmn:Participant',\n  isExpanded: true\n});\n\n/**\n * Customization\n */\n\ntype CustomShape = {\n  foo: string;\n} & Shape;\n\nexport class CustomElementFactory extends ElementFactory<Connection, Label, Root, CustomShape> {};\n\nconst customElementFactory = modeler.get<CustomElementFactory>('elementFactory');\n\nconst customShape = customElementFactory.createShape({ foo: 'bar' });\n\nconsole.log(customShape.foo);"
  },
  {
    "path": "lib/features/modeling/Modeling.js",
    "content": "import inherits from 'inherits-browser';\n\nimport BaseModeling from 'diagram-js/lib/features/modeling/Modeling';\n\nimport UpdateModdlePropertiesHandler from './cmd/UpdateModdlePropertiesHandler';\nimport UpdatePropertiesHandler from './cmd/UpdatePropertiesHandler';\nimport UpdateCanvasRootHandler from './cmd/UpdateCanvasRootHandler';\nimport AddLaneHandler from './cmd/AddLaneHandler';\nimport SplitLaneHandler from './cmd/SplitLaneHandler';\nimport ResizeLaneHandler from './cmd/ResizeLaneHandler';\nimport UpdateFlowNodeRefsHandler from './cmd/UpdateFlowNodeRefsHandler';\nimport IdClaimHandler from './cmd/IdClaimHandler';\nimport SetColorHandler from './cmd/SetColorHandler';\n\nimport UpdateLabelHandler from '../label-editing/cmd/UpdateLabelHandler';\n\n/**\n * @typedef {import('../rules/BpmnRules').default} BpmnRules\n * @typedef {import('diagram-js/lib/command/CommandStack').default} CommandStack\n * @typedef {import('./ElementFactory').default} ElementFactory\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n *\n * @typedef {import('diagram-js/lib/features/modeling/Modeling').ModelingHints} ModelingHints\n *\n * @typedef {import('../../model/Types').Connection} Connection\n * @typedef {import('../../model/Types').Element} Element\n * @typedef {import('../../model/Types').Label} Label\n * @typedef {import('../../model/Types').Parent} Parent\n * @typedef {import('../../model/Types').Root} Root\n * @typedef {import('../../model/Types').Shape} Shape\n * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n *\n * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n *\n * @typedef {import('../../util/Types').Colors} Colors\n *\n * @typedef { {\n *   removeShape?: boolean;\n * } } UpdateLabelHints\n */\n\n/**\n * The BPMN 2.0 modeling entry point.\n *\n * @template {Connection} [T=Connection]\n * @template {Element} [U=Element]\n * @template {Label} [V=Label]\n * @template {Parent} [W=Parent]\n * @template {Shape} [X=Shape]\n *\n * @extends {BaseModeling<T, U, V, W, X>}\n *\n * @param {EventBus} eventBus\n * @param {ElementFactory} elementFactory\n * @param {CommandStack} commandStack\n * @param {BpmnRules} bpmnRules\n */\nexport default function Modeling(\n    eventBus,\n    elementFactory,\n    commandStack,\n    bpmnRules\n) {\n\n  BaseModeling.call(this, eventBus, elementFactory, commandStack);\n\n  this._bpmnRules = bpmnRules;\n}\n\ninherits(Modeling, BaseModeling);\n\nModeling.$inject = [\n  'eventBus',\n  'elementFactory',\n  'commandStack',\n  'bpmnRules'\n];\n\n\nModeling.prototype.getHandlers = function() {\n  var handlers = BaseModeling.prototype.getHandlers.call(this);\n\n  handlers['element.updateModdleProperties'] = UpdateModdlePropertiesHandler;\n  handlers['element.updateProperties'] = UpdatePropertiesHandler;\n  handlers['canvas.updateRoot'] = UpdateCanvasRootHandler;\n  handlers['lane.add'] = AddLaneHandler;\n  handlers['lane.resize'] = ResizeLaneHandler;\n  handlers['lane.split'] = SplitLaneHandler;\n  handlers['lane.updateRefs'] = UpdateFlowNodeRefsHandler;\n  handlers['id.updateClaim'] = IdClaimHandler;\n  handlers['element.setColor'] = SetColorHandler;\n  handlers['element.updateLabel'] = UpdateLabelHandler;\n\n  return handlers;\n};\n\n/**\n * Update an element's label.\n *\n * @param {Element} element The element.\n * @param {string} newLabel The new label.\n * @param {Rect} [newBounds] The optional bounds of the label.\n * @param {UpdateLabelHints} [hints] The optional hints.\n */\nModeling.prototype.updateLabel = function(element, newLabel, newBounds, hints) {\n  this._commandStack.execute('element.updateLabel', {\n    element: element,\n    newLabel: newLabel,\n    newBounds: newBounds,\n    hints: hints || {}\n  });\n};\n\n/**\n * @param {Element} source\n * @param {Element} target\n * @param {Partial<Connection>} [attrs]\n * @param {ModelingHints} [hints]\n *\n * @return {T}\n */\nModeling.prototype.connect = function(source, target, attrs, hints) {\n\n  var bpmnRules = this._bpmnRules;\n\n  if (!attrs) {\n    attrs = bpmnRules.canConnect(source, target);\n  }\n\n  if (!attrs) {\n    return;\n  }\n\n  return this.createConnection(source, target, attrs, source.parent, hints);\n};\n\n/**\n * Update a model element's properties.\n *\n * @param {Element} element The element.\n * @param {ModdleElement} moddleElement The model element.\n * @param {Object} properties The updated properties.\n */\nModeling.prototype.updateModdleProperties = function(element, moddleElement, properties) {\n  this._commandStack.execute('element.updateModdleProperties', {\n    element: element,\n    moddleElement: moddleElement,\n    properties: properties\n  });\n};\n\n/**\n * Update an element's properties.\n *\n * @param {Element} element The element.\n * @param {Object} properties The updated properties.\n */\nModeling.prototype.updateProperties = function(element, properties) {\n  this._commandStack.execute('element.updateProperties', {\n    element: element,\n    properties: properties\n  });\n};\n\n/**\n * Resize a lane.\n *\n * @param {Shape} laneShape The lane.\n * @param {Rect} newBounds The new bounds of the lane.\n * @param {boolean} [balanced] Wether to resize neighboring lanes.\n */\nModeling.prototype.resizeLane = function(laneShape, newBounds, balanced) {\n  this._commandStack.execute('lane.resize', {\n    shape: laneShape,\n    newBounds: newBounds,\n    balanced: balanced\n  });\n};\n\n/**\n * Add a lane.\n *\n * @param {Shape} targetLaneShape The shape to add the lane to.\n * @param {string} location The location.\n *\n * @return {Shape} The added lane.\n */\nModeling.prototype.addLane = function(targetLaneShape, location) {\n  var context = {\n    shape: targetLaneShape,\n    location: location\n  };\n\n  this._commandStack.execute('lane.add', context);\n\n  return context.newLane;\n};\n\n/**\n * Split a lane.\n *\n * @param {Shape} targetLane The lane to split.\n * @param {number} count The number of lanes to split the lane into. Must not\n * exceed the number of existing lanes.\n */\nModeling.prototype.splitLane = function(targetLane, count) {\n  this._commandStack.execute('lane.split', {\n    shape: targetLane,\n    count: count\n  });\n};\n\n/**\n * Turn a process into a collaboration.\n *\n * @return {Root} The root of the collaboration.\n */\nModeling.prototype.makeCollaboration = function() {\n\n  var collaborationElement = this._create('root', {\n    type: 'bpmn:Collaboration'\n  });\n\n  var context = {\n    newRoot: collaborationElement\n  };\n\n  this._commandStack.execute('canvas.updateRoot', context);\n\n  return collaborationElement;\n};\n\n/**\n * Transform a collaboration into a process.\n *\n * @return {Root} The root of the process.\n */\nModeling.prototype.makeProcess = function() {\n\n  var processElement = this._create('root', {\n    type: 'bpmn:Process'\n  });\n\n  var context = {\n    newRoot: processElement\n  };\n\n  this._commandStack.execute('canvas.updateRoot', context);\n\n  return processElement;\n};\n\n/**\n * Update the referenced lanes of each flow node.\n *\n * @param {Shape[]} flowNodeShapes The flow nodes to update.\n * @param {Shape[]} laneShapes The lanes.\n */\nModeling.prototype.updateLaneRefs = function(flowNodeShapes, laneShapes) {\n\n  this._commandStack.execute('lane.updateRefs', {\n    flowNodeShapes: flowNodeShapes,\n    laneShapes: laneShapes\n  });\n};\n\n/**\n * Claim an ID.\n *\n * @param {string} id The ID to claim.\n * @param {ModdleElement} moddleElement The model element the ID is claimed for.\n */\nModeling.prototype.claimId = function(id, moddleElement) {\n  this._commandStack.execute('id.updateClaim', {\n    id: id,\n    element: moddleElement,\n    claiming: true\n  });\n};\n\n/**\n * Unclaim an ID.\n *\n * @param {string} id The ID to unclaim.\n * @param {ModdleElement} moddleElement The model element the ID is claimed for.\n */\nModeling.prototype.unclaimId = function(id, moddleElement) {\n  this._commandStack.execute('id.updateClaim', {\n    id: id,\n    element: moddleElement\n  });\n};\n\n/**\n * Set the color(s) of one or many elements.\n *\n * @param {Element[]} elements The elements to set the color(s) for.\n * @param {Colors} colors The color(s) to set.\n */\nModeling.prototype.setColor = function(elements, colors) {\n  if (!elements.length) {\n    elements = [ elements ];\n  }\n\n  this._commandStack.execute('element.setColor', {\n    elements: elements,\n    colors: colors\n  });\n};\n"
  },
  {
    "path": "lib/features/modeling/Modeling.test.ts",
    "content": "import { expectType } from 'ts-expect';\n\nimport Modeler from '../../Modeler';\n\nimport {\n  Connection,\n  Element,\n  Label,\n  Parent,\n  Shape\n} from '../../model/Types';\n\nimport ElementFactory from './ElementFactory';\nimport Modeling from './Modeling';\n\nimport { getBusinessObject } from '../../util/ModelUtil';\n\nimport { CustomElementFactory } from './ElementFactory.test';\n\nconst modeler = new Modeler();\n\nconst elementFactory = modeler.get<ElementFactory>('elementFactory');\n\nconst sequenceFlow = elementFactory.create('connection', { type: 'bpmn:SequenceFlow' }),\n      bpmnProcess = elementFactory.create('root', { type: 'bpmn:Process' }),\n      subProcess = elementFactory.create('shape', { type: 'bpmn:SubProcess' }),\n      task = elementFactory.create('shape', { type: 'bpmn:Task' });\n\nconst modeling = modeler.get<Modeling>('modeling');\n\nmodeling.updateLabel(task, 'foo');\n\nmodeling.updateLabel(task, 'foo', {\n  x: 100,\n  y: 100,\n  width: 100,\n  height: 100\n});\n\nmodeling.updateLabel(task, 'foo', {\n  x: 100,\n  y: 100,\n  width: 100,\n  height: 100\n}, { removeShape: true });\n\nmodeling.connect(subProcess, task, sequenceFlow);\n\nmodeling.connect(subProcess, task, sequenceFlow, { foo: 'bar' });\n\nmodeling.updateModdleProperties(task, { type: 'bpmn:ExtensionElements' }, {\n  values: []\n});\n\nmodeling.updateProperties(task, {\n  name: 'foo'\n});\n\nconst participant = elementFactory.create('shape', { type: 'bpmn:Participant'}),\n      lane = elementFactory.create('shape', { type: 'bpmn:Lane'});\n\nmodeling.resizeLane(lane, {\n  x: 100,\n  y: 100,\n  width: 100,\n  height: 100\n});\n\nmodeling.resizeLane(lane, {\n  x: 100,\n  y: 100,\n  width: 100,\n  height: 100\n}, true);\n\nmodeling.addLane(participant, 'top');\n\nmodeling.addLane(participant, 'bottom');\n\nmodeling.splitLane(lane, 3);\n\nmodeling.makeCollaboration();\n\nmodeling.makeProcess();\n\nmodeling.updateLaneRefs([ task ], [ lane ]);\n\nmodeling.claimId('foo', task.businessObject);\n\nmodeling.unclaimId('foo', task.businessObject);\n\nmodeling.setColor([ task ], { fill: 'red', stroke: 'green' });\n\nmodeling.setColor([ task ], { fill: 'red' });\n\nmodeling.setColor([ task ], { stroke: 'green' });\n\n/**\n * Integration\n */\n\nexpectType<Connection>(modeling.createConnection(subProcess, task, sequenceFlow, bpmnProcess));\n\nexpectType<Label>(modeling.createLabel(task, { x: 100, y: 100 }, {\n  businessObject: getBusinessObject(task)\n}));\n\nexpectType<Shape>(modeling.createShape(task, { x: 100, y: 100 }, bpmnProcess));\n\nexpectType<Element[]>(modeling.createElements([\n  subProcess,\n  task,\n  sequenceFlow\n], { x: 100, y: 100 }, bpmnProcess));\n\nmodeling.moveShape(task, { x: 100, y: 100 });\n\nmodeling.moveConnection(sequenceFlow, { x: 100, y: 100 });\n\nmodeling.moveElements([ subProcess, task ], { x: 100, y: 100 });\n\n/**\n * Customization\n */\n\ntype CustomElement = {\n  foo: string;\n} & Element;\n\ntype CustomShape = {\n  bar: string;\n} & Shape & CustomElement;\n\nclass CustomModeling extends Modeling<Connection, CustomElement, Label, Parent, CustomShape> {};\n\nconst customModeling = modeler.get<CustomModeling>('modeling');\n\nconst customShape = customModeling.createShape({ bar: 'bar' }, { x: 100, y: 100 }, modeler.get<CustomElementFactory>('elementFactory').create('root'));\n\ncustomModeling.distributeElements([\n  {\n    elements: [ customShape ],\n    range: {\n      min: 100,\n      max: 200\n    }\n  }\n], 'x', 'width');"
  },
  {
    "path": "lib/features/modeling/behavior/AdaptiveLabelPositioningBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport {\n  getOrientation,\n  getMid,\n  asTRBL\n} from 'diagram-js/lib/layout/LayoutUtil';\n\nimport {\n  substract\n} from 'diagram-js/lib/util/Math';\n\nimport {\n  hasExternalLabel\n} from '../../../util/LabelUtil';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\nimport { isConnection } from 'diagram-js/lib/util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../Modeling').default} Modeling\n *\n * @typedef {import('../../../model/Types').Element} Element\n * @typedef {import('../../../model/Types').Shape} Shape\n *\n * @typedef {import('diagram-js/lib/util/Types').DirectionTRBL} DirectionTRBL\n */\n\nvar ALIGNMENTS = [\n  'top',\n  'bottom',\n  'left',\n  'right'\n];\n\nvar ELEMENT_LABEL_DISTANCE = 10;\n\n/**\n * A behavior that ensures that labels are positioned in a way that they do not\n * overlap with other elements or connections.\n *\n * @param {EventBus} eventBus\n * @param {Modeling} modeling\n */\nexport default function AdaptiveLabelPositioningBehavior(eventBus, modeling) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  this.postExecuted([\n    'connection.create',\n    'connection.layout',\n    'connection.updateWaypoints'\n  ], function(event) {\n    var context = event.context,\n        connection = context.connection,\n        source = connection.source,\n        target = connection.target,\n        hints = context.hints || {};\n\n    if (hints.createElementsBehavior !== false) {\n      checkLabelAdjustment(source);\n      checkLabelAdjustment(target);\n    }\n  });\n\n\n  this.postExecuted([\n    'label.create'\n  ], function(event) {\n    var context = event.context,\n        shape = context.shape,\n        hints = context.hints || {};\n\n    if (hints.createElementsBehavior !== false) {\n      checkLabelAdjustment(shape.labelTarget);\n    }\n  });\n\n\n  this.postExecuted([\n    'elements.create'\n  ], function(event) {\n    var context = event.context,\n        elements = context.elements,\n        hints = context.hints || {};\n\n    if (hints.createElementsBehavior !== false) {\n      elements.forEach(function(element) {\n        checkLabelAdjustment(element);\n      });\n    }\n  });\n\n  function checkLabelAdjustment(element) {\n\n    // skip non-existing labels\n    if (!hasExternalLabel(element)) {\n      return;\n    }\n\n    if (isConnection(element)) {\n      return;\n    }\n\n    var optimalPosition = getOptimalPosition(element);\n\n    // no optimal position found\n    if (!optimalPosition) {\n      return;\n    }\n\n    adjustLabelPosition(element, optimalPosition);\n  }\n\n  function adjustLabelPosition(element, orientation) {\n\n    var elementMid = getMid(element),\n        label = element.label,\n        labelMid = getMid(label);\n\n    // ignore labels that are being created\n    if (!label.parent) {\n      return;\n    }\n\n    var elementTrbl = asTRBL(element);\n\n    var newLabelMid;\n\n    switch (orientation) {\n    case 'top':\n      newLabelMid = {\n        x: elementMid.x,\n        y: elementTrbl.top - ELEMENT_LABEL_DISTANCE - label.height / 2\n      };\n\n      break;\n\n    case 'left':\n\n      newLabelMid = {\n        x: elementTrbl.left - ELEMENT_LABEL_DISTANCE - label.width / 2,\n        y: elementMid.y\n      };\n\n      break;\n\n    case 'bottom':\n\n      newLabelMid = {\n        x: elementMid.x,\n        y: elementTrbl.bottom + ELEMENT_LABEL_DISTANCE + label.height / 2\n      };\n\n      break;\n\n    case 'right':\n\n      newLabelMid = {\n        x: elementTrbl.right + ELEMENT_LABEL_DISTANCE + label.width / 2,\n        y: elementMid.y\n      };\n\n      break;\n    }\n\n    var delta = substract(newLabelMid, labelMid);\n\n    modeling.moveShape(label, delta);\n  }\n\n}\n\ninherits(AdaptiveLabelPositioningBehavior, CommandInterceptor);\n\nAdaptiveLabelPositioningBehavior.$inject = [\n  'eventBus',\n  'modeling'\n];\n\n\n// helpers //////////////////////\n\n/**\n * Return alignments which are taken by a boundary's host element\n *\n * @param {Shape} element\n *\n * @return {DirectionTRBL[]}\n */\nfunction getTakenHostAlignments(element) {\n\n  var hostElement = element.host,\n      elementMid = getMid(element),\n      hostOrientation = getOrientation(elementMid, hostElement);\n\n  var freeAlignments;\n\n  // check whether there is a multi-orientation, e.g. 'top-left'\n  if (hostOrientation.indexOf('-') >= 0) {\n    freeAlignments = hostOrientation.split('-');\n  } else {\n    freeAlignments = [ hostOrientation ];\n  }\n\n  var takenAlignments = ALIGNMENTS.filter(function(alignment) {\n\n    return freeAlignments.indexOf(alignment) === -1;\n  });\n\n  return takenAlignments;\n\n}\n\n/**\n * Return alignments which are taken by related connections\n *\n * @param {Element} element\n *\n * @return {DirectionTRBL[]}\n */\nfunction getTakenConnectionAlignments(element) {\n\n  var elementMid = getMid(element);\n\n  var takenAlignments = [].concat(\n    element.incoming.map(function(c) {\n      return c.waypoints[c.waypoints.length - 2 ];\n    }),\n    element.outgoing.map(function(c) {\n      return c.waypoints[1];\n    })\n  ).map(function(point) {\n    return getApproximateOrientation(elementMid, point);\n  });\n\n  return takenAlignments;\n}\n\n/**\n * Return the optimal label position around an element\n * or `undefined`, if none was found.\n *\n * @param  {Element} element\n *\n * @return {DirectionTRBL|undefined}\n */\nfunction getOptimalPosition(element) {\n\n  var labelMid = getMid(element.label);\n\n  var elementMid = getMid(element);\n\n  var labelOrientation = getApproximateOrientation(elementMid, labelMid);\n\n  if (!isAligned(labelOrientation)) {\n    return;\n  }\n\n  var takenAlignments = getTakenConnectionAlignments(element);\n\n  if (element.host) {\n    var takenHostAlignments = getTakenHostAlignments(element);\n\n    takenAlignments = takenAlignments.concat(takenHostAlignments);\n  }\n\n  var freeAlignments = ALIGNMENTS.filter(function(alignment) {\n\n    return takenAlignments.indexOf(alignment) === -1;\n  });\n\n  // NOTHING TO DO; label already aligned a.O.K.\n  if (freeAlignments.indexOf(labelOrientation) !== -1) {\n    return;\n  }\n\n  return freeAlignments[0];\n}\n\nfunction getApproximateOrientation(p0, p1) {\n  return getOrientation(p1, p0, 5);\n}\n\nfunction isAligned(orientation) {\n  return ALIGNMENTS.indexOf(orientation) !== -1;\n}\n"
  },
  {
    "path": "lib/features/modeling/behavior/AppendBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport { is } from '../../../util/ModelUtil';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n */\n\nexport default function AppendBehavior(eventBus) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  // assign correct shape position unless already set\n\n  this.preExecute('shape.append', function(context) {\n\n    var source = context.source,\n        shape = context.shape;\n\n    if (!context.position) {\n\n      if (is(shape, 'bpmn:TextAnnotation')) {\n        context.position = {\n          x: source.x + source.width / 2 + 75,\n          y: source.y - 50 - shape.height / 2\n        };\n      } else {\n        context.position = {\n          x: source.x + source.width + 80 + shape.width / 2,\n          y: source.y + source.height / 2\n        };\n      }\n    }\n  }, true);\n}\n\ninherits(AppendBehavior, CommandInterceptor);\n\nAppendBehavior.$inject = [\n  'eventBus'\n];"
  },
  {
    "path": "lib/features/modeling/behavior/AssociationBehavior.js",
    "content": "import inherits from 'inherits-browser';\r\n\r\nimport { is } from '../../../util/ModelUtil';\r\n\r\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\r\n\r\nimport {\r\n  filter,\r\n  forEach\r\n} from 'min-dash';\r\n\r\n/**\r\n * @typedef {import('didi').Injector} Injector\r\n * @typedef {import('../Modeling').default} Modeling\r\n */\r\n\r\n/**\r\n * @param {Injector} injector\r\n * @param {Modeling} modeling\r\n */\r\nexport default function AssociationBehavior(injector, modeling) {\r\n  injector.invoke(CommandInterceptor, this);\r\n\r\n  this.postExecute('shape.move', function(context) {\r\n    var newParent = context.newParent,\r\n        shape = context.shape;\r\n\r\n    var associations = filter(shape.incoming.concat(shape.outgoing), function(connection) {\r\n      return is(connection, 'bpmn:Association');\r\n    });\r\n\r\n    forEach(associations, function(association) {\r\n      modeling.moveConnection(association, { x: 0, y: 0 }, newParent);\r\n    });\r\n  }, true);\r\n}\r\n\r\ninherits(AssociationBehavior, CommandInterceptor);\r\n\r\nAssociationBehavior.$inject = [\r\n  'injector',\r\n  'modeling'\r\n];"
  },
  {
    "path": "lib/features/modeling/behavior/AttachEventBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport { getBusinessObject } from '../../../util/ModelUtil';\n\nimport { isAny } from '../util/ModelingUtil';\n\nimport { isLabel } from '../../../util/LabelUtil';\n\n/**\n * @typedef {import('../../replace/BpmnReplace').default} BpmnReplace\n * @typedef {import('didi').Injector} Injector\n */\n\nvar LOW_PRIORITY = 500;\n\n\n/**\n * Replace intermediate event with boundary event when creating or moving results in attached event.\n *\n * @param {BpmnReplace} bpmnReplace\n * @param {Injector} injector\n */\nexport default function AttachEventBehavior(bpmnReplace, injector) {\n  injector.invoke(CommandInterceptor, this);\n\n  this._bpmnReplace = bpmnReplace;\n\n  var self = this;\n\n  this.postExecuted('elements.create', LOW_PRIORITY, function(context) {\n    var elements = context.elements;\n\n    elements = elements.filter(function(shape) {\n      var host = shape.host;\n\n      return shouldReplace(shape, host);\n    });\n\n    if (elements.length !== 1) {\n      return;\n    }\n\n    elements.map(function(element) {\n      return elements.indexOf(element);\n    }).forEach(function(index) {\n      var host = elements[ index ];\n\n      context.elements[ index ] = self._replaceShape(elements[ index ], host);\n    });\n  }, true);\n\n\n  this.preExecute('elements.move', LOW_PRIORITY, function(context) {\n    var shapes = context.shapes,\n        host = context.newHost;\n\n    if (shapes.length !== 1) {\n      return;\n    }\n\n    var shape = shapes[0];\n\n    if (shouldReplace(shape, host)) {\n      context.shapes = [ self._replaceShape(shape, host) ];\n    }\n  }, true);\n}\n\nAttachEventBehavior.$inject = [\n  'bpmnReplace',\n  'injector'\n];\n\ninherits(AttachEventBehavior, CommandInterceptor);\n\nAttachEventBehavior.prototype._replaceShape = function(shape, host) {\n  var eventDefinition = getEventDefinition(shape);\n\n  var boundaryEvent = {\n    type: 'bpmn:BoundaryEvent',\n    host: host\n  };\n\n  if (eventDefinition) {\n    boundaryEvent.eventDefinitionType = eventDefinition.$type;\n  }\n\n  return this._bpmnReplace.replaceElement(shape, boundaryEvent, { layoutConnection: false });\n};\n\n\n// helpers //////////\n\nfunction getEventDefinition(element) {\n  var businessObject = getBusinessObject(element),\n      eventDefinitions = businessObject.eventDefinitions;\n\n  return eventDefinitions && eventDefinitions[0];\n}\n\nfunction shouldReplace(shape, host) {\n  return !isLabel(shape) &&\n    isAny(shape, [ 'bpmn:IntermediateThrowEvent', 'bpmn:IntermediateCatchEvent' ]) && !!host;\n}\n"
  },
  {
    "path": "lib/features/modeling/behavior/BoundaryEventBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport { is } from '../../../util/ModelUtil';\n\nimport {\n  filter,\n  forEach\n} from 'min-dash';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../Modeling').default} Modeling\n */\n\n/**\n * BPMN specific boundary event behavior.\n *\n * @param {EventBus} eventBus\n * @param {Modeling} modeling\n */\nexport default function BoundaryEventBehavior(eventBus, modeling) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  function getBoundaryEvents(element) {\n    return filter(element.attachers, function(attacher) {\n      return is(attacher, 'bpmn:BoundaryEvent');\n    });\n  }\n\n  // remove after connecting to event-based gateway\n  this.postExecute('connection.create', function(event) {\n    var source = event.context.source,\n        target = event.context.target,\n        boundaryEvents = getBoundaryEvents(target);\n\n    if (\n      is(source, 'bpmn:EventBasedGateway') &&\n      is(target, 'bpmn:ReceiveTask') &&\n      boundaryEvents.length > 0\n    ) {\n      modeling.removeElements(boundaryEvents);\n    }\n\n  });\n\n  // remove after replacing connected gateway with event-based gateway\n  this.postExecute('connection.reconnect', function(event) {\n    var oldSource = event.context.oldSource,\n        newSource = event.context.newSource;\n\n    if (is(oldSource, 'bpmn:Gateway') &&\n        is(newSource, 'bpmn:EventBasedGateway')) {\n      forEach(newSource.outgoing, function(connection) {\n        var target = connection.target,\n            attachedboundaryEvents = getBoundaryEvents(target);\n\n        if (is(target, 'bpmn:ReceiveTask') &&\n            attachedboundaryEvents.length > 0) {\n          modeling.removeElements(attachedboundaryEvents);\n        }\n      });\n    }\n  });\n\n}\n\nBoundaryEventBehavior.$inject = [\n  'eventBus',\n  'modeling'\n];\n\ninherits(BoundaryEventBehavior, CommandInterceptor);"
  },
  {
    "path": "lib/features/modeling/behavior/CompensateBoundaryEventBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport { getBusinessObject, is } from '../../../util/ModelUtil';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\nimport { hasEventDefinition, isEventSubProcess } from '../../../util/DiUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../lib/features/modeling/Modeling').default} Modeling\n */\n\n/**\n * Behavior ensuring that only a single compensation activity is connected to a\n * compensation boundary event when connecting, reconnecting or replacing shapes.\n *\n * @param {import('diagram-js/lib/core/EventBus').default} eventBus\n * @param {import('../Modeling').default} modeling\n * @param {import('../../rules/BpmnRules').default} bpmnRules\n */\nexport default function CompensateBoundaryEventBehavior(eventBus, modeling, bpmnRules) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  this.preExecute('shape.replace', handleReplacement, true);\n  this.postExecuted('shape.replace', handleReplacementPostExecuted, true);\n  this.preExecute('connection.create', handleNewConnection, true);\n  this.postExecuted('connection.delete', handleConnectionRemoval, true);\n  this.postExecuted('connection.reconnect', handleReconnection, true);\n  this.postExecuted('element.updateProperties', handlePropertiesUpdate, true);\n\n  /**\n   * Given a connection from boundary event is removed, remove the `isForCompensation` property.\n   */\n  function handleConnectionRemoval(context) {\n    const source = context.source,\n          target = context.target;\n\n    if (isCompensationBoundaryEvent(source) && isForCompensation(target)) {\n      removeIsForCompensationProperty(target);\n    }\n  }\n\n  /**\n   * Add `isForCompensation` property and make sure only a single compensation activity is connected.\n   */\n  function handleNewConnection(context) {\n    const connection = context.connection,\n          source = context.source,\n          target = context.target;\n\n    if (isCompensationBoundaryEvent(source) && isForCompensationAllowed(target)) {\n      addIsForCompensationProperty(target);\n      removeExistingAssociations(source, [ connection ]);\n    }\n  }\n\n  function handleReconnection(context) {\n    const newTarget = context.newTarget,\n          oldSource = context.oldSource,\n          oldTarget = context.oldTarget;\n\n    // target changes\n    if (oldTarget !== newTarget) {\n      const source = oldSource;\n\n      // oldTarget perspective\n      if (isForCompensation(oldTarget)) {\n        removeIsForCompensationProperty(oldTarget);\n      }\n\n      // newTarget perspective\n      if (isCompensationBoundaryEvent(source) && isForCompensationAllowed(newTarget)) {\n        addIsForCompensationProperty(newTarget);\n      }\n    }\n  }\n\n  function handlePropertiesUpdate(context) {\n    const { element } = context;\n\n    if (isForCompensation(element)) {\n      removeDisallowedConnections(element);\n      removeAttachments(element);\n    } else if (isForCompensationAllowed(element)) {\n      removeIncomingCompensationAssociations(element);\n    }\n  }\n\n  /**\n   * When replacing a boundary event, make sure the compensation activity is connected,\n   * and remove the potential candidates for connection replacement to have a single compensation activity.\n   */\n  function handleReplacement(context) {\n    const {\n      newData,\n      oldShape\n    } = context;\n\n    // from compensate boundary event\n    if (isCompensationBoundaryEvent(context.oldShape) &&\n      newData.eventDefinitionType !== 'bpmn:CompensateEventDefinition' ||\n      newData.type !== 'bpmn:BoundaryEvent'\n    ) {\n      const targetConnection = oldShape.outgoing.find(\n        ({ target }) => isForCompensation(target)\n      );\n\n      if (targetConnection && targetConnection.target) {\n        context._connectionTarget = targetConnection.target;\n      }\n    }\n\n    // to compensate boundary event\n    else if (\n      !isCompensationBoundaryEvent(context.oldShape) &&\n      newData.eventDefinitionType === 'bpmn:CompensateEventDefinition' &&\n      newData.type === 'bpmn:BoundaryEvent'\n    ) {\n      const targetConnection = oldShape.outgoing.find(\n        ({ target }) => isForCompensationAllowed(target)\n      );\n\n      if (targetConnection && targetConnection.target) {\n        context._connectionTarget = targetConnection.target;\n      }\n\n      removeOutgoingSequenceFlows(oldShape);\n    }\n  }\n\n  function handleReplacementPostExecuted(context) {\n    const { _connectionTarget: target, newShape } = context;\n\n    if (target) {\n      modeling.connect(newShape, target);\n    }\n  }\n\n  function addIsForCompensationProperty(target) {\n    modeling.updateProperties(target, { isForCompensation: true });\n  }\n\n  function removeIsForCompensationProperty(target) {\n    modeling.updateProperties(target, { isForCompensation: undefined });\n  }\n\n  function removeDisallowedConnections(element) {\n\n    for (const connection of element.incoming) {\n      if (!bpmnRules.canConnect(connection.source, element)) {\n        modeling.removeConnection(connection);\n      }\n    }\n\n    for (const connection of element.outgoing) {\n      if (!bpmnRules.canConnect(element, connection.target)) {\n        modeling.removeConnection(connection);\n      }\n    }\n  }\n\n  function removeExistingAssociations(boundaryEvent, ignoredAssociations) {\n    const associations = boundaryEvent.outgoing.filter(connection => is(connection, 'bpmn:Association'));\n    const associationsToRemove = associations.filter(association => {\n      return isForCompensation(association.target) && !ignoredAssociations.includes(association);\n    });\n\n    // remove existing associations\n    associationsToRemove.forEach(association => modeling.removeConnection(association));\n  }\n\n  function removeAttachments(element) {\n    const attachments = element.attachers.slice();\n\n    if (!attachments.length) {\n      return;\n    }\n\n    modeling.removeElements(attachments);\n  }\n\n  function removeIncomingCompensationAssociations(element) {\n    const compensationAssociations = element.incoming.filter(\n      connection => isCompensationBoundaryEvent(connection.source)\n    );\n\n    modeling.removeElements(compensationAssociations);\n  }\n\n  function removeOutgoingSequenceFlows(element) {\n    const sequenceFlows = element.outgoing.filter(\n      connection => is(connection, 'bpmn:SequenceFlow')\n    );\n\n    modeling.removeElements(sequenceFlows);\n  }\n}\n\ninherits(CompensateBoundaryEventBehavior, CommandInterceptor);\n\nCompensateBoundaryEventBehavior.$inject = [\n  'eventBus',\n  'modeling',\n  'bpmnRules'\n];\n\n// helpers //////////\n\nfunction isForCompensation(element) {\n  const bo = getBusinessObject(element);\n  return bo && bo.get('isForCompensation');\n}\n\nfunction isCompensationBoundaryEvent(element) {\n  return element && is(element, 'bpmn:BoundaryEvent') &&\n    hasEventDefinition(element, 'bpmn:CompensateEventDefinition');\n}\n\nfunction isForCompensationAllowed(element) {\n  return element && is(element, 'bpmn:Activity') && !isEventSubProcess(element);\n}\n"
  },
  {
    "path": "lib/features/modeling/behavior/CreateBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport { is } from '../../../util/ModelUtil';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport { getParent } from '../util/ModelingUtil';\n\n/**\n * @typedef {import('didi').Injector} Injector\n */\n\n/**\n * @param {Injector} injector\n */\nexport default function CreateBehavior(injector) {\n  injector.invoke(CommandInterceptor, this);\n\n  this.preExecute('shape.create', 1500, function(event) {\n    var context = event.context,\n        parent = context.parent,\n        shape = context.shape;\n\n    if (is(parent, 'bpmn:Lane') && !is(shape, 'bpmn:Lane')) {\n      context.parent = getParent(parent, 'bpmn:Participant');\n    }\n  });\n\n}\n\n\nCreateBehavior.$inject = [ 'injector' ];\n\ninherits(CreateBehavior, CommandInterceptor);"
  },
  {
    "path": "lib/features/modeling/behavior/CreateDataObjectBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport { is } from '../../../util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../BpmnFactory').default} BpmnFactory\n */\n\n/**\n * BPMN specific create data object behavior.\n *\n * @param {EventBus} eventBus\n * @param {BpmnFactory} bpmnFactory\n */\nexport default function CreateDataObjectBehavior(eventBus, bpmnFactory) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  this.preExecute('shape.create', function(event) {\n\n    var context = event.context,\n        shape = context.shape;\n\n    if (is(shape, 'bpmn:DataObjectReference') && shape.type !== 'label') {\n\n      // create a DataObject every time a DataObjectReference is created\n      var dataObject = bpmnFactory.create('bpmn:DataObject');\n\n      // Copy the isCollection property if needed.\n      dataObject.isCollection = shape.businessObject.dataObjectRef?.isCollection || false;\n\n      // set the reference to the DataObject\n      shape.businessObject.dataObjectRef = dataObject;\n    }\n  });\n\n}\n\nCreateDataObjectBehavior.$inject = [\n  'eventBus',\n  'bpmnFactory'\n];\n\ninherits(CreateDataObjectBehavior, CommandInterceptor);"
  },
  {
    "path": "lib/features/modeling/behavior/CreateParticipantBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport { getBusinessObject, is } from '../../../util/ModelUtil';\n\nimport { isLabel } from '../../../util/LabelUtil';\n\nimport { getBBox } from 'diagram-js/lib/util/Elements';\n\nimport {\n  assign,\n  find\n} from 'min-dash';\n\nimport { asTRBL } from 'diagram-js/lib/layout/LayoutUtil';\n\nimport { isConnection } from 'diagram-js/lib/util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../Modeling').default} Modeling\n */\n\nvar HORIZONTAL_PARTICIPANT_PADDING = 20,\n    VERTICAL_PARTICIPANT_PADDING = 20;\n\nexport var PARTICIPANT_BORDER_WIDTH = 30;\n\nvar HIGH_PRIORITY = 2000;\n\n\n/**\n * BPMN-specific behavior for creating participants.\n *\n * @param {Canvas} canvas\n * @param {EventBus} eventBus\n * @param {Modeling} modeling\n */\nexport default function CreateParticipantBehavior(canvas, eventBus, modeling) {\n  CommandInterceptor.call(this, eventBus);\n\n  // fit participant\n  eventBus.on([\n    'create.start',\n    'shape.move.start'\n  ], HIGH_PRIORITY, function(event) {\n    var context = event.context,\n        shape = context.shape,\n        rootElement = canvas.getRootElement();\n\n    if (!is(shape, 'bpmn:Participant') ||\n      !is(rootElement, 'bpmn:Process') ||\n      !rootElement.children.length) {\n      return;\n    }\n\n    // ignore connections, groups and labels\n    var children = rootElement.children.filter(function(element) {\n      return !is(element, 'bpmn:Group') &&\n        !isLabel(element) &&\n        !isConnection(element);\n    });\n\n    // ensure for available children to calculate bounds\n    if (!children.length) {\n      return;\n    }\n\n    var childrenBBox = getBBox(children);\n\n    var participantBounds = getParticipantBounds(shape, childrenBBox);\n\n    // assign width and height\n    assign(shape, participantBounds);\n\n    // assign create constraints\n    context.createConstraints = getParticipantCreateConstraints(shape, childrenBBox);\n  });\n\n  // force hovering process when creating first participant\n  eventBus.on('create.start', HIGH_PRIORITY, function(event) {\n    var context = event.context,\n        shape = context.shape,\n        rootElement = canvas.getRootElement(),\n        rootElementGfx = canvas.getGraphics(rootElement);\n\n    function ensureHoveringProcess(event) {\n      event.element = rootElement;\n      event.gfx = rootElementGfx;\n    }\n\n    if (is(shape, 'bpmn:Participant') && is(rootElement, 'bpmn:Process')) {\n      eventBus.on('element.hover', HIGH_PRIORITY, ensureHoveringProcess);\n\n      eventBus.once('create.cleanup', function() {\n        eventBus.off('element.hover', ensureHoveringProcess);\n      });\n    }\n  });\n\n  // turn process into collaboration when creating first participant\n  function getOrCreateCollaboration() {\n    var rootElement = canvas.getRootElement();\n\n    if (is(rootElement, 'bpmn:Collaboration')) {\n      return rootElement;\n    }\n\n    return modeling.makeCollaboration();\n  }\n\n  // when creating mutliple elements through `elements.create` parent must be set to collaboration\n  // and passed to `shape.create` as hint\n  this.preExecute('elements.create', HIGH_PRIORITY, function(context) {\n    var elements = context.elements,\n        parent = context.parent,\n        participant = findParticipant(elements),\n        hints;\n\n    if (participant && is(parent, 'bpmn:Process')) {\n      context.parent = getOrCreateCollaboration();\n\n      hints = context.hints = context.hints || {};\n\n      hints.participant = participant;\n      hints.process = parent;\n      hints.processRef = getBusinessObject(participant).get('processRef');\n    }\n  }, true);\n\n  // when creating single shape through `shape.create` parent must be set to collaboration\n  // unless it was already set through `elements.create`\n  this.preExecute('shape.create', function(context) {\n    var parent = context.parent,\n        shape = context.shape;\n\n    if (is(shape, 'bpmn:Participant') && is(parent, 'bpmn:Process')) {\n      context.parent = getOrCreateCollaboration();\n\n      context.process = parent;\n      context.processRef = getBusinessObject(shape).get('processRef');\n    }\n  }, true);\n\n  // #execute necessary because #preExecute not called on CommandStack#redo\n  this.execute('shape.create', function(context) {\n    var hints = context.hints || {},\n        process = context.process || hints.process,\n        shape = context.shape,\n        participant = hints.participant;\n\n    // both shape.create and elements.create must be handled\n    if (process && (!participant || shape === participant)) {\n\n      // monkey-patch process ref\n      getBusinessObject(shape).set('processRef', getBusinessObject(process));\n    }\n  }, true);\n\n  this.revert('shape.create', function(context) {\n    var hints = context.hints || {},\n        process = context.process || hints.process,\n        processRef = context.processRef || hints.processRef,\n        shape = context.shape,\n        participant = hints.participant;\n\n    // both shape.create and elements.create must be handled\n    if (process && (!participant || shape === participant)) {\n\n      // monkey-patch process ref\n      getBusinessObject(shape).set('processRef', processRef);\n    }\n  }, true);\n\n  this.postExecute('shape.create', function(context) {\n    var hints = context.hints || {},\n        process = context.process || context.hints.process,\n        shape = context.shape,\n        participant = hints.participant;\n\n    if (process) {\n      var children = process.children.slice();\n\n      // both shape.create and elements.create must be handled\n      if (!participant) {\n        modeling.moveElements(children, { x: 0, y: 0 }, shape);\n      } else if (shape === participant) {\n        modeling.moveElements(children, { x: 0, y: 0 }, participant);\n      }\n    }\n  }, true);\n}\n\nCreateParticipantBehavior.$inject = [\n  'canvas',\n  'eventBus',\n  'modeling'\n];\n\ninherits(CreateParticipantBehavior, CommandInterceptor);\n\n// helpers //////////\n\nfunction getParticipantBounds(shape, childrenBBox) {\n  childrenBBox = {\n    width: childrenBBox.width + HORIZONTAL_PARTICIPANT_PADDING * 2 + PARTICIPANT_BORDER_WIDTH,\n    height: childrenBBox.height + VERTICAL_PARTICIPANT_PADDING * 2\n  };\n\n  var width = Math.max(shape.width, childrenBBox.width),\n      height = Math.max(shape.height, childrenBBox.height);\n\n  return {\n    x: -width / 2,\n    y: -height / 2,\n    width: width,\n    height: height\n  };\n}\n\nfunction getParticipantCreateConstraints(shape, childrenBBox) {\n  childrenBBox = asTRBL(childrenBBox);\n\n  return {\n    bottom: childrenBBox.top + shape.height / 2 - VERTICAL_PARTICIPANT_PADDING,\n    left: childrenBBox.right - shape.width / 2 + HORIZONTAL_PARTICIPANT_PADDING,\n    top: childrenBBox.bottom - shape.height / 2 + VERTICAL_PARTICIPANT_PADDING,\n    right: childrenBBox.left + shape.width / 2 - HORIZONTAL_PARTICIPANT_PADDING - PARTICIPANT_BORDER_WIDTH\n  };\n}\n\nfunction findParticipant(elements) {\n  return find(elements, function(element) {\n    return is(element, 'bpmn:Participant');\n  });\n}"
  },
  {
    "path": "lib/features/modeling/behavior/DataInputAssociationBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport {\n  add as collectionAdd,\n  remove as collectionRemove\n} from 'diagram-js/lib/util/Collections';\n\nimport {\n  find\n} from 'min-dash';\n\nimport {\n  is\n} from '../../../util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../BpmnFactory').default} BpmnFactory\n */\n\nvar TARGET_REF_PLACEHOLDER_NAME = '__targetRef_placeholder';\n\n\n/**\n * This behavior makes sure we always set a fake\n * DataInputAssociation#targetRef as demanded by the BPMN 2.0\n * XSD schema.\n *\n * The reference is set to a bpmn:Property{ name: '__targetRef_placeholder' }\n * which is created on the fly and cleaned up afterwards if not needed\n * anymore.\n *\n * @param {EventBus} eventBus\n * @param {BpmnFactory} bpmnFactory\n */\nexport default function DataInputAssociationBehavior(eventBus, bpmnFactory) {\n\n  CommandInterceptor.call(this, eventBus);\n\n\n  this.executed([\n    'connection.create',\n    'connection.delete',\n    'connection.move',\n    'connection.reconnect'\n  ], ifDataInputAssociation(fixTargetRef));\n\n  this.reverted([\n    'connection.create',\n    'connection.delete',\n    'connection.move',\n    'connection.reconnect'\n  ], ifDataInputAssociation(fixTargetRef));\n\n\n  function usesTargetRef(element, targetRef, removedConnection) {\n\n    var inputAssociations = element.get('dataInputAssociations');\n\n    return find(inputAssociations, function(association) {\n      return association !== removedConnection &&\n             association.targetRef === targetRef;\n    });\n  }\n\n  function getTargetRef(element, create) {\n\n    var properties = element.get('properties');\n\n    var targetRefProp = find(properties, function(p) {\n      return p.name === TARGET_REF_PLACEHOLDER_NAME;\n    });\n\n    if (!targetRefProp && create) {\n      targetRefProp = bpmnFactory.create('bpmn:Property', {\n        name: TARGET_REF_PLACEHOLDER_NAME\n      });\n\n      collectionAdd(properties, targetRefProp);\n    }\n\n    return targetRefProp;\n  }\n\n  function cleanupTargetRef(element, connection) {\n\n    var targetRefProp = getTargetRef(element);\n\n    if (!targetRefProp) {\n      return;\n    }\n\n    if (!usesTargetRef(element, targetRefProp, connection)) {\n      collectionRemove(element.get('properties'), targetRefProp);\n    }\n  }\n\n  /**\n   * Make sure targetRef is set to a valid property or\n   * `null` if the connection is detached.\n   *\n   * @param {Event} event\n   */\n  function fixTargetRef(event) {\n\n    var context = event.context,\n        connection = context.connection,\n        connectionBo = connection.businessObject,\n        target = connection.target,\n        targetBo = target && target.businessObject,\n        newTarget = context.newTarget,\n        newTargetBo = newTarget && newTarget.businessObject,\n        oldTarget = context.oldTarget || context.target,\n        oldTargetBo = oldTarget && oldTarget.businessObject;\n\n    var dataAssociation = connection.businessObject,\n        targetRefProp;\n\n    if (oldTargetBo && oldTargetBo !== targetBo) {\n      cleanupTargetRef(oldTargetBo, connectionBo);\n    }\n\n    if (newTargetBo && newTargetBo !== targetBo) {\n      cleanupTargetRef(newTargetBo, connectionBo);\n    }\n\n    if (targetBo) {\n      targetRefProp = getTargetRef(targetBo, true);\n      dataAssociation.targetRef = targetRefProp;\n    } else {\n      dataAssociation.targetRef = null;\n    }\n  }\n}\n\nDataInputAssociationBehavior.$inject = [\n  'eventBus',\n  'bpmnFactory'\n];\n\ninherits(DataInputAssociationBehavior, CommandInterceptor);\n\n\n/**\n * Only call the given function when the event\n * changes a bpmn:DataInputAssociation.\n *\n * @param {Function} fn\n * @return {Function}\n */\nfunction ifDataInputAssociation(fn) {\n\n  return function(event) {\n    var context = event.context,\n        connection = context.connection;\n\n    if (is(connection, 'bpmn:DataInputAssociation')) {\n      return fn(event);\n    }\n  };\n}"
  },
  {
    "path": "lib/features/modeling/behavior/DataStoreBehavior.js",
    "content": "import inherits from 'inherits-browser';\r\n\r\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\r\n\r\nimport {\r\n  getBusinessObject,\r\n  getDi,\r\n  is\r\n} from '../../../util/ModelUtil';\r\n\r\nimport { isAny } from '../util/ModelingUtil';\r\n\r\nimport UpdateSemanticParentHandler from '../cmd/UpdateSemanticParentHandler';\r\n\r\n/**\r\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\r\n * @typedef {import('diagram-js/lib/command/CommandStack').default} CommandStack\r\n * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\r\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n */\r\n\r\n/**\r\n * BPMN specific data store behavior.\r\n *\r\n * @param {Canvas} canvas\r\n * @param {CommandStack} commandStack\r\n * @param {ElementRegistry} elementRegistry\r\n * @param {EventBus} eventBus\r\n */\r\nexport default function DataStoreBehavior(\r\n    canvas, commandStack, elementRegistry,\r\n    eventBus) {\r\n\r\n  CommandInterceptor.call(this, eventBus);\r\n\r\n  commandStack.registerHandler('dataStore.updateContainment', UpdateSemanticParentHandler);\r\n\r\n  function getFirstParticipantWithProcessRef() {\r\n    return elementRegistry.filter(function(element) {\r\n      return is(element, 'bpmn:Participant') && getBusinessObject(element).processRef;\r\n    })[0];\r\n  }\r\n\r\n  function getDataStores(element) {\r\n    return element.children.filter(function(child) {\r\n      return is(child, 'bpmn:DataStoreReference') && !child.labelTarget;\r\n    });\r\n  }\r\n\r\n  function updateDataStoreParent(dataStore, newDataStoreParent) {\r\n    var dataStoreBo = dataStore.businessObject || dataStore;\r\n\r\n    newDataStoreParent = newDataStoreParent || getFirstParticipantWithProcessRef();\r\n\r\n    if (newDataStoreParent) {\r\n      var newDataStoreParentBo = newDataStoreParent.businessObject || newDataStoreParent;\r\n\r\n      commandStack.execute('dataStore.updateContainment', {\r\n        dataStoreBo: dataStoreBo,\r\n        dataStoreDi: getDi(dataStore),\r\n        newSemanticParent: newDataStoreParentBo.processRef || newDataStoreParentBo,\r\n        newDiParent: getDi(newDataStoreParent)\r\n      });\r\n    }\r\n  }\r\n\r\n\r\n  // disable auto-resize for data stores\r\n  this.preExecute('shape.create', function(event) {\r\n\r\n    var context = event.context,\r\n        shape = context.shape;\r\n\r\n    if (is(shape, 'bpmn:DataStoreReference') &&\r\n        shape.type !== 'label') {\r\n\r\n      if (!context.hints) {\r\n        context.hints = {};\r\n      }\r\n\r\n      // prevent auto resizing\r\n      context.hints.autoResize = false;\r\n    }\r\n  });\r\n\r\n\r\n  // disable auto-resize for data stores\r\n  this.preExecute('elements.move', function(event) {\r\n    var context = event.context,\r\n        shapes = context.shapes;\r\n\r\n    var dataStoreReferences = shapes.filter(function(shape) {\r\n      return is(shape, 'bpmn:DataStoreReference');\r\n    });\r\n\r\n    if (dataStoreReferences.length) {\r\n      if (!context.hints) {\r\n        context.hints = {};\r\n      }\r\n\r\n      // prevent auto resizing for data store references\r\n      context.hints.autoResize = shapes.filter(function(shape) {\r\n        return !is(shape, 'bpmn:DataStoreReference');\r\n      });\r\n    }\r\n  });\r\n\r\n\r\n  // update parent on data store created\r\n  this.postExecute('shape.create', function(event) {\r\n    var context = event.context,\r\n        shape = context.shape,\r\n        parent = shape.parent;\r\n\r\n\r\n    if (is(shape, 'bpmn:DataStoreReference') &&\r\n        shape.type !== 'label' &&\r\n        is(parent, 'bpmn:Collaboration')) {\r\n\r\n      updateDataStoreParent(shape);\r\n    }\r\n  });\r\n\r\n\r\n  // update parent on data store moved\r\n  this.postExecute('shape.move', function(event) {\r\n    var context = event.context,\r\n        shape = context.shape,\r\n        oldParent = context.oldParent,\r\n        parent = shape.parent;\r\n\r\n    if (is(oldParent, 'bpmn:Collaboration')) {\r\n\r\n      // do nothing if not necessary\r\n      return;\r\n    }\r\n\r\n    if (is(shape, 'bpmn:DataStoreReference') &&\r\n        shape.type !== 'label' &&\r\n        is(parent, 'bpmn:Collaboration')) {\r\n\r\n      var participant = is(oldParent, 'bpmn:Participant') ?\r\n        oldParent :\r\n        getAncestor(oldParent, 'bpmn:Participant');\r\n\r\n      updateDataStoreParent(shape, participant);\r\n    }\r\n  });\r\n\r\n\r\n  // update data store parents on participant or subprocess deleted\r\n  this.postExecute('shape.delete', function(event) {\r\n    var context = event.context,\r\n        shape = context.shape,\r\n        rootElement = canvas.getRootElement();\r\n\r\n    if (isAny(shape, [ 'bpmn:Participant', 'bpmn:SubProcess' ])\r\n        && is(rootElement, 'bpmn:Collaboration')) {\r\n      getDataStores(rootElement)\r\n        .filter(function(dataStore) {\r\n          return isDescendant(dataStore, shape);\r\n        })\r\n        .forEach(function(dataStore) {\r\n          updateDataStoreParent(dataStore);\r\n        });\r\n    }\r\n  });\r\n\r\n  // update data store parents on collaboration -> process\r\n  this.postExecute('canvas.updateRoot', function(event) {\r\n    var context = event.context,\r\n        oldRoot = context.oldRoot,\r\n        newRoot = context.newRoot;\r\n\r\n    var dataStores = getDataStores(oldRoot);\r\n\r\n    dataStores.forEach(function(dataStore) {\r\n\r\n      if (is(newRoot, 'bpmn:Process')) {\r\n        updateDataStoreParent(dataStore, newRoot);\r\n      }\r\n\r\n    });\r\n  });\r\n}\r\n\r\nDataStoreBehavior.$inject = [\r\n  'canvas',\r\n  'commandStack',\r\n  'elementRegistry',\r\n  'eventBus',\r\n];\r\n\r\ninherits(DataStoreBehavior, CommandInterceptor);\r\n\r\n\r\n// helpers //////////\r\n\r\nfunction isDescendant(descendant, ancestor) {\r\n  var descendantBo = descendant.businessObject || descendant,\r\n      ancestorBo = ancestor.businessObject || ancestor;\r\n\r\n  while (descendantBo.$parent) {\r\n    if (descendantBo.$parent === ancestorBo.processRef || ancestorBo) {\r\n      return true;\r\n    }\r\n\r\n    descendantBo = descendantBo.$parent;\r\n  }\r\n\r\n  return false;\r\n}\r\n\r\nfunction getAncestor(element, type) {\r\n\r\n  while (element.parent) {\r\n    if (is(element.parent, type)) {\r\n      return element.parent;\r\n    }\r\n\r\n    element = element.parent;\r\n  }\r\n}"
  },
  {
    "path": "lib/features/modeling/behavior/DeleteLaneBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport { is } from '../../../util/ModelUtil';\n\nimport {\n  getChildLanes\n} from '../util/LaneUtil';\n\nimport {\n  isHorizontal\n} from '../../../util/DiUtil';\n\nimport {\n  eachElement\n} from 'diagram-js/lib/util/Elements';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../../space-tool/BpmnSpaceTool').default} SpaceTool\n */\n\nvar LOW_PRIORITY = 500;\n\n\n/**\n * BPMN specific delete lane behavior.\n *\n * @param {EventBus} eventBus\n * @param {SpaceTool} spaceTool\n */\nexport default function DeleteLaneBehavior(eventBus, spaceTool) {\n\n  CommandInterceptor.call(this, eventBus);\n\n\n  function compensateLaneDelete(shape, oldParent) {\n    var isHorizontalLane = isHorizontal(shape);\n\n    var siblings = getChildLanes(oldParent);\n\n    var topAffected = [];\n    var bottomAffected = [];\n    var leftAffected = [];\n    var rightAffected = [];\n\n    eachElement(siblings, function(element) {\n\n      if (isHorizontalLane) {\n        if (element.y > shape.y) {\n          bottomAffected.push(element);\n        } else {\n          topAffected.push(element);\n        }\n      } else {\n        if (element.x > shape.x) {\n          rightAffected.push(element);\n        } else {\n          leftAffected.push(element);\n        }\n      }\n\n      return element.children;\n    });\n\n    if (!siblings.length) {\n      return;\n    }\n\n    var offset;\n\n    if (isHorizontalLane) {\n      if (bottomAffected.length && topAffected.length) {\n        offset = shape.height / 2;\n      } else {\n        offset = shape.height;\n      }\n    } else {\n      if (rightAffected.length && leftAffected.length) {\n        offset = shape.width / 2;\n      } else {\n        offset = shape.width;\n      }\n    }\n\n    var topAdjustments,\n        bottomAdjustments,\n        leftAdjustments,\n        rightAdjustments;\n\n    if (topAffected.length) {\n      topAdjustments = spaceTool.calculateAdjustments(\n        topAffected, 'y', offset, shape.y - 10);\n\n      spaceTool.makeSpace(\n        topAdjustments.movingShapes,\n        topAdjustments.resizingShapes,\n        { x: 0, y: offset }, 's');\n    }\n\n    if (bottomAffected.length) {\n      bottomAdjustments = spaceTool.calculateAdjustments(\n        bottomAffected, 'y', -offset, shape.y + shape.height + 10);\n\n      spaceTool.makeSpace(\n        bottomAdjustments.movingShapes,\n        bottomAdjustments.resizingShapes,\n        { x: 0, y: -offset }, 'n');\n    }\n\n    if (leftAffected.length) {\n      leftAdjustments = spaceTool.calculateAdjustments(\n        leftAffected, 'x', offset, shape.x - 10);\n\n      spaceTool.makeSpace(\n        leftAdjustments.movingShapes,\n        leftAdjustments.resizingShapes,\n        { x: offset, y: 0 }, 'e');\n    }\n\n    if (rightAffected.length) {\n      rightAdjustments = spaceTool.calculateAdjustments(\n        rightAffected, 'x', -offset, shape.x + shape.width + 10);\n\n      spaceTool.makeSpace(\n        rightAdjustments.movingShapes,\n        rightAdjustments.resizingShapes,\n        { x: -offset, y: 0 }, 'w');\n    }\n  }\n\n\n  /**\n   * Adjust sizes of other lanes after lane deletion\n   */\n  this.postExecuted('shape.delete', LOW_PRIORITY, function(event) {\n\n    var context = event.context,\n        hints = context.hints,\n        shape = context.shape,\n        oldParent = context.oldParent;\n\n    // only compensate lane deletes\n    if (!is(shape, 'bpmn:Lane')) {\n      return;\n    }\n\n    // compensate root deletes only\n    if (hints && hints.nested) {\n      return;\n    }\n\n    compensateLaneDelete(shape, oldParent);\n  });\n}\n\nDeleteLaneBehavior.$inject = [\n  'eventBus',\n  'spaceTool'\n];\n\ninherits(DeleteLaneBehavior, CommandInterceptor);"
  },
  {
    "path": "lib/features/modeling/behavior/DetachEventBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport {\n  getBusinessObject,\n  is\n} from '../../../util/ModelUtil';\n\nimport { isLabel } from '../../../util/LabelUtil';\n\n/**\n * @typedef {import('../../replace/BpmnReplace').default} BpmnReplace\n * @typedef {import('didi').Injector} Injector\n */\n\nvar LOW_PRIORITY = 500;\n\n\n/**\n * Replace boundary event with intermediate event when creating or moving results in detached event.\n *\n * @param {BpmnReplace} bpmnReplace\n * @param {Injector} injector\n */\nexport default function DetachEventBehavior(bpmnReplace, injector) {\n  injector.invoke(CommandInterceptor, this);\n\n  this._bpmnReplace = bpmnReplace;\n\n  var self = this;\n\n  this.postExecuted('elements.create', LOW_PRIORITY, function(context) {\n    var elements = context.elements;\n\n    elements.filter(function(shape) {\n      var host = shape.host;\n\n      return shouldReplace(shape, host);\n    }).map(function(shape) {\n      return elements.indexOf(shape);\n    }).forEach(function(index) {\n      context.elements[ index ] = self._replaceShape(elements[ index ]);\n    });\n  }, true);\n\n  this.preExecute('elements.move', LOW_PRIORITY, function(context) {\n    var shapes = context.shapes,\n        newHost = context.newHost;\n\n    shapes.forEach(function(shape, index) {\n      var host = shape.host;\n\n      if (shouldReplace(shape, includes(shapes, host) ? host : newHost)) {\n        shapes[ index ] = self._replaceShape(shape);\n      }\n    });\n  }, true);\n}\n\nDetachEventBehavior.$inject = [\n  'bpmnReplace',\n  'injector'\n];\n\ninherits(DetachEventBehavior, CommandInterceptor);\n\nDetachEventBehavior.prototype._replaceShape = function(shape) {\n  var eventDefinition = getEventDefinition(shape),\n      intermediateEvent;\n\n  if (eventDefinition) {\n    intermediateEvent = {\n      type: 'bpmn:IntermediateCatchEvent',\n      eventDefinitionType: eventDefinition.$type\n    };\n  } else {\n    intermediateEvent = {\n      type: 'bpmn:IntermediateThrowEvent'\n    };\n  }\n\n  return this._bpmnReplace.replaceElement(shape, intermediateEvent, { layoutConnection: false });\n};\n\n\n// helpers //////////\n\nfunction getEventDefinition(element) {\n  var businessObject = getBusinessObject(element),\n      eventDefinitions = businessObject.eventDefinitions;\n\n  return eventDefinitions && eventDefinitions[0];\n}\n\nfunction shouldReplace(shape, host) {\n  return !isLabel(shape) && is(shape, 'bpmn:BoundaryEvent') && !host;\n}\n\nfunction includes(array, item) {\n  return array.indexOf(item) !== -1;\n}"
  },
  {
    "path": "lib/features/modeling/behavior/DropOnFlowBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport {\n  assign,\n  filter,\n  find,\n  isNumber\n} from 'min-dash';\n\nimport { getMid } from 'diagram-js/lib/layout/LayoutUtil';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport {\n  getApproxIntersection\n} from 'diagram-js/lib/util/LineIntersection';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../../rules/BpmnRules').default} BpmnRules\n * @typedef {import('../../modeling/Modeling').default} Modeling\n */\n\n/**\n * @param {EventBus} eventBus\n * @param {BpmnRules} bpmnRules\n * @param {Modeling} modeling\n */\nexport default function DropOnFlowBehavior(eventBus, bpmnRules, modeling) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  /**\n   * Reconnect start / end of a connection after\n   * dropping an element on a flow.\n   */\n\n  function insertShape(shape, targetFlow, positionOrBounds) {\n    var waypoints = targetFlow.waypoints,\n        waypointsBefore,\n        waypointsAfter,\n        dockingPoint,\n        source,\n        target,\n        incomingConnection,\n        outgoingConnection,\n        oldOutgoing = shape.outgoing.slice(),\n        oldIncoming = shape.incoming.slice();\n\n    var mid;\n\n    if (isNumber(positionOrBounds.width)) {\n      mid = getMid(positionOrBounds);\n    } else {\n      mid = positionOrBounds;\n    }\n\n    var intersection = getApproxIntersection(waypoints, mid);\n\n    if (intersection) {\n      waypointsBefore = waypoints.slice(0, intersection.index);\n      waypointsAfter = waypoints.slice(intersection.index + (intersection.bendpoint ? 1 : 0));\n\n      // due to inaccuracy intersection might have been found\n      if (!waypointsBefore.length || !waypointsAfter.length) {\n        return;\n      }\n\n      dockingPoint = intersection.bendpoint ? waypoints[intersection.index] : mid;\n\n      // if last waypointBefore is inside shape's bounds, ignore docking point\n      if (waypointsBefore.length === 1 || !isPointInsideBBox(shape, waypointsBefore[waypointsBefore.length - 1])) {\n        waypointsBefore.push(copy(dockingPoint));\n      }\n\n      // if first waypointAfter is inside shape's bounds, ignore docking point\n      if (waypointsAfter.length === 1 || !isPointInsideBBox(shape, waypointsAfter[0])) {\n        waypointsAfter.unshift(copy(dockingPoint));\n      }\n    }\n\n    source = targetFlow.source;\n    target = targetFlow.target;\n\n    if (bpmnRules.canConnect(source, shape, targetFlow)) {\n\n      // reconnect source -> inserted shape\n      modeling.reconnectEnd(targetFlow, shape, waypointsBefore || mid);\n\n      incomingConnection = targetFlow;\n    }\n\n    if (bpmnRules.canConnect(shape, target, targetFlow)) {\n\n      if (!incomingConnection) {\n\n        // reconnect inserted shape -> end\n        modeling.reconnectStart(targetFlow, shape, waypointsAfter || mid);\n\n        outgoingConnection = targetFlow;\n      } else {\n        outgoingConnection = modeling.connect(\n          shape, target, { type: targetFlow.type, waypoints: waypointsAfter }\n        );\n      }\n    }\n\n    var duplicateConnections = [].concat(\n\n      incomingConnection && filter(oldIncoming, function(connection) {\n        return connection.source === incomingConnection.source;\n      }) || [],\n\n      outgoingConnection && filter(oldOutgoing, function(connection) {\n        return connection.target === outgoingConnection.target;\n      }) || []\n    );\n\n    if (duplicateConnections.length) {\n      modeling.removeElements(duplicateConnections);\n    }\n  }\n\n  this.preExecute('elements.move', function(context) {\n\n    var newParent = context.newParent,\n        shapes = context.shapes,\n        delta = context.delta,\n        shape = shapes[0];\n\n    if (!shape || !newParent) {\n      return;\n    }\n\n    // if the new parent is a connection,\n    // change it to the new parent's parent\n    if (newParent && newParent.waypoints) {\n      context.newParent = newParent = newParent.parent;\n    }\n\n    var shapeMid = getMid(shape);\n    var newShapeMid = {\n      x: shapeMid.x + delta.x,\n      y: shapeMid.y + delta.y\n    };\n\n    // find a connection which intersects with the\n    // element's mid point\n    var connection = find(newParent.children, function(element) {\n      var canInsert = bpmnRules.canInsert(shapes, element);\n\n      return canInsert && getApproxIntersection(element.waypoints, newShapeMid);\n    });\n\n    if (connection) {\n      context.targetFlow = connection;\n      context.position = newShapeMid;\n    }\n\n  }, true);\n\n  this.postExecuted('elements.move', function(context) {\n\n    var shapes = context.shapes,\n        targetFlow = context.targetFlow,\n        position = context.position;\n\n    if (targetFlow) {\n      insertShape(shapes[0], targetFlow, position);\n    }\n\n  }, true);\n\n  this.preExecute('shape.create', function(context) {\n\n    var parent = context.parent,\n        shape = context.shape;\n\n    if (bpmnRules.canInsert(shape, parent)) {\n      context.targetFlow = parent;\n      context.parent = parent.parent;\n    }\n  }, true);\n\n  this.postExecuted('shape.create', function(context) {\n\n    var shape = context.shape,\n        targetFlow = context.targetFlow,\n        positionOrBounds = context.position;\n\n    if (targetFlow) {\n      insertShape(shape, targetFlow, positionOrBounds);\n    }\n  }, true);\n}\n\ninherits(DropOnFlowBehavior, CommandInterceptor);\n\nDropOnFlowBehavior.$inject = [\n  'eventBus',\n  'bpmnRules',\n  'modeling'\n];\n\n\n// helpers /////////////////////\n\nfunction isPointInsideBBox(bbox, point) {\n  var x = point.x,\n      y = point.y;\n\n  return x >= bbox.x &&\n    x <= bbox.x + bbox.width &&\n    y >= bbox.y &&\n    y <= bbox.y + bbox.height;\n}\n\nfunction copy(obj) {\n  return assign({}, obj);\n}\n\n"
  },
  {
    "path": "lib/features/modeling/behavior/EventBasedGatewayBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport { is } from '../../../util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../Modeling').default} Modeling\n */\n\n/**\n * @param {EventBus} eventBus\n * @param {Modeling} modeling\n */\nexport default function EventBasedGatewayBehavior(eventBus, modeling) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  /**\n   * Remove incoming sequence flows of event-based target when creating\n   * sequence flow.\n   *\n   * 1. If source is event-based gateway remove all incoming sequence flows\n   * 2. If source is not event-based gateway remove all incoming sequence flows\n   * whose source is event-based gateway\n   */\n  this.preExecuted('connection.create', function(event) {\n    var context = event.context,\n        connection = context.connection,\n        source = context.source,\n        target = context.target,\n        hints = context.hints;\n\n    if (hints && hints.createElementsBehavior === false) {\n      return;\n    }\n\n    if (!isSequenceFlow(connection)) {\n      return;\n    }\n\n    var sequenceFlows = [];\n\n    if (is(source, 'bpmn:EventBasedGateway')) {\n      sequenceFlows = target.incoming\n        .filter(flow =>\n          flow !== connection &&\n          isSequenceFlow(flow)\n        );\n    } else {\n      sequenceFlows = target.incoming\n        .filter(flow =>\n          flow !== connection &&\n          isSequenceFlow(flow) &&\n          is(flow.source, 'bpmn:EventBasedGateway')\n        );\n    }\n\n    sequenceFlows.forEach(function(sequenceFlow) {\n      modeling.removeConnection(sequenceFlow);\n    });\n  });\n\n  /**\n   * Remove incoming sequence flows of event-based targets when replacing source\n   * with event-based gateway.\n   */\n  this.preExecuted('shape.replace', function(event) {\n    var context = event.context,\n        newShape = context.newShape;\n\n    if (!is(newShape, 'bpmn:EventBasedGateway')) {\n      return;\n    }\n\n    var targets = newShape.outgoing.filter(isSequenceFlow)\n      .reduce(function(targets, sequenceFlow) {\n        if (!targets.includes(sequenceFlow.target)) {\n          return targets.concat(sequenceFlow.target);\n        }\n\n        return targets;\n      }, []);\n\n    targets.forEach(function(target) {\n      target.incoming.filter(isSequenceFlow).forEach(function(sequenceFlow) {\n        const sequenceFlowsFromNewShape = target.incoming.filter(isSequenceFlow).filter(function(sequenceFlow) {\n          return sequenceFlow.source === newShape;\n        });\n\n        if (sequenceFlow.source !== newShape || sequenceFlowsFromNewShape.length > 1) {\n          modeling.removeConnection(sequenceFlow);\n        }\n      });\n    });\n  });\n}\n\nEventBasedGatewayBehavior.$inject = [\n  'eventBus',\n  'modeling'\n];\n\ninherits(EventBasedGatewayBehavior, CommandInterceptor);\n\n// helpers //////////\n\nfunction isSequenceFlow(connection) {\n  return is(connection, 'bpmn:SequenceFlow');\n}"
  },
  {
    "path": "lib/features/modeling/behavior/FixHoverBehavior.js",
    "content": "import { getLanesRoot } from '../util/LaneUtil';\r\n\r\nimport { is, isAny } from '../../../util/ModelUtil';\r\n\r\n/**\r\n * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\r\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\r\n */\r\n\r\nvar HIGH_PRIORITY = 1500;\r\nvar HIGHEST_PRIORITY = 2000;\r\n\r\n\r\n/**\r\n * Correct hover targets in certain situations to improve diagram interaction.\r\n *\r\n * @param {ElementRegistry} elementRegistry\r\n * @param {EventBus} eventBus\r\n * @param {Canvas} canvas\r\n */\r\nexport default function FixHoverBehavior(elementRegistry, eventBus, canvas) {\r\n\r\n  eventBus.on([\r\n    'create.hover',\r\n    'create.move',\r\n    'create.out',\r\n    'create.end',\r\n    'shape.move.hover',\r\n    'shape.move.move',\r\n    'shape.move.out',\r\n    'shape.move.end'\r\n  ], HIGH_PRIORITY, function(event) {\r\n    var context = event.context,\r\n        shape = context.shape || event.shape,\r\n        hover = event.hover;\r\n\r\n    // ensure elements are not dropped onto a bpmn:Lane but onto\r\n    // the underlying bpmn:Participant\r\n    if (is(hover, 'bpmn:Lane') && !isAny(shape, [ 'bpmn:Lane', 'bpmn:Participant' ])) {\r\n      event.hover = getLanesRoot(hover);\r\n      event.hoverGfx = elementRegistry.getGraphics(event.hover);\r\n    }\r\n\r\n    var rootElement = canvas.getRootElement();\r\n\r\n    // ensure bpmn:Group and label elements are dropped\r\n    // always onto the root\r\n    if (hover !== rootElement && (shape.labelTarget || isAny(shape, [ 'bpmn:Group', 'bpmn:TextAnnotation' ]))) {\r\n      event.hover = rootElement;\r\n      event.hoverGfx = elementRegistry.getGraphics(event.hover);\r\n    }\r\n  });\r\n\r\n  eventBus.on([\r\n    'connect.hover',\r\n    'connect.out',\r\n    'connect.end',\r\n    'connect.cleanup',\r\n    'global-connect.hover',\r\n    'global-connect.out',\r\n    'global-connect.end',\r\n    'global-connect.cleanup'\r\n  ], HIGH_PRIORITY, function(event) {\r\n    var hover = event.hover;\r\n\r\n    // ensure connections start/end on bpmn:Participant,\r\n    // not the underlying bpmn:Lane\r\n    if (is(hover, 'bpmn:Lane')) {\r\n      event.hover = getLanesRoot(hover) || hover;\r\n      event.hoverGfx = elementRegistry.getGraphics(event.hover);\r\n    }\r\n  });\r\n\r\n\r\n  eventBus.on([\r\n    'bendpoint.move.hover'\r\n  ], HIGH_PRIORITY, function(event) {\r\n    var context = event.context,\r\n        hover = event.hover,\r\n        type = context.type;\r\n\r\n    // ensure reconnect start/end on bpmn:Participant,\r\n    // not the underlying bpmn:Lane\r\n    if (is(hover, 'bpmn:Lane') && /reconnect/.test(type)) {\r\n      event.hover = getLanesRoot(hover) || hover;\r\n      event.hoverGfx = elementRegistry.getGraphics(event.hover);\r\n    }\r\n  });\r\n\r\n\r\n  eventBus.on([\r\n    'connect.start'\r\n  ], HIGH_PRIORITY, function(event) {\r\n    var context = event.context,\r\n        start = context.start;\r\n\r\n    // ensure connect start on bpmn:Participant,\r\n    // not the underlying bpmn:Lane\r\n    if (is(start, 'bpmn:Lane')) {\r\n      context.start = getLanesRoot(start) || start;\r\n    }\r\n  });\r\n\r\n\r\n  // allow movement of participants from lanes\r\n  eventBus.on('shape.move.start', HIGHEST_PRIORITY, function(event) {\r\n    var shape = event.shape;\r\n\r\n    if (is(shape, 'bpmn:Lane')) {\r\n      event.shape = getLanesRoot(shape) || shape;\r\n    }\r\n  });\r\n\r\n  // ensure lanes aren't resized without their parent participant when using\r\n  // space tool\r\n  eventBus.on('spaceTool.move', HIGHEST_PRIORITY, function(event) {\r\n    var hover = event.hover;\r\n\r\n    if (hover && is(hover, 'bpmn:Lane')) {\r\n      event.hover = getLanesRoot(hover);\r\n    }\r\n  });\r\n\r\n}\r\n\r\nFixHoverBehavior.$inject = [\r\n  'elementRegistry',\r\n  'eventBus',\r\n  'canvas'\r\n];"
  },
  {
    "path": "lib/features/modeling/behavior/GroupBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport {\n  getBusinessObject,\n  is\n} from '../../../util/ModelUtil';\n\nimport {\n  createCategory,\n  createCategoryValue,\n  linkCategoryValue,\n  unlinkCategory,\n  unlinkCategoryValue\n} from './util/CategoryUtil';\n\n/**\n * @typedef {import('../BpmnFactory').default} BpmnFactory\n * @typedef {import('../../../Modeler').default} Modeler\n * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('didi').Injector} Injector\n * @typedef {import('../../copy-paste/ModdleCopy').default} ModdleCopy\n *\n * @typedef {import('../../../model/Types').Element} Element\n * @typedef {import('../../../model/Types').Shape} Shape\n *\n * @typedef {import('diagram-js/lib/util/Types').DirectionTRBL} DirectionTRBL\n */\n\nvar LOWER_PRIORITY = 770;\n\n\n/**\n * BPMN specific group behavior.\n *\n * @param {BpmnFactory} bpmnFactory\n * @param {Modeler} bpmnjs\n * @param {ElementRegistry} elementRegistry\n * @param {EventBus} eventBus\n * @param {Injector} injector\n * @param {ModdleCopy} moddleCopy\n */\nexport default function GroupBehavior(\n    bpmnFactory,\n    bpmnjs,\n    elementRegistry,\n    eventBus,\n    injector,\n    moddleCopy\n) {\n  injector.invoke(CommandInterceptor, this);\n\n  /**\n   * Returns all group element in the current registry.\n   *\n   * @return {Shape[]}\n   */\n  function getGroupElements() {\n    return elementRegistry.filter(function(e) {\n      return is(e, 'bpmn:Group');\n    });\n  }\n\n  /**\n   * Returns true if given category is referenced in one of the given elements.\n   *\n   * @param {Element[]} elements\n   * @param {ModdleElement} category\n   *\n   * @return {boolean}\n   */\n  function isReferencedCategory(elements, category) {\n    return elements.some(function(element) {\n      var businessObject = getBusinessObject(element);\n\n      var _category = businessObject.categoryValueRef && businessObject.categoryValueRef.$parent;\n\n      return _category === category;\n    });\n  }\n\n  /**\n   * Returns true if given categoryValue is referenced in one of the given elements.\n   *\n   * @param {Element[]} elements\n   * @param {ModdleElement} categoryValue\n   *\n   * @return {boolean}\n   */\n  function isReferencedCategoryValue(elements, categoryValue) {\n    return elements.some(function(element) {\n      var businessObject = getBusinessObject(element);\n\n      return businessObject.categoryValueRef === categoryValue;\n    });\n  }\n\n  /**\n   * Remove category value unless it is still referenced.\n   *\n   * @param {ModdleElement} categoryValue\n   * @param {ModdleElement} category\n   * @param {ModdleElement} businessObject\n   */\n  function removeCategoryValue(categoryValue, category, businessObject) {\n\n    var groups = getGroupElements().filter(function(element) {\n      return element.businessObject !== businessObject;\n    });\n\n    if (category && !isReferencedCategory(groups, category)) {\n      unlinkCategory(category);\n    }\n\n    if (categoryValue && !isReferencedCategoryValue(groups, categoryValue)) {\n      unlinkCategoryValue(categoryValue);\n    }\n  }\n\n  /**\n   * Add category value.\n   *\n   * @param {ModdleElement} categoryValue\n   * @param {ModdleElement} category\n   *\n   * @return {ModdleElement}\n   */\n  function addCategoryValue(categoryValue, category) {\n    return linkCategoryValue(categoryValue, category, bpmnjs.getDefinitions());\n  }\n\n  function setCategoryValue(element, context) {\n    var businessObject = getBusinessObject(element),\n        categoryValue = businessObject.categoryValueRef;\n\n    if (!categoryValue) {\n      categoryValue =\n      businessObject.categoryValueRef =\n      context.categoryValue = (\n        context.categoryValue || createCategoryValue(bpmnFactory)\n      );\n    }\n\n    var category = categoryValue.$parent;\n\n    if (!category) {\n      category =\n      categoryValue.$parent =\n      context.category = (\n        context.category || createCategory(bpmnFactory)\n      );\n    }\n\n    addCategoryValue(categoryValue, category, bpmnjs.getDefinitions());\n  }\n\n  function unsetCategoryValue(element, context) {\n    var category = context.category,\n        categoryValue = context.categoryValue,\n        businessObject = getBusinessObject(element);\n\n    if (categoryValue) {\n      businessObject.categoryValueRef = null;\n\n      removeCategoryValue(categoryValue, category, businessObject);\n    } else {\n      removeCategoryValue(null, businessObject.categoryValueRef.$parent, businessObject);\n    }\n  }\n\n\n  // ensure category + value exist before label editing\n\n  this.execute('label.create', function(event) {\n    var context = event.context,\n        labelTarget = context.labelTarget;\n\n    if (!is(labelTarget, 'bpmn:Group')) {\n      return;\n    }\n\n    setCategoryValue(labelTarget, context);\n  });\n\n  this.revert('label.create', function(event) {\n    var context = event.context,\n        labelTarget = context.labelTarget;\n\n    if (!is(labelTarget, 'bpmn:Group')) {\n      return;\n    }\n\n    unsetCategoryValue(labelTarget, context);\n  });\n\n\n  // remove referenced category + value when group was deleted\n\n  this.execute('shape.delete', function(event) {\n\n    var context = event.context,\n        shape = context.shape,\n        businessObject = getBusinessObject(shape);\n\n    if (!is(shape, 'bpmn:Group') || shape.labelTarget) {\n      return;\n    }\n\n    var categoryValue = context.categoryValue = businessObject.categoryValueRef,\n        category;\n\n    if (categoryValue) {\n      category = context.category = categoryValue.$parent;\n\n      removeCategoryValue(categoryValue, category, businessObject);\n\n      businessObject.categoryValueRef = null;\n    }\n  });\n\n  this.reverted('shape.delete', function(event) {\n\n    var context = event.context,\n        shape = context.shape;\n\n    if (!is(shape, 'bpmn:Group') || shape.labelTarget) {\n      return;\n    }\n\n    var category = context.category,\n        categoryValue = context.categoryValue,\n        businessObject = getBusinessObject(shape);\n\n    if (categoryValue) {\n      businessObject.categoryValueRef = categoryValue;\n\n      addCategoryValue(categoryValue, category);\n    }\n  });\n\n\n  // create new category + value when group was created\n\n  this.execute('shape.create', function(event) {\n    var context = event.context,\n        shape = context.shape;\n\n    if (!is(shape, 'bpmn:Group') || shape.labelTarget) {\n      return;\n    }\n\n    if (getBusinessObject(shape).categoryValueRef) {\n      setCategoryValue(shape, context);\n    }\n  });\n\n  this.reverted('shape.create', function(event) {\n\n    var context = event.context,\n        shape = context.shape;\n\n    if (!is(shape, 'bpmn:Group') || shape.labelTarget) {\n      return;\n    }\n\n    if (getBusinessObject(shape).categoryValueRef) {\n      unsetCategoryValue(shape, context);\n    }\n  });\n\n\n  // copy + paste categoryValueRef with group\n\n  function copy(bo, clone) {\n    var targetBo = bpmnFactory.create(bo.$type);\n\n    return moddleCopy.copyElement(bo, targetBo, null, clone);\n  }\n\n  eventBus.on('copyPaste.copyElement', LOWER_PRIORITY, function(context) {\n    var descriptor = context.descriptor,\n        element = context.element;\n\n    if (!is(element, 'bpmn:Group') || element.labelTarget) {\n      return;\n    }\n\n    var groupBo = getBusinessObject(element);\n\n    if (groupBo.categoryValueRef) {\n\n      var categoryValue = groupBo.categoryValueRef;\n\n      descriptor.categoryValue = copy(categoryValue, true);\n\n      if (categoryValue.$parent) {\n        descriptor.category = copy(categoryValue.$parent, true);\n      }\n    }\n  });\n\n  eventBus.on('copyPaste.pasteElement', LOWER_PRIORITY, function(context) {\n    var descriptor = context.descriptor,\n        businessObject = descriptor.businessObject,\n        categoryValue = descriptor.categoryValue,\n        category = descriptor.category;\n\n    if (categoryValue) {\n      categoryValue = businessObject.categoryValueRef = copy(categoryValue);\n    }\n\n    if (category) {\n      categoryValue.$parent = copy(category);\n    }\n\n    delete descriptor.category;\n    delete descriptor.categoryValue;\n  });\n\n}\n\nGroupBehavior.$inject = [\n  'bpmnFactory',\n  'bpmnjs',\n  'elementRegistry',\n  'eventBus',\n  'injector',\n  'moddleCopy'\n];\n\ninherits(GroupBehavior, CommandInterceptor);"
  },
  {
    "path": "lib/features/modeling/behavior/ImportDockingFix.js",
    "content": "import {\n  getMid\n} from 'diagram-js/lib/layout/LayoutUtil';\n\nimport lineIntersect from './util/LineIntersect';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n */\n\n/**\n * Fix broken dockings after DI imports.\n *\n * @param {EventBus} eventBus\n */\nexport default function ImportDockingFix(eventBus) {\n\n  function adjustDocking(startPoint, nextPoint, elementMid) {\n\n    var elementTop = {\n      x: elementMid.x,\n      y: elementMid.y - 50\n    };\n\n    var elementLeft = {\n      x: elementMid.x - 50,\n      y: elementMid.y\n    };\n\n    var verticalIntersect = lineIntersect(startPoint, nextPoint, elementMid, elementTop),\n        horizontalIntersect = lineIntersect(startPoint, nextPoint, elementMid, elementLeft);\n\n    // original is horizontal or vertical center cross intersection\n    var centerIntersect;\n\n    if (verticalIntersect && horizontalIntersect) {\n      if (getDistance(verticalIntersect, elementMid) > getDistance(horizontalIntersect, elementMid)) {\n        centerIntersect = horizontalIntersect;\n      } else {\n        centerIntersect = verticalIntersect;\n      }\n    } else {\n      centerIntersect = verticalIntersect || horizontalIntersect;\n    }\n\n    startPoint.original = centerIntersect;\n  }\n\n  function fixDockings(connection) {\n    var waypoints = connection.waypoints;\n\n    adjustDocking(\n      waypoints[0],\n      waypoints[1],\n      getMid(connection.source)\n    );\n\n    adjustDocking(\n      waypoints[waypoints.length - 1],\n      waypoints[waypoints.length - 2],\n      getMid(connection.target)\n    );\n  }\n\n  eventBus.on('bpmnElement.added', function(e) {\n\n    var element = e.element;\n\n    if (element.waypoints) {\n      fixDockings(element);\n    }\n  });\n}\n\nImportDockingFix.$inject = [\n  'eventBus'\n];\n\n\n// helpers //////////////////////\n\nfunction getDistance(p1, p2) {\n  return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));\n}"
  },
  {
    "path": "lib/features/modeling/behavior/IsHorizontalFix.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport {\n  getBusinessObject,\n  getDi\n} from '../../../util/ModelUtil';\n\nimport {\n  isAny\n} from '../util/ModelingUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n */\n\n/**\n * A component that makes sure that each created or updated\n * Pool and Lane is assigned an isHorizontal property set to true.\n *\n * @param {EventBus} eventBus\n */\nexport default function IsHorizontalFix(eventBus) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  var elementTypesToUpdate = [\n    'bpmn:Participant',\n    'bpmn:Lane'\n  ];\n\n  this.executed([ 'shape.move', 'shape.create', 'shape.resize' ], function(event) {\n    var shape = event.context.shape,\n        bo = getBusinessObject(shape),\n        di = getDi(shape);\n\n    if (isAny(bo, elementTypesToUpdate)) {\n      var isHorizontal = di.get('isHorizontal');\n\n      if (isHorizontal === undefined) {\n        isHorizontal = true;\n      }\n\n      // set attribute directly to avoid modeling#updateProperty side effects\n      di.set('isHorizontal', isHorizontal);\n    }\n  });\n\n}\n\nIsHorizontalFix.$inject = [ 'eventBus' ];\n\ninherits(IsHorizontalFix, CommandInterceptor);\n"
  },
  {
    "path": "lib/features/modeling/behavior/LabelBehavior.js",
    "content": "import {\n  assign\n} from 'min-dash';\n\nimport inherits from 'inherits-browser';\n\nimport {\n  is,\n  getBusinessObject\n} from '../../../util/ModelUtil';\n\nimport {\n  isLabelExternal,\n  getLabel,\n  hasExternalLabel,\n  isLabel\n} from '../../../util/LabelUtil';\n\nimport {\n  getLabelAdjustment\n} from './util/LabelLayoutUtil';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport {\n  getNewAttachPoint\n} from 'diagram-js/lib/util/AttachUtil';\n\nimport {\n  getMid,\n  roundPoint\n} from 'diagram-js/lib/layout/LayoutUtil';\n\nimport {\n  delta\n} from 'diagram-js/lib/util/PositionUtil';\n\nimport {\n  sortBy\n} from 'min-dash';\n\nimport {\n  getDistancePointLine,\n  perpendicularFoot\n} from './util/GeometricUtil';\n\nvar NAME_PROPERTY = 'name';\nvar TEXT_PROPERTY = 'text';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../Modeling').default} Modeling\n * @typedef {import('../BpmnFactory').default} BpmnFactory\n * @typedef {import('../../../draw/TextRenderer').default} TextRenderer\n *\n * @typedef {import('diagram-js/lib/util/Types').Point} Point\n * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n *\n * @typedef {Point[]} Line\n */\n\n/**\n * A component that makes sure that external labels are added\n * together with respective elements and properly updated (DI wise)\n * during move.\n *\n * @param {EventBus} eventBus\n * @param {Modeling} modeling\n * @param {BpmnFactory} bpmnFactory\n * @param {TextRenderer} textRenderer\n */\nexport default function LabelBehavior(\n    eventBus, modeling, bpmnFactory,\n    textRenderer) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  // update label if name property was updated\n  this.postExecute('element.updateProperties', onPropertyUpdate);\n  this.postExecute('element.updateModdleProperties', e => {\n    const elementBo = getBusinessObject(e.context.element);\n\n    if (elementBo === e.context.moddleElement) {\n      onPropertyUpdate(e);\n    }\n  });\n\n  function onPropertyUpdate(e) {\n    var context = e.context,\n        element = context.element,\n        properties = context.properties;\n\n    if (NAME_PROPERTY in properties) {\n      modeling.updateLabel(element, properties[NAME_PROPERTY]);\n    }\n\n    if (TEXT_PROPERTY in properties\n        && is(element, 'bpmn:TextAnnotation')) {\n\n      var newBounds = textRenderer.getTextAnnotationBounds(\n        {\n          x: element.x,\n          y: element.y,\n          width: element.width,\n          height: element.height\n        },\n        properties[TEXT_PROPERTY] || ''\n      );\n\n      modeling.updateLabel(element, properties.text, newBounds);\n    }\n  }\n\n  // create label shape after shape/connection was created\n  this.postExecute([ 'shape.create', 'connection.create' ], function(e) {\n    var context = e.context,\n        hints = context.hints || {};\n\n    if (hints.createElementsBehavior === false) {\n      return;\n    }\n\n    var element = context.shape || context.connection;\n\n    if (isLabel(element) || !isLabelExternal(element)) {\n      return;\n    }\n\n    // only create label if attribute available\n    if (!getLabel(element)) {\n      return;\n    }\n\n    modeling.updateLabel(element, getLabel(element));\n  });\n\n  // update label after label shape was deleted\n  this.postExecute('shape.delete', function(event) {\n    var context = event.context,\n        labelTarget = context.labelTarget,\n        hints = context.hints || {};\n\n    // check if label\n    if (labelTarget && hints.unsetLabel !== false) {\n      modeling.updateLabel(labelTarget, null, null, { removeShape: false });\n    }\n  });\n\n  function getVisibleLabelAdjustment(event) {\n\n    var context = event.context,\n        connection = context.connection,\n        label = connection.label,\n        hints = assign({}, context.hints),\n        newWaypoints = context.newWaypoints || connection.waypoints,\n        oldWaypoints = context.oldWaypoints;\n\n\n    if (typeof hints.startChanged === 'undefined') {\n      hints.startChanged = !!hints.connectionStart;\n    }\n\n    if (typeof hints.endChanged === 'undefined') {\n      hints.endChanged = !!hints.connectionEnd;\n    }\n\n    return getLabelAdjustment(label, newWaypoints, oldWaypoints, hints);\n  }\n\n  this.postExecute([\n    'connection.layout',\n    'connection.updateWaypoints'\n  ], function(event) {\n    var context = event.context,\n        hints = context.hints || {};\n\n    if (hints.labelBehavior === false) {\n      return;\n    }\n\n    var connection = context.connection,\n        label = connection.label,\n        labelAdjustment;\n\n    // handle missing label as well as the case\n    // that the label parent does not exist (yet),\n    // because it is being pasted / created via multi element create\n    //\n    // Cf. https://github.com/bpmn-io/bpmn-js/pull/1227\n    if (!label || !label.parent) {\n      return;\n    }\n\n    labelAdjustment = getVisibleLabelAdjustment(event);\n\n    modeling.moveShape(label, labelAdjustment);\n  });\n\n\n  // keep label position on shape replace\n  this.postExecute([ 'shape.replace' ], function(event) {\n    var context = event.context,\n        newShape = context.newShape,\n        oldShape = context.oldShape;\n\n    var businessObject = getBusinessObject(newShape);\n\n    if (businessObject\n      && isLabelExternal(businessObject)\n      && oldShape.label\n      && newShape.label) {\n      newShape.label.x = oldShape.label.x;\n      newShape.label.y = oldShape.label.y;\n    }\n  });\n\n\n  // move external label after resizing\n  this.postExecute('shape.resize', function(event) {\n\n    var context = event.context,\n        shape = context.shape,\n        newBounds = context.newBounds,\n        oldBounds = context.oldBounds;\n\n    if (hasExternalLabel(shape)) {\n\n      var label = shape.label,\n          labelMid = getMid(label),\n          edges = asEdges(oldBounds);\n\n      // get nearest border point to label as reference point\n      var referencePoint = getReferencePoint(labelMid, edges);\n\n      var delta = getReferencePointDelta(referencePoint, oldBounds, newBounds);\n\n      modeling.moveShape(label, delta);\n\n    }\n\n  });\n\n}\n\ninherits(LabelBehavior, CommandInterceptor);\n\nLabelBehavior.$inject = [\n  'eventBus',\n  'modeling',\n  'bpmnFactory',\n  'textRenderer'\n];\n\n// helpers //////////////////////\n\n/**\n * Calculates a reference point delta relative to a new position\n * of a certain element's bounds\n *\n * @param {Point} referencePoint\n * @param {Rect} oldBounds\n * @param {Rect} newBounds\n *\n * @return {Point}\n */\nexport function getReferencePointDelta(referencePoint, oldBounds, newBounds) {\n\n  var newReferencePoint = getNewAttachPoint(referencePoint, oldBounds, newBounds);\n\n  return roundPoint(delta(newReferencePoint, referencePoint));\n}\n\n/**\n * Generates the nearest point (reference point) for a given point\n * onto given set of lines\n *\n * @param {Point} point\n * @param {Line[]} lines\n *\n * @return {Point}\n */\nexport function getReferencePoint(point, lines) {\n\n  if (!lines.length) {\n    return;\n  }\n\n  var nearestLine = getNearestLine(point, lines);\n\n  return perpendicularFoot(point, nearestLine);\n}\n\n/**\n * Convert the given bounds to a lines array containing all edges\n *\n * @param {Rect|Point} bounds\n *\n * @return {Line[]}\n */\nexport function asEdges(bounds) {\n  return [\n    [ // top\n      {\n        x: bounds.x,\n        y: bounds.y\n      },\n      {\n        x: bounds.x + (bounds.width || 0),\n        y: bounds.y\n      }\n    ],\n    [ // right\n      {\n        x: bounds.x + (bounds.width || 0),\n        y: bounds.y\n      },\n      {\n        x: bounds.x + (bounds.width || 0),\n        y: bounds.y + (bounds.height || 0)\n      }\n    ],\n    [ // bottom\n      {\n        x: bounds.x,\n        y: bounds.y + (bounds.height || 0)\n      },\n      {\n        x: bounds.x + (bounds.width || 0),\n        y: bounds.y + (bounds.height || 0)\n      }\n    ],\n    [ // left\n      {\n        x: bounds.x,\n        y: bounds.y\n      },\n      {\n        x: bounds.x,\n        y: bounds.y + (bounds.height || 0)\n      }\n    ]\n  ];\n}\n\n/**\n * Returns the nearest line for a given point by distance\n * @param {Point} point\n * @param {Line[]} lines\n *\n * @return {Line}\n */\nfunction getNearestLine(point, lines) {\n\n  var distances = lines.map(function(l) {\n    return {\n      line: l,\n      distance: getDistancePointLine(point, l)\n    };\n  });\n\n  var sorted = sortBy(distances, 'distance');\n\n  return sorted[0].line;\n}\n"
  },
  {
    "path": "lib/features/modeling/behavior/LayoutConnectionBehavior.js",
    "content": "import {\n  assign\n} from 'min-dash';\n\nimport inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport { getConnectionAdjustment as getConnectionAnchorPoint } from './util/ConnectionLayoutUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../Modeling').default} Modeling\n */\n\n/**\n * A component that makes sure that Associations connected to Connections\n * are updated together with the Connection.\n *\n * @param {EventBus} eventBus\n * @param {Modeling} modeling\n */\nexport default function LayoutConnectionBehavior(eventBus, modeling) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  function getnewAnchorPoint(event, point) {\n\n    var context = event.context,\n        connection = context.connection,\n        hints = assign({}, context.hints),\n        newWaypoints = context.newWaypoints || connection.waypoints,\n        oldWaypoints = context.oldWaypoints;\n\n\n    if (typeof hints.startChanged === 'undefined') {\n      hints.startChanged = !!hints.connectionStart;\n    }\n\n    if (typeof hints.endChanged === 'undefined') {\n      hints.endChanged = !!hints.connectionEnd;\n    }\n\n    return getConnectionAnchorPoint(point, newWaypoints, oldWaypoints, hints);\n  }\n\n  this.postExecute([\n    'connection.layout',\n    'connection.updateWaypoints'\n  ], function(event) {\n    var context = event.context;\n\n    var connection = context.connection,\n        outgoing = connection.outgoing,\n        incoming = connection.incoming;\n\n    incoming.forEach(function(connection) {\n      var endPoint = connection.waypoints[connection.waypoints.length - 1];\n      var newEndpoint = getnewAnchorPoint(event, endPoint);\n\n      var newWaypoints = [].concat(connection.waypoints.slice(0, -1), [ newEndpoint ]);\n\n      modeling.updateWaypoints(connection, newWaypoints);\n    });\n\n    outgoing.forEach(function(connection) {\n      var startpoint = connection.waypoints[0];\n      var newStartpoint = getnewAnchorPoint(event, startpoint);\n\n      var newWaypoints = [].concat([ newStartpoint ], connection.waypoints.slice(1));\n\n      modeling.updateWaypoints(connection, newWaypoints);\n    });\n\n  });\n\n\n  this.postExecute([\n    'connection.move'\n  ], function(event) {\n    var context = event.context;\n\n    var connection = context.connection,\n        outgoing = connection.outgoing,\n        incoming = connection.incoming,\n        delta = context.delta;\n\n    incoming.forEach(function(connection) {\n      var endPoint = connection.waypoints[connection.waypoints.length - 1];\n      var newEndpoint = {\n        x: endPoint.x + delta.x,\n        y: endPoint.y + delta.y\n      };\n\n      var newWaypoints = [].concat(connection.waypoints.slice(0, -1), [ newEndpoint ]);\n\n      modeling.updateWaypoints(connection, newWaypoints);\n    });\n\n    outgoing.forEach(function(connection) {\n      var startpoint = connection.waypoints[0];\n      var newStartpoint = {\n        x: startpoint.x + delta.x,\n        y: startpoint.y + delta.y\n      };\n\n      var newWaypoints = [].concat([ newStartpoint ], connection.waypoints.slice(1));\n\n      modeling.updateWaypoints(connection, newWaypoints);\n    });\n\n  });\n\n}\n\ninherits(LayoutConnectionBehavior, CommandInterceptor);\n\nLayoutConnectionBehavior.$inject = [\n  'eventBus',\n  'modeling'\n];\n"
  },
  {
    "path": "lib/features/modeling/behavior/MessageFlowBehavior.js",
    "content": "import inherits from 'inherits-browser';\r\n\r\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\r\n\r\nimport { is } from '../../../util/ModelUtil';\r\n\r\nimport { isExpanded } from '../../../util/DiUtil';\r\n\r\nimport { selfAndAllChildren } from 'diagram-js/lib/util/Elements';\r\n\r\nimport {\r\n  getResizedSourceAnchor,\r\n  getResizedTargetAnchor\r\n} from 'diagram-js/lib/features/modeling/cmd/helper/AnchorsHelper';\r\n\r\n/**\r\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n * @typedef {import('../Modeling').default} Modeling\r\n */\r\n\r\n/**\r\n * BPMN-specific message flow behavior.\r\n *\r\n * @param {EventBus} eventBus\r\n * @param {Modeling} modeling\r\n */\r\nexport default function MessageFlowBehavior(eventBus, modeling) {\r\n\r\n  CommandInterceptor.call(this, eventBus);\r\n\r\n  this.postExecute('shape.replace', function(context) {\r\n    var oldShape = context.oldShape,\r\n        newShape = context.newShape;\r\n\r\n    if (!isParticipantCollapse(oldShape, newShape)) {\r\n      return;\r\n    }\r\n\r\n    var messageFlows = getMessageFlows(oldShape);\r\n\r\n    messageFlows.incoming.forEach(function(incoming) {\r\n      var anchor = getResizedTargetAnchor(incoming, newShape, oldShape);\r\n\r\n      modeling.reconnectEnd(incoming, newShape, anchor);\r\n    });\r\n\r\n    messageFlows.outgoing.forEach(function(outgoing) {\r\n      var anchor = getResizedSourceAnchor(outgoing, newShape, oldShape);\r\n\r\n      modeling.reconnectStart(outgoing, newShape, anchor);\r\n    });\r\n  }, true);\r\n\r\n}\r\n\r\nMessageFlowBehavior.$inject = [ 'eventBus', 'modeling' ];\r\n\r\ninherits(MessageFlowBehavior, CommandInterceptor);\r\n\r\n// helpers //////////\r\n\r\nfunction isParticipantCollapse(oldShape, newShape) {\r\n  return is(oldShape, 'bpmn:Participant')\r\n    && isExpanded(oldShape)\r\n    && is(newShape, 'bpmn:Participant')\r\n    && !isExpanded(newShape);\r\n}\r\n\r\nfunction getMessageFlows(parent) {\r\n  var elements = selfAndAllChildren([ parent ], false);\r\n\r\n  var incoming = [],\r\n      outgoing = [];\r\n\r\n  elements.forEach(function(element) {\r\n    if (element === parent) {\r\n      return;\r\n    }\r\n\r\n    element.incoming.forEach(function(connection) {\r\n      if (is(connection, 'bpmn:MessageFlow')) {\r\n        incoming.push(connection);\r\n      }\r\n    });\r\n\r\n    element.outgoing.forEach(function(connection) {\r\n      if (is(connection, 'bpmn:MessageFlow')) {\r\n        outgoing.push(connection);\r\n      }\r\n    });\r\n  }, []);\r\n\r\n  return {\r\n    incoming: incoming,\r\n    outgoing: outgoing\r\n  };\r\n}"
  },
  {
    "path": "lib/features/modeling/behavior/NonInterruptingBehavior.js",
    "content": "import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\nimport inherits from 'inherits-browser';\n\nimport { canBeNonInterrupting, getInterruptingProperty } from './util/NonInterruptingUtil';\nimport { getBusinessObject } from '../../../util/ModelUtil';\n\nexport default function NonInterruptingBehavior(injector, modeling) {\n  injector.invoke(CommandInterceptor, this);\n\n  this.postExecuted('shape.replace', function(event) {\n    const oldShape = event.context.oldShape;\n    const newShape = event.context.newShape;\n    const hints = event.context.hints;\n\n    if (!canBeNonInterrupting(newShape)) {\n      return;\n    }\n\n    const property = getInterruptingProperty(newShape);\n    const isExplicitChange = hints.targetElement && hints.targetElement[property] !== undefined;\n\n    if (isExplicitChange) {\n      return;\n    }\n\n    const isOldInterrupting = getBusinessObject(oldShape).get(property);\n    const isNewInterruptingDefault = getBusinessObject(newShape).get(property);\n\n    if (isOldInterrupting === isNewInterruptingDefault) {\n      return;\n    }\n\n    modeling.updateProperties(newShape, {\n      [property]: isOldInterrupting\n    });\n  });\n}\n\nNonInterruptingBehavior.$inject = [ 'injector', 'modeling' ];\n\ninherits(NonInterruptingBehavior, CommandInterceptor);\n"
  },
  {
    "path": "lib/features/modeling/behavior/RemoveElementBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport { is } from '../../../util/ModelUtil';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport lineIntersect from './util/LineIntersect';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../../rules/BpmnRules').default} BpmnRules\n * @typedef {import('../Modeling').default} Modeling\n */\n\n/**\n * @param {EventBus} eventBus\n * @param {BpmnRules} bpmnRules\n * @param {Modeling} modeling\n */\nexport default function RemoveElementBehavior(eventBus, bpmnRules, modeling) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  /**\n   * Combine sequence flows when deleting an element\n   * if there is one incoming and one outgoing\n   * sequence flow\n   */\n  this.preExecute('shape.delete', function(e) {\n\n    var shape = e.context.shape;\n\n    // only handle [a] -> [shape] -> [b] patterns\n    if (shape.incoming.length !== 1 || shape.outgoing.length !== 1) {\n      return;\n    }\n\n    var inConnection = shape.incoming[0],\n        outConnection = shape.outgoing[0];\n\n    // only handle sequence flows\n    if (!is(inConnection, 'bpmn:SequenceFlow') || !is(outConnection, 'bpmn:SequenceFlow')) {\n      return;\n    }\n\n    if (bpmnRules.canConnect(inConnection.source, outConnection.target, inConnection)) {\n\n      // compute new, combined waypoints\n      var newWaypoints = getNewWaypoints(inConnection.waypoints, outConnection.waypoints);\n\n      modeling.reconnectEnd(inConnection, outConnection.target, newWaypoints);\n    }\n  });\n\n}\n\ninherits(RemoveElementBehavior, CommandInterceptor);\n\nRemoveElementBehavior.$inject = [\n  'eventBus',\n  'bpmnRules',\n  'modeling'\n];\n\n\n// helpers //////////////////////\n\nfunction getDocking(point) {\n  return point.original || point;\n}\n\n\nfunction getNewWaypoints(inWaypoints, outWaypoints) {\n\n  var intersection = lineIntersect(\n    getDocking(inWaypoints[inWaypoints.length - 2]),\n    getDocking(inWaypoints[inWaypoints.length - 1]),\n    getDocking(outWaypoints[1]),\n    getDocking(outWaypoints[0]));\n\n  if (intersection) {\n    return [].concat(\n      inWaypoints.slice(0, inWaypoints.length - 1),\n      [ intersection ],\n      outWaypoints.slice(1));\n  } else {\n    return [\n      getDocking(inWaypoints[0]),\n      getDocking(outWaypoints[outWaypoints.length - 1])\n    ];\n  }\n}"
  },
  {
    "path": "lib/features/modeling/behavior/RemoveEmbeddedLabelBoundsBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport { getDi } from '../../../util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../Modeling').default} Modeling\n */\n\n/**\n * BPMN specific behavior ensuring that bpmndi:Label's dc:Bounds are removed\n * when shape is resized.\n *\n * @param {EventBus} eventBus\n * @param {Modeling} modeling\n */\nexport default function RemoveEmbeddedLabelBoundsBehavior(eventBus, modeling) {\n  CommandInterceptor.call(this, eventBus);\n\n  this.preExecute('shape.resize', function(context) {\n    var shape = context.shape;\n\n    var di = getDi(shape),\n        label = di && di.get('label'),\n        bounds = label && label.get('bounds');\n\n    if (bounds) {\n      modeling.updateModdleProperties(shape, label, {\n        bounds: undefined\n      });\n    }\n  }, true);\n}\n\ninherits(RemoveEmbeddedLabelBoundsBehavior, CommandInterceptor);\n\nRemoveEmbeddedLabelBoundsBehavior.$inject = [\n  'eventBus',\n  'modeling'\n];"
  },
  {
    "path": "lib/features/modeling/behavior/RemoveParticipantBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport { is } from '../../../util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../Modeling').default} Modeling\n */\n\n/**\n * BPMN specific remove behavior.\n *\n * @param {EventBus} eventBus\n * @param {Modeling} modeling\n */\nexport default function RemoveParticipantBehavior(eventBus, modeling) {\n\n  CommandInterceptor.call(this, eventBus);\n\n\n  /**\n   * morph collaboration diagram into process diagram\n   * after the last participant has been removed\n   */\n\n  this.preExecute('shape.delete', function(context) {\n\n    var shape = context.shape,\n        parent = shape.parent;\n\n    // activate the behavior if the shape to be removed\n    // is a participant\n    if (is(shape, 'bpmn:Participant')) {\n      context.collaborationRoot = parent;\n    }\n  }, true);\n\n  this.postExecute('shape.delete', function(context) {\n\n    var collaborationRoot = context.collaborationRoot;\n\n    if (collaborationRoot && !collaborationRoot.businessObject.participants.length) {\n\n      // replace empty collaboration with process diagram\n      var process = modeling.makeProcess();\n\n      // move all root elements from collaboration to process\n      var children = collaborationRoot.children.slice();\n\n      modeling.moveElements(children, { x: 0, y: 0 }, process);\n    }\n  }, true);\n\n}\n\nRemoveParticipantBehavior.$inject = [ 'eventBus', 'modeling' ];\n\ninherits(RemoveParticipantBehavior, CommandInterceptor);"
  },
  {
    "path": "lib/features/modeling/behavior/ReplaceConnectionBehavior.js",
    "content": "import {\n  forEach,\n  find,\n  matchPattern\n} from 'min-dash';\n\nimport inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport { is } from '../../../util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../Modeling').default} Modeling\n * @typedef {import('../../rules/BpmnRules').default} BpmnRules\n * @typedef {import('didi').Injector} Injector\n */\n\n/**\n * @param {EventBus} eventBus\n * @param {Modeling} modeling\n * @param {BpmnRules} bpmnRules\n * @param {Injector} injector\n */\nexport default function ReplaceConnectionBehavior(eventBus, modeling, bpmnRules, injector) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  var dragging = injector.get('dragging', false);\n\n  function fixConnection(connection) {\n\n    var source = connection.source,\n        target = connection.target,\n        parent = connection.parent;\n\n    // do not do anything if connection\n    // is already deleted (may happen due to other\n    // behaviors plugged-in before)\n    if (!parent) {\n      return;\n    }\n\n    var replacementType,\n        remove;\n\n    /**\n     * Check if incoming or outgoing connections\n     * can stay or could be substituted with an\n     * appropriate replacement.\n     *\n     * This holds true for SequenceFlow <> MessageFlow.\n     */\n\n    if (is(connection, 'bpmn:SequenceFlow')) {\n      if (!bpmnRules.canConnectSequenceFlow(source, target)) {\n        remove = true;\n      }\n\n      if (bpmnRules.canConnectMessageFlow(source, target)) {\n        replacementType = 'bpmn:MessageFlow';\n      }\n    }\n\n    // transform message flows into sequence flows, if possible\n\n    if (is(connection, 'bpmn:MessageFlow')) {\n\n      if (!bpmnRules.canConnectMessageFlow(source, target)) {\n        remove = true;\n      }\n\n      if (bpmnRules.canConnectSequenceFlow(source, target)) {\n        replacementType = 'bpmn:SequenceFlow';\n      }\n    }\n\n    // remove invalid connection,\n    // unless it has been removed already\n    if (remove) {\n      modeling.removeConnection(connection);\n    }\n\n    // replace SequenceFlow <> MessageFlow\n\n    if (replacementType) {\n      modeling.connect(source, target, {\n        type: replacementType,\n        waypoints: connection.waypoints.slice()\n      });\n    }\n  }\n\n  function replaceReconnectedConnection(event) {\n\n    var context = event.context,\n        connection = context.connection,\n        source = context.newSource || connection.source,\n        target = context.newTarget || connection.target,\n        allowed,\n        replacement;\n\n    allowed = bpmnRules.canConnect(source, target);\n\n    if (!allowed || allowed.type === connection.type) {\n      return;\n    }\n\n    replacement = modeling.connect(source, target, {\n      type: allowed.type,\n      associationDirection: allowed.associationDirection,\n      waypoints: connection.waypoints.slice()\n    });\n\n    // remove old connection unless it's already removed\n    if (connection.parent) {\n      modeling.removeConnection(connection);\n    }\n\n    // replace connection in context to reconnect end/start\n    context.connection = replacement;\n\n    if (dragging) {\n      cleanDraggingSelection(connection, replacement);\n    }\n  }\n\n  // monkey-patch selection saved in dragging in order to re-select it when operation is finished\n  function cleanDraggingSelection(oldConnection, newConnection) {\n    var context = dragging.context(),\n        previousSelection = context && context.payload.previousSelection,\n        index;\n\n    // do nothing if not dragging or no selection was present\n    if (!previousSelection || !previousSelection.length) {\n      return;\n    }\n\n    index = previousSelection.indexOf(oldConnection);\n\n    if (index === -1) {\n      return;\n    }\n\n    previousSelection.splice(index, 1, newConnection);\n  }\n\n  // lifecycle hooks\n\n  this.postExecuted('elements.move', function(context) {\n\n    var closure = context.closure,\n        allConnections = closure.allConnections;\n\n    forEach(allConnections, fixConnection);\n  }, true);\n\n  this.preExecute('connection.reconnect', replaceReconnectedConnection);\n\n  this.postExecuted('element.updateProperties', function(event) {\n    var context = event.context,\n        properties = context.properties,\n        element = context.element,\n        businessObject = element.businessObject,\n        connection;\n\n    // remove condition on change to default\n    if (properties.default) {\n      connection = find(\n        element.outgoing,\n        matchPattern({ id: element.businessObject.default.id })\n      );\n\n      if (connection) {\n        modeling.updateProperties(connection, { conditionExpression: undefined });\n      }\n    }\n\n    // remove default from source on change to conditional\n    if (properties.conditionExpression && businessObject.sourceRef.default === businessObject) {\n      modeling.updateProperties(element.source, { default: undefined });\n    }\n  });\n}\n\ninherits(ReplaceConnectionBehavior, CommandInterceptor);\n\nReplaceConnectionBehavior.$inject = [\n  'eventBus',\n  'modeling',\n  'bpmnRules',\n  'injector'\n];\n"
  },
  {
    "path": "lib/features/modeling/behavior/ReplaceElementBehaviour.js",
    "content": "import inherits from 'inherits-browser';\n\nimport { forEach, reduce } from 'min-dash';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport { isEventSubProcess } from '../../../util/DiUtil';\n\n/**\n * @typedef {import('../../replace/BpmnReplace').default} BpmnReplace\n * @typedef {import('../../rules/BpmnRules').default} BpmnRules\n * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n * @typedef {import('didi').Injector} Injector\n * @typedef {import('../Modeling').default} Modeling\n * @typedef {import('diagram-js/lib/features/selection/Selection').default} Selection\n */\n\n/**\n * BPMN-specific replace behavior.\n *\n * @param {BpmnReplace} bpmnReplace\n * @param {BpmnRules} bpmnRules\n * @param {ElementRegistry} elementRegistry\n * @param {Injector} injector\n * @param {Modeling} modeling\n * @param {Selection} selection\n */\nexport default function ReplaceElementBehaviour(\n    bpmnReplace,\n    bpmnRules,\n    elementRegistry,\n    injector,\n    modeling,\n    selection\n) {\n  injector.invoke(CommandInterceptor, this);\n\n  this._bpmnReplace = bpmnReplace;\n  this._elementRegistry = elementRegistry;\n  this._selection = selection;\n\n  // replace elements on create, e.g. during copy-paste\n  this.postExecuted([ 'elements.create' ], 500, function(event) {\n    var context = event.context,\n        target = context.parent,\n        elements = context.elements;\n\n    var elementReplacements = reduce(elements, function(replacements, element) {\n      var canReplace = bpmnRules.canReplace([ element ], element.host || element.parent || target);\n\n      return canReplace ? replacements.concat(canReplace.replacements) : replacements;\n    }, []);\n\n    if (elementReplacements.length) {\n      this._replaceElements(elements, elementReplacements);\n    }\n  }, this);\n\n  // replace elements on move\n  this.postExecuted([ 'elements.move' ], 500, function(event) {\n    var context = event.context,\n        target = context.newParent,\n        newHost = context.newHost,\n        elements = [];\n\n    forEach(context.closure.topLevel, function(topLevelElements) {\n      if (isEventSubProcess(topLevelElements)) {\n        elements = elements.concat(topLevelElements.children);\n      } else {\n        elements = elements.concat(topLevelElements);\n      }\n    });\n\n    // set target to host if attaching\n    if (elements.length === 1 && newHost) {\n      target = newHost;\n    }\n\n    var canReplace = bpmnRules.canReplace(elements, target);\n\n    if (canReplace) {\n      this._replaceElements(elements, canReplace.replacements, newHost);\n    }\n  }, this);\n\n  // update attachments on host replace\n  this.postExecute([ 'shape.replace' ], 1500, function(e) {\n    var context = e.context,\n        oldShape = context.oldShape,\n        newShape = context.newShape,\n        attachers = oldShape.attachers,\n        canReplace;\n\n    if (attachers && attachers.length) {\n      canReplace = bpmnRules.canReplace(attachers, newShape);\n\n      this._replaceElements(attachers, canReplace.replacements);\n    }\n\n  }, this);\n\n  // keep ID on shape replace\n  this.postExecuted([ 'shape.replace' ], 1500, function(e) {\n    var context = e.context,\n        oldShape = context.oldShape,\n        newShape = context.newShape;\n\n    modeling.unclaimId(oldShape.businessObject.id, oldShape.businessObject);\n    modeling.updateProperties(newShape, { id: oldShape.id });\n  });\n}\n\ninherits(ReplaceElementBehaviour, CommandInterceptor);\n\nReplaceElementBehaviour.prototype._replaceElements = function(elements, newElements) {\n  var elementRegistry = this._elementRegistry,\n      bpmnReplace = this._bpmnReplace,\n      selection = this._selection;\n\n  forEach(newElements, function(replacement) {\n    var newElement = {\n      type: replacement.newElementType\n    };\n\n    var oldElement = elementRegistry.get(replacement.oldElementId);\n\n    var idx = elements.indexOf(oldElement);\n\n    elements[idx] = bpmnReplace.replaceElement(oldElement, newElement, { select: false });\n  });\n\n  if (newElements) {\n    selection.select(elements);\n  }\n};\n\nReplaceElementBehaviour.$inject = [\n  'bpmnReplace',\n  'bpmnRules',\n  'elementRegistry',\n  'injector',\n  'modeling',\n  'selection'\n];\n"
  },
  {
    "path": "lib/features/modeling/behavior/ResizeBehavior.js",
    "content": "import { is } from '../../../util/ModelUtil';\n\nimport {\n  isExpanded,\n  isHorizontal\n} from '../../../util/DiUtil';\n\nimport {\n  asTRBL\n} from 'diagram-js/lib/layout/LayoutUtil';\n\nimport {\n  collectLanes,\n  getLanesRoot\n} from '../util/LaneUtil';\n\nvar HIGH_PRIORITY = 1500;\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n *\n * @typedef {import('../../../model/Types').Shape} Shape\n *\n * @typedef {import('diagram-js/lib/util/Types').Dimensions} Dimensions\n * @typedef {import('diagram-js/lib/util/Types').Direction} Direction\n * @typedef {import('diagram-js/lib/util/Types').RectTRBL} RectTRBL\n */\n\n/**\n * @type {Dimensions}\n */\nexport var GROUP_MIN_DIMENSIONS = { width: 140, height: 120 };\n\n/**\n * @type {Dimensions}\n */\nexport var LANE_MIN_DIMENSIONS = { width: 300, height: 60 };\n\n/**\n * @type {Dimensions}\n */\nexport var VERTICAL_LANE_MIN_DIMENSIONS = { width: 60, height: 300 };\n\n/**\n * @type {Dimensions}\n */\nexport var PARTICIPANT_MIN_DIMENSIONS = { width: 300, height: 150 };\n\n/**\n * @type {Dimensions}\n */\nexport var VERTICAL_PARTICIPANT_MIN_DIMENSIONS = { width: 150, height: 300 };\n\n/**\n * @type {Dimensions}\n */\nexport var SUB_PROCESS_MIN_DIMENSIONS = { width: 140, height: 120 };\n\n/**\n * @type {Dimensions}\n */\nexport var TEXT_ANNOTATION_MIN_DIMENSIONS = { width: 50, height: 30 };\n\n/**\n * Set minimum bounds/resize constraints on resize.\n *\n * @param {EventBus} eventBus\n */\nexport default function ResizeBehavior(eventBus) {\n  eventBus.on('resize.start', HIGH_PRIORITY, function(event) {\n    var context = event.context,\n        shape = context.shape,\n        direction = context.direction,\n        balanced = context.balanced;\n\n    if (is(shape, 'bpmn:Lane') || is(shape, 'bpmn:Participant')) {\n      context.resizeConstraints = getParticipantResizeConstraints(shape, direction, balanced);\n    }\n\n    if (is(shape, 'bpmn:SubProcess') && isExpanded(shape)) {\n      context.minDimensions = SUB_PROCESS_MIN_DIMENSIONS;\n    }\n\n    if (is(shape, 'bpmn:TextAnnotation')) {\n      context.minDimensions = TEXT_ANNOTATION_MIN_DIMENSIONS;\n    }\n  });\n}\n\nResizeBehavior.$inject = [ 'eventBus' ];\n\n\nvar abs = Math.abs,\n    min = Math.min,\n    max = Math.max;\n\n\nfunction addToTrbl(trbl, attr, value, choice) {\n  var current = trbl[attr];\n\n  // make sure to set the value if it does not exist\n  // or apply the correct value by comparing against\n  // choice(value, currentValue)\n  trbl[attr] = current === undefined ? value : choice(value, current);\n}\n\nfunction addMin(trbl, attr, value) {\n  return addToTrbl(trbl, attr, value, min);\n}\n\nfunction addMax(trbl, attr, value) {\n  return addToTrbl(trbl, attr, value, max);\n}\n\nvar LANE_PADDING = { top: 20, left: 50, right: 20, bottom: 20 },\n    VERTICAL_LANE_PADDING = { top: 50, left: 20, right: 20, bottom: 20 };\n\n/**\n * @param {Shape} laneShape\n * @param {Direction} resizeDirection\n * @param {boolean} [balanced=false]\n *\n * @return { {\n *   min: RectTRBL;\n *   max: RectTRBL;\n * } }\n */\nexport function getParticipantResizeConstraints(laneShape, resizeDirection, balanced) {\n  var lanesRoot = getLanesRoot(laneShape);\n\n  var isFirst = true,\n      isLast = true;\n\n  var allLanes = collectLanes(lanesRoot, [ lanesRoot ]);\n\n  var laneTrbl = asTRBL(laneShape);\n\n  var maxTrbl = {},\n      minTrbl = {};\n\n  var isHorizontalLane = isHorizontal(laneShape);\n\n  var minDimensions = isHorizontalLane ? LANE_MIN_DIMENSIONS : VERTICAL_LANE_MIN_DIMENSIONS;\n\n  if (/n/.test(resizeDirection)) {\n    minTrbl.top = laneTrbl.bottom - minDimensions.height;\n  } else if (/e/.test(resizeDirection)) {\n    minTrbl.right = laneTrbl.left + minDimensions.width;\n  } else if (/s/.test(resizeDirection)) {\n    minTrbl.bottom = laneTrbl.top + minDimensions.height;\n  } else if (/w/.test(resizeDirection)) {\n    minTrbl.left = laneTrbl.right - minDimensions.width;\n  }\n\n  // min/max size based on related lanes\n  allLanes.forEach(function(other) {\n\n    var otherTrbl = asTRBL(other);\n\n    // lane flags\n    if (isHorizontalLane) {\n      if (otherTrbl.top < (laneTrbl.top - 10)) {\n        isFirst = false;\n      }\n      if (otherTrbl.bottom > (laneTrbl.bottom + 10)) {\n        isLast = false;\n      }\n    }\n    else {\n      if (otherTrbl.left < (laneTrbl.left - 10)) {\n        isFirst = false;\n      }\n      if (otherTrbl.right > (laneTrbl.right + 10)) {\n        isLast = false;\n      }\n    }\n\n    if (/n/.test(resizeDirection)) {\n\n      // max top size (based on next element)\n      if (balanced && abs(laneTrbl.top - otherTrbl.bottom) < 10) {\n        addMax(maxTrbl, 'top', otherTrbl.top + minDimensions.height);\n      }\n\n      // min top size (based on self or nested element)\n      if (abs(laneTrbl.top - otherTrbl.top) < 5) {\n        addMin(minTrbl, 'top', otherTrbl.bottom - minDimensions.height);\n      }\n    }\n\n    if (/e/.test(resizeDirection)) {\n\n      // max right size (based on previous element)\n      if (balanced && abs(laneTrbl.right - otherTrbl.left) < 10) {\n        addMin(maxTrbl, 'right', otherTrbl.right - minDimensions.width);\n      }\n\n      // min right size (based on self or nested element)\n      if (abs(laneTrbl.right - otherTrbl.right) < 5) {\n        addMax(minTrbl, 'right', otherTrbl.left + minDimensions.width);\n      }\n    }\n\n    if (/s/.test(resizeDirection)) {\n\n      // max bottom size (based on previous element)\n      if (balanced && abs(laneTrbl.bottom - otherTrbl.top) < 10) {\n        addMin(maxTrbl, 'bottom', otherTrbl.bottom - minDimensions.height);\n      }\n\n      // min bottom size (based on self or nested element)\n      if (abs(laneTrbl.bottom - otherTrbl.bottom) < 5) {\n        addMax(minTrbl, 'bottom', otherTrbl.top + minDimensions.height);\n      }\n    }\n\n    if (/w/.test(resizeDirection)) {\n\n      // max left size (based on next element)\n      if (balanced && abs(laneTrbl.left - otherTrbl.right) < 10) {\n        addMax(maxTrbl, 'left', otherTrbl.left + minDimensions.width);\n      }\n\n      // min left size (based on self or nested element)\n      if (abs(laneTrbl.left - otherTrbl.left) < 5) {\n        addMin(minTrbl, 'left', otherTrbl.right - minDimensions.width);\n      }\n    }\n  });\n\n  // max top/bottom/left/right size based on flow nodes\n  var flowElements = lanesRoot.children.filter(function(s) {\n    return !s.hidden && !s.waypoints && (is(s, 'bpmn:FlowElement') || is(s, 'bpmn:Artifact'));\n  });\n\n  var padding = isHorizontalLane ? LANE_PADDING : VERTICAL_LANE_PADDING;\n\n  flowElements.forEach(function(flowElement) {\n\n    var flowElementTrbl = asTRBL(flowElement);\n\n    // vertical lane will resize from top with respect to flow element irrespective of first or last lane\n    if (/n/.test(resizeDirection) && (!isHorizontalLane || isFirst)) {\n      addMin(minTrbl, 'top', flowElementTrbl.top - padding.top);\n    }\n\n    // horizonal lane will resize from right with respect to flow element irrespective of first or last lane\n    if (/e/.test(resizeDirection) && (isHorizontalLane || isLast)) {\n      addMax(minTrbl, 'right', flowElementTrbl.right + padding.right);\n    }\n\n    // vertical lane will resize from bottom with respect to flow element irrespective of first or last lane\n    if (/s/.test(resizeDirection) && (!isHorizontalLane || isLast)) {\n      addMax(minTrbl, 'bottom', flowElementTrbl.bottom + padding.bottom);\n    }\n\n    // horizonal lane will resize from left with respect to flow element irrespective of first or last lane\n    if (/w/.test(resizeDirection) && (isHorizontalLane || isFirst)) {\n      addMin(minTrbl, 'left', flowElementTrbl.left - padding.left);\n    }\n  });\n  return {\n    min: minTrbl,\n    max: maxTrbl\n  };\n}"
  },
  {
    "path": "lib/features/modeling/behavior/ResizeLaneBehavior.js",
    "content": "import { is } from '../../../util/ModelUtil';\n\nimport {\n  roundBounds\n} from 'diagram-js/lib/layout/LayoutUtil';\n\nimport {\n  hasPrimaryModifier\n} from 'diagram-js/lib/util/Mouse';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../Modeling').default} Modeling\n */\n\nvar SLIGHTLY_HIGHER_PRIORITY = 1001;\n\n\n/**\n * Invoke {@link Modeling#resizeLane} instead of {@link Modeling#resizeShape}\n * when resizing a lane or participant shape.\n *\n * @param {EventBus} eventBus\n * @param {Modeling} modeling\n */\nexport default function ResizeLaneBehavior(eventBus, modeling) {\n\n  eventBus.on('resize.start', SLIGHTLY_HIGHER_PRIORITY + 500, function(event) {\n    var context = event.context,\n        shape = context.shape;\n\n    if (is(shape, 'bpmn:Lane') || is(shape, 'bpmn:Participant')) {\n\n      // should we resize the opposite lane(s) in\n      // order to compensate for the resize operation?\n      context.balanced = !hasPrimaryModifier(event);\n    }\n  });\n\n  /**\n   * Intercept resize end and call resize lane function instead.\n   */\n  eventBus.on('resize.end', SLIGHTLY_HIGHER_PRIORITY, function(event) {\n    var context = event.context,\n        shape = context.shape,\n        canExecute = context.canExecute,\n        newBounds = context.newBounds;\n\n    if (is(shape, 'bpmn:Lane') || is(shape, 'bpmn:Participant')) {\n\n      if (canExecute) {\n\n        // ensure we have actual pixel values for new bounds\n        // (important when zoom level was > 1 during move)\n        newBounds = roundBounds(newBounds);\n\n        // perform the actual resize\n        modeling.resizeLane(shape, newBounds, context.balanced);\n      }\n\n      // stop propagation\n      return false;\n    }\n  });\n}\n\nResizeLaneBehavior.$inject = [\n  'eventBus',\n  'modeling'\n];\n"
  },
  {
    "path": "lib/features/modeling/behavior/RootElementReferenceBehavior.js",
    "content": "import inherits from 'inherits-browser';\r\n\r\nimport {\r\n  find,\r\n  isArray,\r\n  matchPattern,\r\n  some\r\n} from 'min-dash';\r\n\r\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\r\n\r\nimport {\r\n  add as collectionAdd,\r\n  remove as collectionRemove\r\n} from 'diagram-js/lib/util/Collections';\r\n\r\nimport {\r\n  getBusinessObject,\r\n  is\r\n} from '../../../util/ModelUtil';\r\n\r\nimport { isAny } from '../util/ModelingUtil';\r\n\r\nimport { hasEventDefinition } from '../../../util/DiUtil';\r\n\r\n/**\r\n * @typedef {import('../../../Modeler').default} Modeler\r\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n * @typedef {import('didi').Injector} Injector\r\n * @typedef {import('../../copy-paste/ModdleCopy').default} ModdleCopy\r\n * @typedef {import('../BpmnFactory').default} BpmnFactory\r\n *\r\n * @typedef {import('../../../model/Types').Element} Element\r\n * @typedef {import('../../../model/Types').Shape} Shape\r\n *\r\n * @typedef {import('diagram-js/lib/util/Types').DirectionTRBL} DirectionTRBL\r\n */\r\n\r\nvar LOW_PRIORITY = 500;\r\n\r\n\r\n/**\r\n * Add referenced root elements (error, escalation, message, signal) if they don't exist.\r\n * Copy referenced root elements on copy & paste.\r\n *\r\n * @param {Modeler} bpmnjs\r\n * @param {EventBus} eventBus\r\n * @param {Injector} injector\r\n * @param {ModdleCopy} moddleCopy\r\n * @param {BpmnFactory} bpmnFactory\r\n */\r\nexport default function RootElementReferenceBehavior(\r\n    bpmnjs, eventBus, injector, moddleCopy, bpmnFactory\r\n) {\r\n  injector.invoke(CommandInterceptor, this);\r\n\r\n  function canHaveRootElementReference(element) {\r\n    return isAny(element, [ 'bpmn:ReceiveTask', 'bpmn:SendTask' ]) ||\r\n      hasAnyEventDefinition(element, [\r\n        'bpmn:ErrorEventDefinition',\r\n        'bpmn:EscalationEventDefinition',\r\n        'bpmn:MessageEventDefinition',\r\n        'bpmn:SignalEventDefinition'\r\n      ]);\r\n  }\r\n\r\n  function hasRootElement(rootElement) {\r\n    var definitions = bpmnjs.getDefinitions(),\r\n        rootElements = definitions.get('rootElements');\r\n\r\n    return !!find(rootElements, matchPattern({ id: rootElement.id }));\r\n  }\r\n\r\n  function getRootElementReferencePropertyName(eventDefinition) {\r\n    if (is(eventDefinition, 'bpmn:ErrorEventDefinition')) {\r\n      return 'errorRef';\r\n    } else if (is(eventDefinition, 'bpmn:EscalationEventDefinition')) {\r\n      return 'escalationRef';\r\n    } else if (is(eventDefinition, 'bpmn:MessageEventDefinition')) {\r\n      return 'messageRef';\r\n    } else if (is(eventDefinition, 'bpmn:SignalEventDefinition')) {\r\n      return 'signalRef';\r\n    }\r\n  }\r\n\r\n  function getRootElement(businessObject) {\r\n    if (isAny(businessObject, [ 'bpmn:ReceiveTask', 'bpmn:SendTask' ])) {\r\n      return businessObject.get('messageRef');\r\n    }\r\n\r\n    var eventDefinitions = businessObject.get('eventDefinitions'),\r\n        eventDefinition = eventDefinitions[ 0 ];\r\n\r\n    return eventDefinition.get(getRootElementReferencePropertyName(eventDefinition));\r\n  }\r\n\r\n  function setRootElement(businessObject, rootElement) {\r\n    if (isAny(businessObject, [ 'bpmn:ReceiveTask', 'bpmn:SendTask' ])) {\r\n      return businessObject.set('messageRef', rootElement);\r\n    }\r\n\r\n    var eventDefinitions = businessObject.get('eventDefinitions'),\r\n        eventDefinition = eventDefinitions[ 0 ];\r\n\r\n    return eventDefinition.set(getRootElementReferencePropertyName(eventDefinition), rootElement);\r\n  }\r\n\r\n  // create shape\r\n  this.executed([\r\n    'shape.create',\r\n    'element.updateProperties',\r\n    'element.updateModdleProperties'\r\n  ], function(context) {\r\n    var shape = context.shape || context.element;\r\n\r\n    if (!canHaveRootElementReference(shape)) {\r\n      return;\r\n    }\r\n\r\n    var businessObject = getBusinessObject(shape),\r\n        rootElement = getRootElement(businessObject),\r\n        rootElements;\r\n\r\n    if (rootElement && !hasRootElement(rootElement)) {\r\n      rootElements = bpmnjs.getDefinitions().get('rootElements');\r\n\r\n      // add root element\r\n      collectionAdd(rootElements, rootElement);\r\n\r\n      context.addedRootElement = rootElement;\r\n    }\r\n  }, true);\r\n\r\n  this.reverted([\r\n    'shape.create',\r\n    'element.updateProperties',\r\n    'element.updateModdleProperties'\r\n  ], function(context) {\r\n    var addedRootElement = context.addedRootElement;\r\n\r\n    if (!addedRootElement) {\r\n      return;\r\n    }\r\n\r\n    var rootElements = bpmnjs.getDefinitions().get('rootElements');\r\n\r\n    // remove root element\r\n    collectionRemove(rootElements, addedRootElement);\r\n  }, true);\r\n\r\n  eventBus.on('copyPaste.copyElement', function(context) {\r\n    var descriptor = context.descriptor,\r\n        element = context.element;\r\n\r\n    if (element.labelTarget || !canHaveRootElementReference(element)) {\r\n      return;\r\n    }\r\n\r\n    var businessObject = getBusinessObject(element),\r\n        rootElement = getRootElement(businessObject);\r\n\r\n    if (rootElement) {\r\n\r\n      // TODO(nikku): clone on copy\r\n      descriptor.referencedRootElement = rootElement;\r\n    }\r\n  });\r\n\r\n  eventBus.on('copyPaste.pasteElement', LOW_PRIORITY, function(context) {\r\n    var descriptor = context.descriptor,\r\n        businessObject = descriptor.businessObject,\r\n        referencedRootElement = descriptor.referencedRootElement;\r\n\r\n    if (!referencedRootElement) {\r\n      return;\r\n    }\r\n\r\n    if (!hasRootElement(referencedRootElement)) {\r\n      referencedRootElement = moddleCopy.copyElement(\r\n        referencedRootElement,\r\n        bpmnFactory.create(referencedRootElement.$type)\r\n      );\r\n    }\r\n\r\n    setRootElement(businessObject, referencedRootElement);\r\n\r\n    delete descriptor.referencedRootElement;\r\n  });\r\n}\r\n\r\nRootElementReferenceBehavior.$inject = [\r\n  'bpmnjs',\r\n  'eventBus',\r\n  'injector',\r\n  'moddleCopy',\r\n  'bpmnFactory'\r\n];\r\n\r\ninherits(RootElementReferenceBehavior, CommandInterceptor);\r\n\r\n// helpers //////////\r\n\r\nfunction hasAnyEventDefinition(element, types) {\r\n  if (!isArray(types)) {\r\n    types = [ types ];\r\n  }\r\n\r\n  return some(types, function(type) {\r\n    return hasEventDefinition(element, type);\r\n  });\r\n}"
  },
  {
    "path": "lib/features/modeling/behavior/SetCompensationActivityAfterPasteBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport { getBusinessObject, is } from '../../../util/ModelUtil';\n\nimport { hasEventDefinition } from '../../../util/DiUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../../rules/BpmnRules').default} BpmnRules\n * @typedef {import('../Modeling').default} Modeling\n */\n\n\n/**\n * A behavior that sets the property of Compensation Activity after paste operation\n *\n * @param {EventBus} eventBus\n * @param {Modeling} modeling\n */\nexport default function SetCompensationActivityAfterPasteBehavior(eventBus, modeling) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  this.postExecuted('elements.create', function(event) {\n    const context = event.context,\n          elements = context.elements;\n\n    // check if compensation activity is connected to compensation boundary event\n    for (const element of elements) {\n      if (isForCompensation(element) && !isConnectedToCompensationBoundaryEvent(element)) {\n        modeling.updateProperties(element, { isForCompensation: undefined });\n      }\n    }\n  });\n}\n\ninherits(SetCompensationActivityAfterPasteBehavior, CommandInterceptor);\n\nSetCompensationActivityAfterPasteBehavior.$inject = [\n  'eventBus',\n  'modeling'\n];\n\n\n// helpers //////////////////////\n\nfunction isForCompensation(element) {\n  const bo = getBusinessObject(element);\n  return bo && bo.isForCompensation;\n}\n\nfunction isCompensationBoundaryEvent(element) {\n  return element && is(element, 'bpmn:BoundaryEvent') &&\n      hasEventDefinition(element, 'bpmn:CompensateEventDefinition');\n}\n\nfunction isConnectedToCompensationBoundaryEvent(element) {\n  const compensationAssociations = element.incoming.filter(\n    connection => isCompensationBoundaryEvent(connection.source)\n  );\n  if (compensationAssociations.length > 0) {\n    return true;\n  }\n  return false;\n}"
  },
  {
    "path": "lib/features/modeling/behavior/SpaceToolBehavior.js",
    "content": "import { forEach } from 'min-dash';\n\nimport { is } from '../../../util/ModelUtil';\n\nimport {\n  isExpanded,\n  isHorizontal\n} from '../../../util/DiUtil';\n\nimport {\n  GROUP_MIN_DIMENSIONS,\n  LANE_MIN_DIMENSIONS,\n  VERTICAL_LANE_MIN_DIMENSIONS,\n  PARTICIPANT_MIN_DIMENSIONS,\n  VERTICAL_PARTICIPANT_MIN_DIMENSIONS,\n  SUB_PROCESS_MIN_DIMENSIONS,\n  TEXT_ANNOTATION_MIN_DIMENSIONS\n} from './ResizeBehavior';\n\nimport { getChildLanes } from '../util/LaneUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n *\n * @typedef {import('../../../model/Types').Shape} Shape\n */\n\nvar max = Math.max;\n\n/**\n * @param {EventBus} eventBus\n */\nexport default function SpaceToolBehavior(eventBus) {\n  eventBus.on('spaceTool.getMinDimensions', function(context) {\n    var shapes = context.shapes,\n        axis = context.axis,\n        start = context.start,\n        minDimensions = {};\n\n    forEach(shapes, function(shape) {\n      var id = shape.id;\n\n      if (is(shape, 'bpmn:Participant')) {\n        minDimensions[ id ] = getParticipantMinDimensions(shape, axis, start);\n      }\n\n      if (is(shape, 'bpmn:Lane')) {\n        minDimensions[ id ] = isHorizontal(shape) ? LANE_MIN_DIMENSIONS : VERTICAL_LANE_MIN_DIMENSIONS;\n      }\n\n      if (is(shape, 'bpmn:SubProcess') && isExpanded(shape)) {\n        minDimensions[ id ] = SUB_PROCESS_MIN_DIMENSIONS;\n      }\n\n      if (is(shape, 'bpmn:TextAnnotation')) {\n        minDimensions[ id ] = TEXT_ANNOTATION_MIN_DIMENSIONS;\n      }\n\n      if (is(shape, 'bpmn:Group')) {\n        minDimensions[ id ] = GROUP_MIN_DIMENSIONS;\n      }\n    });\n\n    return minDimensions;\n  });\n}\n\nSpaceToolBehavior.$inject = [ 'eventBus' ];\n\n\n// helpers //////////\nfunction isHorizontalAxis(axis) {\n  return axis === 'x';\n}\n\n/**\n * Get minimum dimensions for participant taking lanes into account.\n *\n * @param {Shape} participant\n * @param {Axis} axis\n * @param {number} start\n *\n * @return {number}\n */\nfunction getParticipantMinDimensions(participant, axis, start) {\n  var isHorizontalLane = isHorizontal(participant);\n\n  if (!hasChildLanes(participant)) {\n    return isHorizontalLane ? PARTICIPANT_MIN_DIMENSIONS : VERTICAL_PARTICIPANT_MIN_DIMENSIONS;\n  }\n\n  var isHorizontalResize = isHorizontalAxis(axis);\n  var minDimensions = {};\n\n  if (isHorizontalResize) {\n    if (isHorizontalLane) {\n      minDimensions = PARTICIPANT_MIN_DIMENSIONS;\n    } else {\n      minDimensions = {\n        width: getParticipantMinWidth(participant, start, isHorizontalResize),\n        height: VERTICAL_PARTICIPANT_MIN_DIMENSIONS.height\n      };\n    }\n\n  } else {\n    if (isHorizontalLane) {\n      minDimensions = {\n        width: PARTICIPANT_MIN_DIMENSIONS.width,\n        height: getParticipantMinHeight(participant, start, isHorizontalResize)\n      };\n    } else {\n      minDimensions = VERTICAL_PARTICIPANT_MIN_DIMENSIONS;\n    }\n  }\n\n  return minDimensions;\n}\n\n/**\n * Get minimum height for participant taking lanes into account.\n *\n * @param {Shape} participant\n * @param {number} start\n * @param {boolean} isHorizontalResize\n *\n * @return {number}\n */\nfunction getParticipantMinHeight(participant, start, isHorizontalResize) {\n  var lanesMinHeight;\n  lanesMinHeight = getLanesMinHeight(participant, start, isHorizontalResize);\n  return max(PARTICIPANT_MIN_DIMENSIONS.height, lanesMinHeight);\n}\n\n/**\n * Get minimum width for participant taking lanes into account.\n *\n * @param {Shape} participant\n * @param {number} start\n * @param {boolean} isHorizontalResize\n *\n * @return {number}\n */\nfunction getParticipantMinWidth(participant, start, isHorizontalResize) {\n  var lanesMinWidth;\n  lanesMinWidth = getLanesMinWidth(participant, start, isHorizontalResize);\n  return max(VERTICAL_PARTICIPANT_MIN_DIMENSIONS.width, lanesMinWidth);\n}\n\nfunction hasChildLanes(element) {\n  return !!getChildLanes(element).length;\n}\n\nfunction getLanesMinHeight(participant, resizeStart, isHorizontalResize) {\n  var lanes = getChildLanes(participant),\n      resizedLane;\n\n  // find the nested lane which is currently resized\n  resizedLane = findResizedLane(lanes, resizeStart, isHorizontalResize);\n\n  // resized lane cannot shrink below the minimum height\n  // but remaining lanes' dimensions are kept intact\n  return participant.height - resizedLane.height + LANE_MIN_DIMENSIONS.height;\n}\n\nfunction getLanesMinWidth(participant, resizeStart, isHorizontalResize) {\n  var lanes = getChildLanes(participant),\n      resizedLane;\n\n  // find the nested lane which is currently resized\n  resizedLane = findResizedLane(lanes, resizeStart, isHorizontalResize);\n\n  // resized lane cannot shrink below the minimum width\n  // but remaining lanes' dimensions are kept intact\n  return participant.width - resizedLane.width + VERTICAL_LANE_MIN_DIMENSIONS.width;\n}\n\n/**\n * Find nested lane which is currently resized.\n *\n * @param {Shape[]} lanes\n * @param {number} resizeStart\n * @param {boolean} isHorizontalResize\n *\n * @return {Shape}\n */\nfunction findResizedLane(lanes, resizeStart, isHorizontalResize) {\n  var i, lane, childLanes;\n\n  for (i = 0; i < lanes.length; i++) {\n    lane = lanes[i];\n\n    // resizing current lane or a lane nested\n    if (!isHorizontalResize && resizeStart >= lane.y && resizeStart <= lane.y + lane.height ||\n        isHorizontalResize && resizeStart >= lane.x && resizeStart <= lane.x + lane.width) {\n\n      childLanes = getChildLanes(lane);\n\n      // a nested lane is resized\n      if (childLanes.length) {\n        return findResizedLane(childLanes, resizeStart, isHorizontalResize);\n      }\n\n      // current lane is the resized one\n      return lane;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/features/modeling/behavior/SubProcessPlaneBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport { find, forEach } from 'min-dash';\n\nimport { isExpanded } from '../../../util/DiUtil';\n\nimport {\n  collectElementsAnnotations,\n  getElementAnnotations\n} from '../../../util/AnnotationUtil';\n\nimport { getBusinessObject, getDi, is } from '../../../util/ModelUtil';\n\nimport { getMid } from 'diagram-js/lib/layout/LayoutUtil';\n\nimport { getBBox, selfAndChildren } from 'diagram-js/lib/util/Elements';\n\nimport {\n  getPlaneIdFromShape,\n  getShapeIdFromPlane,\n  isPlane,\n  toPlaneId\n} from '../../../util/DrilldownUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../Modeling').default} Modeling\n * @typedef {import('../ElementFactory').default} ElementFactory\n * @typedef {import('../BpmnFactory').default} BpmnFactory\n * @typedef {import('../../../Modeler').default} Modeler\n * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n *\n * @typedef {import('../../../model/Types').Element} Element\n * @typedef {import('../../../model/Types').Root} Root\n * @typedef {import('../../../model/Types').ModdleElement} ModdleElement\n */\n\nvar LOW_PRIORITY = 400;\nvar HIGH_PRIORITY = 600;\n\nvar DEFAULT_POSITION = {\n  x: 180,\n  y: 160\n};\n\n/**\n * Creates bpmndi:BPMNPlane elements and canvas planes when collapsed subprocesses are created.\n *\n * @param {Canvas} canvas\n * @param {EventBus} eventBus\n * @param {Modeling} modeling\n * @param {ElementFactory} elementFactory\n * @param {BpmnFactory} bpmnFactory\n * @param {Modeler} bpmnjs\n * @param {ElementRegistry} elementRegistry\n */\nexport default function SubProcessPlaneBehavior(\n    canvas, eventBus, modeling,\n    elementFactory, bpmnFactory, bpmnjs, elementRegistry) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  this._canvas = canvas;\n  this._eventBus = eventBus;\n  this._modeling = modeling;\n  this._elementFactory = elementFactory;\n  this._bpmnFactory = bpmnFactory;\n  this._bpmnjs = bpmnjs;\n  this._elementRegistry = elementRegistry;\n\n  var self = this;\n\n  function isCollapsedSubProcess(element) {\n    return is(element, 'bpmn:SubProcess') && !isExpanded(element);\n  }\n\n  function createRoot(context) {\n    var shape = context.shape,\n        rootElement = context.newRootElement;\n\n    var businessObject = getBusinessObject(shape);\n\n    rootElement = self._addDiagram(rootElement || businessObject);\n\n    context.newRootElement = canvas.addRootElement(rootElement);\n  }\n\n  function removeRoot(context) {\n    var shape = context.shape;\n\n    var businessObject = getBusinessObject(shape);\n    self._removeDiagram(businessObject);\n\n    var rootElement = context.newRootElement = elementRegistry.get(getPlaneIdFromShape(businessObject));\n\n    canvas.removeRootElement(rootElement);\n  }\n\n  // add plane elements for newly created sub-processes\n  // this ensures we can actually drill down into the element\n  this.executed('shape.create', function(context) {\n    var shape = context.shape;\n    if (!isCollapsedSubProcess(shape)) {\n      return;\n    }\n\n    createRoot(context);\n  }, true);\n\n\n  this.postExecuted('elements.create', function(context) {\n    var elements = context.elements;\n\n    forEach(elements, function(element) {\n      if (!isCollapsedSubProcess(element)) {\n        return;\n      }\n\n      var rootElement = elementRegistry.get(getPlaneIdFromShape(element));\n\n      if (!rootElement || !element.children || !element.children.length) {\n        return;\n      }\n\n      var children = getSubProcessChildren(element);\n\n      self._showRecursively(children);\n\n      self._moveChildrenToShape(children, rootElement);\n    });\n  }, true);\n\n\n  this.reverted('shape.create', function(context) {\n    var shape = context.shape;\n    if (!isCollapsedSubProcess(shape)) {\n      return;\n    }\n\n    removeRoot(context);\n  }, true);\n\n\n  // remove annotations connected to elements inside the subprocess\n  this.preExecute('shape.delete', function(context) {\n    var shape = context.shape;\n\n    if (!is(shape, 'bpmn:SubProcess') || !isExpanded(shape)) {\n      return;\n    }\n\n    forEach(collectElementsAnnotations([ shape ]), (entry) => {\n      modeling.removeShape(entry.annotation);\n    });\n  }, true);\n\n\n  this.preExecuted('shape.delete', function(context) {\n    var shape = context.shape;\n    if (!isCollapsedSubProcess(shape)) {\n      return;\n    }\n\n    var attachedRoot = elementRegistry.get(getPlaneIdFromShape(shape));\n\n    if (!attachedRoot) {\n      return;\n    }\n\n    modeling.removeElements(attachedRoot.children.slice());\n  }, true);\n\n\n  this.executed('shape.delete', function(context) {\n    var shape = context.shape;\n    if (!isCollapsedSubProcess(shape)) {\n      return;\n    }\n    removeRoot(context);\n  }, true);\n\n\n  this.reverted('shape.delete', function(context) {\n    var shape = context.shape;\n    if (!isCollapsedSubProcess(shape)) {\n      return;\n    }\n\n    createRoot(context);\n  }, true);\n\n\n  this.preExecuted('shape.replace', function(context) {\n    var oldShape = context.oldShape;\n    var newShape = context.newShape;\n\n    if (!isCollapsedSubProcess(oldShape) || !isCollapsedSubProcess(newShape)) {\n      return;\n    }\n\n    // old plane could have content,\n    // we remove it so it is not recursively deleted from 'shape.delete'\n    context.oldRoot = canvas.removeRootElement(getPlaneIdFromShape(oldShape));\n  }, true);\n\n\n  this.postExecuted('shape.replace', function(context) {\n    var newShape = context.newShape,\n        source = context.oldRoot,\n        target = canvas.findRoot(getPlaneIdFromShape(newShape));\n\n    if (!source || !target) {\n      return;\n    }\n    var elements = source.children;\n\n    modeling.moveElements(elements, { x: 0, y: 0 }, target);\n  }, true);\n\n\n  // rename primary elements when the secondary element changes\n  // this ensures rootElement.id = element.id + '_plane'\n  this.executed('element.updateProperties', function(context) {\n    var shape = context.element;\n\n    if (!is(shape, 'bpmn:SubProcess')) {\n      return;\n    }\n\n    var properties = context.properties;\n    var oldProperties = context.oldProperties;\n\n    var oldId = oldProperties.id,\n        newId = properties.id;\n\n    if (oldId === newId) {\n      return;\n    }\n\n    if (isPlane(shape)) {\n      elementRegistry.updateId(shape, toPlaneId(newId));\n      elementRegistry.updateId(oldId, newId);\n\n      return;\n    }\n\n    var planeElement = elementRegistry.get(toPlaneId(oldId));\n\n    if (!planeElement) {\n      return;\n    }\n\n    elementRegistry.updateId(toPlaneId(oldId), toPlaneId(newId));\n  }, true);\n\n\n  this.reverted('element.updateProperties', function(context) {\n    var shape = context.element;\n\n    if (!is(shape, 'bpmn:SubProcess')) {\n      return;\n    }\n\n    var properties = context.properties;\n    var oldProperties = context.oldProperties;\n\n    var oldId = oldProperties.id,\n        newId = properties.id;\n\n    if (oldId === newId) {\n      return;\n    }\n\n    if (isPlane(shape)) {\n      elementRegistry.updateId(shape, toPlaneId(oldId));\n      elementRegistry.updateId(newId, oldId);\n\n      return;\n    }\n\n    var planeElement = elementRegistry.get(toPlaneId(newId));\n\n    if (!planeElement) {\n      return;\n    }\n\n    elementRegistry.updateId(planeElement, toPlaneId(oldId));\n  }, true);\n\n  // re-throw element.changed to re-render primary shape if associated plane has\n  // changed (e.g. bpmn:name property has changed)\n  eventBus.on('element.changed', function(context) {\n    var element = context.element;\n\n    if (!isPlane(element)) {\n      return;\n    }\n\n    var plane = element;\n\n    var primaryShape = elementRegistry.get(getShapeIdFromPlane(plane));\n\n    // do not re-throw if no associated primary shape (e.g. bpmn:Process)\n    if (!primaryShape || primaryShape === plane) {\n      return;\n    }\n\n    eventBus.fire('element.changed', { element: primaryShape });\n  });\n\n\n  // create/remove plane for the subprocess\n  this.executed('shape.toggleCollapse', LOW_PRIORITY, function(context) {\n    var shape = context.shape;\n\n    if (!is(shape, 'bpmn:SubProcess')) {\n      return;\n    }\n\n    if (!isExpanded(shape)) {\n      createRoot(context);\n      self._showRecursively(shape.children);\n    } else {\n      removeRoot(context);\n    }\n\n  }, true);\n\n\n  // create/remove plane for the subprocess\n  this.reverted('shape.toggleCollapse', LOW_PRIORITY, function(context) {\n    var shape = context.shape;\n\n    if (!is(shape, 'bpmn:SubProcess')) {\n      return;\n    }\n\n    if (!isExpanded(shape)) {\n      createRoot(context);\n      self._showRecursively(shape.children);\n    } else {\n      removeRoot(context);\n    }\n\n  }, true);\n\n  // move elements between planes\n  this.postExecuted('shape.toggleCollapse', HIGH_PRIORITY, function(context) {\n    var shape = context.shape;\n\n    if (!is(shape, 'bpmn:SubProcess')) {\n      return;\n    }\n\n    var rootElement = context.newRootElement;\n\n    if (!rootElement) {\n      return;\n    }\n\n    if (!isExpanded(shape)) {\n\n      // if an annotation is attached to both the sub-process and elements inside it,\n      // remove the inner associations, keeping only connections at the sub-process level,\n      // since we can't keep both after collapsing\n      self._disconnectSharedAnnotations(shape);\n\n      var children = getSubProcessChildren(shape);\n\n      self._moveChildrenToShape(children, rootElement);\n\n    } else {\n      self._moveChildrenToShape(rootElement.children.slice(), shape);\n\n      // annotations live at process level by design;\n      // move them back from the sub-process to the process root\n      forEach(collectElementsAnnotations(shape.children), (entry) => {\n        modeling.moveShape(entry.annotation, { x: 0, y: 0 }, shape.parent);\n\n        forEach(entry.associations, (association) => {\n          modeling.moveConnection(association, { x: 0, y: 0 }, shape.parent);\n        });\n      });\n    }\n  }, true);\n\n\n  // copy-paste ///////////\n\n  // add elements in plane to tree\n  eventBus.on('copyPaste.createTree', function(context) {\n    var element = context.element,\n        children = context.children;\n\n    if (!isCollapsedSubProcess(element)) {\n      return;\n    }\n\n    var id = getPlaneIdFromShape(element);\n    var parent = elementRegistry.get(id);\n\n    if (parent) {\n\n      // do not copy invisible root element\n      children.push.apply(children, parent.children);\n    }\n  });\n\n  // set plane children as direct children of collapsed shape\n  eventBus.on('copyPaste.copyElement', function(context) {\n    var descriptor = context.descriptor,\n        element = context.element,\n        elements = context.elements;\n\n    var parent = element.parent;\n\n    var isPlane = is(getDi(parent), 'bpmndi:BPMNPlane');\n    if (!isPlane) {\n      return;\n    }\n\n    var parentId = getShapeIdFromPlane(parent);\n\n    var referencedShape = find(elements, function(element) {\n      return element.id === parentId;\n    });\n\n    if (!referencedShape) {\n      return;\n    }\n\n    descriptor.parent = referencedShape.id;\n  });\n\n  // hide children during pasting\n  eventBus.on('copyPaste.pasteElement', function(context) {\n    var descriptor = context.descriptor;\n\n    if (!descriptor.parent) {\n      return;\n    }\n\n    if (isCollapsedSubProcess(descriptor.parent) || descriptor.parent.hidden) {\n      descriptor.hidden = true;\n    }\n  });\n\n}\n\ninherits(SubProcessPlaneBehavior, CommandInterceptor);\n\n/**\n * Moves the given elements to the target.\n *\n * If the target is a plane, the children are moved to the top left corner.\n * Otherwise, the center of the target is used.\n *\n * @param {Element[]} children\n * @param {Root} target\n */\nSubProcessPlaneBehavior.prototype._moveChildrenToShape = function(children, target) {\n  var modeling = this._modeling;\n\n  if (!children.length) {\n    return;\n  }\n\n  // only change plane if there are no visible children, but don't move them\n  var visibleChildren = children.filter(function(child) {\n    return !child.hidden;\n  });\n\n  if (!visibleChildren.length) {\n    modeling.moveElements(children, { x: 0, y: 0 }, target, { autoResize: false });\n    return;\n  }\n\n  var childrenBounds = getBBox(visibleChildren);\n  var offset;\n\n  // target is a plane\n  if (!target.x) {\n    offset = {\n      x: DEFAULT_POSITION.x - childrenBounds.x,\n      y: DEFAULT_POSITION.y - childrenBounds.y\n    };\n  }\n\n  // source is a plane\n  else {\n\n    // move relative to the center of the shape\n    var targetMid = getMid(target);\n    var childrenMid = getMid(childrenBounds);\n\n    offset = {\n      x: targetMid.x - childrenMid.x,\n      y: targetMid.y - childrenMid.y\n    };\n  }\n\n  modeling.moveElements(children, offset, target, { autoResize: false });\n};\n\n/**\n * Remove all associations between inner elements and annotations that are\n * also connected to the sub-process itself.\n *\n * @param {Element} shape\n */\nSubProcessPlaneBehavior.prototype._disconnectSharedAnnotations = function(shape) {\n  var modeling = this._modeling;\n\n  var sharedAnnotations = new Set(\n    getElementAnnotations(shape).map((entry) => entry.annotation)\n  );\n\n  if (!sharedAnnotations.size) {\n    return;\n  }\n\n  forEach(collectElementsAnnotations(shape.children), (entry) => {\n    if (sharedAnnotations.has(entry.annotation)) {\n      forEach(entry.associations, (association) => {\n        modeling.removeConnection(association);\n      });\n    }\n  });\n};\n\n/**\n * Sets `hidden` property on all children of the given shape.\n *\n * @param {Element[]} elements\n * @param {boolean} [hidden=false]\n *\n * @return {Element[]}\n */\nSubProcessPlaneBehavior.prototype._showRecursively = function(elements, hidden) {\n  var self = this;\n\n  var result = [];\n  elements.forEach(function(element) {\n    element.hidden = !!hidden;\n\n    result = result.concat(element);\n\n    if (element.children) {\n      result = result.concat(\n        self._showRecursively(element.children, element.collapsed || hidden)\n      );\n    }\n  });\n\n  return result;\n};\n\n/**\n * Adds a given root element to the BPMNDI diagrams.\n *\n * @param {Root|ModdleElement} planeElement\n *\n * @return {Root}\n */\nSubProcessPlaneBehavior.prototype._addDiagram = function(planeElement) {\n  var bpmnjs = this._bpmnjs;\n  var diagrams = bpmnjs.getDefinitions().diagrams;\n\n  if (!planeElement.businessObject) {\n    planeElement = this._createNewDiagram(planeElement);\n  }\n\n  diagrams.push(planeElement.di.$parent);\n\n  return planeElement;\n};\n\n\n/**\n * Creates a new plane element for the given sub process.\n *\n * @param {ModdleElement} bpmnElement\n *\n * @return {Root}\n */\nSubProcessPlaneBehavior.prototype._createNewDiagram = function(bpmnElement) {\n  var bpmnFactory = this._bpmnFactory,\n      elementFactory = this._elementFactory;\n\n  var diPlane = bpmnFactory.create('bpmndi:BPMNPlane', {\n    bpmnElement: bpmnElement\n  });\n\n  var diDiagram = bpmnFactory.create('bpmndi:BPMNDiagram', {\n    plane: diPlane\n  });\n\n  diPlane.$parent = diDiagram;\n\n  // add a virtual element (not being drawn),\n  // a copy cat of our BpmnImporter code\n  var planeElement = elementFactory.createRoot({\n    id: getPlaneIdFromShape(bpmnElement),\n    type: bpmnElement.$type,\n    di: diPlane,\n    businessObject: bpmnElement,\n    collapsed: true\n  });\n\n  return planeElement;\n};\n\n/**\n * Removes the diagram for a given root element.\n *\n * @param {Root} rootElement\n *\n * @return {ModdleElement}\n */\nSubProcessPlaneBehavior.prototype._removeDiagram = function(rootElement) {\n  var bpmnjs = this._bpmnjs;\n\n  var diagrams = bpmnjs.getDefinitions().diagrams;\n\n  var removedDiagram = find(diagrams, function(diagram) {\n    return diagram.plane.bpmnElement.id === rootElement.id;\n  });\n\n  diagrams.splice(diagrams.indexOf(removedDiagram), 1);\n\n  return removedDiagram;\n};\n\n\nSubProcessPlaneBehavior.$inject = [\n  'canvas',\n  'eventBus',\n  'modeling',\n  'elementFactory',\n  'bpmnFactory',\n  'bpmnjs',\n  'elementRegistry'\n];\n\n/**\n * Collect text annotations and their associations connected to the given elements.\n *\n * @param {Element[]} elements\n *\n * @return {Element[]}\n */\nfunction collectAnnotationElements(elements) {\n  var result = [];\n\n  forEach(collectElementsAnnotations(elements), (entry) => {\n    result.push(entry.annotation);\n    result.push.apply(result, entry.associations);\n  });\n\n  return result;\n}\n\n/**\n * Collect all children of a collapsed subprocess that need to be moved\n * to or from its plane, including annotations and external labels that\n * live at the process level by design(ref: https://github.com/camunda/camunda-modeler/issues/5163#issuecomment-3946571271)\n *\n * @param {Element} element\n *\n * @return {Element[]}\n */\nfunction getSubProcessChildren(element) {\n  return element.children.slice()\n    .concat(collectAnnotationElements(element.children))\n    .concat(getExternalLabels(element));\n}\n\n/**\n * Returns external labels of the given element's children and their descendants\n * that are not direct children of the element (i.e. parented elsewhere).\n *\n * @param {Element} element\n *\n * @return {Element[]}\n */\nfunction getExternalLabels(element) {\n  return selfAndChildren(element.children || [], true, -1)\n    .reduce(function(labels, child) {\n      if (child.label && child.label.parent !== element) {\n        labels.push(child.label);\n      }\n      return labels;\n    }, []);\n}\n\n"
  },
  {
    "path": "lib/features/modeling/behavior/SubProcessStartEventBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport { is } from '../../../util/ModelUtil';\n\nimport { isExpanded } from '../../../util/DiUtil.js';\n\n/**\n * @typedef {import('didi').Injector} Injector\n * @typedef {import('../Modeling').default} Modeling\n */\n\n/**\n * Add start event replacing element with expanded sub process.\n *\n * @param {Injector} injector\n * @param {Modeling} modeling\n */\nexport default function SubProcessStartEventBehavior(injector, modeling) {\n  injector.invoke(CommandInterceptor, this);\n\n  this.postExecuted('shape.replace', function(event) {\n    var oldShape = event.context.oldShape,\n        newShape = event.context.newShape;\n\n    if (\n      !is(newShape, 'bpmn:SubProcess') ||\n      is(newShape,'bpmn:AdHocSubProcess') ||\n      ! (is(oldShape, 'bpmn:Task') || is(oldShape, 'bpmn:CallActivity')) ||\n      !isExpanded(newShape)\n    ) {\n      return;\n    }\n\n    var position = getStartEventPosition(newShape);\n\n    modeling.createShape({ type: 'bpmn:StartEvent' }, position, newShape);\n  });\n}\n\nSubProcessStartEventBehavior.$inject = [\n  'injector',\n  'modeling'\n];\n\ninherits(SubProcessStartEventBehavior, CommandInterceptor);\n\n// helpers //////////\n\nfunction getStartEventPosition(shape) {\n  return {\n    x: shape.x + shape.width / 6,\n    y: shape.y + shape.height / 2\n  };\n}\n"
  },
  {
    "path": "lib/features/modeling/behavior/TextAnnotationBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport { is } from '../../../util/ModelUtil';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n */\n\nexport default function TextAnnotationBehavior(eventBus) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  // On Append, TextAnnotations will be created on the Root.\n  // The default for connections will create the connection in the parent of\n  // the source element, so we overwrite the parent here.\n  this.preExecute('connection.create', function(context) {\n    const { target } = context;\n\n    if (!is(target, 'bpmn:TextAnnotation')) {\n      return;\n    }\n\n    context.parent = target.parent;\n  }, true);\n\n  this.preExecute([ 'shape.create', 'shape.resize', 'elements.move' ], function(context) {\n    const shapes = context.shapes || [ context.shape ];\n\n    if (shapes.length === 1 && is(shapes[0], 'bpmn:TextAnnotation')) {\n      context.hints = context.hints || {};\n\n      context.hints.autoResize = false;\n    }\n  }, true);\n}\n\ninherits(TextAnnotationBehavior, CommandInterceptor);\n\nTextAnnotationBehavior.$inject = [\n  'eventBus'\n];"
  },
  {
    "path": "lib/features/modeling/behavior/ToggleCollapseConnectionBehaviour.js",
    "content": "\nimport inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport {\n  forEach\n} from 'min-dash';\n\nimport { getMid } from 'diagram-js/lib/layout/LayoutUtil';\nimport { selfAndAllChildren } from 'diagram-js/lib/util/Elements';\n\nimport { isExpanded } from '../../../util/DiUtil';\n\nimport { is } from '../../../util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../Modeling').default} Modeling\n *\n * @typedef {import('../../../model/Types').Element} Element\n * @typedef {import('../../../model/Types').Shape} Shape\n *\n * @typedef {import('diagram-js/lib/util/Types').DirectionTRBL} DirectionTRBL\n */\n\n/**\n * @param {EventBus} eventBus\n * @param {Modeling} modeling\n */\nexport default function ToggleCollapseConnectionBehaviour(\n    eventBus, modeling\n) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  this.postExecuted('shape.toggleCollapse', 1500, function(context) {\n\n    var shape = context.shape;\n\n    // only change connections when collapsing\n    if (isExpanded(shape)) {\n      return;\n    }\n\n    var allChildren = selfAndAllChildren(shape);\n\n    allChildren.forEach(function(child) {\n\n      // Ensure that the connection array is not modified during iteration\n      var incomingConnections = child.incoming.slice(),\n          outgoingConnections = child.outgoing.slice();\n\n      forEach(incomingConnections, function(c) {\n        handleConnection(c, true);\n      });\n\n      forEach(outgoingConnections, function(c) {\n        handleConnection(c, false);\n      });\n    });\n\n\n    function handleConnection(c, incoming) {\n      if (allChildren.indexOf(c.source) !== -1 && allChildren.indexOf(c.target) !== -1) {\n        return;\n      }\n\n      // don't reconnect TextAnnotation connections,\n      // since they should stay connected and moved with its element to the subprocess plane\n      if (is(c, 'bpmn:Association') && (is(c.source, 'bpmn:TextAnnotation') || is(c.target, 'bpmn:TextAnnotation'))) {\n        return;\n      }\n\n      if (incoming) {\n        modeling.reconnectEnd(c, shape, getMid(shape));\n      } else {\n        modeling.reconnectStart(c, shape, getMid(shape));\n      }\n\n    }\n\n  }, true);\n\n}\n\ninherits(ToggleCollapseConnectionBehaviour, CommandInterceptor);\n\nToggleCollapseConnectionBehaviour.$inject = [\n  'eventBus',\n  'modeling',\n];\n\n\n"
  },
  {
    "path": "lib/features/modeling/behavior/ToggleElementCollapseBehaviour.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport {\n  getDi,\n  is\n} from '../../../util/ModelUtil';\n\nimport {\n  computeChildrenBBox\n} from 'diagram-js/lib/features/resize/ResizeUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../ElementFactory').default} ElementFactory\n * @typedef {import('../Modeling').default} Modeling\n */\n\nvar LOW_PRIORITY = 500;\n\n/**\n * @param {EventBus} eventBus\n * @param {ElementFactory} elementFactory\n * @param {Modeling} modeling\n */\nexport default function ToggleElementCollapseBehaviour(\n    eventBus, elementFactory, modeling) {\n\n  CommandInterceptor.call(this, eventBus);\n\n\n  function hideEmptyLabels(children) {\n    if (children.length) {\n      children.forEach(function(child) {\n        if (child.type === 'label' && !child.businessObject.name) {\n          child.hidden = true;\n        }\n      });\n    }\n  }\n\n  function expandedBounds(shape, defaultSize) {\n    var children = shape.children,\n        newBounds = defaultSize,\n        visibleElements,\n        visibleBBox;\n\n    visibleElements = filterVisible(children).concat([ shape ]);\n\n    visibleBBox = computeChildrenBBox(visibleElements);\n\n    if (visibleBBox) {\n\n      // center to visibleBBox with max(defaultSize, childrenBounds)\n      newBounds.width = Math.max(visibleBBox.width, newBounds.width);\n      newBounds.height = Math.max(visibleBBox.height, newBounds.height);\n\n      newBounds.x = visibleBBox.x + (visibleBBox.width - newBounds.width) / 2;\n      newBounds.y = visibleBBox.y + (visibleBBox.height - newBounds.height) / 2;\n    } else {\n\n      // center to collapsed shape with defaultSize\n      newBounds.x = shape.x + (shape.width - newBounds.width) / 2;\n      newBounds.y = shape.y + (shape.height - newBounds.height) / 2;\n    }\n\n    return newBounds;\n  }\n\n  function collapsedBounds(shape, defaultSize) {\n\n    return {\n      x: shape.x + (shape.width - defaultSize.width) / 2,\n      y: shape.y + (shape.height - defaultSize.height) / 2,\n      width: defaultSize.width,\n      height: defaultSize.height\n    };\n  }\n\n  this.executed([ 'shape.toggleCollapse' ], LOW_PRIORITY, function(e) {\n\n    var context = e.context,\n        shape = context.shape;\n\n    if (!is(shape, 'bpmn:SubProcess')) {\n      return;\n    }\n\n    if (!shape.collapsed) {\n\n      // all children got made visible through djs, hide empty labels\n      hideEmptyLabels(shape.children);\n\n      // remove collapsed marker\n      getDi(shape).isExpanded = true;\n    } else {\n\n      // place collapsed marker\n      getDi(shape).isExpanded = false;\n    }\n  });\n\n  this.reverted([ 'shape.toggleCollapse' ], LOW_PRIORITY, function(e) {\n\n    var context = e.context;\n    var shape = context.shape;\n\n\n    // revert removing/placing collapsed marker\n    if (!shape.collapsed) {\n      getDi(shape).isExpanded = true;\n\n    } else {\n      getDi(shape).isExpanded = false;\n    }\n  });\n\n  this.postExecuted([ 'shape.toggleCollapse' ], LOW_PRIORITY, function(e) {\n    var shape = e.context.shape,\n        defaultSize = elementFactory.getDefaultSize(shape),\n        newBounds;\n\n    if (shape.collapsed) {\n\n      // resize to default size of collapsed shapes\n      newBounds = collapsedBounds(shape, defaultSize);\n    } else {\n\n      // resize to bounds of max(visible children, defaultSize)\n      newBounds = expandedBounds(shape, defaultSize);\n    }\n\n    modeling.resizeShape(shape, newBounds, null, {\n      autoResize: shape.collapsed ? false : 'nwse'\n    });\n  });\n\n}\n\n\ninherits(ToggleElementCollapseBehaviour, CommandInterceptor);\n\nToggleElementCollapseBehaviour.$inject = [\n  'eventBus',\n  'elementFactory',\n  'modeling'\n];\n\n\n// helpers //////////////////////\n\nfunction filterVisible(elements) {\n  return elements.filter(function(e) {\n    return !e.hidden;\n  });\n}"
  },
  {
    "path": "lib/features/modeling/behavior/UnclaimIdBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport { is } from '../../../util/ModelUtil';\nimport { isExpanded } from '../../../util/DiUtil';\nimport { isLabel } from '../../../util/LabelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n * @typedef {import('didi').Injector} Injector\n * @typedef {import('../Modeling').default} Modeling\n *\n * @typedef {import('../../../model/Types').Moddle} Moddle\n */\n\n/**\n * Unclaims model IDs on element deletion.\n *\n * @param {Canvas} canvas\n * @param {Injector} injector\n * @param {Moddle} moddle\n * @param {Modeling} modeling\n */\nexport default function UnclaimIdBehavior(canvas, injector, moddle, modeling) {\n  injector.invoke(CommandInterceptor, this);\n\n  this.preExecute('shape.delete', function(event) {\n    var context = event.context,\n        shape = context.shape,\n        shapeBo = shape.businessObject;\n\n    if (isLabel(shape)) {\n      return;\n    }\n\n    if (is(shape, 'bpmn:Participant') && isExpanded(shape)) {\n      moddle.ids.unclaim(shapeBo.processRef.id);\n    }\n\n    modeling.unclaimId(shapeBo.id, shapeBo);\n  });\n\n\n  this.preExecute('connection.delete', function(event) {\n    var context = event.context,\n        connection = context.connection,\n        connectionBo = connection.businessObject;\n\n    modeling.unclaimId(connectionBo.id, connectionBo);\n  });\n\n  this.preExecute('canvas.updateRoot', function() {\n    var rootElement = canvas.getRootElement(),\n        rootElementBo = rootElement.businessObject;\n\n    if (is(rootElement, 'bpmn:Collaboration')) {\n      moddle.ids.unclaim(rootElementBo.id);\n    }\n  });\n}\n\ninherits(UnclaimIdBehavior, CommandInterceptor);\n\nUnclaimIdBehavior.$inject = [ 'canvas', 'injector', 'moddle', 'modeling' ];"
  },
  {
    "path": "lib/features/modeling/behavior/UnsetDefaultFlowBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport {\n  getBusinessObject,\n  is\n} from '../../../util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../Modeling').default} Modeling\n */\n\n/**\n * A behavior that unsets the Default property of sequence flow source on\n * element delete, if the removed element is the Gateway or Task's default flow.\n *\n * @param {EventBus} eventBus\n * @param {Modeling} modeling\n */\nexport default function DeleteSequenceFlowBehavior(eventBus, modeling) {\n\n  CommandInterceptor.call(this, eventBus);\n\n\n  this.preExecute('connection.delete', function(event) {\n    var context = event.context,\n        connection = context.connection,\n        source = connection.source;\n\n    if (isDefaultFlow(connection, source)) {\n      modeling.updateProperties(source, {\n        'default': null\n      });\n    }\n  });\n}\n\ninherits(DeleteSequenceFlowBehavior, CommandInterceptor);\n\nDeleteSequenceFlowBehavior.$inject = [\n  'eventBus',\n  'modeling'\n];\n\n\n// helpers //////////////////////\n\nfunction isDefaultFlow(connection, source) {\n\n  if (!is(connection, 'bpmn:SequenceFlow')) {\n    return false;\n  }\n\n  var sourceBo = getBusinessObject(source),\n      sequenceFlow = getBusinessObject(connection);\n\n  return sourceBo.get('default') === sequenceFlow;\n}"
  },
  {
    "path": "lib/features/modeling/behavior/UpdateFlowNodeRefsBehavior.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport {\n  is\n} from '../../../util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('../Modeling').default} Modeling\n */\n\nvar LOW_PRIORITY = 500,\n    HIGH_PRIORITY = 5000;\n\n\n/**\n * BPMN specific delete lane behavior.\n *\n * @param {EventBus} eventBus\n * @param {Modeling} modeling\n */\nexport default function UpdateFlowNodeRefsBehavior(eventBus, modeling) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  /**\n   * Update Lane#flowNodeRefs and FlowNode#lanes with every flow node\n   * move/resize and lane move/resize. Groups elements to recompute containments\n   * as efficient as possible.\n   */\n\n  // the update context\n  var context;\n\n\n  function initContext() {\n    context = context || new UpdateContext();\n    context.enter();\n\n    return context;\n  }\n\n  function getContext() {\n    if (!context) {\n      throw new Error('out of bounds release');\n    }\n\n    return context;\n  }\n\n  function releaseContext() {\n\n    if (!context) {\n      throw new Error('out of bounds release');\n    }\n\n    var triggerUpdate = context.leave();\n\n    if (triggerUpdate) {\n      modeling.updateLaneRefs(context.flowNodes, context.lanes);\n\n      context = null;\n    }\n\n    return triggerUpdate;\n  }\n\n\n  var laneRefUpdateEvents = [\n    'spaceTool',\n    'lane.add',\n    'lane.resize',\n    'lane.split',\n    'elements.create',\n    'elements.delete',\n    'elements.move',\n    'shape.create',\n    'shape.delete',\n    'shape.move',\n    'shape.resize'\n  ];\n\n\n  // listen to a lot of stuff to group lane updates\n\n  this.preExecute(laneRefUpdateEvents, HIGH_PRIORITY, function(event) {\n    initContext();\n  });\n\n  this.postExecuted(laneRefUpdateEvents, LOW_PRIORITY, function(event) {\n    releaseContext();\n  });\n\n\n  // Mark flow nodes + lanes that need an update\n\n  this.preExecute([\n    'shape.create',\n    'shape.move',\n    'shape.delete',\n    'shape.resize'\n  ], function(event) {\n\n    var context = event.context,\n        shape = context.shape;\n\n    var updateContext = getContext();\n\n    // no need to update labels\n    if (shape.labelTarget) {\n      return;\n    }\n\n    if (is(shape, 'bpmn:Lane')) {\n      updateContext.addLane(shape);\n    }\n\n    if (is(shape, 'bpmn:FlowNode')) {\n      updateContext.addFlowNode(shape);\n    }\n  });\n}\n\nUpdateFlowNodeRefsBehavior.$inject = [\n  'eventBus',\n  'modeling'\n];\n\ninherits(UpdateFlowNodeRefsBehavior, CommandInterceptor);\n\n\nfunction UpdateContext() {\n\n  this.flowNodes = [];\n  this.lanes = [];\n\n  this.counter = 0;\n\n  this.addLane = function(lane) {\n    this.lanes.push(lane);\n  };\n\n  this.addFlowNode = function(flowNode) {\n    this.flowNodes.push(flowNode);\n  };\n\n  this.enter = function() {\n    this.counter++;\n  };\n\n  this.leave = function() {\n    this.counter--;\n\n    return !this.counter;\n  };\n}"
  },
  {
    "path": "lib/features/modeling/behavior/index.js",
    "content": "import AdaptiveLabelPositioningBehavior from './AdaptiveLabelPositioningBehavior';\nimport AppendBehavior from './AppendBehavior';\nimport AssociationBehavior from './AssociationBehavior';\nimport AttachEventBehavior from './AttachEventBehavior';\nimport BoundaryEventBehavior from './BoundaryEventBehavior';\nimport CompensateBoundaryEventBehavior from './CompensateBoundaryEventBehavior';\nimport CreateBehavior from './CreateBehavior';\nimport CreateDataObjectBehavior from './CreateDataObjectBehavior';\nimport CreateParticipantBehavior from './CreateParticipantBehavior';\nimport DataInputAssociationBehavior from './DataInputAssociationBehavior';\nimport DataStoreBehavior from './DataStoreBehavior';\nimport DeleteLaneBehavior from './DeleteLaneBehavior';\nimport DetachEventBehavior from './DetachEventBehavior';\nimport DropOnFlowBehavior from './DropOnFlowBehavior';\nimport EventBasedGatewayBehavior from './EventBasedGatewayBehavior';\nimport FixHoverBehavior from './FixHoverBehavior';\nimport GroupBehavior from './GroupBehavior';\nimport ImportDockingFix from './ImportDockingFix';\nimport IsHorizontalFix from './IsHorizontalFix';\nimport LabelBehavior from './LabelBehavior';\nimport LayoutConnectionBehavior from './LayoutConnectionBehavior';\nimport MessageFlowBehavior from './MessageFlowBehavior';\nimport NonInterruptingBehavior from './NonInterruptingBehavior';\nimport RemoveEmbeddedLabelBoundsBehavior from './RemoveEmbeddedLabelBoundsBehavior';\nimport RemoveElementBehavior from './RemoveElementBehavior';\nimport RemoveParticipantBehavior from './RemoveParticipantBehavior';\nimport ReplaceConnectionBehavior from './ReplaceConnectionBehavior';\nimport ReplaceElementBehaviour from './ReplaceElementBehaviour';\nimport ResizeBehavior from './ResizeBehavior';\nimport ResizeLaneBehavior from './ResizeLaneBehavior';\nimport RootElementReferenceBehavior from './RootElementReferenceBehavior';\nimport SpaceToolBehavior from './SpaceToolBehavior';\nimport SubProcessPlaneBehavior from './SubProcessPlaneBehavior';\nimport SubProcessStartEventBehavior from './SubProcessStartEventBehavior';\nimport TextAnnotationBehavior from './TextAnnotationBehavior';\nimport ToggleCollapseConnectionBehaviour from './ToggleCollapseConnectionBehaviour';\nimport ToggleElementCollapseBehaviour from './ToggleElementCollapseBehaviour';\nimport UnclaimIdBehavior from './UnclaimIdBehavior';\nimport UnsetDefaultFlowBehavior from './UnsetDefaultFlowBehavior';\nimport UpdateFlowNodeRefsBehavior from './UpdateFlowNodeRefsBehavior';\nimport SetCompensationActivityAfterPasteBehavior from './SetCompensationActivityAfterPasteBehavior';\n\n/**\n * @type { import('didi').ModuleDeclaration }\n */\nexport default {\n  __init__: [\n    'adaptiveLabelPositioningBehavior',\n    'appendBehavior',\n    'associationBehavior',\n    'attachEventBehavior',\n    'boundaryEventBehavior',\n    'compensateBoundaryEventBehaviour',\n    'createBehavior',\n    'createDataObjectBehavior',\n    'createParticipantBehavior',\n    'dataInputAssociationBehavior',\n    'dataStoreBehavior',\n    'deleteLaneBehavior',\n    'detachEventBehavior',\n    'dropOnFlowBehavior',\n    'eventBasedGatewayBehavior',\n    'fixHoverBehavior',\n    'groupBehavior',\n    'importDockingFix',\n    'isHorizontalFix',\n    'labelBehavior',\n    'layoutConnectionBehavior',\n    'messageFlowBehavior',\n    'nonInterruptingBehavior',\n    'removeElementBehavior',\n    'removeEmbeddedLabelBoundsBehavior',\n    'removeParticipantBehavior',\n    'replaceConnectionBehavior',\n    'replaceElementBehaviour',\n    'resizeBehavior',\n    'resizeLaneBehavior',\n    'rootElementReferenceBehavior',\n    'spaceToolBehavior',\n    'subProcessPlaneBehavior',\n    'subProcessStartEventBehavior',\n    'textAnnotationBehavior',\n    'toggleCollapseConnectionBehaviour',\n    'toggleElementCollapseBehaviour',\n    'unclaimIdBehavior',\n    'updateFlowNodeRefsBehavior',\n    'unsetDefaultFlowBehavior',\n    'setCompensationActivityAfterPasteBehavior'\n  ],\n  adaptiveLabelPositioningBehavior: [ 'type', AdaptiveLabelPositioningBehavior ],\n  appendBehavior: [ 'type', AppendBehavior ],\n  associationBehavior: [ 'type', AssociationBehavior ],\n  attachEventBehavior: [ 'type', AttachEventBehavior ],\n  boundaryEventBehavior: [ 'type', BoundaryEventBehavior ],\n  compensateBoundaryEventBehaviour: [ 'type', CompensateBoundaryEventBehavior ],\n  createBehavior: [ 'type', CreateBehavior ],\n  createDataObjectBehavior: [ 'type', CreateDataObjectBehavior ],\n  createParticipantBehavior: [ 'type', CreateParticipantBehavior ],\n  dataInputAssociationBehavior: [ 'type', DataInputAssociationBehavior ],\n  dataStoreBehavior: [ 'type', DataStoreBehavior ],\n  deleteLaneBehavior: [ 'type', DeleteLaneBehavior ],\n  detachEventBehavior: [ 'type', DetachEventBehavior ],\n  dropOnFlowBehavior: [ 'type', DropOnFlowBehavior ],\n  eventBasedGatewayBehavior: [ 'type', EventBasedGatewayBehavior ],\n  fixHoverBehavior: [ 'type', FixHoverBehavior ],\n  groupBehavior: [ 'type', GroupBehavior ],\n  importDockingFix: [ 'type', ImportDockingFix ],\n  isHorizontalFix: [ 'type', IsHorizontalFix ],\n  labelBehavior: [ 'type', LabelBehavior ],\n  layoutConnectionBehavior: [ 'type', LayoutConnectionBehavior ],\n  messageFlowBehavior: [ 'type', MessageFlowBehavior ],\n  nonInterruptingBehavior: [ 'type', NonInterruptingBehavior ],\n  removeElementBehavior: [ 'type', RemoveElementBehavior ],\n  removeEmbeddedLabelBoundsBehavior: [ 'type', RemoveEmbeddedLabelBoundsBehavior ],\n  removeParticipantBehavior: [ 'type', RemoveParticipantBehavior ],\n  replaceConnectionBehavior: [ 'type', ReplaceConnectionBehavior ],\n  replaceElementBehaviour: [ 'type', ReplaceElementBehaviour ],\n  resizeBehavior: [ 'type', ResizeBehavior ],\n  resizeLaneBehavior: [ 'type', ResizeLaneBehavior ],\n  rootElementReferenceBehavior: [ 'type', RootElementReferenceBehavior ],\n  spaceToolBehavior: [ 'type', SpaceToolBehavior ],\n  subProcessPlaneBehavior: [ 'type', SubProcessPlaneBehavior ],\n  subProcessStartEventBehavior: [ 'type', SubProcessStartEventBehavior ],\n  textAnnotationBehavior: [ 'type', TextAnnotationBehavior ],\n  toggleCollapseConnectionBehaviour: [ 'type', ToggleCollapseConnectionBehaviour ],\n  toggleElementCollapseBehaviour : [ 'type', ToggleElementCollapseBehaviour ],\n  unclaimIdBehavior: [ 'type', UnclaimIdBehavior ],\n  unsetDefaultFlowBehavior: [ 'type', UnsetDefaultFlowBehavior ],\n  updateFlowNodeRefsBehavior: [ 'type', UpdateFlowNodeRefsBehavior ],\n  setCompensationActivityAfterPasteBehavior: [ 'type', SetCompensationActivityAfterPasteBehavior ]\n};\n"
  },
  {
    "path": "lib/features/modeling/behavior/util/CategoryUtil.js",
    "content": "import {\n  add as collectionAdd,\n  remove as collectionRemove\n} from 'diagram-js/lib/util/Collections';\n\n/**\n * @typedef {import('../../BpmnFactory').default} BpmnFactory\n *\n * @typedef {import('../../../model/Types').ModdleElement} ModdleElement\n */\n\n/**\n * Creates a new bpmn:CategoryValue inside a new bpmn:Category\n *\n * @param {BpmnFactory} bpmnFactory\n *\n * @return {ModdleElement}\n */\nexport function createCategory(bpmnFactory) {\n  return bpmnFactory.create('bpmn:Category');\n}\n\n/**\n * Creates a new bpmn:CategoryValue inside a new bpmn:Category\n *\n * @param {BpmnFactory} bpmnFactory\n *\n * @return {ModdleElement}\n */\nexport function createCategoryValue(bpmnFactory) {\n  return bpmnFactory.create('bpmn:CategoryValue');\n}\n\n/**\n * Adds category value to definitions\n *\n * @param {ModdleElement} categoryValue\n * @param {ModdleElement} category\n * @param {ModdleElement} definitions\n *\n * @return {ModdleElement}\n */\nexport function linkCategoryValue(categoryValue, category, definitions) {\n  collectionAdd(category.get('categoryValue'), categoryValue);\n  categoryValue.$parent = category;\n\n  collectionAdd(definitions.get('rootElements'), category);\n  category.$parent = definitions;\n\n  return categoryValue;\n}\n\n/**\n * Unlink category value from parent\n *\n * @param {ModdleElement} categoryValue\n *\n * @return {ModdleElement}\n */\nexport function unlinkCategoryValue(categoryValue) {\n  var category = categoryValue.$parent;\n\n  if (category) {\n    collectionRemove(category.get('categoryValue'), categoryValue);\n    categoryValue.$parent = null;\n  }\n\n  return categoryValue;\n}\n\n/**\n * Unlink category from parent\n *\n * @param {ModdleElement} category\n *\n * @return {ModdleElement}\n */\nexport function unlinkCategory(category) {\n  var definitions = category.$parent;\n\n  if (definitions) {\n    collectionRemove(definitions.get('rootElements'), category);\n    category.$parent = null;\n  }\n\n  return category;\n}"
  },
  {
    "path": "lib/features/modeling/behavior/util/ConnectionLayoutUtil.js",
    "content": "import { getAnchorPointAdjustment } from './LayoutUtil';\n\n/**\n * @typedef {import('diagram-js/lib/util/Types').Point} Point\n *\n * @typedef {import('./LayoutUtil').FindNewLineStartIndexHints} FindNewLineStartIndexHints\n */\n\n/**\n * Calculate the new point after the connection waypoints got updated.\n *\n * @param {Point} position\n * @param {Point[]} newWaypoints\n * @param {Point[]} oldWaypoints\n * @param {FindNewLineStartIndexHints} hints\n *\n * @return {Point}\n */\nexport function getConnectionAdjustment(position, newWaypoints, oldWaypoints, hints) {\n  return getAnchorPointAdjustment(position, newWaypoints, oldWaypoints, hints).point;\n}\n\n"
  },
  {
    "path": "lib/features/modeling/behavior/util/GeometricUtil.js",
    "content": "export * from 'diagram-js/lib/features/bendpoints/GeometricUtil';"
  },
  {
    "path": "lib/features/modeling/behavior/util/LabelLayoutUtil.js",
    "content": "import { findNewLineStartIndex, getAnchorPointAdjustment } from './LayoutUtil';\n\nimport { getMid } from 'diagram-js/lib/layout/LayoutUtil';\n\n/**\n * @typedef {import('./LineAttachmentUtil').Attachment} Attachment\n *\n * @typedef {import('./LayoutUtil').FindNewLineStartIndexHints} FindNewLineStartIndexHints\n *\n * @typedef {import('../../../../model/Types').Label} Label\n *\n * @typedef {import('diagram-js/lib/util/Types').Point} Point\n */\n\n/**\n * @param {Point[]} oldWaypoints\n * @param {Point[]} newWaypoints\n * @param {Attachment} attachment\n * @param {FindNewLineStartIndexHints} hints\n *\n * @return {number}\n */\nexport function findNewLabelLineStartIndex(oldWaypoints, newWaypoints, attachment, hints) {\n  return findNewLineStartIndex(oldWaypoints, newWaypoints, attachment, hints);\n}\n\n/**\n * Calculate the required adjustment (move delta) for the given label\n * after the connection waypoints got updated.\n *\n * @param {Label} label\n * @param {Point[]} newWaypoints\n * @param {Point[]} oldWaypoints\n * @param {FindNewLineStartIndexHints} hints\n *\n * @return {Point}\n */\nexport function getLabelAdjustment(label, newWaypoints, oldWaypoints, hints) {\n  var labelPosition = getMid(label);\n\n  return getAnchorPointAdjustment(labelPosition, newWaypoints, oldWaypoints, hints).delta;\n}"
  },
  {
    "path": "lib/features/modeling/behavior/util/LayoutUtil.js",
    "content": "import {\n  getDistancePointPoint,\n  rotateVector,\n  getAngle\n} from './GeometricUtil';\n\nimport {\n  getAttachment\n} from './LineAttachmentUtil';\n\nimport {\n  roundPoint\n} from 'diagram-js/lib/layout/LayoutUtil';\n\n/**\n * @typedef {import('diagram-js/lib/util/Types').Point} Point\n *\n * @typedef {import('./LineAttachmentUtil').Attachment} Attachment\n *\n * @typedef { {\n *   point: Point;\n *   delta: Point;\n * } } AnchorPointAdjustment\n *\n * @typedef { {\n *   segmentMove?: {\n*     segmentStartIndex: number;\n*     newSegmentStartIndex: number;\n*   };\n*   bendpointMove?: {\n*     insert: boolean;\n*     bendpointIndex: number;\n*   };\n*   connectionStart: boolean;\n*   connectionEnd: boolean;\n* } } FindNewLineStartIndexHints\n */\n\n/**\n * @param {Point[]} oldWaypoints\n * @param {Point[]} newWaypoints\n * @param {Attachment} attachment\n * @param {FindNewLineStartIndexHints} hints\n *\n * @return {number}\n */\nexport function findNewLineStartIndex(oldWaypoints, newWaypoints, attachment, hints) {\n\n  var index = attachment.segmentIndex;\n\n  var offset = newWaypoints.length - oldWaypoints.length;\n\n  // segmentMove happened\n  if (hints.segmentMove) {\n\n    var oldSegmentStartIndex = hints.segmentMove.segmentStartIndex,\n        newSegmentStartIndex = hints.segmentMove.newSegmentStartIndex;\n\n    // if point was on moved segment return new segment index\n    if (index === oldSegmentStartIndex) {\n      return newSegmentStartIndex;\n    }\n\n    // point is after new segment index\n    if (index >= newSegmentStartIndex) {\n      return (index + offset < newSegmentStartIndex) ? newSegmentStartIndex : index + offset;\n    }\n\n    // if point is before new segment index\n    return index;\n  }\n\n  // bendpointMove happened\n  if (hints.bendpointMove) {\n\n    var insert = hints.bendpointMove.insert,\n        bendpointIndex = hints.bendpointMove.bendpointIndex,\n        newIndex;\n\n    // waypoints length didnt change\n    if (offset === 0) {\n      return index;\n    }\n\n    // point behind new/removed bendpoint\n    if (index >= bendpointIndex) {\n      newIndex = insert ? index + 1 : index - 1;\n    }\n\n    // point before new/removed bendpoint\n    if (index < bendpointIndex) {\n\n      newIndex = index;\n\n      // decide point should take right or left segment\n      if (insert && attachment.type !== 'bendpoint' && bendpointIndex - 1 === index) {\n\n        var rel = relativePositionMidWaypoint(newWaypoints, bendpointIndex);\n\n        if (rel < attachment.relativeLocation) {\n          newIndex++;\n        }\n      }\n    }\n\n    return newIndex;\n  }\n\n  // start/end changed\n  if (offset === 0) {\n    return index;\n  }\n\n  if (hints.connectionStart && index === 0) {\n    return 0;\n  }\n\n  if (hints.connectionEnd && index === oldWaypoints.length - 2) {\n    return newWaypoints.length - 2;\n  }\n\n  // if nothing fits, take the middle segment\n  return Math.floor((newWaypoints.length - 2) / 2);\n}\n\n\n/**\n * Calculate the required adjustment (move delta) for the given point\n * after the connection waypoints got updated.\n *\n * @param {Point} position\n * @param {Point[]} newWaypoints\n * @param {Point[]} oldWaypoints\n * @param {FindNewLineStartIndexHints} hints\n *\n * @return {AnchorPointAdjustment} result\n */\nexport function getAnchorPointAdjustment(position, newWaypoints, oldWaypoints, hints) {\n\n  var dx = 0,\n      dy = 0;\n\n  var oldPosition = {\n    point: position,\n    delta: { x: 0, y: 0 }\n  };\n\n  // get closest attachment\n  var attachment = getAttachment(position, oldWaypoints),\n      oldLabelLineIndex = attachment.segmentIndex,\n      newLabelLineIndex = findNewLineStartIndex(oldWaypoints, newWaypoints, attachment, hints);\n\n\n  // should never happen\n  // TODO(@janstuemmel): throw an error here when connectionSegmentMove is refactored\n  if (newLabelLineIndex < 0 ||\n      newLabelLineIndex > newWaypoints.length - 2 ||\n      newLabelLineIndex === null) {\n    return oldPosition;\n  }\n\n  var oldLabelLine = getLine(oldWaypoints, oldLabelLineIndex),\n      newLabelLine = getLine(newWaypoints, newLabelLineIndex),\n      oldFoot = attachment.position;\n\n  var relativeFootPosition = getRelativeFootPosition(oldLabelLine, oldFoot),\n      angleDelta = getAngleDelta(oldLabelLine, newLabelLine);\n\n  // special rule if label on bendpoint\n  if (attachment.type === 'bendpoint') {\n\n    var offset = newWaypoints.length - oldWaypoints.length,\n        oldBendpointIndex = attachment.bendpointIndex,\n        oldBendpoint = oldWaypoints[oldBendpointIndex];\n\n    // bendpoint position hasn't changed, return same position\n    if (newWaypoints.indexOf(oldBendpoint) !== -1) {\n      return oldPosition;\n    }\n\n    // new bendpoint and old bendpoint have same index, then just return the offset\n    if (offset === 0) {\n      var newBendpoint = newWaypoints[oldBendpointIndex];\n\n      dx = newBendpoint.x - attachment.position.x,\n      dy = newBendpoint.y - attachment.position.y;\n\n      return {\n        delta: {\n          x: dx,\n          y: dy\n        },\n        point: {\n          x: position.x + dx,\n          y: position.y + dy\n        }\n      };\n    }\n\n    // if bendpoints get removed\n    if (offset < 0 && oldBendpointIndex !== 0 && oldBendpointIndex < oldWaypoints.length - 1) {\n      relativeFootPosition = relativePositionMidWaypoint(oldWaypoints, oldBendpointIndex);\n    }\n  }\n\n  var newFoot = {\n    x: (newLabelLine[1].x - newLabelLine[0].x) * relativeFootPosition + newLabelLine[0].x,\n    y: (newLabelLine[1].y - newLabelLine[0].y) * relativeFootPosition + newLabelLine[0].y\n  };\n\n  // the rotated vector to label\n  var newLabelVector = rotateVector({\n    x: position.x - oldFoot.x,\n    y: position.y - oldFoot.y\n  }, angleDelta);\n\n  // the new relative position\n  dx = newFoot.x + newLabelVector.x - position.x;\n  dy = newFoot.y + newLabelVector.y - position.y;\n\n  return {\n    point: roundPoint(newFoot),\n    delta: roundPoint({\n      x: dx,\n      y: dy\n    })\n  };\n}\n\n\n// HELPERS //////////////////////\n\nfunction relativePositionMidWaypoint(waypoints, idx) {\n\n  var distanceSegment1 = getDistancePointPoint(waypoints[idx - 1], waypoints[idx]),\n      distanceSegment2 = getDistancePointPoint(waypoints[idx], waypoints[idx + 1]);\n\n  var relativePosition = distanceSegment1 / (distanceSegment1 + distanceSegment2);\n\n  return relativePosition;\n}\n\nfunction getAngleDelta(l1, l2) {\n  var a1 = getAngle(l1),\n      a2 = getAngle(l2);\n  return a2 - a1;\n}\n\nfunction getLine(waypoints, idx) {\n  return [ waypoints[idx], waypoints[idx + 1] ];\n}\n\nfunction getRelativeFootPosition(line, foot) {\n\n  var length = getDistancePointPoint(line[0], line[1]),\n      lengthToFoot = getDistancePointPoint(line[0], foot);\n\n  return length === 0 ? 0 : lengthToFoot / length;\n}\n"
  },
  {
    "path": "lib/features/modeling/behavior/util/LineAttachmentUtil.js",
    "content": "/**\n * @typedef {import('diagram-js/lib/util/Types').Point} Point\n *\n * @typedef { {\n*   type: 'bendpoint' | 'segment';\n*   position: Point;\n*   segmentIndex: number;\n*   bendpointIndex?: number;\n*   relativeLocation?: number;\n* } } Attachment\n*/\n\nvar sqrt = Math.sqrt,\n    min = Math.min,\n    max = Math.max,\n    abs = Math.abs;\n\n/**\n * Calculate the square (power to two) of a number.\n *\n * @param {number} n\n *\n * @return {number}\n */\nfunction sq(n) {\n  return Math.pow(n, 2);\n}\n\n/**\n * Get distance between two points.\n *\n * @param {Point} p1\n * @param {Point} p2\n *\n * @return {number}\n */\nfunction getDistance(p1, p2) {\n  return sqrt(sq(p1.x - p2.x) + sq(p1.y - p2.y));\n}\n\n/**\n * Return the attachment of the given point on the specified line.\n *\n * The attachment is either a bendpoint (attached to the given point)\n * or segment (attached to a location on a line segment) attachment:\n *\n * ```javascript\n * var pointAttachment = {\n *   type: 'bendpoint',\n *   bendpointIndex: 3,\n *   position: { x: 10, y: 10 } // the attach point on the line\n * };\n *\n * var segmentAttachment = {\n *   type: 'segment',\n *   segmentIndex: 2,\n *   relativeLocation: 0.31, // attach point location between 0 (at start) and 1 (at end)\n *   position: { x: 10, y: 10 } // the attach point on the line\n * };\n * ```\n *\n * @param {Point} point\n * @param {Point[]} line\n *\n * @return {Attachment}\n */\nexport function getAttachment(point, line) {\n\n  var idx = 0,\n      segmentStart,\n      segmentEnd,\n      segmentStartDistance,\n      segmentEndDistance,\n      attachmentPosition,\n      minDistance,\n      intersections,\n      attachment,\n      attachmentDistance,\n      closestAttachmentDistance,\n      closestAttachment;\n\n  for (idx = 0; idx < line.length - 1; idx++) {\n\n    segmentStart = line[idx];\n    segmentEnd = line[idx + 1];\n\n    if (pointsEqual(segmentStart, segmentEnd)) {\n      intersections = [ segmentStart ];\n    } else {\n      segmentStartDistance = getDistance(point, segmentStart);\n      segmentEndDistance = getDistance(point, segmentEnd);\n\n      minDistance = min(segmentStartDistance, segmentEndDistance);\n\n      intersections = getCircleSegmentIntersections(segmentStart, segmentEnd, point, minDistance);\n    }\n\n    if (intersections.length < 1) {\n      throw new Error('expected between [1, 2] circle -> line intersections');\n    }\n\n    // one intersection -> bendpoint attachment\n    if (intersections.length === 1) {\n      attachment = {\n        type: 'bendpoint',\n        position: intersections[0],\n        segmentIndex: idx,\n        bendpointIndex: pointsEqual(segmentStart, intersections[0]) ? idx : idx + 1\n      };\n    }\n\n    // two intersections -> segment attachment\n    if (intersections.length === 2) {\n\n      attachmentPosition = mid(intersections[0], intersections[1]);\n\n      attachment = {\n        type: 'segment',\n        position: attachmentPosition,\n        segmentIndex: idx,\n        relativeLocation: getDistance(segmentStart, attachmentPosition) / getDistance(segmentStart, segmentEnd)\n      };\n    }\n\n    attachmentDistance = getDistance(attachment.position, point);\n\n    if (!closestAttachment || closestAttachmentDistance > attachmentDistance) {\n      closestAttachment = attachment;\n      closestAttachmentDistance = attachmentDistance;\n    }\n  }\n\n  return closestAttachment;\n}\n\n/**\n * Get the intersection between a circle and a line segment.\n *\n * @param {Point} s1 segment start\n * @param {Point} s2 segment end\n * @param {Point} cc circle center\n * @param {number} cr circle radius\n *\n * @return {Point[]} intersections\n */\nfunction getCircleSegmentIntersections(s1, s2, cc, cr) {\n\n  var baX = s2.x - s1.x;\n  var baY = s2.y - s1.y;\n  var caX = cc.x - s1.x;\n  var caY = cc.y - s1.y;\n\n  var a = baX * baX + baY * baY;\n  var bBy2 = baX * caX + baY * caY;\n  var c = caX * caX + caY * caY - cr * cr;\n\n  var pBy2 = bBy2 / a;\n  var q = c / a;\n\n  var disc = pBy2 * pBy2 - q;\n\n  // check against negative value to work around\n  // negative, very close to zero results (-4e-15)\n  // being produced in some environments\n  if (disc < 0 && disc > -0.000001) {\n    disc = 0;\n  }\n\n  if (disc < 0) {\n    return [];\n  }\n\n  // if disc == 0 ... dealt with later\n  var tmpSqrt = sqrt(disc);\n  var abScalingFactor1 = -pBy2 + tmpSqrt;\n  var abScalingFactor2 = -pBy2 - tmpSqrt;\n\n  var i1 = {\n    x: s1.x - baX * abScalingFactor1,\n    y: s1.y - baY * abScalingFactor1\n  };\n\n  if (disc === 0) { // abScalingFactor1 == abScalingFactor2\n    return [ i1 ];\n  }\n\n  var i2 = {\n    x: s1.x - baX * abScalingFactor2,\n    y: s1.y - baY * abScalingFactor2\n  };\n\n  // return only points on line segment\n  return [ i1, i2 ].filter(function(p) {\n    return isPointInSegment(p, s1, s2);\n  });\n}\n\n\nfunction isPointInSegment(p, segmentStart, segmentEnd) {\n  return (\n    fenced(p.x, segmentStart.x, segmentEnd.x) &&\n    fenced(p.y, segmentStart.y, segmentEnd.y)\n  );\n}\n\nfunction fenced(n, rangeStart, rangeEnd) {\n\n  // use matching threshold to work around\n  // precision errors in intersection computation\n\n  return (\n    n >= min(rangeStart, rangeEnd) - EQUAL_THRESHOLD &&\n    n <= max(rangeStart, rangeEnd) + EQUAL_THRESHOLD\n  );\n}\n\n/**\n * Calculate the mid between two points.\n *\n * @param {Point} p1\n * @param {Point} p2\n *\n * @return {Point}\n */\nfunction mid(p1, p2) {\n\n  return {\n    x: (p1.x + p2.x) / 2,\n    y: (p1.y + p2.y) / 2\n  };\n}\n\nvar EQUAL_THRESHOLD = 0.1;\n\nfunction pointsEqual(p1, p2) {\n\n  return (\n    abs(p1.x - p2.x) <= EQUAL_THRESHOLD &&\n    abs(p1.y - p2.y) <= EQUAL_THRESHOLD\n  );\n}\n"
  },
  {
    "path": "lib/features/modeling/behavior/util/LineIntersect.js",
    "content": "/**\n * @typedef {import('diagram-js/lib/util/Types').Point} Point\n */\n\n/**\n * Returns the intersection between two line segments a and b.\n *\n * @param {Point} l1s\n * @param {Point} l1e\n * @param {Point} l2s\n * @param {Point} l2e\n *\n * @return {Point}\n */\nexport default function lineIntersect(l1s, l1e, l2s, l2e) {\n\n  // if the lines intersect, the result contains the x and y of the\n  // intersection (treating the lines as infinite) and booleans for\n  // whether line segment 1 or line segment 2 contain the point\n  var denominator, a, b, c, numerator;\n\n  denominator = ((l2e.y - l2s.y) * (l1e.x - l1s.x)) - ((l2e.x - l2s.x) * (l1e.y - l1s.y));\n\n  if (denominator == 0) {\n    return null;\n  }\n\n  a = l1s.y - l2s.y;\n  b = l1s.x - l2s.x;\n  numerator = ((l2e.x - l2s.x) * a) - ((l2e.y - l2s.y) * b);\n\n  c = numerator / denominator;\n\n  // if we cast these lines infinitely in\n  // both directions, they intersect here\n  return {\n    x: Math.round(l1s.x + (c * (l1e.x - l1s.x))),\n    y: Math.round(l1s.y + (c * (l1e.y - l1s.y)))\n  };\n}"
  },
  {
    "path": "lib/features/modeling/behavior/util/NonInterruptingUtil.js",
    "content": "import { isEventSubProcess } from '../../../../util/DiUtil';\nimport { getBusinessObject, is } from '../../../../util/ModelUtil';\n\nexport const NON_INTERRUPTING_EVENT_TYPES = [\n  'bpmn:MessageEventDefinition',\n  'bpmn:TimerEventDefinition',\n  'bpmn:EscalationEventDefinition',\n  'bpmn:ConditionalEventDefinition',\n  'bpmn:SignalEventDefinition'\n];\n\nexport function canBeNonInterrupting(shape) {\n\n  const businessObject = getBusinessObject(shape);\n\n  if (\n    !is(businessObject, 'bpmn:BoundaryEvent') &&\n    !(is(businessObject, 'bpmn:StartEvent') && isEventSubProcess(businessObject.$parent))\n  ) {\n    return false;\n  }\n\n  const eventDefinitions = businessObject.get('eventDefinitions');\n  if (!eventDefinitions || !eventDefinitions.length) {\n    return false;\n  }\n\n  return NON_INTERRUPTING_EVENT_TYPES.some(event => is(eventDefinitions[0], event));\n}\n\nexport function getInterruptingProperty(shape) {\n  return is(shape, 'bpmn:BoundaryEvent') ? 'cancelActivity' : 'isInterrupting';\n}"
  },
  {
    "path": "lib/features/modeling/behavior/util/ResizeUtil.js",
    "content": "export { getParticipantResizeConstraints } from '../ResizeBehavior';"
  },
  {
    "path": "lib/features/modeling/cmd/AddLaneHandler.js",
    "content": "import {\n  filter\n} from 'min-dash';\n\nimport {\n  eachElement\n} from 'diagram-js/lib/util/Elements';\n\nimport {\n  getLanesRoot,\n  getChildLanes,\n  LANE_INDENTATION\n} from '../util/LaneUtil';\n\nimport {\n  isHorizontal\n} from '../../../util/DiUtil';\n\n/**\n * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n *\n * @typedef {import('../Modeling').default} Modeling\n * @typedef {import('../../space-tool/BpmnSpaceTool').default} SpaceTool\n */\n\n/**\n * A handler that allows us to add a new lane\n * above or below an existing one.\n *\n * @implements {CommandHandler}\n *\n * @param {Modeling} modeling\n * @param {SpaceTool} spaceTool\n */\nexport default function AddLaneHandler(modeling, spaceTool) {\n  this._modeling = modeling;\n  this._spaceTool = spaceTool;\n}\n\nAddLaneHandler.$inject = [\n  'modeling',\n  'spaceTool'\n];\n\n\nAddLaneHandler.prototype.preExecute = function(context) {\n\n  var spaceTool = this._spaceTool,\n      modeling = this._modeling;\n\n  var shape = context.shape,\n      location = context.location;\n\n  var lanesRoot = getLanesRoot(shape);\n\n  var isRoot = lanesRoot === shape,\n      laneParent = isRoot ? shape : shape.parent;\n\n  var existingChildLanes = getChildLanes(laneParent);\n\n  var isHorizontalLane = isHorizontal(shape);\n\n  // never mix up horizontal/vertical lanes\n  if (isHorizontalLane) {\n    if (location === 'left') {\n      location = 'top';\n    } else if (location === 'right') {\n      location = 'bottom';\n    }\n  } else {\n    if (location === 'top') {\n      location = 'left';\n    } else if (location === 'bottom') {\n      location = 'right';\n    }\n  }\n\n  // (0) add a lane if we currently got none and are adding to root\n  if (!existingChildLanes.length) {\n    var siblingPosition = isHorizontalLane ? {\n      x: shape.x + LANE_INDENTATION,\n      y: shape.y,\n      width: shape.width - LANE_INDENTATION,\n      height: shape.height\n    } : {\n      x: shape.x,\n      y: shape.y + LANE_INDENTATION,\n      width: shape.width,\n      height: shape.height - LANE_INDENTATION\n    };\n\n    modeling.createShape(\n      {\n        type: 'bpmn:Lane',\n        isHorizontal: isHorizontalLane\n      },\n      siblingPosition,\n      laneParent\n    );\n  }\n\n  // (1) collect affected elements to create necessary space\n  var allAffected = [];\n\n  eachElement(lanesRoot, function(element) {\n    allAffected.push(element);\n\n    // handle element labels in the diagram root\n    if (element.label) {\n      allAffected.push(element.label);\n    }\n\n    if (element === shape) {\n      return [];\n    }\n\n    return filter(element.children, function(c) {\n      return c !== shape;\n    });\n  });\n\n  var offset,\n      lanePosition,\n      spacePos,\n      direction,\n      axis;\n\n  if (location === 'top') {\n    offset = -120;\n    lanePosition = shape.y;\n    spacePos = lanePosition + 10;\n    direction = 'n';\n    axis = 'y';\n  } else if (location === 'left') {\n    offset = -120;\n    lanePosition = shape.x;\n    spacePos = lanePosition + 10;\n    direction = 'w';\n    axis = 'x';\n  } else if (location === 'bottom') {\n    offset = 120;\n    lanePosition = shape.y + shape.height;\n    spacePos = lanePosition - 10;\n    direction = 's';\n    axis = 'y';\n  } else if (location === 'right') {\n    offset = 120;\n    lanePosition = shape.x + shape.width;\n    spacePos = lanePosition - 10;\n    direction = 'e';\n    axis = 'x';\n  }\n\n  var adjustments = spaceTool.calculateAdjustments(allAffected, axis, offset, spacePos);\n\n  var delta = isHorizontalLane ? { x: 0, y: offset } : { x: offset, y: 0 };\n\n  spaceTool.makeSpace(\n    adjustments.movingShapes,\n    adjustments.resizingShapes,\n    delta,\n    direction,\n    spacePos\n  );\n\n  // (2) create new lane at open space\n  var newLanePosition = isHorizontalLane ? {\n    x: shape.x + (isRoot ? LANE_INDENTATION : 0),\n    y: lanePosition - (location === 'top' ? 120 : 0),\n    width: shape.width - (isRoot ? LANE_INDENTATION : 0),\n    height: 120\n  } : {\n    x: lanePosition - (location === 'left' ? 120 : 0),\n    y: shape.y + (isRoot ? LANE_INDENTATION : 0),\n    width: 120,\n    height: shape.height - (isRoot ? LANE_INDENTATION : 0)\n  };\n\n  context.newLane = modeling.createShape(\n    {\n      type: 'bpmn:Lane',\n      isHorizontal: isHorizontalLane\n    },\n    newLanePosition,\n    laneParent\n  );\n};\n"
  },
  {
    "path": "lib/features/modeling/cmd/IdClaimHandler.js",
    "content": "/**\n * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n *\n * @typedef {import('../../../model/Types').Moddle} Moddle\n */\n\n/**\n * @implements {CommandHandler}\n *\n * @param {Moddle} moddle\n */\nexport default function IdClaimHandler(moddle) {\n  this._moddle = moddle;\n}\n\nIdClaimHandler.$inject = [ 'moddle' ];\n\n\nIdClaimHandler.prototype.execute = function(context) {\n  var ids = this._moddle.ids,\n      id = context.id,\n      element = context.element,\n      claiming = context.claiming;\n\n  if (claiming) {\n    ids.claim(id, element);\n  } else {\n    ids.unclaim(id);\n  }\n\n  return [];\n};\n\n/**\n * Command revert implementation.\n */\nIdClaimHandler.prototype.revert = function(context) {\n  var ids = this._moddle.ids,\n      id = context.id,\n      element = context.element,\n      claiming = context.claiming;\n\n  if (claiming) {\n    ids.unclaim(id);\n  } else {\n    ids.claim(id, element);\n  }\n\n  return [];\n};\n\n"
  },
  {
    "path": "lib/features/modeling/cmd/ResizeLaneHandler.js",
    "content": "import { is } from '../../../util/ModelUtil';\n\nimport {\n  getLanesRoot,\n  computeLanesResize\n} from '../util/LaneUtil';\n\nimport {\n  eachElement\n} from 'diagram-js/lib/util/Elements';\n\nimport {\n  asTRBL\n} from 'diagram-js/lib/layout/LayoutUtil';\n\nimport {\n  substractTRBL\n} from 'diagram-js/lib/features/resize/ResizeUtil';\n\n/**\n * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n *\n * @typedef {import('../Modeling').default} Modeling\n * @typedef {import('../../space-tool/BpmnSpaceTool').default} SpaceTool\n *\n * @typedef {import('../../../model/Types').Shape} Shape\n *\n * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n */\n\n/**\n * A handler that resizes a lane.\n *\n * @implements {CommandHandler}\n *\n * @param {Modeling} modeling\n * @param {SpaceTool} spaceTool\n */\nexport default function ResizeLaneHandler(modeling, spaceTool) {\n  this._modeling = modeling;\n  this._spaceTool = spaceTool;\n}\n\nResizeLaneHandler.$inject = [\n  'modeling',\n  'spaceTool'\n];\n\n\nResizeLaneHandler.prototype.preExecute = function(context) {\n\n  var shape = context.shape,\n      newBounds = context.newBounds,\n      balanced = context.balanced;\n\n  if (balanced !== false) {\n    this.resizeBalanced(shape, newBounds);\n  } else {\n    this.resizeSpace(shape, newBounds);\n  }\n};\n\n\n/**\n * Resize balanced, adjusting next / previous lane sizes.\n *\n * @param {Shape} shape\n * @param {Rect} newBounds\n */\nResizeLaneHandler.prototype.resizeBalanced = function(shape, newBounds) {\n\n  var modeling = this._modeling;\n\n  var resizeNeeded = computeLanesResize(shape, newBounds);\n\n  // resize the lane\n  modeling.resizeShape(shape, newBounds);\n\n  // resize other lanes as needed\n  resizeNeeded.forEach(function(r) {\n    modeling.resizeShape(r.shape, r.newBounds);\n  });\n};\n\n\n/**\n * Resize, making actual space and moving below / above elements.\n *\n * @param {Shape} shape\n * @param {Rect} newBounds\n */\nResizeLaneHandler.prototype.resizeSpace = function(shape, newBounds) {\n  var spaceTool = this._spaceTool;\n\n  var shapeTrbl = asTRBL(shape),\n      newTrbl = asTRBL(newBounds);\n\n  var trblDiff = substractTRBL(newTrbl, shapeTrbl);\n\n  var lanesRoot = getLanesRoot(shape);\n\n  var allAffected = [],\n      allLanes = [];\n\n  eachElement(lanesRoot, function(element) {\n    allAffected.push(element);\n\n    if (is(element, 'bpmn:Lane') || is(element, 'bpmn:Participant')) {\n      allLanes.push(element);\n    }\n\n    return element.children;\n  });\n\n  var change,\n      spacePos,\n      direction,\n      offset,\n      adjustments;\n\n  if (trblDiff.bottom || trblDiff.top) {\n\n    change = trblDiff.bottom || trblDiff.top;\n    spacePos = shape.y + (trblDiff.bottom ? shape.height : 0) + (trblDiff.bottom ? -10 : 10);\n    direction = trblDiff.bottom ? 's' : 'n';\n\n    offset = trblDiff.top > 0 || trblDiff.bottom < 0 ? -change : change;\n\n    adjustments = spaceTool.calculateAdjustments(allAffected, 'y', offset, spacePos);\n\n    spaceTool.makeSpace(adjustments.movingShapes, adjustments.resizingShapes, { x: 0, y: change }, direction);\n  }\n\n\n  if (trblDiff.left || trblDiff.right) {\n\n    change = trblDiff.right || trblDiff.left;\n    spacePos = shape.x + (trblDiff.right ? shape.width : 0) + (trblDiff.right ? -10 : 100);\n    direction = trblDiff.right ? 'e' : 'w';\n\n    offset = trblDiff.left > 0 || trblDiff.right < 0 ? -change : change;\n\n    adjustments = spaceTool.calculateAdjustments(allLanes, 'x', offset, spacePos);\n\n    spaceTool.makeSpace(adjustments.movingShapes, adjustments.resizingShapes, { x: change, y: 0 }, direction);\n  }\n};"
  },
  {
    "path": "lib/features/modeling/cmd/SetColorHandler.js",
    "content": "import {\r\n  assign,\r\n  forEach,\r\n  isString,\r\n  pick\r\n} from 'min-dash';\r\n\r\nimport {\r\n  getDi,\r\n  isAny\r\n} from '../../../util/ModelUtil';\r\n\r\nimport {\r\n  isLabel\r\n} from '../../../util/LabelUtil';\r\n\r\nimport { isConnection } from 'diagram-js/lib/util/ModelUtil';\r\n\r\n/**\r\n * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\r\n *\r\n * @typedef {import('diagram-js/lib/command/CommandStack').default} CommandStack\r\n *\r\n * @typedef {import('../../../model/Types').ModdleElement} ModdleElement\r\n */\r\n\r\nvar DEFAULT_COLORS = {\r\n  fill: undefined,\r\n  stroke: undefined\r\n};\r\n\r\n/**\r\n * @implements {CommandHandler}\r\n *\r\n * @param {CommandStack} commandStack\r\n */\r\nexport default function SetColorHandler(commandStack) {\r\n  this._commandStack = commandStack;\r\n\r\n  this._normalizeColor = function(color) {\r\n\r\n    // Remove color for falsy values.\r\n    if (!color) {\r\n      return undefined;\r\n    }\r\n\r\n    if (isString(color)) {\r\n      var hexColor = colorToHex(color);\r\n\r\n      if (hexColor) {\r\n        return hexColor;\r\n      }\r\n    }\r\n\r\n    throw new Error(`invalid color value: ${ color }`);\r\n  };\r\n}\r\n\r\nSetColorHandler.$inject = [\r\n  'commandStack'\r\n];\r\n\r\n\r\nSetColorHandler.prototype.postExecute = function(context) {\r\n  var elements = context.elements,\r\n      colors = context.colors || DEFAULT_COLORS;\r\n\r\n  var self = this;\r\n\r\n  var di = {};\r\n\r\n  if ('fill' in colors) {\r\n    assign(di, {\r\n      'background-color': this._normalizeColor(colors.fill) });\r\n  }\r\n\r\n  if ('stroke' in colors) {\r\n    assign(di, {\r\n      'border-color': this._normalizeColor(colors.stroke) });\r\n  }\r\n\r\n  forEach(elements, function(element) {\r\n    var assignedDi = isConnection(element) ? pick(di, [ 'border-color' ]) : di,\r\n        elementDi = getDi(element);\r\n\r\n    // TODO @barmac: remove once we drop bpmn.io properties\r\n    ensureLegacySupport(assignedDi);\r\n\r\n    if (isLabel(element)) {\r\n\r\n      // set label colors as bpmndi:BPMNLabel#color\r\n      self._commandStack.execute('element.updateModdleProperties', {\r\n        element: element,\r\n        moddleElement: elementDi.label,\r\n        properties: {\r\n          color: di['border-color']\r\n        }\r\n      });\r\n    } else {\r\n\r\n      // ignore non-compliant di\r\n      if (!isAny(elementDi, [ 'bpmndi:BPMNEdge', 'bpmndi:BPMNShape' ])) {\r\n        return;\r\n      }\r\n\r\n      // set colors bpmndi:BPMNEdge or bpmndi:BPMNShape\r\n      self._commandStack.execute('element.updateProperties', {\r\n        element: element,\r\n        properties: {\r\n          di: assignedDi\r\n        }\r\n      });\r\n    }\r\n  });\r\n\r\n};\r\n\r\n/**\r\n * Convert color from rgb(a)/hsl to hex. Returns `null` for unknown color names\r\n * and for colors with alpha less than 1.0. This depends on `<canvas>`\r\n * serialization of the `context.fillStyle`.\r\n * Cf. https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-fillstyle\r\n *\r\n * @example\r\n *\r\n * ```javascript\r\n * colorToHex('fuchsia'); // \"#ff00ff\"\r\n *\r\n * colorToHex('rgba(1, 2, 3, 0.4)'); // null\r\n * ```\r\n *\r\n * @param {string} color\r\n *\r\n * @return {string|null}\r\n */\r\nfunction colorToHex(color) {\r\n  var context = document.createElement('canvas').getContext('2d');\r\n\r\n  // (0) Start with transparent to account for browser default values.\r\n  context.fillStyle = 'transparent';\r\n\r\n  // (1) Assign color so that it's serialized.\r\n  context.fillStyle = color;\r\n\r\n  // (2) Return null for non-hex serialization result.\r\n  return /^#[0-9a-fA-F]{6}$/.test(context.fillStyle) ? context.fillStyle : null;\r\n}\r\n\r\n/**\r\n * Add legacy properties if required.\r\n *\r\n * @param {ModdleElement} di\r\n */\r\nfunction ensureLegacySupport(di) {\r\n  if ('border-color' in di) {\r\n    di.stroke = di['border-color'];\r\n  }\r\n\r\n  if ('background-color' in di) {\r\n    di.fill = di['background-color'];\r\n  }\r\n}\r\n"
  },
  {
    "path": "lib/features/modeling/cmd/SplitLaneHandler.js",
    "content": "import {\n  getChildLanes,\n  LANE_INDENTATION\n} from '../util/LaneUtil';\n\nimport {\n  isHorizontal\n} from '../../../util/DiUtil';\n\n/**\n * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n *\n * @typedef {import('../Modeling').default} Modeling\n */\n\n/**\n * A handler that splits a lane into a number of sub-lanes,\n * creating new sub lanes, if necessary.\n *\n * @implements {CommandHandler}\n *\n * @param {Modeling} modeling\n */\nexport default function SplitLaneHandler(modeling) {\n  this._modeling = modeling;\n}\n\nSplitLaneHandler.$inject = [\n  'modeling'\n];\n\n\nSplitLaneHandler.prototype.preExecute = function(context) {\n\n  var modeling = this._modeling;\n\n  var shape = context.shape,\n      newLanesCount = context.count;\n\n  var childLanes = getChildLanes(shape),\n      existingLanesCount = childLanes.length;\n\n  if (existingLanesCount > newLanesCount) {\n    throw new Error(`more than <${ newLanesCount }> child lanes`);\n  }\n\n  var isHorizontalLane = isHorizontal(shape);\n\n  var laneBaseSize = isHorizontalLane ? shape.height : shape.width;\n  var newLanesSize = Math.round(laneBaseSize / newLanesCount);\n\n  // Iterate from first to last in child lane order,\n  // resizing existing lanes and creating new ones\n  // so that they split the parent proportionally.\n  //\n  // Due to rounding related errors, the last lane\n  // needs to take up all the remaining space.\n  var laneSize,\n      laneBounds,\n      newLaneAttrs,\n      idx;\n\n  for (idx = 0; idx < newLanesCount; idx++) {\n\n    // if last lane\n    if (idx === newLanesCount - 1) {\n      laneSize = laneBaseSize - (newLanesSize * idx);\n    } else {\n      laneSize = newLanesSize;\n    }\n\n    laneBounds = isHorizontalLane ? {\n      x: shape.x + LANE_INDENTATION,\n      y: shape.y + idx * newLanesSize,\n      width: shape.width - LANE_INDENTATION,\n      height: laneSize\n    } : {\n      x: shape.x + idx * newLanesSize,\n      y: shape.y + LANE_INDENTATION,\n      width: laneSize,\n      height: shape.height - LANE_INDENTATION\n    };\n\n    if (idx < existingLanesCount) {\n\n      // resize existing lane\n      modeling.resizeShape(childLanes[idx], laneBounds);\n    } else {\n\n      // create a new lane at position\n      newLaneAttrs = {\n        type: 'bpmn:Lane',\n        isHorizontal: isHorizontalLane\n      };\n\n      modeling.createShape(newLaneAttrs, laneBounds, shape);\n    }\n  }\n};\n"
  },
  {
    "path": "lib/features/modeling/cmd/UpdateCanvasRootHandler.js",
    "content": "import {\n  add as collectionAdd,\n  remove as collectionRemove\n} from 'diagram-js/lib/util/Collections';\n\nimport { getDi } from '../../../util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n *\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n * @typedef {import('../Modeling').default} Modeling\n */\n\n/**\n * @implements {CommandHandler}\n *\n * @param {Canvas} canvas\n * @param {Modeling} modeling\n */\nexport default function UpdateCanvasRootHandler(canvas, modeling) {\n  this._canvas = canvas;\n  this._modeling = modeling;\n}\n\nUpdateCanvasRootHandler.$inject = [\n  'canvas',\n  'modeling'\n];\n\n\nUpdateCanvasRootHandler.prototype.execute = function(context) {\n\n  var canvas = this._canvas;\n\n  var newRoot = context.newRoot,\n      newRootBusinessObject = newRoot.businessObject,\n      oldRoot = canvas.getRootElement(),\n      oldRootBusinessObject = oldRoot.businessObject,\n      bpmnDefinitions = oldRootBusinessObject.$parent,\n      diPlane = getDi(oldRoot);\n\n  // (1) replace process old <> new root\n  canvas.setRootElement(newRoot);\n  canvas.removeRootElement(oldRoot);\n\n  // (2) update root elements\n  collectionAdd(bpmnDefinitions.rootElements, newRootBusinessObject);\n  newRootBusinessObject.$parent = bpmnDefinitions;\n\n  collectionRemove(bpmnDefinitions.rootElements, oldRootBusinessObject);\n  oldRootBusinessObject.$parent = null;\n\n  // (3) wire di\n  oldRoot.di = null;\n\n  diPlane.bpmnElement = newRootBusinessObject;\n  newRoot.di = diPlane;\n\n  context.oldRoot = oldRoot;\n\n  // TODO(nikku): return changed elements?\n  // return [ newRoot, oldRoot ];\n  return [];\n};\n\n\nUpdateCanvasRootHandler.prototype.revert = function(context) {\n\n  var canvas = this._canvas;\n\n  var newRoot = context.newRoot,\n      newRootBusinessObject = newRoot.businessObject,\n      oldRoot = context.oldRoot,\n      oldRootBusinessObject = oldRoot.businessObject,\n      bpmnDefinitions = newRootBusinessObject.$parent,\n      diPlane = getDi(newRoot);\n\n  // (1) replace process old <> new root\n  canvas.setRootElement(oldRoot);\n  canvas.removeRootElement(newRoot);\n\n  // (2) update root elements\n  collectionRemove(bpmnDefinitions.rootElements, newRootBusinessObject);\n  newRootBusinessObject.$parent = null;\n\n  collectionAdd(bpmnDefinitions.rootElements, oldRootBusinessObject);\n  oldRootBusinessObject.$parent = bpmnDefinitions;\n\n  // (3) wire di\n  newRoot.di = null;\n\n  diPlane.bpmnElement = oldRootBusinessObject;\n  oldRoot.di = diPlane;\n\n  // TODO(nikku): return changed elements?\n  // return [ newRoot, oldRoot ];\n\n  return [];\n};"
  },
  {
    "path": "lib/features/modeling/cmd/UpdateFlowNodeRefsHandler.js",
    "content": "import {\n  collectLanes,\n  getLanesRoot\n} from '../util/LaneUtil';\n\nimport {\n  is\n} from '../../../util/ModelUtil';\n\nimport {\n  add as collectionAdd,\n  remove as collectionRemove\n} from 'diagram-js/lib/util/Collections';\n\nimport {\n  asTRBL\n} from 'diagram-js/lib/layout/LayoutUtil';\n\n/**\n * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n *\n * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n *\n * @typedef {import('../../../model/Types').Shape} Shape\n */\n\nvar FLOW_NODE_REFS_ATTR = 'flowNodeRef',\n    LANES_ATTR = 'lanes';\n\n\n/**\n * A handler that updates lane refs on changed elements.\n *\n * @implements {CommandHandler}\n *\n * @param {ElementRegistry} elementRegistry\n */\nexport default function UpdateFlowNodeRefsHandler(elementRegistry) {\n  this._elementRegistry = elementRegistry;\n}\n\nUpdateFlowNodeRefsHandler.$inject = [\n  'elementRegistry'\n];\n\n/**\n * @param {Shape} flowNodeShapes\n * @param {Shape} laneShapes\n *\n * @return { {\n *   flowNode: Shape;\n *   add: Shape[];\n *   remove: Shape[];\n * }[] }\n */\nUpdateFlowNodeRefsHandler.prototype._computeUpdates = function(flowNodeShapes, laneShapes) {\n\n  var handledNodes = [];\n\n  var updates = [];\n\n  var participantCache = {};\n\n  var allFlowNodeShapes = [];\n\n  function isInLaneShape(element, laneShape) {\n\n    var laneTrbl = asTRBL(laneShape);\n\n    var elementMid = {\n      x: element.x + element.width / 2,\n      y: element.y + element.height / 2\n    };\n\n    return elementMid.x > laneTrbl.left &&\n           elementMid.x < laneTrbl.right &&\n           elementMid.y > laneTrbl.top &&\n           elementMid.y < laneTrbl.bottom;\n  }\n\n  function addFlowNodeShape(flowNodeShape) {\n    if (handledNodes.indexOf(flowNodeShape) === -1) {\n      allFlowNodeShapes.push(flowNodeShape);\n      handledNodes.push(flowNodeShape);\n    }\n  }\n\n  function getAllLaneShapes(flowNodeShape) {\n\n    var root = getLanesRoot(flowNodeShape);\n\n    if (!participantCache[root.id]) {\n      participantCache[root.id] = collectLanes(root);\n    }\n\n    return participantCache[root.id];\n  }\n\n  function getNewLanes(flowNodeShape) {\n    if (!flowNodeShape.parent) {\n      return [];\n    }\n\n    var allLaneShapes = getAllLaneShapes(flowNodeShape);\n\n    return allLaneShapes.filter(function(l) {\n      return isInLaneShape(flowNodeShape, l);\n    }).map(function(shape) {\n      return shape.businessObject;\n    });\n  }\n\n  laneShapes.forEach(function(laneShape) {\n    var root = getLanesRoot(laneShape);\n\n    if (!root || handledNodes.indexOf(root) !== -1) {\n      return;\n    }\n\n    var children = root.children.filter(function(c) {\n      return is(c, 'bpmn:FlowNode');\n    });\n\n    children.forEach(addFlowNodeShape);\n\n    handledNodes.push(root);\n  });\n\n  flowNodeShapes.forEach(addFlowNodeShape);\n\n\n  allFlowNodeShapes.forEach(function(flowNodeShape) {\n\n    var flowNode = flowNodeShape.businessObject;\n\n    var lanes = flowNode.get(LANES_ATTR),\n        remove = lanes.slice(),\n        add = getNewLanes(flowNodeShape);\n\n    updates.push({ flowNode: flowNode, remove: remove, add: add });\n  });\n\n  laneShapes.forEach(function(laneShape) {\n\n    var lane = laneShape.businessObject;\n\n    // lane got removed XX-)\n    if (!laneShape.parent) {\n      lane.get(FLOW_NODE_REFS_ATTR).forEach(function(flowNode) {\n        updates.push({ flowNode: flowNode, remove: [ lane ], add: [] });\n      });\n    }\n  });\n\n  return updates;\n};\n\nUpdateFlowNodeRefsHandler.prototype.execute = function(context) {\n\n  var updates = context.updates;\n\n  if (!updates) {\n    updates = context.updates = this._computeUpdates(context.flowNodeShapes, context.laneShapes);\n  }\n\n\n  updates.forEach(function(update) {\n\n    var flowNode = update.flowNode,\n        lanes = flowNode.get(LANES_ATTR);\n\n    // unwire old\n    update.remove.forEach(function(oldLane) {\n      collectionRemove(lanes, oldLane);\n      collectionRemove(oldLane.get(FLOW_NODE_REFS_ATTR), flowNode);\n    });\n\n    // wire new\n    update.add.forEach(function(newLane) {\n      collectionAdd(lanes, newLane);\n      collectionAdd(newLane.get(FLOW_NODE_REFS_ATTR), flowNode);\n    });\n  });\n\n  // TODO(nikku): return changed elements\n  // return [ ... ];\n\n  return [];\n};\n\n\nUpdateFlowNodeRefsHandler.prototype.revert = function(context) {\n\n  var updates = context.updates;\n\n  updates.forEach(function(update) {\n\n    var flowNode = update.flowNode,\n        lanes = flowNode.get(LANES_ATTR);\n\n    // unwire new\n    update.add.forEach(function(newLane) {\n      collectionRemove(lanes, newLane);\n      collectionRemove(newLane.get(FLOW_NODE_REFS_ATTR), flowNode);\n    });\n\n    // wire old\n    update.remove.forEach(function(oldLane) {\n      collectionAdd(lanes, oldLane);\n      collectionAdd(oldLane.get(FLOW_NODE_REFS_ATTR), flowNode);\n    });\n  });\n\n  // TODO(nikku): return changed elements\n  // return [ ... ];\n\n  return [];\n};\n"
  },
  {
    "path": "lib/features/modeling/cmd/UpdateModdlePropertiesHandler.js",
    "content": "import {\n  reduce,\n  keys,\n  forEach\n} from 'min-dash';\n\nimport {\n  is,\n  getBusinessObject\n} from '../../../util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n *\n * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n *\n * @typedef {import('../../../model/Types').Shape} Shape\n * @typedef {import('../../../model/Types').ModdleElement} ModdleElement\n */\n\n/**\n * @implements {CommandHandler}\n *\n * @param {ElementRegistry} elementRegistry\n */\nexport default function UpdateModdlePropertiesHandler(elementRegistry) {\n  this._elementRegistry = elementRegistry;\n}\n\nUpdateModdlePropertiesHandler.$inject = [ 'elementRegistry' ];\n\nUpdateModdlePropertiesHandler.prototype.execute = function(context) {\n\n  var element = context.element,\n      moddleElement = context.moddleElement,\n      properties = context.properties;\n\n  if (!moddleElement) {\n    throw new Error('<moddleElement> required');\n  }\n\n  // TODO(nikku): we need to ensure that ID properties\n  // are properly registered / unregistered via\n  // this._moddle.ids.assigned(id)\n  var changed = context.changed || this._getVisualReferences(moddleElement).concat(element);\n  var oldProperties = context.oldProperties || getModdleProperties(moddleElement, keys(properties));\n\n  setModdleProperties(moddleElement, properties);\n\n  context.oldProperties = oldProperties;\n  context.changed = changed;\n\n  return changed;\n};\n\nUpdateModdlePropertiesHandler.prototype.revert = function(context) {\n  var oldProperties = context.oldProperties,\n      moddleElement = context.moddleElement,\n      changed = context.changed;\n\n  setModdleProperties(moddleElement, oldProperties);\n\n  return changed;\n};\n\n/**\n * Return visual references of given moddle element within the diagram.\n *\n * @param {ModdleElement} moddleElement\n *\n * @return {Shape[]}\n */\nUpdateModdlePropertiesHandler.prototype._getVisualReferences = function(moddleElement) {\n\n  var elementRegistry = this._elementRegistry;\n\n  if (is(moddleElement, 'bpmn:DataObject')) {\n    return getAllDataObjectReferences(moddleElement, elementRegistry);\n  }\n\n  return [];\n};\n\n\n// helpers /////////////////\n\nfunction getModdleProperties(moddleElement, propertyNames) {\n  return reduce(propertyNames, function(result, key) {\n    result[key] = moddleElement.get(key);\n    return result;\n  }, {});\n}\n\nfunction setModdleProperties(moddleElement, properties) {\n  forEach(properties, function(value, key) {\n    moddleElement.set(key, value);\n  });\n}\n\nfunction getAllDataObjectReferences(dataObject, elementRegistry) {\n  return elementRegistry.filter(function(element) {\n    return (\n      is(element, 'bpmn:DataObjectReference') &&\n          getBusinessObject(element).dataObjectRef === dataObject\n    );\n  });\n}\n"
  },
  {
    "path": "lib/features/modeling/cmd/UpdatePropertiesHandler.js",
    "content": "import {\n  reduce,\n  keys,\n  forEach,\n  assign\n} from 'min-dash';\n\nimport {\n  getBusinessObject,\n  getDi\n} from '../../../util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n * @typedef {import('diagram-js/lib/command/CommandStack').CommandContext} CommandContext\n *\n * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n * @typedef {import('../../../model/Types').Moddle} Moddle\n * @typedef {import('../Modeling').default} Modeling\n * @typedef {import('../../../draw/TextRenderer').default} TextRenderer\n *\n * @typedef {import('../../../model/Types').Element} Element\n */\n\nvar DEFAULT_FLOW = 'default',\n    ID = 'id',\n    DI = 'di';\n\nvar NULL_DIMENSIONS = {\n  width: 0,\n  height: 0\n};\n\n/**\n * A handler that implements a BPMN 2.0 property update.\n *\n * This should be used to set simple properties on elements with\n * an underlying BPMN business object.\n *\n * Use respective diagram-js provided handlers if you would\n * like to perform automated modeling.\n *\n * @implements {CommandHandler}\n *\n * @param {ElementRegistry} elementRegistry\n * @param {Moddle} moddle\n * @param {Modeling} modeling\n * @param {TextRenderer} textRenderer\n */\nexport default function UpdatePropertiesHandler(\n    elementRegistry, moddle,\n    modeling, textRenderer) {\n\n  this._elementRegistry = elementRegistry;\n  this._moddle = moddle;\n  this._modeling = modeling;\n  this._textRenderer = textRenderer;\n}\n\nUpdatePropertiesHandler.$inject = [\n  'elementRegistry',\n  'moddle',\n  'modeling',\n  'textRenderer'\n];\n\n\n// api //////////////////////\n\n/**\n * Update a BPMN element's properties.\n *\n * @param { {\n *   element: Element;\n *   properties: Record<string, any>;\n * } & CommandContext } context\n *\n * @return {Element[]}\n */\nUpdatePropertiesHandler.prototype.execute = function(context) {\n\n  var element = context.element,\n      changed = [ element ];\n\n  if (!element) {\n    throw new Error('element required');\n  }\n\n  var elementRegistry = this._elementRegistry,\n      ids = this._moddle.ids;\n\n  var businessObject = element.businessObject,\n      properties = unwrapBusinessObjects(context.properties),\n      oldProperties = context.oldProperties || getProperties(element, properties);\n\n  if (isIdChange(properties, businessObject)) {\n    ids.unclaim(businessObject[ID]);\n\n    elementRegistry.updateId(element, properties[ID]);\n\n    ids.claim(properties[ID], businessObject);\n  }\n\n  // correctly indicate visual changes on default flow updates\n  if (DEFAULT_FLOW in properties) {\n\n    if (properties[DEFAULT_FLOW]) {\n      changed.push(elementRegistry.get(properties[DEFAULT_FLOW].id));\n    }\n\n    if (businessObject[DEFAULT_FLOW]) {\n      changed.push(elementRegistry.get(businessObject[DEFAULT_FLOW].id));\n    }\n  }\n\n  // update properties\n  setProperties(element, properties);\n\n  // store old values\n  context.oldProperties = oldProperties;\n  context.changed = changed;\n\n  // indicate changed on objects affected by the update\n  return changed;\n};\n\n\nUpdatePropertiesHandler.prototype.postExecute = function(context) {\n  var element = context.element,\n      label = element.label;\n\n  var text = label && getBusinessObject(label).name;\n\n  if (!text) {\n    return;\n  }\n\n  // get layouted text bounds and resize external\n  // external label accordingly\n  var newLabelBounds = this._textRenderer.getExternalLabelBounds(label, text);\n\n  this._modeling.resizeShape(label, newLabelBounds, NULL_DIMENSIONS);\n};\n\n/**\n * Revert updating a BPMN element's properties.\n *\n * @param { {\n *   element: Element;\n *   properties: Record<string, any>;\n *   oldProperties: Record<string, any>;\n * } & CommandContext } context\n *\n * @return {Element[]}\n */\nUpdatePropertiesHandler.prototype.revert = function(context) {\n\n  var element = context.element,\n      properties = context.properties,\n      oldProperties = context.oldProperties,\n      businessObject = element.businessObject,\n      elementRegistry = this._elementRegistry,\n      ids = this._moddle.ids;\n\n  // update properties\n  setProperties(element, oldProperties);\n\n  if (isIdChange(properties, businessObject)) {\n    ids.unclaim(properties[ID]);\n\n    elementRegistry.updateId(element, oldProperties[ID]);\n\n    ids.claim(oldProperties[ID], businessObject);\n  }\n\n  return context.changed;\n};\n\n\nfunction isIdChange(properties, businessObject) {\n  return ID in properties && properties[ID] !== businessObject[ID];\n}\n\n\nfunction getProperties(element, properties) {\n  var propertyNames = keys(properties),\n      businessObject = element.businessObject,\n      di = getDi(element);\n\n  return reduce(propertyNames, function(result, key) {\n\n    // handle DI separately\n    if (key !== DI) {\n      result[key] = businessObject.get(key);\n\n    } else {\n      result[key] = getDiProperties(di, keys(properties.di));\n    }\n\n    return result;\n  }, {});\n}\n\n\nfunction getDiProperties(di, propertyNames) {\n  return reduce(propertyNames, function(result, key) {\n    result[key] = di && di.get(key);\n\n    return result;\n  }, {});\n}\n\n\nfunction setProperties(element, properties) {\n  var businessObject = element.businessObject,\n      di = getDi(element);\n\n  forEach(properties, function(value, key) {\n\n    if (key !== DI) {\n      businessObject.set(key, value);\n    } else {\n\n      // only update, if di exists\n      if (di) {\n        setDiProperties(di, value);\n      }\n    }\n  });\n}\n\n\nfunction setDiProperties(di, properties) {\n  forEach(properties, function(value, key) {\n    di.set(key, value);\n  });\n}\n\n\nvar referencePropertyNames = [ 'default' ];\n\n/**\n * Make sure we unwrap the actual business object behind diagram element that\n * may have been passed as arguments.\n *\n * @param  {Record<string, any>} properties\n *\n * @return {Record<string, any>} unwrappedProps\n */\nfunction unwrapBusinessObjects(properties) {\n\n  var unwrappedProps = assign({}, properties);\n\n  referencePropertyNames.forEach(function(name) {\n    if (name in properties) {\n      unwrappedProps[name] = getBusinessObject(unwrappedProps[name]);\n    }\n  });\n\n  return unwrappedProps;\n}"
  },
  {
    "path": "lib/features/modeling/cmd/UpdateSemanticParentHandler.js",
    "content": "/**\r\n * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\r\n *\r\n * @typedef {import('../BpmnUpdater').default} BpmnUpdater\r\n */\r\n\r\n/**\r\n * @implements {CommandHandler}\r\n *\r\n * @param {BpmnUpdater} bpmnUpdater\r\n */\r\nexport default function UpdateSemanticParentHandler(bpmnUpdater) {\r\n  this._bpmnUpdater = bpmnUpdater;\r\n}\r\n\r\nUpdateSemanticParentHandler.$inject = [ 'bpmnUpdater' ];\r\n\r\n\r\nUpdateSemanticParentHandler.prototype.execute = function(context) {\r\n  var dataStoreBo = context.dataStoreBo,\r\n      dataStoreDi = context.dataStoreDi,\r\n      newSemanticParent = context.newSemanticParent,\r\n      newDiParent = context.newDiParent;\r\n\r\n  context.oldSemanticParent = dataStoreBo.$parent;\r\n  context.oldDiParent = dataStoreDi.$parent;\r\n\r\n  // update semantic parent\r\n  this._bpmnUpdater.updateSemanticParent(dataStoreBo, newSemanticParent);\r\n\r\n  // update DI parent\r\n  this._bpmnUpdater.updateDiParent(dataStoreDi, newDiParent);\r\n\r\n  return [];\r\n};\r\n\r\nUpdateSemanticParentHandler.prototype.revert = function(context) {\r\n  var dataStoreBo = context.dataStoreBo,\r\n      dataStoreDi = context.dataStoreDi,\r\n      oldSemanticParent = context.oldSemanticParent,\r\n      oldDiParent = context.oldDiParent;\r\n\r\n  // update semantic parent\r\n  this._bpmnUpdater.updateSemanticParent(dataStoreBo, oldSemanticParent);\r\n\r\n  // update DI parent\r\n  this._bpmnUpdater.updateDiParent(dataStoreDi, oldDiParent);\r\n\r\n  return [];\r\n};\r\n\r\n"
  },
  {
    "path": "lib/features/modeling/index.js",
    "content": "import BehaviorModule from './behavior';\nimport RulesModule from '../rules';\nimport DiOrderingModule from '../di-ordering';\nimport OrderingModule from '../ordering';\nimport ReplaceModule from '../replace';\nimport SpaceToolModule from '../space-tool';\n\nimport CommandModule from 'diagram-js/lib/command';\nimport LabelSupportModule from 'diagram-js/lib/features/label-support';\nimport AttachSupportModule from 'diagram-js/lib/features/attach-support';\nimport SelectionModule from 'diagram-js/lib/features/selection';\nimport ChangeSupportModule from 'diagram-js/lib/features/change-support';\n\nimport BpmnFactory from './BpmnFactory';\nimport BpmnUpdater from './BpmnUpdater';\nimport ElementFactory from './ElementFactory';\nimport Modeling from './Modeling';\nimport BpmnLayouter from './BpmnLayouter';\nimport CroppingConnectionDocking from 'diagram-js/lib/layout/CroppingConnectionDocking';\n\n\nexport default {\n  __init__: [\n    'modeling',\n    'bpmnUpdater'\n  ],\n  __depends__: [\n    BehaviorModule,\n    RulesModule,\n    DiOrderingModule,\n    OrderingModule,\n    ReplaceModule,\n    CommandModule,\n    LabelSupportModule,\n    AttachSupportModule,\n    SelectionModule,\n    ChangeSupportModule,\n    SpaceToolModule\n  ],\n  bpmnFactory: [ 'type', BpmnFactory ],\n  bpmnUpdater: [ 'type', BpmnUpdater ],\n  elementFactory: [ 'type', ElementFactory ],\n  modeling: [ 'type', Modeling ],\n  layouter: [ 'type', BpmnLayouter ],\n  connectionDocking: [ 'type', CroppingConnectionDocking ]\n};"
  },
  {
    "path": "lib/features/modeling/util/LaneUtil.js",
    "content": "import { is } from '../../../util/ModelUtil';\n\nimport {\n  getParent\n} from './ModelingUtil';\n\nimport {\n  isHorizontal\n} from '../../../util/DiUtil';\n\nimport {\n  asTRBL\n} from 'diagram-js/lib/layout/LayoutUtil';\n\nimport {\n  substractTRBL,\n  resizeTRBL\n} from 'diagram-js/lib/features/resize/ResizeUtil';\n\n/**\n * @typedef {import('../../../model/Types').Shape} Shape\n *\n * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n */\n\nvar abs = Math.abs;\n\n\nfunction getTRBLResize(oldBounds, newBounds) {\n  return substractTRBL(asTRBL(newBounds), asTRBL(oldBounds));\n}\n\n\nvar LANE_PARENTS = [\n  'bpmn:Participant',\n  'bpmn:Process',\n  'bpmn:SubProcess'\n];\n\nexport var LANE_INDENTATION = 30;\n\n\n/**\n * Return all lanes that are children of the given shape.\n *\n * @param  {Shape} shape\n * @param  {Shape[]} [collectedShapes]\n *\n * @return {Shape[]}\n */\nexport function collectLanes(shape, collectedShapes) {\n\n  collectedShapes = collectedShapes || [];\n\n  shape.children.filter(function(s) {\n    if (is(s, 'bpmn:Lane')) {\n      collectLanes(s, collectedShapes);\n\n      collectedShapes.push(s);\n    }\n  });\n\n  return collectedShapes;\n}\n\n\n/**\n * Return all lanes that are direct children of the given shape.\n *\n * @param {Shape} shape\n *\n * @return {Shape[]}\n */\nexport function getChildLanes(shape) {\n  return shape.children.filter(function(c) {\n    return is(c, 'bpmn:Lane');\n  });\n}\n\n\n/**\n * Return the parent shape of the given lane.\n *\n * @param {Shape} shape\n *\n * @return {Shape}\n */\nexport function getLanesRoot(shape) {\n  return getParent(shape, LANE_PARENTS) || shape;\n}\n\n\n/**\n * Compute the required resize operations for lanes\n * adjacent to the given shape, assuming it will be\n * resized to the given new bounds.\n *\n * @param {Shape} shape\n * @param {Rect} newBounds\n *\n * @return { {\n *   shape: Shape;\n *   newBounds: Rect;\n * }[] }\n */\nexport function computeLanesResize(shape, newBounds) {\n\n  var rootElement = getLanesRoot(shape);\n\n  var initialShapes = is(rootElement, 'bpmn:Process') ? [] : [ rootElement ];\n\n  var allLanes = collectLanes(rootElement, initialShapes),\n      shapeTrbl = asTRBL(shape),\n      shapeNewTrbl = asTRBL(newBounds),\n      trblResize = getTRBLResize(shape, newBounds),\n      resizeNeeded = [];\n\n  var isHorizontalLane = isHorizontal(shape);\n\n  allLanes.forEach(function(other) {\n\n    if (other === shape) {\n      return;\n    }\n\n    var topResize = isHorizontalLane ? 0 : trblResize.top,\n        rightResize = isHorizontalLane ? trblResize.right : 0,\n        bottomResize = isHorizontalLane ? 0 : trblResize.bottom,\n        leftResize = isHorizontalLane ? trblResize.left : 0;\n\n    var otherTrbl = asTRBL(other);\n\n    if (trblResize.top) {\n      if (abs(otherTrbl.bottom - shapeTrbl.top) < 10) {\n        bottomResize = shapeNewTrbl.top - otherTrbl.bottom;\n      }\n\n      if (abs(otherTrbl.top - shapeTrbl.top) < 5) {\n        topResize = shapeNewTrbl.top - otherTrbl.top;\n      }\n    }\n\n    if (trblResize.left) {\n      if (abs(otherTrbl.right - shapeTrbl.left) < 10) {\n        rightResize = shapeNewTrbl.left - otherTrbl.right;\n      }\n\n      if (abs(otherTrbl.left - shapeTrbl.left) < 5) {\n        leftResize = shapeNewTrbl.left - otherTrbl.left;\n      }\n    }\n\n    if (trblResize.bottom) {\n      if (abs(otherTrbl.top - shapeTrbl.bottom) < 10) {\n        topResize = shapeNewTrbl.bottom - otherTrbl.top;\n      }\n\n      if (abs(otherTrbl.bottom - shapeTrbl.bottom) < 5) {\n        bottomResize = shapeNewTrbl.bottom - otherTrbl.bottom;\n      }\n    }\n\n    if (trblResize.right) {\n      if (abs(otherTrbl.left - shapeTrbl.right) < 10) {\n        leftResize = shapeNewTrbl.right - otherTrbl.left;\n      }\n\n      if (abs(otherTrbl.right - shapeTrbl.right) < 5) {\n        rightResize = shapeNewTrbl.right - otherTrbl.right;\n      }\n    }\n\n    if (topResize || rightResize || bottomResize || leftResize) {\n\n      resizeNeeded.push({\n        shape: other,\n        newBounds: resizeTRBL(other, {\n          top: topResize,\n          right: rightResize,\n          bottom: bottomResize,\n          left: leftResize\n        })\n      });\n    }\n\n  });\n\n  return resizeNeeded;\n}"
  },
  {
    "path": "lib/features/modeling/util/ModelingUtil.js",
    "content": "import { isString } from 'min-dash';\n\nexport { is, isAny } from '../../../util/ModelUtil';\n\nimport {\n  is,\n  isAny,\n  getBusinessObject\n} from '../../../util/ModelUtil';\n\nimport { isHorizontal } from '../../../util/DiUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n * @typedef {import('../../../model/Types').Element} Element\n */\n\n/**\n * Return the parent of the element with any of the given types.\n *\n * @param {Element} element\n * @param {string|string[]} anyType\n *\n * @return {Element|null}\n */\nexport function getParent(element, anyType) {\n\n  if (isString(anyType)) {\n    anyType = [ anyType ];\n  }\n\n  while ((element = element.parent)) {\n    if (isAny(element, anyType)) {\n      return element;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Determines if the local modeling direction is vertical or horizontal.\n *\n * @param {Element} element\n * @param {ElementRegistry} [elementRegistry] - provide to consider parent diagram direction\n *\n * @return {boolean} false for vertical pools, lanes and their children. true otherwise\n */\nexport function isDirectionHorizontal(element, elementRegistry) {\n\n  var parent = getParent(element, 'bpmn:Process');\n  if (parent) {\n    return true;\n  }\n\n  var types = [ 'bpmn:Participant', 'bpmn:Lane' ];\n\n  parent = getParent(element, types);\n  if (parent) {\n    return isHorizontal(parent);\n  } else if (isAny(element, types)) {\n    return isHorizontal(element);\n  }\n\n  var process;\n  for (process = getBusinessObject(element); process; process = process.$parent) {\n    if (is(process, 'bpmn:Process')) {\n      break;\n    }\n  }\n\n  if (!elementRegistry) {\n    return true;\n  }\n\n  // The direction may be specified in another diagram. We ignore that there\n  // could be multiple diagrams with contradicting properties based on the\n  // assumption that such BPMN files are unusual.\n  var pool = elementRegistry.find(function(shape) {\n    var businessObject = getBusinessObject(shape);\n    return businessObject && businessObject.get('processRef') === process;\n  });\n\n  if (!pool) {\n    return true;\n  }\n\n  return isHorizontal(pool);\n}"
  },
  {
    "path": "lib/features/modeling-feedback/ModelingFeedback.js",
    "content": "import { is } from '../../util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('diagram-js/lib/features/tooltips/Tooltips').default} Tooltips\n * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n */\n\nvar COLLAB_ERR_MSG = 'flow elements must be children of pools/participants';\nvar DATA_OBJECT_ERR_MSG = 'Data object must be placed within a pool/participant.';\n\n/**\n * @param {EventBus} eventBus\n * @param {Tooltips} tooltips\n * @param {Translate} translate\n */\nexport default function ModelingFeedback(eventBus, tooltips, translate) {\n\n  function showError(position, message, timeout) {\n    tooltips.add({\n      position: {\n        x: position.x + 5,\n        y: position.y + 5\n      },\n      type: 'error',\n      timeout: timeout || 2000,\n      html: '<div>' + message + '</div>'\n    });\n  }\n\n  eventBus.on([ 'shape.move.rejected', 'create.rejected' ], function(event) {\n    var context = event.context,\n        shape = context.shape,\n        target = context.target;\n\n    if (is(target, 'bpmn:Collaboration')) {\n      if (is(shape, 'bpmn:FlowNode')) {\n        showError(event, translate(COLLAB_ERR_MSG));\n      } else if (is(shape, 'bpmn:DataObjectReference')) {\n        showError(event, translate(DATA_OBJECT_ERR_MSG));\n      }\n    }\n  });\n\n}\n\nModelingFeedback.$inject = [\n  'eventBus',\n  'tooltips',\n  'translate'\n];\n"
  },
  {
    "path": "lib/features/modeling-feedback/index.js",
    "content": "import TooltipsModule from 'diagram-js/lib/features/tooltips';\n\nimport ModelingFeedback from './ModelingFeedback';\n\nexport default {\n  __depends__: [\n    TooltipsModule\n  ],\n  __init__: [\n    'modelingFeedback'\n  ],\n  modelingFeedback: [ 'type', ModelingFeedback ]\n};"
  },
  {
    "path": "lib/features/ordering/BpmnOrderingProvider.js",
    "content": "import inherits from 'inherits-browser';\n\nimport OrderingProvider from 'diagram-js/lib/features/ordering/OrderingProvider';\n\nimport {\n  is,\n  isAny\n} from '../modeling/util/ModelingUtil';\n\nimport {\n  findIndex,\n  find\n} from 'min-dash';\n\n/**\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n */\n\n/**\n * A BPMN-specific ordering provider.\n *\n * @param {EventBus} eventBus\n * @param {Canvas} canvas\n */\nexport default function BpmnOrderingProvider(eventBus, canvas) {\n\n  OrderingProvider.call(this, eventBus);\n\n  var orders = [\n    { type: 'bpmn:SubProcess', order: { level: 6 } },\n\n    // handle SequenceFlow(s) like message flows and render them always on top\n    {\n      type: 'bpmn:SequenceFlow',\n      order: {\n        level: 9,\n        containers: [\n          'bpmn:Participant',\n          'bpmn:FlowElementsContainer'\n        ]\n      }\n    },\n\n    // handle DataAssociation(s) like message flows and render them always on top\n    {\n      type: 'bpmn:DataAssociation',\n      order: {\n        level: 9,\n        containers: [\n          'bpmn:Collaboration',\n          'bpmn:FlowElementsContainer'\n        ]\n      }\n    },\n    {\n      type: 'bpmn:TextAnnotation',\n      order: {\n        level: 9\n      }\n    },\n    {\n      type: 'bpmn:MessageFlow', order: {\n        level: 9,\n        containers: [ 'bpmn:Collaboration' ]\n      }\n    },\n    {\n      type: 'bpmn:Association',\n      order: {\n        level: 6,\n        containers: [\n          'bpmn:Participant',\n          'bpmn:FlowElementsContainer',\n          'bpmn:Collaboration'\n        ]\n      }\n    },\n    { type: 'bpmn:BoundaryEvent', order: { level: 8 } },\n    {\n      type: 'bpmn:Group',\n      order: {\n        level: 10,\n        containers: [\n          'bpmn:Collaboration',\n          'bpmn:FlowElementsContainer'\n        ]\n      }\n    },\n    { type: 'bpmn:FlowElement', order: { level: 5 } },\n    { type: 'bpmn:Participant', order: { level: -2 } },\n    { type: 'bpmn:Lane', order: { level: -1 } }\n  ];\n\n  function computeOrder(element) {\n    if (element.labelTarget) {\n      return { level: 10 };\n    }\n\n    var entry = find(orders, function(o) {\n      return isAny(element, [ o.type ]);\n    });\n\n    return entry && entry.order || { level: 1 };\n  }\n\n  function getOrder(element) {\n\n    var order = element.order;\n\n    if (!order) {\n      element.order = order = computeOrder(element);\n    }\n\n    if (!order) {\n      throw new Error(`no order for <${ element.id }>`);\n    }\n\n    return order;\n  }\n\n  function findActualParent(element, newParent, containers) {\n\n    var actualParent = newParent;\n\n    while (actualParent) {\n\n      if (isAny(actualParent, containers)) {\n        break;\n      }\n\n      actualParent = actualParent.parent;\n    }\n\n    if (!actualParent) {\n      throw new Error(`no parent for <${ element.id }> in <${ newParent && newParent.id }>`);\n    }\n\n    return actualParent;\n  }\n\n  this.getOrdering = function(element, newParent) {\n\n    // render labels and text annotations always on top\n    if (element.labelTarget || is(element, 'bpmn:TextAnnotation')) {\n      return {\n        parent: canvas.findRoot(newParent) || canvas.getRootElement(),\n        index: -1\n      };\n    }\n\n    var elementOrder = getOrder(element);\n\n    if (elementOrder.containers) {\n      newParent = findActualParent(element, newParent, elementOrder.containers);\n    }\n\n    var currentIndex = newParent.children.indexOf(element);\n\n    var insertIndex = findIndex(newParent.children, function(child) {\n\n      // do not compare with labels, they are created\n      // in the wrong order (right after elements) during import and\n      // mess up the positioning.\n      if (!element.labelTarget && child.labelTarget) {\n        return false;\n      }\n\n      return elementOrder.level < getOrder(child).level;\n    });\n\n\n    // if the element is already in the child list at\n    // a smaller index, we need to adjust the insert index.\n    // this takes into account that the element is being removed\n    // before being re-inserted\n    if (insertIndex !== -1) {\n      if (currentIndex !== -1 && currentIndex < insertIndex) {\n        insertIndex -= 1;\n      }\n    }\n\n    return {\n      index: insertIndex,\n      parent: newParent\n    };\n  };\n}\n\nBpmnOrderingProvider.$inject = [ 'eventBus', 'canvas' ];\n\ninherits(BpmnOrderingProvider, OrderingProvider);"
  },
  {
    "path": "lib/features/ordering/index.js",
    "content": "import BpmnOrderingProvider from './BpmnOrderingProvider';\n\nexport default {\n  __init__: [ 'bpmnOrderingProvider' ],\n  bpmnOrderingProvider: [ 'type', BpmnOrderingProvider ]\n};"
  },
  {
    "path": "lib/features/outline/OutlineProvider.js",
    "content": "import { assign } from 'min-dash';\n\nimport {\n  attr as svgAttr,\n  create as svgCreate\n} from 'tiny-svg';\n\nimport {\n  is,\n  isAny\n} from '../../util/ModelUtil';\n\nimport { isLabel, isExternalLabel } from '../../util/LabelUtil';\n\nimport {\n  DATA_OBJECT_REFERENCE_OUTLINE_PATH,\n  DATA_STORE_REFERENCE_OUTLINE_PATH,\n  DATA_OBJECT_REFERENCE_STANDARD_SIZE,\n  DATA_STORE_REFERENCE_STANDARD_SIZE,\n  createPath\n} from './OutlineUtil';\n\n/**\n * @typedef { import('diagram-js/lib/features/outline/OutlineProvider').default } BaseOutlineProvider\n *\n * @typedef { import('diagram-js/lib/features/outline/OutlineProvider').Outline } Outline\n *\n * @typedef { import('diagram-js/lib/draw/Styles').default } Styles\n *\n * @typedef { import('diagram-js/lib/model/Types').Element } Element\n */\n\nconst DEFAULT_OFFSET = 5;\n\n/**\n * BPMN-specific outline provider.\n *\n * @implements {BaseOutlineProvider}\n *\n * @param {Outline} outline\n * @param {Styles} styles\n */\nexport default function OutlineProvider(outline, styles) {\n\n  this._styles = styles;\n  outline.registerProvider(this);\n}\n\nOutlineProvider.$inject = [\n  'outline',\n  'styles'\n];\n\n/**\n * Returns outline for a given element.\n *\n * @param {Element} element\n *\n * @return {Outline}\n */\nOutlineProvider.prototype.getOutline = function(element) {\n\n  const OUTLINE_STYLE = this._styles.cls('djs-outline', [ 'no-fill' ]);\n\n  var outline;\n\n  if (isExternalLabel(element)) {\n    outline = svgCreate('rect');\n\n    svgAttr(outline, assign({\n      x: -DEFAULT_OFFSET,\n      y: -DEFAULT_OFFSET,\n      rx: 4,\n      width: element.width + DEFAULT_OFFSET * 2,\n      height: element.height + DEFAULT_OFFSET * 2\n    }, OUTLINE_STYLE));\n\n    return outline;\n  }\n\n  if (isLabel(element)) {\n    return;\n  }\n\n  if (is(element, 'bpmn:Gateway')) {\n    outline = svgCreate('rect');\n\n    assign(outline.style, {\n      'transform-box': 'fill-box',\n      'transform': 'rotate(45deg)',\n      'transform-origin': 'center'\n    });\n\n    svgAttr(outline, assign({\n      x: 2,\n      y: 2,\n      rx: 4,\n      width: element.width - 4,\n      height: element.height - 4,\n    }, OUTLINE_STYLE));\n\n  } else if (isAny(element, [ 'bpmn:Task', 'bpmn:SubProcess', 'bpmn:Group', 'bpmn:CallActivity' ])) {\n    outline = svgCreate('rect');\n\n    svgAttr(outline, assign({\n      x: -DEFAULT_OFFSET,\n      y: -DEFAULT_OFFSET,\n      rx: 14,\n      width: element.width + DEFAULT_OFFSET * 2,\n      height: element.height + DEFAULT_OFFSET * 2\n    }, OUTLINE_STYLE));\n\n  } else if (is(element, 'bpmn:EndEvent')) {\n\n    outline = svgCreate('circle');\n\n    // Extra 1px offset needed due to increased stroke-width of end event\n    // which makes it bigger than other events.\n\n    svgAttr(outline, assign({\n      cx: element.width / 2,\n      cy: element.height / 2,\n      r: element.width / 2 + DEFAULT_OFFSET + 1\n    }, OUTLINE_STYLE));\n\n  } else if (is(element, 'bpmn:Event')) {\n    outline = svgCreate('circle');\n\n    svgAttr(outline, assign({\n      cx: element.width / 2,\n      cy: element.height / 2,\n      r: element.width / 2 + DEFAULT_OFFSET\n    }, OUTLINE_STYLE));\n\n  } else if (is(element, 'bpmn:DataObjectReference') && isStandardSize(element, 'bpmn:DataObjectReference')) {\n\n    outline = createPath(\n      DATA_OBJECT_REFERENCE_OUTLINE_PATH,\n      { x: -6, y: -6 },\n      OUTLINE_STYLE\n    );\n\n  } else if (is(element, 'bpmn:DataStoreReference') && isStandardSize(element, 'bpmn:DataStoreReference')) {\n\n    outline = createPath(\n      DATA_STORE_REFERENCE_OUTLINE_PATH,\n      { x: -6, y: -6 },\n      OUTLINE_STYLE\n    );\n  }\n\n  return outline;\n};\n\n/**\n * Updates the outline for a given element.\n * Returns true if the update for the given element was handled by this provider.\n *\n * @param {Element} element\n * @param {Outline} outline\n * @returns {boolean}\n */\nOutlineProvider.prototype.updateOutline = function(element, outline) {\n\n  if (isLabel(element)) {\n    return;\n  }\n\n  if (isAny(element, [ 'bpmn:SubProcess', 'bpmn:Group' ])) {\n\n    svgAttr(outline, {\n      width: element.width + DEFAULT_OFFSET * 2,\n      height: element.height + DEFAULT_OFFSET * 2\n    });\n\n    return true;\n\n  } else if (isAny(element, [\n    'bpmn:Event',\n    'bpmn:Gateway',\n    'bpmn:DataStoreReference',\n    'bpmn:DataObjectReference'\n  ])) {\n    return true;\n  }\n\n  return false;\n};\n\n\n// helpers //////////\n\nfunction isStandardSize(element, type) {\n  var standardSize;\n\n  if (type === 'bpmn:DataObjectReference') {\n    standardSize = DATA_OBJECT_REFERENCE_STANDARD_SIZE;\n  } else if (type === 'bpmn:DataStoreReference') {\n    standardSize = DATA_STORE_REFERENCE_STANDARD_SIZE;\n  }\n\n  return element.width === standardSize.width\n          && element.height === standardSize.height;\n}"
  },
  {
    "path": "lib/features/outline/OutlineUtil.js",
    "content": "import {\n  create as svgCreate\n} from 'tiny-svg';\n\nexport const DATA_OBJECT_REFERENCE_OUTLINE_PATH = 'M44.7648 11.3263L36.9892 2.64074C36.0451 1.58628 34.5651 0.988708 33.1904 0.988708H5.98667C3.22688 0.988708 0.989624 3.34892 0.989624 6.26039V55.0235C0.989624 57.9349 3.22688 60.2952 5.98667 60.2952H40.966C43.7257 60.2952 45.963 57.9349 45.963 55.0235V14.9459C45.963 13.5998 45.6407 12.3048 44.7648 11.3263Z';\nexport const DATA_STORE_REFERENCE_OUTLINE_PATH = 'M1.03845 48.1347C1.03845 49.3511 1.07295 50.758 1.38342 52.064C1.69949 53.3938 2.32428 54.7154 3.56383 55.6428C6.02533 57.4841 10.1161 58.7685 14.8212 59.6067C19.5772 60.4538 25.1388 60.8738 30.6831 60.8738C36.2276 60.8738 41.7891 60.4538 46.545 59.6067C51.2504 58.7687 55.3412 57.4842 57.8028 55.6429C59.0424 54.7156 59.6673 53.3938 59.9834 52.064C60.2938 50.7579 60.3285 49.351 60.3285 48.1344V13.8415C60.3285 12.6249 60.2938 11.218 59.9834 9.91171C59.6673 8.58194 59.0423 7.2602 57.8027 6.33294C55.341 4.49168 51.2503 3.20723 46.545 2.36914C41.7891 1.522 36.2276 1.10204 30.6831 1.10205C25.1388 1.10206 19.5772 1.52206 14.8213 2.36923C10.1162 3.20734 6.02543 4.49183 3.5639 6.33314C2.32433 7.26038 1.69951 8.58206 1.38343 9.91181C1.07295 11.2179 1.03845 12.6247 1.03845 13.8411V48.1347Z';\n\n/**\n * @typedef { import('diagram-js/lib/util/Types').Dimensions} Dimensions\n */\n\n/**\n * @type {Dimensions}\n */\nexport const DATA_OBJECT_REFERENCE_STANDARD_SIZE = { width: 36, height: 50 };\n\n/**\n * @type {Dimensions}\n */\nexport const DATA_STORE_REFERENCE_STANDARD_SIZE = { width: 50, height: 50 };\n\n/**\n * Create a path element with given attributes.\n * @param {string} path\n * @param {Object} attrs\n * @param {Object} OUTLINE_STYLE\n * @return {SVGElement}\n */\nexport function createPath(path, attrs, OUTLINE_STYLE) {\n  return svgCreate('path', {\n    d: path,\n    strokeWidth: 2,\n    transform: `translate(${attrs.x}, ${attrs.y})`,\n    ...OUTLINE_STYLE\n  });\n}"
  },
  {
    "path": "lib/features/outline/index.js",
    "content": "import Outline from 'diagram-js/lib/features/outline';\nimport OutlineProvider from './OutlineProvider';\n\nexport default {\n  __depends__: [\n    Outline\n  ],\n  __init__: [ 'outlineProvider' ],\n  outlineProvider: [ 'type', OutlineProvider ]\n};\n"
  },
  {
    "path": "lib/features/palette/PaletteProvider.js",
    "content": "import {\n  assign\n} from 'min-dash';\n\n/**\n * @typedef {import('diagram-js/lib/features/palette/Palette').default} Palette\n * @typedef {import('diagram-js/lib/features/create/Create').default} Create\n * @typedef {import('diagram-js/lib/core/ElementFactory').default} ElementFactory\n * @typedef {import('../space-tool/BpmnSpaceTool').default} SpaceTool\n * @typedef {import('diagram-js/lib/features/lasso-tool/LassoTool').default} LassoTool\n * @typedef {import('diagram-js/lib/features/hand-tool/HandTool').default} HandTool\n * @typedef {import('diagram-js/lib/features/global-connect/GlobalConnect').default} GlobalConnect\n * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n *\n * @typedef {import('diagram-js/lib/features/palette/Palette').PaletteEntries} PaletteEntries\n */\n\n/**\n * A palette provider for BPMN 2.0 elements.\n *\n * @param {Palette} palette\n * @param {Create} create\n * @param {ElementFactory} elementFactory\n * @param {SpaceTool} spaceTool\n * @param {LassoTool} lassoTool\n * @param {HandTool} handTool\n * @param {GlobalConnect} globalConnect\n * @param {Translate} translate\n */\nexport default function PaletteProvider(\n    palette, create, elementFactory,\n    spaceTool, lassoTool, handTool,\n    globalConnect, translate) {\n\n  this._palette = palette;\n  this._create = create;\n  this._elementFactory = elementFactory;\n  this._spaceTool = spaceTool;\n  this._lassoTool = lassoTool;\n  this._handTool = handTool;\n  this._globalConnect = globalConnect;\n  this._translate = translate;\n\n  palette.registerProvider(this);\n}\n\nPaletteProvider.$inject = [\n  'palette',\n  'create',\n  'elementFactory',\n  'spaceTool',\n  'lassoTool',\n  'handTool',\n  'globalConnect',\n  'translate'\n];\n\n/**\n * @return {PaletteEntries}\n */\nPaletteProvider.prototype.getPaletteEntries = function() {\n\n  var actions = {},\n      create = this._create,\n      elementFactory = this._elementFactory,\n      spaceTool = this._spaceTool,\n      lassoTool = this._lassoTool,\n      handTool = this._handTool,\n      globalConnect = this._globalConnect,\n      translate = this._translate;\n\n  function createAction(type, group, className, title, options) {\n\n    function createListener(event) {\n      var shape = elementFactory.createShape(assign({ type: type }, options));\n      create.start(event, shape);\n    }\n\n    return {\n      group: group,\n      className: className,\n      title: title,\n      action: {\n        dragstart: createListener,\n        click: createListener\n      }\n    };\n  }\n\n  function createSubprocess(event) {\n    var subProcess = elementFactory.createShape({\n      type: 'bpmn:SubProcess',\n      x: 0,\n      y: 0,\n      isExpanded: true\n    });\n\n    var startEvent = elementFactory.createShape({\n      type: 'bpmn:StartEvent',\n      x: 40,\n      y: 82,\n      parent: subProcess\n    });\n\n    create.start(event, [ subProcess, startEvent ], {\n      hints: {\n        autoSelect: [ subProcess ]\n      }\n    });\n  }\n\n  function createParticipant(event) {\n    create.start(event, elementFactory.createParticipantShape());\n  }\n\n  assign(actions, {\n    'hand-tool': {\n      group: 'tools',\n      className: 'bpmn-icon-hand-tool',\n      title: translate('Activate hand tool'),\n      action: {\n        click: function(event) {\n          handTool.activateHand(event);\n        }\n      }\n    },\n    'lasso-tool': {\n      group: 'tools',\n      className: 'bpmn-icon-lasso-tool',\n      title: translate('Activate lasso tool'),\n      action: {\n        click: function(event) {\n          lassoTool.activateSelection(event);\n        }\n      }\n    },\n    'space-tool': {\n      group: 'tools',\n      className: 'bpmn-icon-space-tool',\n      title: translate('Activate create/remove space tool'),\n      action: {\n        click: function(event) {\n          spaceTool.activateSelection(event);\n        }\n      }\n    },\n    'global-connect-tool': {\n      group: 'tools',\n      className: 'bpmn-icon-connection-multi',\n      title: translate('Activate global connect tool'),\n      action: {\n        click: function(event) {\n          globalConnect.start(event);\n        }\n      }\n    },\n    'tool-separator': {\n      group: 'tools',\n      separator: true\n    },\n    'create.start-event': createAction(\n      'bpmn:StartEvent', 'event', 'bpmn-icon-start-event-none',\n      translate('Create start event')\n    ),\n    'create.intermediate-event': createAction(\n      'bpmn:IntermediateThrowEvent', 'event', 'bpmn-icon-intermediate-event-none',\n      translate('Create intermediate/boundary event')\n    ),\n    'create.end-event': createAction(\n      'bpmn:EndEvent', 'event', 'bpmn-icon-end-event-none',\n      translate('Create end event')\n    ),\n    'create.exclusive-gateway': createAction(\n      'bpmn:ExclusiveGateway', 'gateway', 'bpmn-icon-gateway-none',\n      translate('Create gateway')\n    ),\n    'create.task': createAction(\n      'bpmn:Task', 'activity', 'bpmn-icon-task',\n      translate('Create task')\n    ),\n    'create.data-object': createAction(\n      'bpmn:DataObjectReference', 'data-object', 'bpmn-icon-data-object',\n      translate('Create data object reference')\n    ),\n    'create.data-store': createAction(\n      'bpmn:DataStoreReference', 'data-store', 'bpmn-icon-data-store',\n      translate('Create data store reference')\n    ),\n    'create.subprocess-expanded': {\n      group: 'activity',\n      className: 'bpmn-icon-subprocess-expanded',\n      title: translate('Create expanded sub-process'),\n      action: {\n        dragstart: createSubprocess,\n        click: createSubprocess\n      }\n    },\n    'create.participant-expanded': {\n      group: 'collaboration',\n      className: 'bpmn-icon-participant',\n      title: translate('Create pool/participant'),\n      action: {\n        dragstart: createParticipant,\n        click: createParticipant\n      }\n    },\n    'create.group': createAction(\n      'bpmn:Group', 'artifact', 'bpmn-icon-group',\n      translate('Create group')\n    ),\n  });\n\n  return actions;\n};\n"
  },
  {
    "path": "lib/features/palette/index.js",
    "content": "import PaletteModule from 'diagram-js/lib/features/palette';\nimport CreateModule from 'diagram-js/lib/features/create';\nimport SpaceToolModule from '../space-tool';\nimport LassoToolModule from 'diagram-js/lib/features/lasso-tool';\nimport HandToolModule from 'diagram-js/lib/features/hand-tool';\nimport GlobalConnectModule from 'diagram-js/lib/features/global-connect';\nimport translate from 'diagram-js/lib/i18n/translate';\n\nimport PaletteProvider from './PaletteProvider';\n\nexport default {\n  __depends__: [\n    PaletteModule,\n    CreateModule,\n    SpaceToolModule,\n    LassoToolModule,\n    HandToolModule,\n    GlobalConnectModule,\n    translate\n  ],\n  __init__: [ 'paletteProvider' ],\n  paletteProvider: [ 'type', PaletteProvider ]\n};\n"
  },
  {
    "path": "lib/features/popup-menu/ReplaceMenuProvider.js",
    "content": "import {\n  getBusinessObject,\n  is\n} from '../../util/ModelUtil';\n\nimport {\n  isEventSubProcess,\n  isExpanded\n} from '../../util/DiUtil';\n\nimport {\n  isDifferentType\n} from './util/TypeUtil';\n\nimport {\n  forEach,\n  filter,\n  isArray\n} from 'min-dash';\n\nimport * as replaceOptions from '../replace/ReplaceOptions';\nimport { canBeNonInterrupting, getInterruptingProperty } from '../modeling/behavior/util/NonInterruptingUtil';\nimport Icons from './util/Icons';\n\n/**\n * @typedef {import('../modeling/BpmnFactory').default} BpmnFactory\n * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').default} PopupMenu\n * @typedef {import('../modeling/Modeling').default} Modeling\n * @typedef {import('../replace/BpmnReplace').default} BpmnReplace\n * @typedef {import('diagram-js/lib/features/Rules').default} Rules\n * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n * @typedef {import('../copy-paste/ModdleCopy').default} ModdleCopy\n *\n * @typedef {import('../../model/Types').Element} Element\n * @typedef {import('../../model/Types').Moddle} Moddle\n *\n * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').PopupMenuEntries} PopupMenuEntries\n * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').PopupMenuEntry} PopupMenuEntry\n * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').PopupMenuEntryAction} PopupMenuEntryAction\n * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').PopupMenuHeaderEntries} PopupMenuHeaderEntries\n * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').default} PopupMenuProvider\n * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').PopupMenuTarget} PopupMenuTarget\n *\n * @typedef {import('./ReplaceOptions').ReplaceOption} ReplaceOption\n */\n\n/**\n * A BPMN-specific popup menu provider.\n *\n * @implements {PopupMenuProvider}\n *\n * @param {BpmnFactory} bpmnFactory\n * @param {PopupMenu} popupMenu\n * @param {Modeling} modeling\n * @param {Moddle} moddle\n * @param {BpmnReplace} bpmnReplace\n * @param {Rules} rules\n * @param {Translate} translate\n * @param {ModdleCopy} moddleCopy\n */\nexport default function ReplaceMenuProvider(\n    bpmnFactory, popupMenu, modeling, moddle,\n    bpmnReplace, rules, translate, moddleCopy) {\n\n  this._bpmnFactory = bpmnFactory;\n  this._popupMenu = popupMenu;\n  this._modeling = modeling;\n  this._moddle = moddle;\n  this._bpmnReplace = bpmnReplace;\n  this._rules = rules;\n  this._translate = translate;\n  this._moddleCopy = moddleCopy;\n\n  this._register();\n}\n\nReplaceMenuProvider.$inject = [\n  'bpmnFactory',\n  'popupMenu',\n  'modeling',\n  'moddle',\n  'bpmnReplace',\n  'rules',\n  'translate',\n  'moddleCopy'\n];\n\nReplaceMenuProvider.prototype._register = function() {\n  this._popupMenu.registerProvider('bpmn-replace', this);\n};\n\n/**\n * @param {PopupMenuTarget} target\n *\n * @return {PopupMenuEntries}\n */\nReplaceMenuProvider.prototype.getPopupMenuEntries = function(target) {\n\n  var businessObject = target.businessObject;\n\n  var rules = this._rules;\n\n  var sameTypeEventOptions = [],\n      eventDefinitionType;\n\n  var filteredReplaceOptions = [];\n\n  if (isArray(target) || !rules.allowed('shape.replace', { element: target })) {\n    return {};\n  }\n\n  var differentType = isDifferentType(target);\n\n  if (is(businessObject, 'bpmn:DataObjectReference')) {\n    return this._createEntries(target, replaceOptions.DATA_OBJECT_REFERENCE);\n  }\n\n  if (is(businessObject, 'bpmn:DataStoreReference') && !is(target.parent, 'bpmn:Collaboration')) {\n    return this._createEntries(target, replaceOptions.DATA_STORE_REFERENCE);\n  }\n\n  // typed start, intermediate, and end events\n  if (is(businessObject, 'bpmn:Event') && !is(businessObject, 'bpmn:BoundaryEvent')) {\n    eventDefinitionType = businessObject.get('eventDefinitions')[0]?.$type;\n\n    sameTypeEventOptions = replaceOptions.TYPED_EVENT[eventDefinitionType] || [];\n\n    if (!isEventSubProcess(businessObject.$parent) && is(businessObject.$parent, 'bpmn:SubProcess')) {\n      sameTypeEventOptions = filter(sameTypeEventOptions, function(option) {\n        return option.target.type !== 'bpmn:StartEvent';\n      });\n    }\n  }\n\n  // start events outside sub processes\n  if (is(businessObject, 'bpmn:StartEvent') && !is(businessObject.$parent, 'bpmn:SubProcess')) {\n\n    filteredReplaceOptions = filter(\n      replaceOptions.START_EVENT.concat(sameTypeEventOptions),\n      differentType\n    );\n\n    return this._createEntries(target, filteredReplaceOptions);\n  }\n\n  // expanded/collapsed pools\n  if (is(businessObject, 'bpmn:Participant')) {\n\n    filteredReplaceOptions = filter(replaceOptions.PARTICIPANT, function(replaceOption) {\n      return isExpanded(target) !== replaceOption.target.isExpanded;\n    });\n\n    return this._createEntries(target, filteredReplaceOptions);\n  }\n\n  // start events inside event sub processes\n  if (is(businessObject, 'bpmn:StartEvent') && isEventSubProcess(businessObject.$parent)) {\n    filteredReplaceOptions = filter(\n      replaceOptions.EVENT_SUB_PROCESS_START_EVENT.concat(sameTypeEventOptions), function(replaceOption) {\n\n        var target = replaceOption.target;\n\n        var isInterrupting = target.isInterrupting !== false;\n\n        var isInterruptingEqual = businessObject.isInterrupting === isInterrupting;\n\n        // filters elements which types and event definition are equal but have have different interrupting types\n        return differentType(replaceOption) || !differentType(replaceOption) && !isInterruptingEqual;\n\n      }\n    );\n\n    return this._createEntries(target, filteredReplaceOptions);\n  }\n\n  // start events inside sub processes\n  if (is(businessObject, 'bpmn:StartEvent') && !isEventSubProcess(businessObject.$parent)\n      && is(businessObject.$parent, 'bpmn:SubProcess')) {\n    filteredReplaceOptions = filter(\n      replaceOptions.START_EVENT_SUB_PROCESS.concat(sameTypeEventOptions),\n      differentType\n    );\n\n    return this._createEntries(target, filteredReplaceOptions);\n  }\n\n  // end events\n  if (is(businessObject, 'bpmn:EndEvent')) {\n\n    filteredReplaceOptions = filter(replaceOptions.END_EVENT.concat(sameTypeEventOptions), function(replaceOption) {\n      var target = replaceOption.target;\n\n      // hide cancel end events outside transactions\n      if (target.eventDefinitionType == 'bpmn:CancelEventDefinition' && !is(businessObject.$parent, 'bpmn:Transaction')) {\n        return false;\n      }\n\n      return differentType(replaceOption);\n    });\n\n    return this._createEntries(target, filteredReplaceOptions);\n  }\n\n  // boundary events\n  if (is(businessObject, 'bpmn:BoundaryEvent')) {\n\n    filteredReplaceOptions = filter(replaceOptions.BOUNDARY_EVENT, function(replaceOption) {\n\n      var target = replaceOption.target;\n\n      if (target.eventDefinitionType == 'bpmn:CancelEventDefinition' &&\n         !is(businessObject.attachedToRef, 'bpmn:Transaction')) {\n        return false;\n      }\n      var cancelActivity = target.cancelActivity !== false;\n\n      var isCancelActivityEqual = businessObject.cancelActivity == cancelActivity;\n\n      return differentType(replaceOption) || !differentType(replaceOption) && !isCancelActivityEqual;\n    });\n\n    return this._createEntries(target, filteredReplaceOptions);\n  }\n\n  // intermediate events\n  if (is(businessObject, 'bpmn:IntermediateCatchEvent') ||\n      is(businessObject, 'bpmn:IntermediateThrowEvent')) {\n\n    filteredReplaceOptions = filter(\n      replaceOptions.INTERMEDIATE_EVENT.concat(sameTypeEventOptions),\n      differentType\n    );\n\n    return this._createEntries(target, filteredReplaceOptions);\n  }\n\n  // gateways\n  if (is(businessObject, 'bpmn:Gateway')) {\n\n    filteredReplaceOptions = filter(replaceOptions.GATEWAY, differentType);\n\n    return this._createEntries(target, filteredReplaceOptions);\n  }\n\n  // transactions\n  if (is(businessObject, 'bpmn:Transaction')) {\n\n    filteredReplaceOptions = filter(replaceOptions.TRANSACTION, differentType);\n\n    return this._createEntries(target, filteredReplaceOptions);\n  }\n\n  // expanded event sub processes\n  if (isEventSubProcess(businessObject) && isExpanded(target)) {\n\n    filteredReplaceOptions = filter(replaceOptions.EVENT_SUB_PROCESS, differentType);\n\n    return this._createEntries(target, filteredReplaceOptions);\n  }\n\n  // expanded ad hoc sub processes\n  if (is(businessObject, 'bpmn:AdHocSubProcess') && isExpanded(target)) {\n\n    filteredReplaceOptions = filter(replaceOptions.AD_HOC_SUBPROCESS_EXPANDED, differentType);\n\n    return this._createEntries(target, filteredReplaceOptions);\n  }\n\n  // expanded sub processes\n  if (is(businessObject, 'bpmn:SubProcess') && isExpanded(target)) {\n\n    filteredReplaceOptions = filter(replaceOptions.SUBPROCESS_EXPANDED, differentType);\n\n    return this._createEntries(target, filteredReplaceOptions);\n  }\n\n  // collapsed sub process or collapsed ad hoc sub process\n  if (is(businessObject, 'bpmn:SubProcess') && !isExpanded(target)) {\n\n    filteredReplaceOptions = filter(replaceOptions.TASK, function(replaceOption) {\n\n      var isTargetSameType = replaceOption.target.type === target.type;\n      var isTargetExpanded = replaceOption.target.isExpanded === true;\n\n      // Collapsed subprocess cannot be replaced with itself or expanded subprocess of different type.\n      return isTargetSameType === isTargetExpanded;\n    });\n\n    return this._createEntries(target, filteredReplaceOptions);\n  }\n\n  // sequence flows\n  if (is(businessObject, 'bpmn:SequenceFlow')) {\n    return this._createSequenceFlowEntries(target, replaceOptions.SEQUENCE_FLOW);\n  }\n\n  // flow nodes\n  if (is(businessObject, 'bpmn:FlowNode')) {\n    filteredReplaceOptions = filter(replaceOptions.TASK, differentType);\n\n    return this._createEntries(target, filteredReplaceOptions);\n  }\n\n  return {};\n};\n\n/**\n * @param {PopupMenuTarget} target\n *\n * @return {PopupMenuHeaderEntries}\n */\nReplaceMenuProvider.prototype.getPopupMenuHeaderEntries = function(target) {\n\n  var headerEntries = {};\n\n  if (is(target, 'bpmn:Activity') && !isEventSubProcess(target)) {\n    headerEntries = {\n      ...headerEntries,\n      ...this._getLoopCharacteristicsHeaderEntries(target)\n    };\n  }\n\n  if (is(target, 'bpmn:DataObjectReference')) {\n    headerEntries = {\n      ...headerEntries,\n      ...this._getCollectionHeaderEntries(target)\n    };\n  }\n\n  if (is(target, 'bpmn:Participant')) {\n    headerEntries = {\n      ...headerEntries,\n      ...this._getParticipantMultiplicityHeaderEntries(target)\n    };\n  }\n\n  if (canBeNonInterrupting(target)) {\n    headerEntries = {\n      ...headerEntries,\n      ...this._getNonInterruptingHeaderEntries(target)\n    };\n  }\n\n  return headerEntries;\n};\n\n\n/**\n * Create popup menu entries for the given target.\n *\n * @param  {PopupMenuTarget} target\n * @param  {ReplaceOption[]} replaceOptions\n *\n * @return {PopupMenuEntries}\n */\nReplaceMenuProvider.prototype._createEntries = function(target, replaceOptions) {\n  var entries = {};\n\n  var self = this;\n\n  forEach(replaceOptions, function(replaceOption) {\n    entries[ replaceOption.actionName ] = self._createEntry(replaceOption, target);\n  });\n\n  return entries;\n};\n\n/**\n * Creates popup menu entries for the given sequence flow.\n *\n * @param  {PopupMenuTarget} target\n * @param  {ReplaceOption[]} replaceOptions\n *\n * @return {PopupMenuEntries}\n */\nReplaceMenuProvider.prototype._createSequenceFlowEntries = function(target, replaceOptions) {\n\n  var businessObject = getBusinessObject(target);\n\n  var entries = {};\n\n  var modeling = this._modeling,\n      moddle = this._moddle;\n\n  var self = this;\n\n  forEach(replaceOptions, function(replaceOption) {\n\n    switch (replaceOption.actionName) {\n    case 'replace-with-default-flow':\n      if (businessObject.sourceRef.default !== businessObject &&\n            (is(businessObject.sourceRef, 'bpmn:ExclusiveGateway') ||\n             is(businessObject.sourceRef, 'bpmn:InclusiveGateway') ||\n             is(businessObject.sourceRef, 'bpmn:ComplexGateway') ||\n             is(businessObject.sourceRef, 'bpmn:Activity'))) {\n\n        entries = {\n          ...entries,\n          [ replaceOption.actionName ]: self._createEntry(replaceOption, target, function() {\n            modeling.updateProperties(target.source, { default: businessObject });\n          })\n        };\n      }\n      break;\n    case 'replace-with-conditional-flow':\n      if (!businessObject.conditionExpression && is(businessObject.sourceRef, 'bpmn:Activity')) {\n\n        entries = {\n          ...entries,\n          [ replaceOption.actionName ]: self._createEntry(replaceOption, target, function() {\n            var conditionExpression = moddle.create('bpmn:FormalExpression', { body: '' });\n\n            modeling.updateProperties(target, { conditionExpression: conditionExpression });\n          })\n        };\n      }\n      break;\n    default:\n\n      // conditional flow -> sequence flow\n      if (is(businessObject.sourceRef, 'bpmn:Activity') && businessObject.conditionExpression) {\n        entries = {\n          ...entries,\n          [ replaceOption.actionName ]: self._createEntry(replaceOption, target, function() {\n            modeling.updateProperties(target, { conditionExpression: undefined });\n          })\n        };\n      }\n\n      // default flow -> sequence flow\n      if ((is(businessObject.sourceRef, 'bpmn:ExclusiveGateway') ||\n           is(businessObject.sourceRef, 'bpmn:InclusiveGateway') ||\n           is(businessObject.sourceRef, 'bpmn:ComplexGateway') ||\n           is(businessObject.sourceRef, 'bpmn:Activity')) &&\n           businessObject.sourceRef.default === businessObject) {\n        entries = {\n          ...entries,\n          [ replaceOption.actionName ]: self._createEntry(replaceOption, target, function() {\n            modeling.updateProperties(target.source, { default: undefined });\n          })\n        };\n      }\n    }\n  });\n\n  return entries;\n};\n\n/**\n * Create a popup menu entry for the given replace option.\n *\n * @param  {ReplaceOption} replaceOption\n * @param  {PopupMenuTarget} target\n * @param  {PopupMenuEntryAction} [action]\n *\n * @return {PopupMenuEntry}\n */\nReplaceMenuProvider.prototype._createEntry = function(replaceOption, target, action) {\n  var translate = this._translate;\n  var replaceElement = this._bpmnReplace.replaceElement;\n\n  var replaceAction = function() {\n    return replaceElement(target, replaceOption.target);\n  };\n\n  var label = replaceOption.label;\n  if (label && typeof label === 'function') {\n    label = label(target);\n  }\n\n  action = action || replaceAction;\n\n  return {\n    label: translate(label),\n    className: replaceOption.className,\n    action: action\n  };\n};\n\n/**\n * Get popup menu header entries for the loop characteristics of the given BPMN element.\n *\n * @param  {PopupMenuTarget} target\n *\n * @return {PopupMenuHeaderEntries}\n */\nReplaceMenuProvider.prototype._getLoopCharacteristicsHeaderEntries = function(target) {\n\n  var self = this;\n  var translate = this._translate;\n\n  function toggleLoopCharacteristics(event, entry) {\n    if (entry.active) {\n      self._modeling.updateProperties(target, { loopCharacteristics: undefined });\n\n      return;\n    }\n\n    var loopCharacteristics = target.businessObject.get('loopCharacteristics');\n\n    if (loopCharacteristics && is(loopCharacteristics, entry.options.loopCharacteristics)) {\n      self._modeling.updateModdleProperties(target, loopCharacteristics, { isSequential: entry.options.isSequential });\n    } else {\n      loopCharacteristics = self._moddle.create(entry.options.loopCharacteristics, {\n        isSequential: entry.options.isSequential\n      });\n\n      self._modeling.updateProperties(target, { loopCharacteristics: loopCharacteristics });\n    }\n  }\n\n  var businessObject = getBusinessObject(target),\n      loopCharacteristics = businessObject.loopCharacteristics;\n\n  var isSequential,\n      isLoop,\n      isParallel;\n\n  if (loopCharacteristics) {\n    isSequential = loopCharacteristics.isSequential;\n    isLoop = loopCharacteristics.isSequential === undefined;\n    isParallel = loopCharacteristics.isSequential !== undefined && !loopCharacteristics.isSequential;\n  }\n\n\n  return {\n    'toggle-parallel-mi' : {\n      className: 'bpmn-icon-parallel-mi-marker',\n      title: translate('Parallel multi-instance'),\n      active: isParallel,\n      action: toggleLoopCharacteristics,\n      options: {\n        loopCharacteristics: 'bpmn:MultiInstanceLoopCharacteristics',\n        isSequential: false\n      }\n    },\n    'toggle-sequential-mi': {\n      className: 'bpmn-icon-sequential-mi-marker',\n      title: translate('Sequential multi-instance'),\n      active: isSequential,\n      action: toggleLoopCharacteristics,\n      options: {\n        loopCharacteristics: 'bpmn:MultiInstanceLoopCharacteristics',\n        isSequential: true\n      }\n    },\n    'toggle-loop': {\n      className: 'bpmn-icon-loop-marker',\n      title: translate('Loop'),\n      active: isLoop,\n      action: toggleLoopCharacteristics,\n      options: {\n        loopCharacteristics: 'bpmn:StandardLoopCharacteristics'\n      }\n    }\n  };\n};\n\n/**\n * Get popup menu header entries for the collection property of the given BPMN element.\n *\n * @param  {PopupMenuTarget} target\n *\n * @return {PopupMenuHeaderEntries}\n */\nReplaceMenuProvider.prototype._getCollectionHeaderEntries = function(target) {\n\n  var self = this;\n  var translate = this._translate;\n\n  var dataObject = target.businessObject.dataObjectRef;\n\n  if (!dataObject) {\n    return {};\n  }\n\n  function toggleIsCollection(event, entry) {\n    self._modeling.updateModdleProperties(\n      target,\n      dataObject,\n      { isCollection: !entry.active });\n  }\n\n  var isCollection = dataObject.isCollection;\n\n  return {\n    'toggle-is-collection': {\n      className: 'bpmn-icon-parallel-mi-marker',\n      title: translate('Collection'),\n      active: isCollection,\n      action: toggleIsCollection,\n    }\n  };\n};\n\n/**\n * Get popup menu header entries for the participant multiplicity property of the given BPMN element.\n *\n * @param  {PopupMenuTarget} target\n *\n * @return {PopupMenuHeaderEntries}\n */\nReplaceMenuProvider.prototype._getParticipantMultiplicityHeaderEntries = function(target) {\n\n  var self = this;\n  var bpmnFactory = this._bpmnFactory;\n  var translate = this._translate;\n\n  function toggleParticipantMultiplicity(event, entry) {\n    var isActive = entry.active;\n    var participantMultiplicity;\n\n    if (!isActive) {\n      participantMultiplicity = bpmnFactory.create('bpmn:ParticipantMultiplicity');\n    }\n\n    self._modeling.updateProperties(\n      target,\n      { participantMultiplicity: participantMultiplicity });\n  }\n\n  var participantMultiplicity = target.businessObject.participantMultiplicity;\n\n  return {\n    'toggle-participant-multiplicity': {\n      className: 'bpmn-icon-parallel-mi-marker',\n      title: translate('Participant multiplicity'),\n      active: !!participantMultiplicity,\n      action: toggleParticipantMultiplicity,\n    }\n  };\n};\n\nReplaceMenuProvider.prototype._getNonInterruptingHeaderEntries = function(element) {\n  const translate = this._translate;\n  const businessObject = getBusinessObject(element);\n  const self = this;\n\n  const interruptingProperty = getInterruptingProperty(element);\n\n  const icon = is(element, 'bpmn:BoundaryEvent') ? Icons['intermediate-event-non-interrupting'] : Icons['start-event-non-interrupting'];\n\n  const isNonInterrupting = !businessObject[interruptingProperty];\n\n  return {\n    'toggle-non-interrupting': {\n      imageHtml: icon,\n      title: translate('Toggle non-interrupting'),\n      active: isNonInterrupting,\n      action: function() {\n        self._modeling.updateProperties(element, {\n          [interruptingProperty]: !!isNonInterrupting\n        });\n      }\n    }\n  };\n};"
  },
  {
    "path": "lib/features/popup-menu/index.js",
    "content": "import PopupMenuModule from 'diagram-js/lib/features/popup-menu';\nimport ReplaceModule from '../replace';\n\nimport ReplaceMenuProvider from './ReplaceMenuProvider';\nimport AutoPlaceModule from '../auto-place';\n\nexport default {\n  __depends__: [\n    PopupMenuModule,\n    ReplaceModule,\n    AutoPlaceModule\n  ],\n  __init__: [\n    'replaceMenuProvider'\n  ],\n  replaceMenuProvider: [ 'type', ReplaceMenuProvider ]\n};"
  },
  {
    "path": "lib/features/popup-menu/util/Icons.js",
    "content": "export default {\n  'start-event-non-interrupting': `\n  <svg viewBox=\"0 0 2048 2048\" xmlns=\"http://www.w3.org/2000/svg\">\n    <g transform=\"translate(0 995.64)\">\n      <path d=\"m1899 28.357c21.545 567.43-598.38 1023.5-1133.6 835.92-548.09-147.21-801.57-873.95-463.59-1330 302.62-480.3 1071.7-507.54 1407.6-49.847 122.14 153.12 190.07 348.07 189.59 543.91z\" fill=\"none\" stroke=\"currentColor\" stroke-dasharray=\"418.310422, 361.2328165\" stroke-linecap=\"round\" stroke-width=\"100\"/>\n    </g>\n  </svg>`,\n  'intermediate-event-non-interrupting': `\n  <svg viewBox=\"0 0 2048 2048\" xmlns=\"http://www.w3.org/2000/svg\">\n     <g transform=\"translate(0 995.64)\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\">\n        <circle cx=\"1024\" cy=\"28.357\" r=\"875\" stroke-dasharray=\"418.310422, 361.2328165\" stroke-width=\"100\"/>\n        <circle cx=\"1024\" cy=\"28.357\" r=\"685\" stroke-dasharray=\"348.31044857,261.23283643\" stroke-dashoffset=\"500\" stroke-width=\"100\"/>\n     </g>\n  </svg>`\n};"
  },
  {
    "path": "lib/features/popup-menu/util/TypeUtil.js",
    "content": "import {\n  getBusinessObject\n} from '../../../util/ModelUtil';\n\nimport {\n  isExpanded\n} from '../../../util/DiUtil';\n\n/**\n * @typedef {import('../../../model/Types').Element} Element\n * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').PopupMenuTarget} PopupMenuTarget\n *\n * @typedef {(entry: PopupMenuTarget) => boolean} DifferentTypeValidator\n */\n\n/**\n * Returns true, if an element is from a different type\n * than a target definition. Takes into account the type,\n * event definition type and triggeredByEvent property.\n *\n * @param {Element} element\n *\n * @return {DifferentTypeValidator}\n */\nexport function isDifferentType(element) {\n\n  return function(entry) {\n    var target = entry.target;\n\n    var businessObject = getBusinessObject(element),\n        eventDefinition = businessObject.eventDefinitions && businessObject.eventDefinitions[0];\n\n    var isTypeEqual = businessObject.$type === target.type;\n\n    var isEventDefinitionEqual = (\n      (eventDefinition && eventDefinition.$type) === target.eventDefinitionType\n    );\n\n    var isTriggeredByEventEqual = (\n\n      // coherse to <false>\n      !!target.triggeredByEvent === !!businessObject.triggeredByEvent\n    );\n\n    var isExpandedEqual = (\n      target.isExpanded === undefined ||\n      target.isExpanded === isExpanded(element)\n    );\n\n    return !isTypeEqual || !isEventDefinitionEqual || !isTriggeredByEventEqual || !isExpandedEqual;\n  };\n}\n"
  },
  {
    "path": "lib/features/replace/BpmnReplace.js",
    "content": "import {\n  pick,\n  assign,\n  filter,\n  forEach,\n  isArray,\n  isUndefined,\n  has\n} from 'min-dash';\n\nimport {\n  is,\n  getDi,\n  getBusinessObject\n} from '../../util/ModelUtil';\n\nimport {\n  isAny\n} from '../modeling/util/ModelingUtil';\n\nimport {\n  isExpanded,\n  isEventSubProcess,\n  isHorizontal\n} from '../../util/DiUtil';\n\nimport { getPropertyNames } from '../copy-paste/ModdleCopy';\n\n/**\n * @typedef {import('../modeling/BpmnFactory').default} BpmnFactory\n * @typedef {import('../modeling/ElementFactory').default} ElementFactory\n * @typedef {import('../copy-paste/ModdleCopy').default} ModdleCopy\n * @typedef {import('../modeling/Modeling').default} Modeling\n * @typedef {import('diagram-js/lib/features/replace/Replace').default} Replace\n * @typedef {import('diagram-js/lib/features/rules/Rules').default} Rules\n *\n * @typedef {import('../../model/Types').Element} Element\n * @typedef {import('../../model/Types').Shape} Shape\n * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n *\n * @typedef { {\n *   type: string;\n *   cancelActivity: boolean;\n *   instantiate: boolean;\n *   eventGatewayType: string;\n *   triggeredByEvent: boolean;\n *   isInterrupting: boolean;\n *   collapsed: boolean;\n *   isExpanded: boolean;\n *   eventDefinitionType: string;\n *   eventDefinitionAttrs: Object;\n *   host: Shape;\n * } } TargetElement\n *\n * @typedef { {\n *   moveChildren: boolean;\n * } & Record<string, any> } Hints\n */\n\nfunction copyProperties(source, target, properties) {\n  if (!isArray(properties)) {\n    properties = [ properties ];\n  }\n\n  forEach(properties, function(property) {\n    if (!isUndefined(source[property])) {\n      target[property] = source[property];\n    }\n  });\n}\n\n\nvar CUSTOM_PROPERTIES = [\n  'cancelActivity',\n  'instantiate',\n  'eventGatewayType',\n  'triggeredByEvent',\n  'isInterrupting'\n];\n\n/**\n * Check if element should be collapsed or expanded.\n */\nfunction shouldToggleCollapsed(element, targetElement) {\n\n  var oldCollapsed = (\n    element && has(element, 'collapsed') ? element.collapsed : !isExpanded(element)\n  );\n\n  var targetCollapsed;\n\n  if (targetElement && (has(targetElement, 'collapsed') || has(targetElement, 'isExpanded'))) {\n\n    // property is explicitly set so use it\n    targetCollapsed = (\n      has(targetElement, 'collapsed') ? targetElement.collapsed : !targetElement.isExpanded\n    );\n  } else {\n\n    // keep old state\n    targetCollapsed = oldCollapsed;\n  }\n\n  if (oldCollapsed !== targetCollapsed) {\n    return true;\n  }\n\n  return false;\n}\n\n\n/**\n * BPMN-specific replace.\n *\n * @param {BpmnFactory} bpmnFactory\n * @param {ElementFactory} elementFactory\n * @param {ModdleCopy} moddleCopy\n * @param {Modeling} modeling\n * @param {Replace} replace\n * @param {Rules} rules\n */\nexport default function BpmnReplace(\n    bpmnFactory,\n    elementFactory,\n    moddleCopy,\n    modeling,\n    replace,\n    rules\n) {\n\n  /**\n   * Prepares a new business object for the replacement element\n   * and triggers the replace operation.\n   *\n   * @param  {Element} element\n   * @param  {TargetElement} targetElement\n   * @param  {Hints} [hints]\n   *\n   * @return {Element}\n   */\n  function replaceElement(element, targetElement, hints) {\n\n    hints = hints || {};\n\n    var type = targetElement.type,\n        oldBusinessObject = element.businessObject;\n\n    if (isSubProcess(oldBusinessObject) && (type === 'bpmn:SubProcess' || type === 'bpmn:AdHocSubProcess')) {\n      if (shouldToggleCollapsed(element, targetElement)) {\n\n        // expanding or collapsing process\n        modeling.toggleCollapse(element);\n\n        return element;\n      }\n    }\n\n    var newBusinessObject = bpmnFactory.create(type);\n\n    var newElement = {\n      type: type,\n      businessObject: newBusinessObject,\n    };\n\n    newElement.di = {};\n\n    if (type === 'bpmn:ExclusiveGateway') {\n      newElement.di.isMarkerVisible = true;\n    }\n\n    // colors will be set to DI\n    copyProperties(element.di, newElement.di, [\n      'fill',\n      'stroke',\n      'background-color',\n      'border-color',\n      'color'\n    ]);\n\n    var elementProps = getPropertyNames(oldBusinessObject.$descriptor),\n        newElementProps = getPropertyNames(newBusinessObject.$descriptor, true),\n        copyProps = intersection(elementProps, newElementProps);\n\n    // initialize special properties defined in target definition\n    assign(newBusinessObject, pick(targetElement, CUSTOM_PROPERTIES));\n\n    var properties = filter(copyProps, function(propertyName) {\n\n      // copying event definitions, unless we replace\n      if (propertyName === 'eventDefinitions') {\n        return hasEventDefinition(element, targetElement.eventDefinitionType);\n      }\n\n      // retain loop characteristics if the target element\n      // is not an event sub process\n      if (propertyName === 'loopCharacteristics') {\n        return !isEventSubProcess(newBusinessObject);\n      }\n\n      // so the applied properties from 'target' don't get lost\n      if (has(newBusinessObject, propertyName)) {\n        return false;\n      }\n\n      if (propertyName === 'processRef' && targetElement.isExpanded === false) {\n        return false;\n      }\n\n      if (propertyName === 'triggeredByEvent') {\n        return false;\n      }\n\n      if (propertyName === 'isForCompensation') {\n        return !isEventSubProcess(newBusinessObject);\n      }\n\n      return true;\n    });\n\n    newBusinessObject = moddleCopy.copyElement(\n      oldBusinessObject,\n      newBusinessObject,\n      properties\n    );\n\n    // initialize custom BPMN extensions\n    if (targetElement.eventDefinitionType) {\n\n      // only initialize with new eventDefinition\n      // if we did not set an event definition yet,\n      // i.e. because we copied it\n      if (!hasEventDefinition(newBusinessObject, targetElement.eventDefinitionType)) {\n        newElement.eventDefinitionType = targetElement.eventDefinitionType;\n        newElement.eventDefinitionAttrs = targetElement.eventDefinitionAttrs;\n      }\n    }\n\n    if (is(oldBusinessObject, 'bpmn:Activity')) {\n\n      if (isSubProcess(oldBusinessObject)) {\n\n        // no toggeling, so keep old state\n        newElement.isExpanded = isExpanded(element);\n      }\n\n      // else if property is explicitly set, use it\n      else if (targetElement && has(targetElement, 'isExpanded')) {\n        newElement.isExpanded = targetElement.isExpanded;\n\n        // assign default size of new expanded element\n        var defaultSize = elementFactory.getDefaultSize(newBusinessObject, {\n          isExpanded: newElement.isExpanded\n        });\n\n        newElement.width = defaultSize.width;\n        newElement.height = defaultSize.height;\n\n        // keep element centered\n        newElement.x = element.x - (newElement.width - element.width) / 2;\n        newElement.y = element.y - (newElement.height - element.height) / 2;\n      }\n\n      // TODO: need also to respect min/max Size\n      // copy size, from an expanded subprocess to an expanded alternative subprocess\n      // except bpmn:Task, because Task is always expanded\n      if ((isExpanded(element) && !is(oldBusinessObject, 'bpmn:Task')) && newElement.isExpanded) {\n        newElement.width = element.width;\n        newElement.height = element.height;\n      }\n    }\n\n    // remove children if not expanding sub process\n    if (isSubProcess(oldBusinessObject) && !isSubProcess(newBusinessObject)) {\n      hints.moveChildren = false;\n    }\n\n    // transform collapsed/expanded pools\n    if (is(oldBusinessObject, 'bpmn:Participant')) {\n\n      // create expanded pool\n      if (targetElement.isExpanded === true) {\n        newBusinessObject.processRef = bpmnFactory.create('bpmn:Process');\n      } else {\n\n        // remove children when transforming to collapsed pool\n        hints.moveChildren = false;\n      }\n\n      // apply same directionality\n      var isHorizontalPool = isHorizontal(element);\n      if (!getDi(element).isHorizontal) {\n        getDi(newElement).isHorizontal = isHorizontalPool;\n      }\n\n      // keep the existing size of the pool's direction to\n      // prevent dangling message flows\n      newElement.width = isHorizontalPool ? element.width : elementFactory.getDefaultSize(newElement).width;\n      newElement.height = isHorizontalPool ? elementFactory.getDefaultSize(newElement).height : element.height;\n    }\n\n    if (!rules.allowed('shape.resize', { shape: newBusinessObject })) {\n      newElement.height = elementFactory.getDefaultSize(newElement).height;\n      newElement.width = elementFactory.getDefaultSize(newElement).width;\n    }\n\n    newBusinessObject.name = oldBusinessObject.name;\n\n    // retain default flow's reference between inclusive <-> exclusive gateways and activities\n    if (\n      isAny(oldBusinessObject, [\n        'bpmn:ExclusiveGateway',\n        'bpmn:InclusiveGateway',\n        'bpmn:Activity'\n      ]) &&\n      isAny(newBusinessObject, [\n        'bpmn:ExclusiveGateway',\n        'bpmn:InclusiveGateway',\n        'bpmn:Activity'\n      ])\n    ) {\n      newBusinessObject.default = oldBusinessObject.default;\n    }\n\n    if (\n      targetElement.host &&\n      !is(oldBusinessObject, 'bpmn:BoundaryEvent') &&\n      is(newBusinessObject, 'bpmn:BoundaryEvent')\n    ) {\n      newElement.host = targetElement.host;\n    }\n\n    // The DataStoreReference element is 14px wider than the DataObjectReference element\n    // This ensures that they stay centered on the x axis when replaced\n    if (\n      newElement.type === 'bpmn:DataStoreReference' ||\n      newElement.type === 'bpmn:DataObjectReference'\n    ) {\n      newElement.x = element.x + (element.width - newElement.width) / 2;\n    }\n\n    return replace.replaceElement(element, newElement, { ...hints, targetElement });\n  }\n\n  this.replaceElement = replaceElement;\n}\n\nBpmnReplace.$inject = [\n  'bpmnFactory',\n  'elementFactory',\n  'moddleCopy',\n  'modeling',\n  'replace',\n  'rules'\n];\n\n/**\n * @param {ModdleElement} businessObject\n *\n * @return {boolean}\n */\nfunction isSubProcess(businessObject) {\n  return is(businessObject, 'bpmn:SubProcess');\n}\n\n/**\n * @param {Element|ModdleElement} element\n * @param {string} type\n *\n * @return {boolean}\n */\nfunction hasEventDefinition(element, type) {\n  var businessObject = getBusinessObject(element);\n\n  return type && businessObject.get('eventDefinitions').some(function(definition) {\n    return is(definition, type);\n  });\n}\n\n/**\n * Compute intersection between two arrays.\n *\n * @param {Array} a\n * @param {Array} b\n *\n * @return {Array}\n */\nfunction intersection(a, b) {\n  return a.filter(function(item) {\n    return b.includes(item);\n  });\n}\n"
  },
  {
    "path": "lib/features/replace/ReplaceOptions.js",
    "content": "/**\n * @typedef { () => string } LabelGetter\n *\n * @typedef { {\n *   label: string | LabelGetter;\n *   actionName: string;\n *   className: string;\n *   target?: {\n *     type: string;\n *     isExpanded?: boolean;\n *     isInterrupting?: boolean;\n *     triggeredByEvent?: boolean;\n *     cancelActivity?: boolean;\n *     eventDefinitionType?: string;\n *     eventDefinitionAttrs?: Record<string, any>\n *   };\n * } } ReplaceOption\n */\n\n/**\n * @type {ReplaceOption[]}\n */\nexport var START_EVENT = [\n  {\n    label: 'Start event',\n    actionName: 'replace-with-none-start',\n    className: 'bpmn-icon-start-event-none',\n    target: {\n      type: 'bpmn:StartEvent'\n    }\n  },\n  {\n    label: 'Intermediate throw event',\n    actionName: 'replace-with-none-intermediate-throwing',\n    className: 'bpmn-icon-intermediate-event-none',\n    target: {\n      type: 'bpmn:IntermediateThrowEvent'\n    }\n  },\n  {\n    label: 'End event',\n    actionName: 'replace-with-none-end',\n    className: 'bpmn-icon-end-event-none',\n    target: {\n      type: 'bpmn:EndEvent'\n    }\n  },\n  {\n    label: 'Message start event',\n    actionName: 'replace-with-message-start',\n    className: 'bpmn-icon-start-event-message',\n    target: {\n      type: 'bpmn:StartEvent',\n      eventDefinitionType: 'bpmn:MessageEventDefinition'\n    }\n  },\n  {\n    label: 'Timer start event',\n    actionName: 'replace-with-timer-start',\n    className: 'bpmn-icon-start-event-timer',\n    target: {\n      type: 'bpmn:StartEvent',\n      eventDefinitionType: 'bpmn:TimerEventDefinition'\n    }\n  },\n  {\n    label: 'Conditional start event',\n    actionName: 'replace-with-conditional-start',\n    className: 'bpmn-icon-start-event-condition',\n    target: {\n      type: 'bpmn:StartEvent',\n      eventDefinitionType: 'bpmn:ConditionalEventDefinition'\n    }\n  },\n  {\n    label: 'Signal start event',\n    actionName: 'replace-with-signal-start',\n    className: 'bpmn-icon-start-event-signal',\n    target: {\n      type: 'bpmn:StartEvent',\n      eventDefinitionType: 'bpmn:SignalEventDefinition'\n    }\n  }\n];\n\n/**\n * @type {ReplaceOption[]}\n */\nexport var START_EVENT_SUB_PROCESS = [\n  {\n    label: 'Start event',\n    actionName: 'replace-with-none-start',\n    className: 'bpmn-icon-start-event-none',\n    target: {\n      type: 'bpmn:StartEvent'\n    }\n  },\n  {\n    label: 'Intermediate throw event',\n    actionName: 'replace-with-none-intermediate-throwing',\n    className: 'bpmn-icon-intermediate-event-none',\n    target: {\n      type: 'bpmn:IntermediateThrowEvent'\n    }\n  },\n  {\n    label: 'End event',\n    actionName: 'replace-with-none-end',\n    className: 'bpmn-icon-end-event-none',\n    target: {\n      type: 'bpmn:EndEvent'\n    }\n  }\n];\n\n/**\n * @type {ReplaceOption[]}\n */\nexport var INTERMEDIATE_EVENT = [\n  {\n    label: 'Start event',\n    actionName: 'replace-with-none-start',\n    className: 'bpmn-icon-start-event-none',\n    target: {\n      type: 'bpmn:StartEvent'\n    }\n  },\n  {\n    label: 'Intermediate throw event',\n    actionName: 'replace-with-none-intermediate-throw',\n    className: 'bpmn-icon-intermediate-event-none',\n    target: {\n      type: 'bpmn:IntermediateThrowEvent'\n    }\n  },\n  {\n    label: 'End event',\n    actionName: 'replace-with-none-end',\n    className: 'bpmn-icon-end-event-none',\n    target: {\n      type: 'bpmn:EndEvent'\n    }\n  },\n  {\n    label: 'Message intermediate catch event',\n    actionName: 'replace-with-message-intermediate-catch',\n    className: 'bpmn-icon-intermediate-event-catch-message',\n    target: {\n      type: 'bpmn:IntermediateCatchEvent',\n      eventDefinitionType: 'bpmn:MessageEventDefinition'\n    }\n  },\n  {\n    label: 'Message intermediate throw event',\n    actionName: 'replace-with-message-intermediate-throw',\n    className: 'bpmn-icon-intermediate-event-throw-message',\n    target: {\n      type: 'bpmn:IntermediateThrowEvent',\n      eventDefinitionType: 'bpmn:MessageEventDefinition'\n    }\n  },\n  {\n    label: 'Timer intermediate catch event',\n    actionName: 'replace-with-timer-intermediate-catch',\n    className: 'bpmn-icon-intermediate-event-catch-timer',\n    target: {\n      type: 'bpmn:IntermediateCatchEvent',\n      eventDefinitionType: 'bpmn:TimerEventDefinition'\n    }\n  },\n  {\n    label: 'Escalation intermediate throw event',\n    actionName: 'replace-with-escalation-intermediate-throw',\n    className: 'bpmn-icon-intermediate-event-throw-escalation',\n    target: {\n      type: 'bpmn:IntermediateThrowEvent',\n      eventDefinitionType: 'bpmn:EscalationEventDefinition'\n    }\n  },\n  {\n    label: 'Conditional intermediate catch event',\n    actionName: 'replace-with-conditional-intermediate-catch',\n    className: 'bpmn-icon-intermediate-event-catch-condition',\n    target: {\n      type: 'bpmn:IntermediateCatchEvent',\n      eventDefinitionType: 'bpmn:ConditionalEventDefinition'\n    }\n  },\n  {\n    label: 'Link intermediate catch event',\n    actionName: 'replace-with-link-intermediate-catch',\n    className: 'bpmn-icon-intermediate-event-catch-link',\n    target: {\n      type: 'bpmn:IntermediateCatchEvent',\n      eventDefinitionType: 'bpmn:LinkEventDefinition',\n      eventDefinitionAttrs: {\n        name: ''\n      }\n    }\n  },\n  {\n    label: 'Link intermediate throw event',\n    actionName: 'replace-with-link-intermediate-throw',\n    className: 'bpmn-icon-intermediate-event-throw-link',\n    target: {\n      type: 'bpmn:IntermediateThrowEvent',\n      eventDefinitionType: 'bpmn:LinkEventDefinition',\n      eventDefinitionAttrs: {\n        name: ''\n      }\n    }\n  },\n  {\n    label: 'Compensation intermediate throw event',\n    actionName: 'replace-with-compensation-intermediate-throw',\n    className: 'bpmn-icon-intermediate-event-throw-compensation',\n    target: {\n      type: 'bpmn:IntermediateThrowEvent',\n      eventDefinitionType: 'bpmn:CompensateEventDefinition'\n    }\n  },\n  {\n    label: 'Signal intermediate catch event',\n    actionName: 'replace-with-signal-intermediate-catch',\n    className: 'bpmn-icon-intermediate-event-catch-signal',\n    target: {\n      type: 'bpmn:IntermediateCatchEvent',\n      eventDefinitionType: 'bpmn:SignalEventDefinition'\n    }\n  },\n  {\n    label: 'Signal intermediate throw event',\n    actionName: 'replace-with-signal-intermediate-throw',\n    className: 'bpmn-icon-intermediate-event-throw-signal',\n    target: {\n      type: 'bpmn:IntermediateThrowEvent',\n      eventDefinitionType: 'bpmn:SignalEventDefinition'\n    }\n  }\n];\n\n/**\n * @type {ReplaceOption[]}\n */\nexport var END_EVENT = [\n  {\n    label: 'Start event',\n    actionName: 'replace-with-none-start',\n    className: 'bpmn-icon-start-event-none',\n    target: {\n      type: 'bpmn:StartEvent'\n    }\n  },\n  {\n    label: 'Intermediate throw event',\n    actionName: 'replace-with-none-intermediate-throw',\n    className: 'bpmn-icon-intermediate-event-none',\n    target: {\n      type: 'bpmn:IntermediateThrowEvent'\n    }\n  },\n  {\n    label: 'End event',\n    actionName: 'replace-with-none-end',\n    className: 'bpmn-icon-end-event-none',\n    target: {\n      type: 'bpmn:EndEvent'\n    }\n  },\n  {\n    label: 'Message end event',\n    actionName: 'replace-with-message-end',\n    className: 'bpmn-icon-end-event-message',\n    target: {\n      type: 'bpmn:EndEvent',\n      eventDefinitionType: 'bpmn:MessageEventDefinition'\n    }\n  },\n  {\n    label: 'Escalation end event',\n    actionName: 'replace-with-escalation-end',\n    className: 'bpmn-icon-end-event-escalation',\n    target: {\n      type: 'bpmn:EndEvent',\n      eventDefinitionType: 'bpmn:EscalationEventDefinition'\n    }\n  },\n  {\n    label: 'Error end event',\n    actionName: 'replace-with-error-end',\n    className: 'bpmn-icon-end-event-error',\n    target: {\n      type: 'bpmn:EndEvent',\n      eventDefinitionType: 'bpmn:ErrorEventDefinition'\n    }\n  },\n  {\n    label: 'Cancel end event',\n    actionName: 'replace-with-cancel-end',\n    className: 'bpmn-icon-end-event-cancel',\n    target: {\n      type: 'bpmn:EndEvent',\n      eventDefinitionType: 'bpmn:CancelEventDefinition'\n    }\n  },\n  {\n    label: 'Compensation end event',\n    actionName: 'replace-with-compensation-end',\n    className: 'bpmn-icon-end-event-compensation',\n    target: {\n      type: 'bpmn:EndEvent',\n      eventDefinitionType: 'bpmn:CompensateEventDefinition'\n    }\n  },\n  {\n    label: 'Signal end event',\n    actionName: 'replace-with-signal-end',\n    className: 'bpmn-icon-end-event-signal',\n    target: {\n      type: 'bpmn:EndEvent',\n      eventDefinitionType: 'bpmn:SignalEventDefinition'\n    }\n  },\n  {\n    label: 'Terminate end event',\n    actionName: 'replace-with-terminate-end',\n    className: 'bpmn-icon-end-event-terminate',\n    target: {\n      type: 'bpmn:EndEvent',\n      eventDefinitionType: 'bpmn:TerminateEventDefinition'\n    }\n  }\n];\n\n/**\n * @type {ReplaceOption[]}\n */\nexport var GATEWAY = [\n  {\n    label: 'Exclusive gateway',\n    actionName: 'replace-with-exclusive-gateway',\n    className: 'bpmn-icon-gateway-xor',\n    target: {\n      type: 'bpmn:ExclusiveGateway'\n    }\n  },\n  {\n    label: 'Parallel gateway',\n    actionName: 'replace-with-parallel-gateway',\n    className: 'bpmn-icon-gateway-parallel',\n    target: {\n      type: 'bpmn:ParallelGateway'\n    }\n  },\n  {\n    label: 'Inclusive gateway',\n    actionName: 'replace-with-inclusive-gateway',\n    className: 'bpmn-icon-gateway-or',\n    target: {\n      type: 'bpmn:InclusiveGateway'\n    }\n  },\n  {\n    label: 'Complex gateway',\n    actionName: 'replace-with-complex-gateway',\n    className: 'bpmn-icon-gateway-complex',\n    target: {\n      type: 'bpmn:ComplexGateway'\n    }\n  },\n  {\n    label: 'Event-based gateway',\n    actionName: 'replace-with-event-based-gateway',\n    className: 'bpmn-icon-gateway-eventbased',\n    target: {\n      type: 'bpmn:EventBasedGateway',\n      instantiate: false,\n      eventGatewayType: 'Exclusive'\n    }\n  }\n\n  // Gateways deactivated until https://github.com/bpmn-io/bpmn-js/issues/194\n  // {\n  //   label: 'Event based instantiating Gateway',\n  //   actionName: 'replace-with-exclusive-event-based-gateway',\n  //   className: 'bpmn-icon-exclusive-event-based',\n  //   target: {\n  //     type: 'bpmn:EventBasedGateway'\n  //   },\n  //   options: {\n  //     businessObject: { instantiate: true, eventGatewayType: 'Exclusive' }\n  //   }\n  // },\n  // {\n  //   label: 'Parallel Event based instantiating Gateway',\n  //   actionName: 'replace-with-parallel-event-based-instantiate-gateway',\n  //   className: 'bpmn-icon-parallel-event-based-instantiate-gateway',\n  //   target: {\n  //     type: 'bpmn:EventBasedGateway'\n  //   },\n  //   options: {\n  //     businessObject: { instantiate: true, eventGatewayType: 'Parallel' }\n  //   }\n  // }\n];\n\n/**\n * @type {ReplaceOption[]}\n */\nexport var SUBPROCESS_EXPANDED = [\n  {\n    label: 'Transaction',\n    actionName: 'replace-with-transaction',\n    className: 'bpmn-icon-transaction',\n    target: {\n      type: 'bpmn:Transaction',\n      isExpanded: true\n    }\n  },\n  {\n    label: 'Event sub-process',\n    actionName: 'replace-with-event-subprocess',\n    className: 'bpmn-icon-event-subprocess-expanded',\n    target: {\n      type: 'bpmn:SubProcess',\n      triggeredByEvent: true,\n      isExpanded: true\n    }\n  },\n  {\n    label: 'Ad-hoc sub-process',\n    actionName: 'replace-with-ad-hoc-subprocess',\n    className: 'bpmn-icon-subprocess-expanded',\n    target: {\n      type: 'bpmn:AdHocSubProcess',\n      isExpanded: true\n    }\n  },\n  {\n    label: 'Sub-process (collapsed)',\n    actionName: 'replace-with-collapsed-subprocess',\n    className: 'bpmn-icon-subprocess-collapsed',\n    target: {\n      type: 'bpmn:SubProcess',\n      isExpanded: false\n    }\n  }\n];\n\n/**\n * @type {ReplaceOption[]}\n */\nexport var AD_HOC_SUBPROCESS_EXPANDED = [\n  {\n    label: 'Sub-process',\n    actionName: 'replace-with-subprocess',\n    className: 'bpmn-icon-subprocess-expanded',\n    target: {\n      type: 'bpmn:SubProcess',\n      isExpanded: true\n    }\n  },\n  {\n    label: 'Transaction',\n    actionName: 'replace-with-transaction',\n    className: 'bpmn-icon-transaction',\n    target: {\n      type: 'bpmn:Transaction',\n      isExpanded: true\n    }\n  },\n  {\n    label: 'Event sub-process',\n    actionName: 'replace-with-event-subprocess',\n    className: 'bpmn-icon-event-subprocess-expanded',\n    target: {\n      type: 'bpmn:SubProcess',\n      triggeredByEvent: true,\n      isExpanded: true\n    }\n  },\n  {\n    label: 'Ad-hoc sub-process (collapsed)',\n    actionName: 'replace-with-collapsed-ad-hoc-subprocess',\n    className: 'bpmn-icon-subprocess-collapsed',\n    target: {\n      type: 'bpmn:AdHocSubProcess',\n      isExpanded: false\n    }\n  }\n];\n\n/**\n * @type {ReplaceOption[]}\n */\nexport var TRANSACTION = [\n  {\n    label: 'Transaction',\n    actionName: 'replace-with-transaction',\n    className: 'bpmn-icon-transaction',\n    target: {\n      type: 'bpmn:Transaction',\n      isExpanded: true\n    }\n  },\n  {\n    label: 'Sub-process',\n    actionName: 'replace-with-subprocess',\n    className: 'bpmn-icon-subprocess-expanded',\n    target: {\n      type: 'bpmn:SubProcess',\n      isExpanded: true\n    }\n  },\n  {\n    label: 'Ad-hoc sub-process',\n    actionName: 'replace-with-ad-hoc-subprocess',\n    className: 'bpmn-icon-subprocess-expanded',\n    target: {\n      type: 'bpmn:AdHocSubProcess',\n      isExpanded: true\n    }\n  },\n  {\n    label: 'Event sub-process',\n    actionName: 'replace-with-event-subprocess',\n    className: 'bpmn-icon-event-subprocess-expanded',\n    target: {\n      type: 'bpmn:SubProcess',\n      triggeredByEvent: true,\n      isExpanded: true\n    }\n  }\n];\n\n/**\n * @type {ReplaceOption[]}\n */\nexport var EVENT_SUB_PROCESS = TRANSACTION;\n\n/**\n * @type {ReplaceOption[]}\n */\nexport var TASK = [\n  {\n    label: 'Task',\n    actionName: 'replace-with-task',\n    className: 'bpmn-icon-task',\n    target: {\n      type: 'bpmn:Task'\n    }\n  },\n  {\n    label: 'User task',\n    actionName: 'replace-with-user-task',\n    className: 'bpmn-icon-user',\n    target: {\n      type: 'bpmn:UserTask'\n    }\n  },\n  {\n    label: 'Service task',\n    actionName: 'replace-with-service-task',\n    className: 'bpmn-icon-service',\n    target: {\n      type: 'bpmn:ServiceTask'\n    }\n  },\n  {\n    label: 'Send task',\n    actionName: 'replace-with-send-task',\n    className: 'bpmn-icon-send',\n    target: {\n      type: 'bpmn:SendTask'\n    }\n  },\n  {\n    label: 'Receive task',\n    actionName: 'replace-with-receive-task',\n    className: 'bpmn-icon-receive',\n    target: {\n      type: 'bpmn:ReceiveTask'\n    }\n  },\n  {\n    label: 'Manual task',\n    actionName: 'replace-with-manual-task',\n    className: 'bpmn-icon-manual',\n    target: {\n      type: 'bpmn:ManualTask'\n    }\n  },\n  {\n    label: 'Business rule task',\n    actionName: 'replace-with-rule-task',\n    className: 'bpmn-icon-business-rule',\n    target: {\n      type: 'bpmn:BusinessRuleTask'\n    }\n  },\n  {\n    label: 'Script task',\n    actionName: 'replace-with-script-task',\n    className: 'bpmn-icon-script',\n    target: {\n      type: 'bpmn:ScriptTask'\n    }\n  },\n  {\n    label: 'Call activity',\n    actionName: 'replace-with-call-activity',\n    className: 'bpmn-icon-call-activity',\n    target: {\n      type: 'bpmn:CallActivity'\n    }\n  },\n  {\n    label: 'Sub-process (collapsed)',\n    actionName: 'replace-with-collapsed-subprocess',\n    className: 'bpmn-icon-subprocess-collapsed',\n    target: {\n      type: 'bpmn:SubProcess',\n      isExpanded: false\n    }\n  },\n  {\n    label: 'Sub-process (expanded)',\n    actionName: 'replace-with-expanded-subprocess',\n    className: 'bpmn-icon-subprocess-expanded',\n    target: {\n      type: 'bpmn:SubProcess',\n      isExpanded: true\n    }\n  },\n  {\n    label: 'Ad-hoc sub-process (collapsed)',\n    actionName: 'replace-with-collapsed-ad-hoc-subprocess',\n    className: 'bpmn-icon-subprocess-collapsed',\n    target: {\n      type: 'bpmn:AdHocSubProcess',\n      isExpanded: false\n    }\n  },\n  {\n    label: 'Ad-hoc sub-process (expanded)',\n    actionName: 'replace-with-ad-hoc-subprocess',\n    className: 'bpmn-icon-subprocess-expanded',\n    target: {\n      type: 'bpmn:AdHocSubProcess',\n      isExpanded: true\n    }\n  }\n];\n\n/**\n * @type {ReplaceOption[]}\n */\nexport var DATA_OBJECT_REFERENCE = [\n  {\n    label: 'Data store reference',\n    actionName: 'replace-with-data-store-reference',\n    className: 'bpmn-icon-data-store',\n    target: {\n      type: 'bpmn:DataStoreReference'\n    }\n  }\n];\n\n/**\n * @type {ReplaceOption[]}\n */\nexport var DATA_STORE_REFERENCE = [\n  {\n    label: 'Data object reference',\n    actionName: 'replace-with-data-object-reference',\n    className: 'bpmn-icon-data-object',\n    target: {\n      type: 'bpmn:DataObjectReference'\n    }\n  }\n];\n\n/**\n * @type {ReplaceOption[]}\n */\nexport var BOUNDARY_EVENT = [\n  {\n    label: 'Message boundary event',\n    actionName: 'replace-with-message-boundary',\n    className: 'bpmn-icon-intermediate-event-catch-message',\n    target: {\n      type: 'bpmn:BoundaryEvent',\n      eventDefinitionType: 'bpmn:MessageEventDefinition',\n      cancelActivity: true\n    }\n  },\n  {\n    label: 'Timer boundary event',\n    actionName: 'replace-with-timer-boundary',\n    className: 'bpmn-icon-intermediate-event-catch-timer',\n    target: {\n      type: 'bpmn:BoundaryEvent',\n      eventDefinitionType: 'bpmn:TimerEventDefinition',\n      cancelActivity: true\n    }\n  },\n  {\n    label: 'Escalation boundary event',\n    actionName: 'replace-with-escalation-boundary',\n    className: 'bpmn-icon-intermediate-event-catch-escalation',\n    target: {\n      type: 'bpmn:BoundaryEvent',\n      eventDefinitionType: 'bpmn:EscalationEventDefinition',\n      cancelActivity: true\n    }\n  },\n  {\n    label: 'Conditional boundary event',\n    actionName: 'replace-with-conditional-boundary',\n    className: 'bpmn-icon-intermediate-event-catch-condition',\n    target: {\n      type: 'bpmn:BoundaryEvent',\n      eventDefinitionType: 'bpmn:ConditionalEventDefinition',\n      cancelActivity: true\n    }\n  },\n  {\n    label: 'Error boundary event',\n    actionName: 'replace-with-error-boundary',\n    className: 'bpmn-icon-intermediate-event-catch-error',\n    target: {\n      type: 'bpmn:BoundaryEvent',\n      eventDefinitionType: 'bpmn:ErrorEventDefinition',\n      cancelActivity: true\n    }\n  },\n  {\n    label: 'Cancel boundary event',\n    actionName: 'replace-with-cancel-boundary',\n    className: 'bpmn-icon-intermediate-event-catch-cancel',\n    target: {\n      type: 'bpmn:BoundaryEvent',\n      eventDefinitionType: 'bpmn:CancelEventDefinition',\n      cancelActivity: true\n    }\n  },\n  {\n    label: 'Signal boundary event',\n    actionName: 'replace-with-signal-boundary',\n    className: 'bpmn-icon-intermediate-event-catch-signal',\n    target: {\n      type: 'bpmn:BoundaryEvent',\n      eventDefinitionType: 'bpmn:SignalEventDefinition',\n      cancelActivity: true\n    }\n  },\n  {\n    label: 'Compensation boundary event',\n    actionName: 'replace-with-compensation-boundary',\n    className: 'bpmn-icon-intermediate-event-catch-compensation',\n    target: {\n      type: 'bpmn:BoundaryEvent',\n      eventDefinitionType: 'bpmn:CompensateEventDefinition',\n      cancelActivity: true\n    }\n  },\n  {\n    label: 'Message boundary event (non-interrupting)',\n    actionName: 'replace-with-non-interrupting-message-boundary',\n    className: 'bpmn-icon-intermediate-event-catch-non-interrupting-message',\n    target: {\n      type: 'bpmn:BoundaryEvent',\n      eventDefinitionType: 'bpmn:MessageEventDefinition',\n      cancelActivity: false\n    }\n  },\n  {\n    label: 'Timer boundary event (non-interrupting)',\n    actionName: 'replace-with-non-interrupting-timer-boundary',\n    className: 'bpmn-icon-intermediate-event-catch-non-interrupting-timer',\n    target: {\n      type: 'bpmn:BoundaryEvent',\n      eventDefinitionType: 'bpmn:TimerEventDefinition',\n      cancelActivity: false\n    }\n  },\n  {\n    label: 'Escalation boundary event (non-interrupting)',\n    actionName: 'replace-with-non-interrupting-escalation-boundary',\n    className: 'bpmn-icon-intermediate-event-catch-non-interrupting-escalation',\n    target: {\n      type: 'bpmn:BoundaryEvent',\n      eventDefinitionType: 'bpmn:EscalationEventDefinition',\n      cancelActivity: false\n    }\n  },\n  {\n    label: 'Conditional boundary event (non-interrupting)',\n    actionName: 'replace-with-non-interrupting-conditional-boundary',\n    className: 'bpmn-icon-intermediate-event-catch-non-interrupting-condition',\n    target: {\n      type: 'bpmn:BoundaryEvent',\n      eventDefinitionType: 'bpmn:ConditionalEventDefinition',\n      cancelActivity: false\n    }\n  },\n  {\n    label: 'Signal boundary event (non-interrupting)',\n    actionName: 'replace-with-non-interrupting-signal-boundary',\n    className: 'bpmn-icon-intermediate-event-catch-non-interrupting-signal',\n    target: {\n      type: 'bpmn:BoundaryEvent',\n      eventDefinitionType: 'bpmn:SignalEventDefinition',\n      cancelActivity: false\n    }\n  }\n];\n\n/**\n * @type {ReplaceOption[]}\n */\nexport var EVENT_SUB_PROCESS_START_EVENT = [\n  {\n    label: 'Message start event',\n    actionName: 'replace-with-message-start',\n    className: 'bpmn-icon-start-event-message',\n    target: {\n      type: 'bpmn:StartEvent',\n      eventDefinitionType: 'bpmn:MessageEventDefinition',\n      isInterrupting: true\n    }\n  },\n  {\n    label: 'Timer start event',\n    actionName: 'replace-with-timer-start',\n    className: 'bpmn-icon-start-event-timer',\n    target: {\n      type: 'bpmn:StartEvent',\n      eventDefinitionType: 'bpmn:TimerEventDefinition',\n      isInterrupting: true\n    }\n  },\n  {\n    label: 'Conditional start event',\n    actionName: 'replace-with-conditional-start',\n    className: 'bpmn-icon-start-event-condition',\n    target: {\n      type: 'bpmn:StartEvent',\n      eventDefinitionType: 'bpmn:ConditionalEventDefinition',\n      isInterrupting: true\n    }\n  },\n  {\n    label: 'Signal start event',\n    actionName: 'replace-with-signal-start',\n    className: 'bpmn-icon-start-event-signal',\n    target: {\n      type: 'bpmn:StartEvent',\n      eventDefinitionType: 'bpmn:SignalEventDefinition',\n      isInterrupting: true\n    }\n  },\n  {\n    label: 'Error start event',\n    actionName: 'replace-with-error-start',\n    className: 'bpmn-icon-start-event-error',\n    target: {\n      type: 'bpmn:StartEvent',\n      eventDefinitionType: 'bpmn:ErrorEventDefinition',\n      isInterrupting: true\n    }\n  },\n  {\n    label: 'Escalation start event',\n    actionName: 'replace-with-escalation-start',\n    className: 'bpmn-icon-start-event-escalation',\n    target: {\n      type: 'bpmn:StartEvent',\n      eventDefinitionType: 'bpmn:EscalationEventDefinition',\n      isInterrupting: true\n    }\n  },\n  {\n    label: 'Compensation start event',\n    actionName: 'replace-with-compensation-start',\n    className: 'bpmn-icon-start-event-compensation',\n    target: {\n      type: 'bpmn:StartEvent',\n      eventDefinitionType: 'bpmn:CompensateEventDefinition',\n      isInterrupting: true\n    }\n  },\n  {\n    label: 'Message start event (non-interrupting)',\n    actionName: 'replace-with-non-interrupting-message-start',\n    className: 'bpmn-icon-start-event-non-interrupting-message',\n    target: {\n      type: 'bpmn:StartEvent',\n      eventDefinitionType: 'bpmn:MessageEventDefinition',\n      isInterrupting: false\n    }\n  },\n  {\n    label: 'Timer start event (non-interrupting)',\n    actionName: 'replace-with-non-interrupting-timer-start',\n    className: 'bpmn-icon-start-event-non-interrupting-timer',\n    target: {\n      type: 'bpmn:StartEvent',\n      eventDefinitionType: 'bpmn:TimerEventDefinition',\n      isInterrupting: false\n    }\n  },\n  {\n    label: 'Conditional start event (non-interrupting)',\n    actionName: 'replace-with-non-interrupting-conditional-start',\n    className: 'bpmn-icon-start-event-non-interrupting-condition',\n    target: {\n      type: 'bpmn:StartEvent',\n      eventDefinitionType: 'bpmn:ConditionalEventDefinition',\n      isInterrupting: false\n    }\n  },\n  {\n    label: 'Signal start event (non-interrupting)',\n    actionName: 'replace-with-non-interrupting-signal-start',\n    className: 'bpmn-icon-start-event-non-interrupting-signal',\n    target: {\n      type: 'bpmn:StartEvent',\n      eventDefinitionType: 'bpmn:SignalEventDefinition',\n      isInterrupting: false\n    }\n  },\n  {\n    label: 'Escalation start event (non-interrupting)',\n    actionName: 'replace-with-non-interrupting-escalation-start',\n    className: 'bpmn-icon-start-event-non-interrupting-escalation',\n    target: {\n      type: 'bpmn:StartEvent',\n      eventDefinitionType: 'bpmn:EscalationEventDefinition',\n      isInterrupting: false\n    }\n  }\n];\n\n/**\n * @type {ReplaceOption[]}\n */\nexport var SEQUENCE_FLOW = [\n  {\n    label: 'Sequence flow',\n    actionName: 'replace-with-sequence-flow',\n    className: 'bpmn-icon-connection'\n  },\n  {\n    label: 'Default flow',\n    actionName: 'replace-with-default-flow',\n    className: 'bpmn-icon-default-flow'\n  },\n  {\n    label: 'Conditional flow',\n    actionName: 'replace-with-conditional-flow',\n    className: 'bpmn-icon-conditional-flow'\n  }\n];\n\n/**\n * @type {ReplaceOption[]}\n */\nexport var PARTICIPANT = [\n  {\n    label: 'Expanded pool/participant',\n    actionName: 'replace-with-expanded-pool',\n    className: 'bpmn-icon-participant',\n    target: {\n      type: 'bpmn:Participant',\n      isExpanded: true\n    }\n  },\n  {\n    label: function(element) {\n      var label = 'Empty pool/participant';\n\n      if (element.children && element.children.length) {\n        label += ' (removes content)';\n      }\n\n      return label;\n    },\n    actionName: 'replace-with-collapsed-pool',\n\n    // TODO(@janstuemmel): maybe design new icon\n    className: 'bpmn-icon-lane',\n    target: {\n      type: 'bpmn:Participant',\n      isExpanded: false\n    }\n  }\n];\n\n/**\n * @type {{ [key: string]: ReplaceOption[]}}\n */\nexport var TYPED_EVENT = {\n  'bpmn:MessageEventDefinition': [\n    {\n      label: 'Message start event',\n      actionName: 'replace-with-message-start',\n      className: 'bpmn-icon-start-event-message',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition',\n        isInterrupting: true\n      }\n    },\n    {\n      label: 'Message intermediate catch event',\n      actionName: 'replace-with-message-intermediate-catch',\n      className: 'bpmn-icon-intermediate-event-catch-message',\n      target: {\n        type: 'bpmn:IntermediateCatchEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition'\n      }\n    },\n    {\n      label: 'Message intermediate throw event',\n      actionName: 'replace-with-message-intermediate-throw',\n      className: 'bpmn-icon-intermediate-event-throw-message',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition'\n      }\n    },\n    {\n      label: 'Message end event',\n      actionName: 'replace-with-message-end',\n      className: 'bpmn-icon-end-event-message',\n      target: {\n        type: 'bpmn:EndEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition'\n      }\n    }\n  ],\n  'bpmn:TimerEventDefinition': [\n    {\n      label: 'Timer start event',\n      actionName: 'replace-with-timer-start',\n      className: 'bpmn-icon-start-event-timer',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:TimerEventDefinition',\n        isInterrupting: true\n      }\n    },\n    {\n      label: 'Timer intermediate catch event',\n      actionName: 'replace-with-timer-intermediate-catch',\n      className: 'bpmn-icon-intermediate-event-catch-timer',\n      target: {\n        type: 'bpmn:IntermediateCatchEvent',\n        eventDefinitionType: 'bpmn:TimerEventDefinition'\n      }\n    }\n  ],\n  'bpmn:ConditionalEventDefinition': [\n    {\n      label: 'Conditional start event',\n      actionName: 'replace-with-conditional-start',\n      className: 'bpmn-icon-start-event-condition',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:ConditionalEventDefinition',\n        isInterrupting: true\n      }\n    },\n    {\n      label: 'Conditional intermediate catch event',\n      actionName: 'replace-with-conditional-intermediate-catch',\n      className: 'bpmn-icon-intermediate-event-catch-condition',\n      target: {\n        type: 'bpmn:IntermediateCatchEvent',\n        eventDefinitionType: 'bpmn:ConditionalEventDefinition'\n      }\n    }\n  ],\n  'bpmn:SignalEventDefinition': [\n    {\n      label: 'Signal start event',\n      actionName: 'replace-with-signal-start',\n      className: 'bpmn-icon-start-event-signal',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition',\n        isInterrupting: true\n      }\n    },\n    {\n      label: 'Signal intermediate catch event',\n      actionName: 'replace-with-signal-intermediate-catch',\n      className: 'bpmn-icon-intermediate-event-catch-signal',\n      target: {\n        type: 'bpmn:IntermediateCatchEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition'\n      }\n    },\n    {\n      label: 'Signal intermediate throw event',\n      actionName: 'replace-with-signal-intermediate-throw',\n      className: 'bpmn-icon-intermediate-event-throw-signal',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition'\n      }\n    },\n    {\n      label: 'Signal end event',\n      actionName: 'replace-with-signal-end',\n      className: 'bpmn-icon-end-event-signal',\n      target: {\n        type: 'bpmn:EndEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition'\n      }\n    }\n  ],\n  'bpmn:ErrorEventDefinition': [\n    {\n      label: 'Error start event',\n      actionName: 'replace-with-error-start',\n      className: 'bpmn-icon-start-event-error',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:ErrorEventDefinition',\n        isInterrupting: true\n      }\n    },\n    {\n      label: 'Error end event',\n      actionName: 'replace-with-error-end',\n      className: 'bpmn-icon-end-event-error',\n      target: {\n        type: 'bpmn:EndEvent',\n        eventDefinitionType: 'bpmn:ErrorEventDefinition'\n      }\n    }\n  ],\n  'bpmn:EscalationEventDefinition': [\n    {\n      label: 'Escalation start event',\n      actionName: 'replace-with-escalation-start',\n      className: 'bpmn-icon-start-event-escalation',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:EscalationEventDefinition',\n        isInterrupting: true\n      }\n    },\n    {\n      label: 'Escalation intermediate throw event',\n      actionName: 'replace-with-escalation-intermediate-throw',\n      className: 'bpmn-icon-intermediate-event-throw-escalation',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent',\n        eventDefinitionType: 'bpmn:EscalationEventDefinition'\n      }\n    },\n    {\n      label: 'Escalation end event',\n      actionName: 'replace-with-escalation-end',\n      className: 'bpmn-icon-end-event-escalation',\n      target: {\n        type: 'bpmn:EndEvent',\n        eventDefinitionType: 'bpmn:EscalationEventDefinition'\n      }\n    }\n  ],\n  'bpmn:CompensateEventDefinition': [\n    {\n      label: 'Compensation start event',\n      actionName: 'replace-with-compensation-start',\n      className: 'bpmn-icon-start-event-compensation',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:CompensateEventDefinition',\n        isInterrupting: true\n      }\n    },\n    {\n      label: 'Compensation intermediate throw event',\n      actionName: 'replace-with-compensation-intermediate-throw',\n      className: 'bpmn-icon-intermediate-event-throw-compensation',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent',\n        eventDefinitionType: 'bpmn:CompensateEventDefinition'\n      }\n    },\n    {\n      label: 'Compensation end event',\n      actionName: 'replace-with-compensation-end',\n      className: 'bpmn-icon-end-event-compensation',\n      target: {\n        type: 'bpmn:EndEvent',\n        eventDefinitionType: 'bpmn:CompensateEventDefinition'\n      }\n    }\n  ]\n};\n"
  },
  {
    "path": "lib/features/replace/index.js",
    "content": "import CopyPasteModule from '../copy-paste';\nimport ReplaceModule from 'diagram-js/lib/features/replace';\nimport SelectionModule from 'diagram-js/lib/features/selection';\n\nimport BpmnReplace from './BpmnReplace';\n\nexport default {\n  __depends__: [\n    CopyPasteModule,\n    ReplaceModule,\n    SelectionModule\n  ],\n  bpmnReplace: [ 'type', BpmnReplace ]\n};\n"
  },
  {
    "path": "lib/features/replace-preview/BpmnReplacePreview.js",
    "content": "import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport inherits from 'inherits-browser';\n\nimport { escapeCSS as cssEscape } from 'diagram-js/lib/util/EscapeUtil';\n\nimport {\n  assign,\n  forEach\n} from 'min-dash';\n\nimport {\n  query as domQuery\n} from 'min-dom';\n\nimport {\n  attr as svgAttr\n} from 'tiny-svg';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n * @typedef {import('diagram-js/lib/core/ElementFactory').default} ElementFactory\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n * @typedef {import('diagram-js/lib/features/preview-support/PreviewSupport').default} PreviewSupport\n */\n\nvar LOW_PRIORITY = 250;\n\n/**\n * @param {EventBus} eventBus\n * @param {ElementRegistry} elementRegistry\n * @param {ElementFactory} elementFactory\n * @param {Canvas} canvas\n * @param {PreviewSupport} previewSupport\n */\nexport default function BpmnReplacePreview(\n    eventBus, elementRegistry, elementFactory,\n    canvas, previewSupport) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  /**\n   * Replace the visuals of all elements in the context which can be replaced\n   *\n   * @param  {Object} context\n   */\n  function replaceVisual(context) {\n\n    var replacements = context.canExecute.replacements;\n\n    forEach(replacements, function(replacement) {\n\n      var id = replacement.oldElementId;\n\n      var newElement = {\n        type: replacement.newElementType\n      };\n\n      // if the visual of the element is already replaced\n      if (context.visualReplacements[id]) {\n        return;\n      }\n\n      var element = elementRegistry.get(id);\n\n      assign(newElement, { x: element.x, y: element.y });\n\n      // create a temporary shape\n      var tempShape = elementFactory.createShape(newElement);\n\n      canvas.addShape(tempShape, element.parent);\n\n      // select the original SVG element related to the element and hide it\n      var gfx = domQuery('[data-element-id=\"' + cssEscape(element.id) + '\"]', context.dragGroup);\n\n      if (gfx) {\n        svgAttr(gfx, { display: 'none' });\n      }\n\n      // clone the gfx of the temporary shape and add it to the drag group\n      var dragger = previewSupport.addDragger(tempShape, context.dragGroup);\n\n      context.visualReplacements[id] = dragger;\n\n      canvas.removeShape(tempShape);\n    });\n  }\n\n  /**\n   * Restore the original visuals of the previously replaced elements\n   *\n   * @param  {Object} context\n   */\n  function restoreVisual(context) {\n\n    var visualReplacements = context.visualReplacements;\n\n    forEach(visualReplacements, function(dragger, id) {\n\n      var originalGfx = domQuery('[data-element-id=\"' + cssEscape(id) + '\"]', context.dragGroup);\n\n      if (originalGfx) {\n        svgAttr(originalGfx, { display: 'inline' });\n      }\n\n      dragger.remove();\n\n      if (visualReplacements[id]) {\n        delete visualReplacements[id];\n      }\n    });\n  }\n\n  eventBus.on('shape.move.move', LOW_PRIORITY, function(event) {\n\n    var context = event.context,\n        canExecute = context.canExecute;\n\n    if (!context.visualReplacements) {\n      context.visualReplacements = {};\n    }\n\n    if (canExecute && canExecute.replacements) {\n      replaceVisual(context);\n    } else {\n      restoreVisual(context);\n    }\n  });\n}\n\nBpmnReplacePreview.$inject = [\n  'eventBus',\n  'elementRegistry',\n  'elementFactory',\n  'canvas',\n  'previewSupport'\n];\n\ninherits(BpmnReplacePreview, CommandInterceptor);"
  },
  {
    "path": "lib/features/replace-preview/index.js",
    "content": "import PreviewSupportModule from 'diagram-js/lib/features/preview-support';\n\nimport BpmnReplacePreview from './BpmnReplacePreview';\n\nexport default {\n  __depends__: [\n    PreviewSupportModule\n  ],\n  __init__: [ 'bpmnReplacePreview' ],\n  bpmnReplacePreview: [ 'type', BpmnReplacePreview ]\n};\n"
  },
  {
    "path": "lib/features/rules/BpmnRules.js",
    "content": "import {\n  every,\n  find,\n  forEach,\n  some\n} from 'min-dash';\n\nimport inherits from 'inherits-browser';\n\nimport {\n  is,\n  getBusinessObject\n} from '../../util/ModelUtil';\n\nimport {\n  getParent,\n  isAny\n} from '../modeling/util/ModelingUtil';\n\nimport {\n  isLabel\n} from '../../util/LabelUtil';\n\nimport {\n  isExpanded,\n  isEventSubProcess,\n  isInterrupting,\n  hasErrorEventDefinition,\n  hasEscalationEventDefinition,\n  hasCompensateEventDefinition\n} from '../../util/DiUtil';\n\nimport RuleProvider from 'diagram-js/lib/features/rules/RuleProvider';\n\nimport {\n  getBoundaryAttachment as isBoundaryAttachment\n} from '../snapping/BpmnSnappingUtil';\n\nimport { isConnection } from 'diagram-js/lib/util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n *\n * @typedef {import('../../model/Types').Connection} Connection\n * @typedef {import('../../model/Types').Element} Element\n * @typedef {import('../../model/Types').Shape} Shape\n * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n *\n * @typedef {import('diagram-js/lib/util/Types').Point} Point\n * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n *\n * @typedef { {\n *   associationDirection?: 'None' | 'One' | 'Both';\n *   type: string;\n * } | boolean | null } CanConnectResult\n *\n * @typedef { {\n *   id: string;\n *   type: string;\n * } | boolean } CanReplaceResult\n */\n\n/**\n * BPMN-specific modeling rules.\n *\n * @param {EventBus} eventBus\n */\nexport default function BpmnRules(eventBus) {\n  RuleProvider.call(this, eventBus);\n}\n\ninherits(BpmnRules, RuleProvider);\n\nBpmnRules.$inject = [ 'eventBus' ];\n\nBpmnRules.prototype.init = function() {\n\n  this.addRule('connection.start', function(context) {\n    var source = context.source;\n\n    return canStartConnection(source);\n  });\n\n  this.addRule('connection.create', function(context) {\n    var source = context.source,\n        target = context.target,\n        hints = context.hints || {},\n        targetParent = hints.targetParent,\n        targetAttach = hints.targetAttach;\n\n    // don't allow incoming connections on\n    // newly created boundary events\n    // to boundary events\n    if (targetAttach) {\n      return false;\n    }\n\n    // temporarily set target parent for scoping\n    // checks to work\n    if (targetParent) {\n      target.parent = targetParent;\n    }\n\n    try {\n      return canConnect(source, target);\n    } finally {\n\n      // unset temporary target parent\n      if (targetParent) {\n        target.parent = null;\n      }\n    }\n  });\n\n  this.addRule('connection.reconnect', function(context) {\n\n    var connection = context.connection,\n        source = context.source,\n        target = context.target;\n\n    return canConnect(source, target, connection);\n  });\n\n  this.addRule('connection.updateWaypoints', function(context) {\n    return {\n      type: context.connection.type\n    };\n  });\n\n  this.addRule('shape.resize', function(context) {\n\n    var shape = context.shape,\n        newBounds = context.newBounds;\n\n    return canResize(shape, newBounds);\n  });\n\n  this.addRule('elements.create', function(context) {\n    var elements = context.elements,\n        position = context.position,\n        target = context.target;\n\n    if (isConnection(target) && !canInsert(elements, target, position)) {\n      return false;\n    }\n\n    return every(elements, function(element) {\n      if (isConnection(element)) {\n        return canConnect(element.source, element.target, element);\n      }\n\n      if (element.host) {\n        return canAttach(element, element.host, null, position);\n      }\n\n      return canCreate(element, target, null, position);\n    });\n  });\n\n  this.addRule('elements.move', function(context) {\n\n    var target = context.target,\n        shapes = context.shapes,\n        position = context.position,\n        hints = context.hints;\n\n    // prevent keyboard movement of boundary events without host\n    if (hints?.keyboardMove) {\n      const hasAttachedEventWithoutHost = shapes.some(function(shape) {\n        return isBoundaryEvent(shape) && !shapes.includes(shape.host);\n      });\n\n      if (hasAttachedEventWithoutHost) {\n        return false;\n      }\n    }\n\n    return canAttach(shapes, target, null, position) ||\n           canReplace(shapes, target, position) ||\n           canMove(shapes, target, position) ||\n           canInsert(shapes, target, position);\n  });\n\n  this.addRule('shape.create', function(context) {\n    return canCreate(\n      context.shape,\n      context.target,\n      context.source,\n      context.position\n    );\n  });\n\n  this.addRule('shape.attach', function(context) {\n\n    return canAttach(\n      context.shape,\n      context.target,\n      null,\n      context.position\n    );\n  });\n\n  this.addRule('element.copy', function(context) {\n    var element = context.element,\n        elements = context.elements;\n\n    return canCopy(elements, element);\n  });\n};\n\nBpmnRules.prototype.canConnectMessageFlow = canConnectMessageFlow;\n\nBpmnRules.prototype.canConnectSequenceFlow = canConnectSequenceFlow;\n\nBpmnRules.prototype.canConnectDataAssociation = canConnectDataAssociation;\n\nBpmnRules.prototype.canConnectAssociation = canConnectAssociation;\n\nBpmnRules.prototype.canConnectCompensationAssociation = canConnectCompensationAssociation;\n\nBpmnRules.prototype.canMove = canMove;\n\nBpmnRules.prototype.canAttach = canAttach;\n\nBpmnRules.prototype.canReplace = canReplace;\n\nBpmnRules.prototype.canDrop = canDrop;\n\nBpmnRules.prototype.canInsert = canInsert;\n\nBpmnRules.prototype.canCreate = canCreate;\n\nBpmnRules.prototype.canConnect = canConnect;\n\nBpmnRules.prototype.canResize = canResize;\n\nBpmnRules.prototype.canCopy = canCopy;\n\n/**\n * Utility functions for rule checking\n */\n\n/**\n * Checks if given element can be used for starting connection.\n *\n * @param  {Element} source\n *\n * @return {boolean}\n */\nfunction canStartConnection(element) {\n  if (nonExistingOrLabel(element)) {\n    return null;\n  }\n\n  return isAny(element, [\n    'bpmn:FlowNode',\n    'bpmn:InteractionNode',\n    'bpmn:DataObjectReference',\n    'bpmn:DataStoreReference',\n    'bpmn:Group',\n    'bpmn:TextAnnotation'\n  ]);\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction nonExistingOrLabel(element) {\n  return !element || isLabel(element);\n}\n\n/**\n * @param {Element} element\n *\n * @return {ModdleElement}\n */\nfunction getOrganizationalParent(element) {\n\n  do {\n    if (is(element, 'bpmn:Process')) {\n      return getBusinessObject(element);\n    }\n\n    if (is(element, 'bpmn:Participant')) {\n      return (\n        getBusinessObject(element).processRef ||\n        getBusinessObject(element)\n      );\n    }\n  } while ((element = element.parent));\n\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction isTextAnnotation(element) {\n  return is(element, 'bpmn:TextAnnotation');\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction isGroup(element) {\n  return is(element, 'bpmn:Group') && !element.labelTarget;\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction isCompensationBoundary(element) {\n  return is(element, 'bpmn:BoundaryEvent') &&\n         hasEventDefinition(element, 'bpmn:CompensateEventDefinition');\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction isForCompensation(element) {\n  return getBusinessObject(element).isForCompensation;\n}\n\n/**\n * @param {Element} a\n * @param {Element} b\n *\n * @return {boolean}\n */\nfunction isSameOrganization(a, b) {\n  var parentA = getOrganizationalParent(a),\n      parentB = getOrganizationalParent(b);\n\n  return parentA === parentB;\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction isMessageFlowSource(element) {\n  return (\n    is(element, 'bpmn:InteractionNode') &&\n    !is(element, 'bpmn:BoundaryEvent') && (\n      !is(element, 'bpmn:Event') || (\n        is(element, 'bpmn:ThrowEvent') &&\n        hasEventDefinitionOrNone(element, 'bpmn:MessageEventDefinition')\n      )\n    )\n  );\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction isMessageFlowTarget(element) {\n  return (\n    is(element, 'bpmn:InteractionNode') &&\n    !isForCompensation(element) && (\n      !is(element, 'bpmn:Event') || (\n        is(element, 'bpmn:CatchEvent') &&\n        hasEventDefinitionOrNone(element, 'bpmn:MessageEventDefinition')\n      )\n    ) && !(\n      is(element, 'bpmn:BoundaryEvent') &&\n      !hasEventDefinition(element, 'bpmn:MessageEventDefinition')\n    )\n  );\n}\n\n/**\n * @param {Element} element\n *\n * @return {ModdleElement}\n */\nfunction getScopeParent(element) {\n\n  var parent = element;\n\n  while ((parent = parent.parent)) {\n\n    if (is(parent, 'bpmn:FlowElementsContainer')) {\n      return getBusinessObject(parent);\n    }\n\n    if (is(parent, 'bpmn:Participant')) {\n      return getBusinessObject(parent).processRef;\n    }\n  }\n\n  return null;\n}\n\n/**\n * @param {Element} a\n * @param {Element} b\n *\n * @return {boolean}\n */\nfunction isSameScope(a, b) {\n  var scopeParentA = getScopeParent(a),\n      scopeParentB = getScopeParent(b);\n\n  return scopeParentA === scopeParentB;\n}\n\n/**\n * @param {Element} element\n * @param {string} eventDefinition\n *\n * @return {boolean}\n */\nfunction hasEventDefinition(element, eventDefinition) {\n  var businessObject = getBusinessObject(element);\n\n  return !!find(businessObject.eventDefinitions || [], function(definition) {\n    return is(definition, eventDefinition);\n  });\n}\n\n/**\n * @param {Element} element\n * @param {string} eventDefinition\n *\n * @return {boolean}\n */\nfunction hasEventDefinitionOrNone(element, eventDefinition) {\n  var businessObject = getBusinessObject(element);\n\n  return (businessObject.eventDefinitions || []).every(function(definition) {\n    return is(definition, eventDefinition);\n  });\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction isSequenceFlowSource(element) {\n  return (\n    is(element, 'bpmn:FlowNode') &&\n    !is(element, 'bpmn:EndEvent') &&\n    !isEventSubProcess(element) &&\n    !(is(element, 'bpmn:IntermediateThrowEvent') &&\n      hasEventDefinition(element, 'bpmn:LinkEventDefinition')\n    ) &&\n    !isCompensationBoundary(element) &&\n    !isForCompensation(element)\n  );\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction isSequenceFlowTarget(element) {\n  return (\n    is(element, 'bpmn:FlowNode') &&\n    !is(element, 'bpmn:StartEvent') &&\n    !is(element, 'bpmn:BoundaryEvent') &&\n    !isEventSubProcess(element) &&\n    !(is(element, 'bpmn:IntermediateCatchEvent') &&\n      hasEventDefinition(element, 'bpmn:LinkEventDefinition')\n    ) &&\n    !isForCompensation(element)\n  );\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction isEventBasedTarget(element) {\n  return (\n    is(element, 'bpmn:ReceiveTask') || (\n      is(element, 'bpmn:IntermediateCatchEvent') && (\n        hasEventDefinition(element, 'bpmn:MessageEventDefinition') ||\n        hasEventDefinition(element, 'bpmn:TimerEventDefinition') ||\n        hasEventDefinition(element, 'bpmn:ConditionalEventDefinition') ||\n        hasEventDefinition(element, 'bpmn:SignalEventDefinition')\n      )\n    )\n  );\n}\n\n/**\n * @param {Element} element\n *\n * @return {Shape[]}\n */\nfunction getParents(element) {\n\n  var parents = [];\n\n  while (element) {\n    element = element.parent;\n\n    if (element) {\n      parents.push(element);\n    }\n  }\n\n  return parents;\n}\n\n/**\n * @param {Shape} possibleParent\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction isParent(possibleParent, element) {\n  var allParents = getParents(element);\n\n  return allParents.indexOf(possibleParent) !== -1;\n}\n\n/**\n * @param {Element} source\n * @param {Element} target\n * @param {Connection} connection\n *\n * @return {CanConnectResult}\n */\nfunction canConnect(source, target, connection) {\n\n  if (nonExistingOrLabel(source) || nonExistingOrLabel(target)) {\n    return null;\n  }\n\n  if (!is(connection, 'bpmn:DataAssociation')) {\n\n    if (canConnectMessageFlow(source, target)) {\n      return { type: 'bpmn:MessageFlow' };\n    }\n\n    if (canConnectSequenceFlow(source, target)) {\n      return { type: 'bpmn:SequenceFlow' };\n    }\n  }\n\n  var connectDataAssociation = canConnectDataAssociation(source, target);\n\n  if (connectDataAssociation) {\n    return connectDataAssociation;\n  }\n\n  if (canConnectCompensationAssociation(source, target)) {\n    return {\n      type: 'bpmn:Association',\n      associationDirection: 'One'\n    };\n  }\n\n  if (canConnectAssociation(source, target)) {\n    return {\n      type: 'bpmn:Association',\n      associationDirection: 'None'\n    };\n  }\n\n  return false;\n}\n\n/**\n * Can an element be dropped into the target element.\n *\n * @param {Element} element\n * @param {Shape} target\n *\n * @return {boolean}\n */\nfunction canDrop(element, target) {\n\n  // can move labels and groups everywhere\n  if (isLabel(element) || isGroup(element)) {\n    return true;\n  }\n\n\n  // disallow to create elements on collapsed pools\n  if (is(target, 'bpmn:Participant') && !isExpanded(target)) {\n    return false;\n  }\n\n  // allow to create new participants on\n  // existing collaboration and process diagrams\n  if (is(element, 'bpmn:Participant')) {\n    return is(target, 'bpmn:Process') || is(target, 'bpmn:Collaboration');\n  }\n\n  // allow moving DataInput / DataOutput within its original container only\n  if (isAny(element, [ 'bpmn:DataInput', 'bpmn:DataOutput' ])) {\n\n    if (element.parent) {\n      return target === element.parent;\n    }\n  }\n\n  // allow creating lanes on participants and other lanes only\n  if (is(element, 'bpmn:Lane')) {\n    return is(target, 'bpmn:Participant') || is(target, 'bpmn:Lane');\n  }\n\n  // disallow dropping boundary events which cannot replace with intermediate event\n  if (is(element, 'bpmn:BoundaryEvent') && !isDroppableBoundaryEvent(element)) {\n    return false;\n  }\n\n  // drop flow elements onto flow element containers\n  // and participants\n  if (is(element, 'bpmn:FlowElement') && !is(element, 'bpmn:DataStoreReference')) {\n    if (is(target, 'bpmn:FlowElementsContainer')) {\n      return isExpanded(target);\n    }\n\n    return isAny(target, [ 'bpmn:Participant', 'bpmn:Lane' ]);\n  }\n\n  // disallow dropping data store reference if there is no process to append to\n  if (is(element, 'bpmn:DataStoreReference') && is(target, 'bpmn:Collaboration')) {\n    return some(getBusinessObject(target).get('participants'), function(participant) {\n      return !!participant.get('processRef');\n    });\n  }\n\n  // account for the fact that data associations are always\n  // rendered and moved to top (Process or Collaboration level)\n  //\n  // artifacts may be placed wherever, too\n  if (isAny(element, [ 'bpmn:Artifact', 'bpmn:DataAssociation', 'bpmn:DataStoreReference' ])) {\n    return isAny(target, [\n      'bpmn:Collaboration',\n      'bpmn:Lane',\n      'bpmn:Participant',\n      'bpmn:Process',\n      'bpmn:SubProcess' ]);\n  }\n\n  if (is(element, 'bpmn:MessageFlow')) {\n    return is(target, 'bpmn:Collaboration')\n      || element.source.parent == target\n      || element.target.parent == target;\n  }\n\n  return false;\n}\n\n/**\n * @param {Shape} event\n *\n * @return {boolean}\n */\nfunction isDroppableBoundaryEvent(event) {\n  return getBusinessObject(event).cancelActivity && (\n    hasNoEventDefinition(event) || hasCommonBoundaryIntermediateEventDefinition(event)\n  );\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction isBoundaryEvent(element) {\n  return !isLabel(element) && is(element, 'bpmn:BoundaryEvent');\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction isLane(element) {\n  return is(element, 'bpmn:Lane');\n}\n\n/**\n * `bpmn:IntermediateThrowEvents` are treated as boundary events during create.\n *\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction isBoundaryCandidate(element) {\n  if (isBoundaryEvent(element)) {\n    return true;\n  }\n\n  if (is(element, 'bpmn:IntermediateThrowEvent') && hasNoEventDefinition(element)) {\n    return true;\n  }\n\n  return (\n    is(element, 'bpmn:IntermediateCatchEvent') &&\n    hasCommonBoundaryIntermediateEventDefinition(element)\n  );\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction hasNoEventDefinition(element) {\n  var businessObject = getBusinessObject(element);\n\n  return businessObject && !(businessObject.eventDefinitions && businessObject.eventDefinitions.length);\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction hasCommonBoundaryIntermediateEventDefinition(element) {\n  return hasOneOfEventDefinitions(element, [\n    'bpmn:MessageEventDefinition',\n    'bpmn:TimerEventDefinition',\n    'bpmn:SignalEventDefinition',\n    'bpmn:ConditionalEventDefinition'\n  ]);\n}\n\n/**\n * @param {Element} element\n * @param {string[]} eventDefinitions\n *\n * @return {boolean}\n */\nfunction hasOneOfEventDefinitions(element, eventDefinitions) {\n  return eventDefinitions.some(function(definition) {\n    return hasEventDefinition(element, definition);\n  });\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction isReceiveTaskAfterEventBasedGateway(element) {\n  return (\n    is(element, 'bpmn:ReceiveTask') &&\n    find(element.incoming, function(incoming) {\n      return is(incoming.source, 'bpmn:EventBasedGateway');\n    })\n  );\n}\n\n/**\n * TODO(philippfromme): remove `source` parameter\n *\n * @param {Element[]} elements\n * @param {Shape} target\n * @param {Element} source\n * @param {Point} [position]\n *\n * @return {boolean | 'attach'}\n */\nfunction canAttach(elements, target, source, position) {\n\n  if (!Array.isArray(elements)) {\n    elements = [ elements ];\n  }\n\n  // only (re-)attach one element at a time\n  if (elements.length !== 1) {\n    return false;\n  }\n\n  var element = elements[0];\n\n  // do not attach labels\n  if (isLabel(element)) {\n    return false;\n  }\n\n  // only handle boundary events\n  if (!isBoundaryCandidate(element)) {\n    return false;\n  }\n\n  // disallow drop on event sub processes\n  if (isEventSubProcess(target)) {\n    return false;\n  }\n\n  // only allow drop on non compensation activities\n  if (!is(target, 'bpmn:Activity') || isForCompensation(target)) {\n    return false;\n  }\n\n  // only attach to subprocess border\n  if (position && !isBoundaryAttachment(position, target)) {\n    return false;\n  }\n\n  // do not attach on receive tasks after event based gateways\n  if (isReceiveTaskAfterEventBasedGateway(target)) {\n    return false;\n  }\n\n  return 'attach';\n}\n\n/**\n * Check whether the given elements can be replaced. Return all elements which\n * can be replaced.\n *\n * @example\n *\n * ```javascript\n * [{\n *   id: 'IntermediateEvent_1',\n *   type: 'bpmn:StartEvent'\n * },\n * {\n *   id: 'Task_1',\n *   type: 'bpmn:ServiceTask'\n * }]\n * ```\n *\n * @param  {Element[]} elements\n * @param  {Shape} [target]\n * @param  {Point} [position]\n *\n * @return {CanReplaceResult}\n */\nfunction canReplace(elements, target, position) {\n\n  if (!target) {\n    return false;\n  }\n\n  var canExecute = {\n    replacements: []\n  };\n\n  forEach(elements, function(element) {\n\n    if (!isEventSubProcess(target)) {\n\n      if (is(element, 'bpmn:StartEvent') &&\n          element.type !== 'label' &&\n          canDrop(element, target)) {\n\n        // replace a non-interrupting start event by a blank interrupting start event\n        // when the target is not an event sub process\n        if (!isInterrupting(element)) {\n          canExecute.replacements.push({\n            oldElementId: element.id,\n            newElementType: 'bpmn:StartEvent'\n          });\n        }\n\n        // replace an error/escalation/compensate start event by a blank interrupting start event\n        // when the target is not an event sub process\n        if (hasErrorEventDefinition(element) ||\n            hasEscalationEventDefinition(element) ||\n            hasCompensateEventDefinition(element)) {\n          canExecute.replacements.push({\n            oldElementId: element.id,\n            newElementType: 'bpmn:StartEvent'\n          });\n        }\n\n        // replace a typed start event by a blank interrupting start event\n        // when the target is a sub process but not an event sub process\n        if (hasOneOfEventDefinitions(element,\n          [\n            'bpmn:MessageEventDefinition',\n            'bpmn:TimerEventDefinition',\n            'bpmn:SignalEventDefinition',\n            'bpmn:ConditionalEventDefinition'\n          ]) &&\n            is(target, 'bpmn:SubProcess')) {\n          canExecute.replacements.push({\n            oldElementId: element.id,\n            newElementType: 'bpmn:StartEvent'\n          });\n        }\n      }\n    }\n\n    if (!is(target, 'bpmn:Transaction')) {\n      if (hasEventDefinition(element, 'bpmn:CancelEventDefinition') &&\n          element.type !== 'label') {\n\n        if (is(element, 'bpmn:EndEvent') && canDrop(element, target)) {\n          canExecute.replacements.push({\n            oldElementId: element.id,\n            newElementType: 'bpmn:EndEvent'\n          });\n        }\n\n        if (is(element, 'bpmn:BoundaryEvent') && canAttach(element, target, null, position)) {\n          canExecute.replacements.push({\n            oldElementId: element.id,\n            newElementType: 'bpmn:BoundaryEvent'\n          });\n        }\n      }\n    }\n  });\n\n  return canExecute.replacements.length ? canExecute : false;\n}\n\n/**\n * @param {Element[]} elements\n * @param {Shape} target\n *\n * @return {boolean}\n */\nfunction canMove(elements, target) {\n\n  // do not move selection containing lanes\n  if (some(elements, isLane)) {\n    return false;\n  }\n\n  // allow default move check to start move operation\n  if (!target) {\n    return true;\n  }\n\n  return elements.every(function(element) {\n    return canDrop(element, target);\n  });\n}\n\n/**\n * @param {Shape} shape\n * @param {Shape} target\n * @param {Element} source\n * @param {Point} position\n *\n * @return {boolean}\n */\nfunction canCreate(shape, target, source, position) {\n\n  if (!target) {\n    return false;\n  }\n\n  if (isLabel(shape) || isGroup(shape)) {\n    return true;\n  }\n\n  return canDrop(shape, target, position) || canInsert(shape, target, position);\n}\n\n/**\n * @param {Shape} shape\n * @param {Rect} newBounds\n *\n * @return {boolean}\n */\nfunction canResize(shape, newBounds) {\n  if (is(shape, 'bpmn:SubProcess')) {\n    return (\n      isExpanded(shape) && (\n        !newBounds || (newBounds.width >= 100 && newBounds.height >= 80)\n      )\n    );\n  }\n\n  if (is(shape, 'bpmn:Lane')) {\n    return true;\n  }\n\n  if (is(shape, 'bpmn:Participant')) {\n    return true;\n  }\n\n  if (isTextAnnotation(shape)) {\n    return true;\n  }\n\n  if (isGroup(shape)) {\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * Check whether one of of the elements to be connected is a text annotation.\n *\n * @param {Element} source\n * @param {Element} target\n *\n * @return {boolean}\n */\nfunction isOneTextAnnotation(source, target) {\n\n  var sourceTextAnnotation = isTextAnnotation(source),\n      targetTextAnnotation = isTextAnnotation(target);\n\n  return (\n    (sourceTextAnnotation || targetTextAnnotation) &&\n    (sourceTextAnnotation !== targetTextAnnotation)\n  );\n}\n\n/**\n * @param {Element} source\n * @param {Element} target\n *\n * @return {CanConnectResult}\n */\nfunction canConnectAssociation(source, target) {\n\n  // don't connect parent <-> child\n  if (isParent(target, source) || isParent(source, target)) {\n    return false;\n  }\n\n  // allow connection of associations between <!TextAnnotation> and <TextAnnotation>\n  if (isOneTextAnnotation(source, target)) {\n    return true;\n  }\n\n  // can connect associations where we can connect\n  // data associations, too (!)\n  return !!canConnectDataAssociation(source, target);\n}\n\n/**\n * @param {Element} source\n * @param {Element} target\n *\n * @return {boolean}\n */\nfunction canConnectCompensationAssociation(source, target) {\n  return (\n    isSameScope(source, target) &&\n    isCompensationBoundary(source) &&\n    is(target, 'bpmn:Activity') &&\n    !isHostOfElement(target, source) &&\n    !isEventSubProcess(target)\n  );\n}\n\n/**\n * @param {Element} source\n * @param {Element} target\n *\n * @return {boolean}\n */\nfunction canConnectMessageFlow(source, target) {\n\n  // during connect user might move mouse out of canvas\n  // https://github.com/bpmn-io/bpmn-js/issues/1033\n  if (getRootElement(source) && !getRootElement(target)) {\n    return false;\n  }\n\n  return (\n    isMessageFlowSource(source) &&\n    isMessageFlowTarget(target) &&\n    !isSameOrganization(source, target)\n  );\n}\n\n/**\n * @param {Element} source\n * @param {Element} target\n *\n * @return {boolean}\n */\nfunction canConnectSequenceFlow(source, target) {\n  return isSequenceFlowSource(source) &&\n         isSequenceFlowTarget(target) &&\n         isSameScope(source, target) &&\n         !(is(source, 'bpmn:EventBasedGateway') && !isEventBasedTarget(target));\n}\n\n/**\n * @param {Element} source\n * @param {Element} target\n *\n * @return {CanConnectResult}\n */\nfunction canConnectDataAssociation(source, target) {\n\n  if (isAny(source, [ 'bpmn:DataObjectReference', 'bpmn:DataStoreReference' ]) &&\n      isAny(target, [ 'bpmn:Activity', 'bpmn:ThrowEvent' ])) {\n    return { type: 'bpmn:DataInputAssociation' };\n  }\n\n  if (isAny(target, [ 'bpmn:DataObjectReference', 'bpmn:DataStoreReference' ]) &&\n      isAny(source, [ 'bpmn:Activity', 'bpmn:CatchEvent' ])) {\n    return { type: 'bpmn:DataOutputAssociation' };\n  }\n\n  return false;\n}\n\n/**\n * @param {Shape} shape\n * @param {Connection} connection\n * @param {Point} position\n *\n * @return {boolean}\n */\nfunction canInsert(shape, connection, position) {\n  if (!connection) {\n    return false;\n  }\n\n  if (Array.isArray(shape)) {\n    if (shape.length !== 1) {\n      return false;\n    }\n\n    shape = shape[ 0 ];\n  }\n\n  if (connection.source === shape ||\n      connection.target === shape) {\n    return false;\n  }\n\n  // return true if shape can be inserted into connection parent\n  return (\n    isAny(connection, [ 'bpmn:SequenceFlow', 'bpmn:MessageFlow' ]) &&\n    !isLabel(connection) &&\n    is(shape, 'bpmn:FlowNode') &&\n    !is(shape, 'bpmn:BoundaryEvent') &&\n    canDrop(shape, connection.parent, position));\n}\n\n/**\n * @param {Element[]} elements\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction includes(elements, element) {\n  return (elements && element) && elements.indexOf(element) !== -1;\n}\n\n/**\n * @param {Element[]} elements\n * @param {Element} element\n *\n * @return {boolean}\n */\nfunction canCopy(elements, element) {\n  if (isLabel(element)) {\n    return true;\n  }\n\n  if (is(element, 'bpmn:Lane') && !includes(elements, element.parent)) {\n    return false;\n  }\n\n  return true;\n}\n\n/**\n * @param {Element} element\n *\n * @return {Element|null}\n */\nfunction getRootElement(element) {\n  return getParent(element, 'bpmn:Process') || getParent(element, 'bpmn:Collaboration');\n}\n\nfunction isHostOfElement(potentialHost, element) {\n  return potentialHost.attachers.includes(element);\n}\n"
  },
  {
    "path": "lib/features/rules/index.js",
    "content": "import RulesModule from 'diagram-js/lib/features/rules';\n\nimport BpmnRules from './BpmnRules';\n\nexport default {\n  __depends__: [\n    RulesModule\n  ],\n  __init__: [ 'bpmnRules' ],\n  bpmnRules: [ 'type', BpmnRules ]\n};\n"
  },
  {
    "path": "lib/features/search/BpmnSearchProvider.js",
    "content": "import {\n  getLabel,\n  isLabel\n} from '../../util/LabelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n * @typedef {import('diagram-js/lib/features/search-pad/SearchPad').default} SearchPad\n *\n * @typedef {import('diagram-js/lib/features/search-pad/SearchPadProvider').default} SearchPadProvider\n * @typedef {import('diagram-js/lib/features/search-pad/SearchPadProvider').SearchResult} SearchPadResult\n * @typedef {import('diagram-js/lib/features/search-pad/SearchPadProvider').Token} SearchPadToken\n * @typedef {import('diagram-js/lib/features/search/search').default} Search\n * @typedef {import('diagram-js/lib/features/search/search').SearchResult} SearchResult\n * @typedef {import('diagram-js/lib/features/search/search').Token} SearchToken\n */\n\n/**\n * Provides ability to search for BPMN elements.\n *\n * @implements {SearchPadProvider}\n *\n * @param {ElementRegistry} elementRegistry\n * @param {SearchPad} searchPad\n * @param {Canvas} canvas\n * @param {Search} search\n */\nexport default function BpmnSearchProvider(elementRegistry, searchPad, canvas, search) {\n  this._elementRegistry = elementRegistry;\n  this._canvas = canvas;\n  this._search = search;\n\n  searchPad.registerProvider(this);\n}\n\nBpmnSearchProvider.$inject = [\n  'elementRegistry',\n  'searchPad',\n  'canvas',\n  'search'\n];\n\n/**\n * @param {string} pattern\n *\n * @return {SearchPadResult[]}\n */\nBpmnSearchProvider.prototype.find = function(pattern) {\n  var rootElements = this._canvas.getRootElements();\n\n  var elements = this._elementRegistry.filter(function(element) {\n    return !isLabel(element) && !rootElements.includes(element);\n  });\n\n  return this._search(\n    elements.map(element => {\n      return {\n        element,\n        label: getLabel(element),\n        id: element.id\n      };\n    }),\n    pattern, {\n      keys: [\n        'label',\n        'id'\n      ]\n    }\n  ).map(toSearchPadResult);\n};\n\n/**\n * @param {SearchResult} token\n *\n * @return {SearchPadResult}\n */\nfunction toSearchPadResult(result) {\n\n  const {\n    item: {\n      element\n    },\n    tokens\n  } = result;\n\n  return {\n    element,\n    primaryTokens: tokens.label,\n    secondaryTokens: tokens.id\n  };\n}"
  },
  {
    "path": "lib/features/search/index.js",
    "content": "import SearchPadModule from 'diagram-js/lib/features/search-pad';\nimport SearchModule from 'diagram-js/lib/features/search';\n\nimport BpmnSearchProvider from './BpmnSearchProvider';\n\n\nexport default {\n  __depends__: [\n    SearchPadModule,\n    SearchModule\n  ],\n  __init__: [ 'bpmnSearch' ],\n  bpmnSearch: [ 'type', BpmnSearchProvider ]\n};\n"
  },
  {
    "path": "lib/features/snapping/BpmnConnectSnapping.js",
    "content": "import {\r\n  mid,\r\n  setSnapped\r\n} from 'diagram-js/lib/features/snapping/SnapUtil';\r\n\r\nimport { isCmd } from 'diagram-js/lib/features/keyboard/KeyboardUtil';\r\n\r\nimport {\r\n  getOrientation\r\n} from 'diagram-js/lib/layout/LayoutUtil';\r\n\r\nimport { is } from '../../util/ModelUtil';\r\n\r\nimport { isAny } from '../modeling/util/ModelingUtil';\r\n\r\nimport { some } from 'min-dash';\r\n\r\n/**\r\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n *\r\n * @typedef {import('diagram-js/lib/core/EventBus').Event} Event\r\n *\r\n * @typedef {import('../../model/Types').Shape} Shape\r\n *\r\n * @typedef {import('diagram-js/lib/util/Types').Axis} Axis\r\n * @typedef {import('diagram-js/lib/util/Types').Point} Point\r\n */\r\n\r\nvar HIGHER_PRIORITY = 1250;\r\n\r\nvar BOUNDARY_TO_HOST_THRESHOLD = 40;\r\n\r\nvar TARGET_BOUNDS_PADDING = 20,\r\n    TASK_BOUNDS_PADDING = 10;\r\n\r\nvar TARGET_CENTER_PADDING = 20;\r\n\r\nvar AXES = [ 'x', 'y' ];\r\n\r\nvar abs = Math.abs;\r\n\r\n/**\r\n * Snap during connect.\r\n *\r\n * @param {EventBus} eventBus\r\n */\r\nexport default function BpmnConnectSnapping(eventBus) {\r\n  eventBus.on([\r\n    'connect.hover',\r\n    'connect.move',\r\n    'connect.end',\r\n  ], HIGHER_PRIORITY, function(event) {\r\n    var context = event.context,\r\n        canExecute = context.canExecute,\r\n        start = context.start,\r\n        hover = context.hover,\r\n        source = context.source,\r\n        target = context.target;\r\n\r\n    // do NOT snap on CMD\r\n    if (event.originalEvent && isCmd(event.originalEvent)) {\r\n      return;\r\n    }\r\n\r\n    if (!context.initialConnectionStart) {\r\n      context.initialConnectionStart = context.connectionStart;\r\n    }\r\n\r\n    // snap hover\r\n    if (canExecute && hover) {\r\n      snapToShape(event, hover, getTargetBoundsPadding(hover));\r\n    }\r\n\r\n    if (hover && isAnyType(canExecute, [\r\n      'bpmn:Association',\r\n      'bpmn:DataInputAssociation',\r\n      'bpmn:DataOutputAssociation',\r\n      'bpmn:SequenceFlow'\r\n    ])) {\r\n      context.connectionStart = mid(start);\r\n\r\n      // snap hover\r\n      if (isAny(hover, [ 'bpmn:Event', 'bpmn:Gateway' ])) {\r\n        snapToPosition(event, mid(hover));\r\n      }\r\n\r\n      // snap hover\r\n      if (isAny(hover, [ 'bpmn:Task', 'bpmn:SubProcess' ])) {\r\n        snapToTargetMid(event, hover);\r\n      }\r\n\r\n      // snap source and target\r\n      if (is(source, 'bpmn:BoundaryEvent') && target === source.host) {\r\n        snapBoundaryEventLoop(event);\r\n      }\r\n\r\n    } else if (isType(canExecute, 'bpmn:MessageFlow')) {\r\n\r\n      if (is(start, 'bpmn:Event')) {\r\n\r\n        // snap start\r\n        context.connectionStart = mid(start);\r\n      }\r\n\r\n      if (is(hover, 'bpmn:Event')) {\r\n\r\n        // snap hover\r\n        snapToPosition(event, mid(hover));\r\n      }\r\n\r\n    } else {\r\n\r\n      // un-snap source\r\n      context.connectionStart = context.initialConnectionStart;\r\n    }\r\n  });\r\n}\r\n\r\nBpmnConnectSnapping.$inject = [ 'eventBus' ];\r\n\r\n\r\n// helpers //////////\r\n\r\n/**\r\n * Snap to the given target if the event is inside the bounds of the target.\r\n *\r\n * @param {Event} event\r\n * @param {Shape} target\r\n * @param {number} padding\r\n */\r\nfunction snapToShape(event, target, padding) {\r\n  AXES.forEach(function(axis) {\r\n    var dimensionForAxis = getDimensionForAxis(axis, target);\r\n\r\n    if (event[ axis ] < target[ axis ] + padding) {\r\n      setSnapped(event, axis, target[ axis ] + padding);\r\n    } else if (event[ axis ] > target[ axis ] + dimensionForAxis - padding) {\r\n      setSnapped(event, axis, target[ axis ] + dimensionForAxis - padding);\r\n    }\r\n  });\r\n}\r\n\r\n/**\r\n * Snap to the target mid if the event is in the target mid.\r\n *\r\n * @param {Event} event\r\n * @param {Shape} target\r\n */\r\nfunction snapToTargetMid(event, target) {\r\n  var targetMid = mid(target);\r\n\r\n  AXES.forEach(function(axis) {\r\n    if (isMid(event, target, axis)) {\r\n      setSnapped(event, axis, targetMid[ axis ]);\r\n    }\r\n  });\r\n}\r\n\r\n/**\r\n * Snap to prevent a loop overlapping a boundary event.\r\n *\r\n * @param {Event} event\r\n */\r\nfunction snapBoundaryEventLoop(event) {\r\n  var context = event.context,\r\n      source = context.source,\r\n      target = context.target;\r\n\r\n  if (isReverse(context)) {\r\n    return;\r\n  }\r\n\r\n  var sourceMid = mid(source),\r\n      orientation = getOrientation(sourceMid, target, -10),\r\n      axes = [];\r\n\r\n  if (/top|bottom/.test(orientation)) {\r\n    axes.push('x');\r\n  }\r\n\r\n  if (/left|right/.test(orientation)) {\r\n    axes.push('y');\r\n  }\r\n\r\n  axes.forEach(function(axis) {\r\n    var coordinate = event[ axis ], newCoordinate;\r\n\r\n    if (abs(coordinate - sourceMid[ axis ]) < BOUNDARY_TO_HOST_THRESHOLD) {\r\n      if (coordinate > sourceMid[ axis ]) {\r\n        newCoordinate = sourceMid[ axis ] + BOUNDARY_TO_HOST_THRESHOLD;\r\n      }\r\n      else {\r\n        newCoordinate = sourceMid[ axis ] - BOUNDARY_TO_HOST_THRESHOLD;\r\n      }\r\n\r\n      setSnapped(event, axis, newCoordinate);\r\n    }\r\n  });\r\n}\r\n\r\n/**\r\n * @param {Event} event\r\n * @param {Point} position\r\n */\r\nfunction snapToPosition(event, position) {\r\n  setSnapped(event, 'x', position.x);\r\n  setSnapped(event, 'y', position.y);\r\n}\r\n\r\nfunction isType(attrs, type) {\r\n  return attrs && attrs.type === type;\r\n}\r\n\r\nfunction isAnyType(attrs, types) {\r\n  return some(types, function(type) {\r\n    return isType(attrs, type);\r\n  });\r\n}\r\n\r\n/**\r\n * @param {Axis} axis\r\n * @param {Shape} element\r\n *\r\n * @return {number}\r\n */\r\nfunction getDimensionForAxis(axis, element) {\r\n  return axis === 'x' ? element.width : element.height;\r\n}\r\n\r\n/**\r\n * @param {Shape} target\r\n *\r\n * @return {number}\r\n */\r\nfunction getTargetBoundsPadding(target) {\r\n  if (is(target, 'bpmn:Task')) {\r\n    return TASK_BOUNDS_PADDING;\r\n  } else {\r\n    return TARGET_BOUNDS_PADDING;\r\n  }\r\n}\r\n\r\n/**\r\n * @param {Event} event\r\n * @param {Shape} target\r\n * @param {Axis} axis\r\n *\r\n * @return {boolean}\r\n */\r\nfunction isMid(event, target, axis) {\r\n  return event[ axis ] > target[ axis ] + TARGET_CENTER_PADDING\r\n    && event[ axis ] < target[ axis ] + getDimensionForAxis(axis, target) - TARGET_CENTER_PADDING;\r\n}\r\n\r\nfunction isReverse(context) {\r\n  var hover = context.hover,\r\n      source = context.source;\r\n\r\n  return hover && source && hover === source;\r\n}"
  },
  {
    "path": "lib/features/snapping/BpmnCreateMoveSnapping.js",
    "content": "import inherits from 'inherits-browser';\n\nimport CreateMoveSnapping from 'diagram-js/lib/features/snapping/CreateMoveSnapping';\n\nimport {\n  isSnapped,\n  setSnapped,\n  topLeft,\n  bottomRight\n} from 'diagram-js/lib/features/snapping/SnapUtil';\n\nimport { isExpanded } from '../../util/DiUtil';\n\nimport { is } from '../../util/ModelUtil';\n\nimport {\n  asTRBL,\n  getMid\n} from 'diagram-js/lib/layout/LayoutUtil';\n\nimport { getBoundaryAttachment } from './BpmnSnappingUtil';\n\nimport { forEach } from 'min-dash';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n * @typedef {import('didi').Injector} Injector\n *\n * @typedef {import('diagram-js/lib/features/snapping/SnapContext').default} SnapContext\n * @typedef {import('diagram-js/lib/features/snapping/SnapContext').SnapPoints} SnapPoints\n *\n * @typedef {import('diagram-js/lib/core/EventBus').Event} Event\n *\n * @typedef {import('../../model/Types').Element} Element\n * @typedef {import('../../model/Types').Shape} Shape\n */\n\nvar HIGH_PRIORITY = 1500;\n\n\n/**\n * Snap during create and move.\n *\n * @param {EventBus} eventBus\n * @param {Injector} injector\n */\nexport default function BpmnCreateMoveSnapping(eventBus, injector) {\n  injector.invoke(CreateMoveSnapping, this);\n\n  // creating first participant\n  eventBus.on([ 'create.move', 'create.end' ], HIGH_PRIORITY, setSnappedIfConstrained);\n\n  // snap boundary events\n  eventBus.on([\n    'create.move',\n    'create.end',\n    'shape.move.move',\n    'shape.move.end'\n  ], HIGH_PRIORITY, function(event) {\n    var context = event.context,\n        canExecute = context.canExecute,\n        target = context.target;\n\n    var canAttach = canExecute && (canExecute === 'attach' || canExecute.attach);\n\n    if (canAttach && !isSnapped(event)) {\n      snapBoundaryEvent(event, target);\n    }\n  });\n}\n\ninherits(BpmnCreateMoveSnapping, CreateMoveSnapping);\n\nBpmnCreateMoveSnapping.$inject = [\n  'eventBus',\n  'injector'\n];\n\n/**\n * @param {Event} event\n *\n * @return {SnapContext}\n */\nBpmnCreateMoveSnapping.prototype.initSnap = function(event) {\n  var snapContext = CreateMoveSnapping.prototype.initSnap.call(this, event);\n\n  var shape = event.shape;\n\n  var isMove = !!this._elementRegistry.get(shape.id);\n\n  // snap to docking points\n  forEach(shape.outgoing, function(connection) {\n    var docking = connection.waypoints[0];\n\n    docking = docking.original || docking;\n\n    snapContext.setSnapOrigin(connection.id + '-docking', getDockingSnapOrigin(docking, isMove, event));\n  });\n\n  forEach(shape.incoming, function(connection) {\n    var docking = connection.waypoints[connection.waypoints.length - 1];\n\n    docking = docking.original || docking;\n\n    snapContext.setSnapOrigin(connection.id + '-docking', getDockingSnapOrigin(docking, isMove, event));\n  });\n\n  if (is(shape, 'bpmn:Participant')) {\n\n    // snap to borders with higher priority\n    snapContext.setSnapLocations([ 'top-left', 'bottom-right', 'mid' ]);\n  }\n\n  return snapContext;\n};\n\n/**\n * @param {SnapPoints} snapPoints\n * @param {Shape} shape\n * @param {Shape} target\n *\n * @return {SnapPoints}\n */\nBpmnCreateMoveSnapping.prototype.addSnapTargetPoints = function(snapPoints, shape, target) {\n  CreateMoveSnapping.prototype.addSnapTargetPoints.call(this, snapPoints, shape, target);\n\n  var snapTargets = this.getSnapTargets(shape, target);\n\n  forEach(snapTargets, function(snapTarget) {\n\n    // handle TRBL alignment\n    //\n    // * with container elements\n    // * with text annotations\n    if (isContainer(snapTarget) || areAll([ shape, snapTarget ], 'bpmn:TextAnnotation')) {\n      snapPoints.add('top-left', topLeft(snapTarget));\n      snapPoints.add('bottom-right', bottomRight(snapTarget));\n    }\n  });\n\n  var elementRegistry = this._elementRegistry;\n\n  // snap to docking points if not create mode\n  forEach(shape.incoming, function(connection) {\n    if (elementRegistry.get(shape.id)) {\n\n      if (!includes(snapTargets, connection.source)) {\n        snapPoints.add('mid', getMid(connection.source));\n      }\n\n      var docking = connection.waypoints[0];\n      snapPoints.add(connection.id + '-docking', docking.original || docking);\n    }\n  });\n\n  forEach(shape.outgoing, function(connection) {\n    if (elementRegistry.get(shape.id)) {\n\n      if (!includes(snapTargets, connection.target)) {\n        snapPoints.add('mid', getMid(connection.target));\n      }\n\n      var docking = connection.waypoints[ connection.waypoints.length - 1 ];\n\n      snapPoints.add(connection.id + '-docking', docking.original || docking);\n    }\n  });\n\n  // add sequence flow parents as snap targets\n  if (is(target, 'bpmn:SequenceFlow')) {\n    snapPoints = this.addSnapTargetPoints(snapPoints, shape, target.parent);\n  }\n\n  return snapPoints;\n};\n\n/**\n * @param {Shape} shape\n * @param {Shape} target\n *\n * @return {Shape[]}\n */\nBpmnCreateMoveSnapping.prototype.getSnapTargets = function(shape, target) {\n  return CreateMoveSnapping.prototype.getSnapTargets.call(this, shape, target)\n    .filter(function(snapTarget) {\n\n      // do not snap to lanes\n      return !is(snapTarget, 'bpmn:Lane');\n    });\n};\n\n// helpers //////////\n\n/**\n * @param {Shape} event\n * @param {Shape} target\n */\nfunction snapBoundaryEvent(event, target) {\n  var targetTRBL = asTRBL(target);\n\n  var direction = getBoundaryAttachment(event, target);\n\n  var context = event.context,\n      shape = context.shape;\n\n  var offset;\n\n  if (shape.parent) {\n    offset = { x: 0, y: 0 };\n  } else {\n    offset = getMid(shape);\n  }\n\n  if (/top/.test(direction)) {\n    setSnapped(event, 'y', targetTRBL.top - offset.y);\n  } else if (/bottom/.test(direction)) {\n    setSnapped(event, 'y', targetTRBL.bottom - offset.y);\n  }\n\n  if (/left/.test(direction)) {\n    setSnapped(event, 'x', targetTRBL.left - offset.x);\n  } else if (/right/.test(direction)) {\n    setSnapped(event, 'x', targetTRBL.right - offset.x);\n  }\n}\n\n/**\n * @param {Element[]} elements\n * @param {string} type\n *\n * @return {boolean}\n */\nfunction areAll(elements, type) {\n  return elements.every(function(el) {\n    return is(el, type);\n  });\n}\n\n/**\n * @param {Element} element\n */\nfunction isContainer(element) {\n  if (is(element, 'bpmn:SubProcess') && isExpanded(element)) {\n    return true;\n  }\n\n  return is(element, 'bpmn:Participant');\n}\n\n/**\n * @param {Event} event\n */\nfunction setSnappedIfConstrained(event) {\n  var context = event.context,\n      createConstraints = context.createConstraints;\n\n  if (!createConstraints) {\n    return;\n  }\n\n  var top = createConstraints.top,\n      right = createConstraints.right,\n      bottom = createConstraints.bottom,\n      left = createConstraints.left;\n\n  if ((left && left >= event.x) || (right && right <= event.x)) {\n    setSnapped(event, 'x', event.x);\n  }\n\n  if ((top && top >= event.y) || (bottom && bottom <= event.y)) {\n    setSnapped(event, 'y', event.y);\n  }\n}\n\nfunction includes(array, value) {\n  return array.indexOf(value) !== -1;\n}\n\nfunction getDockingSnapOrigin(docking, isMove, event) {\n  return isMove ? (\n    {\n      x: docking.x - event.x,\n      y: docking.y - event.y\n    }\n  ) : {\n    x: docking.x,\n    y: docking.y\n  };\n}\n"
  },
  {
    "path": "lib/features/snapping/BpmnSnappingUtil.js",
    "content": "import { getOrientation } from 'diagram-js/lib/layout/LayoutUtil';\r\n\r\n/**\r\n * @typedef {import('diagram-js/lib/util/Types').DirectionTRBL} DirectionTRBL\r\n * @typedef {import('diagram-js/lib/util/Types').Point} Point\r\n * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\r\n */\r\n\r\n/**\r\n * @param {Point} position\r\n * @param {Rect} targetBounds\r\n *\r\n * @return {DirectionTRBL|null}\r\n */\r\nexport function getBoundaryAttachment(position, targetBounds) {\r\n\r\n  var orientation = getOrientation(position, targetBounds, -15);\r\n\r\n  if (orientation !== 'intersect') {\r\n    return orientation;\r\n  } else {\r\n    return null;\r\n  }\r\n}"
  },
  {
    "path": "lib/features/snapping/index.js",
    "content": "import BpmnConnectSnapping from './BpmnConnectSnapping';\nimport BpmnCreateMoveSnapping from './BpmnCreateMoveSnapping';\nimport SnappingModule from 'diagram-js/lib/features/snapping';\n\nexport default {\n  __depends__: [ SnappingModule ],\n  __init__: [\n    'connectSnapping',\n    'createMoveSnapping'\n  ],\n  connectSnapping: [ 'type', BpmnConnectSnapping ],\n  createMoveSnapping: [ 'type', BpmnCreateMoveSnapping ]\n};"
  },
  {
    "path": "lib/features/space-tool/BpmnSpaceTool.js",
    "content": "import inherits from 'inherits-browser';\n\nimport SpaceTool from 'diagram-js/lib/features/space-tool/SpaceTool';\n\nimport { getEnclosedElements, getBBox } from 'diagram-js/lib/util/Elements';\n\nimport { getBusinessObject, is } from '../../util/ModelUtil';\n\nimport { isHorizontal } from '../../util/DiUtil';\nimport { values } from 'min-dash';\n\n/**\n * @typedef {import('didi').Injector} Injector\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n *\n * @typedef {import('../../model/Types').Shape} Shape\n *\n * @typedef {import('diagram-js/lib/util/Types').Axis} Axis\n * @typedef {import('diagram-js/lib/util/Types').Point} Point\n */\n\n/**\n * @param {Injector} injector\n * @param {Canvas} canvas\n */\nexport default function BpmnSpaceTool(injector, canvas) {\n  injector.invoke(SpaceTool, this);\n\n  this._canvas = canvas;\n}\n\nBpmnSpaceTool.$inject = [\n  'injector',\n  'canvas'\n];\n\ninherits(BpmnSpaceTool, SpaceTool);\n\n/**\n * @param {Shape[]} elements\n * @param {Axis} axis\n * @param {Point} delta\n * @param {number} start\n *\n * @return {Object}\n */\nBpmnSpaceTool.prototype.calculateAdjustments = function(elements, axis, delta, start) {\n\n  var canvasRoot = this._canvas.getRootElement(),\n      spaceRoot = elements[0] === canvasRoot ? null : elements[0],\n      enclosedArtifacts = [];\n\n  // ensure\n  if (spaceRoot) {\n    enclosedArtifacts = values(\n      getEnclosedElements(\n        canvasRoot.children.filter(\n          (child) => is(child, 'bpmn:Artifact')\n        ),\n        getBBox(spaceRoot)\n      )\n    );\n  }\n\n  const elementsToMove = [ ...elements, ...enclosedArtifacts ];\n\n  var adjustments = SpaceTool.prototype.calculateAdjustments.call(this, elementsToMove, axis, delta, start);\n\n  // do not resize:\n  //\n  // * text annotations (horizontally/vertically)\n  // * empty horizontal pools (vertically)\n  // * empty vertical pools (horizontally)\n  adjustments.resizingShapes = adjustments.resizingShapes.filter(function(shape) {\n\n    if (is(shape, 'bpmn:TextAnnotation')) {\n      return false;\n    }\n\n    if (isCollapsedPool(shape)) {\n      if (axis === 'y' && isHorizontal(shape) || axis === 'x' && !isHorizontal(shape)) {\n        return false;\n      }\n    }\n\n    return true;\n  });\n\n  return adjustments;\n};\n\n\n// helpers ///////////\n\nfunction isCollapsedPool(shape) {\n  return is(shape, 'bpmn:Participant') && !getBusinessObject(shape).processRef;\n}"
  },
  {
    "path": "lib/features/space-tool/index.js",
    "content": "import SpaceToolModule from 'diagram-js/lib/features/space-tool';\n\nimport BpmnSpaceTool from './BpmnSpaceTool';\n\nexport default {\n  __depends__: [ SpaceToolModule ],\n  spaceTool: [ 'type', BpmnSpaceTool ]\n};"
  },
  {
    "path": "lib/import/BpmnImporter.js",
    "content": "import {\n  assign\n} from 'min-dash';\n\nimport { is } from '../util/ModelUtil';\n\nimport {\n  isLabelExternal,\n  getExternalLabelBounds,\n  getLabel\n} from '../util/LabelUtil';\n\nimport {\n  getMid\n} from 'diagram-js/lib/layout/LayoutUtil';\n\nimport {\n  isExpanded\n} from '../util/DiUtil';\n\nimport {\n  elementToString\n} from './Util';\n\n/**\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n *\n * @typedef {import('../features/modeling/ElementFactory').default} ElementFactory\n * @typedef {import('../draw/TextRenderer').default} TextRenderer\n *\n * @typedef {import('../model/Types').Element} Element\n * @typedef {import('../model/Types').Label} Label\n * @typedef {import('../model/Types').Shape} Shape\n * @typedef {import('../model/Types').Connection} Connection\n * @typedef {import('../model/Types').Root} Root\n * @typedef {import('../model/Types').ModdleElement} ModdleElement\n */\n\n/**\n * @param {ModdleElement} semantic\n * @param {ModdleElement} di\n * @param {Object} [attrs=null]\n *\n * @return {Object}\n */\nfunction elementData(semantic, di, attrs) {\n  return assign({\n    id: semantic.id,\n    type: semantic.$type,\n    businessObject: semantic,\n    di: di\n  }, attrs);\n}\n\nfunction getWaypoints(di, source, target) {\n\n  var waypoints = di.waypoint;\n\n  if (!waypoints || waypoints.length < 2) {\n    return [ getMid(source), getMid(target) ];\n  }\n\n  return waypoints.map(function(p) {\n    return { x: p.x, y: p.y };\n  });\n}\n\nfunction notYetDrawn(semantic, refSemantic, property) {\n  return new Error(\n    `element ${ elementToString(refSemantic) } referenced by ${ elementToString(semantic) }#${ property } not yet drawn`\n  );\n}\n\n\n/**\n * An importer that adds bpmn elements to the canvas\n *\n * @param {EventBus} eventBus\n * @param {Canvas} canvas\n * @param {ElementFactory} elementFactory\n * @param {ElementRegistry} elementRegistry\n * @param {TextRenderer} textRenderer\n */\nexport default function BpmnImporter(\n    eventBus, canvas, elementFactory,\n    elementRegistry, textRenderer) {\n\n  this._eventBus = eventBus;\n  this._canvas = canvas;\n  this._elementFactory = elementFactory;\n  this._elementRegistry = elementRegistry;\n  this._textRenderer = textRenderer;\n}\n\nBpmnImporter.$inject = [\n  'eventBus',\n  'canvas',\n  'elementFactory',\n  'elementRegistry',\n  'textRenderer'\n];\n\n\n/**\n * Add a BPMN element (semantic) to the canvas making it a child of the\n * given parent.\n *\n * @param {ModdleElement} semantic\n * @param {ModdleElement} di\n * @param {Shape} parentElement\n *\n * @return {Shape | Root | Connection}\n */\nBpmnImporter.prototype.add = function(semantic, di, parentElement) {\n  var element,\n      hidden;\n\n  var parentIndex;\n\n  // ROOT ELEMENT\n  // handle the special case that we deal with a\n  // invisible root element (process, subprocess or collaboration)\n  if (is(di, 'bpmndi:BPMNPlane')) {\n\n    var attrs = is(semantic, 'bpmn:SubProcess')\n      ? { id: semantic.id + '_plane' }\n      : {};\n\n    // add a virtual element (not being drawn)\n    element = this._elementFactory.createRoot(elementData(semantic, di, attrs));\n\n    this._canvas.addRootElement(element);\n  }\n\n  // SHAPE\n  else if (is(di, 'bpmndi:BPMNShape')) {\n\n    var collapsed = !isExpanded(semantic, di),\n        isFrame = isFrameElement(semantic);\n\n    hidden = parentElement && (parentElement.hidden || parentElement.collapsed);\n\n    var bounds = di.bounds;\n\n    element = this._elementFactory.createShape(elementData(semantic, di, {\n      collapsed: collapsed,\n      hidden: hidden,\n      x: Math.round(bounds.x),\n      y: Math.round(bounds.y),\n      width: Math.round(bounds.width),\n      height: Math.round(bounds.height),\n      isFrame: isFrame\n    }));\n\n    if (is(semantic, 'bpmn:BoundaryEvent')) {\n      this._attachBoundary(semantic, element);\n    }\n\n    // insert lanes behind other flow nodes (cf. #727)\n    if (is(semantic, 'bpmn:Lane')) {\n      parentIndex = 0;\n    }\n\n    if (is(semantic, 'bpmn:DataStoreReference')) {\n\n      // check whether data store is inside our outside of its semantic parent\n      if (!isPointInsideBBox(parentElement, getMid(bounds))) {\n        parentElement = this._canvas.findRoot(parentElement);\n      }\n    }\n\n    this._canvas.addShape(element, parentElement, parentIndex);\n  }\n\n  // CONNECTION\n  else if (is(di, 'bpmndi:BPMNEdge')) {\n\n    var source = this._getSource(semantic),\n        target = this._getTarget(semantic);\n\n    hidden = parentElement && (parentElement.hidden || parentElement.collapsed);\n\n    element = this._elementFactory.createConnection(elementData(semantic, di, {\n      hidden: hidden,\n      source: source,\n      target: target,\n      waypoints: getWaypoints(di, source, target)\n    }));\n\n    if (is(semantic, 'bpmn:DataAssociation')) {\n\n      // render always on top; this ensures DataAssociations\n      // are rendered correctly across different \"hacks\" people\n      // love to model such as cross participant / sub process\n      // associations\n      parentElement = this._canvas.findRoot(parentElement);\n    }\n\n    this._canvas.addConnection(element, parentElement, parentIndex);\n  } else {\n    throw new Error(\n      `unknown di ${ elementToString(di) } for element ${ elementToString(semantic) }`\n    );\n  }\n\n  // (optional) LABEL\n  if (isLabelExternal(semantic) && getLabel(element)) {\n    this.addLabel(semantic, di, element);\n  }\n\n  this._eventBus.fire('bpmnElement.added', { element: element });\n\n  return element;\n};\n\n\n/**\n * Attach a boundary element to the given host.\n *\n * @param {ModdleElement} boundarySemantic\n * @param {Shape} boundaryElement\n */\nBpmnImporter.prototype._attachBoundary = function(boundarySemantic, boundaryElement) {\n  var hostSemantic = boundarySemantic.attachedToRef;\n\n  if (!hostSemantic) {\n    throw new Error(\n      `missing ${ elementToString(boundarySemantic) }#attachedToRef`\n    );\n  }\n\n  var host = this._elementRegistry.get(hostSemantic.id),\n      attachers = host && host.attachers;\n\n  if (!host) {\n    throw notYetDrawn(boundarySemantic, hostSemantic, 'attachedToRef');\n  }\n\n  // wire element.host <> host.attachers\n  boundaryElement.host = host;\n\n  if (!attachers) {\n    host.attachers = attachers = [];\n  }\n\n  if (attachers.indexOf(boundaryElement) === -1) {\n    attachers.push(boundaryElement);\n  }\n};\n\n\n/**\n * Add a label to a given element.\n *\n * @param {ModdleElement} semantic\n * @param {ModdleElement} di\n * @param {Element} element\n *\n * @return {Label}\n */\nBpmnImporter.prototype.addLabel = function(semantic, di, element) {\n  var bounds,\n      text,\n      label;\n\n  bounds = getExternalLabelBounds(di, element);\n\n  text = getLabel(element);\n\n  if (text) {\n\n    // get corrected bounds from actual layouted text\n    bounds = this._textRenderer.getExternalLabelBounds(bounds, text);\n  }\n\n  label = this._elementFactory.createLabel(elementData(semantic, di, {\n    id: semantic.id + '_label',\n    labelTarget: element,\n    type: 'label',\n    hidden: element.hidden || !getLabel(element),\n    x: Math.round(bounds.x),\n    y: Math.round(bounds.y),\n    width: Math.round(bounds.width),\n    height: Math.round(bounds.height)\n  }));\n\n  return this._canvas.addShape(label, element.parent);\n};\n\n/**\n * Get the source or target of the given connection.\n *\n * @param {ModdleElement} semantic\n * @param {'source' | 'target'} side\n *\n * @return {Element}\n */\nBpmnImporter.prototype._getConnectedElement = function(semantic, side) {\n\n  var element,\n      refSemantic,\n      type = semantic.$type;\n\n  refSemantic = semantic[side + 'Ref'];\n\n  // handle mysterious isMany DataAssociation#sourceRef\n  if (side === 'source' && type === 'bpmn:DataInputAssociation') {\n    refSemantic = refSemantic && refSemantic[0];\n  }\n\n  // fix source / target for DataInputAssociation / DataOutputAssociation\n  if (side === 'source' && type === 'bpmn:DataOutputAssociation' ||\n      side === 'target' && type === 'bpmn:DataInputAssociation') {\n\n    refSemantic = semantic.$parent;\n  }\n\n  element = refSemantic && this._getElement(refSemantic);\n\n  if (element) {\n    return element;\n  }\n\n  if (refSemantic) {\n    throw notYetDrawn(semantic, refSemantic, side + 'Ref');\n  } else {\n    throw new Error(\n      `${ elementToString(semantic) }#${ side } Ref not specified`\n    );\n  }\n};\n\nBpmnImporter.prototype._getSource = function(semantic) {\n  return this._getConnectedElement(semantic, 'source');\n};\n\nBpmnImporter.prototype._getTarget = function(semantic) {\n  return this._getConnectedElement(semantic, 'target');\n};\n\n\nBpmnImporter.prototype._getElement = function(semantic) {\n  return this._elementRegistry.get(semantic.id);\n};\n\n\n// helpers ////////////////////\n\nfunction isPointInsideBBox(bbox, point) {\n  var x = point.x,\n      y = point.y;\n\n  return x >= bbox.x &&\n    x <= bbox.x + bbox.width &&\n    y >= bbox.y &&\n    y <= bbox.y + bbox.height;\n}\n\nfunction isFrameElement(semantic) {\n  return is(semantic, 'bpmn:Group');\n}\n"
  },
  {
    "path": "lib/import/BpmnTreeWalker.js",
    "content": "import {\n  filter,\n  find,\n  forEach\n} from 'min-dash';\n\nimport {\n  elementToString\n} from './Util';\n\nimport {\n  ensureCompatDiRef\n} from '../util/CompatibilityUtil';\n\n/**\n * @typedef {import('../model/Types').ModdleElement} ModdleElement\n */\n\n/**\n * Returns true if an element is of the given meta-model type.\n *\n * @param {ModdleElement} element\n * @param {string} type\n *\n * @return {boolean}\n */\nfunction is(element, type) {\n  return element.$instanceOf(type);\n}\n\n\n/**\n * Find a suitable display candidate for definitions where the DI does not\n * correctly specify one.\n *\n * @param {ModdleElement} definitions\n *\n * @return {ModdleElement}\n */\nfunction findDisplayCandidate(definitions) {\n  return find(definitions.rootElements, function(e) {\n    return is(e, 'bpmn:Process') || is(e, 'bpmn:Collaboration');\n  });\n}\n\n/**\n * @param {Record<'element' | 'root' | 'error', Function>} handler\n */\nexport default function BpmnTreeWalker(handler) {\n\n  // list of containers already walked\n  var handledElements = {};\n\n  // list of elements to handle deferred to ensure\n  // prerequisites are drawn\n  var deferred = [];\n\n  var diMap = {};\n\n  // Helpers //////////////////////\n\n  function contextual(fn, ctx) {\n    return function(e) {\n      fn(e, ctx);\n    };\n  }\n\n  function handled(element) {\n    handledElements[element.id] = element;\n  }\n\n  function isHandled(element) {\n    return handledElements[element.id];\n  }\n\n  function visit(element, ctx) {\n\n    var gfx = element.gfx;\n\n    // avoid multiple rendering of elements\n    if (gfx) {\n      throw new Error(\n        `already rendered ${ elementToString(element) }`\n      );\n    }\n\n    // call handler\n    return handler.element(element, diMap[element.id], ctx);\n  }\n\n  function visitRoot(element, diagram) {\n    return handler.root(element, diMap[element.id], diagram);\n  }\n\n  function visitIfDi(element, ctx) {\n\n    try {\n      var gfx = diMap[element.id] && visit(element, ctx);\n\n      handled(element);\n\n      return gfx;\n    } catch (error) {\n      logError(error.message, { element, error });\n\n      console.error(`failed to import ${ elementToString(element) }`, error);\n    }\n  }\n\n  function logError(message, context) {\n    handler.error(message, context);\n  }\n\n  // DI handling //////////////////////\n\n  var registerDi = this.registerDi = function registerDi(di) {\n    var bpmnElement = di.bpmnElement;\n\n    if (bpmnElement) {\n      if (diMap[bpmnElement.id]) {\n        logError(\n          `multiple DI elements defined for ${ elementToString(bpmnElement) }`,\n          { element: bpmnElement }\n        );\n      } else {\n        diMap[bpmnElement.id] = di;\n\n        ensureCompatDiRef(bpmnElement);\n      }\n    } else {\n      logError(\n        `no bpmnElement referenced in ${ elementToString(di) }`,\n        { element: di }\n      );\n    }\n  };\n\n  function handleDiagram(diagram) {\n    handlePlane(diagram.plane);\n  }\n\n  function handlePlane(plane) {\n    registerDi(plane);\n\n    forEach(plane.planeElement, handlePlaneElement);\n  }\n\n  function handlePlaneElement(planeElement) {\n    registerDi(planeElement);\n  }\n\n\n  // Semantic handling //////////////////////\n\n  /**\n   * Handle definitions and return the rendered diagram (if any).\n   *\n   * @param {ModdleElement} definitions to walk and import\n   * @param {ModdleElement} [diagram] specific diagram to import and display\n   *\n   * @throws {Error} if no diagram to display could be found\n   */\n  this.handleDefinitions = function handleDefinitions(definitions, diagram) {\n\n    // make sure we walk the correct bpmnElement\n\n    var diagrams = definitions.diagrams;\n\n    if (diagram && diagrams.indexOf(diagram) === -1) {\n      throw new Error('diagram not part of <bpmn:Definitions />');\n    }\n\n    if (!diagram && diagrams && diagrams.length) {\n      diagram = diagrams[0];\n    }\n\n    // no diagram -> nothing to import\n    if (!diagram) {\n      throw new Error('no diagram to display');\n    }\n\n    // load DI from selected diagram only\n    diMap = {};\n    handleDiagram(diagram);\n\n\n    var plane = diagram.plane;\n\n    if (!plane) {\n      throw new Error(\n        `no plane for ${ elementToString(diagram) }`\n      );\n    }\n\n    var rootElement = plane.bpmnElement;\n\n    // ensure we default to a suitable display candidate (process or collaboration),\n    // even if non is specified in DI\n    if (!rootElement) {\n      rootElement = findDisplayCandidate(definitions);\n\n      if (!rootElement) {\n        throw new Error('no process or collaboration to display');\n      } else {\n\n        logError(\n          `correcting missing bpmnElement on ${ elementToString(plane) } to ${ elementToString(rootElement) }`\n        );\n\n        // correct DI on the fly\n        plane.bpmnElement = rootElement;\n        registerDi(plane);\n      }\n    }\n\n\n    var ctx = visitRoot(rootElement, plane);\n\n    if (is(rootElement, 'bpmn:Process') || is(rootElement, 'bpmn:SubProcess')) {\n      handleProcess(rootElement, ctx);\n    } else if (is(rootElement, 'bpmn:Collaboration')) {\n      handleCollaboration(rootElement, ctx);\n\n      // force drawing of everything not yet drawn that is part of the target DI\n      handleUnhandledProcesses(definitions.rootElements, ctx);\n    } else {\n      throw new Error(\n        `unsupported bpmnElement for ${ elementToString(plane) }: ${ elementToString(rootElement) }`\n      );\n    }\n\n    // handle all deferred elements\n    handleDeferred(deferred);\n  };\n\n  var handleDeferred = this.handleDeferred = function handleDeferred() {\n\n    var fn;\n\n    // drain deferred until empty\n    while (deferred.length) {\n      fn = deferred.shift();\n\n      fn();\n    }\n  };\n\n  function handleProcess(process, context) {\n    handleFlowElementsContainer(process, context);\n    handleIoSpecification(process.ioSpecification, context);\n\n    handleArtifacts(process.artifacts, context);\n\n    // log process handled\n    handled(process);\n  }\n\n  function handleUnhandledProcesses(rootElements, ctx) {\n\n    // walk through all processes that have not yet been drawn and draw them\n    // if they contain lanes with DI information.\n    // we do this to pass the free-floating lane test cases in the MIWG test suite\n    var processes = filter(rootElements, function(e) {\n      return !isHandled(e) && is(e, 'bpmn:Process') && e.laneSets;\n    });\n\n    processes.forEach(contextual(handleProcess, ctx));\n  }\n\n  function handleMessageFlow(messageFlow, context) {\n    visitIfDi(messageFlow, context);\n  }\n\n  function handleMessageFlows(messageFlows, context) {\n    forEach(messageFlows, contextual(handleMessageFlow, context));\n  }\n\n  function handleDataAssociation(association, context) {\n    visitIfDi(association, context);\n  }\n\n  function handleDataInput(dataInput, context) {\n    visitIfDi(dataInput, context);\n  }\n\n  function handleDataOutput(dataOutput, context) {\n    visitIfDi(dataOutput, context);\n  }\n\n  function handleArtifact(artifact, context) {\n\n    // bpmn:TextAnnotation\n    // bpmn:Group\n    // bpmn:Association\n\n    visitIfDi(artifact, context);\n  }\n\n  function handleArtifacts(artifacts, context) {\n\n    forEach(artifacts, function(e) {\n      if (is(e, 'bpmn:Association')) {\n        deferred.push(function() {\n          handleArtifact(e, context);\n        });\n      } else {\n        handleArtifact(e, context);\n      }\n    });\n  }\n\n  function handleIoSpecification(ioSpecification, context) {\n\n    if (!ioSpecification) {\n      return;\n    }\n\n    forEach(ioSpecification.dataInputs, contextual(handleDataInput, context));\n    forEach(ioSpecification.dataOutputs, contextual(handleDataOutput, context));\n  }\n\n  var handleSubProcess = this.handleSubProcess = function handleSubProcess(subProcess, context) {\n    handleFlowElementsContainer(subProcess, context);\n    handleArtifacts(subProcess.artifacts, context);\n  };\n\n  function handleFlowNode(flowNode, context) {\n    var childCtx = visitIfDi(flowNode, context);\n\n    if (is(flowNode, 'bpmn:SubProcess')) {\n      handleSubProcess(flowNode, childCtx || context);\n    }\n\n    if (is(flowNode, 'bpmn:Activity')) {\n      handleIoSpecification(flowNode.ioSpecification, context);\n    }\n\n    // defer handling of associations\n    // affected types:\n    //\n    //   * bpmn:Activity\n    //   * bpmn:ThrowEvent\n    //   * bpmn:CatchEvent\n    //\n    deferred.push(function() {\n      forEach(flowNode.dataInputAssociations, contextual(handleDataAssociation, context));\n      forEach(flowNode.dataOutputAssociations, contextual(handleDataAssociation, context));\n    });\n  }\n\n  function handleSequenceFlow(sequenceFlow, context) {\n    visitIfDi(sequenceFlow, context);\n  }\n\n  function handleDataElement(dataObject, context) {\n    visitIfDi(dataObject, context);\n  }\n\n  function handleLane(lane, context) {\n\n    deferred.push(function() {\n\n      var newContext = visitIfDi(lane, context);\n\n      if (lane.childLaneSet) {\n        handleLaneSet(lane.childLaneSet, newContext || context);\n      }\n\n      wireFlowNodeRefs(lane);\n    });\n  }\n\n  function handleLaneSet(laneSet, context) {\n    forEach(laneSet.lanes, contextual(handleLane, context));\n  }\n\n  function handleLaneSets(laneSets, context) {\n    forEach(laneSets, contextual(handleLaneSet, context));\n  }\n\n  function handleFlowElementsContainer(container, context) {\n    handleFlowElements(container.flowElements, context);\n\n    if (container.laneSets) {\n      handleLaneSets(container.laneSets, context);\n    }\n  }\n\n  function handleFlowElements(flowElements, context) {\n    forEach(flowElements, function(flowElement) {\n      if (is(flowElement, 'bpmn:SequenceFlow')) {\n        deferred.push(function() {\n          handleSequenceFlow(flowElement, context);\n        });\n      } else if (is(flowElement, 'bpmn:BoundaryEvent')) {\n        deferred.unshift(function() {\n          handleFlowNode(flowElement, context);\n        });\n      } else if (is(flowElement, 'bpmn:FlowNode')) {\n        handleFlowNode(flowElement, context);\n      } else if (is(flowElement, 'bpmn:DataObject')) {\n\n        // SKIP (assume correct referencing via DataObjectReference)\n      } else if (is(flowElement, 'bpmn:DataStoreReference')) {\n        handleDataElement(flowElement, context);\n      } else if (is(flowElement, 'bpmn:DataObjectReference')) {\n        handleDataElement(flowElement, context);\n      } else {\n        logError(\n          `unrecognized flowElement ${ elementToString(flowElement) } in context ${ elementToString(context && context.businessObject) }`,\n          {\n            element: flowElement,\n            context\n          }\n        );\n      }\n    });\n  }\n\n  function handleParticipant(participant, context) {\n    var newCtx = visitIfDi(participant, context);\n\n    var process = participant.processRef;\n    if (process) {\n      handleProcess(process, newCtx || context);\n    }\n  }\n\n  function handleCollaboration(collaboration, context) {\n\n    forEach(collaboration.participants, contextual(handleParticipant, context));\n\n    deferred.push(function() {\n      handleMessageFlows(collaboration.messageFlows, context);\n    });\n\n    handleArtifacts(collaboration.artifacts, context);\n  }\n\n\n  function wireFlowNodeRefs(lane) {\n\n    // wire the virtual flowNodeRefs <-> relationship\n    forEach(lane.flowNodeRef, function(flowNode) {\n      var lanes = flowNode.get('lanes');\n\n      if (lanes) {\n        lanes.push(lane);\n      }\n    });\n  }\n}\n"
  },
  {
    "path": "lib/import/Importer.js",
    "content": "import {\n  find,\n  forEach,\n  map\n} from 'min-dash';\n\nimport BpmnTreeWalker from './BpmnTreeWalker';\n\nimport { is } from '../util/ModelUtil';\n\n\n/**\n * @typedef {import('../model/Types').ModdleElement} ModdleElement\n *\n * @typedef { {\n *   warnings: string[];\n * } } ImportBPMNDiagramResult\n *\n * @typedef {ImportBPMNDiagramResult & Error} ImportBPMNDiagramError\n */\n\n/**\n * Import the definitions into a diagram.\n *\n * Errors and warnings are reported through the specified callback.\n *\n * @param {ModdleElement} diagram\n * @param {ModdleElement} definitions\n * @param {ModdleElement} [bpmnDiagram] The diagram to be rendered (if not\n * provided, the first one will be rendered).\n *\n * @return {Promise<ImportBPMNDiagramResult>}\n */\nexport function importBpmnDiagram(diagram, definitions, bpmnDiagram) {\n\n  var importer,\n      eventBus,\n      canvas;\n\n  var error,\n      warnings = [];\n\n  /**\n   * Walk the diagram semantically, importing (=drawing)\n   * all elements you encounter.\n   *\n   * @param {ModdleElement} definitions\n   * @param {ModdleElement} bpmnDiagram\n   */\n  function render(definitions, bpmnDiagram) {\n\n    var visitor = {\n\n      root: function(element, di) {\n        return importer.add(element, di);\n      },\n\n      element: function(element, di, parentShape) {\n        return importer.add(element, di, parentShape);\n      },\n\n      error: function(message, context) {\n        warnings.push({ message: message, context: context });\n      }\n    };\n\n    var walker = new BpmnTreeWalker(visitor);\n\n\n    bpmnDiagram = bpmnDiagram || (definitions.diagrams && definitions.diagrams[0]);\n\n    var diagramsToImport = getDiagramsToImport(definitions, bpmnDiagram);\n\n    if (!diagramsToImport) {\n      throw new Error('no diagram to display');\n    }\n\n    // traverse BPMN 2.0 document model,\n    // starting at definitions\n    forEach(diagramsToImport, function(diagram) {\n      walker.handleDefinitions(definitions, diagram);\n    });\n\n    var rootId = bpmnDiagram.plane.bpmnElement.id;\n\n    // we do need to account for different ways we create root elements\n    // each nested imported <root> do have the `_plane` suffix, while\n    // the root <root> is found under the business object ID\n    canvas.setRootElement(\n      canvas.findRoot(rootId + '_plane') || canvas.findRoot(rootId)\n    );\n  }\n\n  return new Promise(function(resolve, reject) {\n    try {\n      importer = diagram.get('bpmnImporter');\n      eventBus = diagram.get('eventBus');\n      canvas = diagram.get('canvas');\n\n      eventBus.fire('import.render.start', { definitions: definitions });\n\n      render(definitions, bpmnDiagram);\n\n      eventBus.fire('import.render.complete', {\n        error: error,\n        warnings: warnings\n      });\n\n      return resolve({ warnings: warnings });\n    } catch (e) {\n\n      e.warnings = warnings;\n      return reject(e);\n    }\n  });\n}\n\n/**\n * Returns all diagrams in the same hierarchy as the requested diagram.\n * Includes all parent and sub process diagrams.\n *\n * @param {ModdleElement} definitions\n * @param {ModdleElement} bpmnDiagram\n *\n * @return {ModdleElement[]}\n */\nfunction getDiagramsToImport(definitions, bpmnDiagram) {\n  if (!bpmnDiagram || !bpmnDiagram.plane) {\n    return;\n  }\n\n  var bpmnElement = bpmnDiagram.plane.bpmnElement,\n      rootElement = bpmnElement;\n\n  if (!is(bpmnElement, 'bpmn:Process') && !is(bpmnElement, 'bpmn:Collaboration')) {\n    rootElement = findRootProcess(bpmnElement);\n  }\n\n  // in case the process is part of a collaboration, the plane references the\n  // collaboration, not the process\n  var collaboration;\n\n  if (is(rootElement, 'bpmn:Collaboration')) {\n    collaboration = rootElement;\n  } else {\n    collaboration = find(definitions.rootElements, function(element) {\n      if (!is(element, 'bpmn:Collaboration')) {\n        return;\n      }\n\n      return find(element.participants, function(participant) {\n        return participant.processRef === rootElement;\n      });\n    });\n  }\n\n  var rootElements = [ rootElement ];\n\n  // all collaboration processes can contain sub-diagrams\n  if (collaboration) {\n    rootElements = map(collaboration.participants, function(participant) {\n      return participant.processRef;\n    });\n\n    rootElements.push(collaboration);\n  }\n\n  var allChildren = selfAndAllFlowElements(rootElements);\n\n  // if we have multiple diagrams referencing the same element, we\n  // use the first in the file\n  var diagramsToImport = [ bpmnDiagram ];\n  var handledElements = [ bpmnElement ];\n\n  forEach(definitions.diagrams, function(diagram) {\n\n    if (!diagram.plane) {\n      return;\n    }\n\n    var businessObject = diagram.plane.bpmnElement;\n\n    if (\n      allChildren.indexOf(businessObject) !== -1 &&\n      handledElements.indexOf(businessObject) === -1\n    ) {\n      diagramsToImport.push(diagram);\n      handledElements.push(businessObject);\n    }\n  });\n\n\n  return diagramsToImport;\n}\n\nfunction selfAndAllFlowElements(elements) {\n  var result = [];\n\n  forEach(elements, function(element) {\n    if (!element) {\n      return;\n    }\n\n    result.push(element);\n\n    result = result.concat(selfAndAllFlowElements(element.flowElements));\n  });\n\n  return result;\n}\n\nfunction findRootProcess(element) {\n  var parent = element;\n\n  while (parent) {\n    if (is(parent, 'bpmn:Process')) {\n      return parent;\n    }\n\n    parent = parent.$parent;\n  }\n}\n"
  },
  {
    "path": "lib/import/Util.js",
    "content": "export function elementToString(e) {\n  if (!e) {\n    return '<null>';\n  }\n\n  return '<' + e.$type + (e.id ? ' id=\"' + e.id : '') + '\" />';\n}"
  },
  {
    "path": "lib/import/index.js",
    "content": "import translate from 'diagram-js/lib/i18n/translate';\n\nimport BpmnImporter from './BpmnImporter';\n\nexport default {\n  __depends__: [\n    translate\n  ],\n  bpmnImporter: [ 'type', BpmnImporter ]\n};"
  },
  {
    "path": "lib/index.js",
    "content": "export {\n  default\n} from './Viewer';"
  },
  {
    "path": "lib/model/Types.ts",
    "content": "import type {\n  Connection as BaseConnection,\n  Element as BaseElement,\n  Label as BaseLabel,\n  Root as BaseRoot,\n  Shape as BaseShape\n} from \"diagram-js/lib/model\";\n\nexport type Moddle = any;\n\nexport type ModdleElement = any;\n\nexport type ModdleExtension = {};\n\nexport type BpmnAttributes = {\n  associationDirection: 'None' | 'One' | 'Both';\n  cancelActivity: boolean;\n  eventDefinitionType: string;\n  isExpanded: boolean;\n  isHorizontal: boolean;\n  isForCompensation: boolean;\n  isInterrupting: boolean;\n  processRef: ModdleElement;\n  triggeredByEvent: boolean;\n};\n\nexport type Element = {\n  businessObject: any;\n  di: any;\n  type: string;\n} & BaseElement;\n\nexport type Connection = BaseConnection & Element;\n\nexport type Label = BaseLabel & Element;\n\nexport type Root = BaseRoot & Element;\n\nexport type Shape = BaseShape & Element;\n\nexport type Parent = Root | Shape;"
  },
  {
    "path": "lib/util/AnnotationUtil.js",
    "content": "import { forEach } from 'min-dash';\nimport { selfAndChildren } from 'diagram-js/lib/util/Elements';\nimport { is } from './ModelUtil';\n\n/**\n * @typedef { import('../model/Types').Element } Element\n */\n\n/**\n * Get text annotations connected to the given element.\n *\n * @param {Element} element\n *\n * @return { { annotation: Element, association: Element }[] }\n */\nexport function getElementAnnotations(element) {\n  let result = [];\n\n  forEach(element.incoming, (connection) => {\n    if (is(connection, 'bpmn:Association') && is(connection.source, 'bpmn:TextAnnotation')) {\n      result.push({ annotation: connection.source, association: connection });\n    }\n  });\n\n  forEach(element.outgoing, (connection) => {\n    if (is(connection, 'bpmn:Association') && is(connection.target, 'bpmn:TextAnnotation')) {\n      result.push({ annotation: connection.target, association: connection });\n    }\n  });\n\n  return result;\n}\n\n/**\n * Recursively collect text annotations connected to the given elements and their descendants.\n * De-duplicates by annotation, collecting all associations per annotation.\n *\n * @param {Element[]} elements\n *\n * @return { { annotation: Element, associations: Element[] }[] }\n */\nexport function collectElementsAnnotations(elements) {\n  const result = new Map();\n\n  forEach(selfAndChildren(elements, true, -1), (element) => {\n    forEach(getElementAnnotations(element), (entry) => {\n      if (!result.has(entry.annotation)) {\n        result.set(entry.annotation, { annotation: entry.annotation, associations: [] });\n      }\n      result.get(entry.annotation).associations.push(entry.association);\n    });\n  });\n\n  return [ ...result.values() ];\n}\n"
  },
  {
    "path": "lib/util/CompatibilityUtil.js",
    "content": "import {\n  has\n} from 'min-dash';\n\n/**\n * @typedef {import('../model/Types').ModdleElement} ModdleElement\n */\n\n\n// TODO(nikku): remove with future bpmn-js version\n\nvar DI_ERROR_MESSAGE = 'Tried to access di from the businessObject. The di is available through the diagram element only. For more information, see https://github.com/bpmn-io/bpmn-js/issues/1472';\n\n/**\n * @private\n *\n * @param {ModdleElement} businessObject\n */\nexport function ensureCompatDiRef(businessObject) {\n\n  // bpmnElement can have multiple independent DIs\n  if (!has(businessObject, 'di')) {\n    Object.defineProperty(businessObject, 'di', {\n      enumerable: false,\n      get: function() {\n        throw new Error(DI_ERROR_MESSAGE);\n      }\n    });\n  }\n}"
  },
  {
    "path": "lib/util/DiUtil.js",
    "content": "import {\n  is,\n  getBusinessObject,\n  getDi\n} from './ModelUtil';\n\nimport {\n  some\n} from 'min-dash';\n\n/**\n * @typedef {import('../model/Types').Element} Element\n * @typedef {import('../model/Types').ModdleElement} ModdleElement\n */\n\n/**\n * @param {Element} element\n * @param {ModdleElement} [di]\n *\n * @return {boolean}\n */\nexport function isExpanded(element, di) {\n\n  if (is(element, 'bpmn:CallActivity')) {\n    return false;\n  }\n\n  if (is(element, 'bpmn:SubProcess')) {\n    di = di || getDi(element);\n\n    if (di && is(di, 'bpmndi:BPMNPlane')) {\n      return true;\n    }\n\n    return di && !!di.isExpanded;\n  }\n\n  if (is(element, 'bpmn:Participant')) {\n    return !!getBusinessObject(element).processRef;\n  }\n\n  return true;\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nexport function isHorizontal(element) {\n\n  if (!is(element, 'bpmn:Participant') && !is(element, 'bpmn:Lane')) {\n    return undefined;\n  }\n\n  var isHorizontal = getDi(element).isHorizontal;\n\n  if (isHorizontal === undefined) {\n    return true;\n  }\n\n  return isHorizontal;\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nexport function isInterrupting(element) {\n  return element && getBusinessObject(element).isInterrupting !== false;\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nexport function isEventSubProcess(element) {\n  return element && !!getBusinessObject(element).triggeredByEvent;\n}\n\n/**\n * @param {Element} element\n * @param {string} eventType\n *\n * @return {boolean}\n */\nexport function hasEventDefinition(element, eventType) {\n  var eventDefinitions = getBusinessObject(element).eventDefinitions;\n\n  return some(eventDefinitions, function(event) {\n    return is(event, eventType);\n  });\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nexport function hasErrorEventDefinition(element) {\n  return hasEventDefinition(element, 'bpmn:ErrorEventDefinition');\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nexport function hasEscalationEventDefinition(element) {\n  return hasEventDefinition(element, 'bpmn:EscalationEventDefinition');\n}\n\n/**\n * @param {Element} element\n *\n * @return {boolean}\n */\nexport function hasCompensateEventDefinition(element) {\n  return hasEventDefinition(element, 'bpmn:CompensateEventDefinition');\n}\n"
  },
  {
    "path": "lib/util/DrilldownUtil.js",
    "content": "import { getDi, is } from './ModelUtil';\n\n/**\n * @typedef {import('../model/Types').Element} Element\n * @typedef {import('../model/Types').ModdleElement} ModdleElement\n */\n\nexport var planeSuffix = '_plane';\n\n/**\n * Get primary shape ID for a plane.\n *\n * @param  {Element|ModdleElement} element\n *\n * @return {string}\n */\nexport function getShapeIdFromPlane(element) {\n  var id = element.id;\n\n  return removePlaneSuffix(id);\n}\n\n/**\n * Get plane ID for a primary shape.\n *\n * @param  {Element|ModdleElement} element\n *\n * @return {string}\n */\nexport function getPlaneIdFromShape(element) {\n  var id = element.id;\n\n  if (is(element, 'bpmn:SubProcess')) {\n    return addPlaneSuffix(id);\n  }\n\n  return id;\n}\n\n/**\n * Get plane ID for primary shape ID.\n *\n * @param {string} id\n *\n * @return {string}\n */\nexport function toPlaneId(id) {\n  return addPlaneSuffix(id);\n}\n\n/**\n * Check wether element is plane.\n *\n * @param  {Element|ModdleElement} element\n *\n * @return {boolean}\n */\nexport function isPlane(element) {\n  var di = getDi(element);\n\n  return is(di, 'bpmndi:BPMNPlane');\n}\n\nfunction addPlaneSuffix(id) {\n  return id + planeSuffix;\n}\n\nfunction removePlaneSuffix(id) {\n  return id.replace(new RegExp(planeSuffix + '$'), '');\n}"
  },
  {
    "path": "lib/util/LabelUtil.js",
    "content": "import {\n  assign\n} from 'min-dash';\n\nimport { is } from './ModelUtil';\n\nimport { isLabel } from 'diagram-js/lib/util/ModelUtil';\n\nexport { isLabel } from 'diagram-js/lib/util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/util/Types').Point} Point\n * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n *\n * @typedef {import('../model/Types').Element} Element\n * @typedef {import('../model/Types').ModdleElement} ModdleElement\n */\n\nexport var DEFAULT_LABEL_SIZE = {\n  width: 90,\n  height: 20\n};\n\nexport var FLOW_LABEL_INDENT = 15;\n\n\n/**\n * Return true if the given semantic has an external label.\n *\n * @param {Element} semantic\n *\n * @return {boolean}\n */\nexport function isLabelExternal(semantic) {\n  return is(semantic, 'bpmn:Event') ||\n         is(semantic, 'bpmn:Gateway') ||\n         is(semantic, 'bpmn:DataStoreReference') ||\n         is(semantic, 'bpmn:DataObjectReference') ||\n         is(semantic, 'bpmn:DataInput') ||\n         is(semantic, 'bpmn:DataOutput') ||\n         is(semantic, 'bpmn:SequenceFlow') ||\n         is(semantic, 'bpmn:MessageFlow') ||\n         is(semantic, 'bpmn:Group');\n}\n\n/**\n * Return true if the given element has an external label.\n *\n * @param {Element} element\n *\n * @return {boolean}\n */\nexport function hasExternalLabel(element) {\n  return isLabel(element.label);\n}\n\n/**\n * Get the position of a sequence flow label.\n *\n * @param  {Point[]} waypoints\n *\n * @return {Point}\n */\nexport function getFlowLabelPosition(waypoints) {\n\n  // get the waypoints mid\n  var mid = waypoints.length / 2 - 1;\n\n  var first = waypoints[Math.floor(mid)];\n  var second = waypoints[Math.ceil(mid + 0.01)];\n\n  // get position\n  var position = getWaypointsMid(waypoints);\n\n  // calculate angle\n  var angle = Math.atan((second.y - first.y) / (second.x - first.x));\n\n  var x = position.x,\n      y = position.y;\n\n  if (Math.abs(angle) < Math.PI / 2) {\n    y -= FLOW_LABEL_INDENT;\n  } else {\n    x += FLOW_LABEL_INDENT;\n  }\n\n  return { x: x, y: y };\n}\n\n\n/**\n * Get the middle of a number of waypoints.\n *\n * @param  {Point[]} waypoints\n *\n * @return {Point}\n */\nexport function getWaypointsMid(waypoints) {\n\n  var mid = waypoints.length / 2 - 1;\n\n  var first = waypoints[Math.floor(mid)];\n  var second = waypoints[Math.ceil(mid + 0.01)];\n\n  return {\n    x: first.x + (second.x - first.x) / 2,\n    y: first.y + (second.y - first.y) / 2\n  };\n}\n\n/**\n * Get the middle of the external label of an element.\n *\n * @param {Element} element\n *\n * @return {Point}\n */\nexport function getExternalLabelMid(element) {\n\n  if (element.waypoints) {\n    return getFlowLabelPosition(element.waypoints);\n  } else if (is(element, 'bpmn:Group')) {\n    return {\n      x: element.x + element.width / 2,\n      y: element.y + DEFAULT_LABEL_SIZE.height / 2\n    };\n  } else {\n    return {\n      x: element.x + element.width / 2,\n      y: element.y + element.height + DEFAULT_LABEL_SIZE.height / 2\n    };\n  }\n}\n\n\n/**\n * Return the bounds of an elements label, parsed from the elements DI or\n * generated from its bounds.\n *\n * @param {ModdleElement} di\n * @param {Element} element\n *\n * @return {Rect}\n */\nexport function getExternalLabelBounds(di, element) {\n\n  var mid,\n      size,\n      bounds,\n      label = di.label;\n\n  if (label && label.bounds) {\n    bounds = label.bounds;\n\n    size = {\n      width: Math.max(DEFAULT_LABEL_SIZE.width, bounds.width),\n      height: bounds.height\n    };\n\n    mid = {\n      x: bounds.x + bounds.width / 2,\n      y: bounds.y + bounds.height / 2\n    };\n  } else {\n\n    mid = getExternalLabelMid(element);\n\n    size = DEFAULT_LABEL_SIZE;\n  }\n\n  return assign({\n    x: mid.x - size.width / 2,\n    y: mid.y - size.height / 2\n  }, size);\n}\n\n/**\n * @param {ModdleElement} semantic\n *\n * @returns {string}\n */\nfunction getLabelAttr(semantic) {\n  if (\n    is(semantic, 'bpmn:FlowElement') ||\n    is(semantic, 'bpmn:Participant') ||\n    is(semantic, 'bpmn:Lane') ||\n    is(semantic, 'bpmn:SequenceFlow') ||\n    is(semantic, 'bpmn:MessageFlow') ||\n    is(semantic, 'bpmn:DataInput') ||\n    is(semantic, 'bpmn:DataOutput')\n  ) {\n    return 'name';\n  }\n\n  if (is(semantic, 'bpmn:TextAnnotation')) {\n    return 'text';\n  }\n\n  if (is(semantic, 'bpmn:Group')) {\n    return 'categoryValueRef';\n  }\n}\n\n/**\n * @param {ModdleElement} semantic\n *\n * @returns {string}\n */\nfunction getCategoryValue(semantic) {\n  var categoryValueRef = semantic['categoryValueRef'];\n\n  if (!categoryValueRef) {\n    return '';\n  }\n\n\n  return categoryValueRef.value || '';\n}\n\n/**\n * @param {Element} element\n *\n * @return {string}\n */\nexport function getLabel(element) {\n  var semantic = element.businessObject,\n      attr = getLabelAttr(semantic);\n\n  if (attr) {\n\n    if (attr === 'categoryValueRef') {\n\n      return getCategoryValue(semantic);\n    }\n\n    return semantic[attr] || '';\n  }\n}\n\n\n/**\n * @param {Element} element\n * @param {string} text\n *\n * @return {Element}\n */\nexport function setLabel(element, text) {\n  var semantic = element.businessObject,\n      attr = getLabelAttr(semantic);\n\n  if (attr) {\n\n    if (attr === 'categoryValueRef') {\n      if (!semantic[attr]) {\n        return element;\n      }\n\n      semantic[attr].value = text;\n    } else {\n      semantic[attr] = text;\n    }\n\n  }\n\n  return element;\n}\n\n/**\n * Returns true if the given element is an external label.\n *\n * @param {Element} element\n *\n * @return {boolean}\n */\nexport function isExternalLabel(element) {\n  return isLabel(element) && isLabelExternal(element.labelTarget);\n}"
  },
  {
    "path": "lib/util/ModelUtil.js",
    "content": "import {\n  some\n} from 'min-dash';\n\n/**\n * @typedef { import('../model/Types').Element } Element\n * @typedef { import('../model/Types').ModdleElement } ModdleElement\n */\n\n/**\n * Is an element of the given BPMN type?\n *\n * @param  {Element|ModdleElement} element\n * @param  {string} type\n *\n * @return {boolean}\n */\nexport function is(element, type) {\n  var bo = getBusinessObject(element);\n\n  return bo && (typeof bo.$instanceOf === 'function') && bo.$instanceOf(type);\n}\n\n\n/**\n * Return true if element has any of the given types.\n *\n * @param {Element|ModdleElement} element\n * @param {string[]} types\n *\n * @return {boolean}\n */\nexport function isAny(element, types) {\n  return some(types, function(t) {\n    return is(element, t);\n  });\n}\n\n/**\n * Return the business object for a given element.\n *\n * @param {Element|ModdleElement} element\n *\n * @return {ModdleElement}\n */\nexport function getBusinessObject(element) {\n  return (element && element.businessObject) || element;\n}\n\n/**\n * Return the di object for a given element.\n *\n * @param {Element} element\n *\n * @return {ModdleElement}\n */\nexport function getDi(element) {\n  return element && element.di;\n}"
  },
  {
    "path": "lib/util/PoweredByUtil.js",
    "content": "/**\n * This file must not be changed or exchanged.\n *\n * @see http://bpmn.io/license for more information.\n */\n\nimport {\n  assignStyle,\n  domify,\n  delegate as domDelegate,\n  query as domQuery\n} from 'min-dom';\n\n\n// inlined ../../resources/logo.svg\nvar BPMNIO_LOGO_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 14.02 5.57\" width=\"53\" height=\"21\"><path fill=\"currentColor\" d=\"M1.88.92v.14c0 .41-.13.68-.4.8.33.14.46.44.46.86v.33c0 .61-.33.95-.95.95H0V0h.95c.65 0 .93.3.93.92zM.63.57v1.06h.24c.24 0 .38-.1.38-.43V.98c0-.28-.1-.4-.32-.4zm0 1.63v1.22h.36c.2 0 .32-.1.32-.39v-.35c0-.37-.12-.48-.4-.48H.63zM4.18.99v.52c0 .64-.31.98-.94.98h-.3V4h-.62V0h.92c.63 0 .94.35.94.99zM2.94.57v1.35h.3c.2 0 .3-.09.3-.37v-.6c0-.29-.1-.38-.3-.38h-.3zm2.89 2.27L6.25 0h.88v4h-.6V1.12L6.1 3.99h-.6l-.46-2.82v2.82h-.55V0h.87zM8.14 1.1V4h-.56V0h.79L9 2.4V0h.56v4h-.64zm2.49 2.29v.6h-.6v-.6zM12.12 1c0-.63.33-1 .95-1 .61 0 .95.37.95 1v2.04c0 .64-.34 1-.95 1-.62 0-.95-.37-.95-1zm.62 2.08c0 .28.13.39.33.39s.32-.1.32-.4V.98c0-.29-.12-.4-.32-.4s-.33.11-.33.4z\"/><path fill=\"currentColor\" d=\"M0 4.53h14.02v1.04H0zM11.08 0h.63v.62h-.63zm.63 4V1h-.63v2.98z\"/></svg>';\n\nexport var BPMNIO_IMG = BPMNIO_LOGO_SVG;\n\nexport var LOGO_STYLES = {\n  verticalAlign: 'middle'\n};\n\nexport var LINK_STYLES = {\n  'color': '#404040'\n};\n\nvar LIGHTBOX_STYLES = {\n  'zIndex': '1001',\n  'position': 'fixed',\n  'top': '0',\n  'left': '0',\n  'right': '0',\n  'bottom': '0'\n};\n\nvar BACKDROP_STYLES = {\n  'width': '100%',\n  'height': '100%',\n  'background': 'rgba(40,40,40,0.2)'\n};\n\nvar NOTICE_STYLES = {\n  'position': 'absolute',\n  'left': '50%',\n  'top': '40%',\n  'transform': 'translate(-50%)',\n  'width': '260px',\n  'padding': '10px',\n  'background': 'white',\n  'boxShadow': '0 1px 4px rgba(0,0,0,0.3)',\n  'fontFamily': 'Helvetica, Arial, sans-serif',\n  'fontSize': '14px',\n  'display': 'flex',\n  'lineHeight': '1.3'\n};\n\nvar LIGHTBOX_MARKUP =\n  '<div class=\"bjs-powered-by-lightbox\">' +\n    '<div class=\"backdrop\"></div>' +\n    '<div class=\"notice\">' +\n      '<a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\" class=\"link\">' +\n        BPMNIO_IMG +\n      '</a>' +\n      '<span>' +\n        'Web-based tooling for BPMN, DMN and forms ' +\n        'powered by <a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\">bpmn.io</a>.' +\n      '</span>' +\n    '</div>' +\n  '</div>';\n\n\nvar lightbox;\n\nfunction createLightbox() {\n  lightbox = domify(LIGHTBOX_MARKUP);\n\n  assignStyle(lightbox, LIGHTBOX_STYLES);\n  assignStyle(domQuery('svg', lightbox), LOGO_STYLES);\n  assignStyle(domQuery('.backdrop', lightbox), BACKDROP_STYLES);\n  assignStyle(domQuery('.notice', lightbox), NOTICE_STYLES);\n  assignStyle(domQuery('.link', lightbox), LINK_STYLES, {\n    'margin': '15px 20px 15px 10px',\n    'alignSelf': 'center'\n  });\n}\n\nexport function open() {\n\n  if (!lightbox) {\n    createLightbox();\n\n    domDelegate.bind(lightbox, '.backdrop', 'click', function(event) {\n      document.body.removeChild(lightbox);\n    });\n  }\n\n  document.body.appendChild(lightbox);\n}\n"
  },
  {
    "path": "lib/util/Types.js",
    "content": "/**\n * @typedef {Object} Colors\n * @property {string} [fill]\n * @property {string} [stroke]\n */"
  },
  {
    "path": "lib/util/Types.ts",
    "content": "export type Colors = {\n  fill?: string;\n  stroke?: string;\n};"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"bpmn-js\",\n  \"version\": \"18.13.1\",\n  \"description\": \"A bpmn 2.0 toolkit and web modeler\",\n  \"main\": \"lib/index.js\",\n  \"files\": [\n    \"dist\",\n    \"lib\",\n    \"test/util\",\n    \"test/helper\",\n    \"test/matchers\",\n    \"!.eslintrc\",\n    \"!lib/**/*.spec.ts\"\n  ],\n  \"scripts\": {\n    \"all\": \"run-s lint test generate-types distro test:distro\",\n    \"lint\": \"eslint .\",\n    \"format\": \"run-s format:markdown 'lint -- --fix'\",\n    \"format:markdown\": \"remark . -qo\",\n    \"start\": \"cross-env SINGLE_START=modeler npm run dev\",\n    \"start:viewer\": \"cross-env SINGLE_START=viewer npm run dev\",\n    \"start:navigated-viewer\": \"cross-env SINGLE_START=navigated-viewer npm run dev\",\n    \"dev\": \"npm test -- --auto-watch --no-single-run\",\n    \"test\": \"karma start test/config/karma.unit.js\",\n    \"distro\": \"node tasks/build-distro.mjs\",\n    \"collect-translations\": \"cross-env COLLECT_TRANSLATIONS=1 npm test\",\n    \"generate-types\": \"run-s generate-types:*\",\n    \"generate-types:generate\": \"del-cli \\\"lib/**/*.d.ts\\\" && npx bio-dts -r lib\",\n    \"generate-types:test\": \"tsc --noEmit --noImplicitAny\",\n    \"test:distro\": \"node tasks/test-distro.mjs\",\n    \"postversion\": \"run-s distro test:distro\",\n    \"prepare\": \"run-s distro\",\n    \"prepublishOnly\": \"run-s generate-types\"\n  },\n  \"engines\": {\n    \"node\": \"*\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/bpmn-io/bpmn-js\"\n  },\n  \"keywords\": [\n    \"bpmn\",\n    \"bpmn-js\",\n    \"toolkit\",\n    \"web modeler\",\n    \"modeler\",\n    \"modeling\",\n    \"process modeling\"\n  ],\n  \"author\": {\n    \"name\": \"Nico Rehwaldt\",\n    \"url\": \"https://github.com/nikku\"\n  },\n  \"contributors\": [\n    {\n      \"name\": \"bpmn.io contributors\",\n      \"url\": \"https://github.com/bpmn-io\"\n    }\n  ],\n  \"license\": \"SEE LICENSE IN LICENSE\",\n  \"sideEffects\": [\n    \"*.css\"\n  ],\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.28.5\",\n    \"@bpmn-io/a11y\": \"^0.1.0\",\n    \"@rollup/plugin-commonjs\": \"^29.0.0\",\n    \"@rollup/plugin-json\": \"^6.1.0\",\n    \"@rollup/plugin-node-resolve\": \"^16.0.3\",\n    \"@rollup/plugin-replace\": \"^6.0.3\",\n    \"@rollup/plugin-terser\": \"^1.0.0\",\n    \"babel-loader\": \"^10.0.0\",\n    \"babel-plugin-istanbul\": \"^7.0.1\",\n    \"bio-dts\": \"^0.11.0\",\n    \"bpmn-font\": \"^0.12.1\",\n    \"camunda-bpmn-moddle\": \"^4.0.1\",\n    \"chai\": \"4.1.2\",\n    \"chai-match\": \"^1.1.1\",\n    \"cpy\": \"^13.0.0\",\n    \"cross-env\": \"^10.0.0\",\n    \"del\": \"^8.0.0\",\n    \"del-cli\": \"^7.0.0\",\n    \"eslint\": \"^9.39.2\",\n    \"eslint-plugin-bpmn-io\": \"^2.2.0\",\n    \"execa\": \"^9.0.0\",\n    \"file-drops\": \"^0.7.0\",\n    \"karma\": \"^6.4.4\",\n    \"karma-chrome-launcher-2\": \"^3.3.0\",\n    \"karma-coverage\": \"^2.2.0\",\n    \"karma-debug-launcher\": \"^0.0.5\",\n    \"karma-env-preprocessor\": \"^0.1.1\",\n    \"karma-firefox-launcher\": \"^2.1.3\",\n    \"karma-mocha\": \"^2.0.1\",\n    \"karma-safari-launcher\": \"^1.0.0\",\n    \"karma-sinon-chai\": \"^2.0.2\",\n    \"karma-webpack\": \"^5.0.1\",\n    \"mocha\": \"^10.8.2\",\n    \"mocha-test-container-support\": \"0.2.0\",\n    \"npm-run-all2\": \"^8.0.4\",\n    \"puppeteer\": \"~24.36.0\",\n    \"remark-cli\": \"^12.0.1\",\n    \"remark-preset-bpmn-io\": \"^0.4.0\",\n    \"rollup\": \"^4.55.1\",\n    \"rollup-plugin-license\": \"^3.6.0\",\n    \"sinon\": \"^17.0.1\",\n    \"sinon-chai\": \"^3.7.0\",\n    \"ts-expect\": \"^1.3.0\",\n    \"typescript\": \"^5.9.3\",\n    \"webpack\": \"^5.104.1\"\n  },\n  \"dependencies\": {\n    \"bpmn-moddle\": \"^10.0.0\",\n    \"diagram-js\": \"^15.10.0\",\n    \"diagram-js-direct-editing\": \"^3.3.0\",\n    \"ids\": \"^3.0.0\",\n    \"inherits-browser\": \"^0.1.0\",\n    \"min-dash\": \"^5.0.0\",\n    \"min-dom\": \"^5.2.0\",\n    \"tiny-svg\": \"^4.1.4\"\n  },\n  \"remarkConfig\": {\n    \"plugins\": [\n      \"preset-bpmn-io\",\n      [\n        \"lint-no-html\",\n        false\n      ]\n    ]\n  }\n}\n"
  },
  {
    "path": "renovate.json",
    "content": "{\n  \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n  \"extends\": [\n    \"github>bpmn-io/renovate-config:recommended\"\n  ]\n}\n"
  },
  {
    "path": "resources/banner-min.txt",
    "content": "/*! bpmn-js - {{ name }} v{{ version }} | Copyright (c) 2014-present, camunda Services GmbH | bpmn.io/license */"
  },
  {
    "path": "resources/banner.txt",
    "content": "/*!\n * bpmn-js - {{ name }} v{{ version }}\n *\n * Copyright (c) 2014-present, camunda Services GmbH\n *\n * Released under the bpmn.io license\n * http://bpmn.io/license\n *\n * Source Code: https://github.com/bpmn-io/bpmn-js\n *\n * Date: {{ date }}\n */"
  },
  {
    "path": "resources/initial.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" targetNamespace=\"http://bpmn.io/schema/bpmn\" id=\"Definitions_1\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\"/>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"173.0\" y=\"102.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>"
  },
  {
    "path": "rollup.config.js",
    "content": "import terser from '@rollup/plugin-terser';\nimport nodeResolve from '@rollup/plugin-node-resolve';\nimport commonjs from '@rollup/plugin-commonjs';\nimport json from '@rollup/plugin-json';\nimport replace from '@rollup/plugin-replace';\nimport license from 'rollup-plugin-license';\n\nimport {\n  readFileSync\n} from 'fs';\n\nimport pkg from './package.json';\n\nconst outputDir = 'dist';\n\nconst distros = [\n  {\n    input: 'Viewer',\n    output: 'bpmn-viewer'\n  },\n  {\n    input: 'NavigatedViewer',\n    output: 'bpmn-navigated-viewer'\n  },\n  {\n    input: 'Modeler',\n    output: 'bpmn-modeler'\n  }\n];\n\nconst configs = distros.reduce(function(configs, distro) {\n  const {\n    input,\n    output\n  } = distro;\n\n  return [\n    ...configs,\n    {\n      input: `./lib/${input}.js`,\n      output: {\n        name: 'BpmnJS',\n        file: `${outputDir}/${output}.development.js`,\n        format: 'umd'\n      },\n      plugins: pgl([\n        banner(output)\n      ], 'development')\n    },\n    {\n      input: `./lib/${input}.js`,\n      output: {\n        name: 'BpmnJS',\n        file: `${outputDir}/${output}.production.min.js`,\n        format: 'umd'\n      },\n      plugins: pgl([\n        banner(output, true),\n        terser({\n          output: {\n            comments: /license|@preserve/\n          }\n        })\n      ], 'production')\n    }\n  ];\n}, []);\n\nexport default configs;\n\n\n// helpers //////////////////////\n\nfunction banner(bundleName, minified) {\n\n  const bannerName = (\n    minified\n      ? 'banner-min'\n      : 'banner'\n  );\n\n  const bannerTemplate = readFileSync(`${__dirname}/resources/${bannerName}.txt`, 'utf8');\n\n  const banner = processTemplate(bannerTemplate, {\n    version: pkg.version,\n    date: today(),\n    name: bundleName\n  });\n\n  return license({\n    banner\n  });\n}\n\nfunction pgl(plugins = [], env = 'production') {\n  return [\n    replace({\n      preventAssignment: true,\n      'process.env.NODE_ENV': JSON.stringify(env)\n    }),\n    nodeResolve(),\n    commonjs(),\n    json(),\n    ...plugins\n  ];\n}\n\nfunction pad(n) {\n  if (n < 10) {\n    return '0' + n;\n  } else {\n    return n;\n  }\n}\n\nfunction today() {\n  const d = new Date();\n\n  return [\n    d.getFullYear(),\n    pad(d.getMonth() + 1),\n    pad(d.getDate())\n  ].join('-');\n}\n\nfunction processTemplate(str, args) {\n  return str.replace(/\\{\\{\\s*([^\\s]+)\\s*\\}\\}/g, function(_, n) {\n\n    var replacement = args[n];\n\n    if (!replacement) {\n      throw new Error(`unknown template {{ ${ n } }}`);\n    }\n\n    return replacement;\n  });\n}"
  },
  {
    "path": "tasks/build-distro.mjs",
    "content": "import path from 'node:path';\nimport fs from 'node:fs';\n\nimport cp from 'cpy';\nimport { deleteAsync as del } from 'del';\n\nimport { execa as exec } from 'execa';\n\nimport { createRequire } from 'node:module';\n\nvar dest = process.env.DISTRO_DIST || 'dist';\n\nfunction resolve(module, sub) {\n  var require = createRequire(import.meta.url);\n  var pkg = require.resolve(module + '/package.json');\n\n  return path.dirname(pkg) + sub;\n}\n\nasync function run() {\n\n  console.log('clean ' + dest);\n  await del(dest);\n\n  console.log('mkdir -p ' + dest);\n  fs.mkdirSync(dest, { recursive: true });\n\n  console.log('copy bpmn-font to ' + dest + '/bpmn-font');\n  await cp(resolve('bpmn-font', '/dist/css/**'), dest + '/assets/bpmn-font/css');\n  await cp(resolve('bpmn-font', '/dist/font/**'), dest + '/assets/bpmn-font/font');\n\n  console.log('copy diagram-js.css to ' + dest);\n  await cp(resolve('diagram-js', '/assets/**'), dest + '/assets');\n\n  console.log('copy bpmn-js.css to ' + dest);\n  await cp('./assets/*.css', dest + '/assets');\n\n  console.log('building pre-packaged distributions');\n\n  await exec('rollup', [ '-c', '--bundleConfigAsCjs' ], {\n    stdio: 'inherit'\n  });\n\n  console.log('done.');\n}\n\nrun().catch(e => {\n  console.error('failed to build distribution', e);\n\n  process.exit(1);\n});"
  },
  {
    "path": "tasks/stages/await-published",
    "content": "#!/bin/bash\n\nset -eo pipefail\nshopt -s inherit_errexit nullglob\n\ni=0\ntries=9\npkg=\"$PKG\"\nuntil [ $i -gt $tries ]\ndo\n  echo \"Checking for $pkg in npm registry ($((i+1))/$((tries+1)))\"\n  info=$(npm info $pkg 2> /dev/null || echo \"FAILED\")\n  if [[ \"$info\" != \"FAILED\" ]]; then\n    echo \"Found.\"\n    exit 0\n  fi\n\n  i=$(($i+1))\n\n  sleep 5s\ndone\n\necho \"Not found after $i tries. Giving up.\"\nexit 1;"
  },
  {
    "path": "tasks/stages/update-demo",
    "content": "#!/bin/bash\n\nset -eo pipefail\nshopt -s inherit_errexit nullglob\n\n# bumps bpmn-js and diagram-js dependencies in bpmn-io-demo\n\nPWD=\"$(pwd)\"\nWORKDIR=\"$(pwd)/tmp\"\nCLONE_DIR=\"$WORKDIR/bpmn-io-demo\"\n\n# create work dir\nmkdir -p \"$WORKDIR\"\n\ngit clone --depth=1 \"https://$BPMN_IO_TOKEN@github.com/$BPMN_IO_DEMO_ENDPOINT.git\" \"$CLONE_DIR\"\n\ncd \"$CLONE_DIR\"\n\nnpm install --save bpmn-js@latest diagram-js@latest\n\nif [[ \"x$SKIP_COMMIT\" = \"x\" ]]; then\n\n  git config user.email \"$BPMN_IO_EMAIL\"\n  git config user.name \"$BPMN_IO_USERNAME\"\n  git config push.default simple\n\n  git add -A\n  git commit -m \"deps: bump to bpmn-js@$TAG\"\n  git tag \"bpmn-js-$TAG\"\n  git push -q &2>/dev/null\n  git push --tags -q &2>/dev/null\nelse\n  echo \"Skipping commit (SKIP_COMMIT=$SKIP_COMMIT)\"\nfi\n\ncd \"$PWD\""
  },
  {
    "path": "tasks/stages/update-examples",
    "content": "#!/bin/bash\n\nset -eo pipefail\nshopt -s inherit_errexit nullglob\n\n# update bpmn-js version in the <bpmn-js-examples> project\n\nPWD=\"$(pwd)\"\nWORKDIR=\"$(pwd)/tmp\"\nEXAMPLES_DIR=\"$WORKDIR/bpmn-js-examples\"\n\n# create work dir\nmkdir -p \"$WORKDIR\"\n\ngit clone --depth=1 \"https://$BPMN_IO_TOKEN@github.com/bpmn-io/bpmn-js-examples.git\" \"$EXAMPLES_DIR\"\n\ncd \"$EXAMPLES_DIR\"\n\nTOOLKIT_VERSION=\"${TAG:1}\"\necho \"Updating toolkit version to $TOOLKIT_VERSION\"\n\nsed -i -E \"s#(\\\"bpmn-js\\\": )\\\"[^\\\"]+\\\"#\\1\\\"^$TOOLKIT_VERSION\\\"#\" **/package.json\nsed -i -E \"s#/bpmn-js@[^/]+/#/bpmn-js@$TOOLKIT_VERSION/#\" **/*.{html,md}\n\n# install dependencies (fixes up lock file)\nnpm install\n\nif [[ \"x$SKIP_COMMIT\" = \"x\" ]]; then\n\n  git config user.email \"$BPMN_IO_EMAIL\"\n  git config user.name \"$BPMN_IO_USERNAME\"\n  git config push.default simple\n\n  # add all resources\n  git add -A\n  git commit -m \"deps: bump bpmn-js to $TAG\"\n  git tag \"$TAG\"\n  git push -q &2>/dev/null\n  git push --tags -q &2>/dev/null\nelse\n  echo \"Skipping commit (SKIP_COMMIT=$SKIP_COMMIT)\"\nfi\n\ncd \"$PWD\""
  },
  {
    "path": "tasks/stages/update-integration-test",
    "content": "#!/bin/bash\n\nset -eo pipefail\nshopt -s inherit_errexit nullglob\n\n# bumps bpmn-js and diagram-js dependencies in bpmn-js-integration\n\nPWD=\"$(pwd)\"\nWORKDIR=\"$(pwd)/tmp\"\nIT_DIR=\"$WORKDIR/bpmn-js-integration\"\n\n# create work dir\nmkdir -p \"$WORKDIR\"\n\ngit clone --depth=1 \"https://$BPMN_IO_TOKEN@github.com/bpmn-io/bpmn-js-integration.git\" \"$IT_DIR\"\n\ncd \"$IT_DIR\"\n\nnpm install --save bpmn-js@latest bpmn-moddle@latest\n\ngit config user.email \"$BPMN_IO_EMAIL\"\ngit config user.name \"$BPMN_IO_USERNAME\"\ngit config push.default simple\n\ngit add -A\ngit commit -m \"deps: bump bpmn-js to $TAG\"\ngit tag \"$TAG\"\ngit push -q &2>/dev/null\ngit push --tags -q &2>/dev/null\n\ncd \"$PWD\""
  },
  {
    "path": "tasks/stages/update-translations",
    "content": "#!/bin/bash\n\nset -eo pipefail\nshopt -s inherit_errexit nullglob\n\n# updates translations and creates pull request\n\nnpm ci\nnpm run collect-translations\n\n# exit if no changes\nif [[ \"x$(git status --porcelain docs/translations.json)\" = \"x\" ]]; then echo \"No changes; exiting\" && exit 0; fi\n\nif [[ \"x$SKIP_COMMIT\" = \"x\" ]]; then\n\n  git config user.email \"$BPMN_IO_EMAIL\"\n  git config user.name \"$BPMN_IO_USERNAME\"\n  git config push.default simple\n  BRANCH=\"update-translations-$(date +%Y%m%d%H%M%S)\"\n  git switch -c $BRANCH\n\n  git add docs/translations.json\n  git commit -m \"docs: update translations for $TAG\"\n  git push -q --set-upstream origin $BRANCH\n  gh pr create --title \"docs: update translations for $TAG\" \\\n               --body \"This PR updates translations for $TAG\" \\\n               --reviewer \"$REVIEWERS\"\nelse\n  echo \"Skipping commit (SKIP_COMMIT=$SKIP_COMMIT)\"\nfi\n"
  },
  {
    "path": "tasks/stages/update-website",
    "content": "#!/bin/bash\n\nset -eo pipefail\nshopt -s inherit_errexit nullglob\n\n# update bpmn-js version in the <bpmn.io> project\n\nPWD=\"$(pwd)\"\nWORKDIR=\"$(pwd)/tmp\"\nCLONE_DIR=\"$WORKDIR/bpmn.io\"\n\n# create work dir\nmkdir -p \"$WORKDIR\"\n\ngit clone --depth=1 \"https://$BPMN_IO_TOKEN@github.com/bpmn-io/bpmn.io.git\" \"$CLONE_DIR\"\n\ncd \"$CLONE_DIR\"\n\nPUBLISHED=`date +\"%F %H:%M\"`\n\necho \"Updating toolkit version to version=$TAG, published=$PUBLISHED on bpmn.io\"\n\ncat src/data/site.yml | \\\n  tr \"\\r?\\n\" \"\\r\" | \\\n  sed -e \"s#bpmnjs:\\r  version: [^\\r]*\\r  published: [^\\r]*\\r#bpmnjs:\\r  version: $TAG\\r  published: $PUBLISHED\\r#\" | \\\n  tr \"\\r\" \"\\n\" > src/data/site.yml_new\n\nmv -f src/data/site.yml_new src/data/site.yml\n\nif [[ \"x$SKIP_COMMIT\" = \"x\" ]]; then\n\n  git config user.email \"$BPMN_IO_EMAIL\"\n  git config user.name \"$BPMN_IO_USERNAME\"\n  git config push.default simple\n\n  # add all resources\n  git add -A\n  git commit -m \"deps: bump bpmn-js to $TAG\"\n  git push -q &2>/dev/null\nelse\n  echo \"Skipping commit (SKIP_COMMIT=$SKIP_COMMIT)\"\nfi\n\ncd \"$PWD\""
  },
  {
    "path": "tasks/test-distro.mjs",
    "content": "import { execaSync as exec } from 'execa';\n\nimport assert from 'node:assert';\nimport fs from 'node:fs';\n\nvar failures = 0;\n\nfunction runTest(variant, env) {\n\n  var NODE_ENV = process.env.NODE_ENV;\n\n  process.env.VARIANT = variant;\n  process.env.NODE_ENV = env;\n\n  console.log('[TEST] ' + variant + '@' + env);\n  console.log(`[EXEC] VARIANT=${variant} NODE_ENV=${env} karma start test/config/karma.distro.js`);\n\n  try {\n    exec('karma', [ 'start', 'test/config/karma.distro.js' ], {\n      stdio: 'inherit'\n    });\n  } catch (e) {\n    console.error('[TEST] FAILURE ' + variant + '@' + env);\n    console.error(e);\n\n    failures++;\n  } finally {\n    process.env.NODE_ENV = NODE_ENV;\n  }\n}\n\nfunction verifyAssets() {\n\n  const assets = [\n    'bpmn-font/css/bpmn-embedded.css',\n    'bpmn-font/font/bpmn.woff',\n    'bpmn-js.css',\n    'diagram-js.css'\n  ];\n\n  for (const asset of assets) {\n    try {\n      assert.ok(fs.existsSync('dist/assets/' + asset), `${asset} missing`);\n    } catch (e) {\n      console.error('[TEST] ASSET ' + asset);\n      console.error(e);\n\n      failures++;\n    }\n  }\n}\n\nfunction test() {\n\n  runTest('bpmn-modeler', 'development');\n  runTest('bpmn-modeler', 'production');\n\n  runTest('bpmn-navigated-viewer', 'development');\n  runTest('bpmn-navigated-viewer', 'production');\n\n  runTest('bpmn-viewer', 'development');\n  runTest('bpmn-viewer', 'production');\n\n  verifyAssets();\n\n  if (failures) {\n    process.exit(1);\n  }\n}\n\n\ntest();"
  },
  {
    "path": "test/TestHelper.js",
    "content": "export * from './helper';\n\nimport fileDrop from 'file-drops';\n\nimport {\n  insertCSS,\n  getBpmnJS\n} from './helper';\n\ninsertCSS('diagram-js.css', require('diagram-js/assets/diagram-js.css'));\n\ninsertCSS('bpmn-js.css', require('../assets/bpmn-js.css'));\n\ninsertCSS('bpmn-embedded.css', require('bpmn-font/dist/css/bpmn-embedded.css'));\n\ninsertCSS('diagram-js-testing.css',\n  'body .test-container { height: auto }' +\n  'body .test-content-container { height: 90vh; }'\n);\n\n\nimport ChaiMatch from 'chai-match';\nimport BoundsMatchers from './matchers/BoundsMatchers';\nimport ConnectionMatchers from './matchers/ConnectionMatchers';\nimport JSONMatcher from './matchers/JSONMatcher';\n\n/* global chai */\n\n// add suite specific matchers\nchai.use(ChaiMatch);\nchai.use(BoundsMatchers);\nchai.use(ConnectionMatchers);\nchai.use(JSONMatcher);\n\n// be able to load files into running bpmn-js test cases\ndocument.documentElement.addEventListener('dragover', fileDrop('Drop a BPMN diagram to open it in the currently active test.', function(files) {\n  const bpmnJS = getBpmnJS();\n\n  if (bpmnJS && files.length === 1) {\n    bpmnJS.importXML(files[0].contents);\n  }\n}));\n\ninsertCSS('file-drops.css', `\n  .drop-overlay .box {\n    background: orange;\n    border-radius: 3px;\n    display: inline-block;\n    font-family: sans-serif;\n    padding: 4px 10px;\n    position: fixed;\n    top: 30px;\n    left: 50%;\n    transform: translateX(-50%);\n  }\n`);"
  },
  {
    "path": "test/config/karma.distro.js",
    "content": "// configures browsers to run test against\n// any of [ 'ChromeHeadless', 'Chrome', 'Firefox' ]\nvar browsers = (process.env.TEST_BROWSERS || 'ChromeHeadless').split(',');\n\n// use puppeteer provided Chrome for testing\nprocess.env.CHROME_BIN = require('puppeteer').executablePath();\n\nvar VARIANT = process.env.VARIANT;\n\nvar NODE_ENV = process.env.NODE_ENV;\n\n\nmodule.exports = function(karma) {\n  karma.set({\n\n    basePath: '../../',\n\n    frameworks: [\n      'mocha',\n      'sinon-chai'\n    ],\n\n    files: [\n      'dist/' + VARIANT + '.' + (NODE_ENV === 'production' ? 'production.min' : 'development') + '.js',\n      'dist/assets/bpmn-font/css/bpmn.css',\n      'dist/assets/diagram-js.css',\n      { pattern: 'resources/initial.bpmn', included: false },\n      { pattern: 'dist/assets/**/*', included: false },\n      'test/distro/helper.js',\n      'test/distro/' + VARIANT + '.js'\n    ],\n\n    reporters: [ 'progress' ],\n\n    browsers,\n\n    browserNoActivityTimeout: 30000,\n\n    singleRun: true,\n    autoWatch: false\n  });\n\n};\n"
  },
  {
    "path": "test/config/karma.unit.js",
    "content": "var path = require('path');\nvar fs = require('fs');\n\nvar collectTranslations = process.env.COLLECT_TRANSLATIONS;\n\nvar singleStart = process.env.SINGLE_START;\n\nvar coverage = process.env.COVERAGE;\n\n// configures browsers to run test against\n// any of [ 'ChromeHeadless', 'Chrome', 'Firefox', 'Safari' ]\nvar browsers = (process.env.TEST_BROWSERS || 'ChromeHeadless').split(',');\n\n// use puppeteer provided Chrome for testing\nprocess.env.CHROME_BIN = require('puppeteer').executablePath();\n\nvar tmpDir = path.join(__dirname, 'tmp');\n\nfs.mkdirSync(tmpDir, { recursive: true });\n\nvar firefoxProfile = fs.mkdtempSync(path.join(tmpDir, 'firefox-profile'));\n\nvar basePath = '../..';\n\nvar absoluteBasePath = path.resolve(path.join(__dirname, basePath));\n\nvar suite = coverage ? 'test/coverageBundle.js' : 'test/testBundle.js';\n\n\nmodule.exports = function(karma) {\n\n  var config = {\n\n    basePath,\n\n    frameworks: [\n      'mocha',\n      'sinon-chai',\n      'webpack'\n    ],\n\n    files: [\n      suite\n    ],\n\n    preprocessors: {\n      [ suite ]: [ 'webpack', 'env' ]\n    },\n\n    reporters: [ 'progress' ].concat(coverage ? 'coverage' : []),\n\n    customLaunchers: {\n      'FirefoxHeadless': {\n        base: 'Firefox',\n        flags: [ '-headless' ],\n        profile: firefoxProfile\n      }\n    },\n\n    coverageReporter: {\n      reporters: [\n        { type: 'lcov', subdir: '.' }\n      ]\n    },\n\n    envPreProcessor: [\n      'CI'\n    ],\n\n    browsers,\n\n    browserNoActivityTimeout: 30000,\n\n    singleRun: true,\n    autoWatch: false,\n\n    webpack: {\n      mode: 'development',\n      module: {\n        rules: [\n          {\n            test: require.resolve('../TestHelper.js'),\n            sideEffects: true\n          },\n          {\n            test: /\\.css|\\.bpmn$/,\n            type: 'asset/source'\n          }\n        ].concat(\n          coverage ? {\n            test: /\\.js$/,\n            exclude: /node_modules/,\n            use: {\n              loader: 'babel-loader',\n              options: {\n                plugins: [\n                  [ 'istanbul', {\n                    include: [\n                      'lib/**'\n                    ]\n                  } ]\n                ],\n              }\n            }\n          } : []\n        )\n      },\n      resolve: {\n        mainFields: [\n          'dev:module',\n          'module',\n          'main'\n        ],\n        modules: [\n          'node_modules',\n          absoluteBasePath\n        ]\n      },\n      devtool: 'eval-source-map'\n    }\n  };\n\n  if (collectTranslations) {\n    config.plugins = [].concat(config.plugins || [ 'karma-*' ], require('./translation-reporter'));\n    config.reporters = [].concat(config.reporters || [], 'translation-reporter');\n    config.envPreprocessor = [].concat(config.envPreprocessor || [], 'COLLECT_TRANSLATIONS');\n  }\n\n  if (singleStart) {\n    config.browsers = [].concat(config.browsers, 'Debug');\n    config.envPreprocessor = [].concat(config.envPreprocessor || [], 'SINGLE_START');\n  }\n\n  karma.set(config);\n};\n"
  },
  {
    "path": "test/config/translation-reporter.js",
    "content": "var fs = require('fs');\nvar path = require('path');\n\nvar {\n  uniqueBy,\n  sortBy\n} = require('min-dash');\n\n\nfunction TranslationReporter() {\n  var translationsFile = path.join(__dirname, '../../docs/translations.json');\n\n  var translations = [];\n\n\n  this.onBrowserLog = function(browser, log, type) {\n\n    if (log === undefined || typeof log !== 'string') {\n      return;\n    }\n\n    if (log.substring(0, 1) === '\\'') {\n      log = log.substring(1, log.length - 1);\n    }\n\n    try {\n      var obj = JSON.parse(log);\n\n      if (obj.type === 'translations') {\n        translations.push(obj.msg);\n      }\n    } catch (e) {\n      return;\n    }\n  };\n\n\n  this.onRunComplete = function() {\n    translations = uniqueBy(function(e) { return e; }, translations);\n    translations = sortBy(translations, function(e) { return e; });\n\n    fs.writeFileSync(translationsFile, JSON.stringify(translations, null, 2));\n  };\n}\n\nmodule.exports = {\n  'reporter:translation-reporter' : [ 'type', TranslationReporter ]\n};"
  },
  {
    "path": "test/coverageBundle.js",
    "content": "var allTests = require.context('.', true, /(spec|integration).*Spec\\.js$/);\n\nallTests.keys().forEach(allTests);\n\nvar allSources = require.context('../lib', true, /.*\\.js$/);\n\nallSources.keys().forEach(allSources);"
  },
  {
    "path": "test/distro/bpmn-modeler.js",
    "content": "describe('bpmn-modeler', function() {\n\n  it('should expose globals', function() {\n\n    var BpmnJS = window.BpmnJS;\n\n    // then\n    expect(BpmnJS).to.exist;\n    expect(new BpmnJS()).to.exist;\n  });\n\n\n  it('should expose Viewer and NavigatedViewer', function() {\n\n    var BpmnJS = window.BpmnJS;\n\n    // then\n    expect(BpmnJS.NavigatedViewer).to.exist;\n    expect(new BpmnJS.NavigatedViewer()).to.exist;\n\n    expect(BpmnJS.Viewer).to.exist;\n    expect(new BpmnJS.Viewer()).to.exist;\n  });\n\n\n  it('should import initial diagram', function() {\n\n    var BpmnJS = window.BpmnJS;\n\n    // then\n    /* global testImport */\n    return testImport(BpmnJS);\n  });\n\n});"
  },
  {
    "path": "test/distro/bpmn-navigated-viewer.js",
    "content": "describe('bpmn-navigated-viewer', function() {\n\n  it('should expose globals', function() {\n\n    var BpmnJS = window.BpmnJS;\n\n    // then\n    expect(BpmnJS).to.exist;\n    expect(new BpmnJS()).to.exist;\n  });\n\n\n  it('should expose Viewer', function() {\n\n    var BpmnJS = window.BpmnJS;\n\n    // then\n    expect(BpmnJS.Viewer).not.to.exist;\n  });\n\n\n  it('should import initial diagram', function() {\n\n    var BpmnJS = window.BpmnJS;\n\n    // then\n    /* global testImport */\n    return testImport(BpmnJS);\n  });\n\n});"
  },
  {
    "path": "test/distro/bpmn-viewer.js",
    "content": "describe('bpmn-navigated-viewer', function() {\n\n  it('should expose globals', function() {\n\n    var BpmnJS = window.BpmnJS;\n\n    // then\n    expect(BpmnJS).to.exist;\n    expect(new BpmnJS()).to.exist;\n  });\n\n\n  it('should import initial diagram', function() {\n\n    var BpmnJS = window.BpmnJS;\n\n    // then\n    /* global testImport */\n    return testImport(BpmnJS);\n  });\n\n});"
  },
  {
    "path": "test/distro/helper.js",
    "content": "\nasync function testImport(BpmnJS, done) {\n\n  var container = document.createElement('div');\n  container.style.height = '500px';\n  container.style.border = 'solid 1px #666';\n\n  document.body.appendChild(container);\n\n  const response = await fetch('/base/resources/initial.bpmn');\n\n  if (!response.ok) {\n    throw new Error('failed to fetch diagram');\n  }\n\n  const diagramXML = await response.text();\n\n  var modeler = new BpmnJS({ container: container });\n\n  const { warnings } = await modeler.importXML(diagramXML);\n\n  if (warnings.length) {\n    throw new Error('imported with warnings');\n  }\n\n  return modeler;\n}\n\nwindow.testImport = testImport;"
  },
  {
    "path": "test/fixtures/bpmn/align-elements.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<semantic:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:semantic=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" id=\"_1275940932088\" targetNamespace=\"http://www.trisotech.com/definitions/_1275940932088\" exporter=\"Camunda Modeler\" exporterVersion=\"5.0.0\">\n  <semantic:message id=\"_1275940932310\" />\n  <semantic:message id=\"_1275940932433\" />\n  <semantic:message id=\"_1275940932198\" />\n  <semantic:process id=\"_6-2\" isExecutable=\"false\">\n    <semantic:task id=\"Task_hello\" name=\"hello\">\n      <semantic:incoming>SequenceFlow_08zyuyv</semantic:incoming>\n    </semantic:task>\n    <semantic:task id=\"Task_boundary_evt\">\n      <semantic:outgoing>SequenceFlow_08zyuyv</semantic:outgoing>\n    </semantic:task>\n    <semantic:boundaryEvent id=\"BoundaryEvent_1\" attachedToRef=\"Task_boundary_evt\" />\n    <semantic:sequenceFlow id=\"SequenceFlow_08zyuyv\" name=\"hello\" sourceRef=\"Task_boundary_evt\" targetRef=\"Task_hello\" />\n  </semantic:process>\n  <semantic:collaboration id=\"C1275940932557\">\n    <semantic:participant id=\"_6-53\" name=\"\" processRef=\"_6-2\" />\n    <semantic:participant id=\"_6-438\" name=\"\" processRef=\"_6-1\" />\n    <semantic:messageFlow id=\"MessageFlow_1pvlume\" sourceRef=\"Task_boundary_evt\" targetRef=\"Task_lane\" />\n    <semantic:messageFlow id=\"MessageFlow_1omk2ha\" sourceRef=\"Task_hello\" targetRef=\"SubProcess_lane\" />\n  </semantic:collaboration>\n  <semantic:process id=\"_6-1\" isExecutable=\"false\">\n    <semantic:laneSet id=\"ls_6-438\">\n      <semantic:lane id=\"_6-448\" name=\"\">\n        <semantic:flowNodeRef>EndEvent_lane</semantic:flowNodeRef>\n      </semantic:lane>\n      <semantic:lane id=\"_6-446\" name=\"\">\n        <semantic:flowNodeRef>SubProcess_lane</semantic:flowNodeRef>\n      </semantic:lane>\n      <semantic:lane id=\"_6-650\" name=\"\">\n        <semantic:flowNodeRef>Task_lane</semantic:flowNodeRef>\n      </semantic:lane>\n    </semantic:laneSet>\n    <semantic:task id=\"Task_lane\">\n      <semantic:outgoing>SequenceFlow_1nrce3c</semantic:outgoing>\n    </semantic:task>\n    <semantic:endEvent id=\"EndEvent_lane\">\n      <semantic:incoming>SequenceFlow_0qa7db7</semantic:incoming>\n    </semantic:endEvent>\n    <semantic:subProcess id=\"SubProcess_lane\">\n      <semantic:incoming>SequenceFlow_1nrce3c</semantic:incoming>\n      <semantic:outgoing>SequenceFlow_0qa7db7</semantic:outgoing>\n    </semantic:subProcess>\n    <semantic:sequenceFlow id=\"SequenceFlow_0qa7db7\" sourceRef=\"SubProcess_lane\" targetRef=\"EndEvent_lane\" />\n    <semantic:sequenceFlow id=\"SequenceFlow_1nrce3c\" sourceRef=\"Task_lane\" targetRef=\"SubProcess_lane\" />\n  </semantic:process>\n  <bpmndi:BPMNDiagram id=\"Trisotech.Visio-_6\" name=\"Untitled Diagram\" documentation=\"\" resolution=\"96.00000267028808\">\n    <bpmndi:BPMNPlane bpmnElement=\"C1275940932557\">\n      <bpmndi:BPMNShape id=\"Trisotech.Visio__6-53\" bpmnElement=\"_6-53\" isHorizontal=\"true\">\n        <dc:Bounds x=\"152\" y=\"82\" width=\"1044\" height=\"294\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_08zyuyv_di\" bpmnElement=\"SequenceFlow_08zyuyv\">\n        <di:waypoint x=\"435\" y=\"186\" />\n        <di:waypoint x=\"533\" y=\"186\" />\n        <di:waypoint x=\"533\" y=\"217\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"471\" y=\"160\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_0s45gnz_di\" bpmnElement=\"Task_hello\">\n        <dc:Bounds x=\"483\" y=\"217\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_07vyznk_di\" bpmnElement=\"Task_boundary_evt\">\n        <dc:Bounds x=\"335\" y=\"146\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_0n2gx06_di\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds x=\"336\" y=\"208\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"169.036\" y=\"173.79\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Trisotech.Visio__6-438\" bpmnElement=\"_6-438\" isHorizontal=\"true\">\n        <dc:Bounds x=\"208\" y=\"428\" width=\"825\" height=\"539\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Trisotech.Visio__6__6-448\" bpmnElement=\"_6-448\" isHorizontal=\"true\">\n        <dc:Bounds x=\"238\" y=\"782\" width=\"795\" height=\"185\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Trisotech.Visio__6__6-446\" bpmnElement=\"_6-446\" isHorizontal=\"true\">\n        <dc:Bounds x=\"238\" y=\"542\" width=\"795\" height=\"240\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Trisotech.Visio__6__6-650\" bpmnElement=\"_6-650\" isHorizontal=\"true\">\n        <dc:Bounds x=\"238\" y=\"428\" width=\"795\" height=\"114\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0qa7db7_di\" bpmnElement=\"SequenceFlow_0qa7db7\">\n        <di:waypoint x=\"629\" y=\"766\" />\n        <di:waypoint x=\"629\" y=\"893\" />\n        <di:waypoint x=\"924\" y=\"893\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"470.5\" y=\"618.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1nrce3c_di\" bpmnElement=\"SequenceFlow_1nrce3c\">\n        <di:waypoint x=\"376\" y=\"485\" />\n        <di:waypoint x=\"415\" y=\"485\" />\n        <di:waypoint x=\"415\" y=\"666\" />\n        <di:waypoint x=\"454\" y=\"666\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"242\" y=\"468\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_0qh67cn_di\" bpmnElement=\"Task_lane\">\n        <dc:Bounds x=\"276\" y=\"445\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_1jdsxxr_di\" bpmnElement=\"EndEvent_lane\">\n        <dc:Bounds x=\"924\" y=\"875\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"757\" y=\"841\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_06gy2ot_di\" bpmnElement=\"SubProcess_lane\" isExpanded=\"true\">\n        <dc:Bounds x=\"454\" y=\"566\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_1pvlume_di\" bpmnElement=\"MessageFlow_1pvlume\">\n        <di:waypoint x=\"385\" y=\"226\" />\n        <di:waypoint x=\"385\" y=\"332\" />\n        <di:waypoint x=\"324\" y=\"332\" />\n        <di:waypoint x=\"324\" y=\"445\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"98\" y=\"254.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"MessageFlow_1omk2ha_di\" bpmnElement=\"MessageFlow_1omk2ha\">\n        <di:waypoint x=\"533\" y=\"297\" />\n        <di:waypoint x=\"533\" y=\"566\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"386\" y=\"349\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</semantic:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/basic.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\" />\n    <bpmn:task id=\"Task_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"353\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/boundary-events.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"_tkxkICCPEeWwcL3w8i7dvw\" targetNamespace=\"http://activiti.org/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.7.1\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:subProcess id=\"SubProcess_1\">\n      <bpmn2:startEvent id=\"StartEvent_1\">\n        <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n      </bpmn2:startEvent>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n      <bpmn2:task id=\"Task_1\">\n        <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n      </bpmn2:task>\n    </bpmn2:subProcess>\n    <bpmn2:boundaryEvent id=\"BoundaryEvent_1\" name=\"batman\" attachedToRef=\"SubProcess_1\" />\n    <bpmn2:task id=\"Task_2\" />\n    <bpmn2:boundaryEvent id=\"BoundaryEvent_2\" name=\"superman\" attachedToRef=\"Task_2\" />\n    <bpmn2:task id=\"CompensationTask\" isForCompensation=\"true\" />\n    <bpmn2:intermediateThrowEvent id=\"IntermediateThrowEvent_1\" name=\"joker\" />\n    <bpmn2:boundaryEvent id=\"BoundaryEvent_3\" name=\"wonder woman\" attachedToRef=\"SubProcess_1\" />\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_2\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"204\" y=\"78\" width=\"457\" height=\"289\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_StartEvent_2\" targetElement=\"_BPMNShape_Task_2\">\n        <di:waypoint x=\"311\" y=\"232\" />\n        <di:waypoint x=\"431\" y=\"232\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"332\" y=\"236\" width=\"6\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"275\" y=\"214\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"293\" y=\"255\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"431\" y=\"192\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"795\" y=\"75\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"CompensationTask_di\" bpmnElement=\"CompensationTask\">\n        <dc:Bounds x=\"795\" y=\"249\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_1_di\" bpmnElement=\"IntermediateThrowEvent_1\">\n        <dc:Bounds x=\"185\" y=\"480\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"191\" y=\"525\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_2_di\" bpmnElement=\"BoundaryEvent_2\">\n        <dc:Bounds x=\"781\" y=\"140\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"754\" y=\"176\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1_di\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds x=\"185\" y=\"349\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"155\" y=\"390\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1kn7msk_di\" bpmnElement=\"BoundaryEvent_3\">\n        <dc:Bounds x=\"412\" y=\"349\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"393\" y=\"392\" width=\"75\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/collaboration/collaboration-data-store.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"_P58jANhOEeSW1LwlVzMs4g\" targetNamespace=\"http://camunda.org/schema/1.0/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.22.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"_Participant_2\" name=\"Participant\" processRef=\"Process_1\" />\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:dataStoreReference id=\"DataStoreReference_1by5u7v\" />\n    <bpmn2:startEvent id=\"Event_13f8lfq\" />\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"_Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"154\" y=\"82\" width=\"546\" height=\"236\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_13f8lfq_di\" bpmnElement=\"Event_13f8lfq\">\n        <dc:Bounds x=\"222\" y=\"182\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_1by5u7v_di\" bpmnElement=\"DataStoreReference_1by5u7v\">\n        <dc:Bounds x=\"154\" y=\"375\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/collaboration/collaboration-empty-participant.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_P58jANhOEeSW1LwlVzMs4g\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"_Participant_2\" name=\"Participant\" processRef=\"Process_1\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\"/>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"_Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"236.0\" width=\"546.0\" x=\"84.0\" y=\"62.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/collaboration/collaboration-message-flows.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_P58jANhOEeSW1LwlVzMs4g\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:collaboration id=\"Collaboration_1\">\n    <bpmn2:participant id=\"Participant_2\" name=\"Participant\" processRef=\"Process_1\"/>\n    <bpmn2:participant id=\"Participant_1\" name=\"Pool\" processRef=\"Process_2\"/>\n    <bpmn2:messageFlow id=\"MessageFlow_1\" name=\"\" sourceRef=\"Task_1\" targetRef=\"Participant_1\"/>\n    <bpmn2:messageFlow id=\"MessageFlow_2\" name=\"\" sourceRef=\"Participant_1\" targetRef=\"Participant_2\"/>\n    <bpmn2:messageFlow id=\"MessageFlow_3\" name=\"\" sourceRef=\"Task_2\" targetRef=\"Participant_2\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:subProcess id=\"SubProcess_1\">\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n      <bpmn2:task id=\"Task_1\"/>\n    </bpmn2:subProcess>\n    <bpmn2:startEvent id=\"StartEvent_1\" name=\"Start\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"StartEvent_1\" targetRef=\"SubProcess_1\"/>\n    <bpmn2:endEvent id=\"EndEvent_1\" name=\"End\">\n      <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_2\" name=\"\" sourceRef=\"SubProcess_1\" targetRef=\"EndEvent_1\"/>\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn2:subProcess id=\"SubProcess_2\">\n      <bpmn2:task id=\"Task_2\"/>\n    </bpmn2:subProcess>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"174.0\" y=\"155.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"21.0\" width=\"34.0\" x=\"175.0\" y=\"196.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_2\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds height=\"150.0\" width=\"200.0\" x=\"294.0\" y=\"98.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_StartEvent_2\" targetElement=\"_BPMNShape_SubProcess_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"210.0\" y=\"173.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"294.0\" y=\"173.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"232.0\" y=\"173.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"314.0\" y=\"131.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"544.0\" y=\"155.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"21.0\" width=\"29.0\" x=\"548.0\" y=\"196.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"_BPMNShape_SubProcess_2\" targetElement=\"_BPMNShape_EndEvent_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"494.0\" y=\"173.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"544.0\" y=\"173.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"516.0\" y=\"173.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShapeParticipant_2\" bpmnElement=\"Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"236.0\" width=\"546.0\" x=\"84.0\" y=\"62.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_3\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds height=\"157.0\" width=\"546.0\" x=\"84.0\" y=\"360.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_3\" bpmnElement=\"SubProcess_2\" isExpanded=\"true\">\n        <dc:Bounds height=\"137.0\" width=\"200.0\" x=\"396.0\" y=\"370.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_2\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"468.0\" y=\"408.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_1\" bpmnElement=\"MessageFlow_1\" sourceElement=\"_BPMNShape_Task_2\" targetElement=\"_BPMNShape_Participant_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"364.0\" y=\"211.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"364.0\" y=\"360.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_2\" bpmnElement=\"MessageFlow_2\" sourceElement=\"_BPMNShape_Participant_3\" targetElement=\"_BPMNShapeParticipant_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"357.0\" y=\"360.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"357.0\" y=\"298.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_3\" bpmnElement=\"MessageFlow_3\" sourceElement=\"_BPMNShape_Task_3\" targetElement=\"_BPMNShapeParticipant_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"518.0\" y=\"408.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"518.0\" y=\"298.0\"/>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/collaboration/collaboration-participant.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_P58jANhOEeSW1LwlVzMs4g\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"_Participant_2\" name=\"Participant\" processRef=\"Process_1\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:subProcess id=\"SubProcess_1\">\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n      <bpmn2:task id=\"Task_1\"/>\n    </bpmn2:subProcess>\n    <bpmn2:startEvent id=\"StartEvent_1\" name=\"Start\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"StartEvent_1\" targetRef=\"SubProcess_1\"/>\n    <bpmn2:endEvent id=\"EndEvent_1\" name=\"End\">\n      <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_2\" name=\"\" sourceRef=\"SubProcess_1\" targetRef=\"EndEvent_1\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"174.0\" y=\"155.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"21.0\" width=\"34.0\" x=\"175.0\" y=\"196.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_2\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds height=\"150.0\" width=\"200.0\" x=\"294.0\" y=\"98.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_StartEvent_2\" targetElement=\"_BPMNShape_SubProcess_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"210.0\" y=\"173.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"294.0\" y=\"173.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"232.0\" y=\"173.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"314.0\" y=\"131.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"544.0\" y=\"155.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"21.0\" width=\"29.0\" x=\"548.0\" y=\"196.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"_BPMNShape_SubProcess_2\" targetElement=\"_BPMNShape_EndEvent_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"494.0\" y=\"173.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"544.0\" y=\"173.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"516.0\" y=\"173.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"_Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"236.0\" width=\"546.0\" x=\"84.0\" y=\"62.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/collaboration/process-empty.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_exCZYNkaEeSskpe2jvwgcA\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\"/>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\"/>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/collaboration/process.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_P58jANhOEeSW1LwlVzMs4g\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:subProcess id=\"SubProcess_1\">\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n      <bpmn2:task id=\"Task_1\"/>\n    </bpmn2:subProcess>\n    <bpmn2:startEvent id=\"StartEvent_1\" name=\"Start\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"StartEvent_1\" targetRef=\"SubProcess_1\"/>\n    <bpmn2:endEvent id=\"EndEvent_1\" name=\"End\">\n      <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_2\" name=\"\" sourceRef=\"SubProcess_1\" targetRef=\"EndEvent_1\"/>\n    <bpmn2:group id=\"Group_1\" />\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"192.0\" y=\"129.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"210.0\" y=\"170.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_2\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds height=\"150.0\" width=\"200.0\" x=\"312.0\" y=\"72.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_StartEvent_2\" targetElement=\"_BPMNShape_SubProcess_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"228.0\" y=\"147.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"312.0\" y=\"147.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"250.0\" y=\"147.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"332.0\" y=\"105.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"562.0\" y=\"129.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_1_di\" bpmnElement=\"Group_1\">\n        <dc:Bounds x=\"645\" y=\"96\" width=\"170\" height=\"120\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"_BPMNShape_SubProcess_2\" targetElement=\"_BPMNShape_EndEvent_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"512.0\" y=\"147.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"562.0\" y=\"147.0\"/>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/collaboration-data-items.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_pHDz0KojEeOJhIBv1RySdg\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"Participant_2\" name=\"Pool\" processRef=\"Process_1\"/>\n    <bpmn2:participant id=\"Participant_1\" name=\"Pool\" processRef=\"Process_2\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Lane_1\" name=\"Lane 1\">\n        <bpmn2:childLaneSet xsi:type=\"bpmn2:tLaneSet\" id=\"LaneSet_2\">\n          <bpmn2:lane id=\"Lane_2\" name=\"Lane 2\">\n            <bpmn2:flowNodeRef>SubProcess_1</bpmn2:flowNodeRef>\n          </bpmn2:lane>\n          <bpmn2:lane id=\"Lane_3\" name=\"Lane 3\"/>\n        </bpmn2:childLaneSet>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:dataStoreReference id=\"DataStoreReference_5\" name=\"Data Store 1\" dataStoreRef=\"DataStore_1\"/>\n    <bpmn2:subProcess id=\"SubProcess_1\">\n      <bpmn2:dataObject id=\"DataObject_1\" name=\"Data Object 1\"/>\n      <bpmn2:dataObjectReference id=\"DataObjectReference_1\" name=\"Data Object 1\" dataObjectRef=\"DataObject_1\"/>\n    </bpmn2:subProcess>\n    <bpmn2:dataStoreReference id=\"DataStoreReference_6\" name=\"Data Store 2\" dataStoreRef=\"DataStore_2\"/>\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn2:ioSpecification id=\"InputOutputSpecification_1\">\n      <bpmn2:dataInput id=\"DataInput_1\"/>\n      <bpmn2:dataOutput id=\"DataOutput_1\"/>\n    </bpmn2:ioSpecification>\n  </bpmn2:process>\n  <bpmn2:dataStore id=\"DataStore_1\" name=\"Data Store 1\"/>\n  <bpmn2:dataStore id=\"DataStore_2\" name=\"Data Store 2\"/>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"361.0\" width=\"540.0\" x=\"222.0\" y=\"0.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_3\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds height=\"100.0\" width=\"600.0\" x=\"222.0\" y=\"415.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_2\" bpmnElement=\"Lane_1\" isHorizontal=\"true\">\n        <dc:Bounds height=\"361.0\" width=\"510.0\" x=\"252.0\" y=\"0.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_3\" bpmnElement=\"Lane_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"253.0\" width=\"480.0\" x=\"282.0\" y=\"0.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_4\" bpmnElement=\"Lane_3\" isHorizontal=\"true\">\n        <dc:Bounds height=\"109.0\" width=\"480.0\" x=\"282.0\" y=\"252.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_3\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds height=\"150.0\" width=\"176.0\" x=\"552.0\" y=\"36.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_DataObjectReference_5\" bpmnElement=\"DataObjectReference_1\">\n        <dc:Bounds height=\"50.0\" width=\"36.0\" x=\"636.0\" y=\"72.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"22.0\" width=\"86.0\" x=\"611.0\" y=\"127.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_DataStoreReference_5\" bpmnElement=\"DataStoreReference_5\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"336.0\" y=\"276.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"22.0\" width=\"79.0\" x=\"322.0\" y=\"331.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_DataStoreReference_6\" bpmnElement=\"DataStoreReference_6\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"888.0\" y=\"317.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"22.0\" width=\"79.0\" x=\"874.0\" y=\"372.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_DataInput_5\" bpmnElement=\"DataInput_1\">\n        <dc:Bounds height=\"50.0\" width=\"36.0\" x=\"394.0\" y=\"436.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_DataOutput_5\" bpmnElement=\"DataOutput_1\">\n        <dc:Bounds height=\"50.0\" width=\"36.0\" x=\"487.0\" y=\"436.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"505.0\" y=\"491.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/collaboration-message-flows.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_pHDz0KojEeOJhIBv1RySdg\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"Participant_2\" name=\"Pool\" processRef=\"Process_1\"/>\n    <bpmn2:participant id=\"Participant_1\" name=\"Pool\" processRef=\"Process_2\"/>\n    <bpmn2:messageFlow id=\"MessageFlow_1\" name=\"\" sourceRef=\"Task_2\" targetRef=\"Participant_1\"/>\n    <bpmn2:messageFlow id=\"MessageFlow_2\" name=\"\" sourceRef=\"Participant_1\" targetRef=\"Participant_2\"/>\n    <bpmn2:messageFlow id=\"MessageFlow_4\" name=\"\" sourceRef=\"Task_1\" targetRef=\"StartEvent_1\"/>\n    <bpmn2:messageFlow id=\"MessageFlow_5\" name=\"\" sourceRef=\"EndEvent_1\" targetRef=\"Participant_1\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:task id=\"Task_1\"/>\n    <bpmn2:endEvent id=\"EndEvent_1\">\n      <bpmn2:messageEventDefinition id=\"MessageEventDefinition_2\"/>\n    </bpmn2:endEvent>\n    <bpmn2:task id=\"Task_2\"/>\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn2:startEvent id=\"StartEvent_1\">\n      <bpmn2:messageEventDefinition id=\"MessageEventDefinition_1\"/>\n    </bpmn2:startEvent>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"217.0\" width=\"456.0\" x=\"278.0\" y=\"84.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_3\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds height=\"100.0\" width=\"600.0\" x=\"222.0\" y=\"415.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_3\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"300.0\" y=\"448.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"318.0\" y=\"489.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"360.0\" y=\"134.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_1\" bpmnElement=\"MessageFlow_1\" sourceElement=\"_BPMNShape_Task_4\" targetElement=\"_BPMNShape_Participant_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"590.0\" y=\"214.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"590.0\" y=\"415.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"522.0\" y=\"314.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_2\" bpmnElement=\"MessageFlow_2\" sourceElement=\"_BPMNShape_Participant_3\" targetElement=\"_BPMNShape_Participant_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"506.0\" y=\"415.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"506.0\" y=\"386.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"506.0\" y=\"386.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"506.0\" y=\"300.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"504.0\" y=\"386.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_4\" bpmnElement=\"MessageFlow_4\" sourceElement=\"_BPMNShape_Task_3\" targetElement=\"_BPMNShape_StartEvent_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"390.0\" y=\"214.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"390.0\" y=\"387.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"318.0\" y=\"387.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"318.0\" y=\"448.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"427.0\" y=\"321.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"653.0\" y=\"178.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"671.0\" y=\"219.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_5\" bpmnElement=\"MessageFlow_5\" sourceElement=\"_BPMNShape_EndEvent_2\" targetElement=\"_BPMNShape_Participant_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"671.0\" y=\"214.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"671.0\" y=\"415.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"630.0\" y=\"332.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_4\" bpmnElement=\"Task_2\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"516.0\" y=\"134.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/collaboration-sequence-flows.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_pHDz0KojEeOJhIBv1RySdg\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"Participant_2\" name=\"Pool\" processRef=\"Process_1\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Lane_1\" name=\"Lane 1\">\n        <bpmn2:childLaneSet xsi:type=\"bpmn2:tLaneSet\" id=\"LaneSet_2\">\n          <bpmn2:lane id=\"Lane_2\" name=\"Lane 2\">\n            <bpmn2:flowNodeRef>EndEvent_1</bpmn2:flowNodeRef>\n          </bpmn2:lane>\n          <bpmn2:lane id=\"Lane_3\" name=\"Lane 3\">\n            <bpmn2:flowNodeRef>Task_1</bpmn2:flowNodeRef>\n          </bpmn2:lane>\n        </bpmn2:childLaneSet>\n      </bpmn2:lane>\n      <bpmn2:lane id=\"Lane_4\" name=\"Lane 4\">\n        <bpmn2:flowNodeRef>ExclusiveGateway_1</bpmn2:flowNodeRef>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:task id=\"Task_1\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n      <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n    </bpmn2:task>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"Task_1\" targetRef=\"EndEvent_1\"/>\n    <bpmn2:endEvent id=\"EndEvent_1\">\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:exclusiveGateway id=\"ExclusiveGateway_1\">\n      <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n    </bpmn2:exclusiveGateway>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_2\" name=\"\" sourceRef=\"Task_1\" targetRef=\"ExclusiveGateway_1\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"532.0\" width=\"540.0\" x=\"222.0\" y=\"0.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_2\" bpmnElement=\"Lane_1\" isHorizontal=\"true\">\n        <dc:Bounds height=\"356.0\" width=\"510.0\" x=\"252.0\" y=\"0.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_3\" bpmnElement=\"Lane_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"215.0\" width=\"480.0\" x=\"282.0\" y=\"0.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_4\" bpmnElement=\"Lane_3\" isHorizontal=\"true\">\n        <dc:Bounds height=\"142.0\" width=\"480.0\" x=\"282.0\" y=\"214.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"360.0\" y=\"246.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_3\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"660.0\" y=\"60.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"678.0\" y=\"101.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_Task_3\" targetElement=\"_BPMNShape_EndEvent_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"460.0\" y=\"286.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"560.0\" y=\"285.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"560.0\" y=\"77.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"660.0\" y=\"78.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"482.0\" y=\"286.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_5\" bpmnElement=\"Lane_4\" isHorizontal=\"true\">\n        <dc:Bounds height=\"177.0\" width=\"510.0\" x=\"252.0\" y=\"355.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_ExclusiveGateway_3\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"564.0\" y=\"435.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"589.0\" y=\"490.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"_BPMNShape_Task_3\" targetElement=\"_BPMNShape_ExclusiveGateway_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"460.0\" y=\"286.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"512.0\" y=\"286.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"512.0\" y=\"460.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"564.0\" y=\"460.0\"/>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/collaboration-vertical.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_pHDz0KojEeOJhIBv1RySdg\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"V_Participant_2\" name=\"V_Pool\" processRef=\"Process_1\"/>\n    <bpmn2:participant id=\"V_Participant_1\" name=\"V_Pool\" processRef=\"Process_2\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"V_Lane_1\" name=\"V_Lane 1\">\n        <bpmn2:childLaneSet xsi:type=\"bpmn2:tLaneSet\" id=\"LaneSet_2\">\n          <bpmn2:lane id=\"V_Lane_2\" name=\"V_Lane 2\"/>\n          <bpmn2:lane id=\"V_Lane_3\" name=\"V_Lane 3\">\n            <bpmn2:flowNodeRef>Task_1</bpmn2:flowNodeRef>\n          </bpmn2:lane>\n        </bpmn2:childLaneSet>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:task id=\"Task_1\"/>\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn2:startEvent id=\"StartEvent_1\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPV_Lane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_V_Participant_2\" bpmnElement=\"V_Participant_2\" isHorizontal=\"false\">\n        <dc:Bounds x=\"100.0\" y=\"122.0\" width=\"356.0\" height=\"540.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_3\" bpmnElement=\"V_Participant_1\" isHorizontal=\"false\">\n        <dc:Bounds x=\"515.0\" y=\"122.0\" width=\"100.0\" height=\"600.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_V_Lane_2\" bpmnElement=\"V_Lane_1\" isHorizontal=\"false\">\n        <dc:Bounds x=\"100.0\" y=\"152.0\" width=\"356.0\" height=\"510.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_V_Lane_3\" bpmnElement=\"V_Lane_2\" isHorizontal=\"false\">\n        <dc:Bounds x=\"100.0\" y=\"182.0\" width=\"215.0\" height=\"480.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_V_Lane_4\" bpmnElement=\"V_Lane_3\" isHorizontal=\"false\">\n        <dc:Bounds x=\"314.0\" y=\"182.0\" width=\"142.0\" height=\"480.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_3\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"548.0\" y=\"224.0\" width=\"36.0\" height=\"36.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"336.0\" y=\"260.0\" width=\"100.0\" height=\"80.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/collaboration.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_pHDz0KojEeOJhIBv1RySdg\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"Participant_2\" name=\"Pool\" processRef=\"Process_1\"/>\n    <bpmn2:participant id=\"Participant_1\" name=\"Pool\" processRef=\"Process_2\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Lane_1\" name=\"Lane 1\">\n        <bpmn2:childLaneSet xsi:type=\"bpmn2:tLaneSet\" id=\"LaneSet_2\">\n          <bpmn2:lane id=\"Lane_2\" name=\"Lane 2\"/>\n          <bpmn2:lane id=\"Lane_3\" name=\"Lane 3\">\n            <bpmn2:flowNodeRef>Task_1</bpmn2:flowNodeRef>\n          </bpmn2:lane>\n        </bpmn2:childLaneSet>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:task id=\"Task_1\"/>\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn2:startEvent id=\"StartEvent_1\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"356.0\" width=\"540.0\" x=\"222.0\" y=\"0.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_3\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds height=\"100.0\" width=\"600.0\" x=\"222.0\" y=\"415.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_2\" bpmnElement=\"Lane_1\" isHorizontal=\"true\">\n        <dc:Bounds height=\"356.0\" width=\"510.0\" x=\"252.0\" y=\"0.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_3\" bpmnElement=\"Lane_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"215.0\" width=\"480.0\" x=\"282.0\" y=\"0.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_4\" bpmnElement=\"Lane_3\" isHorizontal=\"true\">\n        <dc:Bounds height=\"142.0\" width=\"480.0\" x=\"282.0\" y=\"214.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_3\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"324.0\" y=\"448.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"1.0\" width=\"0.0\" x=\"342.0\" y=\"489.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"360.0\" y=\"246.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/collapsed-sub-process-legacy.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_0763oqv\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.8.0\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.15.0\">\n  <bpmn:process id=\"Process\" isExecutable=\"true\">\n    <bpmn:startEvent id=\"StartEvent_1\" />\n    <bpmn:subProcess id=\"SubProcess\">\n      <bpmn:startEvent id=\"Event_0lrpy3a\">\n        <bpmn:outgoing>Flow_0obnxbt</bpmn:outgoing>\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_0obnxbt\" sourceRef=\"Event_0lrpy3a\" targetRef=\"NestedSubProcess\" />\n      <bpmn:endEvent id=\"Event_1ic2bhx\">\n        <bpmn:incoming>Flow_1d6ajf7</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:subProcess id=\"NestedSubProcess\">\n        <bpmn:incoming>Flow_0obnxbt</bpmn:incoming>\n        <bpmn:outgoing>Flow_1d6ajf7</bpmn:outgoing>\n        <bpmn:startEvent id=\"subprocess_startEvent\" />\n      </bpmn:subProcess>\n      <bpmn:sequenceFlow id=\"Flow_1d6ajf7\" sourceRef=\"NestedSubProcess\" targetRef=\"Event_1ic2bhx\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"179\" y=\"159\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_di\" bpmnElement=\"SubProcess\">\n        <dc:Bounds x=\"250\" y=\"130\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1d6ajf7_di\" bpmnElement=\"Flow_1d6ajf7\">\n        <di:waypoint x=\"740\" y=\"240\" />\n        <di:waypoint x=\"782\" y=\"240\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0obnxbt_di\" bpmnElement=\"Flow_0obnxbt\">\n        <di:waypoint x=\"308\" y=\"240\" />\n        <di:waypoint x=\"350\" y=\"240\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Event_0lrpy3a_di\" bpmnElement=\"Event_0lrpy3a\">\n        <dc:Bounds x=\"272\" y=\"222\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"NestedSubProcess_di\" bpmnElement=\"NestedSubProcess\">\n        <dc:Bounds x=\"350\" y=\"120\" width=\"390\" height=\"240\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"subprocess_startEvent_di\" bpmnElement=\"subprocess_startEvent\">\n        <dc:Bounds x=\"410\" y=\"222\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1ic2bhx_di\" bpmnElement=\"Event_1ic2bhx\">\n        <dc:Bounds x=\"782\" y=\"222\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/collapsed-sub-process.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:signavio=\"http://www.signavio.com\" id=\"sid-edcb32b0-ba3c-4331-9874-58685c514c55\" targetNamespace=\"http://www.signavio.com\" expressionLanguage=\"http://www.w3.org/TR/XPath\" exporter=\"Signavio Process Editor, http://www.signavio.com\" exporterVersion=\"15.4.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n  <error id=\"sid-c4218475-d7d4-4ee6-ae73-5d44c49114b8\" />\n  <process id=\"rootProcess\" name=\"Root\" processType=\"None\" isClosed=\"false\" isExecutable=\"false\">\n    <startEvent id=\"sid-6687E2F4-B03D-4E57-A62B-68FA642BE19C\">\n      <outgoing>sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300</outgoing>\n    </startEvent>\n    <parallelGateway id=\"parallelGateway\" gatewayDirection=\"Diverging\">\n      <incoming>sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300</incoming>\n      <outgoing>sid-F06605E1-AEC1-4B39-8843-4AD3F547B557</outgoing>\n      <outgoing>sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500</outgoing>\n    </parallelGateway>\n    <subProcess id=\"collapsedProcess\" name=\"Collapsed Process\">\n      <incoming>sid-F06605E1-AEC1-4B39-8843-4AD3F547B557</incoming>\n      <outgoing>sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05</outgoing>\n      <startEvent id=\"sid-AB14D824-C8B9-4211-B224-C5AF8CED8BBD\">\n        <outgoing>sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657</outgoing>\n      </startEvent>\n      <task id=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724\" name=\"Check Items\">\n        <incoming>sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657</incoming>\n        <outgoing>sid-FB543319-8DFB-4445-AAA3-720137FB230B</outgoing>\n      </task>\n      <subProcess id=\"expandedProcess\" name=\"Expanded Process\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffff\" />\n          <signavio:signavioMetaData metaKey=\"bordercolor\" metaValue=\"#000000\" />\n        </extensionElements>\n        <incoming>sid-FB543319-8DFB-4445-AAA3-720137FB230B</incoming>\n        <outgoing>sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0</outgoing>\n        <startEvent id=\"sid-3B0273A0-FE3B-4525-9E1F-FBAE2F53C2E7\">\n          <outgoing>sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC</outgoing>\n        </startEvent>\n        <subProcess id=\"collapsedProcess_2\" name=\"Collapsed Process 2\">\n          <incoming>sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC</incoming>\n          <outgoing>sid-910420B0-D11B-4F9D-B285-703D8AC0BA90</outgoing>\n          <startEvent id=\"sid-C67DBACD-2E96-4A69-97F0-9B04CCB255EC\">\n            <outgoing>sid-A7460113-CB75-491D-817B-5E1A8C606B8C</outgoing>\n          </startEvent>\n          <task id=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830\" name=\"Call External Supplier\">\n            <incoming>sid-A7460113-CB75-491D-817B-5E1A8C606B8C</incoming>\n            <outgoing>sid-01982395-64E8-43EF-A6D3-CDD276C312AA</outgoing>\n          </task>\n          <endEvent id=\"sid-987C40F8-82D3-4637-ABCE-A85A5E2AB8A9\">\n            <incoming>sid-01982395-64E8-43EF-A6D3-CDD276C312AA</incoming>\n          </endEvent>\n          <sequenceFlow id=\"sid-A7460113-CB75-491D-817B-5E1A8C606B8C\" sourceRef=\"sid-C67DBACD-2E96-4A69-97F0-9B04CCB255EC\" targetRef=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830\">\n          </sequenceFlow>\n          <sequenceFlow id=\"sid-01982395-64E8-43EF-A6D3-CDD276C312AA\" sourceRef=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830\" targetRef=\"sid-987C40F8-82D3-4637-ABCE-A85A5E2AB8A9\">\n          </sequenceFlow>\n        </subProcess>\n        <endEvent id=\"sid-17C71FEB-D00D-46D0-ACBE-BB424A3EE5A5\">\n          <incoming>sid-910420B0-D11B-4F9D-B285-703D8AC0BA90</incoming>\n        </endEvent>\n        <sequenceFlow id=\"sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC\" sourceRef=\"sid-3B0273A0-FE3B-4525-9E1F-FBAE2F53C2E7\" targetRef=\"collapsedProcess_2\">\n        </sequenceFlow>\n        <sequenceFlow id=\"sid-910420B0-D11B-4F9D-B285-703D8AC0BA90\" sourceRef=\"collapsedProcess_2\" targetRef=\"sid-17C71FEB-D00D-46D0-ACBE-BB424A3EE5A5\">\n        </sequenceFlow>\n      </subProcess>\n      <endEvent id=\"sid-EE9F103D-15EA-4FBB-A4DB-8B94E5F04390\">\n        <incoming>sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0</incoming>\n      </endEvent>\n      <sequenceFlow id=\"sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657\" sourceRef=\"sid-AB14D824-C8B9-4211-B224-C5AF8CED8BBD\" targetRef=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-FB543319-8DFB-4445-AAA3-720137FB230B\" sourceRef=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724\" targetRef=\"expandedProcess\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0\" sourceRef=\"expandedProcess\" targetRef=\"sid-EE9F103D-15EA-4FBB-A4DB-8B94E5F04390\">\n      </sequenceFlow>\n    </subProcess>\n    <subProcess id=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B\" name=\"Procure Payment\">\n      <incoming>sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500</incoming>\n      <outgoing>sid-5B23450F-AF5E-4519-B134-32107776BD44</outgoing>\n      <startEvent id=\"sid-A13CFBB9-5471-4439-96FA-B65862CA7B21\">\n        <outgoing>sid-E71F5783-AFE7-44ED-8A9C-378C95087448</outgoing>\n      </startEvent>\n      <subProcess id=\"sid-ECEB5194-0BF8-4913-A76F-963DC1FD1D7F\" name=\"Charge Card\">\n        <incoming>sid-E71F5783-AFE7-44ED-8A9C-378C95087448</incoming>\n        <outgoing>sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16</outgoing>\n        <startEvent id=\"sid-F2CCFED7-AD11-4A21-80EE-71D9C96549C8\">\n          <outgoing>sid-3BB6D6CA-BF45-4D15-A1AB-64686C41DB32</outgoing>\n        </startEvent>\n        <task id=\"sid-29B8F97B-1A0D-4280-A62D-5093316C484B\" name=\"Charge Card\">\n          <incoming>sid-3BB6D6CA-BF45-4D15-A1AB-64686C41DB32</incoming>\n          <outgoing>sid-4E25B80E-EF68-4EE5-BB08-C1F54F1A7C39</outgoing>\n        </task>\n        <endEvent id=\"sid-F5AE4FCD-976F-4426-B1FF-7FCAA4CE2393\">\n          <incoming>sid-4E25B80E-EF68-4EE5-BB08-C1F54F1A7C39</incoming>\n        </endEvent>\n        <sequenceFlow id=\"sid-3BB6D6CA-BF45-4D15-A1AB-64686C41DB32\" sourceRef=\"sid-F2CCFED7-AD11-4A21-80EE-71D9C96549C8\" targetRef=\"sid-29B8F97B-1A0D-4280-A62D-5093316C484B\">\n        </sequenceFlow>\n        <sequenceFlow id=\"sid-4E25B80E-EF68-4EE5-BB08-C1F54F1A7C39\" sourceRef=\"sid-29B8F97B-1A0D-4280-A62D-5093316C484B\" targetRef=\"sid-F5AE4FCD-976F-4426-B1FF-7FCAA4CE2393\">\n        </sequenceFlow>\n      </subProcess>\n      <subProcess id=\"sid-5DCDF44C-56B4-47A2-9085-00004E76F3A8\" name=\"Accounting Stuff, I don&#39;t know\">\n        <incoming>sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16</incoming>\n        <outgoing>sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519</outgoing>\n        <startEvent id=\"sid-2098A7EE-D7D8-405E-AF61-95BA48E891B6\">\n          <outgoing>sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC</outgoing>\n        </startEvent>\n        <task id=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB\" name=\"Accounting Stuff, I don&#39;t know\">\n          <incoming>sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC</incoming>\n          <outgoing>sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E</outgoing>\n        </task>\n        <endEvent id=\"sid-DAFD7764-8FA5-417B-BB33-55E483687A7D\">\n          <incoming>sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E</incoming>\n        </endEvent>\n        <sequenceFlow id=\"sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC\" sourceRef=\"sid-2098A7EE-D7D8-405E-AF61-95BA48E891B6\" targetRef=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB\">\n        </sequenceFlow>\n        <sequenceFlow id=\"sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E\" sourceRef=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB\" targetRef=\"sid-DAFD7764-8FA5-417B-BB33-55E483687A7D\">\n        </sequenceFlow>\n      </subProcess>\n      <endEvent id=\"sid-345BB5A6-CE3B-4711-972A-81E47BA4B667\">\n        <incoming>sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519</incoming>\n      </endEvent>\n      <sequenceFlow id=\"sid-E71F5783-AFE7-44ED-8A9C-378C95087448\" sourceRef=\"sid-A13CFBB9-5471-4439-96FA-B65862CA7B21\" targetRef=\"sid-ECEB5194-0BF8-4913-A76F-963DC1FD1D7F\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"bordercolor\" metaValue=\"#000000\" />\n        </extensionElements>\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16\" sourceRef=\"sid-ECEB5194-0BF8-4913-A76F-963DC1FD1D7F\" targetRef=\"sid-5DCDF44C-56B4-47A2-9085-00004E76F3A8\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"bordercolor\" metaValue=\"#000000\" />\n        </extensionElements>\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519\" sourceRef=\"sid-5DCDF44C-56B4-47A2-9085-00004E76F3A8\" targetRef=\"sid-345BB5A6-CE3B-4711-972A-81E47BA4B667\">\n      </sequenceFlow>\n    </subProcess>\n    <parallelGateway id=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\" gatewayDirection=\"Converging\">\n      <incoming>sid-5B23450F-AF5E-4519-B134-32107776BD44</incoming>\n      <incoming>sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05</incoming>\n      <outgoing>sid-F7DA1903-6A1A-4858-AF4B-286A968C957F</outgoing>\n    </parallelGateway>\n    <boundaryEvent id=\"sid-C586DCF2-0B1B-4878-8042-F9869023F21B\" attachedToRef=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B\">\n      <outgoing>sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4</outgoing>\n      <errorEventDefinition id=\"sid-804c8ce9-8013-49e6-a6f5-bf97d24f6cf0\" errorRef=\"sid-c4218475-d7d4-4ee6-ae73-5d44c49114b8\" />\n    </boundaryEvent>\n    <endEvent id=\"sid-A53C38A9-456B-4AC9-9D4A-6EC9663BA77C\">\n      <incoming>sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4</incoming>\n    </endEvent>\n    <subProcess id=\"parallelGateway_withoutContent\" name=\"Ship Items (todo)\">\n      <incoming>sid-F7DA1903-6A1A-4858-AF4B-286A968C957F</incoming>\n      <outgoing>sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3</outgoing>\n    </subProcess>\n    <endEvent id=\"sid-DA90DE99-58B0-4371-B71D-87A718ACB64D\">\n      <incoming>sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3</incoming>\n    </endEvent>\n    <sequenceFlow id=\"sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300\" sourceRef=\"sid-6687E2F4-B03D-4E57-A62B-68FA642BE19C\" targetRef=\"parallelGateway\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-F06605E1-AEC1-4B39-8843-4AD3F547B557\" sourceRef=\"parallelGateway\" targetRef=\"collapsedProcess\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500\" sourceRef=\"parallelGateway\" targetRef=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-5B23450F-AF5E-4519-B134-32107776BD44\" sourceRef=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B\" targetRef=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05\" sourceRef=\"collapsedProcess\" targetRef=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4\" sourceRef=\"sid-C586DCF2-0B1B-4878-8042-F9869023F21B\" targetRef=\"sid-A53C38A9-456B-4AC9-9D4A-6EC9663BA77C\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-F7DA1903-6A1A-4858-AF4B-286A968C957F\" sourceRef=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\" targetRef=\"parallelGateway_withoutContent\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3\" sourceRef=\"parallelGateway_withoutContent\" targetRef=\"sid-DA90DE99-58B0-4371-B71D-87A718ACB64D\">\n    </sequenceFlow>\n  </process>\n  <bpmndi:BPMNDiagram id=\"rootProcess_diagram\">\n    <bpmndi:BPMNPlane id=\"sid-5fb4720f-4b99-4727-8770-dd4166bcd5e4\" bpmnElement=\"rootProcess\">\n      <bpmndi:BPMNEdge id=\"sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3_gui\" bpmnElement=\"sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3\">\n        <omgdi:waypoint x=\"675\" y=\"215\" />\n        <omgdi:waypoint x=\"720\" y=\"215\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-F7DA1903-6A1A-4858-AF4B-286A968C957F_gui\" bpmnElement=\"sid-F7DA1903-6A1A-4858-AF4B-286A968C957F\">\n        <omgdi:waypoint x=\"530\" y=\"215.41484716157206\" />\n        <omgdi:waypoint x=\"575\" y=\"215.2183406113537\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4_gui\" bpmnElement=\"sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4\">\n        <omgdi:waypoint x=\"420\" y=\"370\" />\n        <omgdi:waypoint x=\"420\" y=\"427.89053746720595\" />\n        <omgdi:waypoint x=\"515\" y=\"428\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05_gui\" bpmnElement=\"sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05\">\n        <omgdi:waypoint x=\"445\" y=\"110\" />\n        <omgdi:waypoint x=\"510.5\" y=\"110\" />\n        <omgdi:waypoint x=\"510.5\" y=\"195\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-5B23450F-AF5E-4519-B134-32107776BD44_gui\" bpmnElement=\"sid-5B23450F-AF5E-4519-B134-32107776BD44\">\n        <omgdi:waypoint x=\"445\" y=\"315\" />\n        <omgdi:waypoint x=\"510.5\" y=\"315\" />\n        <omgdi:waypoint x=\"510.5\" y=\"235\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500_gui\" bpmnElement=\"sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500\">\n        <omgdi:waypoint x=\"255.5\" y=\"235\" />\n        <omgdi:waypoint x=\"255.5\" y=\"315\" />\n        <omgdi:waypoint x=\"345\" y=\"315\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-F06605E1-AEC1-4B39-8843-4AD3F547B557_gui\" bpmnElement=\"sid-F06605E1-AEC1-4B39-8843-4AD3F547B557\">\n        <omgdi:waypoint x=\"255.5\" y=\"195\" />\n        <omgdi:waypoint x=\"255.5\" y=\"110\" />\n        <omgdi:waypoint x=\"345\" y=\"110\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300_gui\" bpmnElement=\"sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300\">\n        <omgdi:waypoint x=\"190\" y=\"215.09316770186336\" />\n        <omgdi:waypoint x=\"235\" y=\"215.37267080745343\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-6687E2F4-B03D-4E57-A62B-68FA642BE19C_gui\" bpmnElement=\"sid-6687E2F4-B03D-4E57-A62B-68FA642BE19C\">\n        <omgdc:Bounds x=\"160\" y=\"200\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"parallelGateway_gui\" bpmnElement=\"parallelGateway\">\n        <omgdc:Bounds x=\"235\" y=\"195\" width=\"40\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"collapsedProcess_gui\" bpmnElement=\"collapsedProcess\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"345\" y=\"70\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-c53530f5-9da8-4535-ae6d-c94859ea5b93\">\n          <omgdc:Bounds x=\"352.99214363098145\" y=\"102\" width=\"84.08571243286133\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B_gui\" bpmnElement=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"345\" y=\"275\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-c53530f5-9da8-4535-ae6d-c94859ea5b93\">\n          <omgdc:Bounds x=\"349.520715713501\" y=\"307\" width=\"91.02856826782227\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B_gui\" bpmnElement=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\">\n        <omgdc:Bounds x=\"490\" y=\"195\" width=\"40\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-A53C38A9-456B-4AC9-9D4A-6EC9663BA77C_gui\" bpmnElement=\"sid-A53C38A9-456B-4AC9-9D4A-6EC9663BA77C\">\n        <omgdc:Bounds x=\"515\" y=\"413.89053746720595\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"parallelGateway_withoutContent_gui\" bpmnElement=\"parallelGateway_withoutContent\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"575\" y=\"175\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-c53530f5-9da8-4535-ae6d-c94859ea5b93\">\n          <omgdc:Bounds x=\"595.7207126617432\" y=\"201\" width=\"58.62857437133789\" height=\"24\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-DA90DE99-58B0-4371-B71D-87A718ACB64D_gui\" bpmnElement=\"sid-DA90DE99-58B0-4371-B71D-87A718ACB64D\">\n        <omgdc:Bounds x=\"720\" y=\"201\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-C586DCF2-0B1B-4878-8042-F9869023F21B_gui\" bpmnElement=\"sid-C586DCF2-0B1B-4878-8042-F9869023F21B\">\n        <omgdc:Bounds x=\"405\" y=\"340\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-c53530f5-9da8-4535-ae6d-c94859ea5b93\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"sid-99a6a759-9161-4f4a-a83d-9ad6b9fbdc7e\">\n    <bpmndi:BPMNPlane id=\"sid-62501c88-ba6c-44ea-90f1-3ccf6a7cea2f\" bpmnElement=\"collapsedProcess\">\n      <bpmndi:BPMNShape id=\"sid-AB14D824-C8B9-4211-B224-C5AF8CED8BBD_gui\" bpmnElement=\"sid-AB14D824-C8B9-4211-B224-C5AF8CED8BBD\">\n        <omgdc:Bounds x=\"150\" y=\"140\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724_gui\" bpmnElement=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724\">\n        <omgdc:Bounds x=\"225\" y=\"115\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-592ddc98-48fc-42b3-b7f9-1df8b6d368c5\">\n          <omgdc:Bounds x=\"241.44285583496094\" y=\"147\" width=\"67.11428833007812\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-3B0273A0-FE3B-4525-9E1F-FBAE2F53C2E7_gui\" bpmnElement=\"sid-3B0273A0-FE3B-4525-9E1F-FBAE2F53C2E7\">\n        <omgdc:Bounds x=\"390\" y=\"140\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"collapsedProcess_2_gui\" bpmnElement=\"collapsedProcess_2\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"465\" y=\"115\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-592ddc98-48fc-42b3-b7f9-1df8b6d368c5\">\n          <omgdc:Bounds x=\"481.4778537750244\" y=\"141\" width=\"67.11429214477539\" height=\"24\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-17C71FEB-D00D-46D0-ACBE-BB424A3EE5A5_gui\" bpmnElement=\"sid-17C71FEB-D00D-46D0-ACBE-BB424A3EE5A5\">\n        <omgdc:Bounds x=\"610\" y=\"141\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC_gui\" bpmnElement=\"sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC\">\n        <omgdi:waypoint x=\"420\" y=\"155\" />\n        <omgdi:waypoint x=\"465\" y=\"155\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-910420B0-D11B-4F9D-B285-703D8AC0BA90_gui\" bpmnElement=\"sid-910420B0-D11B-4F9D-B285-703D8AC0BA90\">\n        <omgdi:waypoint x=\"565\" y=\"155\" />\n        <omgdi:waypoint x=\"610\" y=\"155\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"expandedProcess_gui\" bpmnElement=\"expandedProcess\" isExpanded=\"true\">\n        <omgdc:Bounds x=\"370\" y=\"79\" width=\"288\" height=\"151\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-592ddc98-48fc-42b3-b7f9-1df8b6d368c5\">\n          <omgdc:Bounds x=\"378\" y=\"89\" width=\"65.57142639160156\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-EE9F103D-15EA-4FBB-A4DB-8B94E5F04390_gui\" bpmnElement=\"sid-EE9F103D-15EA-4FBB-A4DB-8B94E5F04390\">\n        <omgdc:Bounds x=\"703\" y=\"141\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657_gui\" bpmnElement=\"sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657\">\n        <omgdi:waypoint x=\"180\" y=\"155\" />\n        <omgdi:waypoint x=\"225\" y=\"155\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-FB543319-8DFB-4445-AAA3-720137FB230B_gui\" bpmnElement=\"sid-FB543319-8DFB-4445-AAA3-720137FB230B\">\n        <omgdi:waypoint x=\"325\" y=\"154.89539748953976\" />\n        <omgdi:waypoint x=\"370\" y=\"154.80125523012552\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0_gui\" bpmnElement=\"sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0\">\n        <omgdi:waypoint x=\"658\" y=\"154.85467980295567\" />\n        <omgdi:waypoint x=\"703\" y=\"154.9655172413793\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-592ddc98-48fc-42b3-b7f9-1df8b6d368c5\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"sid-0bbc44a9-8a6a-44a1-8b61-0cf870c26fe4\">\n    <bpmndi:BPMNPlane id=\"sid-275fa3fd-9114-4005-b305-71f6c1411c24\" bpmnElement=\"collapsedProcess_2\">\n      <bpmndi:BPMNShape id=\"sid-C67DBACD-2E96-4A69-97F0-9B04CCB255EC_gui\" bpmnElement=\"sid-C67DBACD-2E96-4A69-97F0-9B04CCB255EC\">\n        <omgdc:Bounds x=\"230\" y=\"130\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830_gui\" bpmnElement=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830\">\n        <omgdc:Bounds x=\"305\" y=\"105\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-efc2a4e3-a5c6-411d-80d4-64f3a53bc4a4\">\n          <omgdc:Bounds x=\"321.44285583496094\" y=\"131\" width=\"67.11428833007812\" height=\"24\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-987C40F8-82D3-4637-ABCE-A85A5E2AB8A9_gui\" bpmnElement=\"sid-987C40F8-82D3-4637-ABCE-A85A5E2AB8A9\">\n        <omgdc:Bounds x=\"450\" y=\"131\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-A7460113-CB75-491D-817B-5E1A8C606B8C_gui\" bpmnElement=\"sid-A7460113-CB75-491D-817B-5E1A8C606B8C\">\n        <omgdi:waypoint x=\"260\" y=\"145\" />\n        <omgdi:waypoint x=\"305\" y=\"145\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-01982395-64E8-43EF-A6D3-CDD276C312AA_gui\" bpmnElement=\"sid-01982395-64E8-43EF-A6D3-CDD276C312AA\">\n        <omgdi:waypoint x=\"405\" y=\"145\" />\n        <omgdi:waypoint x=\"450\" y=\"145\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-efc2a4e3-a5c6-411d-80d4-64f3a53bc4a4\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"sid-19b0e874-234e-4bee-b83c-068fe088c591\">\n    <bpmndi:BPMNPlane id=\"sid-89d69f37-848f-4da3-bb9a-df3a9889286d\" bpmnElement=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B\">\n      <bpmndi:BPMNShape id=\"sid-A13CFBB9-5471-4439-96FA-B65862CA7B21_gui\" bpmnElement=\"sid-A13CFBB9-5471-4439-96FA-B65862CA7B21\">\n        <omgdc:Bounds x=\"190\" y=\"170\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-ECEB5194-0BF8-4913-A76F-963DC1FD1D7F_gui\" bpmnElement=\"sid-ECEB5194-0BF8-4913-A76F-963DC1FD1D7F\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"265\" y=\"145\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-3bb65e49-bd30-45eb-a52f-e94a5e93edbc\">\n          <omgdc:Bounds x=\"281.09214210510254\" y=\"177\" width=\"67.88571548461914\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-5DCDF44C-56B4-47A2-9085-00004E76F3A8_gui\" bpmnElement=\"sid-5DCDF44C-56B4-47A2-9085-00004E76F3A8\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"410\" y=\"145\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-3bb65e49-bd30-45eb-a52f-e94a5e93edbc\">\n          <omgdc:Bounds x=\"424.5492877960205\" y=\"165\" width=\"70.9714241027832\" height=\"36\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-345BB5A6-CE3B-4711-972A-81E47BA4B667_gui\" bpmnElement=\"sid-345BB5A6-CE3B-4711-972A-81E47BA4B667\">\n        <omgdc:Bounds x=\"555\" y=\"171\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-E71F5783-AFE7-44ED-8A9C-378C95087448_gui\" bpmnElement=\"sid-E71F5783-AFE7-44ED-8A9C-378C95087448\">\n        <omgdi:waypoint x=\"220\" y=\"185\" />\n        <omgdi:waypoint x=\"265\" y=\"185\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16_gui\" bpmnElement=\"sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16\">\n        <omgdi:waypoint x=\"365\" y=\"185\" />\n        <omgdi:waypoint x=\"410\" y=\"185\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519_gui\" bpmnElement=\"sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519\">\n        <omgdi:waypoint x=\"510\" y=\"185\" />\n        <omgdi:waypoint x=\"555\" y=\"185\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-3bb65e49-bd30-45eb-a52f-e94a5e93edbc\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"sid-5e1db01c-46b0-40b0-bb83-67add2799cae\">\n    <bpmndi:BPMNPlane id=\"sid-ecd0155e-80cf-40cd-85a9-edf72b8d2a6c\" bpmnElement=\"sid-ECEB5194-0BF8-4913-A76F-963DC1FD1D7F\">\n      <bpmndi:BPMNShape id=\"sid-F2CCFED7-AD11-4A21-80EE-71D9C96549C8_gui\" bpmnElement=\"sid-F2CCFED7-AD11-4A21-80EE-71D9C96549C8\">\n        <omgdc:Bounds x=\"310\" y=\"160\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-29B8F97B-1A0D-4280-A62D-5093316C484B_gui\" bpmnElement=\"sid-29B8F97B-1A0D-4280-A62D-5093316C484B\">\n        <omgdc:Bounds x=\"385\" y=\"135\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-2e7107aa-4946-4b44-a3c0-a137c1775d39\">\n          <omgdc:Bounds x=\"401.05714416503906\" y=\"167\" width=\"67.88571166992188\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-F5AE4FCD-976F-4426-B1FF-7FCAA4CE2393_gui\" bpmnElement=\"sid-F5AE4FCD-976F-4426-B1FF-7FCAA4CE2393\">\n        <omgdc:Bounds x=\"530\" y=\"161\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-3BB6D6CA-BF45-4D15-A1AB-64686C41DB32_gui\" bpmnElement=\"sid-3BB6D6CA-BF45-4D15-A1AB-64686C41DB32\">\n        <omgdi:waypoint x=\"340\" y=\"175\" />\n        <omgdi:waypoint x=\"385\" y=\"175\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-4E25B80E-EF68-4EE5-BB08-C1F54F1A7C39_gui\" bpmnElement=\"sid-4E25B80E-EF68-4EE5-BB08-C1F54F1A7C39\">\n        <omgdi:waypoint x=\"485\" y=\"175\" />\n        <omgdi:waypoint x=\"530\" y=\"175\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-2e7107aa-4946-4b44-a3c0-a137c1775d39\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"sid-63fc7b22-cc85-458f-aaab-e165a0e36240\">\n    <bpmndi:BPMNPlane id=\"sid-3f3c0ecd-73e0-4a0a-b05c-0b6bd60eeeb1\" bpmnElement=\"sid-5DCDF44C-56B4-47A2-9085-00004E76F3A8\">\n      <bpmndi:BPMNShape id=\"sid-2098A7EE-D7D8-405E-AF61-95BA48E891B6_gui\" bpmnElement=\"sid-2098A7EE-D7D8-405E-AF61-95BA48E891B6\">\n        <omgdc:Bounds x=\"240\" y=\"250\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB_gui\" bpmnElement=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB\">\n        <omgdc:Bounds x=\"315\" y=\"225\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-d93ac8fb-7a66-4ace-93a6-71582a8ab1a1\">\n          <omgdc:Bounds x=\"329.51428604125977\" y=\"245\" width=\"70.97142791748047\" height=\"36\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-DAFD7764-8FA5-417B-BB33-55E483687A7D_gui\" bpmnElement=\"sid-DAFD7764-8FA5-417B-BB33-55E483687A7D\">\n        <omgdc:Bounds x=\"460\" y=\"251\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC_gui\" bpmnElement=\"sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC\">\n        <omgdi:waypoint x=\"270\" y=\"265\" />\n        <omgdi:waypoint x=\"315\" y=\"265\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E_gui\" bpmnElement=\"sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E\">\n        <omgdi:waypoint x=\"415\" y=\"265\" />\n        <omgdi:waypoint x=\"460\" y=\"265\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-d93ac8fb-7a66-4ace-93a6-71582a8ab1a1\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n</definitions>"
  },
  {
    "path": "test/fixtures/bpmn/complex.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:signavio=\"http://www.signavio.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" exporter=\"Signavio Process Editor, http://www.signavio.com\" exporterVersion=\"6.2.1\" expressionLanguage=\"http://www.w3.org/1999/XPath\" id=\"sid-d5a68e61-ca67-438f-971d-6843c39b383e\" targetNamespace=\"http://www.signavio.com/bpmn20\" typeLanguage=\"http://www.w3.org/2001/XMLSchema\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n   <dataStore capacity=\"0\" id=\"sid-1f3b3b35-28a1-4fff-8835-ae271ef486d5\" isUnlimited=\"false\" name=\"HR-Tool\"/>\n   <collaboration id=\"sid-3524ea26-a8cb-4d8f-b997-347710bca219\">\n      <extensionElements/>\n      <participant id=\"sid-43B00F10-A229-44CF-BAD4-7F7147D380E9\" name=\"Führungskraft Fachbereich\">\n      </participant>\n      <participant id=\"sid-C08CDF7A-062A-4F46-80DA-02F243AB0B3F\" name=\"Management Arbeitsvertrag - &#10;Sachbearbeiter Personal\" processRef=\"sid-5F2C877A-F295-424C-A941-8AFE42AFD1AE\">\n      </participant>\n      <participant id=\"sid-1C31EF64-81F8-4886-88E9-434DF53A7B5F\" name=\"Bewerber\">\n      </participant>\n      <participant id=\"sid-CC1C0D76-B3D1-4A22-B9D8-8C8FA4D85FB7\" name=\"Bewerbungsprüfung - &#10;Führungskraft Fachbereich\" processRef=\"sid-05D31FB1-4A4B-4D41-8E51-BE08330D6013\">\n      </participant>\n      <participant id=\"sid-7BD88080-E847-40D9-9714-C838543CEC18\" name=\"Management Bewerbungsgespräche -&#10; Sachbearbeiter Personal\" processRef=\"sid-35DD95AD-CA27-4826-8E4F-351207D0FA1A\">\n      </participant>\n      <participant id=\"sid-CB881798-E52C-4F03-809F-765C5F84EE04\" name=\"Bewerbungsprüfung (fristgerecht) - Sachbearbeiter Personal\" processRef=\"sid-3C2D842A-E239-44F2-91A1-D809676A3462\">\n      </participant>\n      <participant id=\"sid-527C14AA-A993-4E8C-A9CD-99639DF62466\" name=\"Durchführung Bewerbungsgespräch - &#10;Sachbearbeiter Personal\" processRef=\"sid-D0B76975-2A71-4345-9861-401E7CB66AF6\">\n      </participant>\n      <participant id=\"sid-EEF891AC-F8A7-4623-9BA3-F560E2782C9D\" name=\"Führungskraft Fachbereich\">\n      </participant>\n      <participant id=\"sid-EED957F8-FF8A-4A3A-918A-944B41FF5D4D\" name=\"Bewerbungsprüfung - &#10;Führungskraft Fachbereich\" processRef=\"sid-83C27632-EEB8-4D1E-8F8B-BFCBBD2B88E8\">\n      </participant>\n      <participant id=\"sid-C583AB0E-16D2-4440-973E-F03090497640\" name=\"Bewerber\">\n      </participant>\n      <participant id=\"sid-A280AE73-E103-45BC-8078-8ADB6A8AF29C\" name=\"Bewerbungsprüfung - &#10;Sachbearbeiter Personal\" processRef=\"sid-F0778AC8-E593-4FF9-8CCE-C71768DF3E0D\">\n      </participant>\n      <participant id=\"sid-19D91440-484D-4E64-BC61-4ADA8E26CA29\" name=\"Bewerber-Beurteilung - &#10;Führungskraft Fachbereich\" processRef=\"sid-D042A222-1E2E-4AE5-A062-1CB78A7CD324\">\n      </participant>\n      <participant id=\"sid-C95FEFFE-4759-4ABA-B11D-E4BA65DA268F\" name=\"Bewerber\">\n      </participant>\n      <participant id=\"sid-2E859D5D-83B3-461D-9FFF-2AAF49E71D2A\" name=\"Bewerber\">\n      </participant>\n      <participant id=\"sid-F18FD2E3-46A6-4E86-9AA9-D67094D0DCE7\" name=\"Führungskraft Fachbereich\">\n      </participant>\n      <participant id=\"sid-6C68E5FA-5812-446E-A335-AD6B18AD9BC6\" name=\"Bewerber\">\n      </participant>\n      <participant id=\"sid-187453C6-5AB5-4A6D-9A62-BF537E04EA0D\" name=\"Bewerbungseingang - &#10;Sachbearbeiter Personal\" processRef=\"sid-67C91933-43BF-4B55-A9FA-BB741C03A8C4\">\n      </participant>\n      <messageFlow id=\"sid-9C99A596-2527-45AC-9ABB-6626A36DB292\" sourceRef=\"sid-C5457771-C93B-44FD-8D70-05849F25C775\" targetRef=\"sid-6C68E5FA-5812-446E-A335-AD6B18AD9BC6\">\n      </messageFlow>\n      <messageFlow id=\"sid-8B230C74-C9AA-43B1-953D-5BF07007A5FF\" sourceRef=\"sid-F197542D-D274-45BE-95A5-7A3608BBE27A\" targetRef=\"sid-36E152C5-1864-4D96-9F9B-27133FD47EFE\">\n      </messageFlow>\n      <messageFlow id=\"sid-D974B6C2-C395-4788-8AC8-28BAC3DEB097\" sourceRef=\"sid-C95FEFFE-4759-4ABA-B11D-E4BA65DA268F\" targetRef=\"sid-5695269D-E801-4953-B48D-EB281E7316F7\">\n      </messageFlow>\n      <messageFlow id=\"sid-4419C1F2-A991-4A8F-B055-31790C2A4425\" sourceRef=\"sid-8CE3896D-0181-49CE-A1A9-C085262DA0FA\" targetRef=\"sid-B7711D66-52EB-4437-AA0C-5671CE83C6E6\">\n      </messageFlow>\n      <messageFlow id=\"sid-6BFB777A-C370-4A2B-A6AA-82581B15C84E\" sourceRef=\"sid-BFDE4B6A-89F4-415B-8A22-7BA82C441A65\" targetRef=\"sid-43B00F10-A229-44CF-BAD4-7F7147D380E9\">\n      </messageFlow>\n      <messageFlow id=\"sid-03040B88-2530-4CC1-B5D2-B52CFA3F4144\" sourceRef=\"sid-2E859D5D-83B3-461D-9FFF-2AAF49E71D2A\" targetRef=\"sid-155B51B2-12E4-4A0B-AFDF-DDBA2EE093D5\">\n      </messageFlow>\n      <messageFlow id=\"sid-83275776-30AE-4168-9311-18544B088890\" sourceRef=\"sid-286F337E-9361-4B4D-AF78-7E403CA80DA1\" targetRef=\"sid-EEF891AC-F8A7-4623-9BA3-F560E2782C9D\">\n      </messageFlow>\n      <messageFlow id=\"sid-91E5F463-9CDA-4B49-8BB1-BD4C050EBBB2\" sourceRef=\"sid-C583AB0E-16D2-4440-973E-F03090497640\" targetRef=\"sid-8910ED9B-DADC-4E11-9AD5-E12448B57ADF\">\n      </messageFlow>\n      <messageFlow id=\"sid-71473AE9-0707-44B9-A0D3-C315677EFA05\" sourceRef=\"sid-B316767E-63CE-4A62-A9BF-AB4F0A0D517F\" targetRef=\"sid-1C31EF64-81F8-4886-88E9-434DF53A7B5F\">\n      </messageFlow>\n      <messageFlow id=\"sid-AC383C65-2E51-4F3E-ACE4-C973310B1447\" sourceRef=\"sid-1F104A2B-C7CC-49E1-87F1-8391D31274BE\" targetRef=\"sid-6C68E5FA-5812-446E-A335-AD6B18AD9BC6\">\n      </messageFlow>\n      <messageFlow id=\"sid-37532634-B172-4542-96A6-7E347E3CEA37\" sourceRef=\"sid-597B2F0C-9759-421B-8F52-D8F26705F2BE\" targetRef=\"sid-36E152C5-1864-4D96-9F9B-27133FD47EFE\">\n      </messageFlow>\n      <messageFlow id=\"sid-D4887F44-4F7F-47A6-9802-908D44DF7A6D\" sourceRef=\"sid-8ED06068-AA04-428D-860D-8CA2A0483C2A\" targetRef=\"sid-36E152C5-1864-4D96-9F9B-27133FD47EFE\">\n      </messageFlow>\n      <messageFlow id=\"sid-A6C70715-D7C5-46FB-8ADB-0DC89B3991FD\" sourceRef=\"sid-FF2BEA0D-55D5-4F2B-B7BA-195BC10CA9EB\" targetRef=\"sid-C583AB0E-16D2-4440-973E-F03090497640\">\n      </messageFlow>\n      <messageFlow id=\"sid-CD6D8956-F668-4D01-A8D1-C4D9643A2375\" sourceRef=\"sid-8376EFE7-7178-4B72-AF75-4CD3BCDCA599\" targetRef=\"sid-1C31EF64-81F8-4886-88E9-434DF53A7B5F\">\n      </messageFlow>\n      <messageFlow id=\"sid-606B1F31-96AA-4799-8E9E-C4E6A968A715\" sourceRef=\"sid-6C68E5FA-5812-446E-A335-AD6B18AD9BC6\" targetRef=\"sid-C5457771-C93B-44FD-8D70-05849F25C775\">\n      </messageFlow>\n      <messageFlow id=\"sid-1E7B8929-56CE-43DA-9B85-B91426258E04\" sourceRef=\"sid-C583AB0E-16D2-4440-973E-F03090497640\" targetRef=\"sid-6EED0CFD-023A-4ACC-B944-42D90A617BDF\">\n      </messageFlow>\n      <messageFlow id=\"sid-FD240858-85C6-4D1A-9336-5E043D753A72\" sourceRef=\"sid-8700D448-747C-4559-9A57-BFE8AAD639D4\" targetRef=\"sid-691FDEB6-F626-4AB1-8E90-3653C83C04EA\">\n      </messageFlow>\n      <messageFlow id=\"sid-B28E079A-EC0B-4A89-9BF3-6850173FADFC\" sourceRef=\"sid-4F2CDAD6-92D6-470B-B82C-8D07E050591A\" targetRef=\"sid-42305309-4E98-47F0-80C4-690E2DB222C0\">\n      </messageFlow>\n      <messageFlow id=\"sid-DE7499BF-C4BD-4189-890C-F215087A424D\" sourceRef=\"sid-5695269D-E801-4953-B48D-EB281E7316F7\" targetRef=\"sid-C95FEFFE-4759-4ABA-B11D-E4BA65DA268F\">\n      </messageFlow>\n      <messageFlow id=\"sid-939F496E-402A-4FCF-9A6F-C138E1A4F2DA\" sourceRef=\"sid-1C31EF64-81F8-4886-88E9-434DF53A7B5F\" targetRef=\"sid-158F070A-F137-4B82-8403-261AA7E86AB6\">\n      </messageFlow>\n      <messageFlow id=\"sid-F9BB69AC-3000-4C14-94DC-8CC8D3F2B65D\" sourceRef=\"sid-303796CF-BA87-40A7-B2EC-9F6E10BD1060\" targetRef=\"sid-991275D8-E60A-440A-B2DD-094D2B0049A4\">\n      </messageFlow>\n      <messageFlow id=\"sid-309F9D94-670D-47BA-9511-3AB7AB0B9A83\" sourceRef=\"sid-05FFFE92-8A4C-43AB-8D9A-E14A1B0EE051\" targetRef=\"sid-C583AB0E-16D2-4440-973E-F03090497640\">\n      </messageFlow>\n      <messageFlow id=\"sid-D42DDB33-3FF9-4C9A-A310-F65810A07BC6\" sourceRef=\"sid-1C31EF64-81F8-4886-88E9-434DF53A7B5F\" targetRef=\"sid-8376EFE7-7178-4B72-AF75-4CD3BCDCA599\">\n      </messageFlow>\n      <messageFlow id=\"sid-95BFCA10-63D0-4D29-8E56-2270CACF3BA8\" sourceRef=\"sid-0C2D523B-E4EB-4776-AFA3-43B156AAE378\" targetRef=\"sid-D3CA93A5-3BCC-4DB3-8075-EAC0C0A53991\">\n      </messageFlow>\n      <messageFlow id=\"sid-09BC5894-5810-439D-9A36-FEF0B083B598\" sourceRef=\"sid-2EE25CB0-E8BA-491E-A773-BD4B27643246\" targetRef=\"sid-43B00F10-A229-44CF-BAD4-7F7147D380E9\">\n      </messageFlow>\n      <messageFlow id=\"sid-B8825EB2-D9F8-4506-BB4A-0330FF0FFAA9\" sourceRef=\"sid-155B51B2-12E4-4A0B-AFDF-DDBA2EE093D5\" targetRef=\"sid-2E859D5D-83B3-461D-9FFF-2AAF49E71D2A\">\n      </messageFlow>\n      <messageFlow id=\"sid-C529D2AE-4E4C-4985-A8CB-E6E74673BCAE\" sourceRef=\"sid-C583AB0E-16D2-4440-973E-F03090497640\" targetRef=\"sid-05FFFE92-8A4C-43AB-8D9A-E14A1B0EE051\">\n      </messageFlow>\n      <messageFlow id=\"sid-C41799EC-DD3A-4ED3-9E55-776983B28363\" sourceRef=\"sid-D453B3D6-0EA6-4607-A413-C6332ABE9F32\" targetRef=\"sid-F18FD2E3-46A6-4E86-9AA9-D67094D0DCE7\">\n      </messageFlow>\n      <messageFlow id=\"sid-2DE50901-E357-426B-AC39-60EA1842B6FA\" sourceRef=\"sid-6C68E5FA-5812-446E-A335-AD6B18AD9BC6\" targetRef=\"sid-9838543B-F6B3-4432-A9B3-8B790A762147\">\n      </messageFlow>\n   </collaboration>\n   <process id=\"sid-67C91933-43BF-4B55-A9FA-BB741C03A8C4\" isClosed=\"false\" isExecutable=\"false\" name=\"Bewerbungseingang - &#10;Sachbearbeiter Personal\" processType=\"None\">\n      <extensionElements/>\n      <laneSet id=\"sid-39cdd7f8-075e-4f93-a903-4ee6ec2494d8\">\n         <lane id=\"sid-E391B624-F6E8-428B-9C3E-7026F85C4F24\">\n            <flowNodeRef>sid-8E5D2B9D-6731-4FA7-BB27-C444A7236A69</flowNodeRef>\n            <flowNodeRef>sid-028EEE79-92D7-4C1B-B90D-905AA2697614</flowNodeRef>\n            <flowNodeRef>sid-7C1A234F-E066-438E-96E1-C0D7847288EA</flowNodeRef>\n            <flowNodeRef>sid-6EED0CFD-023A-4ACC-B944-42D90A617BDF</flowNodeRef>\n            <flowNodeRef>sid-CCECC1E8-CA9C-49BB-BEDF-75F173A11194</flowNodeRef>\n            <flowNodeRef>sid-F1FC14E4-8BBB-4647-9F9D-179663172496</flowNodeRef>\n            <flowNodeRef>sid-FF2BEA0D-55D5-4F2B-B7BA-195BC10CA9EB</flowNodeRef>\n            <flowNodeRef>sid-8910ED9B-DADC-4E11-9AD5-E12448B57ADF</flowNodeRef>\n            <flowNodeRef>sid-545B3227-D12A-43A8-B746-55E8C75F3A8A</flowNodeRef>\n            <flowNodeRef>sid-0FE7F936-F79B-4EB8-95F0-DC0AB97C682F</flowNodeRef>\n            <flowNodeRef>sid-05FFFE92-8A4C-43AB-8D9A-E14A1B0EE051</flowNodeRef>\n            <flowNodeRef>sid-28EA3990-9252-49F9-AD56-8FCDBFD7DA7D</flowNodeRef>\n            <flowNodeRef>sid-25203984-1D0A-494D-AD69-9140631D10FD</flowNodeRef>\n            <flowNodeRef>sid-6243D8FF-E57D-4D03-8234-40836D4E60D5</flowNodeRef>\n            <flowNodeRef>sid-72EBDBE9-3856-4AF7-9DDB-7C0F478E26D8</flowNodeRef>\n            <flowNodeRef>sid-57892D76-E413-4274-B8DE-FED72250C8A7</flowNodeRef>\n            <flowNodeRef>sid-6392228F-E287-40F3-9DD6-B91493F6B671</flowNodeRef>\n            <flowNodeRef>sid-EC21E3DA-12C5-4B74-83F7-530229F6C777</flowNodeRef>\n         </lane>\n      </laneSet>\n      <task completionQuantity=\"1\" id=\"sid-8E5D2B9D-6731-4FA7-BB27-C444A7236A69\" isForCompensation=\"false\" name=\"Bewertung erfassen\" startQuantity=\"1\">\n         <incoming>sid-A83B900A-A119-4FC4-A77F-09849C8660C9</incoming>\n         <outgoing>sid-4A0A3787-3011-42F1-8CF7-16479922159E</outgoing>\n      </task>\n      <task completionQuantity=\"1\" id=\"sid-028EEE79-92D7-4C1B-B90D-905AA2697614\" isForCompensation=\"false\" name=\"Bewerbung ablegen\" startQuantity=\"1\">\n         <incoming>sid-4A0A3787-3011-42F1-8CF7-16479922159E</incoming>\n         <outgoing>sid-8F7A2A97-7C59-4B9E-AE03-625BB085C0E4</outgoing>\n         <dataOutputAssociation id=\"sid-1C8DEB94-31C4-47FE-AA84-605810C351AF\">\n            <sourceRef>sid-028EEE79-92D7-4C1B-B90D-905AA2697614</sourceRef>\n            <targetRef>sid-E8C87193-03FE-438D-A921-0BAB9FBD08D9</targetRef>\n         </dataOutputAssociation>\n      </task>\n      <endEvent id=\"sid-7C1A234F-E066-438E-96E1-C0D7847288EA\" name=\"Bewerbung&#10;geprüft\">\n         <incoming>sid-8F7A2A97-7C59-4B9E-AE03-625BB085C0E4</incoming>\n      </endEvent>\n      <startEvent id=\"sid-6EED0CFD-023A-4ACC-B944-42D90A617BDF\" isInterrupting=\"true\" name=\"Bewerbung &#10;eingegangen\">\n         <outgoing>sid-7E6EBD99-9B3A-44CE-972E-9CCDA7924AD8</outgoing>\n         <messageEventDefinition id=\"sid-53384a61-8cf5-472a-bb4a-22e4c278f93d\"/>\n      </startEvent>\n      <task completionQuantity=\"1\" id=\"sid-CCECC1E8-CA9C-49BB-BEDF-75F173A11194\" isForCompensation=\"false\" name=\"Vollständigkeit der Bewerbung &#10;prüfen\" startQuantity=\"1\">\n         <incoming>sid-FD9AF1C4-E124-4C55-9B18-87804F8EC67E</incoming>\n         <outgoing>sid-85F7873E-4458-4406-9D6E-1F4CA6268D55</outgoing>\n      </task>\n      <exclusiveGateway gatewayDirection=\"Diverging\" id=\"sid-F1FC14E4-8BBB-4647-9F9D-179663172496\" name=\"Bewerbung &#10;fehlerhaft &#10;oder &#10;unvollständig?\">\n         <incoming>sid-85F7873E-4458-4406-9D6E-1F4CA6268D55</incoming>\n         <outgoing>sid-0D428B09-7C49-44AE-A257-7E810A541B0F</outgoing>\n         <outgoing>sid-F86867DE-BA70-47C1-8340-A6A5A3B645AA</outgoing>\n      </exclusiveGateway>\n      <task completionQuantity=\"1\" id=\"sid-FF2BEA0D-55D5-4F2B-B7BA-195BC10CA9EB\" isForCompensation=\"false\" name=\"Rückmeldung versenden\" startQuantity=\"1\">\n         <incoming>sid-F86867DE-BA70-47C1-8340-A6A5A3B645AA</incoming>\n         <outgoing>sid-DC611CCE-BA2C-459D-974D-4D09E2C390E6</outgoing>\n      </task>\n      <intermediateCatchEvent id=\"sid-8910ED9B-DADC-4E11-9AD5-E12448B57ADF\" name=\"weiterführende &#10;Informationen&#10; erhalten\">\n         <incoming>sid-B9DF0BE4-4658-4908-8E4C-B528E8EA1FDD</incoming>\n         <outgoing>sid-7BA05743-5D0C-4D1C-B193-22FE2A156E22</outgoing>\n         <messageEventDefinition id=\"sid-311ec8d4-5c12-4c83-861f-5d6759cb5816\"/>\n      </intermediateCatchEvent>\n      <eventBasedGateway eventGatewayType=\"Exclusive\" gatewayDirection=\"Mixed\" id=\"sid-545B3227-D12A-43A8-B746-55E8C75F3A8A\" instantiate=\"false\">\n         <incoming>sid-DC611CCE-BA2C-459D-974D-4D09E2C390E6</incoming>\n         <incoming>sid-3C44D333-01F3-43B7-AE4F-F13DD6D05DAC</incoming>\n         <outgoing>sid-B9DF0BE4-4658-4908-8E4C-B528E8EA1FDD</outgoing>\n         <outgoing>sid-F9A96365-936B-4461-8D51-C38EBA362A68</outgoing>\n      </eventBasedGateway>\n      <intermediateCatchEvent id=\"sid-0FE7F936-F79B-4EB8-95F0-DC0AB97C682F\" name=\"Rückmeldefrist&#10;verstrichen\">\n         <incoming>sid-F9A96365-936B-4461-8D51-C38EBA362A68</incoming>\n         <outgoing>sid-9DE1A24F-5ED5-4095-B9C8-B7213895C7B7</outgoing>\n         <timerEventDefinition id=\"sid-fbc953bf-f275-4feb-8038-5522f5d28e40\"/>\n      </intermediateCatchEvent>\n      <task completionQuantity=\"1\" id=\"sid-05FFFE92-8A4C-43AB-8D9A-E14A1B0EE051\" isForCompensation=\"false\" name=\"Beim Bewerber &#10;nachfragen\" startQuantity=\"1\">\n         <incoming>sid-9DE1A24F-5ED5-4095-B9C8-B7213895C7B7</incoming>\n         <outgoing>sid-950B6B3A-BEDA-49E3-A901-6733165E80C3</outgoing>\n      </task>\n      <exclusiveGateway gatewayDirection=\"Diverging\" id=\"sid-28EA3990-9252-49F9-AD56-8FCDBFD7DA7D\" name=\"Bewerbung &#10;hinfällig?\">\n         <incoming>sid-950B6B3A-BEDA-49E3-A901-6733165E80C3</incoming>\n         <outgoing>sid-3C44D333-01F3-43B7-AE4F-F13DD6D05DAC</outgoing>\n         <outgoing>sid-E54CB8B4-BED9-43AF-B03B-DBE60483A68A</outgoing>\n      </exclusiveGateway>\n      <task completionQuantity=\"1\" id=\"sid-25203984-1D0A-494D-AD69-9140631D10FD\" isForCompensation=\"false\" name=\"Bewerbung zurücksenden\" startQuantity=\"1\">\n         <incoming>sid-AEE9D356-E86D-4D7A-ABC5-AA6E76635A57</incoming>\n         <outgoing>sid-C2A9F8A3-0E65-4BA2-A854-4B34EE2D2DFD</outgoing>\n      </task>\n      <endEvent id=\"sid-6243D8FF-E57D-4D03-8234-40836D4E60D5\" name=\"Bewerbung &#10;zurück&#10;gesendet\">\n         <incoming>sid-C2A9F8A3-0E65-4BA2-A854-4B34EE2D2DFD</incoming>\n      </endEvent>\n      <exclusiveGateway gatewayDirection=\"Converging\" id=\"sid-72EBDBE9-3856-4AF7-9DDB-7C0F478E26D8\">\n         <incoming>sid-7BA05743-5D0C-4D1C-B193-22FE2A156E22</incoming>\n         <incoming>sid-7E6EBD99-9B3A-44CE-972E-9CCDA7924AD8</incoming>\n         <outgoing>sid-FD9AF1C4-E124-4C55-9B18-87804F8EC67E</outgoing>\n      </exclusiveGateway>\n      <exclusiveGateway gatewayDirection=\"Diverging\" id=\"sid-57892D76-E413-4274-B8DE-FED72250C8A7\" name=\"Bewerbung &#10;inhaltlich ok?\">\n         <incoming>sid-62177F1C-D8D7-488A-9F8A-E379831B4792</incoming>\n         <outgoing>sid-A83B900A-A119-4FC4-A77F-09849C8660C9</outgoing>\n         <outgoing>sid-8BC0544C-1924-4422-B5BE-5CC1501312F4</outgoing>\n      </exclusiveGateway>\n      <task completionQuantity=\"1\" id=\"sid-6392228F-E287-40F3-9DD6-B91493F6B671\" isForCompensation=\"false\" name=\"Bewerbung inhaltlich &#10;prüfen\" startQuantity=\"1\">\n         <incoming>sid-0D428B09-7C49-44AE-A257-7E810A541B0F</incoming>\n         <outgoing>sid-62177F1C-D8D7-488A-9F8A-E379831B4792</outgoing>\n      </task>\n      <exclusiveGateway gatewayDirection=\"Converging\" id=\"sid-EC21E3DA-12C5-4B74-83F7-530229F6C777\">\n         <incoming>sid-E54CB8B4-BED9-43AF-B03B-DBE60483A68A</incoming>\n         <incoming>sid-8BC0544C-1924-4422-B5BE-5CC1501312F4</incoming>\n         <outgoing>sid-AEE9D356-E86D-4D7A-ABC5-AA6E76635A57</outgoing>\n      </exclusiveGateway>\n      <sequenceFlow id=\"sid-4A0A3787-3011-42F1-8CF7-16479922159E\" sourceRef=\"sid-8E5D2B9D-6731-4FA7-BB27-C444A7236A69\" targetRef=\"sid-028EEE79-92D7-4C1B-B90D-905AA2697614\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-8F7A2A97-7C59-4B9E-AE03-625BB085C0E4\" sourceRef=\"sid-028EEE79-92D7-4C1B-B90D-905AA2697614\" targetRef=\"sid-7C1A234F-E066-438E-96E1-C0D7847288EA\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-85F7873E-4458-4406-9D6E-1F4CA6268D55\" sourceRef=\"sid-CCECC1E8-CA9C-49BB-BEDF-75F173A11194\" targetRef=\"sid-F1FC14E4-8BBB-4647-9F9D-179663172496\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-0D428B09-7C49-44AE-A257-7E810A541B0F\" name=\"nein\" sourceRef=\"sid-F1FC14E4-8BBB-4647-9F9D-179663172496\" targetRef=\"sid-6392228F-E287-40F3-9DD6-B91493F6B671\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-DC611CCE-BA2C-459D-974D-4D09E2C390E6\" sourceRef=\"sid-FF2BEA0D-55D5-4F2B-B7BA-195BC10CA9EB\" targetRef=\"sid-545B3227-D12A-43A8-B746-55E8C75F3A8A\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-B9DF0BE4-4658-4908-8E4C-B528E8EA1FDD\" sourceRef=\"sid-545B3227-D12A-43A8-B746-55E8C75F3A8A\" targetRef=\"sid-8910ED9B-DADC-4E11-9AD5-E12448B57ADF\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-F9A96365-936B-4461-8D51-C38EBA362A68\" sourceRef=\"sid-545B3227-D12A-43A8-B746-55E8C75F3A8A\" targetRef=\"sid-0FE7F936-F79B-4EB8-95F0-DC0AB97C682F\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-9DE1A24F-5ED5-4095-B9C8-B7213895C7B7\" sourceRef=\"sid-0FE7F936-F79B-4EB8-95F0-DC0AB97C682F\" targetRef=\"sid-05FFFE92-8A4C-43AB-8D9A-E14A1B0EE051\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-950B6B3A-BEDA-49E3-A901-6733165E80C3\" sourceRef=\"sid-05FFFE92-8A4C-43AB-8D9A-E14A1B0EE051\" targetRef=\"sid-28EA3990-9252-49F9-AD56-8FCDBFD7DA7D\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-F86867DE-BA70-47C1-8340-A6A5A3B645AA\" name=\"ja\" sourceRef=\"sid-F1FC14E4-8BBB-4647-9F9D-179663172496\" targetRef=\"sid-FF2BEA0D-55D5-4F2B-B7BA-195BC10CA9EB\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-C2A9F8A3-0E65-4BA2-A854-4B34EE2D2DFD\" sourceRef=\"sid-25203984-1D0A-494D-AD69-9140631D10FD\" targetRef=\"sid-6243D8FF-E57D-4D03-8234-40836D4E60D5\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-3C44D333-01F3-43B7-AE4F-F13DD6D05DAC\" name=\"nein\" sourceRef=\"sid-28EA3990-9252-49F9-AD56-8FCDBFD7DA7D\" targetRef=\"sid-545B3227-D12A-43A8-B746-55E8C75F3A8A\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-7BA05743-5D0C-4D1C-B193-22FE2A156E22\" sourceRef=\"sid-8910ED9B-DADC-4E11-9AD5-E12448B57ADF\" targetRef=\"sid-72EBDBE9-3856-4AF7-9DDB-7C0F478E26D8\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-7E6EBD99-9B3A-44CE-972E-9CCDA7924AD8\" sourceRef=\"sid-6EED0CFD-023A-4ACC-B944-42D90A617BDF\" targetRef=\"sid-72EBDBE9-3856-4AF7-9DDB-7C0F478E26D8\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-FD9AF1C4-E124-4C55-9B18-87804F8EC67E\" sourceRef=\"sid-72EBDBE9-3856-4AF7-9DDB-7C0F478E26D8\" targetRef=\"sid-CCECC1E8-CA9C-49BB-BEDF-75F173A11194\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-62177F1C-D8D7-488A-9F8A-E379831B4792\" sourceRef=\"sid-6392228F-E287-40F3-9DD6-B91493F6B671\" targetRef=\"sid-57892D76-E413-4274-B8DE-FED72250C8A7\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-A83B900A-A119-4FC4-A77F-09849C8660C9\" name=\"ja\" sourceRef=\"sid-57892D76-E413-4274-B8DE-FED72250C8A7\" targetRef=\"sid-8E5D2B9D-6731-4FA7-BB27-C444A7236A69\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-AEE9D356-E86D-4D7A-ABC5-AA6E76635A57\" sourceRef=\"sid-EC21E3DA-12C5-4B74-83F7-530229F6C777\" targetRef=\"sid-25203984-1D0A-494D-AD69-9140631D10FD\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-E54CB8B4-BED9-43AF-B03B-DBE60483A68A\" name=\"ja\" sourceRef=\"sid-28EA3990-9252-49F9-AD56-8FCDBFD7DA7D\" targetRef=\"sid-EC21E3DA-12C5-4B74-83F7-530229F6C777\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-8BC0544C-1924-4422-B5BE-5CC1501312F4\" name=\"nein\" sourceRef=\"sid-57892D76-E413-4274-B8DE-FED72250C8A7\" targetRef=\"sid-EC21E3DA-12C5-4B74-83F7-530229F6C777\">\n      </sequenceFlow>\n      <dataStoreReference dataStoreRef=\"sid-1f3b3b35-28a1-4fff-8835-ae271ef486d5\" id=\"sid-E8C87193-03FE-438D-A921-0BAB9FBD08D9\" name=\"HR-Tool\">\n      </dataStoreReference>\n      <association associationDirection=\"None\" id=\"sid-23F431C6-D279-436A-86B4-9E6F3F05EFCC\" sourceRef=\"sid-25203984-1D0A-494D-AD69-9140631D10FD\" targetRef=\"sid-0862744E-76C7-4681-8759-7B8E629828B8\">\n      </association>\n      <textAnnotation id=\"sid-0862744E-76C7-4681-8759-7B8E629828B8\" textFormat=\"text/plain\">\n         <text>ID2</text>\n      </textAnnotation>\n   </process>\n   <process id=\"sid-5F2C877A-F295-424C-A941-8AFE42AFD1AE\" isClosed=\"false\" isExecutable=\"false\" name=\"Management Arbeitsvertrag - &#10;Sachbearbeiter Personal\" processType=\"None\">\n      <extensionElements/>\n      <laneSet id=\"sid-05e8ed6e-6ec1-4900-b078-853e9db02228\">\n         <lane id=\"sid-3E1FA189-AC8C-4CF1-9057-3D2EF8C6D3AF\">\n            <flowNodeRef>sid-B104C31F-A70F-4206-AF8E-442C5C2EEE49</flowNodeRef>\n            <flowNodeRef>sid-1F104A2B-C7CC-49E1-87F1-8391D31274BE</flowNodeRef>\n            <flowNodeRef>sid-AB73793C-D47A-4738-B34F-A82C6219A92C</flowNodeRef>\n            <flowNodeRef>sid-9838543B-F6B3-4432-A9B3-8B790A762147</flowNodeRef>\n            <flowNodeRef>sid-EA77B0E4-4512-4A05-B100-88605F5B7995</flowNodeRef>\n            <flowNodeRef>sid-2E9539B9-F0F1-4AEE-ADDB-4C8AD7A3920C</flowNodeRef>\n            <flowNodeRef>sid-4D91885E-63D7-460F-ACAB-3B1300D396FB</flowNodeRef>\n            <flowNodeRef>sid-C5457771-C93B-44FD-8D70-05849F25C775</flowNodeRef>\n            <flowNodeRef>sid-7C6C6457-0FF6-4074-BC87-D5653F7F8037</flowNodeRef>\n            <flowNodeRef>sid-C0A39E1E-6BA6-4A7C-98C4-597CEF56D803</flowNodeRef>\n            <flowNodeRef>sid-691FDEB6-F626-4AB1-8E90-3653C83C04EA</flowNodeRef>\n            <flowNodeRef>sid-DD0BC4E1-4AA3-4835-A477-373EA263A593</flowNodeRef>\n            <flowNodeRef>sid-D16273A3-B9E4-4D02-8072-3868DC29A662</flowNodeRef>\n            <flowNodeRef>sid-C01A5EDF-FDDA-4675-86DD-EC939CA503EA</flowNodeRef>\n            <flowNodeRef>sid-5C56D37A-6C15-43CB-8253-E56329A0F15B</flowNodeRef>\n            <flowNodeRef>sid-D453B3D6-0EA6-4607-A413-C6332ABE9F32</flowNodeRef>\n            <flowNodeRef>sid-07626FBD-C7FA-466D-AC08-F579B7A9C2EA</flowNodeRef>\n         </lane>\n      </laneSet>\n      <task completionQuantity=\"1\" id=\"sid-B104C31F-A70F-4206-AF8E-442C5C2EEE49\" isForCompensation=\"false\" name=\"Vorlage Arbeits-&#10;vertrag erstellen\" startQuantity=\"1\">\n         <incoming>sid-17FF4D83-66C9-45AC-8B63-3A4BC45B94B3</incoming>\n         <outgoing>sid-D833F570-90A1-46AB-B968-16751237C003</outgoing>\n      </task>\n      <task completionQuantity=\"1\" id=\"sid-1F104A2B-C7CC-49E1-87F1-8391D31274BE\" isForCompensation=\"false\" name=\"Arbeits-&#10;vertrag versenden\" startQuantity=\"1\">\n         <incoming>sid-D833F570-90A1-46AB-B968-16751237C003</incoming>\n         <outgoing>sid-A2B3A2C7-61FA-40F5-9AF0-27FF0B6DE47D</outgoing>\n      </task>\n      <eventBasedGateway eventGatewayType=\"Exclusive\" gatewayDirection=\"Mixed\" id=\"sid-AB73793C-D47A-4738-B34F-A82C6219A92C\" instantiate=\"false\">\n         <incoming>sid-A2B3A2C7-61FA-40F5-9AF0-27FF0B6DE47D</incoming>\n         <incoming>sid-6AD87C60-225D-4BAB-8EAE-3AB8D0C31754</incoming>\n         <outgoing>sid-B1598D75-E3CE-4CC5-8380-8FB570208B3B</outgoing>\n         <outgoing>sid-A2FA1E3C-8920-4F38-A2B1-BB75D9E33E85</outgoing>\n      </eventBasedGateway>\n      <intermediateCatchEvent id=\"sid-9838543B-F6B3-4432-A9B3-8B790A762147\" name=\"unterzeichneten&#10;Arbeitsvertrag&#10;erhalten\">\n         <incoming>sid-B1598D75-E3CE-4CC5-8380-8FB570208B3B</incoming>\n         <outgoing>sid-8110675A-7E69-4B6B-95B9-9DE5DEF4BF32</outgoing>\n         <messageEventDefinition id=\"sid-b786f138-fc0a-4a90-a3f8-b94d25594529\"/>\n      </intermediateCatchEvent>\n      <task completionQuantity=\"1\" id=\"sid-EA77B0E4-4512-4A05-B100-88605F5B7995\" isForCompensation=\"false\" name=\"Arbeits-&#10;vertrag &#10;archivieren\" startQuantity=\"1\">\n         <incoming>sid-E1876DA2-53A4-4F8B-8392-20655993C733</incoming>\n         <outgoing>sid-63119748-84AD-4A9B-8CDE-45B930B374B7</outgoing>\n      </task>\n      <endEvent id=\"sid-2E9539B9-F0F1-4AEE-ADDB-4C8AD7A3920C\" name=\"Stelle &#10;besetzt\">\n         <incoming>sid-63119748-84AD-4A9B-8CDE-45B930B374B7</incoming>\n      </endEvent>\n      <intermediateCatchEvent id=\"sid-4D91885E-63D7-460F-ACAB-3B1300D396FB\" name=\"Rückmeldefrist&#10;erreicht\">\n         <incoming>sid-A2FA1E3C-8920-4F38-A2B1-BB75D9E33E85</incoming>\n         <outgoing>sid-10D4CACF-4CA9-448C-93D1-BD9089C22BDE</outgoing>\n         <timerEventDefinition id=\"sid-0648e1e2-b801-4f82-94e5-2b455288cdbe\"/>\n      </intermediateCatchEvent>\n      <task completionQuantity=\"1\" id=\"sid-C5457771-C93B-44FD-8D70-05849F25C775\" isForCompensation=\"false\" name=\"Beim Bewerber &#10;nachfragen\" startQuantity=\"1\">\n         <incoming>sid-10D4CACF-4CA9-448C-93D1-BD9089C22BDE</incoming>\n         <outgoing>sid-BD42B065-FCDE-4B2A-9107-3602645F43B1</outgoing>\n      </task>\n      <exclusiveGateway gatewayDirection=\"Diverging\" id=\"sid-7C6C6457-0FF6-4074-BC87-D5653F7F8037\" name=\"auf &#10;Rückmeldung &#10;warten?\">\n         <incoming>sid-BD42B065-FCDE-4B2A-9107-3602645F43B1</incoming>\n         <outgoing>sid-17B8A293-C347-4830-BFA1-E4941E9B120F</outgoing>\n         <outgoing>sid-6AD87C60-225D-4BAB-8EAE-3AB8D0C31754</outgoing>\n      </exclusiveGateway>\n      <task completionQuantity=\"1\" id=\"sid-C0A39E1E-6BA6-4A7C-98C4-597CEF56D803\" isForCompensation=\"false\" name=\"Bewerbungs-&#10;daten aktualisieren\" startQuantity=\"1\">\n         <incoming>sid-17B8A293-C347-4830-BFA1-E4941E9B120F</incoming>\n         <outgoing>sid-73D82202-2D46-4210-9113-A2BE24C342C8</outgoing>\n      </task>\n      <startEvent id=\"sid-691FDEB6-F626-4AB1-8E90-3653C83C04EA\" isInterrupting=\"true\" name=\"Arbeitsvertrag &#10;erforderlich\">\n         <outgoing>sid-17FF4D83-66C9-45AC-8B63-3A4BC45B94B3</outgoing>\n         <messageEventDefinition id=\"sid-e1f2b16a-8e4f-47c7-a0e8-c9adfaadfd30\"/>\n      </startEvent>\n      <endEvent id=\"sid-DD0BC4E1-4AA3-4835-A477-373EA263A593\">\n         <incoming>sid-73D82202-2D46-4210-9113-A2BE24C342C8</incoming>\n      </endEvent>\n      <parallelGateway gatewayDirection=\"Diverging\" id=\"sid-D16273A3-B9E4-4D02-8072-3868DC29A662\">\n         <incoming>sid-8110675A-7E69-4B6B-95B9-9DE5DEF4BF32</incoming>\n         <outgoing>sid-E1876DA2-53A4-4F8B-8392-20655993C733</outgoing>\n         <outgoing>sid-FA4E05F6-ADB1-4F93-A0DA-3AEAEFB6D148</outgoing>\n         <outgoing>sid-E7730210-76BB-486F-BAB3-CA3994DF6AED</outgoing>\n      </parallelGateway>\n      <task completionQuantity=\"1\" id=\"sid-C01A5EDF-FDDA-4675-86DD-EC939CA503EA\" isForCompensation=\"false\" name=\"Bewerbungs-&#10;gespräch(e) absagen\" startQuantity=\"1\">\n         <incoming>sid-FA4E05F6-ADB1-4F93-A0DA-3AEAEFB6D148</incoming>\n         <outgoing>sid-713C88F2-5563-41E9-9351-F1FEEEBA72DA</outgoing>\n      </task>\n      <endEvent id=\"sid-5C56D37A-6C15-43CB-8253-E56329A0F15B\" name=\"Bewerbungs-&#10;gespräch(e)&#10;abgesagt\">\n         <incoming>sid-713C88F2-5563-41E9-9351-F1FEEEBA72DA</incoming>\n      </endEvent>\n      <task completionQuantity=\"1\" id=\"sid-D453B3D6-0EA6-4607-A413-C6332ABE9F32\" isForCompensation=\"false\" name=\"Fachbereich informieren\" startQuantity=\"1\">\n         <incoming>sid-E7730210-76BB-486F-BAB3-CA3994DF6AED</incoming>\n         <outgoing>sid-2365FF07-4092-4B79-976A-AD192FE4E4E9</outgoing>\n      </task>\n      <endEvent id=\"sid-07626FBD-C7FA-466D-AC08-F579B7A9C2EA\" name=\"Fachbereich &#10;informiert\">\n         <incoming>sid-2365FF07-4092-4B79-976A-AD192FE4E4E9</incoming>\n      </endEvent>\n      <sequenceFlow id=\"sid-D833F570-90A1-46AB-B968-16751237C003\" sourceRef=\"sid-B104C31F-A70F-4206-AF8E-442C5C2EEE49\" targetRef=\"sid-1F104A2B-C7CC-49E1-87F1-8391D31274BE\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-A2B3A2C7-61FA-40F5-9AF0-27FF0B6DE47D\" sourceRef=\"sid-1F104A2B-C7CC-49E1-87F1-8391D31274BE\" targetRef=\"sid-AB73793C-D47A-4738-B34F-A82C6219A92C\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-B1598D75-E3CE-4CC5-8380-8FB570208B3B\" sourceRef=\"sid-AB73793C-D47A-4738-B34F-A82C6219A92C\" targetRef=\"sid-9838543B-F6B3-4432-A9B3-8B790A762147\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-8110675A-7E69-4B6B-95B9-9DE5DEF4BF32\" sourceRef=\"sid-9838543B-F6B3-4432-A9B3-8B790A762147\" targetRef=\"sid-D16273A3-B9E4-4D02-8072-3868DC29A662\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-63119748-84AD-4A9B-8CDE-45B930B374B7\" sourceRef=\"sid-EA77B0E4-4512-4A05-B100-88605F5B7995\" targetRef=\"sid-2E9539B9-F0F1-4AEE-ADDB-4C8AD7A3920C\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-A2FA1E3C-8920-4F38-A2B1-BB75D9E33E85\" sourceRef=\"sid-AB73793C-D47A-4738-B34F-A82C6219A92C\" targetRef=\"sid-4D91885E-63D7-460F-ACAB-3B1300D396FB\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-10D4CACF-4CA9-448C-93D1-BD9089C22BDE\" sourceRef=\"sid-4D91885E-63D7-460F-ACAB-3B1300D396FB\" targetRef=\"sid-C5457771-C93B-44FD-8D70-05849F25C775\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-BD42B065-FCDE-4B2A-9107-3602645F43B1\" sourceRef=\"sid-C5457771-C93B-44FD-8D70-05849F25C775\" targetRef=\"sid-7C6C6457-0FF6-4074-BC87-D5653F7F8037\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-17B8A293-C347-4830-BFA1-E4941E9B120F\" name=\"nein\" sourceRef=\"sid-7C6C6457-0FF6-4074-BC87-D5653F7F8037\" targetRef=\"sid-C0A39E1E-6BA6-4A7C-98C4-597CEF56D803\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-6AD87C60-225D-4BAB-8EAE-3AB8D0C31754\" name=\"ja\" sourceRef=\"sid-7C6C6457-0FF6-4074-BC87-D5653F7F8037\" targetRef=\"sid-AB73793C-D47A-4738-B34F-A82C6219A92C\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-17FF4D83-66C9-45AC-8B63-3A4BC45B94B3\" sourceRef=\"sid-691FDEB6-F626-4AB1-8E90-3653C83C04EA\" targetRef=\"sid-B104C31F-A70F-4206-AF8E-442C5C2EEE49\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-73D82202-2D46-4210-9113-A2BE24C342C8\" sourceRef=\"sid-C0A39E1E-6BA6-4A7C-98C4-597CEF56D803\" targetRef=\"sid-DD0BC4E1-4AA3-4835-A477-373EA263A593\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-E1876DA2-53A4-4F8B-8392-20655993C733\" sourceRef=\"sid-D16273A3-B9E4-4D02-8072-3868DC29A662\" targetRef=\"sid-EA77B0E4-4512-4A05-B100-88605F5B7995\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-FA4E05F6-ADB1-4F93-A0DA-3AEAEFB6D148\" sourceRef=\"sid-D16273A3-B9E4-4D02-8072-3868DC29A662\" targetRef=\"sid-C01A5EDF-FDDA-4675-86DD-EC939CA503EA\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-713C88F2-5563-41E9-9351-F1FEEEBA72DA\" sourceRef=\"sid-C01A5EDF-FDDA-4675-86DD-EC939CA503EA\" targetRef=\"sid-5C56D37A-6C15-43CB-8253-E56329A0F15B\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-E7730210-76BB-486F-BAB3-CA3994DF6AED\" sourceRef=\"sid-D16273A3-B9E4-4D02-8072-3868DC29A662\" targetRef=\"sid-D453B3D6-0EA6-4607-A413-C6332ABE9F32\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-2365FF07-4092-4B79-976A-AD192FE4E4E9\" sourceRef=\"sid-D453B3D6-0EA6-4607-A413-C6332ABE9F32\" targetRef=\"sid-07626FBD-C7FA-466D-AC08-F579B7A9C2EA\">\n      </sequenceFlow>\n      <association associationDirection=\"None\" id=\"sid-457D4D89-6475-43CD-AB4E-0EC19248E141\" sourceRef=\"sid-B104C31F-A70F-4206-AF8E-442C5C2EEE49\" targetRef=\"sid-4FEF9487-CB3D-4D59-9804-557A8AE86B48\">\n      </association>\n      <association associationDirection=\"None\" id=\"sid-DD656687-20A5-4FD7-ADB7-30A876FAFB3E\" sourceRef=\"sid-C0A39E1E-6BA6-4A7C-98C4-597CEF56D803\" targetRef=\"sid-F767618B-825D-4952-95F9-8FDA8D10C596\">\n      </association>\n      <association associationDirection=\"None\" id=\"sid-469B5AE7-5988-46A4-B631-4E4970E06765\" sourceRef=\"sid-C01A5EDF-FDDA-4675-86DD-EC939CA503EA\" targetRef=\"sid-0048F8AB-F92F-4371-9661-82765136E785\">\n      </association>\n      <association associationDirection=\"None\" id=\"sid-ABF5CB6D-CFF9-445A-99DF-C541EF0CF6B8\" sourceRef=\"sid-2E9539B9-F0F1-4AEE-ADDB-4C8AD7A3920C\" targetRef=\"sid-B35D2825-DC27-4D6C-81EB-160C5741F700\">\n      </association>\n      <textAnnotation id=\"sid-4FEF9487-CB3D-4D59-9804-557A8AE86B48\" textFormat=\"text/plain\">\n         <text>ID12</text>\n      </textAnnotation>\n      <textAnnotation id=\"sid-F767618B-825D-4952-95F9-8FDA8D10C596\" textFormat=\"text/plain\">\n         <text>ID8,9</text>\n      </textAnnotation>\n      <textAnnotation id=\"sid-0048F8AB-F92F-4371-9661-82765136E785\" textFormat=\"text/plain\">\n         <text>ID11</text>\n      </textAnnotation>\n      <textAnnotation id=\"sid-B35D2825-DC27-4D6C-81EB-160C5741F700\" textFormat=\"text/plain\">\n         <text>ID10</text>\n      </textAnnotation>\n   </process>\n   <process id=\"sid-83C27632-EEB8-4D1E-8F8B-BFCBBD2B88E8\" isClosed=\"false\" isExecutable=\"false\" name=\"Bewerbungsprüfung - &#10;Führungskraft Fachbereich\" processType=\"None\">\n      <extensionElements/>\n      <laneSet id=\"sid-506214d8-8005-40b8-949a-86b85e7605ca\">\n         <lane id=\"sid-B8B18E3A-EF8D-4D19-B5CD-C666D39E2E0D\">\n            <flowNodeRef>sid-991275D8-E60A-440A-B2DD-094D2B0049A4</flowNodeRef>\n            <flowNodeRef>sid-19BF350B-2D34-4049-B17C-AE0265F407CB</flowNodeRef>\n            <flowNodeRef>sid-D56D4E10-864F-4B2B-898E-AA9641C98E63</flowNodeRef>\n            <flowNodeRef>sid-0C2D523B-E4EB-4776-AFA3-43B156AAE378</flowNodeRef>\n         </lane>\n      </laneSet>\n      <startEvent id=\"sid-991275D8-E60A-440A-B2DD-094D2B0049A4\" isInterrupting=\"true\" name=\"Liste aller&#10;Bewerber &#10;übergeben\">\n         <outgoing>sid-2D215BCD-C98A-4B3A-B255-EDCE32FF2A97</outgoing>\n         <messageEventDefinition id=\"sid-ce5eed97-3a08-4f4a-be3c-7c1bae8d52b5\"/>\n      </startEvent>\n      <task completionQuantity=\"1\" id=\"sid-19BF350B-2D34-4049-B17C-AE0265F407CB\" isForCompensation=\"false\" name=\"Bewerbung prüfen\" startQuantity=\"1\">\n         <incoming>sid-2D215BCD-C98A-4B3A-B255-EDCE32FF2A97</incoming>\n         <outgoing>sid-0B7D8255-893E-404A-B0EF-CCB418B98B58</outgoing>\n         <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-0d3db5bd-a483-425f-9276-a7a38102ec45\" isSequential=\"false\"/>\n      </task>\n      <task completionQuantity=\"1\" id=\"sid-D56D4E10-864F-4B2B-898E-AA9641C98E63\" isForCompensation=\"false\" name=\"Potentielle Kandidaten markieren\" startQuantity=\"1\">\n         <incoming>sid-0B7D8255-893E-404A-B0EF-CCB418B98B58</incoming>\n         <outgoing>sid-73C9EBCD-9625-4469-B4AD-87B829C4BD8B</outgoing>\n      </task>\n      <endEvent id=\"sid-0C2D523B-E4EB-4776-AFA3-43B156AAE378\" name=\"Bewerber &#10;geprüft\">\n         <incoming>sid-73C9EBCD-9625-4469-B4AD-87B829C4BD8B</incoming>\n         <messageEventDefinition id=\"sid-e9b6617d-341e-4635-9fc5-97e9db07631c\"/>\n      </endEvent>\n      <sequenceFlow id=\"sid-2D215BCD-C98A-4B3A-B255-EDCE32FF2A97\" sourceRef=\"sid-991275D8-E60A-440A-B2DD-094D2B0049A4\" targetRef=\"sid-19BF350B-2D34-4049-B17C-AE0265F407CB\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-0B7D8255-893E-404A-B0EF-CCB418B98B58\" sourceRef=\"sid-19BF350B-2D34-4049-B17C-AE0265F407CB\" targetRef=\"sid-D56D4E10-864F-4B2B-898E-AA9641C98E63\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-73C9EBCD-9625-4469-B4AD-87B829C4BD8B\" sourceRef=\"sid-D56D4E10-864F-4B2B-898E-AA9641C98E63\" targetRef=\"sid-0C2D523B-E4EB-4776-AFA3-43B156AAE378\">\n      </sequenceFlow>\n   </process>\n   <process id=\"sid-D042A222-1E2E-4AE5-A062-1CB78A7CD324\" isClosed=\"false\" isExecutable=\"false\" name=\"Bewerber-Beurteilung - &#10;Führungskraft Fachbereich\" processType=\"None\">\n      <extensionElements/>\n      <laneSet id=\"sid-a1b72736-7f4b-4083-a9fb-440ea585667d\">\n         <lane id=\"sid-994BB7B0-64D8-4DC4-B549-0758628F5A16\">\n            <flowNodeRef>sid-B7711D66-52EB-4437-AA0C-5671CE83C6E6</flowNodeRef>\n            <flowNodeRef>sid-066B769F-EAEB-42E5-ACAB-341240A5F87D</flowNodeRef>\n            <flowNodeRef>sid-4F2CDAD6-92D6-470B-B82C-8D07E050591A</flowNodeRef>\n            <flowNodeRef>sid-943A343F-C038-49B9-8640-7BDABFB8E1BF</flowNodeRef>\n         </lane>\n      </laneSet>\n      <startEvent id=\"sid-B7711D66-52EB-4437-AA0C-5671CE83C6E6\" isInterrupting=\"true\" name=\"Bewerber-&#10;Bewertung &#10;angefordert\">\n         <outgoing>sid-F88DDF30-3F4D-4FA6-AA82-3B10300FFE98</outgoing>\n         <messageEventDefinition id=\"sid-6f972804-dc5c-4ff6-bce5-b54f303d2184\"/>\n      </startEvent>\n      <task completionQuantity=\"1\" id=\"sid-066B769F-EAEB-42E5-ACAB-341240A5F87D\" isForCompensation=\"false\" name=\"Bewerber beurteilen\" startQuantity=\"1\">\n         <incoming>sid-F88DDF30-3F4D-4FA6-AA82-3B10300FFE98</incoming>\n         <outgoing>sid-4E1F9DDA-0BDF-4BB0-90F5-E7A85C259444</outgoing>\n      </task>\n      <task completionQuantity=\"1\" id=\"sid-4F2CDAD6-92D6-470B-B82C-8D07E050591A\" isForCompensation=\"false\" name=\"Beurteilung zurücksenden\" startQuantity=\"1\">\n         <incoming>sid-4E1F9DDA-0BDF-4BB0-90F5-E7A85C259444</incoming>\n         <outgoing>sid-6E0CD175-BAC0-4104-8555-C2473AD6956B</outgoing>\n      </task>\n      <endEvent id=\"sid-943A343F-C038-49B9-8640-7BDABFB8E1BF\" name=\"Bewerber &#10;beurteilt\">\n         <incoming>sid-6E0CD175-BAC0-4104-8555-C2473AD6956B</incoming>\n      </endEvent>\n      <sequenceFlow id=\"sid-F88DDF30-3F4D-4FA6-AA82-3B10300FFE98\" sourceRef=\"sid-B7711D66-52EB-4437-AA0C-5671CE83C6E6\" targetRef=\"sid-066B769F-EAEB-42E5-ACAB-341240A5F87D\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-4E1F9DDA-0BDF-4BB0-90F5-E7A85C259444\" sourceRef=\"sid-066B769F-EAEB-42E5-ACAB-341240A5F87D\" targetRef=\"sid-4F2CDAD6-92D6-470B-B82C-8D07E050591A\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-6E0CD175-BAC0-4104-8555-C2473AD6956B\" sourceRef=\"sid-4F2CDAD6-92D6-470B-B82C-8D07E050591A\" targetRef=\"sid-943A343F-C038-49B9-8640-7BDABFB8E1BF\">\n      </sequenceFlow>\n   </process>\n   <process id=\"sid-F0778AC8-E593-4FF9-8CCE-C71768DF3E0D\" isClosed=\"false\" isExecutable=\"false\" name=\"Bewerbungsprüfung - &#10;Sachbearbeiter Personal\" processType=\"None\">\n      <extensionElements/>\n      <laneSet id=\"sid-1a44f038-f892-46b6-aa40-0870f1b61368\">\n         <lane id=\"sid-0F208AE2-EC60-4823-9B6A-D062A91587F2\">\n            <flowNodeRef>sid-F5C79AC7-BB82-4CEC-A1E0-DB441A30CE08</flowNodeRef>\n            <flowNodeRef>sid-FB3673BF-5359-4ACE-B2A2-1C546E2D95C0</flowNodeRef>\n            <flowNodeRef>sid-2416E79A-ED80-4834-B7A9-A2F6F1B1F5D8</flowNodeRef>\n            <flowNodeRef>sid-DDA78FB8-B5BB-490F-8AB6-144A28AB646B</flowNodeRef>\n            <flowNodeRef>sid-8ED06068-AA04-428D-860D-8CA2A0483C2A</flowNodeRef>\n            <flowNodeRef>sid-AD5109AB-9014-4810-AB7B-3A4990FB44D1</flowNodeRef>\n            <flowNodeRef>sid-6B8D60D6-2BC0-4969-A16A-ABCD8586DEAD</flowNodeRef>\n            <flowNodeRef>sid-BA5E7744-B79B-47D2-8D85-7D38B00D52CF</flowNodeRef>\n            <flowNodeRef>sid-23B471A9-0A76-483C-AD0B-65092D0477BF</flowNodeRef>\n         </lane>\n      </laneSet>\n      <startEvent id=\"sid-F5C79AC7-BB82-4CEC-A1E0-DB441A30CE08\" isInterrupting=\"true\" name=\"Bewerbungs-&#10;prüfung  &#10;gewünscht\">\n         <outgoing>sid-CD80152E-8A60-4DF8-87F7-23BD0CDA3C58</outgoing>\n      </startEvent>\n      <task completionQuantity=\"1\" id=\"sid-FB3673BF-5359-4ACE-B2A2-1C546E2D95C0\" isForCompensation=\"false\" name=\"Bewerbungen filtern\" startQuantity=\"1\">\n         <incoming>sid-CD80152E-8A60-4DF8-87F7-23BD0CDA3C58</incoming>\n         <outgoing>sid-FDB13333-B493-4477-9DE4-C7E4C522F495</outgoing>\n         <dataInputAssociation id=\"sid-D760E3B4-E755-4719-B905-F62FFF056D7B\">\n            <sourceRef>sid-8006DF6D-4AC4-4BD4-8BE5-95CA3CCC182D</sourceRef>\n            <targetRef>sid-FB3673BF-5359-4ACE-B2A2-1C546E2D95C0</targetRef>\n         </dataInputAssociation>\n      </task>\n      <task completionQuantity=\"1\" id=\"sid-2416E79A-ED80-4834-B7A9-A2F6F1B1F5D8\" isForCompensation=\"false\" name=\"Bewerbung sichten\" startQuantity=\"1\">\n         <incoming>sid-1B290110-0336-46CF-92EC-C45D43FA9307</incoming>\n         <outgoing>sid-3E4A80E2-14C5-4002-BFE9-15F53566593B</outgoing>\n         <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-997ad086-4bf6-4389-a797-6c564d14afb7\" isSequential=\"false\"/>\n      </task>\n      <exclusiveGateway gatewayDirection=\"Diverging\" id=\"sid-DDA78FB8-B5BB-490F-8AB6-144A28AB646B\" name=\"Bewerber&#10;einladen?\">\n         <incoming>sid-3E4A80E2-14C5-4002-BFE9-15F53566593B</incoming>\n         <outgoing>sid-908C781B-BB04-488F-BA6F-07FCF03BDD32</outgoing>\n         <outgoing>sid-E5370FBF-0192-43B6-8288-43F5D7BE5854</outgoing>\n      </exclusiveGateway>\n      <task completionQuantity=\"1\" id=\"sid-8ED06068-AA04-428D-860D-8CA2A0483C2A\" isForCompensation=\"false\" name=\"Wunsch nach Bewerbungsgespräch addressieren\" startQuantity=\"1\">\n         <incoming>sid-908C781B-BB04-488F-BA6F-07FCF03BDD32</incoming>\n         <outgoing>sid-50B9F1DF-70D3-48DF-A96D-482225E11A7D</outgoing>\n      </task>\n      <endEvent id=\"sid-AD5109AB-9014-4810-AB7B-3A4990FB44D1\" name=\"Bewerber &#10;eingeladen\">\n         <incoming>sid-50B9F1DF-70D3-48DF-A96D-482225E11A7D</incoming>\n      </endEvent>\n      <endEvent id=\"sid-6B8D60D6-2BC0-4969-A16A-ABCD8586DEAD\" name=\"Bewerbungen &#10;geprüft\">\n         <incoming>sid-E5370FBF-0192-43B6-8288-43F5D7BE5854</incoming>\n      </endEvent>\n      <exclusiveGateway gatewayDirection=\"Diverging\" id=\"sid-BA5E7744-B79B-47D2-8D85-7D38B00D52CF\" name=\"Bewerbungen&#10;vorhanden?\">\n         <incoming>sid-FDB13333-B493-4477-9DE4-C7E4C522F495</incoming>\n         <outgoing>sid-1B290110-0336-46CF-92EC-C45D43FA9307</outgoing>\n         <outgoing>sid-1E8A77DE-E3F1-4DFA-B20C-9EEBF0735E05</outgoing>\n      </exclusiveGateway>\n      <endEvent id=\"sid-23B471A9-0A76-483C-AD0B-65092D0477BF\" name=\"keine &#10;Bewerbungen&#10;vorhanden\">\n         <incoming>sid-1E8A77DE-E3F1-4DFA-B20C-9EEBF0735E05</incoming>\n      </endEvent>\n      <sequenceFlow id=\"sid-CD80152E-8A60-4DF8-87F7-23BD0CDA3C58\" sourceRef=\"sid-F5C79AC7-BB82-4CEC-A1E0-DB441A30CE08\" targetRef=\"sid-FB3673BF-5359-4ACE-B2A2-1C546E2D95C0\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-FDB13333-B493-4477-9DE4-C7E4C522F495\" sourceRef=\"sid-FB3673BF-5359-4ACE-B2A2-1C546E2D95C0\" targetRef=\"sid-BA5E7744-B79B-47D2-8D85-7D38B00D52CF\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-3E4A80E2-14C5-4002-BFE9-15F53566593B\" sourceRef=\"sid-2416E79A-ED80-4834-B7A9-A2F6F1B1F5D8\" targetRef=\"sid-DDA78FB8-B5BB-490F-8AB6-144A28AB646B\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-50B9F1DF-70D3-48DF-A96D-482225E11A7D\" sourceRef=\"sid-8ED06068-AA04-428D-860D-8CA2A0483C2A\" targetRef=\"sid-AD5109AB-9014-4810-AB7B-3A4990FB44D1\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-908C781B-BB04-488F-BA6F-07FCF03BDD32\" name=\"ja\" sourceRef=\"sid-DDA78FB8-B5BB-490F-8AB6-144A28AB646B\" targetRef=\"sid-8ED06068-AA04-428D-860D-8CA2A0483C2A\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-E5370FBF-0192-43B6-8288-43F5D7BE5854\" name=\"nein\" sourceRef=\"sid-DDA78FB8-B5BB-490F-8AB6-144A28AB646B\" targetRef=\"sid-6B8D60D6-2BC0-4969-A16A-ABCD8586DEAD\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-1B290110-0336-46CF-92EC-C45D43FA9307\" name=\"ja\" sourceRef=\"sid-BA5E7744-B79B-47D2-8D85-7D38B00D52CF\" targetRef=\"sid-2416E79A-ED80-4834-B7A9-A2F6F1B1F5D8\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-1E8A77DE-E3F1-4DFA-B20C-9EEBF0735E05\" name=\"nein\" sourceRef=\"sid-BA5E7744-B79B-47D2-8D85-7D38B00D52CF\" targetRef=\"sid-23B471A9-0A76-483C-AD0B-65092D0477BF\">\n      </sequenceFlow>\n      <dataStoreReference dataStoreRef=\"sid-1f3b3b35-28a1-4fff-8835-ae271ef486d5\" id=\"sid-8006DF6D-4AC4-4BD4-8BE5-95CA3CCC182D\" name=\"HR-Tool\">\n      </dataStoreReference>\n   </process>\n   <process id=\"sid-05D31FB1-4A4B-4D41-8E51-BE08330D6013\" isClosed=\"false\" isExecutable=\"false\" name=\"Bewerbungsprüfung - &#10;Führungskraft Fachbereich\" processType=\"None\">\n      <extensionElements/>\n      <laneSet id=\"sid-695d1920-1bc1-42dd-948a-41dbd5fea84f\">\n         <lane id=\"sid-B22F345F-EAB4-4D92-A810-C4B9AFCC4A6F\">\n            <flowNodeRef>sid-699FBA56-8A57-43AC-ACC4-090A9B4AB26A</flowNodeRef>\n            <flowNodeRef>sid-1FFCF5B7-A6EE-4D63-AC49-5CD21F277383</flowNodeRef>\n            <flowNodeRef>sid-CC14630C-7FFB-4CD2-954A-1D52340F34B4</flowNodeRef>\n            <flowNodeRef>sid-8BC4F3B3-CA44-48C2-B3FA-137EAEC7D012</flowNodeRef>\n            <flowNodeRef>sid-F197542D-D274-45BE-95A5-7A3608BBE27A</flowNodeRef>\n            <flowNodeRef>sid-3820CBDB-C1E3-47EA-BCE1-10C9DBAEDB37</flowNodeRef>\n            <flowNodeRef>sid-308728F0-D1C5-4383-AA70-41249841A930</flowNodeRef>\n            <flowNodeRef>sid-4FA5730A-F51C-4CEE-98F0-631553512966</flowNodeRef>\n            <flowNodeRef>sid-7F1356BF-93F9-41C2-937C-E943B8818EB3</flowNodeRef>\n         </lane>\n      </laneSet>\n      <startEvent id=\"sid-699FBA56-8A57-43AC-ACC4-090A9B4AB26A\" isInterrupting=\"true\" name=\"Bewerbungs-&#10;prüfung  &#10;gewünscht\">\n         <outgoing>sid-47EBB822-715D-4193-8711-59063E3E4F48</outgoing>\n      </startEvent>\n      <task completionQuantity=\"1\" id=\"sid-1FFCF5B7-A6EE-4D63-AC49-5CD21F277383\" isForCompensation=\"false\" name=\"Bewerbungen filtern\" startQuantity=\"1\">\n         <incoming>sid-47EBB822-715D-4193-8711-59063E3E4F48</incoming>\n         <outgoing>sid-B4BDF60C-F40F-4247-B52F-0EA0038A9039</outgoing>\n         <dataInputAssociation id=\"sid-616032F1-DE57-4D70-B0F8-7BD6F4879437\">\n            <sourceRef>sid-8006DF6D-4AC4-4BD4-8BE5-95CA3CCC182D</sourceRef>\n            <targetRef>sid-1FFCF5B7-A6EE-4D63-AC49-5CD21F277383</targetRef>\n         </dataInputAssociation>\n      </task>\n      <task completionQuantity=\"1\" id=\"sid-CC14630C-7FFB-4CD2-954A-1D52340F34B4\" isForCompensation=\"false\" name=\"Bewerbung sichten\" startQuantity=\"1\">\n         <incoming>sid-EF5AD02F-469C-45DB-AABA-29D5CDD54B58</incoming>\n         <outgoing>sid-5C3AB4AB-5292-4EC3-9A0F-BAD26D56DBD4</outgoing>\n         <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-1c722277-cc84-4f53-9009-9631016dffde\" isSequential=\"false\"/>\n      </task>\n      <exclusiveGateway gatewayDirection=\"Diverging\" id=\"sid-8BC4F3B3-CA44-48C2-B3FA-137EAEC7D012\" name=\"Bewerber&#10;einladen?\">\n         <incoming>sid-5C3AB4AB-5292-4EC3-9A0F-BAD26D56DBD4</incoming>\n         <outgoing>sid-5C2E761C-74FF-405C-8F6E-416329D714BC</outgoing>\n         <outgoing>sid-E725BF0F-5B88-4D38-AE6A-7ABDA67CA7C7</outgoing>\n      </exclusiveGateway>\n      <task completionQuantity=\"1\" id=\"sid-F197542D-D274-45BE-95A5-7A3608BBE27A\" isForCompensation=\"false\" name=\"Wunsch nach Bewerbungsgespräch addressieren\" startQuantity=\"1\">\n         <incoming>sid-E725BF0F-5B88-4D38-AE6A-7ABDA67CA7C7</incoming>\n         <outgoing>sid-5529AAF3-EC3E-409F-A020-8D0330A547E3</outgoing>\n      </task>\n      <endEvent id=\"sid-3820CBDB-C1E3-47EA-BCE1-10C9DBAEDB37\" name=\"Bewerber &#10;eingeladen\">\n         <incoming>sid-5529AAF3-EC3E-409F-A020-8D0330A547E3</incoming>\n      </endEvent>\n      <endEvent id=\"sid-308728F0-D1C5-4383-AA70-41249841A930\" name=\"Bewerbungen &#10;geprüft\">\n         <incoming>sid-5C2E761C-74FF-405C-8F6E-416329D714BC</incoming>\n      </endEvent>\n      <exclusiveGateway gatewayDirection=\"Diverging\" id=\"sid-4FA5730A-F51C-4CEE-98F0-631553512966\" name=\"Bewerbungen&#10;vorhanden?\">\n         <incoming>sid-B4BDF60C-F40F-4247-B52F-0EA0038A9039</incoming>\n         <outgoing>sid-F11A1E78-0DE1-46E5-9074-F665ED1985BE</outgoing>\n         <outgoing>sid-EF5AD02F-469C-45DB-AABA-29D5CDD54B58</outgoing>\n      </exclusiveGateway>\n      <endEvent id=\"sid-7F1356BF-93F9-41C2-937C-E943B8818EB3\" name=\"keine &#10;Bewerbungen&#10;vorhanden\">\n         <incoming>sid-F11A1E78-0DE1-46E5-9074-F665ED1985BE</incoming>\n      </endEvent>\n      <sequenceFlow id=\"sid-47EBB822-715D-4193-8711-59063E3E4F48\" sourceRef=\"sid-699FBA56-8A57-43AC-ACC4-090A9B4AB26A\" targetRef=\"sid-1FFCF5B7-A6EE-4D63-AC49-5CD21F277383\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-B4BDF60C-F40F-4247-B52F-0EA0038A9039\" sourceRef=\"sid-1FFCF5B7-A6EE-4D63-AC49-5CD21F277383\" targetRef=\"sid-4FA5730A-F51C-4CEE-98F0-631553512966\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-5C3AB4AB-5292-4EC3-9A0F-BAD26D56DBD4\" sourceRef=\"sid-CC14630C-7FFB-4CD2-954A-1D52340F34B4\" targetRef=\"sid-8BC4F3B3-CA44-48C2-B3FA-137EAEC7D012\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-5529AAF3-EC3E-409F-A020-8D0330A547E3\" sourceRef=\"sid-F197542D-D274-45BE-95A5-7A3608BBE27A\" targetRef=\"sid-3820CBDB-C1E3-47EA-BCE1-10C9DBAEDB37\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-5C2E761C-74FF-405C-8F6E-416329D714BC\" name=\"nein\" sourceRef=\"sid-8BC4F3B3-CA44-48C2-B3FA-137EAEC7D012\" targetRef=\"sid-308728F0-D1C5-4383-AA70-41249841A930\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-E725BF0F-5B88-4D38-AE6A-7ABDA67CA7C7\" name=\"ja\" sourceRef=\"sid-8BC4F3B3-CA44-48C2-B3FA-137EAEC7D012\" targetRef=\"sid-F197542D-D274-45BE-95A5-7A3608BBE27A\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-F11A1E78-0DE1-46E5-9074-F665ED1985BE\" name=\"nein\" sourceRef=\"sid-4FA5730A-F51C-4CEE-98F0-631553512966\" targetRef=\"sid-7F1356BF-93F9-41C2-937C-E943B8818EB3\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-EF5AD02F-469C-45DB-AABA-29D5CDD54B58\" name=\"ja\" sourceRef=\"sid-4FA5730A-F51C-4CEE-98F0-631553512966\" targetRef=\"sid-CC14630C-7FFB-4CD2-954A-1D52340F34B4\">\n      </sequenceFlow>\n   </process>\n   <process id=\"sid-3C2D842A-E239-44F2-91A1-D809676A3462\" isClosed=\"false\" isExecutable=\"false\" name=\"Bewerbungsprüfung (fristgerecht) - Sachbearbeiter Personal\" processType=\"None\">\n      <extensionElements/>\n      <laneSet id=\"sid-afc2841d-4031-42d9-9f23-29fac02d634e\">\n         <lane id=\"sid-4E447BCA-4A6B-4944-8A1C-1A184D6A95FD\">\n            <flowNodeRef>sid-A9859F1C-A85B-4F2F-B2DF-E3F4F7FA67FA</flowNodeRef>\n            <flowNodeRef>sid-B9B94A24-2819-461A-B5E8-61182BDA87DD</flowNodeRef>\n            <flowNodeRef>sid-86DC77E1-24A3-499E-89D0-499B4BBFF67A</flowNodeRef>\n            <flowNodeRef>sid-F0DA46E1-7E86-4236-9D49-290DD7B87C61</flowNodeRef>\n            <flowNodeRef>sid-BEC67F12-04E9-4AE2-B59E-FEB109CD3DF8</flowNodeRef>\n            <flowNodeRef>sid-303796CF-BA87-40A7-B2EC-9F6E10BD1060</flowNodeRef>\n            <flowNodeRef>sid-D3CA93A5-3BCC-4DB3-8075-EAC0C0A53991</flowNodeRef>\n            <flowNodeRef>sid-282D9841-8694-47FB-A058-32A5B47CFB1E</flowNodeRef>\n            <flowNodeRef>sid-597B2F0C-9759-421B-8F52-D8F26705F2BE</flowNodeRef>\n            <flowNodeRef>sid-6460C9E2-AD85-4EA6-8922-F9BAB25F1C5F</flowNodeRef>\n         </lane>\n      </laneSet>\n      <task completionQuantity=\"1\" id=\"sid-A9859F1C-A85B-4F2F-B2DF-E3F4F7FA67FA\" isForCompensation=\"false\" name=\"Aufstellung der Bewerber erstellen\" startQuantity=\"1\">\n         <incoming>sid-F3E23BCC-F29B-444C-BF2B-C2AA7D9D0DEF</incoming>\n         <outgoing>sid-770DE0CC-14BD-46C1-B93A-3C10BD8A3933</outgoing>\n         <dataInputAssociation id=\"sid-310DFC6B-79B0-40BC-BF9E-D072E122A3A2\">\n            <sourceRef>sid-E8C87193-03FE-438D-A921-0BAB9FBD08D9</sourceRef>\n            <targetRef>sid-A9859F1C-A85B-4F2F-B2DF-E3F4F7FA67FA</targetRef>\n         </dataInputAssociation>\n         <dataOutputAssociation id=\"sid-9391DBA5-9C7B-4B14-B502-AB985711AD02\">\n            <sourceRef>sid-A9859F1C-A85B-4F2F-B2DF-E3F4F7FA67FA</sourceRef>\n            <targetRef>sid-8D8BD39F-1B08-433F-8F93-A1FF7520BA8B</targetRef>\n         </dataOutputAssociation>\n      </task>\n      <dataObjectReference id=\"sid-8D8BD39F-1B08-433F-8F93-A1FF7520BA8B\" isCollection=\"true\" name=\"Bewerber\">\n      </dataObjectReference>\n      <exclusiveGateway gatewayDirection=\"Diverging\" id=\"sid-B9B94A24-2819-461A-B5E8-61182BDA87DD\" name=\"Bewerbungen&#10;eingegangen?\">\n         <incoming>sid-770DE0CC-14BD-46C1-B93A-3C10BD8A3933</incoming>\n         <outgoing>sid-155BB3AD-386C-4EF2-92C6-E2800D82A875</outgoing>\n         <outgoing>sid-3EB9F09F-9E44-4200-A845-09B78E5F6BA8</outgoing>\n      </exclusiveGateway>\n      <startEvent id=\"sid-86DC77E1-24A3-499E-89D0-499B4BBFF67A\" isInterrupting=\"true\" name=\"Vorfrist zur &#10;Stellenbesetzung&#10; abgelaufen\">\n         <outgoing>sid-F3E23BCC-F29B-444C-BF2B-C2AA7D9D0DEF</outgoing>\n         <timerEventDefinition id=\"sid-11ce2f25-c9e7-460a-9ebd-0525ac873dcd\"/>\n      </startEvent>\n      <businessRuleTask completionQuantity=\"1\" id=\"sid-F0DA46E1-7E86-4236-9D49-290DD7B87C61\" implementation=\"webService\" isForCompensation=\"false\" name=\"Potentielle Kandidaten markieren\" startQuantity=\"1\">\n         <incoming>sid-3EB9F09F-9E44-4200-A845-09B78E5F6BA8</incoming>\n         <outgoing>sid-BDC5800E-05A9-4D22-BA46-474DD7EBFF31</outgoing>\n         <dataInputAssociation id=\"sid-A1B5F8D2-3FF2-4FAE-A885-819174BB01BD\">\n            <sourceRef>sid-8D8BD39F-1B08-433F-8F93-A1FF7520BA8B</sourceRef>\n            <targetRef>sid-F0DA46E1-7E86-4236-9D49-290DD7B87C61</targetRef>\n         </dataInputAssociation>\n         <dataOutputAssociation id=\"sid-1D74E5C9-7875-42C7-B069-7EF805115BFB\">\n            <sourceRef>sid-F0DA46E1-7E86-4236-9D49-290DD7B87C61</sourceRef>\n            <targetRef>sid-8D8BD39F-1B08-433F-8F93-A1FF7520BA8B</targetRef>\n         </dataOutputAssociation>\n      </businessRuleTask>\n      <endEvent id=\"sid-BEC67F12-04E9-4AE2-B59E-FEB109CD3DF8\" name=\"Info &#10;versenden\">\n         <incoming>sid-155BB3AD-386C-4EF2-92C6-E2800D82A875</incoming>\n         <messageEventDefinition id=\"sid-a1976f34-7cf3-4b52-a0a6-65a738a6c05b\"/>\n      </endEvent>\n      <task completionQuantity=\"1\" id=\"sid-303796CF-BA87-40A7-B2EC-9F6E10BD1060\" isForCompensation=\"false\" name=\"Liste der Bewerbung(en) zur Prüfung vorlegen\" startQuantity=\"1\">\n         <incoming>sid-BDC5800E-05A9-4D22-BA46-474DD7EBFF31</incoming>\n         <outgoing>sid-F834923E-C5BB-44FF-9238-FE9B18B7ECD2</outgoing>\n      </task>\n      <intermediateCatchEvent id=\"sid-D3CA93A5-3BCC-4DB3-8075-EAC0C0A53991\" name=\"Bewertung(en)&#10;erhalten\">\n         <incoming>sid-F834923E-C5BB-44FF-9238-FE9B18B7ECD2</incoming>\n         <outgoing>sid-EA96E73A-B3ED-48A6-B066-5B38CA75DBE6</outgoing>\n         <messageEventDefinition id=\"sid-02d86d6c-66ae-4619-b8b4-0bd96bea426d\"/>\n      </intermediateCatchEvent>\n      <task completionQuantity=\"1\" id=\"sid-282D9841-8694-47FB-A058-32A5B47CFB1E\" isForCompensation=\"false\" name=\"Bewertungen auswerten\" startQuantity=\"1\">\n         <incoming>sid-EA96E73A-B3ED-48A6-B066-5B38CA75DBE6</incoming>\n         <outgoing>sid-1D3A1400-EBE2-4C67-B377-CC31EB9925E5</outgoing>\n      </task>\n      <task completionQuantity=\"1\" id=\"sid-597B2F0C-9759-421B-8F52-D8F26705F2BE\" isForCompensation=\"false\" name=\"Geeignete Kandidaten melden\" startQuantity=\"1\">\n         <incoming>sid-1D3A1400-EBE2-4C67-B377-CC31EB9925E5</incoming>\n         <outgoing>sid-54D77E49-FBFB-4B81-932A-B8F5E3BE4C6A</outgoing>\n      </task>\n      <endEvent id=\"sid-6460C9E2-AD85-4EA6-8922-F9BAB25F1C5F\" name=\"Bewerbungen&#10;geprüft\">\n         <incoming>sid-54D77E49-FBFB-4B81-932A-B8F5E3BE4C6A</incoming>\n      </endEvent>\n      <sequenceFlow id=\"sid-F3E23BCC-F29B-444C-BF2B-C2AA7D9D0DEF\" sourceRef=\"sid-86DC77E1-24A3-499E-89D0-499B4BBFF67A\" targetRef=\"sid-A9859F1C-A85B-4F2F-B2DF-E3F4F7FA67FA\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-770DE0CC-14BD-46C1-B93A-3C10BD8A3933\" sourceRef=\"sid-A9859F1C-A85B-4F2F-B2DF-E3F4F7FA67FA\" targetRef=\"sid-B9B94A24-2819-461A-B5E8-61182BDA87DD\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-155BB3AD-386C-4EF2-92C6-E2800D82A875\" name=\"nein\" sourceRef=\"sid-B9B94A24-2819-461A-B5E8-61182BDA87DD\" targetRef=\"sid-BEC67F12-04E9-4AE2-B59E-FEB109CD3DF8\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-F834923E-C5BB-44FF-9238-FE9B18B7ECD2\" sourceRef=\"sid-303796CF-BA87-40A7-B2EC-9F6E10BD1060\" targetRef=\"sid-D3CA93A5-3BCC-4DB3-8075-EAC0C0A53991\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-EA96E73A-B3ED-48A6-B066-5B38CA75DBE6\" sourceRef=\"sid-D3CA93A5-3BCC-4DB3-8075-EAC0C0A53991\" targetRef=\"sid-282D9841-8694-47FB-A058-32A5B47CFB1E\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-3EB9F09F-9E44-4200-A845-09B78E5F6BA8\" name=\"ja\" sourceRef=\"sid-B9B94A24-2819-461A-B5E8-61182BDA87DD\" targetRef=\"sid-F0DA46E1-7E86-4236-9D49-290DD7B87C61\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-BDC5800E-05A9-4D22-BA46-474DD7EBFF31\" sourceRef=\"sid-F0DA46E1-7E86-4236-9D49-290DD7B87C61\" targetRef=\"sid-303796CF-BA87-40A7-B2EC-9F6E10BD1060\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-1D3A1400-EBE2-4C67-B377-CC31EB9925E5\" sourceRef=\"sid-282D9841-8694-47FB-A058-32A5B47CFB1E\" targetRef=\"sid-597B2F0C-9759-421B-8F52-D8F26705F2BE\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-54D77E49-FBFB-4B81-932A-B8F5E3BE4C6A\" sourceRef=\"sid-597B2F0C-9759-421B-8F52-D8F26705F2BE\" targetRef=\"sid-6460C9E2-AD85-4EA6-8922-F9BAB25F1C5F\">\n      </sequenceFlow>\n      <association associationDirection=\"None\" id=\"sid-1B51B1B0-FB1A-46CE-BC87-0D89AEA6845A\" sourceRef=\"sid-86DC77E1-24A3-499E-89D0-499B4BBFF67A\" targetRef=\"sid-08F7E7A1-A19F-4324-8D38-CD160728FB9A\">\n      </association>\n      <association associationDirection=\"None\" id=\"sid-1F6B2785-A15E-4C82-87C4-9708BDD521B6\" sourceRef=\"sid-BEC67F12-04E9-4AE2-B59E-FEB109CD3DF8\" targetRef=\"sid-26C1D0AA-CDB7-43FC-A36A-DF0658A215B1\">\n      </association>\n      <association associationDirection=\"None\" id=\"sid-7164D016-D299-4243-A9FE-75910B69E8F4\" sourceRef=\"sid-F0DA46E1-7E86-4236-9D49-290DD7B87C61\" targetRef=\"sid-86AEF0B1-9EB6-45FD-B9A3-DAE6F5ED71A4\">\n      </association>\n      <textAnnotation id=\"sid-08F7E7A1-A19F-4324-8D38-CD160728FB9A\" textFormat=\"text/plain\">\n         <text>Frist = 1 Monate vor Besetzung der Stelle</text>\n      </textAnnotation>\n      <textAnnotation id=\"sid-26C1D0AA-CDB7-43FC-A36A-DF0658A215B1\" textFormat=\"text/plain\">\n         <text>ID1</text>\n      </textAnnotation>\n      <textAnnotation id=\"sid-86AEF0B1-9EB6-45FD-B9A3-DAE6F5ED71A4\" textFormat=\"text/plain\">\n         <text>ID13</text>\n      </textAnnotation>\n   </process>\n   <process id=\"sid-35DD95AD-CA27-4826-8E4F-351207D0FA1A\" isClosed=\"false\" isExecutable=\"false\" name=\"Management Bewerbungsgespräche -&#10; Sachbearbeiter Personal\" processType=\"None\">\n      <extensionElements/>\n      <laneSet id=\"sid-8f563437-4bff-4b07-8408-606ed1134465\">\n         <lane id=\"sid-4A0FB2B3-2D67-46F7-ACB3-260FC62E3B5A\">\n            <flowNodeRef>sid-36E152C5-1864-4D96-9F9B-27133FD47EFE</flowNodeRef>\n            <flowNodeRef>sid-B1C30549-F180-4515-9926-F2036892B4C1</flowNodeRef>\n            <flowNodeRef>sid-E91A2C66-8518-4301-8912-DA783975DD45</flowNodeRef>\n         </lane>\n      </laneSet>\n      <startEvent id=\"sid-36E152C5-1864-4D96-9F9B-27133FD47EFE\" isInterrupting=\"true\" name=\"Wunsch für &#10;Gespräch(e) &#10;eingegangen\">\n         <outgoing>sid-369E18F1-20E3-4E09-A8B7-1FF568E57F23</outgoing>\n         <messageEventDefinition id=\"sid-ee0afed5-08eb-4773-87f6-18e964971020\"/>\n      </startEvent>\n      <subProcess completionQuantity=\"1\" id=\"sid-B1C30549-F180-4515-9926-F2036892B4C1\" isForCompensation=\"false\" startQuantity=\"1\" triggeredByEvent=\"false\">\n         <incoming>sid-369E18F1-20E3-4E09-A8B7-1FF568E57F23</incoming>\n         <outgoing>sid-D654E8D0-0A05-48F1-B102-B547E61DDDB6</outgoing>\n         <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-1c732dda-dc13-4c0a-816f-41b2616140c7\" isSequential=\"false\"/>\n         <task completionQuantity=\"1\" id=\"sid-A1EBC62D-CD4A-4D2B-A613-4873898F84F1\" isForCompensation=\"false\" name=\"Termin festlegen\" startQuantity=\"1\">\n            <incoming>sid-90EB4714-6D5C-48A0-87BB-BE2024FE22BD</incoming>\n            <outgoing>sid-8BB76718-C32D-4E09-B80B-7DC168E99147</outgoing>\n         </task>\n         <task completionQuantity=\"1\" id=\"sid-B316767E-63CE-4A62-A9BF-AB4F0A0D517F\" isForCompensation=\"false\" name=\"Gesprächs-einladung versenden\" startQuantity=\"1\">\n            <incoming>sid-8BB76718-C32D-4E09-B80B-7DC168E99147</incoming>\n            <outgoing>sid-48AAE1F8-75D9-4031-ACAD-49BD8A16E9C8</outgoing>\n         </task>\n         <startEvent id=\"sid-07E2F210-4975-43A8-AEE3-B913F6FB8B91\" isInterrupting=\"true\" name=\"Gespräch &#10;angefordert\">\n            <outgoing>sid-90EB4714-6D5C-48A0-87BB-BE2024FE22BD</outgoing>\n         </startEvent>\n         <eventBasedGateway eventGatewayType=\"Exclusive\" gatewayDirection=\"Diverging\" id=\"sid-AE0A605B-D1DB-428A-83D7-38552EDA0289\" instantiate=\"false\">\n            <incoming>sid-FE1C5021-4268-4AE6-8FBD-9DF197259520</incoming>\n            <outgoing>sid-97FBBC72-9B16-470C-BAF3-445654369DF9</outgoing>\n            <outgoing>sid-1203CB8F-6985-4231-B352-DE313ECA48CE</outgoing>\n         </eventBasedGateway>\n         <intermediateCatchEvent id=\"sid-158F070A-F137-4B82-8403-261AA7E86AB6\" name=\"Antwort&#10;erhalten\">\n            <incoming>sid-1203CB8F-6985-4231-B352-DE313ECA48CE</incoming>\n            <outgoing>sid-B8E5BEAC-DBF0-45D3-A8A5-1D0D1EF0E19B</outgoing>\n            <messageEventDefinition id=\"sid-828138af-efda-4b8c-96ec-161cc3f31840\"/>\n         </intermediateCatchEvent>\n         <intermediateCatchEvent id=\"sid-ED938847-69C7-421F-AFD0-0AECDB38C9F0\" name=\"Rückmeldefrist&#10; erreicht\">\n            <incoming>sid-97FBBC72-9B16-470C-BAF3-445654369DF9</incoming>\n            <outgoing>sid-7AD16339-3A08-4841-96D9-3164E76DCF8F</outgoing>\n            <timerEventDefinition id=\"sid-4a67b65d-b7b4-49e9-b576-855b1fde07d2\"/>\n         </intermediateCatchEvent>\n         <task completionQuantity=\"1\" id=\"sid-5695269D-E801-4953-B48D-EB281E7316F7\" isForCompensation=\"false\" name=\"Beim Bewerber&#10; nachfragen\" startQuantity=\"1\">\n            <incoming>sid-7AD16339-3A08-4841-96D9-3164E76DCF8F</incoming>\n            <outgoing>sid-4FA0508C-2BC1-4ABB-8F75-ED27215EE73D</outgoing>\n         </task>\n         <task completionQuantity=\"1\" id=\"sid-E2985FB2-CA52-4DFD-A6F0-563959923CB5\" isForCompensation=\"false\" name=\"Antwort auswerten\" startQuantity=\"1\">\n            <incoming>sid-B8E5BEAC-DBF0-45D3-A8A5-1D0D1EF0E19B</incoming>\n            <outgoing>sid-C642640E-F524-40F0-BD91-41961D14ED31</outgoing>\n         </task>\n         <exclusiveGateway gatewayDirection=\"Diverging\" id=\"sid-7F7FA2A5-7345-4F11-B0A5-2EEF60EE3CAC\" name=\"Bestätigung &#10;ok?\">\n            <incoming>sid-C642640E-F524-40F0-BD91-41961D14ED31</incoming>\n            <outgoing>sid-5F689961-FD7E-4383-8ECE-B6946007D211</outgoing>\n            <outgoing>sid-258E87AC-23E8-4C39-92C8-5AE7DE19992A</outgoing>\n         </exclusiveGateway>\n         <exclusiveGateway gatewayDirection=\"Diverging\" id=\"sid-3D74C40A-91BA-4671-BB9F-8D03623CAF68\" name=\"weiter auf &#10;Rückmeldung&#10; warten?\">\n            <incoming>sid-4FA0508C-2BC1-4ABB-8F75-ED27215EE73D</incoming>\n            <outgoing>sid-7E2E4777-EC3D-4484-8606-A1ACB6FE84BE</outgoing>\n            <outgoing>sid-373FAB4D-A45B-45EC-9F85-B1076ABBFBA6</outgoing>\n         </exclusiveGateway>\n         <task completionQuantity=\"1\" id=\"sid-8376EFE7-7178-4B72-AF75-4CD3BCDCA599\" isForCompensation=\"false\" name=\"Termin abstimmen\" startQuantity=\"1\">\n            <incoming>sid-5F689961-FD7E-4383-8ECE-B6946007D211</incoming>\n            <outgoing>sid-04E0977B-6883-4B93-AD20-5A2F8B496DE6</outgoing>\n         </task>\n         <task completionQuantity=\"1\" id=\"sid-2EE25CB0-E8BA-491E-A773-BD4B27643246\" isForCompensation=\"false\" name=\"Status der Bewerbung auf &quot;abgelehnt&quot; setzen\" startQuantity=\"1\">\n            <incoming>sid-7E2E4777-EC3D-4484-8606-A1ACB6FE84BE</incoming>\n            <outgoing>sid-9B1BDCA4-28B7-426E-A13C-66409FAC588B</outgoing>\n         </task>\n         <exclusiveGateway gatewayDirection=\"Diverging\" id=\"sid-CCCFBB8A-9E33-4C98-BA16-30AA2A9D7D4B\" name=\"Auf Termin &#10;geeinigt?\">\n            <incoming>sid-04E0977B-6883-4B93-AD20-5A2F8B496DE6</incoming>\n            <outgoing>sid-9FB7EAEB-5A8B-4D90-B3A7-6B52FCBD5D22</outgoing>\n            <outgoing>sid-97D1C665-6495-46A4-BA35-8961F07A076F</outgoing>\n         </exclusiveGateway>\n         <task completionQuantity=\"1\" id=\"sid-42DAA51B-78CB-4098-8C74-1862994E0ED9\" isForCompensation=\"false\" name=\"Termin &#10;absagen\" startQuantity=\"1\">\n            <incoming>sid-9FB7EAEB-5A8B-4D90-B3A7-6B52FCBD5D22</incoming>\n            <outgoing>sid-4D49AA03-7D9E-4086-A0D9-43E7C741DCD3</outgoing>\n         </task>\n         <task completionQuantity=\"1\" id=\"sid-BFDE4B6A-89F4-415B-8A22-7BA82C441A65\" isForCompensation=\"false\" name=\"Termine bestätigen\" startQuantity=\"1\">\n            <incoming>sid-F52F82C6-C6C5-4E39-A2A9-7F4F780748A5</incoming>\n            <outgoing>sid-9E3DEB10-BFD8-4D7D-80EC-F98CD2E65DA4</outgoing>\n         </task>\n         <endEvent id=\"sid-10B00DA4-44D4-4CD4-910E-C8952DA258A4\" name=\"Bewerbungs-&#10;gespräche &#10;organisiert\">\n            <incoming>sid-9E3DEB10-BFD8-4D7D-80EC-F98CD2E65DA4</incoming>\n         </endEvent>\n         <endEvent id=\"sid-636805C2-4600-43C3-8104-E68D0663C904\" name=\"Termin &#10;abgesagt\">\n            <incoming>sid-4D49AA03-7D9E-4086-A0D9-43E7C741DCD3</incoming>\n         </endEvent>\n         <endEvent id=\"sid-551C13CD-F975-42AC-84F3-ABB2B458485A\" name=\"Termin &#10;verworfen\">\n            <incoming>sid-9B1BDCA4-28B7-426E-A13C-66409FAC588B</incoming>\n         </endEvent>\n         <exclusiveGateway gatewayDirection=\"Converging\" id=\"sid-544B758B-A75C-410C-98CA-C84E19CBC367\">\n            <incoming>sid-48AAE1F8-75D9-4031-ACAD-49BD8A16E9C8</incoming>\n            <incoming>sid-373FAB4D-A45B-45EC-9F85-B1076ABBFBA6</incoming>\n            <outgoing>sid-FE1C5021-4268-4AE6-8FBD-9DF197259520</outgoing>\n         </exclusiveGateway>\n         <exclusiveGateway gatewayDirection=\"Converging\" id=\"sid-6C9E668B-0059-4AA5-B3F8-CC74FCBAE32E\">\n            <incoming>sid-97D1C665-6495-46A4-BA35-8961F07A076F</incoming>\n            <incoming>sid-258E87AC-23E8-4C39-92C8-5AE7DE19992A</incoming>\n            <outgoing>sid-F52F82C6-C6C5-4E39-A2A9-7F4F780748A5</outgoing>\n         </exclusiveGateway>\n         <sequenceFlow id=\"sid-97FBBC72-9B16-470C-BAF3-445654369DF9\" sourceRef=\"sid-AE0A605B-D1DB-428A-83D7-38552EDA0289\" targetRef=\"sid-ED938847-69C7-421F-AFD0-0AECDB38C9F0\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-4FA0508C-2BC1-4ABB-8F75-ED27215EE73D\" sourceRef=\"sid-5695269D-E801-4953-B48D-EB281E7316F7\" targetRef=\"sid-3D74C40A-91BA-4671-BB9F-8D03623CAF68\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-7E2E4777-EC3D-4484-8606-A1ACB6FE84BE\" name=\"nein\" sourceRef=\"sid-3D74C40A-91BA-4671-BB9F-8D03623CAF68\" targetRef=\"sid-2EE25CB0-E8BA-491E-A773-BD4B27643246\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-8BB76718-C32D-4E09-B80B-7DC168E99147\" sourceRef=\"sid-A1EBC62D-CD4A-4D2B-A613-4873898F84F1\" targetRef=\"sid-B316767E-63CE-4A62-A9BF-AB4F0A0D517F\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-1203CB8F-6985-4231-B352-DE313ECA48CE\" sourceRef=\"sid-AE0A605B-D1DB-428A-83D7-38552EDA0289\" targetRef=\"sid-158F070A-F137-4B82-8403-261AA7E86AB6\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-B8E5BEAC-DBF0-45D3-A8A5-1D0D1EF0E19B\" sourceRef=\"sid-158F070A-F137-4B82-8403-261AA7E86AB6\" targetRef=\"sid-E2985FB2-CA52-4DFD-A6F0-563959923CB5\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-C642640E-F524-40F0-BD91-41961D14ED31\" sourceRef=\"sid-E2985FB2-CA52-4DFD-A6F0-563959923CB5\" targetRef=\"sid-7F7FA2A5-7345-4F11-B0A5-2EEF60EE3CAC\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-5F689961-FD7E-4383-8ECE-B6946007D211\" name=\"nein\" sourceRef=\"sid-7F7FA2A5-7345-4F11-B0A5-2EEF60EE3CAC\" targetRef=\"sid-8376EFE7-7178-4B72-AF75-4CD3BCDCA599\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-9E3DEB10-BFD8-4D7D-80EC-F98CD2E65DA4\" sourceRef=\"sid-BFDE4B6A-89F4-415B-8A22-7BA82C441A65\" targetRef=\"sid-10B00DA4-44D4-4CD4-910E-C8952DA258A4\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-04E0977B-6883-4B93-AD20-5A2F8B496DE6\" sourceRef=\"sid-8376EFE7-7178-4B72-AF75-4CD3BCDCA599\" targetRef=\"sid-CCCFBB8A-9E33-4C98-BA16-30AA2A9D7D4B\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-9FB7EAEB-5A8B-4D90-B3A7-6B52FCBD5D22\" name=\"nein\" sourceRef=\"sid-CCCFBB8A-9E33-4C98-BA16-30AA2A9D7D4B\" targetRef=\"sid-42DAA51B-78CB-4098-8C74-1862994E0ED9\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-90EB4714-6D5C-48A0-87BB-BE2024FE22BD\" sourceRef=\"sid-07E2F210-4975-43A8-AEE3-B913F6FB8B91\" targetRef=\"sid-A1EBC62D-CD4A-4D2B-A613-4873898F84F1\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-7AD16339-3A08-4841-96D9-3164E76DCF8F\" sourceRef=\"sid-ED938847-69C7-421F-AFD0-0AECDB38C9F0\" targetRef=\"sid-5695269D-E801-4953-B48D-EB281E7316F7\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-97D1C665-6495-46A4-BA35-8961F07A076F\" name=\"ja\" sourceRef=\"sid-CCCFBB8A-9E33-4C98-BA16-30AA2A9D7D4B\" targetRef=\"sid-6C9E668B-0059-4AA5-B3F8-CC74FCBAE32E\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-4D49AA03-7D9E-4086-A0D9-43E7C741DCD3\" sourceRef=\"sid-42DAA51B-78CB-4098-8C74-1862994E0ED9\" targetRef=\"sid-636805C2-4600-43C3-8104-E68D0663C904\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-258E87AC-23E8-4C39-92C8-5AE7DE19992A\" name=\"ja\" sourceRef=\"sid-7F7FA2A5-7345-4F11-B0A5-2EEF60EE3CAC\" targetRef=\"sid-6C9E668B-0059-4AA5-B3F8-CC74FCBAE32E\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-48AAE1F8-75D9-4031-ACAD-49BD8A16E9C8\" sourceRef=\"sid-B316767E-63CE-4A62-A9BF-AB4F0A0D517F\" targetRef=\"sid-544B758B-A75C-410C-98CA-C84E19CBC367\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-9B1BDCA4-28B7-426E-A13C-66409FAC588B\" sourceRef=\"sid-2EE25CB0-E8BA-491E-A773-BD4B27643246\" targetRef=\"sid-551C13CD-F975-42AC-84F3-ABB2B458485A\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-373FAB4D-A45B-45EC-9F85-B1076ABBFBA6\" name=\"ja\" sourceRef=\"sid-3D74C40A-91BA-4671-BB9F-8D03623CAF68\" targetRef=\"sid-544B758B-A75C-410C-98CA-C84E19CBC367\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-FE1C5021-4268-4AE6-8FBD-9DF197259520\" sourceRef=\"sid-544B758B-A75C-410C-98CA-C84E19CBC367\" targetRef=\"sid-AE0A605B-D1DB-428A-83D7-38552EDA0289\">\n         </sequenceFlow>\n         <sequenceFlow id=\"sid-F52F82C6-C6C5-4E39-A2A9-7F4F780748A5\" sourceRef=\"sid-6C9E668B-0059-4AA5-B3F8-CC74FCBAE32E\" targetRef=\"sid-BFDE4B6A-89F4-415B-8A22-7BA82C441A65\">\n         </sequenceFlow>\n         <association associationDirection=\"None\" id=\"sid-CC4AD237-37B5-4CDD-8697-237BE3E1F960\" sourceRef=\"sid-B316767E-63CE-4A62-A9BF-AB4F0A0D517F\" targetRef=\"sid-E4AA7F18-9266-43DA-84E4-B3C4E5A27903\">\n         </association>\n         <association associationDirection=\"None\" id=\"sid-F9388202-3D20-4919-A2DB-088202A1DBC9\" sourceRef=\"sid-2EE25CB0-E8BA-491E-A773-BD4B27643246\" targetRef=\"sid-E28EB527-2F0B-4491-82AE-F61274F75DF7\">\n         </association>\n         <textAnnotation id=\"sid-E4AA7F18-9266-43DA-84E4-B3C4E5A27903\" textFormat=\"text/plain\">\n            <text>ID3</text>\n         </textAnnotation>\n         <textAnnotation id=\"sid-E28EB527-2F0B-4491-82AE-F61274F75DF7\" textFormat=\"text/plain\">\n            <text>ID4</text>\n         </textAnnotation>\n      </subProcess>\n      <endEvent id=\"sid-E91A2C66-8518-4301-8912-DA783975DD45\" name=\"Gespräch(e)&#10;vereinbart\">\n         <incoming>sid-D654E8D0-0A05-48F1-B102-B547E61DDDB6</incoming>\n      </endEvent>\n      <sequenceFlow id=\"sid-369E18F1-20E3-4E09-A8B7-1FF568E57F23\" sourceRef=\"sid-36E152C5-1864-4D96-9F9B-27133FD47EFE\" targetRef=\"sid-B1C30549-F180-4515-9926-F2036892B4C1\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-D654E8D0-0A05-48F1-B102-B547E61DDDB6\" sourceRef=\"sid-B1C30549-F180-4515-9926-F2036892B4C1\" targetRef=\"sid-E91A2C66-8518-4301-8912-DA783975DD45\">\n      </sequenceFlow>\n   </process>\n   <process id=\"sid-D0B76975-2A71-4345-9861-401E7CB66AF6\" isClosed=\"false\" isExecutable=\"false\" name=\"Durchführung Bewerbungsgespräch - &#10;Sachbearbeiter Personal\" processType=\"None\">\n      <extensionElements/>\n      <laneSet id=\"sid-e4f90877-6c3c-47d0-8114-07aef80491f2\">\n         <lane id=\"sid-13E4B11F-E8D5-434E-9AE3-A42ED2084731\">\n            <flowNodeRef>sid-155B51B2-12E4-4A0B-AFDF-DDBA2EE093D5</flowNodeRef>\n            <flowNodeRef>sid-3B833F36-ABCE-49A9-B268-445BAC9F758D</flowNodeRef>\n            <flowNodeRef>sid-A56AC510-264D-4291-B1CE-A035C2037437</flowNodeRef>\n            <flowNodeRef>sid-9A0A93AB-0A05-4D01-BF02-14A9C3189E84</flowNodeRef>\n            <flowNodeRef>sid-8CE3896D-0181-49CE-A1A9-C085262DA0FA</flowNodeRef>\n            <flowNodeRef>sid-42305309-4E98-47F0-80C4-690E2DB222C0</flowNodeRef>\n            <flowNodeRef>sid-4C1265A5-A535-48FB-99E9-68E0EC37C624</flowNodeRef>\n            <flowNodeRef>sid-53EE6F0D-43BE-4883-B018-3BB90743DC25</flowNodeRef>\n            <flowNodeRef>sid-91FF7684-71E6-497E-9938-0C9469B597EA</flowNodeRef>\n            <flowNodeRef>sid-286F337E-9361-4B4D-AF78-7E403CA80DA1</flowNodeRef>\n            <flowNodeRef>sid-DC5EFA1A-9841-4010-A16B-D771AA2B57C3</flowNodeRef>\n            <flowNodeRef>sid-8700D448-747C-4559-9A57-BFE8AAD639D4</flowNodeRef>\n            <flowNodeRef>sid-DB5144E8-CEDC-4333-BE75-A63907FDC5F0</flowNodeRef>\n         </lane>\n      </laneSet>\n      <task completionQuantity=\"1\" id=\"sid-155B51B2-12E4-4A0B-AFDF-DDBA2EE093D5\" isForCompensation=\"false\" name=\"Bewerbungs-gespräch &#10;führen\" startQuantity=\"1\">\n         <incoming>sid-3906E383-5898-47F6-84FE-CBA12360BCF9</incoming>\n         <outgoing>sid-11A2840A-596D-4937-BB37-0D5952E03535</outgoing>\n      </task>\n      <dataObjectReference id=\"sid-DF651323-2973-4344-A5E5-4FFF3FDCD702\" name=\"Führungskraft&#10;Fachbereich\">\n      </dataObjectReference>\n      <startEvent id=\"sid-3B833F36-ABCE-49A9-B268-445BAC9F758D\" isInterrupting=\"true\" name=\"Gesprächs-&#10;termin&#10;erreicht\">\n         <outgoing>sid-3906E383-5898-47F6-84FE-CBA12360BCF9</outgoing>\n         <conditionalEventDefinition id=\"sid-3334a259-921f-4caa-bf4e-fc23785e7a21\">\n            <condition>FOO</condition>\n         </conditionalEventDefinition>\n      </startEvent>\n      <task completionQuantity=\"1\" id=\"sid-A56AC510-264D-4291-B1CE-A035C2037437\" isForCompensation=\"false\" name=\"Bewerber beurteilen\" startQuantity=\"1\">\n         <incoming>sid-D3213E0A-906E-4276-8DAF-208E4F416D51</incoming>\n         <outgoing>sid-CBB13D0A-5D67-4908-9D56-4E1A1E2D0E71</outgoing>\n      </task>\n      <parallelGateway gatewayDirection=\"Diverging\" id=\"sid-9A0A93AB-0A05-4D01-BF02-14A9C3189E84\">\n         <incoming>sid-11A2840A-596D-4937-BB37-0D5952E03535</incoming>\n         <outgoing>sid-D3213E0A-906E-4276-8DAF-208E4F416D51</outgoing>\n         <outgoing>sid-8E8DC42E-9AD4-4D6F-AEFC-C6FE6E91B6D3</outgoing>\n      </parallelGateway>\n      <task completionQuantity=\"1\" id=\"sid-8CE3896D-0181-49CE-A1A9-C085262DA0FA\" isForCompensation=\"false\" name=\"Beurteilung anfordern\" startQuantity=\"1\">\n         <incoming>sid-8E8DC42E-9AD4-4D6F-AEFC-C6FE6E91B6D3</incoming>\n         <outgoing>sid-D3E0C8B2-1DEC-4283-9FB3-977DB4382650</outgoing>\n      </task>\n      <intermediateCatchEvent id=\"sid-42305309-4E98-47F0-80C4-690E2DB222C0\" name=\"Beurteilung &#10;erhalten\">\n         <incoming>sid-D3E0C8B2-1DEC-4283-9FB3-977DB4382650</incoming>\n         <outgoing>sid-1CA535D5-1E51-41B7-A555-3E8BB651FE97</outgoing>\n         <messageEventDefinition id=\"sid-7ef64170-097f-4830-b73c-f9f72fcadf0c\"/>\n      </intermediateCatchEvent>\n      <parallelGateway gatewayDirection=\"Converging\" id=\"sid-4C1265A5-A535-48FB-99E9-68E0EC37C624\">\n         <incoming>sid-CBB13D0A-5D67-4908-9D56-4E1A1E2D0E71</incoming>\n         <incoming>sid-1CA535D5-1E51-41B7-A555-3E8BB651FE97</incoming>\n         <outgoing>sid-47FE04AD-8529-45E5-87E6-F7992404494A</outgoing>\n      </parallelGateway>\n      <task completionQuantity=\"1\" id=\"sid-53EE6F0D-43BE-4883-B018-3BB90743DC25\" isForCompensation=\"false\" name=\"Beurteilungen auswerten\" startQuantity=\"1\">\n         <incoming>sid-47FE04AD-8529-45E5-87E6-F7992404494A</incoming>\n         <outgoing>sid-778CB5F7-7B50-4086-AEAF-A84CA5D34A8F</outgoing>\n      </task>\n      <exclusiveGateway gatewayDirection=\"Diverging\" id=\"sid-91FF7684-71E6-497E-9938-0C9469B597EA\" name=\"Kandidat &#10;für Stelle &#10;geeignet?\">\n         <incoming>sid-778CB5F7-7B50-4086-AEAF-A84CA5D34A8F</incoming>\n         <outgoing>sid-CB506E96-0C3C-4B65-9290-18EA192E62FE</outgoing>\n         <outgoing>sid-67782ED7-78C0-47F3-9EAC-46F9F194D843</outgoing>\n      </exclusiveGateway>\n      <task completionQuantity=\"1\" id=\"sid-286F337E-9361-4B4D-AF78-7E403CA80DA1\" isForCompensation=\"false\" name=\"Bewerbungs-&#10;daten aktualisieren\" startQuantity=\"1\">\n         <incoming>sid-CB506E96-0C3C-4B65-9290-18EA192E62FE</incoming>\n         <outgoing>sid-7363B1EE-93CD-49D4-966B-8F1368A01010</outgoing>\n      </task>\n      <endEvent id=\"sid-DC5EFA1A-9841-4010-A16B-D771AA2B57C3\" name=\"Bewerbungs-&#10;gespräch &#10;durchgeführt &#10;(keine Besetzung)\">\n         <incoming>sid-7363B1EE-93CD-49D4-966B-8F1368A01010</incoming>\n      </endEvent>\n      <task completionQuantity=\"1\" id=\"sid-8700D448-747C-4559-9A57-BFE8AAD639D4\" isForCompensation=\"false\" name=\"Arbeits-&#10;vertrag anfordern\" startQuantity=\"1\">\n         <incoming>sid-67782ED7-78C0-47F3-9EAC-46F9F194D843</incoming>\n         <outgoing>sid-ADF333C6-9197-4556-A2C4-19BBC7122609</outgoing>\n      </task>\n      <endEvent id=\"sid-DB5144E8-CEDC-4333-BE75-A63907FDC5F0\" name=\"Bewerbungs-&#10;gespräch &#10;durchgeführt &#10;(Besetzung erfolgt)\">\n         <incoming>sid-ADF333C6-9197-4556-A2C4-19BBC7122609</incoming>\n      </endEvent>\n      <sequenceFlow id=\"sid-D3213E0A-906E-4276-8DAF-208E4F416D51\" sourceRef=\"sid-9A0A93AB-0A05-4D01-BF02-14A9C3189E84\" targetRef=\"sid-A56AC510-264D-4291-B1CE-A035C2037437\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-CBB13D0A-5D67-4908-9D56-4E1A1E2D0E71\" sourceRef=\"sid-A56AC510-264D-4291-B1CE-A035C2037437\" targetRef=\"sid-4C1265A5-A535-48FB-99E9-68E0EC37C624\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-CB506E96-0C3C-4B65-9290-18EA192E62FE\" name=\"nein\" sourceRef=\"sid-91FF7684-71E6-497E-9938-0C9469B597EA\" targetRef=\"sid-286F337E-9361-4B4D-AF78-7E403CA80DA1\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-8E8DC42E-9AD4-4D6F-AEFC-C6FE6E91B6D3\" sourceRef=\"sid-9A0A93AB-0A05-4D01-BF02-14A9C3189E84\" targetRef=\"sid-8CE3896D-0181-49CE-A1A9-C085262DA0FA\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-D3E0C8B2-1DEC-4283-9FB3-977DB4382650\" sourceRef=\"sid-8CE3896D-0181-49CE-A1A9-C085262DA0FA\" targetRef=\"sid-42305309-4E98-47F0-80C4-690E2DB222C0\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-1CA535D5-1E51-41B7-A555-3E8BB651FE97\" sourceRef=\"sid-42305309-4E98-47F0-80C4-690E2DB222C0\" targetRef=\"sid-4C1265A5-A535-48FB-99E9-68E0EC37C624\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-47FE04AD-8529-45E5-87E6-F7992404494A\" sourceRef=\"sid-4C1265A5-A535-48FB-99E9-68E0EC37C624\" targetRef=\"sid-53EE6F0D-43BE-4883-B018-3BB90743DC25\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-778CB5F7-7B50-4086-AEAF-A84CA5D34A8F\" sourceRef=\"sid-53EE6F0D-43BE-4883-B018-3BB90743DC25\" targetRef=\"sid-91FF7684-71E6-497E-9938-0C9469B597EA\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-3906E383-5898-47F6-84FE-CBA12360BCF9\" sourceRef=\"sid-3B833F36-ABCE-49A9-B268-445BAC9F758D\" targetRef=\"sid-155B51B2-12E4-4A0B-AFDF-DDBA2EE093D5\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-11A2840A-596D-4937-BB37-0D5952E03535\" sourceRef=\"sid-155B51B2-12E4-4A0B-AFDF-DDBA2EE093D5\" targetRef=\"sid-9A0A93AB-0A05-4D01-BF02-14A9C3189E84\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-7363B1EE-93CD-49D4-966B-8F1368A01010\" sourceRef=\"sid-286F337E-9361-4B4D-AF78-7E403CA80DA1\" targetRef=\"sid-DC5EFA1A-9841-4010-A16B-D771AA2B57C3\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-ADF333C6-9197-4556-A2C4-19BBC7122609\" sourceRef=\"sid-8700D448-747C-4559-9A57-BFE8AAD639D4\" targetRef=\"sid-DB5144E8-CEDC-4333-BE75-A63907FDC5F0\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-67782ED7-78C0-47F3-9EAC-46F9F194D843\" name=\"ja\" sourceRef=\"sid-91FF7684-71E6-497E-9938-0C9469B597EA\" targetRef=\"sid-8700D448-747C-4559-9A57-BFE8AAD639D4\">\n      </sequenceFlow>\n      <association associationDirection=\"None\" id=\"sid-E9D52506-E99F-412F-803B-0A7BB95CFA2D\" sourceRef=\"sid-3B833F36-ABCE-49A9-B268-445BAC9F758D\" targetRef=\"sid-9B744161-CE38-41EC-847E-D264A5BFA9CC\">\n      </association>\n      <association associationDirection=\"None\" id=\"sid-94C02BC5-3BDF-458B-AB2C-1B7880E74C90\" sourceRef=\"sid-286F337E-9361-4B4D-AF78-7E403CA80DA1\" targetRef=\"sid-A8C71BAE-B5D6-4BC1-BF48-636E34FDC5DA\">\n      </association>\n      <association associationDirection=\"None\" id=\"sid-83F7F019-81C1-4508-B20B-0534B547D7B8\" sourceRef=\"sid-155B51B2-12E4-4A0B-AFDF-DDBA2EE093D5\" targetRef=\"sid-DF651323-2973-4344-A5E5-4FFF3FDCD702\">\n      </association>\n      <association associationDirection=\"None\" id=\"sid-48E58EB6-ECEE-44B0-8AE3-DD8590112929\" sourceRef=\"sid-53EE6F0D-43BE-4883-B018-3BB90743DC25\" targetRef=\"sid-99DC1CC9-AD54-41FE-BA99-BBFCB0A1792D\">\n      </association>\n      <textAnnotation id=\"sid-9B744161-CE38-41EC-847E-D264A5BFA9CC\" textFormat=\"text/plain\">\n         <text>ID7</text>\n      </textAnnotation>\n      <textAnnotation id=\"sid-A8C71BAE-B5D6-4BC1-BF48-636E34FDC5DA\" textFormat=\"text/plain\">\n         <text>ID5</text>\n      </textAnnotation>\n      <textAnnotation id=\"sid-99DC1CC9-AD54-41FE-BA99-BBFCB0A1792D\" textFormat=\"text/plain\">\n         <text>ID6</text>\n      </textAnnotation>\n      <textAnnotation id=\"sid-9CB103FC-4135-44AE-B4F6-3C1116CCC0FD\" textFormat=\"text/plain\">\n         <text>ID1: Was passiert wenn sich kein Bewerber gemeldet hat? --&gt; Anpassen der Stellenausschreibung, löschen dieser? \nID2: Die Bewerbung soll auch archiviert werden, jedoch mit Status \"bei Eingang abgelehnt\"\nID3: Die Informationen wann welcher Bewerber eingeladen wurde, soll bitte im Tool erfasst werden.\nID4: Müssen hier die Bewerbungs-unterlagen zurückgesendet werden?\nID5: Müssen hier die Bewerbungsunterlagen zurückgesendet werden?\nID6: kann der Bewerber auch \"geparkt\" werden, wenn weitere Gespräche folgen? wenn ja, wie soll das geschehen?\nID7: Was passiert wenn der Teilnehmer nicht erscheint?\nID8: Müssen hier die Bewerbungsunterlagen zurückgesendet werden?\nID9: Wie laufen jetzt alle anderen Bewerbungsgespräche? Werden die neu gestartet? \nID10: Muss jetzt die Stelle offline genommen werden?\nID11: Wie funktioniert das genau? Prozesskopplung zu Management Bewerbungsgespräche?\nID12: Soll IT-unterstützt laufen, gemäß vordefiniertem Template\nID13: Vorgabe wie das Filtern von statten gehen soll?! --&gt; Business Rules</text>\n      </textAnnotation>\n      <textAnnotation id=\"sid-9FBF1EA9-75EA-44B0-8B16-9F82808B0566\" textFormat=\"text/plain\">\n         <text>Annahmen:\n- alle Bewerbungen gehen über Personal ein.\n- unvollständige Bewerbungen werden nicht verfolgt bzw. nach einer Frist verworfen\n- Es wurden nur Bewerber eingeladen, da aus Personalsicht inhaltlich geprüft sind. (z.B. müssen die Bewerbungen vollständig sein!)</text>\n      </textAnnotation>\n      <textAnnotation id=\"sid-CC64D413-A2EA-438C-B0FE-27F814C0C97B\" textFormat=\"text/plain\">\n         <text>Fehlt noch:\n- Teilnehmer kann rückmelden, dass er Bewerbung zurückzieht\n- Teilnehmer kann rückmelden, dass er Bewerbungsgespräch nicht wahrnehmen kann (komplette Absage oder neuen Termin vereinbaren)\n- Verwendung von Daten ist nicht konsistent im Modell eingezeichnet\n- Klärung der offenen ToDos direkt im Diagramm</text>\n      </textAnnotation>\n   </process>\n   <bpmndi:BPMNDiagram id=\"sid-780f0a66-41b5-4f10-a81d-35e00c8c284d\">\n      <bpmndi:BPMNPlane bpmnElement=\"sid-3524ea26-a8cb-4d8f-b997-347710bca219\" id=\"sid-1780a274-6bf1-44a0-9a08-01bd7c9ad080\">\n         <bpmndi:BPMNShape bpmnElement=\"sid-43B00F10-A229-44CF-BAD4-7F7147D380E9\" id=\"sid-43B00F10-A229-44CF-BAD4-7F7147D380E9_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"60.0\" width=\"355.5568101617905\" x=\"2201.107827010984\" y=\"977.8992279207121\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-C08CDF7A-062A-4F46-80DA-02F243AB0B3F\" id=\"sid-C08CDF7A-062A-4F46-80DA-02F243AB0B3F_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"516.2840999798505\" width=\"1084.8155221183988\" x=\"4140.87929573313\" y=\"1094.3114175851833\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-1C31EF64-81F8-4886-88E9-434DF53A7B5F\" id=\"sid-1C31EF64-81F8-4886-88E9-434DF53A7B5F_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"45.136194234387176\" width=\"637.3294309724545\" x=\"1663.7783960385293\" y=\"1613.325779394058\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-CC1C0D76-B3D1-4A22-B9D8-8C8FA4D85FB7\" id=\"sid-CC1C0D76-B3D1-4A22-B9D8-8C8FA4D85FB7_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"194.656106471964\" width=\"815.6833773851923\" x=\"379.6711368833729\" y=\"1691.702771689759\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-7BD88080-E847-40D9-9714-C838543CEC18\" id=\"sid-7BD88080-E847-40D9-9714-C838543CEC18_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"478.9471515601299\" width=\"1509.7028533441512\" x=\"1282.332796247655\" y=\"1105.1402360454592\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-CB881798-E52C-4F03-809F-765C5F84EE04\" id=\"sid-CB881798-E52C-4F03-809F-765C5F84EE04_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"448.9175491475594\" width=\"1097.1673301253031\" x=\"104.0\" y=\"680.0006737747829\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-527C14AA-A993-4E8C-A9CD-99639DF62466\" id=\"sid-527C14AA-A993-4E8C-A9CD-99639DF62466_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"410.60838316680906\" width=\"1164.478719836191\" x=\"2863.2937099746887\" y=\"1100.0006737747829\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-EEF891AC-F8A7-4623-9BA3-F560E2782C9D\" id=\"sid-EEF891AC-F8A7-4623-9BA3-F560E2782C9D_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"68.06481935184274\" width=\"248.5770295790353\" x=\"3676.0099637429494\" y=\"996.3529471932625\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-EED957F8-FF8A-4A3A-918A-944B41FF5D4D\" id=\"sid-EED957F8-FF8A-4A3A-918A-944B41FF5D4D_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"181.78210937446488\" width=\"492.60923266973737\" x=\"334.30314416078\" y=\"1163.5638038949044\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-C583AB0E-16D2-4440-973E-F03090497640\" id=\"sid-C583AB0E-16D2-4440-973E-F03090497640_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"60.0\" width=\"745.9843462162698\" x=\"145.0156537837301\" y=\"65.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-A280AE73-E103-45BC-8078-8ADB6A8AF29C\" id=\"sid-A280AE73-E103-45BC-8078-8ADB6A8AF29C_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"194.656106471964\" width=\"820.5111262967542\" x=\"374.843387971811\" y=\"1402.6988141169604\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-19D91440-484D-4E64-BC61-4ADA8E26CA29\" id=\"sid-19D91440-484D-4E64-BC61-4ADA8E26CA29_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"181.78210937446534\" width=\"492.60923266973714\" x=\"3215.1631971411425\" y=\"1563.5638038949046\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-C95FEFFE-4759-4ABA-B11D-E4BA65DA268F\" id=\"sid-C95FEFFE-4759-4ABA-B11D-E4BA65DA268F_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"60.0\" width=\"145.64729850960907\" x=\"1931.7783960385293\" y=\"977.8992279207121\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-2E859D5D-83B3-461D-9FFF-2AAF49E71D2A\" id=\"sid-2E859D5D-83B3-461D-9FFF-2AAF49E71D2A_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"57.07691701910392\" width=\"118.11908443277753\" x=\"3013.5537886758975\" y=\"1007.1564026300078\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-F18FD2E3-46A6-4E86-9AA9-D67094D0DCE7\" id=\"sid-F18FD2E3-46A6-4E86-9AA9-D67094D0DCE7_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"68.06481935184274\" width=\"248.5770295790353\" x=\"4731.860002239837\" y=\"1652.4203946409168\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-6C68E5FA-5812-446E-A335-AD6B18AD9BC6\" id=\"sid-6C68E5FA-5812-446E-A335-AD6B18AD9BC6_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"45.136194234387176\" width=\"487.12070065773514\" x=\"4420.860002239837\" y=\"1007.156402630008\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-187453C6-5AB5-4A6D-9A62-BF537E04EA0D\" id=\"sid-187453C6-5AB5-4A6D-9A62-BF537E04EA0D_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"388.24659185877476\" width=\"1202.9761068025962\" x=\"110.0\" y=\"170.4343468355338\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-E391B624-F6E8-428B-9C3E-7026F85C4F24\" id=\"sid-E391B624-F6E8-428B-9C3E-7026F85C4F24_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"388.24659185877476\" width=\"1172.9761068025962\" x=\"140.0\" y=\"170.4343468355338\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-8E5D2B9D-6731-4FA7-BB27-C444A7236A69\" id=\"sid-8E5D2B9D-6731-4FA7-BB27-C444A7236A69_gui\">\n            <omgdc:Bounds height=\"79.99999999999994\" width=\"100.0\" x=\"793.0\" y=\"428.08209669363004\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-028EEE79-92D7-4C1B-B90D-905AA2697614\" id=\"sid-028EEE79-92D7-4C1B-B90D-905AA2697614_gui\">\n            <omgdc:Bounds height=\"79.99999999999994\" width=\"100.0\" x=\"938.0\" y=\"428.08209669363004\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-7C1A234F-E066-438E-96E1-C0D7847288EA\" id=\"sid-7C1A234F-E066-438E-96E1-C0D7847288EA_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"1083.0\" y=\"454.08209669363004\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-6EED0CFD-023A-4ACC-B944-42D90A617BDF\" id=\"sid-6EED0CFD-023A-4ACC-B944-42D90A617BDF_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"173.0\" y=\"453.2801627987431\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-CCECC1E8-CA9C-49BB-BEDF-75F173A11194\" id=\"sid-CCECC1E8-CA9C-49BB-BEDF-75F173A11194_gui\">\n            <omgdc:Bounds height=\"79.99999999999994\" width=\"100.0\" x=\"308.0\" y=\"428.08209669363004\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-F1FC14E4-8BBB-4647-9F9D-179663172496\" id=\"sid-F1FC14E4-8BBB-4647-9F9D-179663172496_gui\" isMarkerVisible=\"true\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"454.342567669863\" y=\"448.08209669363004\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-FF2BEA0D-55D5-4F2B-B7BA-195BC10CA9EB\" id=\"sid-FF2BEA0D-55D5-4F2B-B7BA-195BC10CA9EB_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"508.0\" y=\"269.0035915854284\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-8910ED9B-DADC-4E11-9AD5-E12448B57ADF\" id=\"sid-8910ED9B-DADC-4E11-9AD5-E12448B57ADF_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"721.1673301253031\" y=\"217.13294388061487\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-545B3227-D12A-43A8-B746-55E8C75F3A8A\" id=\"sid-545B3227-D12A-43A8-B746-55E8C75F3A8A_gui\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.00000000000006\" x=\"648.30314416078\" y=\"289.0790074786434\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-0FE7F936-F79B-4EB8-95F0-DC0AB97C682F\" id=\"sid-0FE7F936-F79B-4EB8-95F0-DC0AB97C682F_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"721.1673301253031\" y=\"294.0790074786434\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-05FFFE92-8A4C-43AB-8D9A-E14A1B0EE051\" id=\"sid-05FFFE92-8A4C-43AB-8D9A-E14A1B0EE051_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"796.1673301253031\" y=\"269.0790074786434\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-28EA3990-9252-49F9-AD56-8FCDBFD7DA7D\" id=\"sid-28EA3990-9252-49F9-AD56-8FCDBFD7DA7D_gui\" isMarkerVisible=\"true\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"941.1673301253031\" y=\"289.0790074786434\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-25203984-1D0A-494D-AD69-9140631D10FD\" id=\"sid-25203984-1D0A-494D-AD69-9140631D10FD_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"1086.1673301253031\" y=\"269.0790074786434\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-6243D8FF-E57D-4D03-8234-40836D4E60D5\" id=\"sid-6243D8FF-E57D-4D03-8234-40836D4E60D5_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"1231.1673301253031\" y=\"295.0790074786434\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-72EBDBE9-3856-4AF7-9DDB-7C0F478E26D8\" id=\"sid-72EBDBE9-3856-4AF7-9DDB-7C0F478E26D8_gui\" isMarkerVisible=\"true\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"237.0\" y=\"448.2801627987431\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-57892D76-E413-4274-B8DE-FED72250C8A7\" id=\"sid-57892D76-E413-4274-B8DE-FED72250C8A7_gui\" isMarkerVisible=\"true\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"695.1791989805283\" y=\"448.2801627987431\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-6392228F-E287-40F3-9DD6-B91493F6B671\" id=\"sid-6392228F-E287-40F3-9DD6-B91493F6B671_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"550.6769084335893\" y=\"428.2801627987431\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-EC21E3DA-12C5-4B74-83F7-530229F6C777\" id=\"sid-EC21E3DA-12C5-4B74-83F7-530229F6C777_gui\" isMarkerVisible=\"true\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"1020.0\" y=\"289.0790074786434\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-E8C87193-03FE-438D-A921-0BAB9FBD08D9\" id=\"sid-E8C87193-03FE-438D-A921-0BAB9FBD08D9_gui\">\n            <omgdc:Bounds height=\"60.173\" width=\"62.000999999999976\" x=\"957.0\" y=\"580.3529471932625\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-0862744E-76C7-4681-8759-7B8E629828B8\" id=\"sid-0862744E-76C7-4681-8759-7B8E629828B8_gui\">\n            <omgdc:Bounds height=\"22.98509388695672\" width=\"29.022879143563387\" x=\"1144.9999999999998\" y=\"224.14784999365816\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-3E1FA189-AC8C-4CF1-9057-3D2EF8C6D3AF\" id=\"sid-3E1FA189-AC8C-4CF1-9057-3D2EF8C6D3AF_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"516.2840999798505\" width=\"1054.8155221183988\" x=\"4170.87929573313\" y=\"1094.3114175851833\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-B104C31F-A70F-4206-AF8E-442C5C2EEE49\" id=\"sid-B104C31F-A70F-4206-AF8E-442C5C2EEE49_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"4280.116563544298\" y=\"1252.609056941592\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-1F104A2B-C7CC-49E1-87F1-8391D31274BE\" id=\"sid-1F104A2B-C7CC-49E1-87F1-8391D31274BE_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"4420.860002239837\" y=\"1252.6090569415917\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-AB73793C-D47A-4738-B34F-A82C6219A92C\" id=\"sid-AB73793C-D47A-4738-B34F-A82C6219A92C_gui\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"4565.860002239837\" y=\"1272.6090569415917\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-9838543B-F6B3-4432-A9B3-8B790A762147\" id=\"sid-9838543B-F6B3-4432-A9B3-8B790A762147_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"4650.860002239837\" y=\"1277.6090569415917\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-EA77B0E4-4512-4A05-B100-88605F5B7995\" id=\"sid-EA77B0E4-4512-4A05-B100-88605F5B7995_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"4805.860002239837\" y=\"1252.6090569415917\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-2E9539B9-F0F1-4AEE-ADDB-4C8AD7A3920C\" id=\"sid-2E9539B9-F0F1-4AEE-ADDB-4C8AD7A3920C_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"4950.860002239836\" y=\"1278.6090569415917\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-4D91885E-63D7-460F-ACAB-3B1300D396FB\" id=\"sid-4D91885E-63D7-460F-ACAB-3B1300D396FB_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"4710.860002239837\" y=\"1168.0006737747826\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-C5457771-C93B-44FD-8D70-05849F25C775\" id=\"sid-C5457771-C93B-44FD-8D70-05849F25C775_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"4785.860002239837\" y=\"1143.0006737747826\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-7C6C6457-0FF6-4074-BC87-D5653F7F8037\" id=\"sid-7C6C6457-0FF6-4074-BC87-D5653F7F8037_gui\" isMarkerVisible=\"true\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"4930.860002239836\" y=\"1163.0006737747826\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-C0A39E1E-6BA6-4A7C-98C4-597CEF56D803\" id=\"sid-C0A39E1E-6BA6-4A7C-98C4-597CEF56D803_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"5015.860002239836\" y=\"1143.0006737747826\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-691FDEB6-F626-4AB1-8E90-3653C83C04EA\" id=\"sid-691FDEB6-F626-4AB1-8E90-3653C83C04EA_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"4209.745262850934\" y=\"1277.609056941592\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-DD0BC4E1-4AA3-4835-A477-373EA263A593\" id=\"sid-DD0BC4E1-4AA3-4835-A477-373EA263A593_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"5160.860002239836\" y=\"1169.0006737747826\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-D16273A3-B9E4-4D02-8072-3868DC29A662\" id=\"sid-D16273A3-B9E4-4D02-8072-3868DC29A662_gui\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"4721.130483194386\" y=\"1272.6839573668829\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-C01A5EDF-FDDA-4675-86DD-EC939CA503EA\" id=\"sid-C01A5EDF-FDDA-4675-86DD-EC939CA503EA_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"4805.860002239837\" y=\"1355.1414965169647\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-5C56D37A-6C15-43CB-8253-E56329A0F15B\" id=\"sid-5C56D37A-6C15-43CB-8253-E56329A0F15B_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"4950.860002239837\" y=\"1381.1414965169647\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-D453B3D6-0EA6-4607-A413-C6332ABE9F32\" id=\"sid-D453B3D6-0EA6-4607-A413-C6332ABE9F32_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"4805.860002239837\" y=\"1505.1783551768249\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-07626FBD-C7FA-466D-AC08-F579B7A9C2EA\" id=\"sid-07626FBD-C7FA-466D-AC08-F579B7A9C2EA_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"4950.860002239837\" y=\"1531.1783551768249\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-4FEF9487-CB3D-4D59-9804-557A8AE86B48\" id=\"sid-4FEF9487-CB3D-4D59-9804-557A8AE86B48_gui\">\n            <omgdc:Bounds height=\"32.98509388695675\" width=\"29.02287914356384\" x=\"4327.388697950719\" y=\"1359.5746872546945\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-F767618B-825D-4952-95F9-8FDA8D10C596\" id=\"sid-F767618B-825D-4952-95F9-8FDA8D10C596_gui\">\n            <omgdc:Bounds height=\"29.839732512924684\" width=\"29.022879143562932\" x=\"5090.629029233553\" y=\"1246.0006737747826\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-0048F8AB-F92F-4371-9661-82765136E785\" id=\"sid-0048F8AB-F92F-4371-9661-82765136E785_gui\">\n            <omgdc:Bounds height=\"21.6942873061721\" width=\"29.02287914356384\" x=\"4860.860002239835\" y=\"1458.9378027665657\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-B35D2825-DC27-4D6C-81EB-160C5741F700\" id=\"sid-B35D2825-DC27-4D6C-81EB-160C5741F700_gui\">\n            <omgdc:Bounds height=\"32.98509388695675\" width=\"29.02287914356384\" x=\"5002.952769486505\" y=\"1276.0006737747829\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-B8B18E3A-EF8D-4D19-B5CD-C666D39E2E0D\" id=\"sid-B8B18E3A-EF8D-4D19-B5CD-C666D39E2E0D_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"181.78210937446488\" width=\"462.60923266973737\" x=\"364.30314416078\" y=\"1163.5638038949044\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-991275D8-E60A-440A-B2DD-094D2B0049A4\" id=\"sid-991275D8-E60A-440A-B2DD-094D2B0049A4_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"402.78749374306034\" y=\"1239.5638038949044\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-19BF350B-2D34-4049-B17C-AE0265F407CB\" id=\"sid-19BF350B-2D34-4049-B17C-AE0265F407CB_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"477.78749374306034\" y=\"1214.5638038949044\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-D56D4E10-864F-4B2B-898E-AA9641C98E63\" id=\"sid-D56D4E10-864F-4B2B-898E-AA9641C98E63_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"622.7874937430604\" y=\"1214.5638038949044\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-0C2D523B-E4EB-4776-AFA3-43B156AAE378\" id=\"sid-0C2D523B-E4EB-4776-AFA3-43B156AAE378_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"768.02878006777\" y=\"1240.5638038949044\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-994BB7B0-64D8-4DC4-B549-0758628F5A16\" id=\"sid-994BB7B0-64D8-4DC4-B549-0758628F5A16_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"181.78210937446534\" width=\"462.60923266973714\" x=\"3245.1631971411425\" y=\"1563.5638038949046\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-B7711D66-52EB-4437-AA0C-5671CE83C6E6\" id=\"sid-B7711D66-52EB-4437-AA0C-5671CE83C6E6_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"3280.5125515566237\" y=\"1639.5638038949044\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-066B769F-EAEB-42E5-ACAB-341240A5F87D\" id=\"sid-066B769F-EAEB-42E5-ACAB-341240A5F87D_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"3355.5125515566237\" y=\"1614.5638038949044\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-4F2CDAD6-92D6-470B-B82C-8D07E050591A\" id=\"sid-4F2CDAD6-92D6-470B-B82C-8D07E050591A_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"3500.5125515566237\" y=\"1614.5638038949044\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-943A343F-C038-49B9-8640-7BDABFB8E1BF\" id=\"sid-943A343F-C038-49B9-8640-7BDABFB8E1BF_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"3645.5125515566237\" y=\"1640.5638038949044\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-0F208AE2-EC60-4823-9B6A-D062A91587F2\" id=\"sid-0F208AE2-EC60-4823-9B6A-D062A91587F2_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"194.656106471964\" width=\"790.5111262967542\" x=\"404.843387971811\" y=\"1402.6988141169604\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-F5C79AC7-BB82-4CEC-A1E0-DB441A30CE08\" id=\"sid-F5C79AC7-BB82-4CEC-A1E0-DB441A30CE08_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"437.0895994902646\" y=\"1506.043129418471\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-FB3673BF-5359-4ACE-B2A2-1C546E2D95C0\" id=\"sid-FB3673BF-5359-4ACE-B2A2-1C546E2D95C0_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"512.0895994902646\" y=\"1481.043129418471\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-2416E79A-ED80-4834-B7A9-A2F6F1B1F5D8\" id=\"sid-2416E79A-ED80-4834-B7A9-A2F6F1B1F5D8_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"757.0895994902646\" y=\"1481.043129418471\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-DDA78FB8-B5BB-490F-8AB6-144A28AB646B\" id=\"sid-DDA78FB8-B5BB-490F-8AB6-144A28AB646B_gui\" isMarkerVisible=\"true\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.00000000000006\" x=\"902.0895994902647\" y=\"1501.043129418471\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-8ED06068-AA04-428D-860D-8CA2A0483C2A\" id=\"sid-8ED06068-AA04-428D-860D-8CA2A0483C2A_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"987.0895994902647\" y=\"1481.043129418471\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-AD5109AB-9014-4810-AB7B-3A4990FB44D1\" id=\"sid-AD5109AB-9014-4810-AB7B-3A4990FB44D1_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"1132.0895994902648\" y=\"1507.043129418471\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-6B8D60D6-2BC0-4969-A16A-ABCD8586DEAD\" id=\"sid-6B8D60D6-2BC0-4969-A16A-ABCD8586DEAD_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.000000000000057\" x=\"908.0895994902647\" y=\"1419.6564743455256\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-BA5E7744-B79B-47D2-8D85-7D38B00D52CF\" id=\"sid-BA5E7744-B79B-47D2-8D85-7D38B00D52CF_gui\" isMarkerVisible=\"true\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"661.0000000000005\" y=\"1501.0431294184707\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-23B471A9-0A76-483C-AD0B-65092D0477BF\" id=\"sid-23B471A9-0A76-483C-AD0B-65092D0477BF_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"667.0000000000005\" y=\"1419.6564743455256\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-8006DF6D-4AC4-4BD4-8BE5-95CA3CCC182D\" id=\"sid-8006DF6D-4AC4-4BD4-8BE5-95CA3CCC182D_gui\">\n            <omgdc:Bounds height=\"60.173\" width=\"62.000999999999976\" x=\"531.0895994902646\" y=\"1612.325779394058\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-B22F345F-EAB4-4D92-A810-C4B9AFCC4A6F\" id=\"sid-B22F345F-EAB4-4D92-A810-C4B9AFCC4A6F_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"194.656106471964\" width=\"785.6833773851923\" x=\"409.6711368833729\" y=\"1691.702771689759\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-699FBA56-8A57-43AC-ACC4-090A9B4AB26A\" id=\"sid-699FBA56-8A57-43AC-ACC4-090A9B4AB26A_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"437.0895994902646\" y=\"1795.0470869912692\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-1FFCF5B7-A6EE-4D63-AC49-5CD21F277383\" id=\"sid-1FFCF5B7-A6EE-4D63-AC49-5CD21F277383_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"512.0895994902646\" y=\"1770.0470869912692\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-CC14630C-7FFB-4CD2-954A-1D52340F34B4\" id=\"sid-CC14630C-7FFB-4CD2-954A-1D52340F34B4_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"757.0895994902646\" y=\"1770.0470869912692\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-8BC4F3B3-CA44-48C2-B3FA-137EAEC7D012\" id=\"sid-8BC4F3B3-CA44-48C2-B3FA-137EAEC7D012_gui\" isMarkerVisible=\"true\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"902.0895994902646\" y=\"1790.0470869912692\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-F197542D-D274-45BE-95A5-7A3608BBE27A\" id=\"sid-F197542D-D274-45BE-95A5-7A3608BBE27A_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"987.0895994902647\" y=\"1770.0470869912692\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-3820CBDB-C1E3-47EA-BCE1-10C9DBAEDB37\" id=\"sid-3820CBDB-C1E3-47EA-BCE1-10C9DBAEDB37_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"1132.0895994902648\" y=\"1796.0470869912692\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-308728F0-D1C5-4383-AA70-41249841A930\" id=\"sid-308728F0-D1C5-4383-AA70-41249841A930_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"908.0895994902646\" y=\"1708.6604319183239\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-4FA5730A-F51C-4CEE-98F0-631553512966\" id=\"sid-4FA5730A-F51C-4CEE-98F0-631553512966_gui\" isMarkerVisible=\"true\">\n            <omgdc:Bounds height=\"40.0\" width=\"39.99999999999997\" x=\"661.0000000000005\" y=\"1790.047086991269\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-7F1356BF-93F9-41C2-937C-E943B8818EB3\" id=\"sid-7F1356BF-93F9-41C2-937C-E943B8818EB3_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"667.0000000000005\" y=\"1708.6604319183236\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-4E447BCA-4A6B-4944-8A1C-1A184D6A95FD\" id=\"sid-4E447BCA-4A6B-4944-8A1C-1A184D6A95FD_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"448.9175491475594\" width=\"1067.1673301253031\" x=\"134.0\" y=\"680.0006737747829\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-A9859F1C-A85B-4F2F-B2DF-E3F4F7FA67FA\" id=\"sid-A9859F1C-A85B-4F2F-B2DF-E3F4F7FA67FA_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"269.0000000000001\" y=\"871.6401778194537\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-8D8BD39F-1B08-433F-8F93-A1FF7520BA8B\" id=\"sid-8D8BD39F-1B08-433F-8F93-A1FF7520BA8B_gui\">\n            <omgdc:Bounds height=\"97.0\" width=\"88.0\" x=\"377.0000000000001\" y=\"732.3258485520023\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-B9B94A24-2819-461A-B5E8-61182BDA87DD\" id=\"sid-B9B94A24-2819-461A-B5E8-61182BDA87DD_gui\" isMarkerVisible=\"true\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"401.4185238533304\" y=\"891.6401778194535\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-86DC77E1-24A3-499E-89D0-499B4BBFF67A\" id=\"sid-86DC77E1-24A3-499E-89D0-499B4BBFF67A_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"194.01565378373016\" y=\"896.7769545531015\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-F0DA46E1-7E86-4236-9D49-290DD7B87C61\" id=\"sid-F0DA46E1-7E86-4236-9D49-290DD7B87C61_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"99.99999999999989\" x=\"494.0000000000001\" y=\"871.6401778194537\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-BEC67F12-04E9-4AE2-B59E-FEB109CD3DF8\" id=\"sid-BEC67F12-04E9-4AE2-B59E-FEB109CD3DF8_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"407.85078742584005\" y=\"1001.1414965169647\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-303796CF-BA87-40A7-B2EC-9F6E10BD1060\" id=\"sid-303796CF-BA87-40A7-B2EC-9F6E10BD1060_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"631.7798643148516\" y=\"871.0710084524593\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-D3CA93A5-3BCC-4DB3-8075-EAC0C0A53991\" id=\"sid-D3CA93A5-3BCC-4DB3-8075-EAC0C0A53991_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"768.0\" y=\"896.7769545531015\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-282D9841-8694-47FB-A058-32A5B47CFB1E\" id=\"sid-282D9841-8694-47FB-A058-32A5B47CFB1E_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"837.9257246007583\" y=\"871.7907536513751\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-597B2F0C-9759-421B-8F52-D8F26705F2BE\" id=\"sid-597B2F0C-9759-421B-8F52-D8F26705F2BE_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"982.9257246007583\" y=\"871.7907536513751\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-6460C9E2-AD85-4EA6-8922-F9BAB25F1C5F\" id=\"sid-6460C9E2-AD85-4EA6-8922-F9BAB25F1C5F_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"1127.9257246007583\" y=\"897.7907536513751\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-08F7E7A1-A19F-4324-8D38-CD160728FB9A\" id=\"sid-08F7E7A1-A19F-4324-8D38-CD160728FB9A_gui\">\n            <omgdc:Bounds height=\"67.96828632987047\" width=\"100.0\" x=\"179.0000000000001\" y=\"798.357562222132\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-26C1D0AA-CDB7-43FC-A36A-DF0658A215B1\" id=\"sid-26C1D0AA-CDB7-43FC-A36A-DF0658A215B1_gui\">\n            <omgdc:Bounds height=\"32.98509388695675\" width=\"42.335194654896895\" x=\"465.5419640011882\" y=\"987.156402630008\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-86AEF0B1-9EB6-45FD-B9A3-DAE6F5ED71A4\" id=\"sid-86AEF0B1-9EB6-45FD-B9A3-DAE6F5ED71A4_gui\">\n            <omgdc:Bounds height=\"32.98509388695675\" width=\"29.022879143562932\" x=\"537.0\" y=\"976.5999669088854\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-4A0FB2B3-2D67-46F7-ACB3-260FC62E3B5A\" id=\"sid-4A0FB2B3-2D67-46F7-ACB3-260FC62E3B5A_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"478.94715156012984\" width=\"1479.7028533441512\" x=\"1312.332796247655\" y=\"1105.1402360454592\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-36E152C5-1864-4D96-9F9B-27133FD47EFE\" id=\"sid-36E152C5-1864-4D96-9F9B-27133FD47EFE_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"1344.6193694131155\" y=\"1338.3893811587586\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-B1C30549-F180-4515-9926-F2036892B4C1\" id=\"sid-B1C30549-F180-4515-9926-F2036892B4C1_gui\" isExpanded=\"true\">\n            <omgdc:Bounds height=\"414.6537482597123\" width=\"1265.9474090869844\" x=\"1415.3483168571488\" y=\"1146.3893811587586\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-A1EBC62D-CD4A-4D2B-A613-4873898F84F1\" id=\"sid-A1EBC62D-CD4A-4D2B-A613-4873898F84F1_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"1508.808107160443\" y=\"1280.7235025994355\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-B316767E-63CE-4A62-A9BF-AB4F0A0D517F\" id=\"sid-B316767E-63CE-4A62-A9BF-AB4F0A0D517F_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.00000000000011\" x=\"1642.5691951914066\" y=\"1280.3893811587586\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-07E2F210-4975-43A8-AEE3-B913F6FB8B91\" id=\"sid-07E2F210-4975-43A8-AEE3-B913F6FB8B91_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"1449.3565603307363\" y=\"1305.7235025994355\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-AE0A605B-D1DB-428A-83D7-38552EDA0289\" id=\"sid-AE0A605B-D1DB-428A-83D7-38552EDA0289_gui\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"1830.0\" y=\"1300.7235025994355\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-158F070A-F137-4B82-8403-261AA7E86AB6\" id=\"sid-158F070A-F137-4B82-8403-261AA7E86AB6_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"1886.957986189229\" y=\"1379.0307832982053\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-ED938847-69C7-421F-AFD0-0AECDB38C9F0\" id=\"sid-ED938847-69C7-421F-AFD0-0AECDB38C9F0_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"1886.957986189229\" y=\"1214.7051573394278\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-5695269D-E801-4953-B48D-EB281E7316F7\" id=\"sid-5695269D-E801-4953-B48D-EB281E7316F7_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.00000000000045\" x=\"1954.7783960385293\" y=\"1189.7051573394278\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-E2985FB2-CA52-4DFD-A6F0-563959923CB5\" id=\"sid-E2985FB2-CA52-4DFD-A6F0-563959923CB5_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"1954.7783960385293\" y=\"1352.3114175851833\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-7F7FA2A5-7345-4F11-B0A5-2EEF60EE3CAC\" id=\"sid-7F7FA2A5-7345-4F11-B0A5-2EEF60EE3CAC_gui\" isMarkerVisible=\"true\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"2099.1503114390325\" y=\"1372.3114175851833\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-3D74C40A-91BA-4671-BB9F-8D03623CAF68\" id=\"sid-3D74C40A-91BA-4671-BB9F-8D03623CAF68_gui\" isMarkerVisible=\"true\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"2099.1503114390325\" y=\"1209.7051573394278\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-8376EFE7-7178-4B72-AF75-4CD3BCDCA599\" id=\"sid-8376EFE7-7178-4B72-AF75-4CD3BCDCA599_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"2181.107827010984\" y=\"1352.3114175851833\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-2EE25CB0-E8BA-491E-A773-BD4B27643246\" id=\"sid-2EE25CB0-E8BA-491E-A773-BD4B27643246_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"2201.107827010984\" y=\"1189.7051573394278\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-CCCFBB8A-9E33-4C98-BA16-30AA2A9D7D4B\" id=\"sid-CCCFBB8A-9E33-4C98-BA16-30AA2A9D7D4B_gui\" isMarkerVisible=\"true\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"2312.8030218043664\" y=\"1372.3114175851833\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-42DAA51B-78CB-4098-8C74-1862994E0ED9\" id=\"sid-42DAA51B-78CB-4098-8C74-1862994E0ED9_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"2389.896455864512\" y=\"1459.6988141169604\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-BFDE4B6A-89F4-415B-8A22-7BA82C441A65\" id=\"sid-BFDE4B6A-89F4-415B-8A22-7BA82C441A65_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"2469.896455864512\" y=\"1352.3114175851833\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-10B00DA4-44D4-4CD4-910E-C8952DA258A4\" id=\"sid-10B00DA4-44D4-4CD4-910E-C8952DA258A4_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"2608.6646371727743\" y=\"1378.3114175851833\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-636805C2-4600-43C3-8104-E68D0663C904\" id=\"sid-636805C2-4600-43C3-8104-E68D0663C904_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"2528.6646371727743\" y=\"1485.6988141169604\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-551C13CD-F975-42AC-84F3-ABB2B458485A\" id=\"sid-551C13CD-F975-42AC-84F3-ABB2B458485A_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"2346.107827010984\" y=\"1215.7051573394278\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-544B758B-A75C-410C-98CA-C84E19CBC367\" id=\"sid-544B758B-A75C-410C-98CA-C84E19CBC367_gui\" isMarkerVisible=\"true\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"1769.3116097592895\" y=\"1300.7235025994355\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-6C9E668B-0059-4AA5-B3F8-CC74FCBAE32E\" id=\"sid-6C9E668B-0059-4AA5-B3F8-CC74FCBAE32E_gui\" isMarkerVisible=\"true\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"2393.4733004494883\" y=\"1372.3114175851833\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-E4AA7F18-9266-43DA-84E4-B3C4E5A27903\" id=\"sid-E4AA7F18-9266-43DA-84E4-B3C4E5A27903_gui\">\n            <omgdc:Bounds height=\"21.6942873061721\" width=\"29.022879143563387\" x=\"1708.5463160478428\" y=\"1246.0006737747826\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-E28EB527-2F0B-4491-82AE-F61274F75DF7\" id=\"sid-E28EB527-2F0B-4491-82AE-F61274F75DF7_gui\">\n            <omgdc:Bounds height=\"32.98509388695675\" width=\"29.022879143563387\" x=\"2307.9522807727826\" y=\"1161.6949610809547\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-E91A2C66-8518-4301-8912-DA783975DD45\" id=\"sid-E91A2C66-8518-4301-8912-DA783975DD45_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"2723.1125344662564\" y=\"1339.3893811587586\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-13E4B11F-E8D5-434E-9AE3-A42ED2084731\" id=\"sid-13E4B11F-E8D5-434E-9AE3-A42ED2084731_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"410.60838316680906\" width=\"1134.478719836191\" x=\"2893.2937099746887\" y=\"1100.0006737747829\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-155B51B2-12E4-4A0B-AFDF-DDBA2EE093D5\" id=\"sid-155B51B2-12E4-4A0B-AFDF-DDBA2EE093D5_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.00000000000045\" x=\"3022.5537886758975\" y=\"1259.0041368864136\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-DF651323-2973-4344-A5E5-4FFF3FDCD702\" id=\"sid-DF651323-2973-4344-A5E5-4FFF3FDCD702_gui\">\n            <omgdc:Bounds height=\"51.89699999999999\" width=\"51.84899999999999\" x=\"3046.5537886758975\" y=\"1409.1414965169647\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-3B833F36-ABCE-49A9-B268-445BAC9F758D\" id=\"sid-3B833F36-ABCE-49A9-B268-445BAC9F758D_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"2941.996657038745\" y=\"1284.0041368864136\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-A56AC510-264D-4291-B1CE-A035C2037437\" id=\"sid-A56AC510-264D-4291-B1CE-A035C2037437_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"3245.2395858164864\" y=\"1258.2981907857716\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-9A0A93AB-0A05-4D01-BF02-14A9C3189E84\" id=\"sid-9A0A93AB-0A05-4D01-BF02-14A9C3189E84_gui\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"3170.2395858164864\" y=\"1278.2981907857716\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-8CE3896D-0181-49CE-A1A9-C085262DA0FA\" id=\"sid-8CE3896D-0181-49CE-A1A9-C085262DA0FA_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"3245.2395858164864\" y=\"1374.058364549951\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-42305309-4E98-47F0-80C4-690E2DB222C0\" id=\"sid-42305309-4E98-47F0-80C4-690E2DB222C0_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"3390.5427807177925\" y=\"1399.2638210988744\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-4C1265A5-A535-48FB-99E9-68E0EC37C624\" id=\"sid-4C1265A5-A535-48FB-99E9-68E0EC37C624_gui\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"3436.0094936383516\" y=\"1278.6753766521438\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-53EE6F0D-43BE-4883-B018-3BB90743DC25\" id=\"sid-53EE6F0D-43BE-4883-B018-3BB90743DC25_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"3515.118295272769\" y=\"1259.0041368864136\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-91FF7684-71E6-497E-9938-0C9469B597EA\" id=\"sid-91FF7684-71E6-497E-9938-0C9469B597EA_gui\" isMarkerVisible=\"true\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"3665.0099637429494\" y=\"1279.0041368864136\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-286F337E-9361-4B4D-AF78-7E403CA80DA1\" id=\"sid-286F337E-9361-4B4D-AF78-7E403CA80DA1_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"3750.0099637429494\" y=\"1141.0006737747826\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-DC5EFA1A-9841-4010-A16B-D771AA2B57C3\" id=\"sid-DC5EFA1A-9841-4010-A16B-D771AA2B57C3_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"3895.0099637429494\" y=\"1167.0006737747826\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-8700D448-747C-4559-9A57-BFE8AAD639D4\" id=\"sid-8700D448-747C-4559-9A57-BFE8AAD639D4_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"3750.0099637429494\" y=\"1259.0041368864136\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-DB5144E8-CEDC-4333-BE75-A63907FDC5F0\" id=\"sid-DB5144E8-CEDC-4333-BE75-A63907FDC5F0_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"3895.0099637429494\" y=\"1285.0041368864136\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-9B744161-CE38-41EC-847E-D264A5BFA9CC\" id=\"sid-9B744161-CE38-41EC-847E-D264A5BFA9CC_gui\">\n            <omgdc:Bounds height=\"22.985093886956747\" width=\"29.022879143563387\" x=\"2950.1109952082847\" y=\"1234.1034773913852\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-A8C71BAE-B5D6-4BC1-BF48-636E34FDC5DA\" id=\"sid-A8C71BAE-B5D6-4BC1-BF48-636E34FDC5DA_gui\">\n            <omgdc:Bounds height=\"29.839732512924684\" width=\"29.022879143563387\" x=\"3869.5488333194485\" y=\"1126.3893811587586\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-99DC1CC9-AD54-41FE-BA99-BBFCB0A1792D\" id=\"sid-99DC1CC9-AD54-41FE-BA99-BBFCB0A1792D_gui\">\n            <omgdc:Bounds height=\"21.6942873061721\" width=\"29.022879143563387\" x=\"3563.724555664452\" y=\"1363.2638210988744\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-9CB103FC-4135-44AE-B4F6-3C1116CCC0FD\" id=\"sid-9CB103FC-4135-44AE-B4F6-3C1116CCC0FD_gui\">\n            <omgdc:Bounds height=\"243.47878854357612\" width=\"523.2052520944808\" x=\"1813.7699078218652\" y=\"462.2750028503027\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-9FBF1EA9-75EA-44B0-8B16-9F82808B0566\" id=\"sid-9FBF1EA9-75EA-44B0-8B16-9F82808B0566_gui\">\n            <omgdc:Bounds height=\"119.33426480992581\" width=\"534.9376642526586\" x=\"1813.7699078218652\" y=\"126.66088393035868\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-CC64D413-A2EA-438C-B0FE-27F814C0C97B\" id=\"sid-CC64D413-A2EA-438C-B0FE-27F814C0C97B_gui\">\n            <omgdc:Bounds height=\"119.3342648099258\" width=\"534.9376642526584\" x=\"1813.769907821865\" y=\"296.10644557883006\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-2365FF07-4092-4B79-976A-AD192FE4E4E9\" id=\"sid-2365FF07-4092-4B79-976A-AD192FE4E4E9_gui\">\n            <omgdi:waypoint x=\"4905.0\" y=\"1545.0\"/>\n            <omgdi:waypoint x=\"4950.0\" y=\"1545.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-9DE1A24F-5ED5-4095-B9C8-B7213895C7B7\" id=\"sid-9DE1A24F-5ED5-4095-B9C8-B7213895C7B7_gui\">\n            <omgdi:waypoint x=\"751.0\" y=\"309.0\"/>\n            <omgdi:waypoint x=\"796.0\" y=\"309.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-48AAE1F8-75D9-4031-ACAD-49BD8A16E9C8\" id=\"sid-48AAE1F8-75D9-4031-ACAD-49BD8A16E9C8_gui\">\n            <omgdi:waypoint x=\"1742.0\" y=\"1320.0\"/>\n            <omgdi:waypoint x=\"1769.0\" y=\"1321.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-1C8DEB94-31C4-47FE-AA84-605810C351AF\" id=\"sid-1C8DEB94-31C4-47FE-AA84-605810C351AF_gui\">\n            <omgdi:waypoint x=\"988.0\" y=\"508.0\"/>\n            <omgdi:waypoint x=\"987.0\" y=\"580.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-5C3AB4AB-5292-4EC3-9A0F-BAD26D56DBD4\" id=\"sid-5C3AB4AB-5292-4EC3-9A0F-BAD26D56DBD4_gui\">\n            <omgdi:waypoint x=\"857.0\" y=\"1810.0\"/>\n            <omgdi:waypoint x=\"902.0\" y=\"1810.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-9C99A596-2527-45AC-9ABB-6626A36DB292\" id=\"sid-9C99A596-2527-45AC-9ABB-6626A36DB292_gui\">\n            <omgdi:waypoint x=\"4819.0\" y=\"1143.0\"/>\n            <omgdi:waypoint x=\"4819.0\" y=\"1052.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-85F7873E-4458-4406-9D6E-1F4CA6268D55\" id=\"sid-85F7873E-4458-4406-9D6E-1F4CA6268D55_gui\">\n            <omgdi:waypoint x=\"408.0\" y=\"468.0\"/>\n            <omgdi:waypoint x=\"454.0\" y=\"468.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-7AD16339-3A08-4841-96D9-3164E76DCF8F\" id=\"sid-7AD16339-3A08-4841-96D9-3164E76DCF8F_gui\">\n            <omgdi:waypoint x=\"1916.0\" y=\"1229.0\"/>\n            <omgdi:waypoint x=\"1954.0\" y=\"1229.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-4FA0508C-2BC1-4ABB-8F75-ED27215EE73D\" id=\"sid-4FA0508C-2BC1-4ABB-8F75-ED27215EE73D_gui\">\n            <omgdi:waypoint x=\"2054.0\" y=\"1229.0\"/>\n            <omgdi:waypoint x=\"2099.0\" y=\"1230.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-62177F1C-D8D7-488A-9F8A-E379831B4792\" id=\"sid-62177F1C-D8D7-488A-9F8A-E379831B4792_gui\">\n            <omgdi:waypoint x=\"650.0\" y=\"468.0\"/>\n            <omgdi:waypoint x=\"695.0\" y=\"468.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-0D428B09-7C49-44AE-A257-7E810A541B0F\" id=\"sid-0D428B09-7C49-44AE-A257-7E810A541B0F_gui\">\n            <omgdi:waypoint x=\"494.0\" y=\"468.0\"/>\n            <omgdi:waypoint x=\"550.0\" y=\"468.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-8B230C74-C9AA-43B1-953D-5BF07007A5FF\" id=\"sid-8B230C74-C9AA-43B1-953D-5BF07007A5FF_gui\">\n            <omgdi:waypoint x=\"1037.0\" y=\"1770.0\"/>\n            <omgdi:waypoint x=\"1037.0895994902648\" y=\"1740.0\"/>\n            <omgdi:waypoint x=\"1359.6193694131155\" y=\"1740.0\"/>\n            <omgdi:waypoint x=\"1359.0\" y=\"1368.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-94C02BC5-3BDF-458B-AB2C-1B7880E74C90\" id=\"sid-94C02BC5-3BDF-458B-AB2C-1B7880E74C90_gui\">\n            <omgdi:waypoint x=\"3850.0\" y=\"1156.0\"/>\n            <omgdi:waypoint x=\"3869.0\" y=\"1140.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-4E1F9DDA-0BDF-4BB0-90F5-E7A85C259444\" id=\"sid-4E1F9DDA-0BDF-4BB0-90F5-E7A85C259444_gui\">\n            <omgdi:waypoint x=\"3455.0\" y=\"1654.0\"/>\n            <omgdi:waypoint x=\"3500.0\" y=\"1654.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-1B290110-0336-46CF-92EC-C45D43FA9307\" id=\"sid-1B290110-0336-46CF-92EC-C45D43FA9307_gui\">\n            <omgdi:waypoint x=\"701.0\" y=\"1521.0\"/>\n            <omgdi:waypoint x=\"757.0\" y=\"1521.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-D974B6C2-C395-4788-8AC8-28BAC3DEB097\" id=\"sid-D974B6C2-C395-4788-8AC8-28BAC3DEB097_gui\">\n            <omgdi:waypoint x=\"2021.0\" y=\"1037.0\"/>\n            <omgdi:waypoint x=\"2021.0\" y=\"1189.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-50B9F1DF-70D3-48DF-A96D-482225E11A7D\" id=\"sid-50B9F1DF-70D3-48DF-A96D-482225E11A7D_gui\">\n            <omgdi:waypoint x=\"1087.0\" y=\"1521.0\"/>\n            <omgdi:waypoint x=\"1132.0\" y=\"1521.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-8110675A-7E69-4B6B-95B9-9DE5DEF4BF32\" id=\"sid-8110675A-7E69-4B6B-95B9-9DE5DEF4BF32_gui\">\n            <omgdi:waypoint x=\"4680.0\" y=\"1292.0\"/>\n            <omgdi:waypoint x=\"4721.0\" y=\"1293.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-E54CB8B4-BED9-43AF-B03B-DBE60483A68A\" id=\"sid-E54CB8B4-BED9-43AF-B03B-DBE60483A68A_gui\">\n            <omgdi:waypoint x=\"981.0\" y=\"309.0\"/>\n            <omgdi:waypoint x=\"1020.0\" y=\"309.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-F86867DE-BA70-47C1-8340-A6A5A3B645AA\" id=\"sid-F86867DE-BA70-47C1-8340-A6A5A3B645AA_gui\">\n            <omgdi:waypoint x=\"474.0\" y=\"448.0\"/>\n            <omgdi:waypoint x=\"474.842567669863\" y=\"309.00359158542847\"/>\n            <omgdi:waypoint x=\"508.0\" y=\"309.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-4419C1F2-A991-4A8F-B055-31790C2A4425\" id=\"sid-4419C1F2-A991-4A8F-B055-31790C2A4425_gui\">\n            <omgdi:waypoint x=\"3295.0\" y=\"1454.0\"/>\n            <omgdi:waypoint x=\"3295.0\" y=\"1639.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-B1598D75-E3CE-4CC5-8380-8FB570208B3B\" id=\"sid-B1598D75-E3CE-4CC5-8380-8FB570208B3B_gui\">\n            <omgdi:waypoint x=\"4605.0\" y=\"1293.0\"/>\n            <omgdi:waypoint x=\"4650.0\" y=\"1292.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-A83B900A-A119-4FC4-A77F-09849C8660C9\" id=\"sid-A83B900A-A119-4FC4-A77F-09849C8660C9_gui\">\n            <omgdi:waypoint x=\"735.0\" y=\"468.0\"/>\n            <omgdi:waypoint x=\"793.0\" y=\"468.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-F9388202-3D20-4919-A2DB-088202A1DBC9\" id=\"sid-F9388202-3D20-4919-A2DB-088202A1DBC9_gui\">\n            <omgdi:waypoint x=\"2295.0\" y=\"1189.0\"/>\n            <omgdi:waypoint x=\"2307.0\" y=\"1175.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-ADF333C6-9197-4556-A2C4-19BBC7122609\" id=\"sid-ADF333C6-9197-4556-A2C4-19BBC7122609_gui\">\n            <omgdi:waypoint x=\"3850.0\" y=\"1299.0\"/>\n            <omgdi:waypoint x=\"3895.0\" y=\"1299.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-1B51B1B0-FB1A-46CE-BC87-0D89AEA6845A\" id=\"sid-1B51B1B0-FB1A-46CE-BC87-0D89AEA6845A_gui\">\n            <omgdi:waypoint x=\"204.0\" y=\"896.0\"/>\n            <omgdi:waypoint x=\"193.0\" y=\"866.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-67782ED7-78C0-47F3-9EAC-46F9F194D843\" id=\"sid-67782ED7-78C0-47F3-9EAC-46F9F194D843_gui\">\n            <omgdi:waypoint x=\"3705.0\" y=\"1299.0\"/>\n            <omgdi:waypoint x=\"3750.0\" y=\"1299.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-155BB3AD-386C-4EF2-92C6-E2800D82A875\" id=\"sid-155BB3AD-386C-4EF2-92C6-E2800D82A875_gui\">\n            <omgdi:waypoint x=\"421.0\" y=\"931.0\"/>\n            <omgdi:waypoint x=\"421.0\" y=\"1001.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-3C44D333-01F3-43B7-AE4F-F13DD6D05DAC\" id=\"sid-3C44D333-01F3-43B7-AE4F-F13DD6D05DAC_gui\">\n            <omgdi:waypoint x=\"961.0\" y=\"329.0\"/>\n            <omgdi:waypoint x=\"961.6673301253031\" y=\"364.0\"/>\n            <omgdi:waypoint x=\"668.8031441607801\" y=\"364.0\"/>\n            <omgdi:waypoint x=\"668.0\" y=\"329.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-5529AAF3-EC3E-409F-A020-8D0330A547E3\" id=\"sid-5529AAF3-EC3E-409F-A020-8D0330A547E3_gui\">\n            <omgdi:waypoint x=\"1087.0\" y=\"1810.0\"/>\n            <omgdi:waypoint x=\"1132.0\" y=\"1810.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-EA96E73A-B3ED-48A6-B066-5B38CA75DBE6\" id=\"sid-EA96E73A-B3ED-48A6-B066-5B38CA75DBE6_gui\">\n            <omgdi:waypoint x=\"798.0\" y=\"911.0\"/>\n            <omgdi:waypoint x=\"837.0\" y=\"911.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-C642640E-F524-40F0-BD91-41961D14ED31\" id=\"sid-C642640E-F524-40F0-BD91-41961D14ED31_gui\">\n            <omgdi:waypoint x=\"2054.0\" y=\"1392.0\"/>\n            <omgdi:waypoint x=\"2099.0\" y=\"1392.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-23F431C6-D279-436A-86B4-9E6F3F05EFCC\" id=\"sid-23F431C6-D279-436A-86B4-9E6F3F05EFCC_gui\">\n            <omgdi:waypoint x=\"1140.0\" y=\"269.0\"/>\n            <omgdi:waypoint x=\"1144.0\" y=\"247.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-6BFB777A-C370-4A2B-A6AA-82581B15C84E\" id=\"sid-6BFB777A-C370-4A2B-A6AA-82581B15C84E_gui\">\n            <omgdi:waypoint x=\"2513.0\" y=\"1352.0\"/>\n            <omgdi:waypoint x=\"2513.0\" y=\"1037.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-B9DF0BE4-4658-4908-8E4C-B528E8EA1FDD\" id=\"sid-B9DF0BE4-4658-4908-8E4C-B528E8EA1FDD_gui\">\n            <omgdi:waypoint x=\"669.0\" y=\"289.0\"/>\n            <omgdi:waypoint x=\"669.1186848478005\" y=\"232.1975486707488\"/>\n            <omgdi:waypoint x=\"721.0\" y=\"232.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-E1876DA2-53A4-4F8B-8392-20655993C733\" id=\"sid-E1876DA2-53A4-4F8B-8392-20655993C733_gui\">\n            <omgdi:waypoint x=\"4761.0\" y=\"1293.0\"/>\n            <omgdi:waypoint x=\"4805.0\" y=\"1292.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-CC4AD237-37B5-4CDD-8697-237BE3E1F960\" id=\"sid-CC4AD237-37B5-4CDD-8697-237BE3E1F960_gui\">\n            <omgdi:waypoint x=\"1702.0\" y=\"1280.0\"/>\n            <omgdi:waypoint x=\"1708.0\" y=\"1256.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-8E8DC42E-9AD4-4D6F-AEFC-C6FE6E91B6D3\" id=\"sid-8E8DC42E-9AD4-4D6F-AEFC-C6FE6E91B6D3_gui\">\n            <omgdi:waypoint x=\"3190.0\" y=\"1318.0\"/>\n            <omgdi:waypoint x=\"3190.7395858164864\" y=\"1414.0583645499505\"/>\n            <omgdi:waypoint x=\"3245.0\" y=\"1414.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-03040B88-2530-4CC1-B5D2-B52CFA3F4144\" id=\"sid-03040B88-2530-4CC1-B5D2-B52CFA3F4144_gui\">\n            <omgdi:waypoint x=\"3089.0\" y=\"1064.0\"/>\n            <omgdi:waypoint x=\"3089.0\" y=\"1259.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-369E18F1-20E3-4E09-A8B7-1FF568E57F23\" id=\"sid-369E18F1-20E3-4E09-A8B7-1FF568E57F23_gui\">\n            <omgdi:waypoint x=\"1374.0\" y=\"1353.0\"/>\n            <omgdi:waypoint x=\"1415.0\" y=\"1353.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-713C88F2-5563-41E9-9351-F1FEEEBA72DA\" id=\"sid-713C88F2-5563-41E9-9351-F1FEEEBA72DA_gui\">\n            <omgdi:waypoint x=\"4905.0\" y=\"1395.0\"/>\n            <omgdi:waypoint x=\"4950.0\" y=\"1395.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-DC611CCE-BA2C-459D-974D-4D09E2C390E6\" id=\"sid-DC611CCE-BA2C-459D-974D-4D09E2C390E6_gui\">\n            <omgdi:waypoint x=\"608.0\" y=\"309.0\"/>\n            <omgdi:waypoint x=\"648.0\" y=\"309.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-1D74E5C9-7875-42C7-B069-7EF805115BFB\" id=\"sid-1D74E5C9-7875-42C7-B069-7EF805115BFB_gui\">\n            <omgdi:waypoint x=\"534.0\" y=\"871.0\"/>\n            <omgdi:waypoint x=\"534.0000000000001\" y=\"804.0980785814236\"/>\n            <omgdi:waypoint x=\"465.0\" y=\"804.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-83275776-30AE-4168-9311-18544B088890\" id=\"sid-83275776-30AE-4168-9311-18544B088890_gui\">\n            <omgdi:waypoint x=\"3800.0\" y=\"1141.0\"/>\n            <omgdi:waypoint x=\"3800.0\" y=\"1064.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-11A2840A-596D-4937-BB37-0D5952E03535\" id=\"sid-11A2840A-596D-4937-BB37-0D5952E03535_gui\">\n            <omgdi:waypoint x=\"3122.0\" y=\"1298.0\"/>\n            <omgdi:waypoint x=\"3170.0\" y=\"1298.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-FDB13333-B493-4477-9DE4-C7E4C522F495\" id=\"sid-FDB13333-B493-4477-9DE4-C7E4C522F495_gui\">\n            <omgdi:waypoint x=\"612.0\" y=\"1521.0\"/>\n            <omgdi:waypoint x=\"661.0\" y=\"1521.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-8BB76718-C32D-4E09-B80B-7DC168E99147\" id=\"sid-8BB76718-C32D-4E09-B80B-7DC168E99147_gui\">\n            <omgdi:waypoint x=\"1608.0\" y=\"1320.0\"/>\n            <omgdi:waypoint x=\"1642.0\" y=\"1320.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-373FAB4D-A45B-45EC-9F85-B1076ABBFBA6\" id=\"sid-373FAB4D-A45B-45EC-9F85-B1076ABBFBA6_gui\">\n            <omgdi:waypoint x=\"2119.0\" y=\"1209.0\"/>\n            <omgdi:waypoint x=\"2119.6503114390325\" y=\"1165.0\"/>\n            <omgdi:waypoint x=\"1789.8116097592895\" y=\"1165.0\"/>\n            <omgdi:waypoint x=\"1789.0\" y=\"1300.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-310DFC6B-79B0-40BC-BF9E-D072E122A3A2\" id=\"sid-310DFC6B-79B0-40BC-BF9E-D072E122A3A2_gui\">\n            <omgdi:waypoint x=\"957.0\" y=\"610.0\"/>\n            <omgdi:waypoint x=\"319.0000000000001\" y=\"610.2774471932626\"/>\n            <omgdi:waypoint x=\"319.0\" y=\"871.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-F88DDF30-3F4D-4FA6-AA82-3B10300FFE98\" id=\"sid-F88DDF30-3F4D-4FA6-AA82-3B10300FFE98_gui\">\n            <omgdi:waypoint x=\"3310.0\" y=\"1654.0\"/>\n            <omgdi:waypoint x=\"3355.0\" y=\"1654.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-91E5F463-9CDA-4B49-8BB1-BD4C050EBBB2\" id=\"sid-91E5F463-9CDA-4B49-8BB1-BD4C050EBBB2_gui\">\n            <omgdi:waypoint x=\"736.0\" y=\"125.0\"/>\n            <omgdi:waypoint x=\"736.0\" y=\"217.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-F3E23BCC-F29B-444C-BF2B-C2AA7D9D0DEF\" id=\"sid-F3E23BCC-F29B-444C-BF2B-C2AA7D9D0DEF_gui\">\n            <omgdi:waypoint x=\"224.0\" y=\"911.0\"/>\n            <omgdi:waypoint x=\"269.0\" y=\"911.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-770DE0CC-14BD-46C1-B93A-3C10BD8A3933\" id=\"sid-770DE0CC-14BD-46C1-B93A-3C10BD8A3933_gui\">\n            <omgdi:waypoint x=\"369.0\" y=\"911.0\"/>\n            <omgdi:waypoint x=\"401.0\" y=\"912.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-D3E0C8B2-1DEC-4283-9FB3-977DB4382650\" id=\"sid-D3E0C8B2-1DEC-4283-9FB3-977DB4382650_gui\">\n            <omgdi:waypoint x=\"3345.0\" y=\"1414.0\"/>\n            <omgdi:waypoint x=\"3390.0\" y=\"1414.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-258E87AC-23E8-4C39-92C8-5AE7DE19992A\" id=\"sid-258E87AC-23E8-4C39-92C8-5AE7DE19992A_gui\">\n            <omgdi:waypoint x=\"2119.0\" y=\"1372.0\"/>\n            <omgdi:waypoint x=\"2119.1503114390325\" y=\"1319.0\"/>\n            <omgdi:waypoint x=\"2413.9733004494883\" y=\"1319.0\"/>\n            <omgdi:waypoint x=\"2413.0\" y=\"1372.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-CD80152E-8A60-4DF8-87F7-23BD0CDA3C58\" id=\"sid-CD80152E-8A60-4DF8-87F7-23BD0CDA3C58_gui\">\n            <omgdi:waypoint x=\"467.0\" y=\"1521.0\"/>\n            <omgdi:waypoint x=\"512.0\" y=\"1521.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-71473AE9-0707-44B9-A0D3-C315677EFA05\" id=\"sid-71473AE9-0707-44B9-A0D3-C315677EFA05_gui\">\n            <omgdi:waypoint x=\"1703.0\" y=\"1360.0\"/>\n            <omgdi:waypoint x=\"1703.0\" y=\"1613.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-04E0977B-6883-4B93-AD20-5A2F8B496DE6\" id=\"sid-04E0977B-6883-4B93-AD20-5A2F8B496DE6_gui\">\n            <omgdi:waypoint x=\"2281.0\" y=\"1392.0\"/>\n            <omgdi:waypoint x=\"2312.0\" y=\"1392.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-E725BF0F-5B88-4D38-AE6A-7ABDA67CA7C7\" id=\"sid-E725BF0F-5B88-4D38-AE6A-7ABDA67CA7C7_gui\">\n            <omgdi:waypoint x=\"942.0\" y=\"1810.0\"/>\n            <omgdi:waypoint x=\"987.0\" y=\"1810.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-F11A1E78-0DE1-46E5-9074-F665ED1985BE\" id=\"sid-F11A1E78-0DE1-46E5-9074-F665ED1985BE_gui\">\n            <omgdi:waypoint x=\"681.0\" y=\"1790.0\"/>\n            <omgdi:waypoint x=\"681.0\" y=\"1736.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-7E6EBD99-9B3A-44CE-972E-9CCDA7924AD8\" id=\"sid-7E6EBD99-9B3A-44CE-972E-9CCDA7924AD8_gui\">\n            <omgdi:waypoint x=\"203.0\" y=\"468.0\"/>\n            <omgdi:waypoint x=\"237.0\" y=\"468.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-AC383C65-2E51-4F3E-ACE4-C973310B1447\" id=\"sid-AC383C65-2E51-4F3E-ACE4-C973310B1447_gui\">\n            <omgdi:waypoint x=\"4470.0\" y=\"1252.0\"/>\n            <omgdi:waypoint x=\"4470.0\" y=\"1052.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-8BC0544C-1924-4422-B5BE-5CC1501312F4\" id=\"sid-8BC0544C-1924-4422-B5BE-5CC1501312F4_gui\">\n            <omgdi:waypoint x=\"715.0\" y=\"448.0\"/>\n            <omgdi:waypoint x=\"715.6791989805283\" y=\"398.0\"/>\n            <omgdi:waypoint x=\"1040.5\" y=\"398.0\"/>\n            <omgdi:waypoint x=\"1040.0\" y=\"329.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-7363B1EE-93CD-49D4-966B-8F1368A01010\" id=\"sid-7363B1EE-93CD-49D4-966B-8F1368A01010_gui\">\n            <omgdi:waypoint x=\"3850.0\" y=\"1181.0\"/>\n            <omgdi:waypoint x=\"3895.0\" y=\"1181.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-37532634-B172-4542-96A6-7E347E3CEA37\" id=\"sid-37532634-B172-4542-96A6-7E347E3CEA37_gui\">\n            <omgdi:waypoint x=\"1032.0\" y=\"951.0\"/>\n            <omgdi:waypoint x=\"1032.9257246007583\" y=\"1353.3893811587586\"/>\n            <omgdi:waypoint x=\"1344.0\" y=\"1353.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-D4887F44-4F7F-47A6-9802-908D44DF7A6D\" id=\"sid-D4887F44-4F7F-47A6-9802-908D44DF7A6D_gui\">\n            <omgdi:waypoint x=\"1037.0\" y=\"1481.0\"/>\n            <omgdi:waypoint x=\"1037.0895994902648\" y=\"1444.3782616037115\"/>\n            <omgdi:waypoint x=\"1359.6193694131155\" y=\"1444.3782616037115\"/>\n            <omgdi:waypoint x=\"1359.0\" y=\"1368.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-A6C70715-D7C5-46FB-8ADB-0DC89B3991FD\" id=\"sid-A6C70715-D7C5-46FB-8ADB-0DC89B3991FD_gui\">\n            <omgdi:waypoint x=\"558.0\" y=\"269.0\"/>\n            <omgdi:waypoint x=\"558.0\" y=\"125.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-B4BDF60C-F40F-4247-B52F-0EA0038A9039\" id=\"sid-B4BDF60C-F40F-4247-B52F-0EA0038A9039_gui\">\n            <omgdi:waypoint x=\"612.0\" y=\"1810.0\"/>\n            <omgdi:waypoint x=\"661.0\" y=\"1810.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-6AD87C60-225D-4BAB-8EAE-3AB8D0C31754\" id=\"sid-6AD87C60-225D-4BAB-8EAE-3AB8D0C31754_gui\">\n            <omgdi:waypoint x=\"4951.0\" y=\"1163.0\"/>\n            <omgdi:waypoint x=\"4951.360002239835\" y=\"1126.3114175851833\"/>\n            <omgdi:waypoint x=\"4574.860002239836\" y=\"1126.3114175851833\"/>\n            <omgdi:waypoint x=\"4574.0\" y=\"1272.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-950B6B3A-BEDA-49E3-A901-6733165E80C3\" id=\"sid-950B6B3A-BEDA-49E3-A901-6733165E80C3_gui\">\n            <omgdi:waypoint x=\"896.0\" y=\"309.0\"/>\n            <omgdi:waypoint x=\"941.0\" y=\"309.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-3E4A80E2-14C5-4002-BFE9-15F53566593B\" id=\"sid-3E4A80E2-14C5-4002-BFE9-15F53566593B_gui\">\n            <omgdi:waypoint x=\"857.0\" y=\"1521.0\"/>\n            <omgdi:waypoint x=\"902.0\" y=\"1521.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-D3213E0A-906E-4276-8DAF-208E4F416D51\" id=\"sid-D3213E0A-906E-4276-8DAF-208E4F416D51_gui\">\n            <omgdi:waypoint x=\"3210.0\" y=\"1298.0\"/>\n            <omgdi:waypoint x=\"3245.0\" y=\"1298.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-ABF5CB6D-CFF9-445A-99DF-C541EF0CF6B8\" id=\"sid-ABF5CB6D-CFF9-445A-99DF-C541EF0CF6B8_gui\">\n            <omgdi:waypoint x=\"4978.0\" y=\"1292.0\"/>\n            <omgdi:waypoint x=\"5002.0\" y=\"1291.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-97FBBC72-9B16-470C-BAF3-445654369DF9\" id=\"sid-97FBBC72-9B16-470C-BAF3-445654369DF9_gui\">\n            <omgdi:waypoint x=\"1850.0\" y=\"1300.0\"/>\n            <omgdi:waypoint x=\"1850.5\" y=\"1229.7051573394278\"/>\n            <omgdi:waypoint x=\"1886.0\" y=\"1229.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-47FE04AD-8529-45E5-87E6-F7992404494A\" id=\"sid-47FE04AD-8529-45E5-87E6-F7992404494A_gui\">\n            <omgdi:waypoint x=\"3476.0\" y=\"1299.0\"/>\n            <omgdi:waypoint x=\"3515.0\" y=\"1299.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-FA4E05F6-ADB1-4F93-A0DA-3AEAEFB6D148\" id=\"sid-FA4E05F6-ADB1-4F93-A0DA-3AEAEFB6D148_gui\">\n            <omgdi:waypoint x=\"4741.0\" y=\"1312.0\"/>\n            <omgdi:waypoint x=\"4741.630483194386\" y=\"1395.1414965169647\"/>\n            <omgdi:waypoint x=\"4805.0\" y=\"1395.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-CD6D8956-F668-4D01-A8D1-C4D9643A2375\" id=\"sid-CD6D8956-F668-4D01-A8D1-C4D9643A2375_gui\">\n            <omgdi:waypoint x=\"2247.0\" y=\"1432.0\"/>\n            <omgdi:waypoint x=\"2247.0\" y=\"1613.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-D760E3B4-E755-4719-B905-F62FFF056D7B\" id=\"sid-D760E3B4-E755-4719-B905-F62FFF056D7B_gui\">\n            <omgdi:waypoint x=\"561.0\" y=\"1612.0\"/>\n            <omgdi:waypoint x=\"562.0\" y=\"1561.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-9FB7EAEB-5A8B-4D90-B3A7-6B52FCBD5D22\" id=\"sid-9FB7EAEB-5A8B-4D90-B3A7-6B52FCBD5D22_gui\">\n            <omgdi:waypoint x=\"2333.0\" y=\"1412.0\"/>\n            <omgdi:waypoint x=\"2333.3030218043664\" y=\"1500.1988141169604\"/>\n            <omgdi:waypoint x=\"2389.0\" y=\"1500.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-73D82202-2D46-4210-9113-A2BE24C342C8\" id=\"sid-73D82202-2D46-4210-9113-A2BE24C342C8_gui\">\n            <omgdi:waypoint x=\"5115.0\" y=\"1183.0\"/>\n            <omgdi:waypoint x=\"5160.0\" y=\"1183.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-54D77E49-FBFB-4B81-932A-B8F5E3BE4C6A\" id=\"sid-54D77E49-FBFB-4B81-932A-B8F5E3BE4C6A_gui\">\n            <omgdi:waypoint x=\"1082.0\" y=\"911.0\"/>\n            <omgdi:waypoint x=\"1127.0\" y=\"911.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-D833F570-90A1-46AB-B968-16751237C003\" id=\"sid-D833F570-90A1-46AB-B968-16751237C003_gui\">\n            <omgdi:waypoint x=\"4380.0\" y=\"1292.0\"/>\n            <omgdi:waypoint x=\"4420.0\" y=\"1292.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-DD656687-20A5-4FD7-ADB7-30A876FAFB3E\" id=\"sid-DD656687-20A5-4FD7-ADB7-30A876FAFB3E_gui\">\n            <omgdi:waypoint x=\"5077.0\" y=\"1223.0\"/>\n            <omgdi:waypoint x=\"5090.0\" y=\"1260.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-606B1F31-96AA-4799-8E9E-C4E6A968A715\" id=\"sid-606B1F31-96AA-4799-8E9E-C4E6A968A715_gui\">\n            <omgdi:waypoint x=\"4852.0\" y=\"1052.0\"/>\n            <omgdi:waypoint x=\"4852.0\" y=\"1143.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-2D215BCD-C98A-4B3A-B255-EDCE32FF2A97\" id=\"sid-2D215BCD-C98A-4B3A-B255-EDCE32FF2A97_gui\">\n            <omgdi:waypoint x=\"432.0\" y=\"1254.0\"/>\n            <omgdi:waypoint x=\"477.0\" y=\"1254.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-469B5AE7-5988-46A4-B631-4E4970E06765\" id=\"sid-469B5AE7-5988-46A4-B631-4E4970E06765_gui\">\n            <omgdi:waypoint x=\"4858.0\" y=\"1435.0\"/>\n            <omgdi:waypoint x=\"4861.0\" y=\"1458.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-17B8A293-C347-4830-BFA1-E4941E9B120F\" id=\"sid-17B8A293-C347-4830-BFA1-E4941E9B120F_gui\">\n            <omgdi:waypoint x=\"4970.0\" y=\"1183.0\"/>\n            <omgdi:waypoint x=\"5015.0\" y=\"1183.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-1203CB8F-6985-4231-B352-DE313ECA48CE\" id=\"sid-1203CB8F-6985-4231-B352-DE313ECA48CE_gui\">\n            <omgdi:waypoint x=\"1850.0\" y=\"1340.0\"/>\n            <omgdi:waypoint x=\"1850.5\" y=\"1394.0307832982053\"/>\n            <omgdi:waypoint x=\"1886.0\" y=\"1394.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-4A0A3787-3011-42F1-8CF7-16479922159E\" id=\"sid-4A0A3787-3011-42F1-8CF7-16479922159E_gui\">\n            <omgdi:waypoint x=\"893.0\" y=\"468.0\"/>\n            <omgdi:waypoint x=\"938.0\" y=\"468.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-9E3DEB10-BFD8-4D7D-80EC-F98CD2E65DA4\" id=\"sid-9E3DEB10-BFD8-4D7D-80EC-F98CD2E65DA4_gui\">\n            <omgdi:waypoint x=\"2569.0\" y=\"1392.0\"/>\n            <omgdi:waypoint x=\"2608.0\" y=\"1392.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-1D3A1400-EBE2-4C67-B377-CC31EB9925E5\" id=\"sid-1D3A1400-EBE2-4C67-B377-CC31EB9925E5_gui\">\n            <omgdi:waypoint x=\"937.0\" y=\"911.0\"/>\n            <omgdi:waypoint x=\"982.0\" y=\"911.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-48E58EB6-ECEE-44B0-8AE3-DD8590112929\" id=\"sid-48E58EB6-ECEE-44B0-8AE3-DD8590112929_gui\">\n            <omgdi:waypoint x=\"3565.0\" y=\"1339.0\"/>\n            <omgdi:waypoint x=\"3564.0\" y=\"1363.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-1E7B8929-56CE-43DA-9B85-B91426258E04\" id=\"sid-1E7B8929-56CE-43DA-9B85-B91426258E04_gui\">\n            <omgdi:waypoint x=\"188.0\" y=\"125.0\"/>\n            <omgdi:waypoint x=\"188.0\" y=\"453.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-1E8A77DE-E3F1-4DFA-B20C-9EEBF0735E05\" id=\"sid-1E8A77DE-E3F1-4DFA-B20C-9EEBF0735E05_gui\">\n            <omgdi:waypoint x=\"681.0\" y=\"1501.0\"/>\n            <omgdi:waypoint x=\"681.0\" y=\"1447.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-FD240858-85C6-4D1A-9336-5E043D753A72\" id=\"sid-FD240858-85C6-4D1A-9336-5E043D753A72_gui\">\n            <omgdi:waypoint x=\"3800.0\" y=\"1339.0\"/>\n            <omgdi:waypoint x=\"3800.0099637429494\" y=\"1420.0\"/>\n            <omgdi:waypoint x=\"4224.745262850934\" y=\"1420.0\"/>\n            <omgdi:waypoint x=\"4224.0\" y=\"1307.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-7BA05743-5D0C-4D1C-B193-22FE2A156E22\" id=\"sid-7BA05743-5D0C-4D1C-B193-22FE2A156E22_gui\">\n            <omgdi:waypoint x=\"751.0\" y=\"232.0\"/>\n            <omgdi:waypoint x=\"771.0\" y=\"232.1329438806149\"/>\n            <omgdi:waypoint x=\"771.0\" y=\"196.0\"/>\n            <omgdi:waypoint x=\"257.5\" y=\"196.0\"/>\n            <omgdi:waypoint x=\"257.0\" y=\"448.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-4D49AA03-7D9E-4086-A0D9-43E7C741DCD3\" id=\"sid-4D49AA03-7D9E-4086-A0D9-43E7C741DCD3_gui\">\n            <omgdi:waypoint x=\"2489.0\" y=\"1499.0\"/>\n            <omgdi:waypoint x=\"2528.0\" y=\"1499.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-B28E079A-EC0B-4A89-9BF3-6850173FADFC\" id=\"sid-B28E079A-EC0B-4A89-9BF3-6850173FADFC_gui\">\n            <omgdi:waypoint x=\"3550.0\" y=\"1614.0\"/>\n            <omgdi:waypoint x=\"3550.5125515566237\" y=\"1536.0\"/>\n            <omgdi:waypoint x=\"3405.5427807177925\" y=\"1536.0\"/>\n            <omgdi:waypoint x=\"3405.0\" y=\"1429.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-DE7499BF-C4BD-4189-890C-F215087A424D\" id=\"sid-DE7499BF-C4BD-4189-890C-F215087A424D_gui\">\n            <omgdi:waypoint x=\"1988.0\" y=\"1189.0\"/>\n            <omgdi:waypoint x=\"1988.0\" y=\"1037.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-939F496E-402A-4FCF-9A6F-C138E1A4F2DA\" id=\"sid-939F496E-402A-4FCF-9A6F-C138E1A4F2DA_gui\">\n            <omgdi:waypoint x=\"1901.0\" y=\"1613.0\"/>\n            <omgdi:waypoint x=\"1901.0\" y=\"1409.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-F9BB69AC-3000-4C14-94DC-8CC8D3F2B65D\" id=\"sid-F9BB69AC-3000-4C14-94DC-8CC8D3F2B65D_gui\">\n            <omgdi:waypoint x=\"681.0\" y=\"951.0\"/>\n            <omgdi:waypoint x=\"681.7798643148516\" y=\"1144.0\"/>\n            <omgdi:waypoint x=\"417.78749374306034\" y=\"1144.0\"/>\n            <omgdi:waypoint x=\"417.0\" y=\"1239.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-309F9D94-670D-47BA-9511-3AB7AB0B9A83\" id=\"sid-309F9D94-670D-47BA-9511-3AB7AB0B9A83_gui\">\n            <omgdi:waypoint x=\"827.0\" y=\"269.0\"/>\n            <omgdi:waypoint x=\"827.0\" y=\"125.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-63119748-84AD-4A9B-8CDE-45B930B374B7\" id=\"sid-63119748-84AD-4A9B-8CDE-45B930B374B7_gui\">\n            <omgdi:waypoint x=\"4905.0\" y=\"1292.0\"/>\n            <omgdi:waypoint x=\"4950.0\" y=\"1292.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-457D4D89-6475-43CD-AB4E-0EC19248E141\" id=\"sid-457D4D89-6475-43CD-AB4E-0EC19248E141_gui\">\n            <omgdi:waypoint x=\"4329.0\" y=\"1332.0\"/>\n            <omgdi:waypoint x=\"4327.0\" y=\"1359.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-83F7F019-81C1-4508-B20B-0534B547D7B8\" id=\"sid-83F7F019-81C1-4508-B20B-0534B547D7B8_gui\">\n            <omgdi:waypoint x=\"3072.0\" y=\"1339.0\"/>\n            <omgdi:waypoint x=\"3072.0\" y=\"1409.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-616032F1-DE57-4D70-B0F8-7BD6F4879437\" id=\"sid-616032F1-DE57-4D70-B0F8-7BD6F4879437_gui\">\n            <omgdi:waypoint x=\"561.0\" y=\"1672.0\"/>\n            <omgdi:waypoint x=\"562.0\" y=\"1770.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-D42DDB33-3FF9-4C9A-A310-F65810A07BC6\" id=\"sid-D42DDB33-3FF9-4C9A-A310-F65810A07BC6_gui\">\n            <omgdi:waypoint x=\"2214.0\" y=\"1613.0\"/>\n            <omgdi:waypoint x=\"2214.0\" y=\"1432.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-95BFCA10-63D0-4D29-8E56-2270CACF3BA8\" id=\"sid-95BFCA10-63D0-4D29-8E56-2270CACF3BA8_gui\">\n            <omgdi:waypoint x=\"782.0\" y=\"1240.0\"/>\n            <omgdi:waypoint x=\"782.0\" y=\"926.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-47EBB822-715D-4193-8711-59063E3E4F48\" id=\"sid-47EBB822-715D-4193-8711-59063E3E4F48_gui\">\n            <omgdi:waypoint x=\"467.0\" y=\"1810.0\"/>\n            <omgdi:waypoint x=\"512.0\" y=\"1810.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-09BC5894-5810-439D-9A36-FEF0B083B598\" id=\"sid-09BC5894-5810-439D-9A36-FEF0B083B598_gui\">\n            <omgdi:waypoint x=\"2251.0\" y=\"1189.0\"/>\n            <omgdi:waypoint x=\"2251.0\" y=\"1037.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-CB506E96-0C3C-4B65-9290-18EA192E62FE\" id=\"sid-CB506E96-0C3C-4B65-9290-18EA192E62FE_gui\">\n            <omgdi:waypoint x=\"3685.0\" y=\"1279.0\"/>\n            <omgdi:waypoint x=\"3685.5099637429494\" y=\"1181.0006737747826\"/>\n            <omgdi:waypoint x=\"3750.0\" y=\"1181.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-7E2E4777-EC3D-4484-8606-A1ACB6FE84BE\" id=\"sid-7E2E4777-EC3D-4484-8606-A1ACB6FE84BE_gui\">\n            <omgdi:waypoint x=\"2139.0\" y=\"1230.0\"/>\n            <omgdi:waypoint x=\"2201.0\" y=\"1229.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-EF5AD02F-469C-45DB-AABA-29D5CDD54B58\" id=\"sid-EF5AD02F-469C-45DB-AABA-29D5CDD54B58_gui\">\n            <omgdi:waypoint x=\"701.0\" y=\"1810.0\"/>\n            <omgdi:waypoint x=\"757.0\" y=\"1810.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-B8825EB2-D9F8-4506-BB4A-0330FF0FFAA9\" id=\"sid-B8825EB2-D9F8-4506-BB4A-0330FF0FFAA9_gui\">\n            <omgdi:waypoint x=\"3055.0\" y=\"1259.0\"/>\n            <omgdi:waypoint x=\"3055.0\" y=\"1064.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-A2B3A2C7-61FA-40F5-9AF0-27FF0B6DE47D\" id=\"sid-A2B3A2C7-61FA-40F5-9AF0-27FF0B6DE47D_gui\">\n            <omgdi:waypoint x=\"4520.0\" y=\"1292.0\"/>\n            <omgdi:waypoint x=\"4565.0\" y=\"1293.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-10D4CACF-4CA9-448C-93D1-BD9089C22BDE\" id=\"sid-10D4CACF-4CA9-448C-93D1-BD9089C22BDE_gui\">\n            <omgdi:waypoint x=\"4740.0\" y=\"1183.0\"/>\n            <omgdi:waypoint x=\"4785.0\" y=\"1183.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-B8E5BEAC-DBF0-45D3-A8A5-1D0D1EF0E19B\" id=\"sid-B8E5BEAC-DBF0-45D3-A8A5-1D0D1EF0E19B_gui\">\n            <omgdi:waypoint x=\"1916.0\" y=\"1394.0\"/>\n            <omgdi:waypoint x=\"1954.0\" y=\"1393.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-C529D2AE-4E4C-4985-A8CB-E6E74673BCAE\" id=\"sid-C529D2AE-4E4C-4985-A8CB-E6E74673BCAE_gui\">\n            <omgdi:waypoint x=\"859.0\" y=\"125.0\"/>\n            <omgdi:waypoint x=\"859.0\" y=\"269.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-FD9AF1C4-E124-4C55-9B18-87804F8EC67E\" id=\"sid-FD9AF1C4-E124-4C55-9B18-87804F8EC67E_gui\">\n            <omgdi:waypoint x=\"277.0\" y=\"468.0\"/>\n            <omgdi:waypoint x=\"308.0\" y=\"468.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-9391DBA5-9C7B-4B14-B502-AB985711AD02\" id=\"sid-9391DBA5-9C7B-4B14-B502-AB985711AD02_gui\">\n            <omgdi:waypoint x=\"337.0\" y=\"871.0\"/>\n            <omgdi:waypoint x=\"337.0000000000001\" y=\"780.8258485520023\"/>\n            <omgdi:waypoint x=\"377.0\" y=\"780.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-E7730210-76BB-486F-BAB3-CA3994DF6AED\" id=\"sid-E7730210-76BB-486F-BAB3-CA3994DF6AED_gui\">\n            <omgdi:waypoint x=\"4741.0\" y=\"1312.0\"/>\n            <omgdi:waypoint x=\"4741.630483194386\" y=\"1545.1783551768249\"/>\n            <omgdi:waypoint x=\"4805.0\" y=\"1545.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-AEE9D356-E86D-4D7A-ABC5-AA6E76635A57\" id=\"sid-AEE9D356-E86D-4D7A-ABC5-AA6E76635A57_gui\">\n            <omgdi:waypoint x=\"1060.0\" y=\"309.0\"/>\n            <omgdi:waypoint x=\"1086.0\" y=\"309.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-C41799EC-DD3A-4ED3-9E55-776983B28363\" id=\"sid-C41799EC-DD3A-4ED3-9E55-776983B28363_gui\">\n            <omgdi:waypoint x=\"4855.0\" y=\"1585.0\"/>\n            <omgdi:waypoint x=\"4855.0\" y=\"1652.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-BD42B065-FCDE-4B2A-9107-3602645F43B1\" id=\"sid-BD42B065-FCDE-4B2A-9107-3602645F43B1_gui\">\n            <omgdi:waypoint x=\"4885.0\" y=\"1183.0\"/>\n            <omgdi:waypoint x=\"4930.0\" y=\"1183.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-0B7D8255-893E-404A-B0EF-CCB418B98B58\" id=\"sid-0B7D8255-893E-404A-B0EF-CCB418B98B58_gui\">\n            <omgdi:waypoint x=\"577.0\" y=\"1254.0\"/>\n            <omgdi:waypoint x=\"622.0\" y=\"1254.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-F834923E-C5BB-44FF-9238-FE9B18B7ECD2\" id=\"sid-F834923E-C5BB-44FF-9238-FE9B18B7ECD2_gui\">\n            <omgdi:waypoint x=\"731.0\" y=\"911.0\"/>\n            <omgdi:waypoint x=\"768.0\" y=\"912.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-E9D52506-E99F-412F-803B-0A7BB95CFA2D\" id=\"sid-E9D52506-E99F-412F-803B-0A7BB95CFA2D_gui\">\n            <omgdi:waypoint x=\"2955.0\" y=\"1284.0\"/>\n            <omgdi:waypoint x=\"2951.0\" y=\"1257.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-3906E383-5898-47F6-84FE-CBA12360BCF9\" id=\"sid-3906E383-5898-47F6-84FE-CBA12360BCF9_gui\">\n            <omgdi:waypoint x=\"2971.0\" y=\"1299.0\"/>\n            <omgdi:waypoint x=\"3022.0\" y=\"1299.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-A1B5F8D2-3FF2-4FAE-A885-819174BB01BD\" id=\"sid-A1B5F8D2-3FF2-4FAE-A885-819174BB01BD_gui\">\n            <omgdi:waypoint x=\"465.0\" y=\"774.0\"/>\n            <omgdi:waypoint x=\"557.0000000000001\" y=\"774.0980785814237\"/>\n            <omgdi:waypoint x=\"557.0\" y=\"871.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-F52F82C6-C6C5-4E39-A2A9-7F4F780748A5\" id=\"sid-F52F82C6-C6C5-4E39-A2A9-7F4F780748A5_gui\">\n            <omgdi:waypoint x=\"2433.0\" y=\"1392.0\"/>\n            <omgdi:waypoint x=\"2469.0\" y=\"1392.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-90EB4714-6D5C-48A0-87BB-BE2024FE22BD\" id=\"sid-90EB4714-6D5C-48A0-87BB-BE2024FE22BD_gui\">\n            <omgdi:waypoint x=\"1479.0\" y=\"1320.0\"/>\n            <omgdi:waypoint x=\"1508.0\" y=\"1320.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-D654E8D0-0A05-48F1-B102-B547E61DDDB6\" id=\"sid-D654E8D0-0A05-48F1-B102-B547E61DDDB6_gui\">\n            <omgdi:waypoint x=\"2681.0\" y=\"1353.0\"/>\n            <omgdi:waypoint x=\"2723.0\" y=\"1353.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-6E0CD175-BAC0-4104-8555-C2473AD6956B\" id=\"sid-6E0CD175-BAC0-4104-8555-C2473AD6956B_gui\">\n            <omgdi:waypoint x=\"3600.0\" y=\"1654.0\"/>\n            <omgdi:waypoint x=\"3645.0\" y=\"1654.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-1F6B2785-A15E-4C82-87C4-9708BDD521B6\" id=\"sid-1F6B2785-A15E-4C82-87C4-9708BDD521B6_gui\">\n            <omgdi:waypoint x=\"435.0\" y=\"1011.0\"/>\n            <omgdi:waypoint x=\"465.0\" y=\"1002.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-7164D016-D299-4243-A9FE-75910B69E8F4\" id=\"sid-7164D016-D299-4243-A9FE-75910B69E8F4_gui\">\n            <omgdi:waypoint x=\"541.0\" y=\"951.0\"/>\n            <omgdi:waypoint x=\"538.0\" y=\"976.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-908C781B-BB04-488F-BA6F-07FCF03BDD32\" id=\"sid-908C781B-BB04-488F-BA6F-07FCF03BDD32_gui\">\n            <omgdi:waypoint x=\"942.0\" y=\"1521.0\"/>\n            <omgdi:waypoint x=\"987.0\" y=\"1521.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-1CA535D5-1E51-41B7-A555-3E8BB651FE97\" id=\"sid-1CA535D5-1E51-41B7-A555-3E8BB651FE97_gui\">\n            <omgdi:waypoint x=\"3420.0\" y=\"1414.0\"/>\n            <omgdi:waypoint x=\"3456.9865028051545\" y=\"1414.263821098874\"/>\n            <omgdi:waypoint x=\"3456.0\" y=\"1318.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-BDC5800E-05A9-4D22-BA46-474DD7EBFF31\" id=\"sid-BDC5800E-05A9-4D22-BA46-474DD7EBFF31_gui\">\n            <omgdi:waypoint x=\"594.0\" y=\"911.0\"/>\n            <omgdi:waypoint x=\"631.0\" y=\"911.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-C2A9F8A3-0E65-4BA2-A854-4B34EE2D2DFD\" id=\"sid-C2A9F8A3-0E65-4BA2-A854-4B34EE2D2DFD_gui\">\n            <omgdi:waypoint x=\"1186.0\" y=\"309.0\"/>\n            <omgdi:waypoint x=\"1231.0\" y=\"309.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-73C9EBCD-9625-4469-B4AD-87B829C4BD8B\" id=\"sid-73C9EBCD-9625-4469-B4AD-87B829C4BD8B_gui\">\n            <omgdi:waypoint x=\"722.0\" y=\"1254.0\"/>\n            <omgdi:waypoint x=\"768.0\" y=\"1254.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-5F689961-FD7E-4383-8ECE-B6946007D211\" id=\"sid-5F689961-FD7E-4383-8ECE-B6946007D211_gui\">\n            <omgdi:waypoint x=\"2139.0\" y=\"1392.0\"/>\n            <omgdi:waypoint x=\"2181.0\" y=\"1392.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-A2FA1E3C-8920-4F38-A2B1-BB75D9E33E85\" id=\"sid-A2FA1E3C-8920-4F38-A2B1-BB75D9E33E85_gui\">\n            <omgdi:waypoint x=\"4586.0\" y=\"1272.0\"/>\n            <omgdi:waypoint x=\"4586.360002239837\" y=\"1183.1323587200968\"/>\n            <omgdi:waypoint x=\"4710.0\" y=\"1183.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-9B1BDCA4-28B7-426E-A13C-66409FAC588B\" id=\"sid-9B1BDCA4-28B7-426E-A13C-66409FAC588B_gui\">\n            <omgdi:waypoint x=\"2301.0\" y=\"1229.0\"/>\n            <omgdi:waypoint x=\"2346.0\" y=\"1229.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-3EB9F09F-9E44-4200-A845-09B78E5F6BA8\" id=\"sid-3EB9F09F-9E44-4200-A845-09B78E5F6BA8_gui\">\n            <omgdi:waypoint x=\"441.0\" y=\"911.0\"/>\n            <omgdi:waypoint x=\"494.0\" y=\"911.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-5C2E761C-74FF-405C-8F6E-416329D714BC\" id=\"sid-5C2E761C-74FF-405C-8F6E-416329D714BC_gui\">\n            <omgdi:waypoint x=\"922.0\" y=\"1790.0\"/>\n            <omgdi:waypoint x=\"922.0\" y=\"1736.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-2DE50901-E357-426B-AC39-60EA1842B6FA\" id=\"sid-2DE50901-E357-426B-AC39-60EA1842B6FA_gui\">\n            <omgdi:waypoint x=\"4665.0\" y=\"1052.0\"/>\n            <omgdi:waypoint x=\"4665.0\" y=\"1277.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-E5370FBF-0192-43B6-8288-43F5D7BE5854\" id=\"sid-E5370FBF-0192-43B6-8288-43F5D7BE5854_gui\">\n            <omgdi:waypoint x=\"922.0\" y=\"1501.0\"/>\n            <omgdi:waypoint x=\"922.0\" y=\"1447.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-CBB13D0A-5D67-4908-9D56-4E1A1E2D0E71\" id=\"sid-CBB13D0A-5D67-4908-9D56-4E1A1E2D0E71_gui\">\n            <omgdi:waypoint x=\"3345.0\" y=\"1298.0\"/>\n            <omgdi:waypoint x=\"3436.0\" y=\"1299.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-778CB5F7-7B50-4086-AEAF-A84CA5D34A8F\" id=\"sid-778CB5F7-7B50-4086-AEAF-A84CA5D34A8F_gui\">\n            <omgdi:waypoint x=\"3615.0\" y=\"1299.0\"/>\n            <omgdi:waypoint x=\"3665.0\" y=\"1299.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-97D1C665-6495-46A4-BA35-8961F07A076F\" id=\"sid-97D1C665-6495-46A4-BA35-8961F07A076F_gui\">\n            <omgdi:waypoint x=\"2352.0\" y=\"1392.0\"/>\n            <omgdi:waypoint x=\"2393.0\" y=\"1392.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-FE1C5021-4268-4AE6-8FBD-9DF197259520\" id=\"sid-FE1C5021-4268-4AE6-8FBD-9DF197259520_gui\">\n            <omgdi:waypoint x=\"1809.0\" y=\"1321.0\"/>\n            <omgdi:waypoint x=\"1830.0\" y=\"1321.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-8F7A2A97-7C59-4B9E-AE03-625BB085C0E4\" id=\"sid-8F7A2A97-7C59-4B9E-AE03-625BB085C0E4_gui\">\n            <omgdi:waypoint x=\"1038.0\" y=\"468.0\"/>\n            <omgdi:waypoint x=\"1083.0\" y=\"468.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-F9A96365-936B-4461-8D51-C38EBA362A68\" id=\"sid-F9A96365-936B-4461-8D51-C38EBA362A68_gui\">\n            <omgdi:waypoint x=\"688.0\" y=\"309.0\"/>\n            <omgdi:waypoint x=\"721.0\" y=\"309.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-17FF4D83-66C9-45AC-8B63-3A4BC45B94B3\" id=\"sid-17FF4D83-66C9-45AC-8B63-3A4BC45B94B3_gui\">\n            <omgdi:waypoint x=\"4239.0\" y=\"1292.0\"/>\n            <omgdi:waypoint x=\"4280.0\" y=\"1292.0\"/>\n         </bpmndi:BPMNEdge>\n      </bpmndi:BPMNPlane>\n   </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/conditions.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"_G5HDsJKJEeSY3uHQ7B6T_A\" targetNamespace=\"http://activiti.org/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.2.2\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:serviceTask id=\"ServiceTask_1\">\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_3</bpmn2:outgoing>\n      <bpmn2:outgoing>SequenceFlow_4</bpmn2:outgoing>\n    </bpmn2:serviceTask>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_3\" name=\"conditional\" sourceRef=\"ServiceTask_1\" targetRef=\"EndEvent_1\">\n      <bpmn2:conditionExpression xsi:type=\"bpmn2:tFormalExpression\"><![CDATA[${foo > bar}]]></bpmn2:conditionExpression>\n    </bpmn2:sequenceFlow>\n    <bpmn2:task id=\"Task_2\">\n      <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n      <bpmn2:incoming>SequenceFlow_4</bpmn2:incoming>\n    </bpmn2:task>\n    <bpmn2:exclusiveGateway id=\"ExclusiveGateway_1\" default=\"SequenceFlow_1\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n      <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n    </bpmn2:exclusiveGateway>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"default\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"ServiceTask_1\" />\n    <bpmn2:sequenceFlow id=\"SequenceFlow_2\" name=\"\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"Task_2\">\n      <bpmn2:conditionExpression xsi:type=\"bpmn2:tFormalExpression\"><![CDATA[${foo < bar}]]></bpmn2:conditionExpression>\n    </bpmn2:sequenceFlow>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_4\" name=\"\" sourceRef=\"ServiceTask_1\" targetRef=\"Task_2\" />\n    <bpmn2:endEvent id=\"EndEvent_1\">\n      <bpmn2:incoming>SequenceFlow_3</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:task id=\"Task_1\" />\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_ExclusiveGateway_2\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"372\" y=\"204\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"397\" y=\"259\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"ServiceTask_1\">\n        <dc:Bounds x=\"492\" y=\"84\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_ExclusiveGateway_2\" targetElement=\"_BPMNShape_Task_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"397\" y=\"204\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"397\" y=\"124\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"492\" y=\"124\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"348\" y=\"138\" width=\"44\" height=\"21\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"492\" y=\"300\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"_BPMNShape_ExclusiveGateway_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"397\" y=\"254\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"397\" y=\"340\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"492\" y=\"340\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"394\" y=\"279\" width=\"6\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"732\" y=\"106\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"750\" y=\"147\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_3\" bpmnElement=\"SequenceFlow_3\" sourceElement=\"_BPMNShape_Task_2\" targetElement=\"_BPMNShape_EndEvent_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"592\" y=\"124\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"732\" y=\"124\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"612\" y=\"128\" width=\"68\" height=\"21\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_4\" bpmnElement=\"SequenceFlow_4\" sourceElement=\"_BPMNShape_Task_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"542\" y=\"164\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"542\" y=\"300\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_0rfo67v_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"204\" y=\"300\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/containers.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_okVDYHb5EeS4-aNScj8yqQ\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"_Participant_2\" name=\"Pool\" processRef=\"Process_1\"/>\n    <bpmn2:participant id=\"Participant_1\" name=\"Participant_1\" processRef=\"Process_2\"/>\n    <bpmn2:participant id=\"Participant_2\" name=\"Participant_2\" processRef=\"Process_3\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Lane_1\" name=\"Lane_1\">\n        <bpmn2:childLaneSet xsi:type=\"bpmn2:tLaneSet\" id=\"LaneSet_3\">\n          <bpmn2:lane id=\"Lane_3\" name=\"Lane_3\">\n            <bpmn2:flowNodeRef>SubProcess_1</bpmn2:flowNodeRef>\n            <bpmn2:flowNodeRef>Transaction_1</bpmn2:flowNodeRef>\n          </bpmn2:lane>\n          <bpmn2:lane id=\"Lane_4\" name=\"Lane_4\">\n            <bpmn2:flowNodeRef>SubProcess_2</bpmn2:flowNodeRef>\n            <bpmn2:flowNodeRef>IntermediateThrowEvent_4</bpmn2:flowNodeRef>\n          </bpmn2:lane>\n        </bpmn2:childLaneSet>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:subProcess id=\"SubProcess_1\" name=\"SubProcess_1\">\n      <bpmn2:intermediateThrowEvent id=\"IntermediateThrowEvent_3\"/>\n    </bpmn2:subProcess>\n    <bpmn2:transaction id=\"Transaction_1\" name=\"Transaction_1\">\n      <bpmn2:intermediateThrowEvent id=\"IntermediateThrowEvent_2\"/>\n    </bpmn2:transaction>\n    <bpmn2:subProcess id=\"SubProcess_2\" name=\"SubProcess_2\">\n      <bpmn2:transaction id=\"Transaction_2\" name=\"Transaction_2\">\n        <bpmn2:intermediateThrowEvent id=\"IntermediateThrowEvent_1\"/>\n      </bpmn2:transaction>\n    </bpmn2:subProcess>\n    <bpmn2:intermediateThrowEvent id=\"IntermediateThrowEvent_4\"/>\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn2:intermediateCatchEvent id=\"IntermediateCatchEvent_1\"/>\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_3\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_2\" name=\"Lane Set 2\">\n      <bpmn2:lane id=\"Lane_2\" name=\"Lane_2\">\n        <bpmn2:flowNodeRef>IntermediateCatchEvent_2</bpmn2:flowNodeRef>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:intermediateCatchEvent id=\"IntermediateCatchEvent_2\"/>\n    <bpmn2:textAnnotation id=\"TextAnnotation_2\"/>\n    <bpmn2:association id=\"Association_2\" sourceRef=\"TextAnnotation_2\" targetRef=\"IntermediateCatchEvent_2\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"_Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"361.0\" width=\"697.0\" x=\"24.0\" y=\"17.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_3\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds height=\"181.0\" width=\"457.0\" x=\"744.0\" y=\"0.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateCatchEvent_2\" bpmnElement=\"IntermediateCatchEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"804.0\" y=\"120.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"822.0\" y=\"161.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_2\" bpmnElement=\"Lane_1\" isHorizontal=\"true\">\n        <dc:Bounds height=\"361.0\" width=\"667.0\" x=\"54.0\" y=\"17.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_4\" bpmnElement=\"Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"169.0\" width=\"457.0\" x=\"744.0\" y=\"209.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateCatchEvent_3\" bpmnElement=\"IntermediateCatchEvent_2\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"804.0\" y=\"317.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"822.0\" y=\"358.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_2\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds height=\"150.0\" width=\"200.0\" x=\"132.0\" y=\"33.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_3\" bpmnElement=\"Lane_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"169.0\" width=\"427.0\" x=\"774.0\" y=\"209.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_4\" bpmnElement=\"Lane_3\" isHorizontal=\"true\">\n        <dc:Bounds height=\"181.0\" width=\"637.0\" x=\"84.0\" y=\"17.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_5\" bpmnElement=\"Lane_4\" isHorizontal=\"true\">\n        <dc:Bounds height=\"181.0\" width=\"637.0\" x=\"84.0\" y=\"197.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Transaction_2\" bpmnElement=\"Transaction_1\" isExpanded=\"true\">\n        <dc:Bounds height=\"150.0\" width=\"200.0\" x=\"372.0\" y=\"33.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_3\" bpmnElement=\"SubProcess_2\" isExpanded=\"true\">\n        <dc:Bounds height=\"150.0\" width=\"200.0\" x=\"132.0\" y=\"213.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Transaction_3\" bpmnElement=\"Transaction_2\" isExpanded=\"true\">\n        <dc:Bounds height=\"107.0\" width=\"145.0\" x=\"144.0\" y=\"240.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateThrowEvent_2\" bpmnElement=\"IntermediateThrowEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"170.0\" y=\"287.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"188.0\" y=\"328.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateThrowEvent_3\" bpmnElement=\"IntermediateThrowEvent_2\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"396.0\" y=\"125.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"414.0\" y=\"166.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateThrowEvent_4\" bpmnElement=\"IntermediateThrowEvent_3\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"168.0\" y=\"125.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"186.0\" y=\"166.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateThrowEvent_5\" bpmnElement=\"IntermediateThrowEvent_4\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"396.0\" y=\"286.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"414.0\" y=\"327.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_TextAnnotation_3\" bpmnElement=\"TextAnnotation_2\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"893.0\" y=\"247.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_Association_2\" bpmnElement=\"Association_2\" sourceElement=\"_BPMNShape_TextAnnotation_3\" targetElement=\"_BPMNShape_IntermediateCatchEvent_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"893.0\" y=\"288.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"840.0\" y=\"323.0\"/>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/distribute-elements-filtering.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.0.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>SequenceFlow_0vrvkcp</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Task_1\">\n      <bpmn:incoming>SequenceFlow_0vrvkcp</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_0vrvkcp\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_1\" attachedToRef=\"Task_1\">\n      <bpmn:outgoing>SequenceFlow_1jet52k</bpmn:outgoing>\n    </bpmn:boundaryEvent>\n    <bpmn:endEvent id=\"EndEvent_1\">\n      <bpmn:incoming>SequenceFlow_1jet52k</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1jet52k\" sourceRef=\"BoundaryEvent_1\" targetRef=\"EndEvent_1\" />\n    <bpmn:subProcess id=\"SubProcess\">\n      <bpmn:startEvent id=\"SubProcessChild\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1jet52k_di\" bpmnElement=\"SequenceFlow_1jet52k\">\n        <di:waypoint x=\"378\" y=\"119\" />\n        <di:waypoint x=\"601\" y=\"119\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"324.5\" y=\"94\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0vrvkcp_di\" bpmnElement=\"SequenceFlow_0vrvkcp\">\n        <di:waypoint x=\"193\" y=\"79\" />\n        <di:waypoint x=\"260\" y=\"79\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"61.5\" y=\"54\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"157\" y=\"61\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"10\" y=\"97\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1qacn6w_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"260\" y=\"39\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_0lfg1uu_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"601\" y=\"101\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"454\" y=\"137\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1kbeku9_di\" bpmnElement=\"SubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"610\" y=\"200\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0h7npxb_di\" bpmnElement=\"SubProcessChild\">\n        <dc:Bounds x=\"650\" y=\"282\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_10ce33p_di\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds x=\"342\" y=\"101\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"195\" y=\"137\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/distribute-elements-filtering.collaboration.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.0.0\">\n  <bpmn:collaboration id=\"Collaboration_1wywxe9\">\n    <bpmn:participant id=\"Participant_1o654rf\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Participant_0lc2m2k\" processRef=\"Process_0bbetmh\" />\n    <bpmn:participant id=\"Participant_0cnn1z4\" processRef=\"Process_14ju0cc\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\" />\n  <bpmn:process id=\"Process_0bbetmh\" isExecutable=\"false\">\n    <bpmn:laneSet id=\"LaneSet_0ahmhbw\">\n      <bpmn:lane id=\"Lane_0i9fng7\" />\n      <bpmn:lane id=\"Lane_1yxptwb\" />\n      <bpmn:lane id=\"Lane_03o4rm2\" />\n    </bpmn:laneSet>\n  </bpmn:process>\n  <bpmn:process id=\"Process_14ju0cc\" isExecutable=\"false\">\n    <bpmn:laneSet id=\"LaneSet_0jckrsk\">\n      <bpmn:lane id=\"Lane_1jivykj\" />\n      <bpmn:lane id=\"Lane_04b9l7u\" />\n    </bpmn:laneSet>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1wywxe9\">\n      <bpmndi:BPMNShape id=\"Participant_1o654rf_di\" bpmnElement=\"Participant_1o654rf\" isHorizontal=\"true\">\n        <dc:Bounds x=\"160\" y=\"80\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_0lc2m2k_di\" bpmnElement=\"Participant_0lc2m2k\" isHorizontal=\"true\">\n        <dc:Bounds x=\"160\" y=\"490\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0i9fng7_di\" bpmnElement=\"Lane_0i9fng7\" isHorizontal=\"true\">\n        <dc:Bounds x=\"190\" y=\"490\" width=\"570\" height=\"83\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1yxptwb_di\" bpmnElement=\"Lane_1yxptwb\" isHorizontal=\"true\">\n        <dc:Bounds x=\"190\" y=\"573\" width=\"570\" height=\"83\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_03o4rm2_di\" bpmnElement=\"Lane_03o4rm2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"190\" y=\"656\" width=\"570\" height=\"84\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_0cnn1z4_di\" bpmnElement=\"Participant_0cnn1z4\" isHorizontal=\"true\">\n        <dc:Bounds x=\"160\" y=\"780\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1jivykj_di\" bpmnElement=\"Lane_1jivykj\" isHorizontal=\"true\">\n        <dc:Bounds x=\"190\" y=\"780\" width=\"570\" height=\"125\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_04b9l7u_di\" bpmnElement=\"Lane_04b9l7u\" isHorizontal=\"true\">\n        <dc:Bounds x=\"190\" y=\"905\" width=\"570\" height=\"125\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/distribute-elements.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.1.0-dev\">\n  <bpmn:collaboration id=\"Collaboration_1vlx71t\">\n    <bpmn:participant id=\"Participant_0xnukme\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:laneSet>\n      <bpmn:lane id=\"Lane_0zfeh45\">\n        <bpmn:flowNodeRef>StartEvent_1</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Task_1b6t3j8</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>ExclusiveGateway_10cec0a</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Task_08pns8h</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Task_0511uak</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>EndEvent_0c9irey</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Task_0s70clu</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Task_0uun3ot</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>EndEvent_0uru64y</bpmn:flowNodeRef>\n      </bpmn:lane>\n      <bpmn:lane id=\"Lane_0a2d085\" />\n    </bpmn:laneSet>\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>SequenceFlow_1yhjvt1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Task_1b6t3j8\">\n      <bpmn:incoming>SequenceFlow_1yhjvt1</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_0dnhiaa</bpmn:outgoing>\n      <bpmn:dataOutputAssociation id=\"DataOutputAssociation_1gsg28i\">\n        <bpmn:targetRef>DataObjectReference_0sy638s</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n    </bpmn:task>\n    <bpmn:exclusiveGateway id=\"ExclusiveGateway_10cec0a\">\n      <bpmn:incoming>SequenceFlow_00cqlm8</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_1r5jt4v</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_1elxpyw</bpmn:outgoing>\n    </bpmn:exclusiveGateway>\n    <bpmn:task id=\"Task_08pns8h\">\n      <bpmn:incoming>SequenceFlow_1r5jt4v</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_17fos5h</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"Task_0511uak\">\n      <bpmn:incoming>SequenceFlow_1elxpyw</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_1wgufjm</bpmn:outgoing>\n      <bpmn:dataOutputAssociation id=\"DataOutputAssociation_104y9s2\">\n        <bpmn:targetRef>DataStoreReference_0mi9txb</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n    </bpmn:task>\n    <bpmn:endEvent id=\"EndEvent_0c9irey\">\n      <bpmn:incoming>SequenceFlow_0dt45uz</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:task id=\"Task_0s70clu\">\n      <bpmn:incoming>SequenceFlow_1wgufjm</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_0dt45uz</bpmn:outgoing>\n      <bpmn:property id=\"Property_1qb88ea\" name=\"__targetRef_placeholder\" />\n      <bpmn:dataInputAssociation id=\"DataInputAssociation_0mn4ndu\">\n        <bpmn:sourceRef>DataStoreReference_0mi9txb</bpmn:sourceRef>\n        <bpmn:targetRef>Property_1qb88ea</bpmn:targetRef>\n      </bpmn:dataInputAssociation>\n    </bpmn:task>\n    <bpmn:task id=\"Task_0uun3ot\">\n      <bpmn:incoming>SequenceFlow_0dnhiaa</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_00cqlm8</bpmn:outgoing>\n      <bpmn:property id=\"Property_17vcvoy\" name=\"__targetRef_placeholder\" />\n      <bpmn:dataInputAssociation id=\"DataInputAssociation_00ub19a\">\n        <bpmn:sourceRef>DataObjectReference_0sy638s</bpmn:sourceRef>\n        <bpmn:targetRef>Property_17vcvoy</bpmn:targetRef>\n      </bpmn:dataInputAssociation>\n    </bpmn:task>\n    <bpmn:endEvent id=\"EndEvent_0uru64y\">\n      <bpmn:incoming>SequenceFlow_17fos5h</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:dataObjectReference id=\"DataObjectReference_0sy638s\" dataObjectRef=\"DataObject_0svzqvh\" />\n    <bpmn:dataObject id=\"DataObject_0svzqvh\" />\n    <bpmn:dataStoreReference id=\"DataStoreReference_0mi9txb\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_1yhjvt1\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1b6t3j8\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_0dnhiaa\" sourceRef=\"Task_1b6t3j8\" targetRef=\"Task_0uun3ot\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_00cqlm8\" sourceRef=\"Task_0uun3ot\" targetRef=\"ExclusiveGateway_10cec0a\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_1r5jt4v\" sourceRef=\"ExclusiveGateway_10cec0a\" targetRef=\"Task_08pns8h\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_1elxpyw\" sourceRef=\"ExclusiveGateway_10cec0a\" targetRef=\"Task_0511uak\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_17fos5h\" sourceRef=\"Task_08pns8h\" targetRef=\"EndEvent_0uru64y\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_1wgufjm\" sourceRef=\"Task_0511uak\" targetRef=\"Task_0s70clu\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_0dt45uz\" sourceRef=\"Task_0s70clu\" targetRef=\"EndEvent_0c9irey\" />\n    <bpmn:textAnnotation id=\"TextAnnotation_03yfps3\" />\n    <bpmn:association id=\"Association_1l7bvu4\" sourceRef=\"Task_0uun3ot\" targetRef=\"TextAnnotation_03yfps3\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1vlx71t\">\n      <bpmndi:BPMNShape id=\"Participant_0xnukme_di\" bpmnElement=\"Participant_0xnukme\">\n        <dc:Bounds x=\"77\" y=\"-70\" width=\"1171\" height=\"654\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"127\" y=\"77\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"100\" y=\"113\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1b6t3j8_di\" bpmnElement=\"Task_1b6t3j8\">\n        <dc:Bounds x=\"241\" y=\"55\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_10cec0a_di\" bpmnElement=\"ExclusiveGateway_10cec0a\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"565\" y=\"70\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"545\" y=\"120\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_08pns8h_di\" bpmnElement=\"Task_08pns8h\">\n        <dc:Bounds x=\"717\" y=\"-42\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0511uak_di\" bpmnElement=\"Task_0511uak\">\n        <dc:Bounds x=\"859\" y=\"214\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_0c9irey_di\" bpmnElement=\"EndEvent_0c9irey\">\n        <dc:Bounds x=\"1190\" y=\"236\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"1163\" y=\"272\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0s70clu_di\" bpmnElement=\"Task_0s70clu\">\n        <dc:Bounds x=\"1033\" y=\"214\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0uun3ot_di\" bpmnElement=\"Task_0uun3ot\">\n        <dc:Bounds x=\"416\" y=\"55\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_0uru64y_di\" bpmnElement=\"EndEvent_0uru64y\">\n        <dc:Bounds x=\"881\" y=\"-20\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"854\" y=\"16\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_03yfps3_di\" bpmnElement=\"TextAnnotation_03yfps3\">\n        <dc:Bounds x=\"332\" y=\"-50\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_0sy638s_di\" bpmnElement=\"DataObjectReference_0sy638s\">\n        <dc:Bounds x=\"322\" y=\"204\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"295\" y=\"254\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_0mi9txb_di\" bpmnElement=\"DataStoreReference_0mi9txb\">\n        <dc:Bounds x=\"984\" y=\"368\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"964\" y=\"418\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1yhjvt1_di\" bpmnElement=\"SequenceFlow_1yhjvt1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"163\" y=\"95\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"241\" y=\"95\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"157\" y=\"70\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0dnhiaa_di\" bpmnElement=\"SequenceFlow_0dnhiaa\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"341\" y=\"95\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"416\" y=\"95\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"427\" y=\"70\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_1gsg28i_di\" bpmnElement=\"DataOutputAssociation_1gsg28i\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"306\" y=\"135\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"331\" y=\"204\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_00cqlm8_di\" bpmnElement=\"SequenceFlow_00cqlm8\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"516\" y=\"95\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"565\" y=\"95\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"480\" y=\"70\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1r5jt4v_di\" bpmnElement=\"SequenceFlow_1r5jt4v\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"590\" y=\"70\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"590\" y=\"-2\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"717\" y=\"-2\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"560\" y=\"24\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1elxpyw_di\" bpmnElement=\"SequenceFlow_1elxpyw\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"590\" y=\"120\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"590\" y=\"254\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"859\" y=\"254\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"560\" y=\"177\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_17fos5h_di\" bpmnElement=\"SequenceFlow_17fos5h\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"817\" y=\"-2\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"849\" y=\"-2\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"849\" y=\"-2\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"881\" y=\"-2\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"819\" y=\"-16\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1wgufjm_di\" bpmnElement=\"SequenceFlow_1wgufjm\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"959\" y=\"254\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"1033\" y=\"254\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"1030\" y=\"229\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_104y9s2_di\" bpmnElement=\"DataOutputAssociation_104y9s2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"938\" y=\"294\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"991\" y=\"368\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0dt45uz_di\" bpmnElement=\"SequenceFlow_0dt45uz\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"1133\" y=\"254\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"1190\" y=\"254\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"1117\" y=\"229\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_0mn4ndu_di\" bpmnElement=\"DataInputAssociation_0mn4ndu\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"1022\" y=\"368\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"1062\" y=\"294\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_00ub19a_di\" bpmnElement=\"DataInputAssociation_00ub19a\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"358\" y=\"210\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"428\" y=\"135\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Association_1l7bvu4_di\" bpmnElement=\"Association_1l7bvu4\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"440\" y=\"55\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"392\" y=\"-20\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Lane_0zfeh45_di\" bpmnElement=\"Lane_0zfeh45\">\n        <dc:Bounds x=\"107\" y=\"-70\" width=\"1141\" height=\"550\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0a2d085_di\" bpmnElement=\"Lane_0a2d085\">\n        <dc:Bounds x=\"107\" y=\"480\" width=\"1141\" height=\"104\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/activity-markers-combination.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n             xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n             xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\"\n             xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n             expressionLanguage=\"http://www.w3.org/1999/XPath\"\n             id=\"sid-c2a526da-d1df-4c64-b710-8b0c72d0db85\"\n             typeLanguage=\"http://www.w3.org/2001/XMLSchema\"\n             xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n    <process id=\"sid-2fbff280-3275-4869-b102-a532da7f4ea7\" isClosed=\"false\" isExecutable=\"false\" processType=\"None\">\n        <task completionQuantity=\"1\" id=\"sid-FE66EBF4-758A-4245-94C4-7692A2076B67\" isForCompensation=\"false\" startQuantity=\"1\">\n            <standardLoopCharacteristics id=\"sid-d89161b1-44d4-43fd-bac9-5285c07de74d\" testBefore=\"false\"/>\n        </task>\n        <task completionQuantity=\"1\" id=\"sid-868D1BDD-191A-4FE7-B6C0-07A3198C23A6\" isForCompensation=\"false\" startQuantity=\"1\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-57b908b2-e2ce-4c46-95d0-59960ca55127\" isSequential=\"false\"/>\n        </task>\n        <task completionQuantity=\"1\" id=\"sid-6D13487A-560B-432F-9566-43EB2DFE1D3F\" isForCompensation=\"true\" startQuantity=\"1\">\n        </task>\n        <task completionQuantity=\"1\" id=\"sid-A76D5353-DFD4-48CA-B585-C136154D7285\" isForCompensation=\"true\" startQuantity=\"1\">\n            <standardLoopCharacteristics id=\"sid-62aac0ea-7835-44df-bfd8-2d46721036a5\" testBefore=\"false\"/>\n        </task>\n        <task completionQuantity=\"1\" id=\"sid-887BECC3-2EFA-4BDB-BE8F-400C2F59254C\" isForCompensation=\"true\" startQuantity=\"1\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-36899ac0-87bd-460e-a5b9-f79906d585ad\" isSequential=\"false\"/>\n        </task>\n        <subProcess completionQuantity=\"1\" id=\"sid-EA23264A-403E-4959-BE96-37DFC8CD98EA\" isForCompensation=\"false\" startQuantity=\"1\" triggeredByEvent=\"false\">\n            <standardLoopCharacteristics id=\"sid-e0aa100d-8aaf-48d3-b3cf-3d6e06673f0c\" testBefore=\"false\"/>\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-88D992A6-9369-41B6-BEEA-B46C2BC16233\" isForCompensation=\"false\" startQuantity=\"1\" triggeredByEvent=\"false\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-2c90f653-8377-4cfd-bf88-90a2e67b766e\" isSequential=\"false\"/>\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-8284D475-31D0-4B19-B8A8-64B78E803D22\" isForCompensation=\"true\" startQuantity=\"1\" triggeredByEvent=\"false\" />\n        <subProcess completionQuantity=\"1\" id=\"sid-DB0852D2-C8F3-42CD-A54B-E552A37ED5F7\" isForCompensation=\"true\" startQuantity=\"1\" triggeredByEvent=\"false\">\n            <standardLoopCharacteristics id=\"sid-0b178290-c506-408b-a051-8718c4a765c3\" testBefore=\"false\"/>\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-D901CA84-76CA-4411-BD26-1D650610D285\" isForCompensation=\"true\" startQuantity=\"1\" triggeredByEvent=\"false\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-da99999a-f046-4345-bff6-4217239d15cd\" isSequential=\"false\"/>\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-B30D2E6C-AA4F-4223-B195-5CB6D99C6CFB\" isForCompensation=\"false\" startQuantity=\"1\" triggeredByEvent=\"false\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-d7bcf2ce-5d4d-4616-ae23-edf25fea5029\" isSequential=\"true\"/>\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-658AA54E-CEC8-4DB5-A57F-D37B892E15CA\" isForCompensation=\"true\" startQuantity=\"1\" triggeredByEvent=\"false\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-6bbe256e-ffa2-4c9c-bf2f-7daffac9618f\" isSequential=\"true\"/>\n        </subProcess>\n        <adHocSubProcess cancelRemainingInstances=\"true\" completionQuantity=\"1\" id=\"sid-8D664235-6E97-4C75-BAF5-3EBA4F181502\" isForCompensation=\"false\" ordering=\"Sequential\" startQuantity=\"1\" triggeredByEvent=\"false\" />\n        <adHocSubProcess cancelRemainingInstances=\"true\" completionQuantity=\"1\" id=\"sid-5E5AA28F-EFE4-499C-AD97-ED6B1BDF0C42\" isForCompensation=\"true\" ordering=\"Sequential\" startQuantity=\"1\" triggeredByEvent=\"false\" />\n        <adHocSubProcess cancelRemainingInstances=\"true\" completionQuantity=\"1\" id=\"sid-1A3345D0-8FEB-46B1-9A75-7DD60B05196E\" isForCompensation=\"false\" ordering=\"Sequential\" startQuantity=\"1\" triggeredByEvent=\"false\" >\n            <standardLoopCharacteristics id=\"sid-54f5f687-34c6-4a0d-95c4-181c255aea12\" testBefore=\"false\"/>\n        </adHocSubProcess>\n        <adHocSubProcess cancelRemainingInstances=\"true\" completionQuantity=\"1\" id=\"sid-3C1F2067-5DF7-435F-90BE-4B05D81B8FAF\" isForCompensation=\"false\" ordering=\"Sequential\" startQuantity=\"1\" triggeredByEvent=\"false\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-9e81b69c-a161-4e37-b930-2c8871274132\" isSequential=\"false\"/>\n        </adHocSubProcess>\n        <adHocSubProcess cancelRemainingInstances=\"true\" completionQuantity=\"1\" id=\"sid-FA255E5E-9B23-4D0D-9C63-38796DA0BAB4\" isForCompensation=\"false\" ordering=\"Sequential\" startQuantity=\"1\" triggeredByEvent=\"false\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-7b8d0c27-8326-4c8a-84e6-4cc14c168652\" isSequential=\"true\"/>\n        </adHocSubProcess>\n        <adHocSubProcess cancelRemainingInstances=\"true\" completionQuantity=\"1\" id=\"sid-E8DD968C-3EB8-4F64-A2A1-D75FA01EFAD3\" isForCompensation=\"true\" ordering=\"Sequential\" startQuantity=\"1\" triggeredByEvent=\"false\">\n            <standardLoopCharacteristics id=\"sid-f2f922b2-c483-4a33-aefd-1affe37690f5\" testBefore=\"false\"/>\n        </adHocSubProcess>\n        <adHocSubProcess cancelRemainingInstances=\"true\" completionQuantity=\"1\" id=\"sid-14B412F4-33F0-4666-B48D-43AFE8368FD1\" isForCompensation=\"true\" ordering=\"Sequential\" startQuantity=\"1\" triggeredByEvent=\"false\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-5208dff3-461d-4bd9-a632-cabd23c6722d\" isSequential=\"false\"/>\n        </adHocSubProcess>\n        <adHocSubProcess cancelRemainingInstances=\"true\" completionQuantity=\"1\" id=\"sid-F279C3DB-6147-4465-8097-E0ED12CC891D\" isForCompensation=\"true\" ordering=\"Sequential\" startQuantity=\"1\" triggeredByEvent=\"false\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-a249cc76-7cb1-4fff-ab32-57f07ee01b93\" isSequential=\"true\"/>\n        </adHocSubProcess>\n        <task completionQuantity=\"1\" id=\"sid-AC450A8A-6E0A-4EFC-AD44-95D634591420\" isForCompensation=\"false\" startQuantity=\"1\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-92fa36a9-0bf3-4d60-ac7b-06ac8510234b\" isSequential=\"true\"/>\n        </task>\n        <task completionQuantity=\"1\" id=\"sid-4265AA7D-2D77-4A0A-B7D9-28128B857EAB\" isForCompensation=\"true\" startQuantity=\"1\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-1ac5d8b3-11b7-411f-b59b-2ab1a1f7a8e8\" isSequential=\"true\"/>\n        </task>\n    </process>\n    <bpmndi:BPMNDiagram id=\"sid-010c2e7e-63de-4a34-a2dd-71fc915b604c\">\n        <bpmndi:BPMNPlane bpmnElement=\"sid-2fbff280-3275-4869-b102-a532da7f4ea7\" id=\"sid-420c5fe7-b70e-4ed2-a21e-03e8f1d777e2\">\n            <bpmndi:BPMNShape bpmnElement=\"sid-FE66EBF4-758A-4245-94C4-7692A2076B67\" id=\"sid-FE66EBF4-758A-4245-94C4-7692A2076B67_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"75.0\" y=\"60.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-868D1BDD-191A-4FE7-B6C0-07A3198C23A6\" id=\"sid-868D1BDD-191A-4FE7-B6C0-07A3198C23A6_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"220.0\" y=\"60.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-6D13487A-560B-432F-9566-43EB2DFE1D3F\" id=\"sid-6D13487A-560B-432F-9566-43EB2DFE1D3F_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"365.0\" y=\"60.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-A76D5353-DFD4-48CA-B585-C136154D7285\" id=\"sid-A76D5353-DFD4-48CA-B585-C136154D7285_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"510.0\" y=\"60.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-887BECC3-2EFA-4BDB-BE8F-400C2F59254C\" id=\"sid-887BECC3-2EFA-4BDB-BE8F-400C2F59254C_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"655.0\" y=\"60.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-EA23264A-403E-4959-BE96-37DFC8CD98EA\" id=\"sid-EA23264A-403E-4959-BE96-37DFC8CD98EA_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"75.0\" y=\"305.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-88D992A6-9369-41B6-BEEA-B46C2BC16233\" id=\"sid-88D992A6-9369-41B6-BEEA-B46C2BC16233_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"220.0\" y=\"305.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-8284D475-31D0-4B19-B8A8-64B78E803D22\" id=\"sid-8284D475-31D0-4B19-B8A8-64B78E803D22_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"375.0\" y=\"305.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-DB0852D2-C8F3-42CD-A54B-E552A37ED5F7\" id=\"sid-DB0852D2-C8F3-42CD-A54B-E552A37ED5F7_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"510.0\" y=\"305.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-D901CA84-76CA-4411-BD26-1D650610D285\" id=\"sid-D901CA84-76CA-4411-BD26-1D650610D285_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"655.0\" y=\"305.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-B30D2E6C-AA4F-4223-B195-5CB6D99C6CFB\" id=\"sid-B30D2E6C-AA4F-4223-B195-5CB6D99C6CFB_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"220.0\" y=\"430.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-658AA54E-CEC8-4DB5-A57F-D37B892E15CA\" id=\"sid-658AA54E-CEC8-4DB5-A57F-D37B892E15CA_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"655.0\" y=\"435.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-8D664235-6E97-4C75-BAF5-3EBA4F181502\" id=\"sid-8D664235-6E97-4C75-BAF5-3EBA4F181502_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"75.0\" y=\"555.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-5E5AA28F-EFE4-499C-AD97-ED6B1BDF0C42\" id=\"sid-5E5AA28F-EFE4-499C-AD97-ED6B1BDF0C42_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"220.0\" y=\"555.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-1A3345D0-8FEB-46B1-9A75-7DD60B05196E\" id=\"sid-1A3345D0-8FEB-46B1-9A75-7DD60B05196E_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"375.0\" y=\"555.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-3C1F2067-5DF7-435F-90BE-4B05D81B8FAF\" id=\"sid-3C1F2067-5DF7-435F-90BE-4B05D81B8FAF_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"520.0\" y=\"555.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-FA255E5E-9B23-4D0D-9C63-38796DA0BAB4\" id=\"sid-FA255E5E-9B23-4D0D-9C63-38796DA0BAB4_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"520.0\" y=\"680.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-E8DD968C-3EB8-4F64-A2A1-D75FA01EFAD3\" id=\"sid-E8DD968C-3EB8-4F64-A2A1-D75FA01EFAD3_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"75.0\" y=\"805.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-14B412F4-33F0-4666-B48D-43AFE8368FD1\" id=\"sid-14B412F4-33F0-4666-B48D-43AFE8368FD1_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"220.0\" y=\"805.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-F279C3DB-6147-4465-8097-E0ED12CC891D\" id=\"sid-F279C3DB-6147-4465-8097-E0ED12CC891D_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"220.0\" y=\"930.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-AC450A8A-6E0A-4EFC-AD44-95D634591420\" id=\"sid-AC450A8A-6E0A-4EFC-AD44-95D634591420_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"220.0\" y=\"180.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-4265AA7D-2D77-4A0A-B7D9-28128B857EAB\" id=\"sid-4265AA7D-2D77-4A0A-B7D9-28128B857EAB_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"655.0\" y=\"180.0\"/>\n            </bpmndi:BPMNShape>\n        </bpmndi:BPMNPlane>\n    </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/activity-markers-simple.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:camunda=\"http://camunda.org/schema/1.0/bpmn\" id=\"_opd4cBZiEeWgh4rX9Ivzlg\" targetNamespace=\"http://activiti.org/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.0.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:task id=\"ParallelTask\" name=\"ParallelTask\">\n      <bpmn2:multiInstanceLoopCharacteristics camunda:collection=\"foo\" camunda:elementVariable=\"bar\">\n        <bpmn2:loopCardinality xsi:type=\"bpmn2:tFormalExpression\">foo</bpmn2:loopCardinality>\n        <bpmn2:completionCondition xsi:type=\"bpmn2:tFormalExpression\">bar</bpmn2:completionCondition>\n      </bpmn2:multiInstanceLoopCharacteristics>\n    </bpmn2:task>\n    <bpmn2:task id=\"SequentialTask\" name=\"SequentialTask\">\n      <bpmn2:multiInstanceLoopCharacteristics isSequential=\"true\" camunda:collection=\"doo\" camunda:elementVariable=\"bar\">\n        <bpmn2:loopCardinality xsi:type=\"bpmn2:tFormalExpression\">foo</bpmn2:loopCardinality>\n        <bpmn2:completionCondition xsi:type=\"bpmn2:tFormalExpression\">bar</bpmn2:completionCondition>\n      </bpmn2:multiInstanceLoopCharacteristics>\n    </bpmn2:task>\n    <bpmn2:task id=\"LoopTask\" name=\"LoopTask\">\n      <bpmn2:standardLoopCharacteristics />\n    </bpmn2:task>\n    <bpmn2:task id=\"Task\" name=\"Task\" />\n    <bpmn2:subProcess id=\"SubProcess\" />\n    <bpmn2:transaction id=\"Transaction\" />\n    <bpmn2:adHocSubProcess id=\"AdHocSubProcess\" />\n    <bpmn2:subProcess id=\"EventSubProcess\" triggeredByEvent=\"true\">\n      <bpmn2:startEvent id=\"MessageStartEvent\">\n        <bpmn2:messageEventDefinition id=\"MessageEventDefinition_0xmds0m\" />\n      </bpmn2:startEvent>\n    </bpmn2:subProcess>\n    <bpmn2:adHocSubProcess id=\"AdHocSubProcessExpanded\" />\n    <bpmn2:subProcess id=\"SubProcessCollapsed\" />\n    <bpmn2:task id=\"TaskCompensation\" name=\"Task\" isForCompensation=\"true\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_4\" bpmnElement=\"ParallelTask\">\n        <dc:Bounds x=\"160\" y=\"100\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_5\" bpmnElement=\"SequentialTask\">\n        <dc:Bounds x=\"300\" y=\"100\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_6\" bpmnElement=\"LoopTask\">\n        <dc:Bounds x=\"444\" y=\"100\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_8\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"588\" y=\"100\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_di\" bpmnElement=\"SubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"161\" y=\"224\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Transaction__di\" bpmnElement=\"Transaction\" isExpanded=\"true\">\n        <dc:Bounds x=\"556\" y=\"224\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"AdHocSubProcess_di\" bpmnElement=\"AdHocSubProcess\">\n        <dc:Bounds x=\"727\" y=\"100\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_0oip8c9_di\" bpmnElement=\"EventSubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"161\" y=\"474\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0iocal3_di\" bpmnElement=\"MessageStartEvent\">\n        <dc:Bounds x=\"202\" y=\"562\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0lpc84d_di\" bpmnElement=\"AdHocSubProcessExpanded\" isExpanded=\"true\">\n        <dc:Bounds x=\"556\" y=\"474\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0qrv1en_di\" bpmnElement=\"SubProcessCollapsed\">\n        <dc:Bounds x=\"860\" y=\"100\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0378hpz\" bpmnElement=\"TaskCompensation\">\n        <dc:Bounds x=\"1000\" y=\"100\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram>\n    <bpmndi:BPMNPlane bpmnElement=\"AdHocSubProcess\" />\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_0nsi3hh\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0mlallf\" bpmnElement=\"SubProcessCollapsed\" />\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/activity-markers.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n             xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n             xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\"\n             xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n             targetNamespace=\"http://www.signavio.com/bpmn20\"\n             typeLanguage=\"http://www.w3.org/2001/XMLSchema\"\n             xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n    <process id=\"sid-15cc2485-b523-4454-ab26-6c27fc23ffb3\" isClosed=\"false\" isExecutable=\"false\" processType=\"None\">\n        <subProcess completionQuantity=\"1\" id=\"sid-AD308F5E-8D3B-41A5-ACD1-123F98BD3EF7\" isForCompensation=\"false\" name=\"Sub-ProcessMarker\" startQuantity=\"1\" triggeredByEvent=\"false\" />\n        <callActivity completionQuantity=\"1\" id=\"sid-63E4F5FA-DBBE-4173-9F58-DF9A55064C2D\" isForCompensation=\"false\" name=\"Sub-ProcessMarker\" startQuantity=\"1\" />\n        <transaction completionQuantity=\"1\" id=\"sid-F85AA892-DEB3-4B68-98C0-890EFCE62A68\" isForCompensation=\"false\" method=\"compensate\" name=\"Sub-ProcessMarker\" startQuantity=\"1\" triggeredByEvent=\"false\" />\n        <subProcess completionQuantity=\"1\" id=\"sid-1FE60272-406F-42E6-B0E1-35D4088F37BE\" isForCompensation=\"false\" name=\"Sub-ProcessMarker\" startQuantity=\"1\" triggeredByEvent=\"true\" />\n        <task completionQuantity=\"1\" id=\"sid-F82F2B0D-2E7D-4A28-BBF7-E060EF72A5F0\" isForCompensation=\"false\" name=\"parallel\" startQuantity=\"1\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-dbf6c638-c848-4033-9b05-359fcdb8d137\" isSequential=\"false\"/>\n        </task>\n        <subProcess completionQuantity=\"1\" id=\"sid-D4AE3F6A-4ECE-4CEC-AACD-D7EE0AE67B35\" isForCompensation=\"false\" name=\"parallel&#10;\" startQuantity=\"1\" triggeredByEvent=\"true\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-3e57c9b9-4819-4cde-9f2b-88470062e3f8\" isSequential=\"false\"/>\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-15EF6D61-CB3E-452F-8F20-BDB4F2299D29\" isForCompensation=\"false\" startQuantity=\"1\" triggeredByEvent=\"false\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-8bbf3c1a-27a4-4e51-bec7-57bf283355b6\" isSequential=\"false\"/>\n        </subProcess>\n        <task completionQuantity=\"1\" id=\"sid-B29FF0A9-9925-4671-8DE2-8F600C16F389\" isForCompensation=\"false\" name=\"sequential\" startQuantity=\"1\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-345eb378-4929-4f70-89ee-d47d10613237\" isSequential=\"true\"/>\n        </task>\n        <subProcess completionQuantity=\"1\" id=\"sid-15AD7063-1830-4914-B921-DD9484A24658\" isForCompensation=\"false\" name=\"sequential\" startQuantity=\"1\" triggeredByEvent=\"true\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-bbc28b98-8097-4ed2-836b-937fd09b2867\" isSequential=\"true\"/>\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-0C2B7A1D-CAAA-48CE-95B6-D8F02BB3EBCA\" isForCompensation=\"false\" startQuantity=\"1\" triggeredByEvent=\"false\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-c2e39c3b-2cc4-4d08-be66-0ffb150108be\" isSequential=\"true\"/>\n        </subProcess>\n        <task completionQuantity=\"1\" id=\"sid-F142BAED-B37D-42F7-884C-FD8F8CBDAA25\" isForCompensation=\"true\" name=\"Compensation\" startQuantity=\"1\" />\n        <transaction completionQuantity=\"1\" id=\"sid-B7FD84D9-52BF-4289-BEB3-AB3BED815D78\" isForCompensation=\"true\" method=\"compensate\" name=\"Compensation\" startQuantity=\"1\" triggeredByEvent=\"false\" />\n        <subProcess completionQuantity=\"1\" id=\"sid-EDC5CCB7-D299-44A1-BC00-3109A435B42A\" isForCompensation=\"true\" name=\"Compensation\" startQuantity=\"1\" triggeredByEvent=\"true\" />\n        <task completionQuantity=\"1\" id=\"sid-100640F8-3258-4AB7-948B-D92A3A762E50\" isForCompensation=\"false\" name=\"Loop&#10;\" startQuantity=\"1\">\n            <standardLoopCharacteristics id=\"sid-ca3c6069-b842-4e83-9d9a-82c9331fa018\" testBefore=\"false\"/>\n        </task>\n        <transaction completionQuantity=\"1\" id=\"sid-490D92CD-79F1-490C-8587-79F236042572\" isForCompensation=\"false\" method=\"compensate\" name=\"Loop\" startQuantity=\"1\" triggeredByEvent=\"false\">\n            <standardLoopCharacteristics id=\"sid-0c6d2214-4110-46b4-9707-9cbee9f51a6b\" testBefore=\"false\"/>\n        </transaction>\n        <subProcess completionQuantity=\"1\" id=\"sid-7E4E4A1B-4669-4F50-A025-AF3733450DC7\" isForCompensation=\"false\" name=\"Loop\" startQuantity=\"1\" triggeredByEvent=\"true\">\n            <standardLoopCharacteristics id=\"sid-0e898175-da93-4940-a20b-48c70e660218\" testBefore=\"false\"/>\n        </subProcess>\n        <callActivity completionQuantity=\"1\" id=\"sid-19A1ED5D-4AE0-4DAB-AC25-7CAA01D1B414\" isForCompensation=\"false\" name=\"parallel\" startQuantity=\"1\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-974e58c8-b219-4ce9-b66b-c05b8133131f\" isSequential=\"false\"/>\n        </callActivity>\n        <callActivity completionQuantity=\"1\" id=\"sid-9C1ABFB4-9B97-4570-8D19-E284DD5DF8F0\" isForCompensation=\"false\" name=\"sequential\" startQuantity=\"1\">\n            <multiInstanceLoopCharacteristics behavior=\"All\" id=\"sid-b80716e0-247b-4dd8-9a4e-bc560e189369\" isSequential=\"true\"/>\n        </callActivity>\n        <callActivity completionQuantity=\"1\" id=\"sid-59B2B4A2-3931-4DA7-94B2-75A7820B25DC\" isForCompensation=\"true\" name=\"Compensation\" startQuantity=\"1\">\n        </callActivity>\n        <callActivity completionQuantity=\"1\" id=\"sid-6CAA9A2E-6C52-4BCD-AEC8-EDF082811484\" isForCompensation=\"false\" name=\"Loop\" startQuantity=\"1\">\n            <standardLoopCharacteristics id=\"sid-23f76c35-2864-487e-b85a-a17a478e527a\" testBefore=\"false\"/>\n        </callActivity>\n        <subProcess completionQuantity=\"1\" id=\"sid-8DF56C07-84E5-47D4-87CC-BDD4FDF49F40\" isForCompensation=\"true\" startQuantity=\"1\" triggeredByEvent=\"false\" />\n        <subProcess completionQuantity=\"1\" id=\"sid-17B6D366-35B3-42A3-BCA4-F99FD2378DFD\" isForCompensation=\"false\" startQuantity=\"1\" triggeredByEvent=\"false\">\n            <standardLoopCharacteristics id=\"sid-5cf2c5d8-3fea-4adf-98e0-0e5079b9f224\" testBefore=\"false\"/>\n        </subProcess>\n        <adHocSubProcess completionQuantity=\"1\" id=\"sid-C341A75A-67E0-4050-B61F-EE9E87A5F2B3\" isForCompensation=\"false\" name=\"Adhoc\" startQuantity=\"1\" />\n        <adHocSubProcess completionQuantity=\"1\" id=\"sid-089831BF-3189-425A-9573-9A6CA7A1CE27\" isForCompensation=\"false\" name=\"Adhoc\" startQuantity=\"1\" triggeredByEvent=\"false\" />\n        <adHocSubProcess cancelRemainingInstances=\"true\" completionQuantity=\"1\" id=\"sid-2F24C7DE-9653-414E-81FC-7D59494A854C\" isForCompensation=\"false\" name=\"Adhoc\" ordering=\"Sequential\" startQuantity=\"1\" triggeredByEvent=\"true\" />\n        <adHocSubProcess cancelRemainingInstances=\"true\" completionQuantity=\"1\" id=\"sid-EF715560-F1B1-48AA-AE2D-6D1429858F7D\" isForCompensation=\"false\" ordering=\"Sequential\" startQuantity=\"1\" triggeredByEvent=\"false\" />\n    </process>\n    <bpmndi:BPMNDiagram id=\"sid-6281ba79-ec22-4f2b-af03-1235f5f9774f\">\n        <bpmndi:BPMNPlane bpmnElement=\"sid-15cc2485-b523-4454-ab26-6c27fc23ffb3\" id=\"sid-a2d69581-ee88-4055-9990-44389aac08a6\">\n            <bpmndi:BPMNShape bpmnElement=\"sid-AD308F5E-8D3B-41A5-ACD1-123F98BD3EF7\" id=\"sid-AD308F5E-8D3B-41A5-ACD1-123F98BD3EF7_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"390.0\" y=\"120.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"24.0\" width=\"86.57142639160156\" x=\"396.7142868041992\" y=\"146.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-63E4F5FA-DBBE-4173-9F58-DF9A55064C2D\" id=\"sid-63E4F5FA-DBBE-4173-9F58-DF9A55064C2D_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"585.0\" y=\"120.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"24.0\" width=\"86.57142639160156\" x=\"591.7142868041992\" y=\"146.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-F85AA892-DEB3-4B68-98C0-890EFCE62A68\" id=\"sid-F85AA892-DEB3-4B68-98C0-890EFCE62A68_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"780.0\" y=\"120.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"24.0\" width=\"86.57142639160156\" x=\"786.7142868041992\" y=\"146.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-1FE60272-406F-42E6-B0E1-35D4088F37BE\" id=\"sid-1FE60272-406F-42E6-B0E1-35D4088F37BE_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"975.0\" y=\"120.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"24.0\" width=\"86.57142639160156\" x=\"981.7142868041992\" y=\"146.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-F82F2B0D-2E7D-4A28-BBF7-E060EF72A5F0\" id=\"sid-F82F2B0D-2E7D-4A28-BBF7-E060EF72A5F0_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"390.0\" y=\"285.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"12.0\" width=\"41.142852783203125\" x=\"419.42857360839844\" y=\"317.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-D4AE3F6A-4ECE-4CEC-AACD-D7EE0AE67B35\" id=\"sid-D4AE3F6A-4ECE-4CEC-AACD-D7EE0AE67B35_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"975.0\" y=\"285.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"12.0\" width=\"41.142852783203125\" x=\"1004.4285736083984\" y=\"317.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-15EF6D61-CB3E-452F-8F20-BDB4F2299D29\" id=\"sid-15EF6D61-CB3E-452F-8F20-BDB4F2299D29_gui\" isExpanded=\"true\">\n                <omgdc:Bounds height=\"100.0\" width=\"120.0\" x=\"1193.0\" y=\"285.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-B29FF0A9-9925-4671-8DE2-8F600C16F389\" id=\"sid-B29FF0A9-9925-4671-8DE2-8F600C16F389_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"390.0\" y=\"450.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"12.0\" width=\"60.857147216796875\" x=\"409.57142639160156\" y=\"482.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-15AD7063-1830-4914-B921-DD9484A24658\" id=\"sid-15AD7063-1830-4914-B921-DD9484A24658_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"975.0\" y=\"450.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"12.0\" width=\"60.857147216796875\" x=\"994.5714263916016\" y=\"482.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-0C2B7A1D-CAAA-48CE-95B6-D8F02BB3EBCA\" id=\"sid-0C2B7A1D-CAAA-48CE-95B6-D8F02BB3EBCA_gui\" isExpanded=\"true\">\n                <omgdc:Bounds height=\"100.0\" width=\"120.0\" x=\"1193.0\" y=\"450.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-F142BAED-B37D-42F7-884C-FD8F8CBDAA25\" id=\"sid-F142BAED-B37D-42F7-884C-FD8F8CBDAA25_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"390.0\" y=\"615.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"12.0\" width=\"86.57142639160156\" x=\"396.7142868041992\" y=\"647.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-B7FD84D9-52BF-4289-BEB3-AB3BED815D78\" id=\"sid-B7FD84D9-52BF-4289-BEB3-AB3BED815D78_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"780.0\" y=\"615.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"12.0\" width=\"86.57142639160156\" x=\"786.7142868041992\" y=\"647.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-EDC5CCB7-D299-44A1-BC00-3109A435B42A\" id=\"sid-EDC5CCB7-D299-44A1-BC00-3109A435B42A_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"975.0\" y=\"615.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"12.0\" width=\"86.57142639160156\" x=\"981.7142868041992\" y=\"647.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-100640F8-3258-4AB7-948B-D92A3A762E50\" id=\"sid-100640F8-3258-4AB7-948B-D92A3A762E50_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"390.0\" y=\"780.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"12.0\" width=\"30.0\" x=\"425.0\" y=\"812.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-490D92CD-79F1-490C-8587-79F236042572\" id=\"sid-490D92CD-79F1-490C-8587-79F236042572_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"780.0\" y=\"780.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"12.0\" width=\"30.0\" x=\"815.0\" y=\"812.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-7E4E4A1B-4669-4F50-A025-AF3733450DC7\" id=\"sid-7E4E4A1B-4669-4F50-A025-AF3733450DC7_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"975.0\" y=\"780.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"12.0\" width=\"30.0\" x=\"1010.0\" y=\"812.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-19A1ED5D-4AE0-4DAB-AC25-7CAA01D1B414\" id=\"sid-19A1ED5D-4AE0-4DAB-AC25-7CAA01D1B414_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"585.0\" y=\"285.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"12.0\" width=\"41.142852783203125\" x=\"614.4285736083984\" y=\"317.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-9C1ABFB4-9B97-4570-8D19-E284DD5DF8F0\" id=\"sid-9C1ABFB4-9B97-4570-8D19-E284DD5DF8F0_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"585.0\" y=\"450.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"12.0\" width=\"60.857147216796875\" x=\"604.5714263916016\" y=\"482.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-59B2B4A2-3931-4DA7-94B2-75A7820B25DC\" id=\"sid-59B2B4A2-3931-4DA7-94B2-75A7820B25DC_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"585.0\" y=\"615.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"12.0\" width=\"86.57142639160156\" x=\"591.7142868041992\" y=\"647.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-6CAA9A2E-6C52-4BCD-AEC8-EDF082811484\" id=\"sid-6CAA9A2E-6C52-4BCD-AEC8-EDF082811484_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"585.0\" y=\"780.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"12.0\" width=\"30.0\" x=\"620.0\" y=\"812.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-8DF56C07-84E5-47D4-87CC-BDD4FDF49F40\" id=\"sid-8DF56C07-84E5-47D4-87CC-BDD4FDF49F40_gui\" isExpanded=\"true\">\n                <omgdc:Bounds height=\"100.0\" width=\"120.0\" x=\"1193.0\" y=\"617.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-17B6D366-35B3-42A3-BCA4-F99FD2378DFD\" id=\"sid-17B6D366-35B3-42A3-BCA4-F99FD2378DFD_gui\" isExpanded=\"true\">\n                <omgdc:Bounds height=\"100.0\" width=\"120.0\" x=\"1193.0\" y=\"784.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-C341A75A-67E0-4050-B61F-EE9E87A5F2B3\" id=\"sid-C341A75A-67E0-4050-B61F-EE9E87A5F2B3_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"585.0\" y=\"945.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"12.0\" width=\"37.71428680419922\" x=\"616.1428565979004\" y=\"977.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-089831BF-3189-425A-9573-9A6CA7A1CE27\" id=\"sid-089831BF-3189-425A-9573-9A6CA7A1CE27_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"780.0\" y=\"945.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"12.0\" width=\"37.71428680419922\" x=\"811.1428565979004\" y=\"977.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-2F24C7DE-9653-414E-81FC-7D59494A854C\" id=\"sid-2F24C7DE-9653-414E-81FC-7D59494A854C_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"975.0\" y=\"945.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n                    <omgdc:Bounds height=\"12.0\" width=\"37.71428680419922\" x=\"1006.1428565979004\" y=\"977.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-EF715560-F1B1-48AA-AE2D-6D1429858F7D\" id=\"sid-EF715560-F1B1-48AA-AE2D-6D1429858F7D_gui\" isExpanded=\"true\">\n                <omgdc:Bounds height=\"100.0\" width=\"120.0\" x=\"1193.0\" y=\"951.0\"/>\n            </bpmndi:BPMNShape>\n        </bpmndi:BPMNPlane>\n        <bpmndi:BPMNLabelStyle id=\"sid-0cc201a5-5e7f-4686-bb28-122d790f68cf\">\n            <omgdc:Font isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\" name=\"Arial\" size=\"12.0\"/>\n        </bpmndi:BPMNLabelStyle>\n    </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/associations.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_0s7r08v\">\n      <bpmn:outgoing>Association_None</bpmn:outgoing>\n      <bpmn:outgoing>Association_One</bpmn:outgoing>\n      <bpmn:outgoing>Association_Both</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:endEvent id=\"EndEvent_106rzzp\">\n      <bpmn:incoming>Association_None</bpmn:incoming>\n      <bpmn:incoming>Association_One</bpmn:incoming>\n      <bpmn:incoming>Association_Both</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:association id=\"Association_None\" associationDirection=\"None\" sourceRef=\"Task_0s7r08v\" targetRef=\"EndEvent_106rzzp\" />\n    <bpmn:association id=\"Association_One\" associationDirection=\"One\" sourceRef=\"Task_0s7r08v\" targetRef=\"EndEvent_106rzzp\" />\n    <bpmn:association id=\"Association_Both\" associationDirection=\"Both\" sourceRef=\"Task_0s7r08v\" targetRef=\"EndEvent_106rzzp\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_0s7r08v_di\" bpmnElement=\"Task_0s7r08v\">\n        <dc:Bounds x=\"316\" y=\"161\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_106rzzp_di\" bpmnElement=\"EndEvent_106rzzp\">\n        <dc:Bounds x=\"565\" y=\"291\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"538\" y=\"327\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_None_di\" bpmnElement=\"Association_None\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"380\" y=\"241\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"406\" y=\"315\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"468\" y=\"340\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"566\" y=\"314\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"444\" y=\"255.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Association_One_di\" bpmnElement=\"Association_One\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"416\" y=\"209\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"511\" y=\"223\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"572\" y=\"296\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"444\" y=\"255.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Association_Both_di\" bpmnElement=\"Association_Both\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"414\" y=\"233\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"566\" y=\"304\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"446\" y=\"245\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/boundary-event-with-refnode.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n             xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n             xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\"\n             xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\"\n             xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n             expressionLanguage=\"http://www.w3.org/1999/XPath\"\n             id=\"sid-3c77c04a-c5e4-4b00-ad92-873ca1d8f28f\"\n             name=\"B.2.0\"\n             targetNamespace=\"http://www.trisotech.com/definitions/_1373638079286\"\n             typeLanguage=\"http://www.w3.org/2001/XMLSchema\"\n             xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n    <collaboration id=\"sid-4af1c293-f0f4-49e8-bb38-f0f65c8ac107\">\n        <participant id=\"_55bb31e8-9e62-48ea-8f0e-1a748c04bbf6\" name=\"Pool-Testcase\" processRef=\"WFP-6-2\">\n        </participant>\n    </collaboration>\n    <process id=\"WFP-6-2\" isClosed=\"false\" isExecutable=\"false\" name=\"Pool-Testcase 2\" processType=\"None\">\n        <extensionElements/>\n        <laneSet id=\"sid-ec28d4f4-3755-4416-a5f9-8c2583ced576\">\n            <lane id=\"_3400f56a-4565-47d1-91db-0ba17b958cb2\" name=\"Lane - Testcase\">\n                <flowNodeRef>_d58753a7-d38b-49cd-914d-14e4cdaa4449</flowNodeRef>\n                <flowNodeRef>End_Event</flowNodeRef>\n                <flowNodeRef>Boundary_Event</flowNodeRef>\n            </lane>\n        </laneSet>\n        <task completionQuantity=\"1\" id=\"_d58753a7-d38b-49cd-914d-14e4cdaa4449\" isForCompensation=\"false\" name=\"A Task\" startQuantity=\"1\" />\n\n        <endEvent id=\"End_Event\" name=\"The End\">\n            <incoming>sid-4F795442-BADE-4AD2-AC9A-C51F90503931</incoming>\n        </endEvent>\n\n        <boundaryEvent attachedToRef=\"_d58753a7-d38b-49cd-914d-14e4cdaa4449\" cancelActivity=\"true\" id=\"Boundary_Event\" parallelMultiple=\"false\">\n            <outgoing>sid-4F795442-BADE-4AD2-AC9A-C51F90503931</outgoing>\n            <signalEventDefinition id=\"sid-a736556b-1648-4b13-9d51-d1b8b302715c\"/>\n        </boundaryEvent>\n\n        <sequenceFlow id=\"sid-4F795442-BADE-4AD2-AC9A-C51F90503931\" sourceRef=\"Boundary_Event\" targetRef=\"End_Event\" />\n    </process>\n    <bpmndi:BPMNDiagram id=\"sid-af59fa1e-e6f6-442f-8b8f-10d8b342a601\" name=\"B.2.0\">\n        <bpmndi:BPMNPlane bpmnElement=\"sid-4af1c293-f0f4-49e8-bb38-f0f65c8ac107\" id=\"sid-c22f3e5f-ea4d-4216-81b3-f130d759d52a\">\n            <bpmndi:BPMNShape bpmnElement=\"_55bb31e8-9e62-48ea-8f0e-1a748c04bbf6\" id=\"_55bb31e8-9e62-48ea-8f0e-1a748c04bbf6_gui\" isHorizontal=\"true\">\n                <omgdc:Bounds height=\"307.0\" width=\"480.0\" x=\"60.0\" y=\"30.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-77e078a7-1f31-4117-b678-7326d5e5a6a7\">\n                    <omgdc:Bounds height=\"84.0\" width=\"12.000000000000014\" x=\"65.0\" y=\"141.5\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"_3400f56a-4565-47d1-91db-0ba17b958cb2\" id=\"_3400f56a-4565-47d1-91db-0ba17b958cb2_gui\" isHorizontal=\"true\">\n                <omgdc:Bounds height=\"307.0\" width=\"450.0\" x=\"90.0\" y=\"30.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-77e078a7-1f31-4117-b678-7326d5e5a6a7\">\n                    <omgdc:Bounds height=\"96.0\" width=\"12.000000000000014\" x=\"94.99999999999999\" y=\"135.5\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"_d58753a7-d38b-49cd-914d-14e4cdaa4449\" id=\"_d58753a7-d38b-49cd-914d-14e4cdaa4449_gui\">\n                <omgdc:Bounds height=\"68.0\" width=\"83.0\" x=\"195.0\" y=\"105.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-77e078a7-1f31-4117-b678-7326d5e5a6a7\">\n                    <omgdc:Bounds height=\"12.0\" width=\"41.142852783203125\" x=\"215.92857360839844\" y=\"131.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"End_Event\" id=\"End_Event_gui\">\n                <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"382.0\" y=\"218.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-5bb14c58-e378-46dc-9d3e-8b2b6e051656\">\n                    <omgdc:Bounds height=\"11.0\" width=\"45.57143020629883\" x=\"374.2142848968506\" y=\"264.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"Boundary_Event\" id=\"Boundary_Event_gui\">\n                <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"213.60714285714286\" y=\"158.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-4F795442-BADE-4AD2-AC9A-C51F90503931\" id=\"sid-4F795442-BADE-4AD2-AC9A-C51F90503931_gui\">\n                <omgdi:waypoint x=\"228.58355308951846\" y=\"188.0\"/>\n                <omgdi:waypoint x=\"228.51435643782017\" y=\"232.0\"/>\n                <omgdi:waypoint x=\"382.0\" y=\"232.0\"/>\n            </bpmndi:BPMNEdge>\n        </bpmndi:BPMNPlane>\n        <bpmndi:BPMNLabelStyle id=\"sid-5bb14c58-e378-46dc-9d3e-8b2b6e051656\">\n            <omgdc:Font isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\" name=\"Arial\" size=\"11.0\"/>\n        </bpmndi:BPMNLabelStyle>\n        <bpmndi:BPMNLabelStyle id=\"sid-77e078a7-1f31-4117-b678-7326d5e5a6a7\">\n            <omgdc:Font isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\" name=\"Arial\" size=\"12.0\"/>\n        </bpmndi:BPMNLabelStyle>\n    </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/boundary-event-without-refnode.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n             xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n             xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\"\n             xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\"\n             xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n             expressionLanguage=\"http://www.w3.org/1999/XPath\"\n             id=\"sid-3c77c04a-c5e4-4b00-ad92-873ca1d8f28f\"\n             name=\"B.2.0\"\n             targetNamespace=\"http://www.trisotech.com/definitions/_1373638079286\"\n             typeLanguage=\"http://www.w3.org/2001/XMLSchema\"\n             xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n    <collaboration id=\"sid-4af1c293-f0f4-49e8-bb38-f0f65c8ac107\">\n        <participant id=\"_55bb31e8-9e62-48ea-8f0e-1a748c04bbf6\" name=\"Pool-Testcase\" processRef=\"WFP-6-2\">\n        </participant>\n    </collaboration>\n    <process id=\"WFP-6-2\" isClosed=\"false\" isExecutable=\"false\" name=\"Pool-Testcase 2\" processType=\"None\">\n        <extensionElements/>\n        <laneSet id=\"sid-ec28d4f4-3755-4416-a5f9-8c2583ced576\">\n            <lane id=\"_3400f56a-4565-47d1-91db-0ba17b958cb2\" name=\"Lane - Testcase\">\n                <flowNodeRef>_d58753a7-d38b-49cd-914d-14e4cdaa4449</flowNodeRef>\n                <flowNodeRef>End_Event</flowNodeRef>\n                <!--<flowNodeRef>Boundary_Event</flowNodeRef>--> <!-- Reference is not mandatory -->\n            </lane>\n        </laneSet>\n        <task completionQuantity=\"1\" id=\"_d58753a7-d38b-49cd-914d-14e4cdaa4449\" isForCompensation=\"false\" name=\"A Task\" startQuantity=\"1\" />\n\n        <endEvent id=\"End_Event\" name=\"The End\">\n            <incoming>sid-4F795442-BADE-4AD2-AC9A-C51F90503931</incoming>\n        </endEvent>\n\n        <boundaryEvent attachedToRef=\"_d58753a7-d38b-49cd-914d-14e4cdaa4449\" cancelActivity=\"true\" id=\"Boundary_Event\" parallelMultiple=\"false\">\n            <outgoing>sid-4F795442-BADE-4AD2-AC9A-C51F90503931</outgoing>\n            <signalEventDefinition id=\"sid-a736556b-1648-4b13-9d51-d1b8b302715c\"/>\n        </boundaryEvent>\n\n        <sequenceFlow id=\"sid-4F795442-BADE-4AD2-AC9A-C51F90503931\" sourceRef=\"Boundary_Event\" targetRef=\"End_Event\" />\n    </process>\n    <bpmndi:BPMNDiagram id=\"sid-af59fa1e-e6f6-442f-8b8f-10d8b342a601\" name=\"B.2.0\">\n        <bpmndi:BPMNPlane bpmnElement=\"sid-4af1c293-f0f4-49e8-bb38-f0f65c8ac107\" id=\"sid-c22f3e5f-ea4d-4216-81b3-f130d759d52a\">\n            <bpmndi:BPMNShape bpmnElement=\"_55bb31e8-9e62-48ea-8f0e-1a748c04bbf6\" id=\"_55bb31e8-9e62-48ea-8f0e-1a748c04bbf6_gui\" isHorizontal=\"true\">\n                <omgdc:Bounds height=\"307.0\" width=\"480.0\" x=\"60.0\" y=\"30.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-77e078a7-1f31-4117-b678-7326d5e5a6a7\">\n                    <omgdc:Bounds height=\"84.0\" width=\"12.000000000000014\" x=\"65.0\" y=\"141.5\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"_3400f56a-4565-47d1-91db-0ba17b958cb2\" id=\"_3400f56a-4565-47d1-91db-0ba17b958cb2_gui\" isHorizontal=\"true\">\n                <omgdc:Bounds height=\"307.0\" width=\"450.0\" x=\"90.0\" y=\"30.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-77e078a7-1f31-4117-b678-7326d5e5a6a7\">\n                    <omgdc:Bounds height=\"96.0\" width=\"12.000000000000014\" x=\"94.99999999999999\" y=\"135.5\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"_d58753a7-d38b-49cd-914d-14e4cdaa4449\" id=\"_d58753a7-d38b-49cd-914d-14e4cdaa4449_gui\">\n                <omgdc:Bounds height=\"68.0\" width=\"83.0\" x=\"195.0\" y=\"105.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-77e078a7-1f31-4117-b678-7326d5e5a6a7\">\n                    <omgdc:Bounds height=\"12.0\" width=\"41.142852783203125\" x=\"215.92857360839844\" y=\"131.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"End_Event\" id=\"End_Event_gui\">\n                <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"382.0\" y=\"218.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-5bb14c58-e378-46dc-9d3e-8b2b6e051656\">\n                    <omgdc:Bounds height=\"11.0\" width=\"45.57143020629883\" x=\"374.2142848968506\" y=\"264.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"Boundary_Event\" id=\"Boundary_Event_gui\">\n                <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"213.60714285714286\" y=\"158.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-4F795442-BADE-4AD2-AC9A-C51F90503931\" id=\"sid-4F795442-BADE-4AD2-AC9A-C51F90503931_gui\">\n                <omgdi:waypoint x=\"228.58355308951846\" y=\"188.0\"/>\n                <omgdi:waypoint x=\"228.51435643782017\" y=\"232.0\"/>\n                <omgdi:waypoint x=\"382.0\" y=\"232.0\"/>\n            </bpmndi:BPMNEdge>\n        </bpmndi:BPMNPlane>\n        <bpmndi:BPMNLabelStyle id=\"sid-5bb14c58-e378-46dc-9d3e-8b2b6e051656\">\n            <omgdc:Font isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\" name=\"Arial\" size=\"11.0\"/>\n        </bpmndi:BPMNLabelStyle>\n        <bpmndi:BPMNLabelStyle id=\"sid-77e078a7-1f31-4117-b678-7326d5e5a6a7\">\n            <omgdc:Font isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\" name=\"Arial\" size=\"12.0\"/>\n        </bpmndi:BPMNLabelStyle>\n    </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/boundary-event-z-index.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n                   xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n                   xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n                   xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\"\n                   xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL\n                   BPMN20.xsd\">\n    <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n\n        <!-- Even if boundary Event is before Task element it should drawn with higher z index -->\n        <bpmn2:boundaryEvent id=\"BoundaryEvent_1\" name=\"Event should be drawn above the Task\" attachedToRef=\"Task_1\">\n            <bpmn2:escalationEventDefinition id=\"_EscalationEventDefinition_1\"/>\n        </bpmn2:boundaryEvent>\n\n        <bpmn2:task id=\"Task_1\" name=\"Task\">\n            <bpmn2:standardLoopCharacteristics/>\n        </bpmn2:task>\n\n        <!-- Normal order should work also -->\n        <bpmn2:task id=\"Task_2\" name=\"Task\">\n            <bpmn2:standardLoopCharacteristics/>\n        </bpmn2:task>\n\n        <bpmn2:boundaryEvent id=\"BoundaryEvent_2\" name=\"Event should be drawn above the Task\" attachedToRef=\"Task_2\">\n            <bpmn2:escalationEventDefinition id=\"_EscalationEventDefinition_2\"/>\n        </bpmn2:boundaryEvent>\n\n        <!-- Another one -->\n\n        <bpmn2:boundaryEvent attachedToRef=\"Task_3\" name=\"Event should be drawn above the Task\" cancelActivity=\"false\"\n                             id=\"BoundaryEvent_3\" parallelMultiple=\"false\">\n            <bpmn2:signalEventDefinition id=\"_5555\"/>\n        </bpmn2:boundaryEvent>\n\n        <bpmn2:task completionQuantity=\"1\" id=\"Task_3\" isForCompensation=\"false\" startQuantity=\"1\">\n        </bpmn2:task>\n\n\n\n\n\n    </bpmn2:process>\n    <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n        <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n\n            <bpmndi:BPMNShape id=\"_BPMNShape_Task_30\" bpmnElement=\"Task_1\">\n                <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"138.0\" y=\"48.0\"/>\n            </bpmndi:BPMNShape>\n\n            <bpmndi:BPMNShape id=\"_BPMNShape_BoundaryEvent_1\" bpmnElement=\"BoundaryEvent_1\">\n                <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"142.0\" y=\"110.0\"/>\n                <bpmndi:BPMNLabel>\n                    <dc:Bounds height=\"22.0\" width=\"84.0\" x=\"172.0\" y=\"145.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n\n\n            <bpmndi:BPMNShape id=\"_BPMNShape_Task_31\" bpmnElement=\"Task_2\">\n                <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"138.0\" y=\"248.0\"/>\n            </bpmndi:BPMNShape>\n\n            <bpmndi:BPMNShape id=\"_BPMNShape_BoundaryEvent_2\" bpmnElement=\"BoundaryEvent_2\">\n                <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"142.0\" y=\"310.0\"/>\n                <bpmndi:BPMNLabel>\n                    <dc:Bounds height=\"22.0\" width=\"84.0\" x=\"172.0\" y=\"345.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n\n            <bpmndi:BPMNShape id=\"_BPMNShape_Task_32\" bpmnElement=\"Task_3\">\n                <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"138.0\" y=\"448.0\"/>\n            </bpmndi:BPMNShape>\n\n            <bpmndi:BPMNShape id=\"_BPMNShape_BoundaryEvent_3\" bpmnElement=\"BoundaryEvent_3\">\n                <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"142.0\" y=\"510.0\"/>\n                <bpmndi:BPMNLabel>\n                    <dc:Bounds height=\"22.0\" width=\"84.0\" x=\"172.0\" y=\"545.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n\n\n        </bpmndi:BPMNPlane>\n    </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/draw/call-activity.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:callActivity id=\"CallActivity\" name=\"A\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"CallActivity_di\" bpmnElement=\"CallActivity\">\n        <dc:Bounds x=\"399\" y=\"130\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/draw/conditional-flow-default.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:signavio=\"http://www.signavio.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" exporter=\"Signavio Process Editor, http://www.signavio.com\" exporterVersion=\"8.0.0\" expressionLanguage=\"http://www.w3.org/1999/XPath\" id=\"sid-1237c256-d5c0-45c1-8de1-85c54c149d71\" targetNamespace=\"http://www.signavio.com/bpmn20\" typeLanguage=\"http://www.w3.org/2001/XMLSchema\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n   <error id=\"sid-5331eecf-9770-4621-b761-edb204ace8c2\"/>\n   <process id=\"sid-29e45cb7-375a-4e9c-bc1b-b509fac3af2f\" isClosed=\"false\" isExecutable=\"false\" processType=\"None\">\n      <startEvent id=\"sid-7A06429D-56D7-4A95-B057-A81E8AAE9F70\">\n         <outgoing>sid-F71776EB-FC77-47EC-A608-4D90422C9C9D</outgoing>\n      </startEvent>\n      <exclusiveGateway default=\"sid-8372F73C-BF60-4F06-A520-F3D010C17849\" gatewayDirection=\"Diverging\" id=\"sid-6FD586BF-818E-453D-ADB7-B9E8C95596A8\">\n         <incoming>sid-F71776EB-FC77-47EC-A608-4D90422C9C9D</incoming>\n         <outgoing>sid-8372F73C-BF60-4F06-A520-F3D010C17849</outgoing>\n         <outgoing>sid-586C231A-A870-475A-9CC7-6E5EB7D96EA0</outgoing>\n      </exclusiveGateway>\n      <task completionQuantity=\"1\" id=\"sid-BAA241BA-8AA8-4106-9717-294A216FF28D\" isForCompensation=\"false\" startQuantity=\"1\">\n         <incoming>sid-8372F73C-BF60-4F06-A520-F3D010C17849</incoming>\n         <outgoing>sid-2AD76A90-5C48-48D5-A1A4-B965E9A176F1</outgoing>\n      </task>\n      <inclusiveGateway default=\"sid-3D50F08F-F5CA-41F5-8B2D-8AC1E3EE12C1\" gatewayDirection=\"Diverging\" id=\"sid-1D5E8A2E-CCF0-4408-8C11-2BE2020AF37E\">\n         <incoming>sid-2AD76A90-5C48-48D5-A1A4-B965E9A176F1</incoming>\n         <outgoing>sid-3D50F08F-F5CA-41F5-8B2D-8AC1E3EE12C1</outgoing>\n         <outgoing>sid-F24B422A-FC22-444F-9B47-B6220BC8BC79</outgoing>\n      </inclusiveGateway>\n      <task completionQuantity=\"1\" id=\"sid-86596B6B-5D90-4B16-8468-796474369165\" isForCompensation=\"false\" startQuantity=\"1\">\n         <incoming>sid-3D50F08F-F5CA-41F5-8B2D-8AC1E3EE12C1</incoming>\n         <outgoing>sid-F861C2E1-3A74-4EE0-850B-ED7251335F00</outgoing>\n      </task>\n      <endEvent id=\"sid-7251BCEA-F239-4774-A789-47A20DED025F\">\n         <extensionElements>\n            <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffff\"/>\n            <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n         </extensionElements>\n         <incoming>sid-F861C2E1-3A74-4EE0-850B-ED7251335F00</incoming>\n      </endEvent>\n      <endEvent id=\"sid-B7F91CEA-A9C9-4988-ADDF-FF3028089433\">\n         <incoming>sid-586C231A-A870-475A-9CC7-6E5EB7D96EA0</incoming>\n         <incoming>sid-F24B422A-FC22-444F-9B47-B6220BC8BC79</incoming>\n         <errorEventDefinition errorRef=\"sid-5331eecf-9770-4621-b761-edb204ace8c2\" id=\"sid-0a185b30-23c4-420b-9f03-9cda63a102ac\"/>\n      </endEvent>\n      <sequenceFlow id=\"sid-F71776EB-FC77-47EC-A608-4D90422C9C9D\" sourceRef=\"sid-7A06429D-56D7-4A95-B057-A81E8AAE9F70\" targetRef=\"sid-6FD586BF-818E-453D-ADB7-B9E8C95596A8\" />\n      <sequenceFlow id=\"sid-8372F73C-BF60-4F06-A520-F3D010C17849\" sourceRef=\"sid-6FD586BF-818E-453D-ADB7-B9E8C95596A8\" targetRef=\"sid-BAA241BA-8AA8-4106-9717-294A216FF28D\" />\n      <sequenceFlow id=\"sid-2AD76A90-5C48-48D5-A1A4-B965E9A176F1\" sourceRef=\"sid-BAA241BA-8AA8-4106-9717-294A216FF28D\" targetRef=\"sid-1D5E8A2E-CCF0-4408-8C11-2BE2020AF37E\" />\n      <sequenceFlow id=\"sid-3D50F08F-F5CA-41F5-8B2D-8AC1E3EE12C1\" sourceRef=\"sid-1D5E8A2E-CCF0-4408-8C11-2BE2020AF37E\" targetRef=\"sid-86596B6B-5D90-4B16-8468-796474369165\" />\n      <sequenceFlow id=\"sid-F861C2E1-3A74-4EE0-850B-ED7251335F00\" sourceRef=\"sid-86596B6B-5D90-4B16-8468-796474369165\" targetRef=\"sid-7251BCEA-F239-4774-A789-47A20DED025F\" />\n      <sequenceFlow id=\"sid-586C231A-A870-475A-9CC7-6E5EB7D96EA0\" sourceRef=\"sid-6FD586BF-818E-453D-ADB7-B9E8C95596A8\" targetRef=\"sid-B7F91CEA-A9C9-4988-ADDF-FF3028089433\" />\n      <sequenceFlow id=\"sid-F24B422A-FC22-444F-9B47-B6220BC8BC79\" sourceRef=\"sid-1D5E8A2E-CCF0-4408-8C11-2BE2020AF37E\" targetRef=\"sid-B7F91CEA-A9C9-4988-ADDF-FF3028089433\" />\n   </process>\n   <bpmndi:BPMNDiagram id=\"sid-339b903e-4940-4c07-ad81-fa001943ae61\">\n      <bpmndi:BPMNPlane bpmnElement=\"sid-29e45cb7-375a-4e9c-bc1b-b509fac3af2f\" id=\"sid-cb926257-3364-4f38-b166-a7a651d63bd4\">\n         <bpmndi:BPMNShape bpmnElement=\"sid-7A06429D-56D7-4A95-B057-A81E8AAE9F70\" id=\"sid-7A06429D-56D7-4A95-B057-A81E8AAE9F70_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"75.0\" y=\"270.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-6FD586BF-818E-453D-ADB7-B9E8C95596A8\" id=\"sid-6FD586BF-818E-453D-ADB7-B9E8C95596A8_gui\" isMarkerVisible=\"true\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"285.0\" y=\"265.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-BAA241BA-8AA8-4106-9717-294A216FF28D\" id=\"sid-BAA241BA-8AA8-4106-9717-294A216FF28D_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"505.0\" y=\"245.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-1D5E8A2E-CCF0-4408-8C11-2BE2020AF37E\" id=\"sid-1D5E8A2E-CCF0-4408-8C11-2BE2020AF37E_gui\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"535.0\" y=\"420.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-86596B6B-5D90-4B16-8468-796474369165\" id=\"sid-86596B6B-5D90-4B16-8468-796474369165_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"255.0\" y=\"400.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-7251BCEA-F239-4774-A789-47A20DED025F\" id=\"sid-7251BCEA-F239-4774-A789-47A20DED025F_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"76.0\" y=\"426.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-B7F91CEA-A9C9-4988-ADDF-FF3028089433\" id=\"sid-B7F91CEA-A9C9-4988-ADDF-FF3028089433_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"785.0\" y=\"75.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-2AD76A90-5C48-48D5-A1A4-B965E9A176F1\" id=\"sid-2AD76A90-5C48-48D5-A1A4-B965E9A176F1_gui\">\n            <omgdi:waypoint x=\"555.128617363344\" y=\"325.0\"/>\n            <omgdi:waypoint x=\"555.4340836012861\" y=\"420.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-F24B422A-FC22-444F-9B47-B6220BC8BC79\" id=\"sid-F24B422A-FC22-444F-9B47-B6220BC8BC79_gui\">\n            <omgdi:waypoint x=\"575.0\" y=\"440.5\"/>\n            <omgdi:waypoint x=\"799.0\" y=\"440.5\"/>\n            <omgdi:waypoint x=\"799.0\" y=\"103.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-F71776EB-FC77-47EC-A608-4D90422C9C9D\" id=\"sid-F71776EB-FC77-47EC-A608-4D90422C9C9D_gui\">\n            <omgdi:waypoint x=\"105.0\" y=\"285.03480278422273\"/>\n            <omgdi:waypoint x=\"285.0\" y=\"285.4524361948956\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-F861C2E1-3A74-4EE0-850B-ED7251335F00\" id=\"sid-F861C2E1-3A74-4EE0-850B-ED7251335F00_gui\">\n            <omgdi:waypoint x=\"255.0\" y=\"440.0\"/>\n            <omgdi:waypoint x=\"104.0\" y=\"440.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-8372F73C-BF60-4F06-A520-F3D010C17849\" id=\"sid-8372F73C-BF60-4F06-A520-F3D010C17849_gui\">\n            <omgdi:waypoint x=\"325.0\" y=\"285.4609218436874\"/>\n            <omgdi:waypoint x=\"505.0\" y=\"285.1002004008016\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-586C231A-A870-475A-9CC7-6E5EB7D96EA0\" id=\"sid-586C231A-A870-475A-9CC7-6E5EB7D96EA0_gui\">\n            <omgdi:waypoint x=\"305.5\" y=\"265.0\"/>\n            <omgdi:waypoint x=\"305.5\" y=\"89.0\"/>\n            <omgdi:waypoint x=\"785.0\" y=\"89.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-3D50F08F-F5CA-41F5-8B2D-8AC1E3EE12C1\" id=\"sid-3D50F08F-F5CA-41F5-8B2D-8AC1E3EE12C1_gui\">\n            <omgdi:waypoint x=\"535.0\" y=\"440.45908183632736\"/>\n            <omgdi:waypoint x=\"355.0\" y=\"440.0998003992016\"/>\n         </bpmndi:BPMNEdge>\n      </bpmndi:BPMNPlane>\n   </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/conditional-flow-gateways.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n                   xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n                   xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n                   xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\"\n                   xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\"\n                   xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n    <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n        <bpmn2:startEvent id=\"StartEvent_1\">\n            <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n        </bpmn2:startEvent>\n        <bpmn2:exclusiveGateway id=\"ExclusiveGateway_1\" default=\"SequenceFlow_3\">\n            <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n            <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n            <bpmn2:outgoing>SequenceFlow_3</bpmn2:outgoing>\n        </bpmn2:exclusiveGateway>\n        <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"StartEvent_1\" targetRef=\"ExclusiveGateway_1\"/>\n        <bpmn2:sequenceFlow id=\"SequenceFlow_2\" name=\"\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"EndEvent_1\">\n            <bpmn2:conditionExpression xsi:type=\"bpmn2:tFormalExpression\">test</bpmn2:conditionExpression>\n        </bpmn2:sequenceFlow>\n        <bpmn2:endEvent id=\"EndEvent_1\">\n            <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n        </bpmn2:endEvent>\n        <bpmn2:sequenceFlow id=\"SequenceFlow_3\" name=\"\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"EndEvent_2\"/>\n        <bpmn2:endEvent id=\"EndEvent_2\">\n            <bpmn2:incoming>SequenceFlow_3</bpmn2:incoming>\n        </bpmn2:endEvent>\n    </bpmn2:process>\n    <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n        <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n            <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n                <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"534.0\" y=\"305.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape id=\"_BPMNShape_ExclusiveGateway_2\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n                <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"620.0\" y=\"298.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_StartEvent_2\" targetElement=\"_BPMNShape_ExclusiveGateway_2\">\n                <di:waypoint xsi:type=\"dc:Point\" x=\"570.0\" y=\"323.0\"/>\n                <di:waypoint xsi:type=\"dc:Point\" x=\"620.0\" y=\"323.0\"/>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_1\">\n                <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"744.0\" y=\"228.0\"/>\n                <bpmndi:BPMNLabel>\n                    <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"762.0\" y=\"269.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"_BPMNShape_ExclusiveGateway_2\" targetElement=\"_BPMNShape_EndEvent_2\">\n                <di:waypoint xsi:type=\"dc:Point\" x=\"645.0\" y=\"298.0\"/>\n                <di:waypoint xsi:type=\"dc:Point\" x=\"645.0\" y=\"246.0\"/>\n                <di:waypoint xsi:type=\"dc:Point\" x=\"707.0\" y=\"246.0\"/>\n                <di:waypoint xsi:type=\"dc:Point\" x=\"744.0\" y=\"246.0\"/>\n                <bpmndi:BPMNLabel>\n                    <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"642.0\" y=\"273.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_3\" bpmnElement=\"EndEvent_2\">\n                <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"737.0\" y=\"360.0\"/>\n                <bpmndi:BPMNLabel>\n                    <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"755.0\" y=\"401.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_3\" bpmnElement=\"SequenceFlow_3\" sourceElement=\"_BPMNShape_ExclusiveGateway_2\" targetElement=\"_BPMNShape_EndEvent_3\">\n                <di:waypoint xsi:type=\"dc:Point\" x=\"670.0\" y=\"323.0\"/>\n                <di:waypoint xsi:type=\"dc:Point\" x=\"703.0\" y=\"323.0\"/>\n                <di:waypoint xsi:type=\"dc:Point\" x=\"703.0\" y=\"378.0\"/>\n                <di:waypoint xsi:type=\"dc:Point\" x=\"737.0\" y=\"378.0\"/>\n                <bpmndi:BPMNLabel>\n                    <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"692.0\" y=\"323.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNEdge>\n        </bpmndi:BPMNPlane>\n    </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/draw/conditional-flow-typed-task.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_QDupoOW1EeOA4ZBD-ENnyQ\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:serviceTask id=\"ServiceTask_1\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:serviceTask>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"ServiceTask_1\" targetRef=\"EndEvent_1\">\n      <bpmn2:conditionExpression xsi:type=\"bpmn2:tFormalExpression\">FOO</bpmn2:conditionExpression>\n    </bpmn2:sequenceFlow>\n    <bpmn2:endEvent id=\"EndEvent_1\">\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n    </bpmn2:endEvent>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_ServiceTask_2\" bpmnElement=\"ServiceTask_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"48.0\" y=\"48.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_4\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"285.0\" y=\"69.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"303.0\" y=\"110.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_ServiceTask_2\" targetElement=\"_BPMNShape_EndEvent_4\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"148.0\" y=\"88.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"285.0\" y=\"87.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"0.0\" y=\"0.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/draw/conditional-flow.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n             xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n             xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\"\n             xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\"\n             xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n             expressionLanguage=\"http://www.w3.org/1999/XPath\"\n             typeLanguage=\"http://www.w3.org/2001/XMLSchema\"\n             xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n    <process id=\"sid-3c7531ae-118a-47d2-b063-f08277ec0883\" isClosed=\"false\" isExecutable=\"false\" processType=\"None\">\n        <task completionQuantity=\"1\" id=\"sid-D0D3D1AD-750F-498E-B7E3-A2069571F489\" isForCompensation=\"false\" name=\"A\" startQuantity=\"1\">\n            <outgoing>sid-3FA58AD7-6491-4C89-A636-42E47488D426</outgoing>\n            <outgoing>sid-82C30D2C-10BC-4035-8A14-B50298F120E9</outgoing>\n            <outgoing>sid-A35FA3B7-318C-49FE-8446-70B6EC8329A5</outgoing>\n        </task>\n        <task completionQuantity=\"1\" id=\"sid-FB6CC0EC-C019-4C8C-B860-318737AA947A\" isForCompensation=\"false\" name=\"B\" startQuantity=\"1\">\n            <incoming>sid-A35FA3B7-318C-49FE-8446-70B6EC8329A5</incoming>\n        </task>\n        <task completionQuantity=\"1\" id=\"sid-6BE2FF1B-51B7-441F-A2A8-72285810FDB1\" isForCompensation=\"false\" name=\"C\" startQuantity=\"1\">\n            <incoming>sid-3FA58AD7-6491-4C89-A636-42E47488D426</incoming>\n        </task>\n        <task completionQuantity=\"1\" id=\"sid-88D4DFBF-A30A-4A01-958F-81D460034146\" isForCompensation=\"false\" name=\"T1\" startQuantity=\"1\">\n            <incoming>sid-82C30D2C-10BC-4035-8A14-B50298F120E9</incoming>\n            <outgoing>sid-262FECFE-432B-42B6-AAF7-040A6B6D1880</outgoing>\n        </task>\n        <exclusiveGateway default=\"sid-314B00E4-B24D-485E-B645-5D692C5AD9DE\" gatewayDirection=\"Diverging\" id=\"sid-386727C5-9FC7-4C8A-B2BA-D491C9B440AC\">\n            <incoming>sid-262FECFE-432B-42B6-AAF7-040A6B6D1880</incoming>\n            <outgoing>sid-F35A9A61-6B46-4F0F-8885-FC17ED3D3CBB</outgoing>\n            <outgoing>sid-314B00E4-B24D-485E-B645-5D692C5AD9DE</outgoing>\n        </exclusiveGateway>\n        <task completionQuantity=\"1\" id=\"sid-F08DF3C0-AC64-4563-A5AE-E5E807602626\" isForCompensation=\"false\" name=\"T2.0\" startQuantity=\"1\">\n            <incoming>sid-314B00E4-B24D-485E-B645-5D692C5AD9DE</incoming>\n            <outgoing>sid-AF879D05-477F-45C5-A8CB-C3C5FC1F70E9</outgoing>\n        </task>\n        <task completionQuantity=\"1\" id=\"sid-5364BA85-ADC2-4300-AF86-A69A13A4EF4A\" isForCompensation=\"false\" name=\"T2.1\" startQuantity=\"1\">\n            <incoming>sid-F35A9A61-6B46-4F0F-8885-FC17ED3D3CBB</incoming>\n            <outgoing>sid-54D7C967-8E1B-4282-82C4-E3105B6AC0AC</outgoing>\n        </task>\n        <task completionQuantity=\"1\" id=\"sid-E6DFCF17-66AB-43B0-9DA7-E0A1DC1BD1BF\" isForCompensation=\"false\" name=\"T3.0\" startQuantity=\"1\">\n            <incoming>sid-AF879D05-477F-45C5-A8CB-C3C5FC1F70E9</incoming>\n            <incoming>sid-54D7C967-8E1B-4282-82C4-E3105B6AC0AC</incoming>\n            <outgoing>sid-3A48A6D4-00FD-453B-89CE-A453D68C2732</outgoing>\n        </task>\n        <task completionQuantity=\"1\" id=\"sid-1A80193A-728A-4C6D-9B6E-0C1A4E07F6F1\" isForCompensation=\"false\" name=\"T4.0\" startQuantity=\"1\">\n            <incoming>sid-52DA4A1B-A188-4866-AD39-ED24F6BDF9D0</incoming>\n            <outgoing>sid-19AA87BE-9229-4063-83A9-AC10C98C1D67</outgoing>\n        </task>\n        <task completionQuantity=\"1\" id=\"sid-5E8BF6D5-F8C5-47FD-9201-3A4D54103011\" isForCompensation=\"false\" name=\"T4.1\" startQuantity=\"1\">\n            <incoming>sid-AA6359EA-B251-41E9-8A80-5870C35203FB</incoming>\n            <outgoing>sid-05966EA5-FA89-4F41-B59E-BEF1F717B05F</outgoing>\n        </task>\n        <task completionQuantity=\"1\" id=\"sid-4D0F194A-4CE9-4F35-BDE8-A8CC26149238\" isForCompensation=\"false\" name=\"T4.2\" startQuantity=\"1\">\n            <incoming>sid-1C6223C2-572C-4B53-82B3-A7498A046B3E</incoming>\n            <outgoing>sid-DB9390D1-45D2-4A16-BEA3-D14D8715E057</outgoing>\n        </task>\n        <inclusiveGateway default=\"sid-52DA4A1B-A188-4866-AD39-ED24F6BDF9D0\" gatewayDirection=\"Diverging\" id=\"sid-6481D745-1F8A-43EE-BBF3-3F16E9312B6F\">\n            <incoming>sid-3A48A6D4-00FD-453B-89CE-A453D68C2732</incoming>\n            <outgoing>sid-52DA4A1B-A188-4866-AD39-ED24F6BDF9D0</outgoing>\n            <outgoing>sid-AA6359EA-B251-41E9-8A80-5870C35203FB</outgoing>\n            <outgoing>sid-1C6223C2-572C-4B53-82B3-A7498A046B3E</outgoing>\n        </inclusiveGateway>\n        <inclusiveGateway gatewayDirection=\"Converging\" id=\"sid-C4BFC4C1-CBCF-4FA2-8544-A17ED72D0279\">\n            <incoming>sid-19AA87BE-9229-4063-83A9-AC10C98C1D67</incoming>\n            <incoming>sid-05966EA5-FA89-4F41-B59E-BEF1F717B05F</incoming>\n            <incoming>sid-DB9390D1-45D2-4A16-BEA3-D14D8715E057</incoming>\n            <outgoing>sid-BBFAEEF1-BEFC-43DD-B045-4D7B662868A7</outgoing>\n        </inclusiveGateway>\n        <endEvent id=\"sid-674E5CB1-EC18-4574-8D3E-9C1ABC71673C\">\n            <incoming>sid-BBFAEEF1-BEFC-43DD-B045-4D7B662868A7</incoming>\n        </endEvent>\n        <sequenceFlow id=\"sid-3FA58AD7-6491-4C89-A636-42E47488D426\" isImmediate=\"true\" sourceRef=\"sid-D0D3D1AD-750F-498E-B7E3-A2069571F489\" targetRef=\"sid-6BE2FF1B-51B7-441F-A2A8-72285810FDB1\">\n            <conditionExpression id=\"sid-7d146f68-3b11-4326-b9a1-9608b43b69b9\" xsi:type=\"tFormalExpression\">#{selectedFlow=='A'}</conditionExpression>\n        </sequenceFlow>\n        <sequenceFlow id=\"sid-82C30D2C-10BC-4035-8A14-B50298F120E9\" isImmediate=\"true\" sourceRef=\"sid-D0D3D1AD-750F-498E-B7E3-A2069571F489\" targetRef=\"sid-88D4DFBF-A30A-4A01-958F-81D460034146\">\n        </sequenceFlow>\n        <sequenceFlow id=\"sid-A35FA3B7-318C-49FE-8446-70B6EC8329A5\" isImmediate=\"true\" sourceRef=\"sid-D0D3D1AD-750F-498E-B7E3-A2069571F489\" targetRef=\"sid-FB6CC0EC-C019-4C8C-B860-318737AA947A\">\n            <conditionExpression id=\"sid-b92c9a82-af18-49e6-aeb8-d7744fa2cc95\" xsi:type=\"tFormalExpression\">#{selectedFlow=='B'}</conditionExpression>\n        </sequenceFlow>\n        <sequenceFlow id=\"sid-262FECFE-432B-42B6-AAF7-040A6B6D1880\" sourceRef=\"sid-88D4DFBF-A30A-4A01-958F-81D460034146\" targetRef=\"sid-386727C5-9FC7-4C8A-B2BA-D491C9B440AC\" />\n        <sequenceFlow id=\"sid-F35A9A61-6B46-4F0F-8885-FC17ED3D3CBB\" sourceRef=\"sid-386727C5-9FC7-4C8A-B2BA-D491C9B440AC\" targetRef=\"sid-5364BA85-ADC2-4300-AF86-A69A13A4EF4A\" />\n        <sequenceFlow id=\"sid-314B00E4-B24D-485E-B645-5D692C5AD9DE\" sourceRef=\"sid-386727C5-9FC7-4C8A-B2BA-D491C9B440AC\" targetRef=\"sid-F08DF3C0-AC64-4563-A5AE-E5E807602626\" />\n        <sequenceFlow id=\"sid-AF879D05-477F-45C5-A8CB-C3C5FC1F70E9\" sourceRef=\"sid-F08DF3C0-AC64-4563-A5AE-E5E807602626\" targetRef=\"sid-E6DFCF17-66AB-43B0-9DA7-E0A1DC1BD1BF\" />\n        <sequenceFlow id=\"sid-54D7C967-8E1B-4282-82C4-E3105B6AC0AC\" sourceRef=\"sid-5364BA85-ADC2-4300-AF86-A69A13A4EF4A\" targetRef=\"sid-E6DFCF17-66AB-43B0-9DA7-E0A1DC1BD1BF\" />\n        <sequenceFlow id=\"sid-3A48A6D4-00FD-453B-89CE-A453D68C2732\" sourceRef=\"sid-E6DFCF17-66AB-43B0-9DA7-E0A1DC1BD1BF\" targetRef=\"sid-6481D745-1F8A-43EE-BBF3-3F16E9312B6F\" />\n        <sequenceFlow id=\"sid-52DA4A1B-A188-4866-AD39-ED24F6BDF9D0\" sourceRef=\"sid-6481D745-1F8A-43EE-BBF3-3F16E9312B6F\" targetRef=\"sid-1A80193A-728A-4C6D-9B6E-0C1A4E07F6F1\" />\n        <sequenceFlow id=\"sid-AA6359EA-B251-41E9-8A80-5870C35203FB\" sourceRef=\"sid-6481D745-1F8A-43EE-BBF3-3F16E9312B6F\" targetRef=\"sid-5E8BF6D5-F8C5-47FD-9201-3A4D54103011\" />\n        <sequenceFlow id=\"sid-1C6223C2-572C-4B53-82B3-A7498A046B3E\" sourceRef=\"sid-6481D745-1F8A-43EE-BBF3-3F16E9312B6F\" targetRef=\"sid-4D0F194A-4CE9-4F35-BDE8-A8CC26149238\" />\n        <sequenceFlow id=\"sid-19AA87BE-9229-4063-83A9-AC10C98C1D67\" sourceRef=\"sid-1A80193A-728A-4C6D-9B6E-0C1A4E07F6F1\" targetRef=\"sid-C4BFC4C1-CBCF-4FA2-8544-A17ED72D0279\" />\n        <sequenceFlow id=\"sid-05966EA5-FA89-4F41-B59E-BEF1F717B05F\" sourceRef=\"sid-5E8BF6D5-F8C5-47FD-9201-3A4D54103011\" targetRef=\"sid-C4BFC4C1-CBCF-4FA2-8544-A17ED72D0279\" />\n        <sequenceFlow id=\"sid-DB9390D1-45D2-4A16-BEA3-D14D8715E057\" sourceRef=\"sid-4D0F194A-4CE9-4F35-BDE8-A8CC26149238\" targetRef=\"sid-C4BFC4C1-CBCF-4FA2-8544-A17ED72D0279\" />\n        <sequenceFlow id=\"sid-BBFAEEF1-BEFC-43DD-B045-4D7B662868A7\" sourceRef=\"sid-C4BFC4C1-CBCF-4FA2-8544-A17ED72D0279\" targetRef=\"sid-674E5CB1-EC18-4574-8D3E-9C1ABC71673C\" />\n    </process>\n    <bpmndi:BPMNDiagram id=\"sid-6ec6a804-a73d-4fd4-92cc-c5c6e68ad655\">\n        <bpmndi:BPMNPlane bpmnElement=\"sid-3c7531ae-118a-47d2-b063-f08277ec0883\" id=\"sid-c9d74743-7b75-44e2-b5aa-18b330709533\">\n            <bpmndi:BPMNShape bpmnElement=\"sid-D0D3D1AD-750F-498E-B7E3-A2069571F489\" id=\"sid-D0D3D1AD-750F-498E-B7E3-A2069571F489_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"60.0\" y=\"225.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-5fcc1b17-d762-4d13-aaa9-b23d5d517d5d\">\n                    <omgdc:Bounds height=\"12.0\" width=\"8.571426391601562\" x=\"105.71428680419922\" y=\"257.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-FB6CC0EC-C019-4C8C-B860-318737AA947A\" id=\"sid-FB6CC0EC-C019-4C8C-B860-318737AA947A_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"270.0\" y=\"90.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-5fcc1b17-d762-4d13-aaa9-b23d5d517d5d\">\n                    <omgdc:Bounds height=\"12.0\" width=\"8.571426391601562\" x=\"315.7142868041992\" y=\"122.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-6BE2FF1B-51B7-441F-A2A8-72285810FDB1\" id=\"sid-6BE2FF1B-51B7-441F-A2A8-72285810FDB1_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"270.0\" y=\"375.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-5fcc1b17-d762-4d13-aaa9-b23d5d517d5d\">\n                    <omgdc:Bounds height=\"12.0\" width=\"8.571426391601562\" x=\"315.7142868041992\" y=\"407.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-88D4DFBF-A30A-4A01-958F-81D460034146\" id=\"sid-88D4DFBF-A30A-4A01-958F-81D460034146_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"270.0\" y=\"225.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-5fcc1b17-d762-4d13-aaa9-b23d5d517d5d\">\n                    <omgdc:Bounds height=\"12.0\" width=\"15.428573608398438\" x=\"312.2857131958008\" y=\"257.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-386727C5-9FC7-4C8A-B2BA-D491C9B440AC\" id=\"sid-386727C5-9FC7-4C8A-B2BA-D491C9B440AC_gui\" isMarkerVisible=\"true\">\n                <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"425.0\" y=\"245.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-F08DF3C0-AC64-4563-A5AE-E5E807602626\" id=\"sid-F08DF3C0-AC64-4563-A5AE-E5E807602626_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"510.0\" y=\"150.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-5fcc1b17-d762-4d13-aaa9-b23d5d517d5d\">\n                    <omgdc:Bounds height=\"12.0\" width=\"27.428573608398438\" x=\"546.2857131958008\" y=\"182.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-5364BA85-ADC2-4300-AF86-A69A13A4EF4A\" id=\"sid-5364BA85-ADC2-4300-AF86-A69A13A4EF4A_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"510.0\" y=\"290.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-5fcc1b17-d762-4d13-aaa9-b23d5d517d5d\">\n                    <omgdc:Bounds height=\"12.0\" width=\"27.428573608398438\" x=\"546.2857131958008\" y=\"322.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-E6DFCF17-66AB-43B0-9DA7-E0A1DC1BD1BF\" id=\"sid-E6DFCF17-66AB-43B0-9DA7-E0A1DC1BD1BF_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"675.0\" y=\"225.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-5fcc1b17-d762-4d13-aaa9-b23d5d517d5d\">\n                    <omgdc:Bounds height=\"12.0\" width=\"27.428573608398438\" x=\"711.2857131958008\" y=\"257.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-1A80193A-728A-4C6D-9B6E-0C1A4E07F6F1\" id=\"sid-1A80193A-728A-4C6D-9B6E-0C1A4E07F6F1_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"905.0\" y=\"100.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-5fcc1b17-d762-4d13-aaa9-b23d5d517d5d\">\n                    <omgdc:Bounds height=\"12.0\" width=\"27.428573608398438\" x=\"941.2857131958008\" y=\"132.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-5E8BF6D5-F8C5-47FD-9201-3A4D54103011\" id=\"sid-5E8BF6D5-F8C5-47FD-9201-3A4D54103011_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"905.0\" y=\"225.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-5fcc1b17-d762-4d13-aaa9-b23d5d517d5d\">\n                    <omgdc:Bounds height=\"12.0\" width=\"27.428573608398438\" x=\"941.2857131958008\" y=\"257.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-4D0F194A-4CE9-4F35-BDE8-A8CC26149238\" id=\"sid-4D0F194A-4CE9-4F35-BDE8-A8CC26149238_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"905.0\" y=\"350.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-5fcc1b17-d762-4d13-aaa9-b23d5d517d5d\">\n                    <omgdc:Bounds height=\"12.0\" width=\"27.428573608398438\" x=\"941.2857131958008\" y=\"382.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-6481D745-1F8A-43EE-BBF3-3F16E9312B6F\" id=\"sid-6481D745-1F8A-43EE-BBF3-3F16E9312B6F_gui\">\n                <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"820.0\" y=\"245.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-C4BFC4C1-CBCF-4FA2-8544-A17ED72D0279\" id=\"sid-C4BFC4C1-CBCF-4FA2-8544-A17ED72D0279_gui\">\n                <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"1070.0\" y=\"245.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-674E5CB1-EC18-4574-8D3E-9C1ABC71673C\" id=\"sid-674E5CB1-EC18-4574-8D3E-9C1ABC71673C_gui\">\n                <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"1175.0\" y=\"251.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-DB9390D1-45D2-4A16-BEA3-D14D8715E057\" id=\"sid-DB9390D1-45D2-4A16-BEA3-D14D8715E057_gui\">\n                <omgdi:waypoint x=\"1005.0\" y=\"390.0\"/>\n                <omgdi:waypoint x=\"1090.5\" y=\"390.0\"/>\n                <omgdi:waypoint x=\"1090.5\" y=\"285.0\"/>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-3FA58AD7-6491-4C89-A636-42E47488D426\" id=\"sid-3FA58AD7-6491-4C89-A636-42E47488D426_gui\">\n                <omgdi:waypoint x=\"110.0\" y=\"305.0\"/>\n                <omgdi:waypoint x=\"110.0\" y=\"415.0\"/>\n                <omgdi:waypoint x=\"270.0\" y=\"415.0\"/>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-82C30D2C-10BC-4035-8A14-B50298F120E9\" id=\"sid-82C30D2C-10BC-4035-8A14-B50298F120E9_gui\">\n                <omgdi:waypoint x=\"160.0\" y=\"265.0\"/>\n                <omgdi:waypoint x=\"270.0\" y=\"265.0\"/>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-1C6223C2-572C-4B53-82B3-A7498A046B3E\" id=\"sid-1C6223C2-572C-4B53-82B3-A7498A046B3E_gui\">\n                <omgdi:waypoint x=\"840.5\" y=\"285.0\"/>\n                <omgdi:waypoint x=\"840.5\" y=\"390.0\"/>\n                <omgdi:waypoint x=\"905.0\" y=\"390.0\"/>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-52DA4A1B-A188-4866-AD39-ED24F6BDF9D0\" id=\"sid-52DA4A1B-A188-4866-AD39-ED24F6BDF9D0_gui\">\n                <omgdi:waypoint x=\"840.5\" y=\"245.0\"/>\n                <omgdi:waypoint x=\"840.5\" y=\"140.0\"/>\n                <omgdi:waypoint x=\"905.0\" y=\"140.0\"/>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-262FECFE-432B-42B6-AAF7-040A6B6D1880\" id=\"sid-262FECFE-432B-42B6-AAF7-040A6B6D1880_gui\">\n                <omgdi:waypoint x=\"370.0\" y=\"265.199203187251\"/>\n                <omgdi:waypoint x=\"425.0\" y=\"265.4183266932271\"/>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-3A48A6D4-00FD-453B-89CE-A453D68C2732\" id=\"sid-3A48A6D4-00FD-453B-89CE-A453D68C2732_gui\">\n                <omgdi:waypoint x=\"775.0\" y=\"265.2164502164502\"/>\n                <omgdi:waypoint x=\"820.0\" y=\"265.4112554112554\"/>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-AF879D05-477F-45C5-A8CB-C3C5FC1F70E9\" id=\"sid-AF879D05-477F-45C5-A8CB-C3C5FC1F70E9_gui\">\n                <omgdi:waypoint x=\"610.0\" y=\"190.0\"/>\n                <omgdi:waypoint x=\"632.5\" y=\"190.0\"/>\n                <omgdi:waypoint x=\"632.5\" y=\"265.0\"/>\n                <omgdi:waypoint x=\"675.0\" y=\"265.0\"/>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-AA6359EA-B251-41E9-8A80-5870C35203FB\" id=\"sid-AA6359EA-B251-41E9-8A80-5870C35203FB_gui\">\n                <omgdi:waypoint x=\"860.0\" y=\"265.414847161572\"/>\n                <omgdi:waypoint x=\"905.0\" y=\"265.2183406113537\"/>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-314B00E4-B24D-485E-B645-5D692C5AD9DE\" id=\"sid-314B00E4-B24D-485E-B645-5D692C5AD9DE_gui\">\n                <omgdi:waypoint x=\"445.5\" y=\"245.0\"/>\n                <omgdi:waypoint x=\"445.5\" y=\"190.0\"/>\n                <omgdi:waypoint x=\"510.0\" y=\"190.0\"/>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-54D7C967-8E1B-4282-82C4-E3105B6AC0AC\" id=\"sid-54D7C967-8E1B-4282-82C4-E3105B6AC0AC_gui\">\n                <omgdi:waypoint x=\"610.0\" y=\"330.0\"/>\n                <omgdi:waypoint x=\"632.5\" y=\"330.0\"/>\n                <omgdi:waypoint x=\"632.5\" y=\"265.0\"/>\n                <omgdi:waypoint x=\"675.0\" y=\"265.0\"/>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-19AA87BE-9229-4063-83A9-AC10C98C1D67\" id=\"sid-19AA87BE-9229-4063-83A9-AC10C98C1D67_gui\">\n                <omgdi:waypoint x=\"1005.0\" y=\"140.0\"/>\n                <omgdi:waypoint x=\"1090.5\" y=\"140.0\"/>\n                <omgdi:waypoint x=\"1090.5\" y=\"245.0\"/>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-BBFAEEF1-BEFC-43DD-B045-4D7B662868A7\" id=\"sid-BBFAEEF1-BEFC-43DD-B045-4D7B662868A7_gui\">\n                <omgdi:waypoint x=\"1110.0\" y=\"265.4010152284264\"/>\n                <omgdi:waypoint x=\"1175.0\" y=\"265.07106598984774\"/>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-05966EA5-FA89-4F41-B59E-BEF1F717B05F\" id=\"sid-05966EA5-FA89-4F41-B59E-BEF1F717B05F_gui\">\n                <omgdi:waypoint x=\"1005.0\" y=\"265.1845018450185\"/>\n                <omgdi:waypoint x=\"1070.0\" y=\"265.42435424354244\"/>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-F35A9A61-6B46-4F0F-8885-FC17ED3D3CBB\" id=\"sid-F35A9A61-6B46-4F0F-8885-FC17ED3D3CBB_gui\">\n                <omgdi:waypoint x=\"445.5\" y=\"285.0\"/>\n                <omgdi:waypoint x=\"445.5\" y=\"330.0\"/>\n                <omgdi:waypoint x=\"510.0\" y=\"330.0\"/>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-A35FA3B7-318C-49FE-8446-70B6EC8329A5\" id=\"sid-A35FA3B7-318C-49FE-8446-70B6EC8329A5_gui\">\n                <omgdi:waypoint x=\"110.0\" y=\"225.0\"/>\n                <omgdi:waypoint x=\"110.0\" y=\"130.0\"/>\n                <omgdi:waypoint x=\"270.0\" y=\"130.0\"/>\n            </bpmndi:BPMNEdge>\n        </bpmndi:BPMNPlane>\n        <bpmndi:BPMNLabelStyle id=\"sid-5fcc1b17-d762-4d13-aaa9-b23d5d517d5d\">\n            <omgdc:Font isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\" name=\"Arial\" size=\"12.0\"/>\n        </bpmndi:BPMNLabelStyle>\n    </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/data-objects.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:signavio=\"http://www.signavio.com\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"sid-c3c12b6b-ce2f-456c-b55a-3ce4f22db48b\" exporter=\"Signavio Process Editor, http://www.signavio.com\" exporterVersion=\"7.8.1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <dataStore id=\"sid-09f814b1-f9a1-45c7-8ce0-65a0ab69fddc\" isUnlimited=\"false\" name=\"Data Store 2\"/>\n  <dataStore id=\"sid-770aebf4-15fc-4ade-919f-d9558181997b\" isUnlimited=\"false\" name=\"Data Store\"/>\n  <collaboration id=\"sid-efcaf392-1a95-40dc-be12-8a12c80ec1e5\">\n    <extensionElements>\n      <signavio:signavioDiagramMetaData metaKey=\"revisionid\" metaValue=\"e6626eeb5b644dc5b053dbbab17bed34\"/>\n    </extensionElements>\n    <participant id=\"_Participant_4\" name=\"Pool\" processRef=\"Process_1\">\n      <extensionElements>\n        <signavio:signavioMetaData metaKey=\"rolle\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n      </extensionElements>\n    </participant>\n    <participant id=\"Participant_1\" name=\"Pool\">\n      <extensionElements>\n        <signavio:signavioMetaData metaKey=\"rolle\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n      </extensionElements>\n    </participant>\n  </collaboration>\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <ioSpecification id=\"sid-f47d8b56-ccb9-463e-97e1-d63887eab92c\">\n      <dataInput id=\"DataInput_1\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffff\"/>\n          <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n          <signavio:signavioLabel align=\"left\" ref=\"text_name\" valign=\"top\" x=\"18.0\" y=\"55.0\"/>\n        </extensionElements>\n      </dataInput>\n      <dataInput id=\"sid-ADF95ACC-DEA6-4F6F-AF91-8F5BABB299AF\" isCollection=\"true\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffff\"/>\n          <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n        </extensionElements>\n      </dataInput>\n      <dataOutput id=\"DataOutput_1\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffff\"/>\n          <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n          <signavio:signavioLabel align=\"left\" ref=\"text_name\" valign=\"top\" x=\"18.0\" y=\"55.0\"/>\n        </extensionElements>\n      </dataOutput>\n      <dataOutput id=\"sid-16646BD1-38D3-499A-95A6-42A75D8D2510\" isCollection=\"true\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffff\"/>\n          <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n        </extensionElements>\n      </dataOutput>\n      <inputSet id=\"sid-8c0a0c80-098c-4972-bac0-8cc303d82bfd\">\n        <dataInputRefs>DataInput_1</dataInputRefs>\n        <dataInputRefs>sid-ADF95ACC-DEA6-4F6F-AF91-8F5BABB299AF</dataInputRefs>\n      </inputSet>\n      <outputSet id=\"sid-60cf6782-0fff-4304-882d-7d2b33336aed\">\n        <dataOutputRefs>DataOutput_1</dataOutputRefs>\n        <dataOutputRefs>sid-16646BD1-38D3-499A-95A6-42A75D8D2510</dataOutputRefs>\n      </outputSet>\n    </ioSpecification>\n    <dataObject id=\"sid-b71dc346-6ba3-481d-9ea6-03c3fe207b3f\" name=\"Data Object\"/>\n    <dataObject id=\"sid-01513038-3f29-47f0-b464-9047955bf45d\" isCollection=\"true\"/>\n    <task id=\"Task_1\">\n      <extensionElements>\n        <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffcc\"/>\n        <signavio:signavioMetaData metaKey=\"adaptereventtype\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"documentationlink\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"test\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"adaptertype\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"adapterconfiguration\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"adapterclassname\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"servicereferenz\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"risiko\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"erteiltfreigabe\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"riskandcontrols\" metaValue=\"\"/>\n      </extensionElements>\n      <ioSpecification id=\"sid-25be8f24-f1fe-4fcb-a120-6b46fbd41d43\">\n        <dataInput id=\"sid-b4a08214-9dd4-40ad-8f82-4620ee384231\"/>\n        <dataOutput id=\"sid-b4a589fa-6809-485d-ac79-9906084551f5\"/>\n        <dataOutput id=\"sid-d5968987-50e5-4e42-9a3e-e8e3f6cc53bc\"/>\n        <inputSet id=\"sid-bff296e6-46b4-4c63-9def-f68cdf80510d\" name=\"DefaultInputSet\">\n          <dataInputRefs>sid-b4a08214-9dd4-40ad-8f82-4620ee384231</dataInputRefs>\n          <outputSetRefs>sid-6c061a84-a3f2-4b69-93a5-8a3cafa27437</outputSetRefs>\n          <outputSetRefs>sid-6c061a84-a3f2-4b69-93a5-8a3cafa27437</outputSetRefs>\n        </inputSet>\n        <outputSet id=\"sid-6c061a84-a3f2-4b69-93a5-8a3cafa27437\" name=\"DefaultOutputSet\">\n          <dataOutputRefs>sid-b4a589fa-6809-485d-ac79-9906084551f5</dataOutputRefs>\n          <dataOutputRefs>sid-d5968987-50e5-4e42-9a3e-e8e3f6cc53bc</dataOutputRefs>\n          <inputSetRefs>sid-bff296e6-46b4-4c63-9def-f68cdf80510d</inputSetRefs>\n          <inputSetRefs>sid-bff296e6-46b4-4c63-9def-f68cdf80510d</inputSetRefs>\n        </outputSet>\n      </ioSpecification>\n      <dataInputAssociation id=\"DataInputAssociation_3\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n        </extensionElements>\n        <sourceRef>DataObjectReference_1</sourceRef>\n        <targetRef>sid-b4a08214-9dd4-40ad-8f82-4620ee384231</targetRef>\n      </dataInputAssociation>\n      <dataInputAssociation id=\"DataInputAssociation_2\">\n        <sourceRef>sid-ADF95ACC-DEA6-4F6F-AF91-8F5BABB299AF</sourceRef>\n      </dataInputAssociation>\n      <dataOutputAssociation id=\"DataOutputAssociation_1\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n        </extensionElements>\n        <targetRef>_DataStoreReference_2</targetRef>\n      </dataOutputAssociation>\n      <dataOutputAssociation id=\"DataOutputAssociation_2\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n        </extensionElements>\n        <sourceRef>sid-b4a589fa-6809-485d-ac79-9906084551f5</sourceRef>\n        <targetRef>DataOutput_1</targetRef>\n      </dataOutputAssociation>\n      <dataOutputAssociation id=\"DataOutputAssociation_3\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n        </extensionElements>\n        <sourceRef>sid-d5968987-50e5-4e42-9a3e-e8e3f6cc53bc</sourceRef>\n        <targetRef>DataObjectReference_1</targetRef>\n      </dataOutputAssociation>\n      <dataOutputAssociation id=\"DataOutputAssociation_5\">\n        <targetRef>sid-16646BD1-38D3-499A-95A6-42A75D8D2510</targetRef>\n      </dataOutputAssociation>\n    </task>\n    <task id=\"Task_2\">\n      <extensionElements>\n        <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffcc\"/>\n        <signavio:signavioMetaData metaKey=\"adaptereventtype\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"documentationlink\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"test\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"adaptertype\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"adapterconfiguration\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"adapterclassname\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"servicereferenz\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"risiko\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"erteiltfreigabe\" metaValue=\"\"/>\n        <signavio:signavioMetaData metaKey=\"riskandcontrols\" metaValue=\"\"/>\n      </extensionElements>\n      <dataInputAssociation id=\"DataInputAssociation_1\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n        </extensionElements>\n        <sourceRef>_DataStoreReference_2</sourceRef>\n      </dataInputAssociation>\n    </task>\n    <dataObjectReference id=\"DataObjectReference_1\" name=\"Data Object\" dataObjectRef=\"sid-b71dc346-6ba3-481d-9ea6-03c3fe207b3f\">\n      <extensionElements>\n        <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffff\"/>\n        <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n        <signavio:signavioLabel align=\"left\" ref=\"text_name\" valign=\"top\" x=\"-19.0\" y=\"55.0\"/>\n      </extensionElements>\n    </dataObjectReference>\n    <dataStoreReference id=\"_DataStoreReference_2\" name=\"Data Store\" dataStoreRef=\"sid-770aebf4-15fc-4ade-919f-d9558181997b\">\n      <extensionElements>\n        <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffff\"/>\n        <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n        <signavio:signavioLabel align=\"left\" ref=\"text_name\" x=\"-2.499500000000012\" y=\"60.5865\"/>\n      </extensionElements>\n    </dataStoreReference>\n    <dataStoreReference id=\"_DataStoreReference_3\" name=\"Data Store 2\" dataStoreRef=\"sid-09f814b1-f9a1-45c7-8ce0-65a0ab69fddc\">\n      <extensionElements>\n        <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffff\"/>\n        <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n        <signavio:signavioLabel align=\"left\" ref=\"text_name\" x=\"-7.499500000000012\" y=\"60.5865\"/>\n      </extensionElements>\n    </dataStoreReference>\n    <dataObjectReference id=\"sid-0B5F3253-68A7-4985-9E5F-EAA734C583B5\" dataObjectRef=\"sid-01513038-3f29-47f0-b464-9047955bf45d\">\n      <extensionElements>\n        <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffff\"/>\n        <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n      </extensionElements>\n    </dataObjectReference>\n  </process>\n  <bpmndi:BPMNDiagram id=\"sid-2afc2606-c2da-428e-a6df-1d046a82ed57\">\n    <bpmndi:BPMNPlane id=\"sid-646a8f8e-d900-4b7d-8b7f-48364e1f53ce\" bpmnElement=\"sid-efcaf392-1a95-40dc-be12-8a12c80ec1e5\">\n      <bpmndi:BPMNShape id=\"_Participant_4_gui\" bpmnElement=\"_Participant_4\" isHorizontal=\"true\">\n        <omgdc:Bounds height=\"277.0\" width=\"529.0\" x=\"132.0\" y=\"60.0\"/>\n        <bpmndi:BPMNLabel labelStyle=\"sid-80896269-9188-4a42-8603-3ff45af4c1f8\">\n          <omgdc:Bounds height=\"24.857143\" width=\"12.0\" x=\"138.0\" y=\"186.07143\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_1_gui\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <omgdc:Bounds height=\"165.0\" width=\"600.0\" x=\"888.0\" y=\"28.0\"/>\n        <bpmndi:BPMNLabel labelStyle=\"sid-80896269-9188-4a42-8603-3ff45af4c1f8\">\n          <omgdc:Bounds height=\"24.857143\" width=\"12.0\" x=\"894.0\" y=\"98.07143\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_gui\" bpmnElement=\"Task_1\">\n        <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"516.0\" y=\"216.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_2_gui\" bpmnElement=\"Task_2\">\n        <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"1029.0\" y=\"68.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_1_gui\" bpmnElement=\"DataObjectReference_1\">\n        <omgdc:Bounds height=\"50.0\" width=\"36.0\" x=\"396.0\" y=\"231.0\"/>\n        <bpmndi:BPMNLabel labelStyle=\"sid-80896269-9188-4a42-8603-3ff45af4c1f8\">\n          <omgdc:Bounds height=\"36.0\" width=\"34.285713\" x=\"377.0\" y=\"286.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_DataStoreReference_2_gui\" bpmnElement=\"_DataStoreReference_2\">\n        <omgdc:Bounds height=\"60.173\" width=\"62.001\" x=\"755.4995\" y=\"66.4135\"/>\n        <bpmndi:BPMNLabel labelStyle=\"sid-80896269-9188-4a42-8603-3ff45af4c1f8\">\n          <omgdc:Bounds height=\"12.0\" width=\"66.0\" x=\"752.9995\" y=\"126.9995\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_DataStoreReference_3_gui\" bpmnElement=\"_DataStoreReference_3\">\n        <omgdc:Bounds height=\"60.173\" width=\"62.001\" x=\"202.4995\" y=\"72.4135\"/>\n        <bpmndi:BPMNLabel labelStyle=\"sid-80896269-9188-4a42-8603-3ff45af4c1f8\">\n          <omgdc:Bounds height=\"12.0\" width=\"78.0\" x=\"194.9995\" y=\"132.9995\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-0B5F3253-68A7-4985-9E5F-EAA734C583B5_gui\" bpmnElement=\"sid-0B5F3253-68A7-4985-9E5F-EAA734C583B5\">\n        <omgdc:Bounds height=\"97.0\" width=\"88.0\" x=\"263.0\" y=\"382.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataInput_1_gui\" bpmnElement=\"DataInput_1\">\n        <omgdc:Bounds height=\"50.0\" width=\"36.0\" x=\"355.0\" y=\"84.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-ADF95ACC-DEA6-4F6F-AF91-8F5BABB299AF_gui\" bpmnElement=\"sid-ADF95ACC-DEA6-4F6F-AF91-8F5BABB299AF\">\n        <omgdc:Bounds height=\"97.0\" width=\"88.0\" x=\"420.0\" y=\"382.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataOutput_1_gui\" bpmnElement=\"DataOutput_1\">\n        <omgdc:Bounds height=\"50.0\" width=\"36.0\" x=\"480.0\" y=\"84.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-16646BD1-38D3-499A-95A6-42A75D8D2510_gui\" bpmnElement=\"sid-16646BD1-38D3-499A-95A6-42A75D8D2510\">\n        <omgdc:Bounds height=\"97.0\" width=\"88.0\" x=\"624.0\" y=\"382.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_3_gui\" bpmnElement=\"DataInputAssociation_3\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"432.0\" y=\"244.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"478.0\" y=\"215.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"516.0\" y=\"233.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_1_gui\" bpmnElement=\"DataInputAssociation_1\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"817.5005\" y=\"97.714455\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"1029.0\" y=\"106.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_1_gui\" bpmnElement=\"DataOutputAssociation_1\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"616.0\" y=\"220.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"755.4995\" y=\"118.95491\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_2_gui\" bpmnElement=\"DataOutputAssociation_2\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"547.0\" y=\"216.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"510.0\" y=\"134.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_3_gui\" bpmnElement=\"DataOutputAssociation_3\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"516.0\" y=\"277.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"471.0\" y=\"296.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"432.0\" y=\"269.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_DataOutputAssociation_2\" bpmnElement=\"DataOutputAssociation_5\" sourceElement=\"Task_1_gui\" targetElement=\"sid-16646BD1-38D3-499A-95A6-42A75D8D2510_gui\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"572.0\" y=\"296.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"581.0\" y=\"361.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"624.0\" y=\"395.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_DataInputAssociation_1\" bpmnElement=\"DataInputAssociation_2\" sourceElement=\"sid-ADF95ACC-DEA6-4F6F-AF91-8F5BABB299AF_gui\" targetElement=\"Task_1_gui\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"508.0\" y=\"397.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"557.0\" y=\"360.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"563.0\" y=\"296.0\"/>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-80896269-9188-4a42-8603-3ff45af4c1f8\">\n      <omgdc:Font name=\"Arial\" size=\"12.0\"/>\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n</definitions>"
  },
  {
    "path": "test/fixtures/bpmn/draw/event-subprocess-icons.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:zeebe=\"http://camunda.org/schema/zeebe/1.0\" xmlns:bioc=\"http://bpmn.io/schema/bpmn/biocolor/1.0\" xmlns:color=\"http://www.omg.org/spec/BPMN/non-normative/color/1.0\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_078jjxu\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.32.0\" modeler:executionPlatform=\"Camunda Cloud\" modeler:executionPlatformVersion=\"8.3.0\">\n  <bpmn:process id=\"Process_0xjmw8h\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"EmptyEventSubprocess_1\" name=\"Empty\" triggeredByEvent=\"true\" />\n    <bpmn:subProcess id=\"MessageEventSubprocess_1\" name=\"Message\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_01\">\n        <bpmn:incoming>Flow_01</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:sequenceFlow id=\"Flow_01\" sourceRef=\"StartEvent_01\" targetRef=\"EndEvent_01\" />\n      <bpmn:startEvent id=\"StartEvent_01\">\n        <bpmn:outgoing>Flow_01</bpmn:outgoing>\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_0ac908l\" messageRef=\"Message_29lp64i\" />\n      </bpmn:startEvent>\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"TimerEventSubprocess_1\" name=\"Timer\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_02\">\n        <bpmn:incoming>Flow_02</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:sequenceFlow id=\"Flow_02\" sourceRef=\"StartEvent_02\" targetRef=\"EndEvent_02\" />\n      <bpmn:startEvent id=\"StartEvent_02\">\n        <bpmn:outgoing>Flow_02</bpmn:outgoing>\n        <bpmn:timerEventDefinition id=\"TimerEventDefinition_01rfbnh\">\n          <bpmn:timeDuration xsi:type=\"bpmn:tFormalExpression\">PT30S</bpmn:timeDuration>\n        </bpmn:timerEventDefinition>\n      </bpmn:startEvent>\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"ConditionalEventSubprocess_1\" name=\"Conditional\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_03\">\n        <bpmn:incoming>Flow_03</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:sequenceFlow id=\"Flow_03\" sourceRef=\"StartEvent_03\" targetRef=\"EndEvent_03\" />\n      <bpmn:startEvent id=\"StartEvent_03\">\n        <bpmn:outgoing>Flow_03</bpmn:outgoing>\n        <bpmn:conditionalEventDefinition id=\"ConditionalEventDefinition_1nu82qy\">\n          <bpmn:condition xsi:type=\"bpmn:tFormalExpression\" />\n        </bpmn:conditionalEventDefinition>\n      </bpmn:startEvent>\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"SignalEventSubprocess_1\" name=\"Signal\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_04\">\n        <bpmn:incoming>Flow_04</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:sequenceFlow id=\"Flow_04\" sourceRef=\"StartEvent_04\" targetRef=\"EndEvent_04\" />\n      <bpmn:startEvent id=\"StartEvent_04\">\n        <bpmn:outgoing>Flow_04</bpmn:outgoing>\n        <bpmn:signalEventDefinition id=\"SignalEventDefinition_1lwnii4\" signalRef=\"Signal_0hep2se\" />\n      </bpmn:startEvent>\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"EscalationEventSubprocess_1\" name=\"Escalation\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_05\">\n        <bpmn:incoming>Flow_05</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:sequenceFlow id=\"Flow_05\" sourceRef=\"StartEvent_05\" targetRef=\"EndEvent_05\" />\n      <bpmn:startEvent id=\"StartEvent_05\">\n        <bpmn:outgoing>Flow_05</bpmn:outgoing>\n        <bpmn:escalationEventDefinition id=\"EscalationEventDefinition_1fy1cw9\" escalationRef=\"Escalation_3hkjg83\" />\n      </bpmn:startEvent>\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"ErrorEventSubprocess_1\" name=\"Error\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_06\">\n        <bpmn:incoming>Flow_06</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:sequenceFlow id=\"Flow_06\" sourceRef=\"StartEvent_06\" targetRef=\"EndEvent_06\" />\n      <bpmn:startEvent id=\"StartEvent_06\">\n        <bpmn:outgoing>Flow_06</bpmn:outgoing>\n        <bpmn:errorEventDefinition id=\"ErrorEventDefinition_1pwap7i\" />\n      </bpmn:startEvent>\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"CompensateEventSubprocess_1\" name=\"Compensate\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_07\">\n        <bpmn:incoming>Flow_07</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:sequenceFlow id=\"Flow_07\" sourceRef=\"StartEvent_07\" targetRef=\"EndEvent_07\" />\n      <bpmn:startEvent id=\"StartEvent_07\">\n        <bpmn:outgoing>Flow_07</bpmn:outgoing>\n        <bpmn:compensateEventDefinition id=\"CompensateEventDefinition_1tldbzy\" />\n      </bpmn:startEvent>\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"MultipleEventSubprocess_1\" name=\"Multiple\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_08\">\n        <bpmn:incoming>Flow_08</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:sequenceFlow id=\"Flow_08\" sourceRef=\"StartEvent_08\" targetRef=\"EndEvent_08\" />\n      <bpmn:startEvent id=\"StartEvent_08\">\n        <bpmn:outgoing>Flow_08</bpmn:outgoing>\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_0tz0p6p\" messageRef=\"Message_362sps0\" />\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_14rdhs1-A\" messageRef=\"Message_2l12mbt\" />\n      </bpmn:startEvent>\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"ParallelEventSubprocess_1\" name=\"Parallel\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_09\">\n        <bpmn:incoming>Flow_09</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:sequenceFlow id=\"Flow_09\" sourceRef=\"StartEvent_09\" targetRef=\"EndEvent_09\" />\n      <bpmn:startEvent id=\"StartEvent_09\" parallelMultiple=\"true\">\n        <bpmn:outgoing>Flow_09</bpmn:outgoing>\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_14rdhs1\" messageRef=\"Message_2l12mbt\" />\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_0tz0p6p-A\" messageRef=\"Message_362sps0\" />\n      </bpmn:startEvent>\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"EmptyEventSubprocess_2\" name=\"Empty\" triggeredByEvent=\"true\" />\n    <bpmn:subProcess id=\"MessageEventSubprocess_2\" name=\"Message\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_11\">\n        <bpmn:incoming>Flow_11</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_11\">\n        <bpmn:outgoing>Flow_11</bpmn:outgoing>\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_0m14bsv\" messageRef=\"Message_29lp64i\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_11\" sourceRef=\"StartEvent_11\" targetRef=\"EndEvent_11\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"TimerEventSubprocess_2\" name=\"Timer\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_12\">\n        <bpmn:incoming>Flow_12</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_12\">\n        <bpmn:outgoing>Flow_12</bpmn:outgoing>\n        <bpmn:timerEventDefinition id=\"TimerEventDefinition_1ifp4eu\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_12\" sourceRef=\"StartEvent_12\" targetRef=\"EndEvent_12\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"ConditionalEventSubprocess_2\" name=\"Conditional\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_13\">\n        <bpmn:incoming>Flow_13</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_13\">\n        <bpmn:outgoing>Flow_13</bpmn:outgoing>\n        <bpmn:conditionalEventDefinition id=\"ConditionalEventDefinition_02m3fte\">\n          <bpmn:condition xsi:type=\"bpmn:tFormalExpression\" />\n        </bpmn:conditionalEventDefinition>\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_13\" sourceRef=\"StartEvent_13\" targetRef=\"EndEvent_13\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"SignalEventSubprocess_2\" name=\"Signal\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_14\">\n        <bpmn:incoming>Flow_14</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_14\">\n        <bpmn:outgoing>Flow_14</bpmn:outgoing>\n        <bpmn:signalEventDefinition id=\"SignalEventDefinition_0vos3ec\" signalRef=\"Signal_0hep2se\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_14\" sourceRef=\"StartEvent_14\" targetRef=\"EndEvent_14\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"EscalationEventSubprocess_2\" name=\"Escalation\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_15\">\n        <bpmn:incoming>Flow_15</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_15\">\n        <bpmn:outgoing>Flow_15</bpmn:outgoing>\n        <bpmn:escalationEventDefinition id=\"EscalationEventDefinition_0boh29i\" escalationRef=\"Escalation_3hkjg83\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_15\" sourceRef=\"StartEvent_15\" targetRef=\"EndEvent_15\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"ErrorEventSubprocess_2\" name=\"Error\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"StartEvent_16\">\n        <bpmn:incoming>Flow_16</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_03pa4sf\">\n        <bpmn:outgoing>Flow_16</bpmn:outgoing>\n        <bpmn:errorEventDefinition id=\"ErrorEventDefinition_0ol28hl\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_16\" sourceRef=\"StartEvent_03pa4sf\" targetRef=\"StartEvent_16\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"CompensateEventSubprocess_2\" name=\"Compensate\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_17\">\n        <bpmn:incoming>Flow_17</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_17\">\n        <bpmn:outgoing>Flow_17</bpmn:outgoing>\n        <bpmn:compensateEventDefinition id=\"CompensateEventDefinition_0dmp2i6\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_17\" sourceRef=\"StartEvent_17\" targetRef=\"EndEvent_17\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"MultipleEventSubprocess_2\" name=\"Multiple\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_18\">\n        <bpmn:incoming>Flow_18</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_0bj9g61\">\n        <bpmn:outgoing>Flow_18</bpmn:outgoing>\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_007w4n6\" messageRef=\"Message_362sps0\" />\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_12mvrbw\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_18\" sourceRef=\"StartEvent_0bj9g61\" targetRef=\"EndEvent_18\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"ParallelEventSubprocess_2\" name=\"Parallel\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_19\">\n        <bpmn:incoming>Flow_19</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_19\" parallelMultiple=\"true\">\n        <bpmn:outgoing>Flow_19</bpmn:outgoing>\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_1lf6aie\" messageRef=\"Message_2l12mbt\" />\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_1sry3re\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_19\" sourceRef=\"StartEvent_19\" targetRef=\"EndEvent_19\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"MessageEventSubprocess_3\" name=\"Message\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_31\">\n        <bpmn:incoming>Flow_31</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_31\" isInterrupting=\"false\">\n        <bpmn:outgoing>Flow_31</bpmn:outgoing>\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_1u1314g\" messageRef=\"Message_29lp64i\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_31\" sourceRef=\"StartEvent_31\" targetRef=\"EndEvent_31\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"TimerEventSubprocess_3\" name=\"Timer\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_32\">\n        <bpmn:incoming>Flow_32</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_32\" isInterrupting=\"false\">\n        <bpmn:outgoing>Flow_32</bpmn:outgoing>\n        <bpmn:timerEventDefinition id=\"TimerEventDefinition_1jlw9l5\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_32\" sourceRef=\"StartEvent_32\" targetRef=\"EndEvent_32\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"ConditionalEventSubprocess_3\" name=\"Conditional\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_33\">\n        <bpmn:incoming>Flow_33</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_33\" isInterrupting=\"false\">\n        <bpmn:outgoing>Flow_33</bpmn:outgoing>\n        <bpmn:conditionalEventDefinition id=\"ConditionalEventDefinition_1fopagy\">\n          <bpmn:condition xsi:type=\"bpmn:tFormalExpression\" />\n        </bpmn:conditionalEventDefinition>\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_33\" sourceRef=\"StartEvent_33\" targetRef=\"EndEvent_33\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"SignalEventSubprocess_3\" name=\"Signal\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_34\">\n        <bpmn:incoming>Flow_34</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_34\" isInterrupting=\"false\">\n        <bpmn:outgoing>Flow_34</bpmn:outgoing>\n        <bpmn:signalEventDefinition id=\"SignalEventDefinition_11qvvj4\" signalRef=\"Signal_0hep2se\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_34\" sourceRef=\"StartEvent_34\" targetRef=\"EndEvent_34\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"EscalationEventSubprocess_3\" name=\"Escalation\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_35\">\n        <bpmn:incoming>Flow_35</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_35\" isInterrupting=\"false\">\n        <bpmn:outgoing>Flow_35</bpmn:outgoing>\n        <bpmn:escalationEventDefinition id=\"EscalationEventDefinition_09phx5i\" escalationRef=\"Escalation_3hkjg83\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_35\" sourceRef=\"StartEvent_35\" targetRef=\"EndEvent_35\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"MultipleEventSubprocess_3\" name=\"Multiple\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_38\">\n        <bpmn:incoming>Flow_38</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_38\" isInterrupting=\"false\">\n        <bpmn:outgoing>Flow_38</bpmn:outgoing>\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_1797tr7\" messageRef=\"Message_362sps0\" />\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_18ze9w6\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_38\" sourceRef=\"StartEvent_38\" targetRef=\"EndEvent_38\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"ParallelEventSubprocess_3\" name=\"Parallel\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_39\">\n        <bpmn:incoming>Flow_39</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_39\" parallelMultiple=\"true\" isInterrupting=\"false\">\n        <bpmn:outgoing>Flow_39</bpmn:outgoing>\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_109r69y\" messageRef=\"Message_2l12mbt\" />\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_03jeso5\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_39\" sourceRef=\"StartEvent_39\" targetRef=\"EndEvent_39\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"MessageEventSubprocess_4\" name=\"Message\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_41\">\n        <bpmn:incoming>Flow_41</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_41\" isInterrupting=\"false\">\n        <bpmn:outgoing>Flow_41</bpmn:outgoing>\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_1c78qdn\" messageRef=\"Message_29lp64i\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_41\" sourceRef=\"StartEvent_41\" targetRef=\"EndEvent_41\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"TimerEventSubprocess_4\" name=\"Timer\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_42\">\n        <bpmn:incoming>Flow_42</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_42\" isInterrupting=\"false\">\n        <bpmn:outgoing>Flow_42</bpmn:outgoing>\n        <bpmn:timerEventDefinition id=\"TimerEventDefinition_0hrbp0m\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_42\" sourceRef=\"StartEvent_42\" targetRef=\"EndEvent_42\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"ConditionalEventSubprocess_4\" name=\"Conditional\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_43\">\n        <bpmn:incoming>Flow_43</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_0putbmu\" isInterrupting=\"false\">\n        <bpmn:outgoing>Flow_43</bpmn:outgoing>\n        <bpmn:conditionalEventDefinition id=\"ConditionalEventDefinition_1mt7ov6\">\n          <bpmn:condition xsi:type=\"bpmn:tFormalExpression\" />\n        </bpmn:conditionalEventDefinition>\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_43\" sourceRef=\"StartEvent_0putbmu\" targetRef=\"EndEvent_43\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"SignalEventSubprocess_4\" name=\"Signal\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_44\">\n        <bpmn:incoming>Flow_44</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_44\" isInterrupting=\"false\">\n        <bpmn:outgoing>Flow_44</bpmn:outgoing>\n        <bpmn:signalEventDefinition id=\"SignalEventDefinition_1vh2wet\" signalRef=\"Signal_0hep2se\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_44\" sourceRef=\"StartEvent_44\" targetRef=\"EndEvent_44\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"EscalationEventSubprocess_4\" name=\"Escalation\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_45\">\n        <bpmn:incoming>Flow_45</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_45\" isInterrupting=\"false\">\n        <bpmn:outgoing>Flow_45</bpmn:outgoing>\n        <bpmn:escalationEventDefinition id=\"EscalationEventDefinition_0t8a587\" escalationRef=\"Escalation_3hkjg83\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_45\" sourceRef=\"StartEvent_45\" targetRef=\"EndEvent_45\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"MultipleEventSubprocess_4\" name=\"Multiple\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_48\">\n        <bpmn:incoming>Flow_48</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_48\" isInterrupting=\"false\">\n        <bpmn:outgoing>Flow_48</bpmn:outgoing>\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_0biiba6\" messageRef=\"Message_362sps0\" />\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_0tb2lhz\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_48\" sourceRef=\"StartEvent_48\" targetRef=\"EndEvent_48\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"ParallelEventSubprocess_4\" name=\"Parallel\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"EndEvent_49\">\n        <bpmn:incoming>Flow_49</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:startEvent id=\"StartEvent_49\" parallelMultiple=\"true\" isInterrupting=\"false\">\n        <bpmn:outgoing>Flow_49</bpmn:outgoing>\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_1q2h7pd\" messageRef=\"Message_2l12mbt\" />\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_0fyepe2\" />\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_49\" sourceRef=\"StartEvent_49\" targetRef=\"EndEvent_49\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmn:message id=\"Message_29lp64i\" name=\"Message_29lp64i\">\n    <bpmn:extensionElements>\n      <zeebe:subscription correlationKey=\"=123\" />\n    </bpmn:extensionElements>\n  </bpmn:message>\n  <bpmn:signal id=\"Signal_0hep2se\" name=\"Signal_0hep2se\" />\n  <bpmn:escalation id=\"Escalation_3hkjg83\" name=\"Escalation_3hkjg83\" escalationCode=\"456\" />\n  <bpmn:message id=\"Message_362sps0\" name=\"Message_362sps0\">\n    <bpmn:extensionElements>\n      <zeebe:subscription correlationKey=\"=231\" />\n    </bpmn:extensionElements>\n  </bpmn:message>\n  <bpmn:message id=\"Message_2l12mbt\" name=\"Message_2l12mbt\">\n    <bpmn:extensionElements>\n      <zeebe:subscription correlationKey=\"=312\" />\n    </bpmn:extensionElements>\n  </bpmn:message>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_0xjmw8h\">\n      <bpmndi:BPMNShape id=\"Activity_0hen5q2_di\" bpmnElement=\"EmptyEventSubprocess_1\">\n        <dc:Bounds x=\"160\" y=\"80\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0jcmhjh\" bpmnElement=\"MessageEventSubprocess_1\">\n        <dc:Bounds x=\"280\" y=\"80\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1gtyp1f\" bpmnElement=\"TimerEventSubprocess_1\">\n        <dc:Bounds x=\"400\" y=\"80\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1hcy7lc\" bpmnElement=\"ConditionalEventSubprocess_1\">\n        <dc:Bounds x=\"520\" y=\"80\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_12odj22\" bpmnElement=\"SignalEventSubprocess_1\">\n        <dc:Bounds x=\"640\" y=\"80\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1elhik7\" bpmnElement=\"EscalationEventSubprocess_1\">\n        <dc:Bounds x=\"760\" y=\"80\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0qs14wl\" bpmnElement=\"ErrorEventSubprocess_1\">\n        <dc:Bounds x=\"880\" y=\"80\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0nicozt\" bpmnElement=\"CompensateEventSubprocess_1\">\n        <dc:Bounds x=\"1000\" y=\"80\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1jivg2x\" bpmnElement=\"MultipleEventSubprocess_1\">\n        <dc:Bounds x=\"1120\" y=\"80\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_15ux34v\" bpmnElement=\"ParallelEventSubprocess_1\">\n        <dc:Bounds x=\"1240\" y=\"80\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_043s9em\" bpmnElement=\"EmptyEventSubprocess_2\" bioc:stroke=\"#0d4372\" bioc:fill=\"#bbdefb\" color:background-color=\"#bbdefb\" color:border-color=\"#0d4372\">\n        <dc:Bounds x=\"160\" y=\"200\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_10ag685\" bpmnElement=\"MessageEventSubprocess_2\" bioc:stroke=\"#0d4372\" bioc:fill=\"#bbdefb\" color:background-color=\"#bbdefb\" color:border-color=\"#0d4372\">\n        <dc:Bounds x=\"280\" y=\"200\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1wdf1hc\" bpmnElement=\"TimerEventSubprocess_2\" bioc:stroke=\"#0d4372\" bioc:fill=\"#bbdefb\" color:background-color=\"#bbdefb\" color:border-color=\"#0d4372\">\n        <dc:Bounds x=\"400\" y=\"200\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0zz83t5\" bpmnElement=\"ConditionalEventSubprocess_2\" bioc:stroke=\"#0d4372\" bioc:fill=\"#bbdefb\" color:background-color=\"#bbdefb\" color:border-color=\"#0d4372\">\n        <dc:Bounds x=\"520\" y=\"200\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_07cvdpx\" bpmnElement=\"SignalEventSubprocess_2\" bioc:stroke=\"#0d4372\" bioc:fill=\"#bbdefb\" color:background-color=\"#bbdefb\" color:border-color=\"#0d4372\">\n        <dc:Bounds x=\"640\" y=\"200\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_17taftv\" bpmnElement=\"EscalationEventSubprocess_2\" bioc:stroke=\"#0d4372\" bioc:fill=\"#bbdefb\" color:background-color=\"#bbdefb\" color:border-color=\"#0d4372\">\n        <dc:Bounds x=\"760\" y=\"200\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_042thfb\" bpmnElement=\"ErrorEventSubprocess_2\" bioc:stroke=\"#0d4372\" bioc:fill=\"#bbdefb\" color:background-color=\"#bbdefb\" color:border-color=\"#0d4372\">\n        <dc:Bounds x=\"880\" y=\"200\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_12necze\" bpmnElement=\"CompensateEventSubprocess_2\" bioc:stroke=\"#0d4372\" bioc:fill=\"#bbdefb\" color:background-color=\"#bbdefb\" color:border-color=\"#0d4372\">\n        <dc:Bounds x=\"1000\" y=\"200\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_15piti0\" bpmnElement=\"MultipleEventSubprocess_2\" bioc:stroke=\"#0d4372\" bioc:fill=\"#bbdefb\" color:background-color=\"#bbdefb\" color:border-color=\"#0d4372\">\n        <dc:Bounds x=\"1120\" y=\"200\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0bugsis\" bpmnElement=\"ParallelEventSubprocess_2\" bioc:stroke=\"#0d4372\" bioc:fill=\"#bbdefb\" color:background-color=\"#bbdefb\" color:border-color=\"#0d4372\">\n        <dc:Bounds x=\"1240\" y=\"200\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_05f9sgk\" bpmnElement=\"MessageEventSubprocess_3\">\n        <dc:Bounds x=\"280\" y=\"320\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0uyb03m\" bpmnElement=\"TimerEventSubprocess_3\">\n        <dc:Bounds x=\"400\" y=\"320\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1l0dzcu\" bpmnElement=\"ConditionalEventSubprocess_3\">\n        <dc:Bounds x=\"520\" y=\"320\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0e9ibml\" bpmnElement=\"SignalEventSubprocess_3\">\n        <dc:Bounds x=\"640\" y=\"320\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0g0g0hr\" bpmnElement=\"EscalationEventSubprocess_3\">\n        <dc:Bounds x=\"760\" y=\"320\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1l25lo3\" bpmnElement=\"MultipleEventSubprocess_3\">\n        <dc:Bounds x=\"1120\" y=\"320\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1bdof66\" bpmnElement=\"ParallelEventSubprocess_3\">\n        <dc:Bounds x=\"1240\" y=\"320\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0woimk9\" bpmnElement=\"MessageEventSubprocess_4\" bioc:stroke=\"#6b3c00\" bioc:fill=\"#ffe0b2\" color:background-color=\"#ffe0b2\" color:border-color=\"#6b3c00\">\n        <dc:Bounds x=\"280\" y=\"440\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1yqkxl8\" bpmnElement=\"TimerEventSubprocess_4\" bioc:stroke=\"#6b3c00\" bioc:fill=\"#ffe0b2\" color:background-color=\"#ffe0b2\" color:border-color=\"#6b3c00\">\n        <dc:Bounds x=\"400\" y=\"440\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1hqnghm\" bpmnElement=\"ConditionalEventSubprocess_4\" bioc:stroke=\"#6b3c00\" bioc:fill=\"#ffe0b2\" color:background-color=\"#ffe0b2\" color:border-color=\"#6b3c00\">\n        <dc:Bounds x=\"520\" y=\"440\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0fqggs2\" bpmnElement=\"SignalEventSubprocess_4\" bioc:stroke=\"#6b3c00\" bioc:fill=\"#ffe0b2\" color:background-color=\"#ffe0b2\" color:border-color=\"#6b3c00\">\n        <dc:Bounds x=\"640\" y=\"440\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0wnl7zz\" bpmnElement=\"EscalationEventSubprocess_4\" bioc:stroke=\"#6b3c00\" bioc:fill=\"#ffe0b2\" color:background-color=\"#ffe0b2\" color:border-color=\"#6b3c00\">\n        <dc:Bounds x=\"760\" y=\"440\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_155cxe9\" bpmnElement=\"MultipleEventSubprocess_4\" bioc:stroke=\"#6b3c00\" bioc:fill=\"#ffe0b2\" color:background-color=\"#ffe0b2\" color:border-color=\"#6b3c00\">\n        <dc:Bounds x=\"1120\" y=\"440\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_033u6mg\" bpmnElement=\"ParallelEventSubprocess_4\" bioc:stroke=\"#6b3c00\" bioc:fill=\"#ffe0b2\" color:background-color=\"#ffe0b2\" color:border-color=\"#6b3c00\">\n        <dc:Bounds x=\"1240\" y=\"440\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_0bv318f\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0ydhvf4\" bpmnElement=\"EmptyEventSubprocess_1\" />\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1dzrl1g\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0zgxuun\" bpmnElement=\"MessageEventSubprocess_1\">\n      <bpmndi:BPMNShape id=\"StartEvent_0qo4btx_di\" bpmnElement=\"EndEvent_01\">\n        <dc:Bounds x=\"352\" y=\"232\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_0c7hd4s_di\" bpmnElement=\"StartEvent_01\">\n        <dc:Bounds x=\"262\" y=\"232\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_0nb49xa_di\" bpmnElement=\"Flow_01\">\n        <di:waypoint x=\"298\" y=\"250\" />\n        <di:waypoint x=\"352\" y=\"250\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_08x40vs\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_03roui6\" bpmnElement=\"TimerEventSubprocess_1\">\n      <bpmndi:BPMNShape id=\"BPMNShape_09wz407\" bpmnElement=\"EndEvent_02\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_18wobcn_di\" bpmnElement=\"StartEvent_02\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_12vlggv\" bpmnElement=\"Flow_02\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_17hwo2s\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0jl8zs6\" bpmnElement=\"ConditionalEventSubprocess_1\">\n      <bpmndi:BPMNShape id=\"BPMNShape_03quoqd\" bpmnElement=\"EndEvent_03\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1ehjo3c_di\" bpmnElement=\"StartEvent_03\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_071k350\" bpmnElement=\"Flow_03\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_00jvaiu\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0h8tmnu\" bpmnElement=\"SignalEventSubprocess_1\">\n      <bpmndi:BPMNShape id=\"BPMNShape_10c3wz2\" bpmnElement=\"EndEvent_04\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_0lxtult_di\" bpmnElement=\"StartEvent_04\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_1um7kf9\" bpmnElement=\"Flow_04\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_17f5iar\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1dn7cek\" bpmnElement=\"EscalationEventSubprocess_1\">\n      <bpmndi:BPMNShape id=\"BPMNShape_1i7ll6n\" bpmnElement=\"EndEvent_05\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_0u0v8q7_di\" bpmnElement=\"StartEvent_05\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_1u53rec\" bpmnElement=\"Flow_05\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_0sg6wfr\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1fbbqlc\" bpmnElement=\"ErrorEventSubprocess_1\">\n      <bpmndi:BPMNShape id=\"BPMNShape_1o57n77\" bpmnElement=\"EndEvent_06\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1oa9l9q_di\" bpmnElement=\"StartEvent_06\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_1y8vf2y\" bpmnElement=\"Flow_06\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1v26qk3\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0mz0f65\" bpmnElement=\"CompensateEventSubprocess_1\">\n      <bpmndi:BPMNShape id=\"BPMNShape_0gsylcc\" bpmnElement=\"EndEvent_07\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_0xxd4wt_di\" bpmnElement=\"StartEvent_07\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_1fmrefo\" bpmnElement=\"Flow_07\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1f5lho1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0nvrvh8\" bpmnElement=\"MultipleEventSubprocess_1\">\n      <bpmndi:BPMNShape id=\"BPMNShape_0bew5cd\" bpmnElement=\"EndEvent_08\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_13s2nm2_di\" bpmnElement=\"StartEvent_08\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_1s2p6hr\" bpmnElement=\"Flow_08\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1kx4ffc\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0fuhpdv\" bpmnElement=\"ParallelEventSubprocess_1\">\n      <bpmndi:BPMNShape id=\"BPMNShape_0hibjm4\" bpmnElement=\"EndEvent_09\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_03ogur4_di\" bpmnElement=\"StartEvent_09\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_1u7npnt\" bpmnElement=\"Flow_09\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_0emiza0\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_07eigk5\" bpmnElement=\"EmptyEventSubprocess_2\" />\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1j580xh\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1hysows\" bpmnElement=\"MessageEventSubprocess_2\">\n      <bpmndi:BPMNShape id=\"BPMNShape_0evmy6c\" bpmnElement=\"EndEvent_11\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0ym6gg4\" bpmnElement=\"StartEvent_11\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_0302dv6\" bpmnElement=\"Flow_11\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1sfvg3a\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0syn7f7\" bpmnElement=\"TimerEventSubprocess_2\">\n      <bpmndi:BPMNShape id=\"BPMNShape_0x8shuh\" bpmnElement=\"EndEvent_12\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_137ezul\" bpmnElement=\"StartEvent_12\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_0crmyo4\" bpmnElement=\"Flow_12\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_0wlqq9r\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_14mwifw\" bpmnElement=\"ConditionalEventSubprocess_2\">\n      <bpmndi:BPMNShape id=\"BPMNShape_13l2xpt\" bpmnElement=\"EndEvent_13\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1hlvw06\" bpmnElement=\"StartEvent_13\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_07mj1ng\" bpmnElement=\"Flow_13\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1unhbc0\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0sgndmv\" bpmnElement=\"SignalEventSubprocess_2\">\n      <bpmndi:BPMNShape id=\"BPMNShape_0vjq4vk\" bpmnElement=\"EndEvent_14\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_03n2gip\" bpmnElement=\"StartEvent_14\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_064dqni\" bpmnElement=\"Flow_14\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1rtdmnc\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0s5pphe\" bpmnElement=\"EscalationEventSubprocess_2\">\n      <bpmndi:BPMNShape id=\"BPMNShape_1bzaw6h\" bpmnElement=\"EndEvent_15\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_15yywug\" bpmnElement=\"StartEvent_15\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_0a7lusj\" bpmnElement=\"Flow_15\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1oopd56\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1xtlgia\" bpmnElement=\"ErrorEventSubprocess_2\">\n      <bpmndi:BPMNShape id=\"BPMNShape_1t6mz0e\" bpmnElement=\"StartEvent_16\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1vslx52\" bpmnElement=\"StartEvent_03pa4sf\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_01txrvj\" bpmnElement=\"Flow_16\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_0g2b74j\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0l68ynb\" bpmnElement=\"CompensateEventSubprocess_2\">\n      <bpmndi:BPMNShape id=\"BPMNShape_1ms8s1z\" bpmnElement=\"EndEvent_17\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_067d3kh\" bpmnElement=\"StartEvent_17\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_1j7vtin\" bpmnElement=\"Flow_17\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1go1ktz\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_17jo8ew\" bpmnElement=\"MultipleEventSubprocess_2\">\n      <bpmndi:BPMNShape id=\"BPMNShape_06vy6fl\" bpmnElement=\"EndEvent_18\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0vitx52\" bpmnElement=\"StartEvent_0bj9g61\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_1a5av3l\" bpmnElement=\"Flow_18\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_0rgnlci\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_14y9cyv\" bpmnElement=\"ParallelEventSubprocess_2\">\n      <bpmndi:BPMNShape id=\"BPMNShape_1bmwha3\" bpmnElement=\"EndEvent_19\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1ud8ief\" bpmnElement=\"StartEvent_19\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_1xacc1s\" bpmnElement=\"Flow_19\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_0zkbf4v\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1u6la4u\" bpmnElement=\"MessageEventSubprocess_3\">\n      <bpmndi:BPMNShape id=\"BPMNShape_00e3pa5\" bpmnElement=\"EndEvent_31\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_112bhme\" bpmnElement=\"StartEvent_31\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_1v5mvj3\" bpmnElement=\"Flow_31\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_14jrci5\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0swvp3k\" bpmnElement=\"TimerEventSubprocess_3\">\n      <bpmndi:BPMNShape id=\"BPMNShape_0axnqv6\" bpmnElement=\"EndEvent_32\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0p0db0o\" bpmnElement=\"StartEvent_32\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_013rr83\" bpmnElement=\"Flow_32\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_10fx2ov\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0idag3f\" bpmnElement=\"ConditionalEventSubprocess_3\">\n      <bpmndi:BPMNShape id=\"BPMNShape_0oz29nv\" bpmnElement=\"EndEvent_33\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0l5cm5g\" bpmnElement=\"StartEvent_33\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_1t69yn5\" bpmnElement=\"Flow_33\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_179ab5j\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_18tagmt\" bpmnElement=\"SignalEventSubprocess_3\">\n      <bpmndi:BPMNShape id=\"BPMNShape_1uenhuc\" bpmnElement=\"EndEvent_34\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_039iy9j\" bpmnElement=\"StartEvent_34\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_0cm7lu5\" bpmnElement=\"Flow_34\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_0u5vy7a\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1xxrq64\" bpmnElement=\"EscalationEventSubprocess_3\">\n      <bpmndi:BPMNShape id=\"BPMNShape_03v6v4p\" bpmnElement=\"EndEvent_35\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_13tf07i\" bpmnElement=\"StartEvent_35\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_0e91mu1\" bpmnElement=\"Flow_35\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1qgeb8j\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_140c64h\" bpmnElement=\"MultipleEventSubprocess_3\">\n      <bpmndi:BPMNShape id=\"BPMNShape_1h7ea07\" bpmnElement=\"EndEvent_38\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1ea0a9a\" bpmnElement=\"StartEvent_38\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_1x8xvmq\" bpmnElement=\"Flow_38\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_167cvn1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0zo14pv\" bpmnElement=\"ParallelEventSubprocess_3\">\n      <bpmndi:BPMNShape id=\"BPMNShape_03pxbbp\" bpmnElement=\"EndEvent_39\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_047y0wv\" bpmnElement=\"StartEvent_39\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_0qwzi1r\" bpmnElement=\"Flow_39\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_106jzcb\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0syablr\" bpmnElement=\"MessageEventSubprocess_4\">\n      <bpmndi:BPMNShape id=\"BPMNShape_1u7hzph\" bpmnElement=\"EndEvent_41\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0bvzjag\" bpmnElement=\"StartEvent_41\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_1d2nljj\" bpmnElement=\"Flow_41\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1ejiinj\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0tpuuov\" bpmnElement=\"TimerEventSubprocess_4\">\n      <bpmndi:BPMNShape id=\"BPMNShape_1rvilhb\" bpmnElement=\"EndEvent_42\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0v9byke\" bpmnElement=\"StartEvent_42\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_0ls5322\" bpmnElement=\"Flow_42\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1el42fh\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_00u8sdn\" bpmnElement=\"ConditionalEventSubprocess_4\">\n      <bpmndi:BPMNShape id=\"BPMNShape_0bazhcf\" bpmnElement=\"EndEvent_43\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0ybkcay\" bpmnElement=\"StartEvent_0putbmu\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_161y5wc\" bpmnElement=\"Flow_43\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_19nnu0v\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1dy8st9\" bpmnElement=\"SignalEventSubprocess_4\">\n      <bpmndi:BPMNShape id=\"BPMNShape_15tjzu4\" bpmnElement=\"EndEvent_44\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1dpjxx0\" bpmnElement=\"StartEvent_44\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_1467oob\" bpmnElement=\"Flow_44\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1fifbp0\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0capd7d\" bpmnElement=\"EscalationEventSubprocess_4\">\n      <bpmndi:BPMNShape id=\"BPMNShape_1k6uy0v\" bpmnElement=\"EndEvent_45\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0iybr7e\" bpmnElement=\"StartEvent_45\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_0b69mwn\" bpmnElement=\"Flow_45\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_0jhhd5d\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1ecns91\" bpmnElement=\"MultipleEventSubprocess_4\">\n      <bpmndi:BPMNShape id=\"BPMNShape_1fw6gu6\" bpmnElement=\"EndEvent_48\">\n        <dc:Bounds x=\"270\" y=\"80\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0y64jze\" bpmnElement=\"StartEvent_48\">\n        <dc:Bounds x=\"180\" y=\"80\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_189t5vp\" bpmnElement=\"Flow_48\">\n        <di:waypoint x=\"216\" y=\"98\" />\n        <di:waypoint x=\"270\" y=\"98\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_0k1s7qz\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0g54i56\" bpmnElement=\"ParallelEventSubprocess_4\">\n      <bpmndi:BPMNShape id=\"BPMNShape_09rj4b7\" bpmnElement=\"EndEvent_49\">\n        <dc:Bounds x=\"270\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1p4fe3j\" bpmnElement=\"StartEvent_49\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_0e3iwa1\" bpmnElement=\"Flow_49\">\n        <di:waypoint x=\"216\" y=\"178\" />\n        <di:waypoint x=\"270\" y=\"178\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/event-subprocesses-collapsed.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n             xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n             xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\"\n             xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\"\n             xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n             expressionLanguage=\"http://www.w3.org/1999/XPath\"\n             id=\"sid-086ae791-33c4-4a0f-b036-8258a41f72cf\"\n             typeLanguage=\"http://www.w3.org/2001/XMLSchema\"\n             xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n    <process id=\"sid-5c08bc3a-85c6-4c0f-9e0d-db2185e0eb21\" isClosed=\"false\" isExecutable=\"false\" processType=\"None\">\n        <subProcess completionQuantity=\"1\" id=\"sid-1FCCE4DD-BDC2-4F40-8322-BBC7B8C7F43B\" isForCompensation=\"false\"\n                    name=\"Collapsed event sub process - Interrupting (Message)\" startQuantity=\"1\"\n                    triggeredByEvent=\"true\">\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-3268BB14-F902-482C-B759-8A55DC5AAE74\" isForCompensation=\"false\"\n                    name=\"Collapsed event sub process - Non-Interrupting (Message)\" startQuantity=\"1\"\n                    triggeredByEvent=\"true\">\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-AFF07A97-9880-4F40-AE9F-140332CA438E\" isForCompensation=\"false\"\n                    name=\"Collapsed event sub process - Interrupting (Timer)\" startQuantity=\"1\" triggeredByEvent=\"true\">\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-E2C1ACDC-1DCD-4386-9169-031F044814CE\" isForCompensation=\"false\"\n                    name=\"Collapsed event sub process - Non-Interrupting (Timer)\" startQuantity=\"1\"\n                    triggeredByEvent=\"true\">\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-E6236C04-DDC5-4225-8C5F-5AB17FCE0A3A\" isForCompensation=\"false\"\n                    name=\"Collapsed event sub process - Interrupting (Escalation)\" startQuantity=\"1\"\n                    triggeredByEvent=\"true\">\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-76CF643F-60A5-46F9-BE3C-79B7562E3FE0\" isForCompensation=\"false\"\n                    name=\"Collapsed event sub process - Non-Interrupting (Escalation)\" startQuantity=\"1\"\n                    triggeredByEvent=\"true\">\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-C5A5D1AA-913D-45B1-A608-B856D0A49FDC\" isForCompensation=\"false\"\n                    name=\"Collapsed event sub process - Interrupting (Conditional)\" startQuantity=\"1\"\n                    triggeredByEvent=\"true\">\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-D96D4BDE-F81E-49AB-A95B-370387138B8D\" isForCompensation=\"false\"\n                    name=\"Collapsed event sub process - Non-Interrupting (Conditional)\" startQuantity=\"1\"\n                    triggeredByEvent=\"true\">\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-6856CEAE-A347-4BCE-81A3-0A6CA8CE50D1\" isForCompensation=\"false\"\n                    name=\"Collapsed event sub process - Interrupting (Error)\" startQuantity=\"1\" triggeredByEvent=\"true\">\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-D6711102-EA23-4440-9ACC-7FEEF411C571\" isForCompensation=\"false\"\n                    name=\"Collapsed event sub process - Interrupting (Compensation)\" startQuantity=\"1\"\n                    triggeredByEvent=\"true\">\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-7BC13441-B3A7-4A4E-95BE-E69C1E2B8291\" isForCompensation=\"false\"\n                    name=\"Collapsed event sub process - Interrupting (Signal)\" startQuantity=\"1\"\n                    triggeredByEvent=\"true\">\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-5BC80174-5C5A-4205-8706-91E09C497892\" isForCompensation=\"false\"\n                    name=\"Collapsed event sub process - Non-Interrupting (Signal)\" startQuantity=\"1\"\n                    triggeredByEvent=\"true\">\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-214F4A45-AB76-428A-A980-0616B7C1E661\" isForCompensation=\"false\"\n                    name=\"Collapsed event sub process - Interrupting (Multiple)\" startQuantity=\"1\"\n                    triggeredByEvent=\"true\">\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-B6A51755-19F6-4B3D-A30D-A773F7288756\" isForCompensation=\"false\"\n                    name=\"Collapsed event sub process - Non-Interrupting (Multiple)\" startQuantity=\"1\"\n                    triggeredByEvent=\"true\">\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-78B25516-0002-4297-AE32-D65350E0FF80\" isForCompensation=\"false\"\n                    name=\"Collapsed event sub process - Interrupting (Parallel Multiple)\" startQuantity=\"1\"\n                    triggeredByEvent=\"true\">\n        </subProcess>\n        <subProcess completionQuantity=\"1\" id=\"sid-31BFEE6D-EC3E-48F3-82AD-9960AB60CCCF\" isForCompensation=\"false\"\n                    name=\"Collapsed event sub process - Non-Interrupting (Parallel Multiple)\" startQuantity=\"1\"\n                    triggeredByEvent=\"true\">\n        </subProcess>\n        <textAnnotation id=\"sid-2858FFCD-EACF-4F36-BDEB-6F0EAC5797D6\" textFormat=\"text/plain\">\n            <text>No Non-Interrupting event</text>\n        </textAnnotation>\n        <textAnnotation id=\"sid-0E4F3158-91A5-476A-9BC8-6713C035A3B6\" textFormat=\"text/plain\">\n            <text>No Non-Interrupting event</text>\n        </textAnnotation>\n    </process>\n    <bpmndi:BPMNDiagram id=\"sid-4f14c829-400b-4c14-9c2c-f770b8186911\">\n        <bpmndi:BPMNPlane bpmnElement=\"sid-5c08bc3a-85c6-4c0f-9e0d-db2185e0eb21\"\n                          id=\"sid-2bac6d3d-12f1-43ac-b1ee-0d4aea8d4e81\">\n            <bpmndi:BPMNShape bpmnElement=\"sid-1FCCE4DD-BDC2-4F40-8322-BBC7B8C7F43B\"\n                              id=\"sid-1FCCE4DD-BDC2-4F40-8322-BBC7B8C7F43B_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"96.0\" width=\"201.0\" x=\"105.0\" y=\"105.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-bdfc2f0a-7d70-4c59-9905-9a182974cae1\">\n                    <omgdc:Bounds height=\"24.0\" width=\"183.4285888671875\" x=\"113.78570556640625\" y=\"139.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-3268BB14-F902-482C-B759-8A55DC5AAE74\"\n                              id=\"sid-3268BB14-F902-482C-B759-8A55DC5AAE74_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"96.0\" width=\"201.0\" x=\"424.5\" y=\"105.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-bdfc2f0a-7d70-4c59-9905-9a182974cae1\">\n                    <omgdc:Bounds height=\"24.0\" width=\"183.4285888671875\" x=\"433.28570556640625\" y=\"139.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-AFF07A97-9880-4F40-AE9F-140332CA438E\" id=\"sid-AFF07A97-9880-4F40-AE9F-140332CA438E_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"96.0\" width=\"201.0\" x=\"145.5\" y=\"246.0\"/>\n                <bpmndi:BPMNLabel>\n                    <omgdc:Bounds height=\"24.0\" width=\"183.4285888671875\" x=\"154.28570556640625\" y=\"280.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-E2C1ACDC-1DCD-4386-9169-031F044814CE\" id=\"sid-E2C1ACDC-1DCD-4386-9169-031F044814CE_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"96.0\" width=\"201.0\" x=\"465.0\" y=\"246.0\"/>\n                <bpmndi:BPMNLabel>\n                    <omgdc:Bounds height=\"24.0\" width=\"183.4285888671875\" x=\"473.78570556640625\" y=\"280.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-E6236C04-DDC5-4225-8C5F-5AB17FCE0A3A\" id=\"sid-E6236C04-DDC5-4225-8C5F-5AB17FCE0A3A_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"96.0\" width=\"201.0\" x=\"145.5\" y=\"387.0\"/>\n                <bpmndi:BPMNLabel>\n                    <omgdc:Bounds height=\"24.0\" width=\"183.4285888671875\" x=\"154.28570556640625\" y=\"421.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-76CF643F-60A5-46F9-BE3C-79B7562E3FE0\" id=\"sid-76CF643F-60A5-46F9-BE3C-79B7562E3FE0_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"96.0\" width=\"201.0\" x=\"465.0\" y=\"387.0\"/>\n                <bpmndi:BPMNLabel>\n                    <omgdc:Bounds height=\"24.0\" width=\"183.4285888671875\" x=\"473.78570556640625\" y=\"421.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-C5A5D1AA-913D-45B1-A608-B856D0A49FDC\" id=\"sid-C5A5D1AA-913D-45B1-A608-B856D0A49FDC_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"96.0\" width=\"201.0\" x=\"145.5\" y=\"528.0\"/>\n                <bpmndi:BPMNLabel>\n                    <omgdc:Bounds height=\"24.0\" width=\"183.4285888671875\" x=\"154.28570556640625\" y=\"562.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-D96D4BDE-F81E-49AB-A95B-370387138B8D\" id=\"sid-D96D4BDE-F81E-49AB-A95B-370387138B8D_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"96.0\" width=\"201.0\" x=\"465.0\" y=\"528.0\"/>\n                <bpmndi:BPMNLabel>\n                    <omgdc:Bounds height=\"24.0\" width=\"184.28570556640625\" x=\"473.3571472167969\" y=\"562.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-6856CEAE-A347-4BCE-81A3-0A6CA8CE50D1\" id=\"sid-6856CEAE-A347-4BCE-81A3-0A6CA8CE50D1_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"96.0\" width=\"201.0\" x=\"145.5\" y=\"669.0\"/>\n                <bpmndi:BPMNLabel>\n                    <omgdc:Bounds height=\"24.0\" width=\"183.4285888671875\" x=\"154.28570556640625\" y=\"703.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-D6711102-EA23-4440-9ACC-7FEEF411C571\" id=\"sid-D6711102-EA23-4440-9ACC-7FEEF411C571_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"96.0\" width=\"201.0\" x=\"145.5\" y=\"810.0\"/>\n                <bpmndi:BPMNLabel>\n                    <omgdc:Bounds height=\"24.0\" width=\"183.4285888671875\" x=\"154.28570556640625\" y=\"844.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-7BC13441-B3A7-4A4E-95BE-E69C1E2B8291\" id=\"sid-7BC13441-B3A7-4A4E-95BE-E69C1E2B8291_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"96.0\" width=\"201.0\" x=\"145.5\" y=\"951.0\"/>\n                <bpmndi:BPMNLabel>\n                    <omgdc:Bounds height=\"24.0\" width=\"183.4285888671875\" x=\"154.28570556640625\" y=\"985.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-5BC80174-5C5A-4205-8706-91E09C497892\" id=\"sid-5BC80174-5C5A-4205-8706-91E09C497892_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"96.0\" width=\"201.0\" x=\"465.0\" y=\"951.0\"/>\n                <bpmndi:BPMNLabel>\n                    <omgdc:Bounds height=\"24.0\" width=\"183.4285888671875\" x=\"473.78570556640625\" y=\"985.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-214F4A45-AB76-428A-A980-0616B7C1E661\" id=\"sid-214F4A45-AB76-428A-A980-0616B7C1E661_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"96.0\" width=\"201.0\" x=\"145.5\" y=\"1092.0\"/>\n                <bpmndi:BPMNLabel>\n                    <omgdc:Bounds height=\"24.0\" width=\"183.4285888671875\" x=\"154.28570556640625\" y=\"1126.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-B6A51755-19F6-4B3D-A30D-A773F7288756\" id=\"sid-B6A51755-19F6-4B3D-A30D-A773F7288756_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"96.0\" width=\"201.0\" x=\"465.0\" y=\"1092.0\"/>\n                <bpmndi:BPMNLabel>\n                    <omgdc:Bounds height=\"24.0\" width=\"183.4285888671875\" x=\"473.78570556640625\" y=\"1126.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-78B25516-0002-4297-AE32-D65350E0FF80\" id=\"sid-78B25516-0002-4297-AE32-D65350E0FF80_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"96.0\" width=\"201.0\" x=\"145.5\" y=\"1233.0\"/>\n                <bpmndi:BPMNLabel>\n                    <omgdc:Bounds height=\"24.0\" width=\"183.4285888671875\" x=\"154.28570556640625\" y=\"1267.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-31BFEE6D-EC3E-48F3-82AD-9960AB60CCCF\" id=\"sid-31BFEE6D-EC3E-48F3-82AD-9960AB60CCCF_gui\" isExpanded=\"false\">\n                <omgdc:Bounds height=\"96.0\" width=\"201.0\" x=\"465.0\" y=\"1233.0\"/>\n                <bpmndi:BPMNLabel>\n                    <omgdc:Bounds height=\"36.0\" width=\"183.4285888671875\" x=\"473.78570556640625\" y=\"1261.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-2858FFCD-EACF-4F36-BDEB-6F0EAC5797D6\" id=\"sid-2858FFCD-EACF-4F36-BDEB-6F0EAC5797D6_gui\">\n                <omgdc:Bounds height=\"50.0\" width=\"175.0\" x=\"491.0\" y=\"833.0\"/>\n                <bpmndi:BPMNLabel>\n                    <omgdc:Bounds height=\"12.0\" width=\"161.14285278320312\" x=\"495.0\" y=\"849.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-0E4F3158-91A5-476A-9BC8-6713C035A3B6\" id=\"sid-0E4F3158-91A5-476A-9BC8-6713C035A3B6_gui\">\n                <omgdc:Bounds height=\"50.0\" width=\"175.0\" x=\"491.0\" y=\"692.0\"/>\n                <bpmndi:BPMNLabel>\n                    <omgdc:Bounds height=\"12.0\" width=\"161.14285278320312\" x=\"495.0\" y=\"708.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n        </bpmndi:BPMNPlane>\n        <bpmndi:BPMNLabelStyle id=\"sid-bdfc2f0a-7d70-4c59-9905-9a182974cae1\">\n            <omgdc:Font isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\" name=\"Arial\"\n                        size=\"12.0\"/>\n        </bpmndi:BPMNLabelStyle>\n    </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/event-subprocesses-expanded.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n             xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n             xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\"\n             xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n             expressionLanguage=\"http://www.w3.org/1999/XPath\"\n             id=\"sid-e6447230-d8ba-4e9c-9a82-45467108d2c2\"\n             typeLanguage=\"http://www.w3.org/2001/XMLSchema\"\n             xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n   <error id=\"sid-da724442-5ce7-4e73-9edb-4cb7093ed94f\"/>\n   <escalation id=\"sid-9d8893cc-731f-47e5-9ae2-31a119975ed6\"/>\n   <process id=\"sid-cc400c02-688e-4e48-90f1-6550e2c6f690\" isClosed=\"false\" isExecutable=\"false\" processType=\"None\">\n      <subProcess completionQuantity=\"1\" id=\"sid-B6C65639-D513-4674-80F9-152D48CC4329\" isForCompensation=\"false\" name=\"Event-SubProces Interrupting (Message)\" startQuantity=\"1\" triggeredByEvent=\"true\">\n         <startEvent id=\"sid-0C0BC81D-BB9C-4693-B88A-DB3C6C63691B\" isInterrupting=\"true\">\n            <messageEventDefinition id=\"sid-1f8dba35-8d81-4b7f-bda3-7ab7ff22999e\"/>\n         </startEvent>\n      </subProcess>\n      <subProcess completionQuantity=\"1\" id=\"sid-72325D9B-5B9D-4521-A511-23F0DD9C4902\" isForCompensation=\"false\" name=\"Event-SubProces Non-Interrupting (Message)\" startQuantity=\"1\" triggeredByEvent=\"true\">\n         <startEvent id=\"sid-646C6A20-93FF-4029-A43C-A4A9A0DF283B\" isInterrupting=\"false\">\n            <messageEventDefinition id=\"sid-f0dff0e1-2e58-4bbe-babd-af31be2f59f4\"/>\n         </startEvent>\n      </subProcess>\n      <subProcess completionQuantity=\"1\" id=\"sid-42177BEE-0B89-43BF-A442-DE3037220EFC\" isForCompensation=\"false\" name=\"Event-SubProces Interrupting (Timer)\" startQuantity=\"1\" triggeredByEvent=\"true\">\n         <startEvent id=\"sid-A6985EA2-30AD-460C-B948-265D3A59FDFD\" isInterrupting=\"true\">\n            <timerEventDefinition id=\"sid-ca23d8e7-5988-43b2-a7b0-fb654ee6c402\"/>\n         </startEvent>\n      </subProcess>\n      <subProcess completionQuantity=\"1\" id=\"sid-3F2B4024-0230-4EF8-B6FF-01D99F7B0B65\" isForCompensation=\"false\" name=\"Event-SubProces Non-Interrupting (Timer)\" startQuantity=\"1\" triggeredByEvent=\"true\">\n         <startEvent id=\"sid-1DAE9538-E52C-46B8-8530-650C226AEE07\" isInterrupting=\"false\">\n            <timerEventDefinition id=\"sid-6f4fd32a-87b1-4439-ae00-f29e833d3b6f\"/>\n         </startEvent>\n      </subProcess>\n      <subProcess completionQuantity=\"1\" id=\"sid-BC707A18-F0A6-4CD3-98E4-625CA35472B9\" isForCompensation=\"false\" name=\"Event-SubProces Interrupting (Conditional)\" startQuantity=\"1\" triggeredByEvent=\"true\">\n         <startEvent id=\"sid-9556478F-C388-45D4-B7AA-19531C9A2AC4\" isInterrupting=\"true\">\n            <conditionalEventDefinition id=\"sid-f4fc510a-3b80-46de-8dda-b12157bc18d3\">\n               <condition id=\"sid-4fe60a66-1087-4963-8ae3-9291faf1ef1b\" xsi:type=\"tFormalExpression\"/>\n            </conditionalEventDefinition>\n         </startEvent>\n      </subProcess>\n      <subProcess completionQuantity=\"1\" id=\"sid-8DE5DA1F-F9B7-4D26-A074-C2617B7392F4\" isForCompensation=\"false\" name=\"Event-SubProces Non-Interrupting (Conditional)\" startQuantity=\"1\" triggeredByEvent=\"true\">\n         <startEvent id=\"sid-16A0BD37-50D9-4AD0-B179-8AE9925F1F3B\" isInterrupting=\"false\">\n            <conditionalEventDefinition id=\"sid-5387bd21-8d3d-46e5-bb1a-9d654a445ab3\">\n               <condition id=\"sid-b72c40a1-8aac-4fa9-95b3-4217fdaac1c7\" xsi:type=\"tFormalExpression\"/>\n            </conditionalEventDefinition>\n         </startEvent>\n      </subProcess>\n      <subProcess completionQuantity=\"1\" id=\"sid-977E261C-DC6C-4FD6-A773-6997DD4258A3\" isForCompensation=\"false\" name=\"Event-SubProces Interrupting (Signal)\" startQuantity=\"1\" triggeredByEvent=\"true\">\n         <startEvent id=\"sid-313D1E97-7B57-45F9-8F77-A2FD412E6526\" isInterrupting=\"true\">\n            <signalEventDefinition id=\"sid-a666b700-8ce7-4a39-80d7-65e9d82dd859\"/>\n         </startEvent>\n      </subProcess>\n      <subProcess completionQuantity=\"1\" id=\"sid-6684B5A1-1C53-42FB-A205-E6F380C7A0CA\" isForCompensation=\"false\" name=\"Event-SubProces Non-Interrupting (Signal)\" startQuantity=\"1\" triggeredByEvent=\"true\">\n         <startEvent id=\"sid-89DCE12A-C4BD-4A4A-A5A1-BFDAE10AD58C\" isInterrupting=\"false\">\n            <signalEventDefinition id=\"sid-25122eb3-d374-4607-b13b-7726b48dc14d\"/>\n         </startEvent>\n      </subProcess>\n      <subProcess completionQuantity=\"1\" id=\"sid-92B7E9AA-A1E3-4C53-8566-6C3C23720743\" isForCompensation=\"false\" name=\"Event-SubProces Interrupting (Error)\" startQuantity=\"1\" triggeredByEvent=\"true\">\n         <startEvent id=\"sid-D14FEB4C-7597-4215-82F0-B9F44DD4BF4E\" isInterrupting=\"true\">\n            <errorEventDefinition errorRef=\"sid-da724442-5ce7-4e73-9edb-4cb7093ed94f\" id=\"sid-1721b63b-4ebe-48e0-8bd6-9703c3321d60\"/>\n         </startEvent>\n      </subProcess>\n      <subProcess completionQuantity=\"1\" id=\"sid-3244E144-1EEF-41FA-95CE-10793EE0CF2A\" isForCompensation=\"false\" name=\"Event-SubProces Interrupting (Escalation)\" startQuantity=\"1\" triggeredByEvent=\"true\">\n         <startEvent id=\"sid-01D24CC5-B9ED-4EDB-8DDC-5FC437017FCA\" isInterrupting=\"true\">\n            <escalationEventDefinition escalationRef=\"sid-9d8893cc-731f-47e5-9ae2-31a119975ed6\" id=\"sid-abc095f1-8f24-4af8-9654-821579c289f3\"/>\n         </startEvent>\n      </subProcess>\n      <subProcess completionQuantity=\"1\" id=\"sid-688214F1-CA73-4689-8175-A17C8206F59A\" isForCompensation=\"false\" name=\"Event-SubProces Non-Interrupting (Escalation)\" startQuantity=\"1\" triggeredByEvent=\"true\">\n         <startEvent id=\"sid-0C9AA152-894E-484F-B5FE-0BCEF139F9F2\" isInterrupting=\"false\">\n            <escalationEventDefinition escalationRef=\"sid-9d8893cc-731f-47e5-9ae2-31a119975ed6\" id=\"sid-962ee175-3500-4d5f-8222-dc5d2f887759\"/>\n         </startEvent>\n      </subProcess>\n      <subProcess completionQuantity=\"1\" id=\"sid-4BDB6240-A88E-4287-B123-B39BF94B0E42\" isForCompensation=\"false\" name=\"Event-SubProces Interrupting (Compensation)\" startQuantity=\"1\" triggeredByEvent=\"true\">\n         <startEvent id=\"sid-E02E9A35-5626-4BB9-9145-A6DEDEB65E9B\" isInterrupting=\"true\">\n            <compensateEventDefinition id=\"sid-9c79b286-7797-408b-987c-a6e7ac136d1d\" waitForCompletion=\"true\"/>\n         </startEvent>\n      </subProcess>\n      <subProcess completionQuantity=\"1\" id=\"sid-CDF5EF19-02A6-417E-B907-F2962D279C40\" isForCompensation=\"false\" name=\"Event-SubProces Interrupting (Multiple)\" startQuantity=\"1\" triggeredByEvent=\"true\">\n         <startEvent id=\"sid-43A95C1E-337E-45E0-AC6B-2F2F28CA62DC\" isInterrupting=\"true\">\n            <cancelEventDefinition id=\"sid-d2971bfe-d6ab-41f7-8eb4-7a812c42057c\"/>\n            <terminateEventDefinition id=\"sid-95ad0ff7-5eaf-4f2e-a4ef-643a1f306559\"/>\n         </startEvent>\n      </subProcess>\n      <subProcess completionQuantity=\"1\" id=\"sid-CAB21AF6-204C-4262-8B5E-6A69E84A3B8C\" isForCompensation=\"false\" name=\"Event-SubProces Non-Interrupting (Multiple)\" startQuantity=\"1\" triggeredByEvent=\"true\">\n         <startEvent id=\"sid-8E05E835-1F9D-4F74-8A11-E78B9B143890\" isInterrupting=\"false\">\n            <cancelEventDefinition id=\"sid-deaf85f2-194a-4046-a008-b86b0bf797f6\"/>\n            <terminateEventDefinition id=\"sid-9bdd16d7-8fbc-43c1-ac46-b95e52953ccc\"/>\n         </startEvent>\n      </subProcess>\n      <subProcess completionQuantity=\"1\" id=\"sid-D4CD7F53-3527-4AB6-8272-712F94CBC6AC\" isForCompensation=\"false\" name=\"Event-SubProces Interrupting (Parallel Multiple)\" startQuantity=\"1\" triggeredByEvent=\"true\">\n         <startEvent id=\"sid-8A864C5D-ACB1-46EC-A61E-2E40F7A338C0\" isInterrupting=\"true\" parallelMultiple=\"true\">\n            <cancelEventDefinition id=\"sid-6784565a-2de3-438a-b705-2da70e7fbc05\"/>\n            <terminateEventDefinition id=\"sid-88d6a53f-f58f-4abe-a44f-4693525b33c5\"/>\n         </startEvent>\n      </subProcess>\n      <subProcess completionQuantity=\"1\" id=\"sid-3AA65260-1EFB-4E71-9DD5-34EA03295029\" isForCompensation=\"false\" name=\"Event-SubProces Non-Interrupting (Parallel Multiple)\" startQuantity=\"1\" triggeredByEvent=\"true\">\n         <startEvent id=\"sid-897DF4F2-CF88-4B64-BD28-A18523F9D9F6\" isInterrupting=\"false\" parallelMultiple=\"true\">\n            <cancelEventDefinition id=\"sid-5cd186dd-0638-4f80-8e57-14b4e9b0bd6e\"/>\n            <terminateEventDefinition id=\"sid-04d397ea-6b06-4b08-89e6-214178214470\"/>\n         </startEvent>\n      </subProcess>\n      <textAnnotation id=\"sid-7AB5E77A-9182-44EA-83C6-8666BA69D14C\" textFormat=\"text/plain\">\n         <text>No Non-Interrupting</text>\n      </textAnnotation>\n      <textAnnotation id=\"sid-D90F1894-EA85-44A2-AC16-C6F03348B6F7\" textFormat=\"text/plain\">\n         <text>No Non-Interrupting</text>\n      </textAnnotation>\n   </process>\n   <bpmndi:BPMNDiagram id=\"sid-9ce9f3ed-bbe8-47db-8215-3b8d17cdbd67\">\n      <bpmndi:BPMNPlane bpmnElement=\"sid-cc400c02-688e-4e48-90f1-6550e2c6f690\" id=\"sid-59c679ca-9ffc-4c6a-b1ea-0dad11996681\">\n         <bpmndi:BPMNShape bpmnElement=\"sid-B6C65639-D513-4674-80F9-152D48CC4329\" id=\"sid-B6C65639-D513-4674-80F9-152D48CC4329_gui\" isExpanded=\"true\">\n            <omgdc:Bounds height=\"160.0\" width=\"200.0\" x=\"135.0\" y=\"45.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-385de329-bbfa-4618-8f2d-bffca39d9f50\">\n               <omgdc:Bounds height=\"24.0\" width=\"180.85714721679688\" x=\"143.0\" y=\"55.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-0C0BC81D-BB9C-4693-B88A-DB3C6C63691B\" id=\"sid-0C0BC81D-BB9C-4693-B88A-DB3C6C63691B_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"165.0\" y=\"110.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-72325D9B-5B9D-4521-A511-23F0DD9C4902\" id=\"sid-72325D9B-5B9D-4521-A511-23F0DD9C4902_gui\" isExpanded=\"true\">\n            <omgdc:Bounds height=\"160.0\" width=\"200.0\" x=\"485.0\" y=\"45.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-385de329-bbfa-4618-8f2d-bffca39d9f50\">\n               <omgdc:Bounds height=\"24.0\" width=\"138.85714721679688\" x=\"493.0\" y=\"55.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-646C6A20-93FF-4029-A43C-A4A9A0DF283B\" id=\"sid-646C6A20-93FF-4029-A43C-A4A9A0DF283B_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"515.0\" y=\"110.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-42177BEE-0B89-43BF-A442-DE3037220EFC\" id=\"sid-42177BEE-0B89-43BF-A442-DE3037220EFC_gui\" isExpanded=\"true\">\n            <omgdc:Bounds height=\"160.0\" width=\"200.0\" x=\"135.0\" y=\"250.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-385de329-bbfa-4618-8f2d-bffca39d9f50\">\n               <omgdc:Bounds height=\"24.0\" width=\"180.85714721679688\" x=\"143.0\" y=\"260.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-A6985EA2-30AD-460C-B948-265D3A59FDFD\" id=\"sid-A6985EA2-30AD-460C-B948-265D3A59FDFD_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"165.0\" y=\"315.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-3F2B4024-0230-4EF8-B6FF-01D99F7B0B65\" id=\"sid-3F2B4024-0230-4EF8-B6FF-01D99F7B0B65_gui\" isExpanded=\"true\">\n            <omgdc:Bounds height=\"160.0\" width=\"200.0\" x=\"485.0\" y=\"250.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-385de329-bbfa-4618-8f2d-bffca39d9f50\">\n               <omgdc:Bounds height=\"24.0\" width=\"138.0\" x=\"493.0\" y=\"260.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-1DAE9538-E52C-46B8-8530-650C226AEE07\" id=\"sid-1DAE9538-E52C-46B8-8530-650C226AEE07_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"515.0\" y=\"315.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-BC707A18-F0A6-4CD3-98E4-625CA35472B9\" id=\"sid-BC707A18-F0A6-4CD3-98E4-625CA35472B9_gui\" isExpanded=\"true\">\n            <omgdc:Bounds height=\"160.0\" width=\"200.0\" x=\"135.0\" y=\"455.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-385de329-bbfa-4618-8f2d-bffca39d9f50\">\n               <omgdc:Bounds height=\"24.0\" width=\"180.85714721679688\" x=\"143.0\" y=\"465.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-9556478F-C388-45D4-B7AA-19531C9A2AC4\" id=\"sid-9556478F-C388-45D4-B7AA-19531C9A2AC4_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"165.0\" y=\"520.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-8DE5DA1F-F9B7-4D26-A074-C2617B7392F4\" id=\"sid-8DE5DA1F-F9B7-4D26-A074-C2617B7392F4_gui\" isExpanded=\"true\">\n            <omgdc:Bounds height=\"160.0\" width=\"200.0\" x=\"485.0\" y=\"455.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-385de329-bbfa-4618-8f2d-bffca39d9f50\">\n               <omgdc:Bounds height=\"24.0\" width=\"154.2857208251953\" x=\"493.0\" y=\"465.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-16A0BD37-50D9-4AD0-B179-8AE9925F1F3B\" id=\"sid-16A0BD37-50D9-4AD0-B179-8AE9925F1F3B_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"515.0\" y=\"520.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-977E261C-DC6C-4FD6-A773-6997DD4258A3\" id=\"sid-977E261C-DC6C-4FD6-A773-6997DD4258A3_gui\" isExpanded=\"true\">\n            <omgdc:Bounds height=\"160.0\" width=\"200.0\" x=\"135.0\" y=\"660.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-385de329-bbfa-4618-8f2d-bffca39d9f50\">\n               <omgdc:Bounds height=\"24.0\" width=\"180.85714721679688\" x=\"143.0\" y=\"670.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-313D1E97-7B57-45F9-8F77-A2FD412E6526\" id=\"sid-313D1E97-7B57-45F9-8F77-A2FD412E6526_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"165.0\" y=\"725.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-6684B5A1-1C53-42FB-A205-E6F380C7A0CA\" id=\"sid-6684B5A1-1C53-42FB-A205-E6F380C7A0CA_gui\" isExpanded=\"true\">\n            <omgdc:Bounds height=\"160.0\" width=\"200.0\" x=\"485.0\" y=\"660.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-385de329-bbfa-4618-8f2d-bffca39d9f50\">\n               <omgdc:Bounds height=\"24.0\" width=\"138.0\" x=\"493.0\" y=\"670.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-89DCE12A-C4BD-4A4A-A5A1-BFDAE10AD58C\" id=\"sid-89DCE12A-C4BD-4A4A-A5A1-BFDAE10AD58C_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"515.0\" y=\"725.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-92B7E9AA-A1E3-4C53-8566-6C3C23720743\" id=\"sid-92B7E9AA-A1E3-4C53-8566-6C3C23720743_gui\" isExpanded=\"true\">\n            <omgdc:Bounds height=\"160.0\" width=\"200.0\" x=\"135.0\" y=\"865.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-385de329-bbfa-4618-8f2d-bffca39d9f50\">\n               <omgdc:Bounds height=\"24.0\" width=\"180.85714721679688\" x=\"143.0\" y=\"875.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-D14FEB4C-7597-4215-82F0-B9F44DD4BF4E\" id=\"sid-D14FEB4C-7597-4215-82F0-B9F44DD4BF4E_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"165.0\" y=\"930.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-3244E144-1EEF-41FA-95CE-10793EE0CF2A\" id=\"sid-3244E144-1EEF-41FA-95CE-10793EE0CF2A_gui\" isExpanded=\"true\">\n            <omgdc:Bounds height=\"160.0\" width=\"200.0\" x=\"135.0\" y=\"1070.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-385de329-bbfa-4618-8f2d-bffca39d9f50\">\n               <omgdc:Bounds height=\"24.0\" width=\"180.85714721679688\" x=\"143.0\" y=\"1080.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-01D24CC5-B9ED-4EDB-8DDC-5FC437017FCA\" id=\"sid-01D24CC5-B9ED-4EDB-8DDC-5FC437017FCA_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"165.0\" y=\"1135.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-688214F1-CA73-4689-8175-A17C8206F59A\" id=\"sid-688214F1-CA73-4689-8175-A17C8206F59A_gui\" isExpanded=\"true\">\n            <omgdc:Bounds height=\"160.0\" width=\"200.0\" x=\"485.0\" y=\"1070.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-385de329-bbfa-4618-8f2d-bffca39d9f50\">\n               <omgdc:Bounds height=\"24.0\" width=\"147.42857360839844\" x=\"493.0\" y=\"1080.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-0C9AA152-894E-484F-B5FE-0BCEF139F9F2\" id=\"sid-0C9AA152-894E-484F-B5FE-0BCEF139F9F2_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"515.0\" y=\"1135.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-4BDB6240-A88E-4287-B123-B39BF94B0E42\" id=\"sid-4BDB6240-A88E-4287-B123-B39BF94B0E42_gui\" isExpanded=\"true\">\n            <omgdc:Bounds height=\"160.0\" width=\"200.0\" x=\"135.0\" y=\"1275.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-385de329-bbfa-4618-8f2d-bffca39d9f50\">\n               <omgdc:Bounds height=\"24.0\" width=\"180.85714721679688\" x=\"143.0\" y=\"1285.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-E02E9A35-5626-4BB9-9145-A6DEDEB65E9B\" id=\"sid-E02E9A35-5626-4BB9-9145-A6DEDEB65E9B_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"165.0\" y=\"1340.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-CDF5EF19-02A6-417E-B907-F2962D279C40\" id=\"sid-CDF5EF19-02A6-417E-B907-F2962D279C40_gui\" isExpanded=\"true\">\n            <omgdc:Bounds height=\"160.0\" width=\"200.0\" x=\"135.0\" y=\"1480.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-385de329-bbfa-4618-8f2d-bffca39d9f50\">\n               <omgdc:Bounds height=\"24.0\" width=\"180.85714721679688\" x=\"143.0\" y=\"1490.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-43A95C1E-337E-45E0-AC6B-2F2F28CA62DC\" id=\"sid-43A95C1E-337E-45E0-AC6B-2F2F28CA62DC_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"165.0\" y=\"1545.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-CAB21AF6-204C-4262-8B5E-6A69E84A3B8C\" id=\"sid-CAB21AF6-204C-4262-8B5E-6A69E84A3B8C_gui\" isExpanded=\"true\">\n            <omgdc:Bounds height=\"160.0\" width=\"200.0\" x=\"485.0\" y=\"1480.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-385de329-bbfa-4618-8f2d-bffca39d9f50\">\n               <omgdc:Bounds height=\"24.0\" width=\"138.0\" x=\"493.0\" y=\"1490.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-8E05E835-1F9D-4F74-8A11-E78B9B143890\" id=\"sid-8E05E835-1F9D-4F74-8A11-E78B9B143890_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"515.0\" y=\"1545.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-D4CD7F53-3527-4AB6-8272-712F94CBC6AC\" id=\"sid-D4CD7F53-3527-4AB6-8272-712F94CBC6AC_gui\" isExpanded=\"true\">\n            <omgdc:Bounds height=\"160.0\" width=\"200.0\" x=\"135.0\" y=\"1685.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-385de329-bbfa-4618-8f2d-bffca39d9f50\">\n               <omgdc:Bounds height=\"24.0\" width=\"180.85714721679688\" x=\"143.0\" y=\"1695.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-8A864C5D-ACB1-46EC-A61E-2E40F7A338C0\" id=\"sid-8A864C5D-ACB1-46EC-A61E-2E40F7A338C0_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"165.0\" y=\"1750.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-3AA65260-1EFB-4E71-9DD5-34EA03295029\" id=\"sid-3AA65260-1EFB-4E71-9DD5-34EA03295029_gui\" isExpanded=\"true\">\n            <omgdc:Bounds height=\"160.0\" width=\"200.0\" x=\"485.0\" y=\"1685.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-385de329-bbfa-4618-8f2d-bffca39d9f50\">\n               <omgdc:Bounds height=\"24.0\" width=\"176.57142639160156\" x=\"493.0\" y=\"1695.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-897DF4F2-CF88-4B64-BD28-A18523F9D9F6\" id=\"sid-897DF4F2-CF88-4B64-BD28-A18523F9D9F6_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"515.0\" y=\"1750.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-7AB5E77A-9182-44EA-83C6-8666BA69D14C\" id=\"sid-7AB5E77A-9182-44EA-83C6-8666BA69D14C_gui\">\n            <omgdc:Bounds height=\"50.0\" width=\"127.0\" x=\"535.0\" y=\"920.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-1b8db542-bcc2-4df8-a03b-3eb13dbd52bd\">\n               <omgdc:Bounds height=\"12.0\" width=\"123.42857360839844\" x=\"539.0\" y=\"936.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-D90F1894-EA85-44A2-AC16-C6F03348B6F7\" id=\"sid-D90F1894-EA85-44A2-AC16-C6F03348B6F7_gui\">\n            <omgdc:Bounds height=\"50.0\" width=\"127.0\" x=\"535.0\" y=\"1330.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-1b8db542-bcc2-4df8-a03b-3eb13dbd52bd\">\n               <omgdc:Bounds height=\"12.0\" width=\"123.42857360839844\" x=\"539.0\" y=\"1346.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n      </bpmndi:BPMNPlane>\n      <bpmndi:BPMNLabelStyle id=\"sid-1b8db542-bcc2-4df8-a03b-3eb13dbd52bd\">\n         <omgdc:Font isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\" name=\"Arial\" size=\"11.0\"/>\n      </bpmndi:BPMNLabelStyle>\n      <bpmndi:BPMNLabelStyle id=\"sid-385de329-bbfa-4618-8f2d-bffca39d9f50\">\n         <omgdc:Font isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\" name=\"Arial\" size=\"12.0\"/>\n      </bpmndi:BPMNLabelStyle>\n   </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/events-interrupting.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:signavio=\"http://www.signavio.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" exporter=\"Signavio Process Editor, http://www.signavio.com\" exporterVersion=\"8.0.0\" expressionLanguage=\"http://www.w3.org/1999/XPath\" id=\"sid-28fe24b0-7267-4271-af4d-c2b357de7b29\" targetNamespace=\"http://www.signavio.com/bpmn20\" typeLanguage=\"http://www.w3.org/2001/XMLSchema\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n   <escalation id=\"sid-71027aaf-bb89-4a57-ae78-ea4f64df7a5e\"/>\n   <process id=\"sid-90f178d4-4cc5-4f4d-85ef-61639caf0f68\" isClosed=\"false\" isExecutable=\"false\" processType=\"None\">\n      <extensionElements>\n         <signavio:signavioDiagramMetaData metaKey=\"revisionid\" metaValue=\"334fac7231004769b38a86b31c75a884\"/>\n      </extensionElements>\n      <task completionQuantity=\"1\" id=\"sid-B9E05190-990A-4113-98EE-042A011FDB05\" isForCompensation=\"false\" startQuantity=\"1\">\n         <extensionElements>\n            <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffcc\"/>\n            <signavio:signavioMetaData metaKey=\"adaptereventtype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"documentationlink\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"test\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adaptertype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterconfiguration\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterclassname\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"servicereferenz\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"risiko\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"erteiltfreigabe\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"riskandcontrols\" metaValue=\"\"/>\n         </extensionElements>\n      </task>\n      <task completionQuantity=\"1\" id=\"sid-290FD67F-A4B4-4D2B-AFF9-4CCF002299E7\" isForCompensation=\"false\" startQuantity=\"1\">\n         <extensionElements>\n            <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffcc\"/>\n            <signavio:signavioMetaData metaKey=\"adaptereventtype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"documentationlink\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"test\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adaptertype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterconfiguration\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterclassname\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"servicereferenz\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"risiko\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"erteiltfreigabe\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"riskandcontrols\" metaValue=\"\"/>\n         </extensionElements>\n      </task>\n      <task completionQuantity=\"1\" id=\"sid-CD75630C-A645-40C1-A4B1-0EC9C9D61867\" isForCompensation=\"false\" startQuantity=\"1\">\n         <extensionElements>\n            <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffcc\"/>\n            <signavio:signavioMetaData metaKey=\"adaptereventtype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"documentationlink\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"test\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adaptertype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterconfiguration\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterclassname\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"servicereferenz\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"risiko\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"erteiltfreigabe\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"riskandcontrols\" metaValue=\"\"/>\n         </extensionElements>\n      </task>\n      <task completionQuantity=\"1\" id=\"sid-DD27D6DA-27E3-4059-9611-7B37BDF92C63\" isForCompensation=\"false\" startQuantity=\"1\">\n         <extensionElements>\n            <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffcc\"/>\n            <signavio:signavioMetaData metaKey=\"adaptereventtype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"documentationlink\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"test\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adaptertype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterconfiguration\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterclassname\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"servicereferenz\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"risiko\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"erteiltfreigabe\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"riskandcontrols\" metaValue=\"\"/>\n         </extensionElements>\n      </task>\n      <task completionQuantity=\"1\" id=\"sid-482B2AC1-8125-4DF5-AC4A-B60965F0A9B9\" isForCompensation=\"false\" startQuantity=\"1\">\n         <extensionElements>\n            <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffcc\"/>\n            <signavio:signavioMetaData metaKey=\"adaptereventtype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"documentationlink\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"test\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adaptertype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterconfiguration\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterclassname\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"servicereferenz\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"risiko\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"erteiltfreigabe\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"riskandcontrols\" metaValue=\"\"/>\n         </extensionElements>\n      </task>\n      <task completionQuantity=\"1\" id=\"sid-2479E87C-7D73-4FFC-8106-61820F27D33A\" isForCompensation=\"false\" startQuantity=\"1\">\n         <extensionElements>\n            <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffcc\"/>\n            <signavio:signavioMetaData metaKey=\"adaptereventtype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"documentationlink\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"test\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adaptertype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterconfiguration\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterclassname\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"servicereferenz\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"risiko\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"erteiltfreigabe\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"riskandcontrols\" metaValue=\"\"/>\n         </extensionElements>\n      </task>\n      <task completionQuantity=\"1\" id=\"sid-5A90B902-8FE0-428F-9797-378E5C56DCD6\" isForCompensation=\"false\" startQuantity=\"1\">\n         <extensionElements>\n            <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffcc\"/>\n            <signavio:signavioMetaData metaKey=\"adaptereventtype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"documentationlink\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"test\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adaptertype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterconfiguration\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterclassname\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"servicereferenz\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"risiko\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"erteiltfreigabe\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"riskandcontrols\" metaValue=\"\"/>\n         </extensionElements>\n      </task>\n      <boundaryEvent attachedToRef=\"sid-290FD67F-A4B4-4D2B-AFF9-4CCF002299E7\" cancelActivity=\"false\" id=\"sid-588DF04B-0AD5-4D92-8AEE-F70C01A8DC9A\" parallelMultiple=\"false\">\n         <timerEventDefinition id=\"sid-28518ca2-9158-41ca-a947-fc5ee4eaab82\"/>\n      </boundaryEvent>\n      <boundaryEvent attachedToRef=\"sid-B9E05190-990A-4113-98EE-042A011FDB05\" cancelActivity=\"false\" id=\"sid-48BB5AA5-628C-4E0B-B1A8-726EBCAEBEF4\" parallelMultiple=\"false\">\n         <messageEventDefinition id=\"sid-7c2aa1fa-8efe-419e-ac68-ba2d8e4c4eea\"/>\n      </boundaryEvent>\n      <boundaryEvent attachedToRef=\"sid-CD75630C-A645-40C1-A4B1-0EC9C9D61867\" cancelActivity=\"false\" id=\"sid-C1F13E31-1521-42BF-810C-B6FF004D5086\" parallelMultiple=\"false\">\n         <escalationEventDefinition escalationRef=\"sid-71027aaf-bb89-4a57-ae78-ea4f64df7a5e\" id=\"sid-550fbd09-4d0c-4138-8e8c-fd9140013f03\"/>\n      </boundaryEvent>\n      <boundaryEvent attachedToRef=\"sid-DD27D6DA-27E3-4059-9611-7B37BDF92C63\" cancelActivity=\"false\" id=\"sid-22A352D4-D2DE-47F3-8B20-3FDB02531168\" parallelMultiple=\"false\">\n         <conditionalEventDefinition id=\"sid-f2d346d6-984f-4826-adb7-7c31a26c06ad\">\n            <condition id=\"sid-287ba050-0199-4f82-9eea-f849ae6d87ee\" xsi:type=\"tFormalExpression\"/>\n         </conditionalEventDefinition>\n      </boundaryEvent>\n      <boundaryEvent attachedToRef=\"sid-482B2AC1-8125-4DF5-AC4A-B60965F0A9B9\" cancelActivity=\"false\" id=\"sid-0D51AD08-E4ED-4675-B6AF-F24D398341AD\" parallelMultiple=\"false\">\n         <signalEventDefinition id=\"sid-8a412e9f-2f6a-45c3-9ded-201e99bd2468\"/>\n      </boundaryEvent>\n      <boundaryEvent attachedToRef=\"sid-2479E87C-7D73-4FFC-8106-61820F27D33A\" cancelActivity=\"false\" id=\"sid-FCC61D8E-6297-4D8E-9F68-BECC2B531F4D\" parallelMultiple=\"false\">\n         <cancelEventDefinition id=\"sid-066f21cb-ff3d-4b88-9e43-8937283324d0\"/>\n         <terminateEventDefinition id=\"sid-d4798490-b688-4fb2-81e6-39b420772c3a\"/>\n      </boundaryEvent>\n      <boundaryEvent attachedToRef=\"sid-5A90B902-8FE0-428F-9797-378E5C56DCD6\" cancelActivity=\"false\" id=\"sid-CCE099E5-D176-44CD-B644-5D8757B1B169\" parallelMultiple=\"true\">\n         <cancelEventDefinition id=\"sid-644b1b00-00f7-41da-8f2a-9202f0bfa6c7\"/>\n         <terminateEventDefinition id=\"sid-0c80c9ca-2050-44f7-8cda-02658de64156\"/>\n      </boundaryEvent>\n      <task completionQuantity=\"1\" id=\"sid-6983CAAD-9D69-4E1A-AD58-18CCFB7C1F88\" isForCompensation=\"false\" startQuantity=\"1\">\n         <extensionElements>\n            <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffcc\"/>\n            <signavio:signavioMetaData metaKey=\"adaptereventtype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"documentationlink\" metaValue=\"[]\"/>\n            <signavio:signavioMetaData metaKey=\"test\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adaptertype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"[]\"/>\n            <signavio:signavioMetaData metaKey=\"adapterconfiguration\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterclassname\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"servicereferenz\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"risiko\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"erteiltfreigabe\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"riskandcontrols\" metaValue=\"\"/>\n         </extensionElements>\n      </task>\n      <task completionQuantity=\"1\" id=\"sid-EFA4CC73-4242-4CAC-AFA9-733AD8F71BD6\" isForCompensation=\"false\" startQuantity=\"1\">\n         <extensionElements>\n            <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffcc\"/>\n            <signavio:signavioMetaData metaKey=\"adaptereventtype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"documentationlink\" metaValue=\"[]\"/>\n            <signavio:signavioMetaData metaKey=\"test\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adaptertype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"[]\"/>\n            <signavio:signavioMetaData metaKey=\"adapterconfiguration\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterclassname\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"servicereferenz\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"risiko\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"erteiltfreigabe\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"riskandcontrols\" metaValue=\"\"/>\n         </extensionElements>\n      </task>\n      <task completionQuantity=\"1\" id=\"sid-2783FCF2-7F46-4A80-BA09-1E8264463588\" isForCompensation=\"false\" startQuantity=\"1\">\n         <extensionElements>\n            <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffcc\"/>\n            <signavio:signavioMetaData metaKey=\"adaptereventtype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"documentationlink\" metaValue=\"[]\"/>\n            <signavio:signavioMetaData metaKey=\"test\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adaptertype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"[]\"/>\n            <signavio:signavioMetaData metaKey=\"adapterconfiguration\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterclassname\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"servicereferenz\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"risiko\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"erteiltfreigabe\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"riskandcontrols\" metaValue=\"\"/>\n         </extensionElements>\n      </task>\n      <task completionQuantity=\"1\" id=\"sid-5431F88D-C66D-45C9-8CE7-5E4D22F793DE\" isForCompensation=\"false\" startQuantity=\"1\">\n         <extensionElements>\n            <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffcc\"/>\n            <signavio:signavioMetaData metaKey=\"adaptereventtype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"documentationlink\" metaValue=\"[]\"/>\n            <signavio:signavioMetaData metaKey=\"test\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adaptertype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"[]\"/>\n            <signavio:signavioMetaData metaKey=\"adapterconfiguration\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterclassname\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"servicereferenz\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"risiko\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"erteiltfreigabe\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"riskandcontrols\" metaValue=\"\"/>\n         </extensionElements>\n      </task>\n      <task completionQuantity=\"1\" id=\"sid-A7EDA48D-240B-4A29-B0B4-13604A9DEB5D\" isForCompensation=\"false\" startQuantity=\"1\">\n         <extensionElements>\n            <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffcc\"/>\n            <signavio:signavioMetaData metaKey=\"adaptereventtype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"documentationlink\" metaValue=\"[]\"/>\n            <signavio:signavioMetaData metaKey=\"test\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adaptertype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"[]\"/>\n            <signavio:signavioMetaData metaKey=\"adapterconfiguration\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterclassname\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"servicereferenz\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"risiko\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"erteiltfreigabe\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"riskandcontrols\" metaValue=\"\"/>\n         </extensionElements>\n      </task>\n      <task completionQuantity=\"1\" id=\"sid-BDF1A174-F448-4946-B697-D564604B231F\" isForCompensation=\"false\" startQuantity=\"1\">\n         <extensionElements>\n            <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffcc\"/>\n            <signavio:signavioMetaData metaKey=\"adaptereventtype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"documentationlink\" metaValue=\"[]\"/>\n            <signavio:signavioMetaData metaKey=\"test\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adaptertype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"[]\"/>\n            <signavio:signavioMetaData metaKey=\"adapterconfiguration\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterclassname\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"servicereferenz\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"risiko\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"erteiltfreigabe\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"riskandcontrols\" metaValue=\"\"/>\n         </extensionElements>\n      </task>\n      <task completionQuantity=\"1\" id=\"sid-ADD608E3-4265-4DBD-967E-0A2369A1E3E5\" isForCompensation=\"false\" startQuantity=\"1\">\n         <extensionElements>\n            <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffcc\"/>\n            <signavio:signavioMetaData metaKey=\"adaptereventtype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"documentationlink\" metaValue=\"[]\"/>\n            <signavio:signavioMetaData metaKey=\"test\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adaptertype\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"[]\"/>\n            <signavio:signavioMetaData metaKey=\"adapterconfiguration\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"adapterclassname\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"servicereferenz\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"risiko\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"erteiltfreigabe\" metaValue=\"\"/>\n            <signavio:signavioMetaData metaKey=\"riskandcontrols\" metaValue=\"\"/>\n         </extensionElements>\n      </task>\n      <boundaryEvent attachedToRef=\"sid-EFA4CC73-4242-4CAC-AFA9-733AD8F71BD6\" cancelActivity=\"true\" id=\"sid-6AEC94E5-AF00-445C-966D-6FF6996C165A\" parallelMultiple=\"false\">\n         <timerEventDefinition id=\"sid-3d54db36-c6d9-4c81-be5a-cee3baacabfd\"/>\n      </boundaryEvent>\n      <boundaryEvent attachedToRef=\"sid-6983CAAD-9D69-4E1A-AD58-18CCFB7C1F88\" cancelActivity=\"true\" id=\"sid-F96FC963-DDD3-4C86-B9F2-80809657DFA5\" parallelMultiple=\"false\">\n         <messageEventDefinition id=\"sid-4eb3c097-5551-4b9a-af2c-ee5713fca662\"/>\n      </boundaryEvent>\n      <boundaryEvent attachedToRef=\"sid-2783FCF2-7F46-4A80-BA09-1E8264463588\" cancelActivity=\"true\" id=\"sid-0D8CFB92-BF72-466A-B734-4C0005891761\" parallelMultiple=\"false\">\n         <escalationEventDefinition escalationRef=\"sid-71027aaf-bb89-4a57-ae78-ea4f64df7a5e\" id=\"sid-a3951bc6-594e-45b3-aa21-d262538e45cd\"/>\n      </boundaryEvent>\n      <boundaryEvent attachedToRef=\"sid-5431F88D-C66D-45C9-8CE7-5E4D22F793DE\" cancelActivity=\"true\" id=\"sid-74B9A16B-35DB-446B-976B-45DA9D1DA86E\" parallelMultiple=\"false\">\n         <conditionalEventDefinition id=\"sid-8e01c6ba-4892-4833-80bb-220b6ecfaed0\">\n            <condition id=\"sid-5a136ee8-9468-4865-82b8-e275c94d44b4\" xsi:type=\"tFormalExpression\"/>\n         </conditionalEventDefinition>\n      </boundaryEvent>\n      <boundaryEvent attachedToRef=\"sid-A7EDA48D-240B-4A29-B0B4-13604A9DEB5D\" cancelActivity=\"true\" id=\"sid-58D6FF7E-492C-4801-B6BE-348D45D56700\" parallelMultiple=\"false\">\n         <signalEventDefinition id=\"sid-f55dfc2d-0890-410c-bd41-2d8e441218fc\"/>\n      </boundaryEvent>\n      <boundaryEvent attachedToRef=\"sid-BDF1A174-F448-4946-B697-D564604B231F\" cancelActivity=\"true\" id=\"sid-8746C67E-3C73-4EB8-AD08-3990CD55616B\" parallelMultiple=\"false\">\n         <cancelEventDefinition id=\"sid-b0887708-8027-436e-a3b8-a5705965467a\"/>\n         <terminateEventDefinition id=\"sid-0629aa02-53a6-4485-ae7f-1f9cc77e9e7a\"/>\n      </boundaryEvent>\n      <boundaryEvent attachedToRef=\"sid-ADD608E3-4265-4DBD-967E-0A2369A1E3E5\" cancelActivity=\"true\" id=\"sid-840DEE60-CB81-4254-901E-29793B663317\" parallelMultiple=\"true\">\n         <cancelEventDefinition id=\"sid-04e0eab1-7b92-47b7-bb66-0ee77f790ee6\"/>\n         <terminateEventDefinition id=\"sid-fcd5078e-d0d7-4fe2-90d4-9d62e794ffad\"/>\n      </boundaryEvent>\n   </process>\n   <bpmndi:BPMNDiagram id=\"sid-6ba7ca40-4334-4081-a5c7-8678ea411e03\">\n      <bpmndi:BPMNPlane bpmnElement=\"sid-90f178d4-4cc5-4f4d-85ef-61639caf0f68\" id=\"sid-93576136-949c-4966-a675-7942450a3a0c\">\n         <bpmndi:BPMNShape bpmnElement=\"sid-B9E05190-990A-4113-98EE-042A011FDB05\" id=\"sid-B9E05190-990A-4113-98EE-042A011FDB05_gui\">\n            <omgdc:Bounds height=\"63.0\" width=\"99.99999999999994\" x=\"150.0\" y=\"60.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-290FD67F-A4B4-4D2B-AFF9-4CCF002299E7\" id=\"sid-290FD67F-A4B4-4D2B-AFF9-4CCF002299E7_gui\">\n            <omgdc:Bounds height=\"63.0\" width=\"99.99999999999994\" x=\"150.0\" y=\"168.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-CD75630C-A645-40C1-A4B1-0EC9C9D61867\" id=\"sid-CD75630C-A645-40C1-A4B1-0EC9C9D61867_gui\">\n            <omgdc:Bounds height=\"63.0\" width=\"100.0\" x=\"151.08194403121246\" y=\"278.0241163530496\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-DD27D6DA-27E3-4059-9611-7B37BDF92C63\" id=\"sid-DD27D6DA-27E3-4059-9611-7B37BDF92C63_gui\">\n            <omgdc:Bounds height=\"63.0\" width=\"100.0\" x=\"294.99999999999994\" y=\"60.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-482B2AC1-8125-4DF5-AC4A-B60965F0A9B9\" id=\"sid-482B2AC1-8125-4DF5-AC4A-B60965F0A9B9_gui\">\n            <omgdc:Bounds height=\"63.0\" width=\"100.0\" x=\"294.99999999999994\" y=\"168.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-2479E87C-7D73-4FFC-8106-61820F27D33A\" id=\"sid-2479E87C-7D73-4FFC-8106-61820F27D33A_gui\">\n            <omgdc:Bounds height=\"63.0\" width=\"100.0\" x=\"294.715517922943\" y=\"278.0241163530496\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-5A90B902-8FE0-428F-9797-378E5C56DCD6\" id=\"sid-5A90B902-8FE0-428F-9797-378E5C56DCD6_gui\">\n            <omgdc:Bounds height=\"63.0\" width=\"100.0\" x=\"294.715517922943\" y=\"386.0241163530496\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-588DF04B-0AD5-4D92-8AEE-F70C01A8DC9A\" id=\"sid-588DF04B-0AD5-4D92-8AEE-F70C01A8DC9A_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"186.0677966101693\" y=\"216.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-48BB5AA5-628C-4E0B-B1A8-726EBCAEBEF4\" id=\"sid-48BB5AA5-628C-4E0B-B1A8-726EBCAEBEF4_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"181.7966101694915\" y=\"108.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-C1F13E31-1521-42BF-810C-B6FF004D5086\" id=\"sid-C1F13E31-1521-42BF-810C-B6FF004D5086_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"186.29390048829117\" y=\"326.0241163530496\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-22A352D4-D2DE-47F3-8B20-3FDB02531168\" id=\"sid-22A352D4-D2DE-47F3-8B20-3FDB02531168_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"329.90613683697467\" y=\"108.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-0D51AD08-E4ED-4675-B6AF-F24D398341AD\" id=\"sid-0D51AD08-E4ED-4675-B6AF-F24D398341AD_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"329.7239768445989\" y=\"216.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-FCC61D8E-6297-4D8E-9F68-BECC2B531F4D\" id=\"sid-FCC61D8E-6297-4D8E-9F68-BECC2B531F4D_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"331.83726992073485\" y=\"326.0241163530496\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-CCE099E5-D176-44CD-B644-5D8757B1B169\" id=\"sid-CCE099E5-D176-44CD-B644-5D8757B1B169_gui\">\n            <omgdc:Bounds height=\"29.999999999999943\" width=\"30.0\" x=\"331.8798495207971\" y=\"434.02411635304964\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-6983CAAD-9D69-4E1A-AD58-18CCFB7C1F88\" id=\"sid-6983CAAD-9D69-4E1A-AD58-18CCFB7C1F88_gui\">\n            <omgdc:Bounds height=\"63.0\" width=\"100.00000000000006\" x=\"439.715517922943\" y=\"60.00000000000006\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-EFA4CC73-4242-4CAC-AFA9-733AD8F71BD6\" id=\"sid-EFA4CC73-4242-4CAC-AFA9-733AD8F71BD6_gui\">\n            <omgdc:Bounds height=\"63.0\" width=\"100.00000000000006\" x=\"439.715517922943\" y=\"168.00000000000006\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-2783FCF2-7F46-4A80-BA09-1E8264463588\" id=\"sid-2783FCF2-7F46-4A80-BA09-1E8264463588_gui\">\n            <omgdc:Bounds height=\"62.99999999999994\" width=\"100.00000000000006\" x=\"440.7974619541555\" y=\"278.02411635304964\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-5431F88D-C66D-45C9-8CE7-5E4D22F793DE\" id=\"sid-5431F88D-C66D-45C9-8CE7-5E4D22F793DE_gui\">\n            <omgdc:Bounds height=\"63.0\" width=\"100.0\" x=\"584.715517922943\" y=\"60.00000000000006\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-A7EDA48D-240B-4A29-B0B4-13604A9DEB5D\" id=\"sid-A7EDA48D-240B-4A29-B0B4-13604A9DEB5D_gui\">\n            <omgdc:Bounds height=\"63.0\" width=\"100.0\" x=\"584.715517922943\" y=\"168.00000000000006\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-BDF1A174-F448-4946-B697-D564604B231F\" id=\"sid-BDF1A174-F448-4946-B697-D564604B231F_gui\">\n            <omgdc:Bounds height=\"62.99999999999994\" width=\"100.0\" x=\"584.4310358458861\" y=\"278.02411635304964\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-ADD608E3-4265-4DBD-967E-0A2369A1E3E5\" id=\"sid-ADD608E3-4265-4DBD-967E-0A2369A1E3E5_gui\">\n            <omgdc:Bounds height=\"63.0\" width=\"100.0\" x=\"584.4310358458861\" y=\"386.0241163530496\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-6AEC94E5-AF00-445C-966D-6FF6996C165A\" id=\"sid-6AEC94E5-AF00-445C-966D-6FF6996C165A_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"475.78331453311233\" y=\"216.00000000000006\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-F96FC963-DDD3-4C86-B9F2-80809657DFA5\" id=\"sid-F96FC963-DDD3-4C86-B9F2-80809657DFA5_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"471.5121280924345\" y=\"108.00000000000006\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-0D8CFB92-BF72-466A-B734-4C0005891761\" id=\"sid-0D8CFB92-BF72-466A-B734-4C0005891761_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"476.00941841123426\" y=\"326.0241163530496\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-74B9A16B-35DB-446B-976B-45DA9D1DA86E\" id=\"sid-74B9A16B-35DB-446B-976B-45DA9D1DA86E_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"619.6216547599178\" y=\"108.00000000000006\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-58D6FF7E-492C-4801-B6BE-348D45D56700\" id=\"sid-58D6FF7E-492C-4801-B6BE-348D45D56700_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"619.439494767542\" y=\"216.00000000000006\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-8746C67E-3C73-4EB8-AD08-3990CD55616B\" id=\"sid-8746C67E-3C73-4EB8-AD08-3990CD55616B_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"621.552787843678\" y=\"326.0241163530496\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-840DEE60-CB81-4254-901E-29793B663317\" id=\"sid-840DEE60-CB81-4254-901E-29793B663317_gui\">\n            <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"621.5953674437402\" y=\"434.0241163530496\"/>\n         </bpmndi:BPMNShape>\n      </bpmndi:BPMNPlane>\n   </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/events.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" targetNamespace=\"http://activiti.org/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"4.0.0-beta.1\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n  <error id=\"sid-6344ba50-c8ea-4d51-8f22-ad7e6c1b34d2\" />\n  <escalation id=\"sid-3a003af1-ec01-4aea-81af-a76ba91c6961\" />\n  <process id=\"Process_1\" processType=\"None\" isClosed=\"false\" isExecutable=\"false\">\n    <startEvent id=\"StartEvent_1\" />\n    <startEvent id=\"StartEvent_2\">\n      <messageEventDefinition id=\"sid-40ee6314-63d0-4452-8f33-f345b9f70a96\" />\n    </startEvent>\n    <startEvent id=\"StartEvent_3\">\n      <timerEventDefinition id=\"sid-c380640e-c8c9-4913-9355-2415774d17eb\" />\n    </startEvent>\n    <startEvent id=\"StartEvent_5\">\n      <conditionalEventDefinition id=\"sid-1c99a5d3-1295-41b2-9859-418fe6cee5d8\">\n        <condition xsi:type=\"tFormalExpression\" id=\"sid-247ea21d-9dbf-4ade-857b-f99550ee55d7\" />\n      </conditionalEventDefinition>\n    </startEvent>\n    <startEvent id=\"StartEvent_7\">\n      <signalEventDefinition id=\"sid-dca551b2-a494-4b12-8255-b7045dbe07a3\" />\n    </startEvent>\n    <startEvent id=\"StartEvent_8\">\n      <cancelEventDefinition id=\"sid-5ea19b48-6524-469d-84d1-dec3c1ba43ea\" />\n      <terminateEventDefinition id=\"sid-cd250788-2e35-4b40-90ef-73065eb10d3d\" />\n    </startEvent>\n    <startEvent id=\"StartEvent_9\" parallelMultiple=\"true\">\n      <cancelEventDefinition id=\"sid-110f9f87-9cd5-47bd-b603-5378b74c5668\" />\n      <terminateEventDefinition id=\"sid-bfde5429-336c-4458-82f5-976b46270675\" />\n    </startEvent>\n    <intermediateCatchEvent id=\"sid-40402034-C397-40FD-AED1-755C37533C0F\">\n      <linkEventDefinition id=\"sid-5c16c0a6-6772-42a0-a808-5d9db1b95e72\" />\n    </intermediateCatchEvent>\n    <intermediateCatchEvent id=\"sid-AABB301D-7747-4FC8-8E91-172B5AF8CA90\">\n      <cancelEventDefinition id=\"sid-3f0463c7-993a-40d2-b338-02767db9f147\" />\n    </intermediateCatchEvent>\n    <intermediateCatchEvent id=\"sid-0B617D4E-6562-416B-8175-CA39E780E8E1\">\n      <compensateEventDefinition id=\"sid-8612d33a-223b-4b9a-a48c-5e5fe2dcfbf9\" />\n    </intermediateCatchEvent>\n    <intermediateCatchEvent id=\"sid-5BEC06E6-40ED-43A4-99D8-E1E8A27F5ECB\">\n      <signalEventDefinition id=\"sid-de198c97-f295-44e8-b44d-671797f43811\" />\n    </intermediateCatchEvent>\n    <intermediateCatchEvent id=\"sid-5799FA30-5182-4D2A-84DB-37986AE56D24\">\n      <errorEventDefinition id=\"sid-df96c802-730b-455f-a843-968588290742\" errorRef=\"sid-6344ba50-c8ea-4d51-8f22-ad7e6c1b34d2\" />\n    </intermediateCatchEvent>\n    <intermediateCatchEvent id=\"sid-7C6CA2F3-6B02-4178-B1C8-7A479BEA434C\">\n      <conditionalEventDefinition id=\"sid-db6fd387-6cf6-43e3-9aa7-691333a21362\">\n        <condition xsi:type=\"tFormalExpression\" id=\"sid-fe1c9c87-859c-4d90-94dd-4820f0099629\" />\n      </conditionalEventDefinition>\n    </intermediateCatchEvent>\n    <intermediateCatchEvent id=\"sid-41E98E3E-9EEB-43E2-B1EA-4802BC3CF842\">\n      <timerEventDefinition id=\"sid-153c1db4-e6d3-4f4b-83a6-fa1eeff24547\" />\n    </intermediateCatchEvent>\n    <intermediateCatchEvent id=\"sid-42D26EF4-4F92-4E29-B1C4-EFDAC7508DBD\">\n      <messageEventDefinition id=\"sid-70b1c4ba-5271-46a8-9d56-febc50c3e50b\" />\n    </intermediateCatchEvent>\n    <intermediateCatchEvent id=\"sid-17328A9A-301B-4EF2-ABF9-E2E145ED0549\">\n      <signalEventDefinition id=\"sid-b3a8d5e8-adee-49a4-8dd2-6d3cfbe99b86\" />\n    </intermediateCatchEvent>\n    <intermediateCatchEvent id=\"sid-7241EBB1-F107-49BF-AAB9-9464259032EF\">\n      <cancelEventDefinition id=\"sid-a7fdbe5d-c553-4918-a06e-8a2fb1d325a7\" />\n      <terminateEventDefinition id=\"sid-582a8ead-bdc6-4515-9cfc-4d404f4b3f8d\" />\n    </intermediateCatchEvent>\n    <intermediateCatchEvent id=\"sid-34662690-DE7A-4690-8D3A-98341D994818\" parallelMultiple=\"true\">\n      <cancelEventDefinition id=\"sid-47fcb56a-290a-43e6-8413-847ba757c4b0\" />\n      <terminateEventDefinition id=\"sid-fcf9201a-d1ae-4115-948e-b46031019ee8\" />\n    </intermediateCatchEvent>\n    <intermediateCatchEvent id=\"sid-7CEA4F44-9B19-423D-AA8A-EA21D361273E\">\n      <cancelEventDefinition id=\"sid-2f3d0c6a-7814-4f24-b285-cee275bfe691\" />\n      <terminateEventDefinition id=\"sid-a5e2e985-64d4-45f8-b017-a26a66e0355d\" />\n    </intermediateCatchEvent>\n    <intermediateCatchEvent id=\"sid-57679FBD-7C91-4FFC-A005-E80D6B573708\" parallelMultiple=\"true\">\n      <cancelEventDefinition id=\"sid-4c85a5f8-bc89-48f4-9b3d-4d4953353c1f\" />\n      <terminateEventDefinition id=\"sid-612d291d-8e94-4e2a-b810-287e6eda01d9\" />\n    </intermediateCatchEvent>\n    <intermediateCatchEvent id=\"sid-4105C91C-28F5-4E7A-9F5B-7C949FFDF50A\">\n      <conditionalEventDefinition id=\"sid-b4bca1a0-a8a3-4dcd-8e90-02b99bf5d571\">\n        <condition xsi:type=\"tFormalExpression\" id=\"sid-0f9ec2a9-4853-4f74-9855-33af747860ea\" />\n      </conditionalEventDefinition>\n    </intermediateCatchEvent>\n    <intermediateCatchEvent id=\"sid-89D80A59-F865-4A36-BC61-4A9D81205A4A\">\n      <timerEventDefinition id=\"sid-0de38389-dd07-472a-bf22-6fb58b6f87c1\" />\n    </intermediateCatchEvent>\n    <intermediateCatchEvent id=\"sid-FB3E4A75-2D37-4C17-83BC-1A2738E84EB8\">\n      <messageEventDefinition id=\"sid-52c1c04a-4156-4751-9365-32b00d9e6c99\" />\n    </intermediateCatchEvent>\n    <intermediateCatchEvent id=\"sid-90E968EF-F90A-4DE6-B282-099FC460A3A9\">\n      <escalationEventDefinition id=\"sid-8684fabb-f5a9-4431-86af-fb5517c192dd\" escalationRef=\"sid-3a003af1-ec01-4aea-81af-a76ba91c6961\" />\n    </intermediateCatchEvent>\n    <intermediateThrowEvent id=\"sid-7AFC42BA-037D-4917-8E1E-B92140171DAC\" />\n    <intermediateThrowEvent id=\"sid-1918E9CF-6A08-49C2-AB7B-0AD7E828F39F\">\n      <messageEventDefinition id=\"sid-24fd1efa-8d1f-4157-b7f8-2d570533bd75\" />\n    </intermediateThrowEvent>\n    <intermediateThrowEvent id=\"sid-8B0C50D7-BF10-4068-85AB-0FEE53FAA9CD\">\n      <escalationEventDefinition id=\"sid-833816c3-507f-469f-99da-167111b0964c\" escalationRef=\"sid-3a003af1-ec01-4aea-81af-a76ba91c6961\" />\n    </intermediateThrowEvent>\n    <intermediateThrowEvent id=\"sid-B8015046-799E-4F2C-9C94-BEFC0891AD1C\">\n      <linkEventDefinition id=\"sid-14381611-1d76-431f-acc6-ba0bd590b942\" />\n    </intermediateThrowEvent>\n    <intermediateThrowEvent id=\"sid-8182F856-0633-42AE-A3A6-93787DCA1B08\">\n      <compensateEventDefinition id=\"sid-e3872927-213d-44ad-8249-0377bf0f040c\" />\n    </intermediateThrowEvent>\n    <intermediateThrowEvent id=\"sid-94090D41-BCC6-4A25-BC8C-B01651B1AEA2\">\n      <cancelEventDefinition id=\"sid-241c2f44-c357-4e8e-8cec-83c157120790\" />\n      <terminateEventDefinition id=\"sid-8e895c8c-d5de-4475-a08a-962b7bcf1e4f\" />\n    </intermediateThrowEvent>\n    <endEvent id=\"sid-F4149C86-DCE0-49F5-817F-F90502A52B57\" />\n    <endEvent id=\"sid-2FF9A1B9-F51D-4958-9988-5F28F4A3621E\">\n      <messageEventDefinition id=\"sid-b4826cb5-af6c-4059-9724-302c44f5a6a8\" />\n    </endEvent>\n    <endEvent id=\"sid-1772321F-86B6-476A-BBA4-ACEA1C12BD89\">\n      <escalationEventDefinition id=\"sid-36cbde32-2e39-4f73-84e9-49b2b7bb9b0e\" escalationRef=\"sid-3a003af1-ec01-4aea-81af-a76ba91c6961\" />\n    </endEvent>\n    <endEvent id=\"sid-874BAFF0-BDA7-4A60-A9A7-3A4F6CD084BF\">\n      <errorEventDefinition id=\"sid-f0ca1f33-2398-4bab-9a0f-d3c9a9e38a05\" errorRef=\"sid-6344ba50-c8ea-4d51-8f22-ad7e6c1b34d2\" />\n    </endEvent>\n    <endEvent id=\"sid-E19E0FDE-CA8F-4D87-9BA0-4F314C38AEF2\">\n      <compensateEventDefinition id=\"sid-558262ad-20ba-4bed-8257-1ff83134080a\" />\n    </endEvent>\n    <endEvent id=\"sid-4A829101-E797-434D-8E79-0BA8AA2C7BFE\">\n      <terminateEventDefinition id=\"sid-c4a7b8e3-e845-4deb-a9b1-dd3458deb269\" />\n    </endEvent>\n    <endEvent id=\"sid-CFD33E95-E5DD-4019-A547-92185E9E2CB2\">\n      <signalEventDefinition id=\"sid-1944d9fb-14ea-4874-a6c8-e52fb14553a8\" />\n    </endEvent>\n    <intermediateThrowEvent id=\"sid-D545FC26-CAA8-4401-863D-5CCE28916373\">\n      <signalEventDefinition id=\"sid-9b728070-ec1f-4146-91aa-2de370cecd55\" />\n    </intermediateThrowEvent>\n    <endEvent id=\"EndEvent_0tso181\" />\n    <endEvent id=\"EndEvent_13snmqg\" />\n    <startEvent id=\"StartEvent_multiple_1\">\n      <messageEventDefinition />\n      <bpmn:signalEventDefinition />\n    </startEvent>\n    <startEvent id=\"StartEvent_multiple_parallel_1\" parallelMultiple=\"true\">\n      <messageEventDefinition />\n      <signalEventDefinition />\n    </startEvent>\n    <intermediateCatchEvent id=\"IntermediateCatchEvent_multiple_1\">\n      <messageEventDefinition />\n      <signalEventDefinition />\n    </intermediateCatchEvent>\n    <intermediateCatchEvent id=\"IntermediateCatchEvent_multiple_parallel_1\" parallelMultiple=\"true\">\n      <messageEventDefinition />\n      <signalEventDefinition />\n    </intermediateCatchEvent>\n    <intermediateThrowEvent id=\"IntermediateThrowEvent_multiple_1\">\n      <messageEventDefinition />\n      <signalEventDefinition />\n    </intermediateThrowEvent>\n    <endEvent id=\"EndEvent_multiple_1\">\n      <messageEventDefinition />\n      <signalEventDefinition />\n    </endEvent>\n  </process>\n  <bpmndi:BPMNDiagram id=\"sid-efe607d0-acce-4a74-ac6f-45a3dba73f39\">\n    <bpmndi:BPMNPlane id=\"sid-57a4146e-2ed9-408d-9c6f-93f404648413\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"StartEvent_1_gui\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"158\" y=\"81\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"-6\" y=\"51\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_2_gui\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds x=\"158\" y=\"134\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"-6\" y=\"104\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_3_gui\" bpmnElement=\"StartEvent_3\">\n        <dc:Bounds x=\"158\" y=\"187\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"-6\" y=\"157\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_5_gui\" bpmnElement=\"StartEvent_5\">\n        <dc:Bounds x=\"158\" y=\"289\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"-6\" y=\"259\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_7_gui\" bpmnElement=\"StartEvent_7\">\n        <dc:Bounds x=\"158\" y=\"557\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"-6\" y=\"527\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_8_gui\" bpmnElement=\"StartEvent_8\">\n        <dc:Bounds x=\"157\" y=\"607\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"-7\" y=\"577\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_9_gui\" bpmnElement=\"StartEvent_9\">\n        <dc:Bounds x=\"156\" y=\"659\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"-8\" y=\"629\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-40402034-C397-40FD-AED1-755C37533C0F_gui\" bpmnElement=\"sid-40402034-C397-40FD-AED1-755C37533C0F\">\n        <dc:Bounds x=\"383\" y=\"341\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"218\" y=\"293\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-AABB301D-7747-4FC8-8E91-172B5AF8CA90_gui\" bpmnElement=\"sid-AABB301D-7747-4FC8-8E91-172B5AF8CA90\">\n        <dc:Bounds x=\"457\" y=\"449\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"293\" y=\"400\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-0B617D4E-6562-416B-8175-CA39E780E8E1_gui\" bpmnElement=\"sid-0B617D4E-6562-416B-8175-CA39E780E8E1\">\n        <dc:Bounds x=\"457\" y=\"505\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"293\" y=\"475\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-5BEC06E6-40ED-43A4-99D8-E1E8A27F5ECB_gui\" bpmnElement=\"sid-5BEC06E6-40ED-43A4-99D8-E1E8A27F5ECB\">\n        <dc:Bounds x=\"457\" y=\"557\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"293\" y=\"527\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-5799FA30-5182-4D2A-84DB-37986AE56D24_gui\" bpmnElement=\"sid-5799FA30-5182-4D2A-84DB-37986AE56D24\">\n        <dc:Bounds x=\"457\" y=\"395\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"293\" y=\"344\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-7C6CA2F3-6B02-4178-B1C8-7A479BEA434C_gui\" bpmnElement=\"sid-7C6CA2F3-6B02-4178-B1C8-7A479BEA434C\">\n        <dc:Bounds x=\"383\" y=\"289\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"219\" y=\"259\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-41E98E3E-9EEB-43E2-B1EA-4802BC3CF842_gui\" bpmnElement=\"sid-41E98E3E-9EEB-43E2-B1EA-4802BC3CF842\">\n        <dc:Bounds x=\"382\" y=\"187\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"218\" y=\"157\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-42D26EF4-4F92-4E29-B1C4-EFDAC7508DBD_gui\" bpmnElement=\"sid-42D26EF4-4F92-4E29-B1C4-EFDAC7508DBD\">\n        <dc:Bounds x=\"382\" y=\"134\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"218\" y=\"104\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-17328A9A-301B-4EF2-ABF9-E2E145ED0549_gui\" bpmnElement=\"sid-17328A9A-301B-4EF2-ABF9-E2E145ED0549\">\n        <dc:Bounds x=\"382\" y=\"557\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"218\" y=\"527\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-7241EBB1-F107-49BF-AAB9-9464259032EF_gui\" bpmnElement=\"sid-7241EBB1-F107-49BF-AAB9-9464259032EF\">\n        <dc:Bounds x=\"382\" y=\"607\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"218\" y=\"577\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-34662690-DE7A-4690-8D3A-98341D994818_gui\" bpmnElement=\"sid-34662690-DE7A-4690-8D3A-98341D994818\">\n        <dc:Bounds x=\"382\" y=\"659\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"218\" y=\"629\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-7CEA4F44-9B19-423D-AA8A-EA21D361273E_gui\" bpmnElement=\"sid-7CEA4F44-9B19-423D-AA8A-EA21D361273E\">\n        <dc:Bounds x=\"457\" y=\"607\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"293\" y=\"577\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-57679FBD-7C91-4FFC-A005-E80D6B573708_gui\" bpmnElement=\"sid-57679FBD-7C91-4FFC-A005-E80D6B573708\">\n        <dc:Bounds x=\"457\" y=\"659\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"293\" y=\"629\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-4105C91C-28F5-4E7A-9F5B-7C949FFDF50A_gui\" bpmnElement=\"sid-4105C91C-28F5-4E7A-9F5B-7C949FFDF50A\">\n        <dc:Bounds x=\"458\" y=\"289\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"294\" y=\"259\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-89D80A59-F865-4A36-BC61-4A9D81205A4A_gui\" bpmnElement=\"sid-89D80A59-F865-4A36-BC61-4A9D81205A4A\">\n        <dc:Bounds x=\"457\" y=\"187\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"293\" y=\"157\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-FB3E4A75-2D37-4C17-83BC-1A2738E84EB8_gui\" bpmnElement=\"sid-FB3E4A75-2D37-4C17-83BC-1A2738E84EB8\">\n        <dc:Bounds x=\"457\" y=\"134\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"293\" y=\"104\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-90E968EF-F90A-4DE6-B282-099FC460A3A9_gui\" bpmnElement=\"sid-90E968EF-F90A-4DE6-B282-099FC460A3A9\">\n        <dc:Bounds x=\"458\" y=\"239\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"294\" y=\"209\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-7AFC42BA-037D-4917-8E1E-B92140171DAC_gui\" bpmnElement=\"sid-7AFC42BA-037D-4917-8E1E-B92140171DAC\">\n        <dc:Bounds x=\"607\" y=\"81\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"443\" y=\"51\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-1918E9CF-6A08-49C2-AB7B-0AD7E828F39F_gui\" bpmnElement=\"sid-1918E9CF-6A08-49C2-AB7B-0AD7E828F39F\">\n        <dc:Bounds x=\"607\" y=\"134\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"443\" y=\"104\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-8B0C50D7-BF10-4068-85AB-0FEE53FAA9CD_gui\" bpmnElement=\"sid-8B0C50D7-BF10-4068-85AB-0FEE53FAA9CD\">\n        <dc:Bounds x=\"608\" y=\"239\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"444\" y=\"209\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-B8015046-799E-4F2C-9C94-BEFC0891AD1C_gui\" bpmnElement=\"sid-B8015046-799E-4F2C-9C94-BEFC0891AD1C\">\n        <dc:Bounds x=\"608\" y=\"341\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"443\" y=\"293\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-8182F856-0633-42AE-A3A6-93787DCA1B08_gui\" bpmnElement=\"sid-8182F856-0633-42AE-A3A6-93787DCA1B08\">\n        <dc:Bounds x=\"607\" y=\"505\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"443\" y=\"475\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-94090D41-BCC6-4A25-BC8C-B01651B1AEA2_gui\" bpmnElement=\"sid-94090D41-BCC6-4A25-BC8C-B01651B1AEA2\">\n        <dc:Bounds x=\"607\" y=\"607\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"443\" y=\"577\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-F4149C86-DCE0-49F5-817F-F90502A52B57_gui\" bpmnElement=\"sid-F4149C86-DCE0-49F5-817F-F90502A52B57\">\n        <dc:Bounds x=\"682\" y=\"85\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"514\" y=\"47\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-2FF9A1B9-F51D-4958-9988-5F28F4A3621E_gui\" bpmnElement=\"sid-2FF9A1B9-F51D-4958-9988-5F28F4A3621E\">\n        <dc:Bounds x=\"683\" y=\"138\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"515\" y=\"100\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-1772321F-86B6-476A-BBA4-ACEA1C12BD89_gui\" bpmnElement=\"sid-1772321F-86B6-476A-BBA4-ACEA1C12BD89\">\n        <dc:Bounds x=\"682\" y=\"243\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"514\" y=\"205\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-874BAFF0-BDA7-4A60-A9A7-3A4F6CD084BF_gui\" bpmnElement=\"sid-874BAFF0-BDA7-4A60-A9A7-3A4F6CD084BF\">\n        <dc:Bounds x=\"682\" y=\"399\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"514\" y=\"340\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-E19E0FDE-CA8F-4D87-9BA0-4F314C38AEF2_gui\" bpmnElement=\"sid-E19E0FDE-CA8F-4D87-9BA0-4F314C38AEF2\">\n        <dc:Bounds x=\"682\" y=\"509\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"514\" y=\"471\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-4A829101-E797-434D-8E79-0BA8AA2C7BFE_gui\" bpmnElement=\"sid-4A829101-E797-434D-8E79-0BA8AA2C7BFE\">\n        <dc:Bounds x=\"682\" y=\"721\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"514\" y=\"683\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-CFD33E95-E5DD-4019-A547-92185E9E2CB2_gui\" bpmnElement=\"sid-CFD33E95-E5DD-4019-A547-92185E9E2CB2\">\n        <dc:Bounds x=\"682\" y=\"561\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"514\" y=\"523\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-D545FC26-CAA8-4401-863D-5CCE28916373_gui\" bpmnElement=\"sid-D545FC26-CAA8-4401-863D-5CCE28916373\">\n        <dc:Bounds x=\"607\" y=\"557\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"443\" y=\"527\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_0tso181_di\" bpmnElement=\"EndEvent_0tso181\">\n        <dc:Bounds x=\"678\" y=\"449\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"514\" y=\"400\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_13snmqg_di\" bpmnElement=\"EndEvent_13snmqg\">\n        <dc:Bounds x=\"678\" y=\"604\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"514\" y=\"574\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_0pgtew5_di\" bpmnElement=\"StartEvent_multiple_1\">\n        <dc:Bounds x=\"158\" y=\"717\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"160\" y=\"760\" width=\"33\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_0np3e7f_di\" bpmnElement=\"StartEvent_multiple_parallel_1\">\n        <dc:Bounds x=\"158\" y=\"788\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"160\" y=\"831\" width=\"33\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_06czgc6_di\" bpmnElement=\"IntermediateCatchEvent_multiple_1\">\n        <dc:Bounds x=\"383\" y=\"717\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"386\" y=\"760\" width=\"30\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_0qdr7nu_di\" bpmnElement=\"IntermediateCatchEvent_multiple_parallel_1\">\n        <dc:Bounds x=\"383\" y=\"788\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"386\" y=\"831\" width=\"30\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_0f7br9v_di\" bpmnElement=\"IntermediateThrowEvent_multiple_1\">\n        <dc:Bounds x=\"608\" y=\"788\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"612\" y=\"831\" width=\"28\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_0x1hgcq_di\" bpmnElement=\"EndEvent_multiple_1\">\n        <dc:Bounds x=\"678\" y=\"788\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"682\" y=\"831\" width=\"28\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/gateway-type-default.bpmn",
    "content": "<?xml version=\"1.0\"encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n             xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n             xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\"\n             xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\"\n             xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n             exporter=\"Signavio Process Editor, http://www.signavio.com\"\n             exporterVersion=\"8.1.1\"\n             expressionLanguage=\"http://www.w3.org/1999/XPath\"\n             id=\"sid-cfb874bb-23ca-47b0-ac68-b7b1cb824b1f\"\n             targetNamespace=\"http://www.signavio.com/bpmn20\"\n             typeLanguage=\"http://www.w3.org/2001/XMLSchema\"\n             xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n   <process id=\"sid-7c34ae8d-0b83-4c60-8872-200ac8efdf58\" isClosed=\"false\" isExecutable=\"false\" processType=\"None\">\n      <eventBasedGateway id=\"GATEWAY_1\" instantiate=\"false\" />\n      <eventBasedGateway id=\"GATEWAY_2\" instantiate=\"true\" />\n      <association id=\"sid-6C4D9725-F0A9-4083-A1AA-CD509BF75178\" sourceRef=\"sid-67ACF9D3-B43E-42A8-A98F-162B6D89B75C\" targetRef=\"GATEWAY_1\" />\n      <textAnnotation id=\"sid-67ACF9D3-B43E-42A8-A98F-162B6D89B75C\" textFormat=\"text/plain\">\n         <text>Should rendered as event based Gateway</text>\n      </textAnnotation>\n   </process>\n   <bpmndi:BPMNDiagram id=\"sid-a323de14-b068-49b3-a252-669822cdf78c\">\n      <bpmndi:BPMNPlane bpmnElement=\"sid-7c34ae8d-0b83-4c60-8872-200ac8efdf58\" id=\"sid-8b686f77-8ed1-419f-823f-2527a66f1584\">\n         <bpmndi:BPMNShape bpmnElement=\"GATEWAY_1\" id=\"GATEWAY_1_gui\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"165.0\" y=\"165.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"GATEWAY_2\" id=\"GATEWAY_2_gui\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"165.0\" y=\"270.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-67ACF9D3-B43E-42A8-A98F-162B6D89B75C\" id=\"sid-67ACF9D3-B43E-42A8-A98F-162B6D89B75C_gui\">\n            <omgdc:Bounds height=\"60.0\" width=\"150.0\" x=\"250.0\" y=\"50.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-037a9b94-ff1f-48d5-a96a-c382c162b8fc\">\n               <omgdc:Bounds height=\"48.0\" width=\"72.0\" x=\"254.0\" y=\"48.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-6C4D9725-F0A9-4083-A1AA-CD509BF75178\" id=\"sid-6C4D9725-F0A9-4083-A1AA-CD509BF75178_gui\">\n            <omgdi:waypoint x=\"250.0\" y=\"75.70229007633588\"/>\n            <omgdi:waypoint x=\"197.542600896861\" y=\"165.0\"/>\n         </bpmndi:BPMNEdge>\n      </bpmndi:BPMNPlane>\n      <bpmndi:BPMNLabelStyle id=\"sid-037a9b94-ff1f-48d5-a96a-c382c162b8fc\">\n         <omgdc:Font isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\" name=\"Arial\" size=\"11.0\"/>\n      </bpmndi:BPMNLabelStyle>\n   </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/gateways.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n  xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n  xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\"\n  xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\"\n  xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\"\n  id=\"gateway-testcase\"\n  targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:inclusiveGateway id=\"InclusiveGateway_1\"/>\n    <bpmn:exclusiveGateway id=\"ExclusiveGateway_1\"/>\n    <bpmn:parallelGateway id=\"ParallelGateway_1\"/>\n    <bpmn:eventBasedGateway id=\"EventBasedGateway_1\" eventGatewayType=\"Exclusive\" instantiate=\"false\"/>\n    <bpmn:complexGateway id=\"ComplexGateway_1\"/>\n    <bpmn:eventBasedGateway id=\"EventBasedGateway_2\" eventGatewayType=\"Parallel\" instantiate=\"true\"/>\n    <bpmn:eventBasedGateway id=\"EventBasedGateway_3\" eventGatewayType=\"Exclusive\" instantiate=\"true\"/>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_InclusiveGateway_2\" bpmnElement=\"InclusiveGateway_1\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"114.0\" y=\"99.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_ExclusiveGateway_2\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"229.0\" y=\"99.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"254.0\" y=\"154.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_ParallelGateway_2\" bpmnElement=\"ParallelGateway_1\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"336.0\" y=\"99.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"361.0\" y=\"154.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EventBasedGateway_2\" bpmnElement=\"EventBasedGateway_1\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"456.0\" y=\"99.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"481.0\" y=\"154.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_ComplexGateway_2\" bpmnElement=\"ComplexGateway_1\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"576.0\" y=\"99.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"601.0\" y=\"154.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EventBasedGateway_3\" bpmnElement=\"EventBasedGateway_2\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"690.0\" y=\"99.0\"/>\n        <bpmndi:BPMNLabel>\n            <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"481.0\" y=\"154.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EventBasedGateway_4\" bpmnElement=\"EventBasedGateway_3\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"820.0\" y=\"99.0\"/>\n        <bpmndi:BPMNLabel>\n            <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"481.0\" y=\"154.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/draw/group-name.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:signavio=\"http://www.signavio.com\" id=\"sid-0fcc2144-457b-4505-9e44-ff673663e3bc\" targetNamespace=\"http://www.signavio.com/bpmn20\" exporter=\"Camunda Modeler\" exporterVersion=\"2.0.3\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n  <category id=\"Category_1\">\n    <categoryValue id=\"CategoryValue_1\" value=\"my group\" />\n  </category>\n  <process id=\"Process_1\" processType=\"None\" isExecutable=\"false\">\n    <extensionElements>\n      <signavio:signavioDiagramMetaData metaKey=\"revisionid\" metaValue=\"64982a7ff2f14bcea04a5d016bd89e49\" />\n    </extensionElements>\n    <group id=\"Group_1\" categoryValueRef=\"CategoryValue_1\">\n      <extensionElements>\n        <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\" />\n      </extensionElements>\n    </group>\n  </process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Group_1di\" bpmnElement=\"Group_1\">\n        <omgdc:Bounds x=\"180\" y=\"105\" width=\"188\" height=\"154\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"184\" y=\"107\" width=\"58.28571319580078\" height=\"15\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/group.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:signavio=\"http://www.signavio.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" exporter=\"Signavio Process Editor, http://www.signavio.com\" exporterVersion=\"7.0.0\" expressionLanguage=\"http://www.w3.org/1999/XPath\" id=\"sid-cfa9858b-87ba-4fce-9fef-52e81f98f01b\" targetNamespace=\"http://www.signavio.com/bpmn20\" typeLanguage=\"http://www.w3.org/2001/XMLSchema\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n   <category id=\"sid-318c8299-67a6-4ce8-85d5-063e8d3ecb02\">\n      <categoryValue id=\"sid-318c8299-67a6-4ce8-85d5-063e8d3ecb0a\" value=\"The Group&#10;\"/>\n   </category>\n\n   <process id=\"sid-d7765c68-4a90-436c-a48e-13fb5a554632\" isClosed=\"false\" isExecutable=\"false\" processType=\"None\">\n      <task completionQuantity=\"1\" id=\"sid-D1AF5313-B39D-4296-9046-4E6EB4BC0C09\" isForCompensation=\"false\" name=\"Test\" startQuantity=\"1\">\n         <extensionElements>\n            <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffcc\"/>\n         </extensionElements>\n      </task>\n      <group categoryValueRef=\"sid-318c8299-67a6-4ce8-85d5-063e8d3ecb0a\" id=\"sid-49EB3CED-C884-4360-82F6-A512CDE8A8BA\"/>\n   </process>\n   <bpmndi:BPMNDiagram id=\"sid-07ebd7fb-c83e-428d-98b0-8c1a295d0104\">\n      <bpmndi:BPMNPlane bpmnElement=\"sid-d7765c68-4a90-436c-a48e-13fb5a554632\" id=\"sid-6e859ea3-c93f-4c89-9709-67d30808c49f\">\n         <bpmndi:BPMNShape bpmnElement=\"sid-D1AF5313-B39D-4296-9046-4E6EB4BC0C09\" id=\"sid-D1AF5313-B39D-4296-9046-4E6EB4BC0C09_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"540.0\" y=\"300.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-49EB3CED-C884-4360-82F6-A512CDE8A8BA\" id=\"sid-49EB3CED-C884-4360-82F6-A512CDE8A8BA_gui\">\n            <omgdc:Bounds height=\"262.0\" width=\"494.0\" x=\"343.0\" y=\"209.0\"/>\n         </bpmndi:BPMNShape>\n      </bpmndi:BPMNPlane>\n   </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/message-label.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_139dc1y\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.7.0\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.14.0\">\n  <bpmn:collaboration id=\"Collaboration_054yewv\">\n    <bpmn:participant id=\"Participant_11t38ov\" />\n    <bpmn:participant id=\"Participant_19laqtw\" />\n    <bpmn:messageFlow id=\"dataFlow\" sourceRef=\"Participant_11t38ov\" targetRef=\"Participant_19laqtw\" messageRef=\"Message_0itoen0\" />\n  </bpmn:collaboration>\n      <bpmn:message id=\"Message_0itoen0\" name=\"Invoice\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_054yewv\">\n      <bpmndi:BPMNShape id=\"Participant_0hyr9jn_di\" bpmnElement=\"Participant_11t38ov\" isHorizontal=\"true\">\n        <dc:Bounds x=\"160\" y=\"80\" width=\"300\" height=\"60\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_19laqtw_di\" bpmnElement=\"Participant_19laqtw\" isHorizontal=\"true\">\n        <dc:Bounds x=\"160\" y=\"250\" width=\"300\" height=\"60\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"dataFlow_di\" bpmnElement=\"dataFlow\">\n        <di:waypoint x=\"310\" y=\"140\" />\n        <di:waypoint x=\"310\" y=\"250\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/message-marker.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n             xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n             xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\"\n             xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\"\n             xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n             typeLanguage=\"http://www.w3.org/2001/XMLSchema\"\n             xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n   <message id=\"sid-8305E624-4C83-4E93-B453-69736A132FCB\"/>\n   <collaboration id=\"sid-684aeb5d-c383-481d-8dd0-3af4e2e43dac\">\n      <participant id=\"sid-342DBDE9-32CD-4550-A144-E701788ED269\" />\n      <participant id=\"sid-C83CE34C-96F0-4E70-9154-034EA1C153D1\" />\n      <participant id=\"sid-CC60133D-96AD-4B0C-AFB7-E9D2F2F464B2\" />\n      <participant id=\"sid-FF380DB9-3E5C-4B3A-8E0C-51AE094B7B78\" />\n      <participant id=\"sid-415D575B-696E-495C-ABDE-9D5D6AB74ED0\" />\n      <participant id=\"sid-B241843B-F96D-4280-9013-DEDF3646D2C2\" />\n      <messageFlow id=\"sid-14C0E235-7BC3-4C9D-86FA-A9EBE0EE5DAA\" messageRef=\"sid-8305E624-4C83-4E93-B453-69736A132FCB\" sourceRef=\"sid-CC60133D-96AD-4B0C-AFB7-E9D2F2F464B2\" targetRef=\"sid-342DBDE9-32CD-4550-A144-E701788ED269\" />\n      <messageFlow id=\"sid-25DCC895-2A47-4CE5-8A1F-9B5361ADEDBA\" messageRef=\"sid-8305E624-4C83-4E93-B453-69736A132FCB\" sourceRef=\"sid-C83CE34C-96F0-4E70-9154-034EA1C153D1\" targetRef=\"sid-FF380DB9-3E5C-4B3A-8E0C-51AE094B7B78\" />\n      <messageFlow id=\"sid-FE6FA624-C078-4C22-8F71-C4AA356F0B26\" messageRef=\"sid-8305E624-4C83-4E93-B453-69736A132FCB\" sourceRef=\"sid-CC60133D-96AD-4B0C-AFB7-E9D2F2F464B2\" targetRef=\"sid-B241843B-F96D-4280-9013-DEDF3646D2C2\" />\n      <messageFlow id=\"sid-6CCE226D-DCC5-42B8-ACCE-DCE615D4B080\" messageRef=\"sid-8305E624-4C83-4E93-B453-69736A132FCB\" sourceRef=\"sid-CC60133D-96AD-4B0C-AFB7-E9D2F2F464B2\" targetRef=\"sid-415D575B-696E-495C-ABDE-9D5D6AB74ED0\" />\n      <messageFlow id=\"sid-F374ADBB-901A-4854-8E6C-C2A2C8D1AD31\" messageRef=\"sid-8305E624-4C83-4E93-B453-69736A132FCB\" sourceRef=\"sid-C83CE34C-96F0-4E70-9154-034EA1C153D1\" targetRef=\"sid-CC60133D-96AD-4B0C-AFB7-E9D2F2F464B2\" />\n      <messageFlow id=\"sid-795D9557-CD4A-43E1-9480-0860725D43CC\" messageRef=\"sid-8305E624-4C83-4E93-B453-69736A132FCB\" sourceRef=\"sid-CC60133D-96AD-4B0C-AFB7-E9D2F2F464B2\" targetRef=\"sid-C83CE34C-96F0-4E70-9154-034EA1C153D1\" />\n      <messageFlow id=\"sid-6725C384-470C-4734-8A61-051237278034\" sourceRef=\"sid-CC60133D-96AD-4B0C-AFB7-E9D2F2F464B2\" targetRef=\"sid-B241843B-F96D-4280-9013-DEDF3646D2C2\">\n      </messageFlow>\n   </collaboration>\n   <process id=\"sid-a260af96-242d-4ca9-a502-ea32571bef5c\" isExecutable=\"false\" processType=\"None\">\n      <association associationDirection=\"None\" id=\"sid-00099919-7167-455D-9ED1-45E9A55816F2\" sourceRef=\"sid-CE667331-3BCB-4943-91A5-344465796066\" targetRef=\"sid-795D9557-CD4A-43E1-9480-0860725D43CC\" />\n      <association associationDirection=\"None\" id=\"sid-320964AC-116E-4587-B654-697AA7798E91\" sourceRef=\"sid-039BB7A8-7217-4787-A0B5-96E6F0AD0733\" targetRef=\"sid-6725C384-470C-4734-8A61-051237278034\" />\n      <textAnnotation id=\"sid-CE667331-3BCB-4943-91A5-344465796066\" textFormat=\"text/plain\">\n         <text>Non Initiating</text>\n      </textAnnotation>\n      <textAnnotation id=\"sid-039BB7A8-7217-4787-A0B5-96E6F0AD0733\" textFormat=\"text/plain\">\n         <text>Normal message flow</text>\n      </textAnnotation>\n   </process>\n   <bpmndi:BPMNDiagram id=\"sid-9d8e7ae1-85f8-4646-be83-6e4e2b7dad60\">\n      <bpmndi:BPMNPlane bpmnElement=\"sid-684aeb5d-c383-481d-8dd0-3af4e2e43dac\" id=\"sid-37babbc4-cac1-42f6-89e2-2cc4a4e6a965\">\n         <bpmndi:BPMNShape bpmnElement=\"sid-342DBDE9-32CD-4550-A144-E701788ED269\" id=\"sid-342DBDE9-32CD-4550-A144-E701788ED269_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"48.0\" width=\"312.0\" x=\"852.0\" y=\"410.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-C83CE34C-96F0-4E70-9154-034EA1C153D1\" id=\"sid-C83CE34C-96F0-4E70-9154-034EA1C153D1_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"48.0\" width=\"312.0\" x=\"415.0\" y=\"290.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-CC60133D-96AD-4B0C-AFB7-E9D2F2F464B2\" id=\"sid-CC60133D-96AD-4B0C-AFB7-E9D2F2F464B2_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"48.0\" width=\"312.0\" x=\"415.0\" y=\"410.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-FF380DB9-3E5C-4B3A-8E0C-51AE094B7B78\" id=\"sid-FF380DB9-3E5C-4B3A-8E0C-51AE094B7B78_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"60.0\" width=\"246.0\" x=\"961.0\" y=\"78.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-415D575B-696E-495C-ABDE-9D5D6AB74ED0\" id=\"sid-415D575B-696E-495C-ABDE-9D5D6AB74ED0_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"48.0\" width=\"312.0\" x=\"0.0\" y=\"410.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-B241843B-F96D-4280-9013-DEDF3646D2C2\" id=\"sid-B241843B-F96D-4280-9013-DEDF3646D2C2_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"60.0\" width=\"309.432827948714\" x=\"417.567172051286\" y=\"570.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-CE667331-3BCB-4943-91A5-344465796066\" id=\"sid-CE667331-3BCB-4943-91A5-344465796066_gui\">\n            <omgdc:Bounds height=\"50.0\" width=\"100.0\" x=\"225.0\" y=\"582.25\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-f85b6acb-3d20-4bf8-94f8-f098e23cc633\">\n               <omgdc:Bounds height=\"12.0\" width=\"78.0\" x=\"229.0\" y=\"598.25\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-039BB7A8-7217-4787-A0B5-96E6F0AD0733\" id=\"sid-039BB7A8-7217-4787-A0B5-96E6F0AD0733_gui\">\n            <omgdc:Bounds height=\"50.0\" width=\"100.0\" x=\"795.0\" y=\"530.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-f85b6acb-3d20-4bf8-94f8-f098e23cc633\">\n               <omgdc:Bounds height=\"24.0\" width=\"81.42857360839844\" x=\"799.0\" y=\"540.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-14C0E235-7BC3-4C9D-86FA-A9EBE0EE5DAA\" id=\"sid-14C0E235-7BC3-4C9D-86FA-A9EBE0EE5DAA_gui\" messageVisibleKind=\"initiating\">\n            <omgdi:waypoint x=\"727.0\" y=\"434.0\"/>\n            <omgdi:waypoint x=\"852.0\" y=\"434.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-25DCC895-2A47-4CE5-8A1F-9B5361ADEDBA\" id=\"sid-25DCC895-2A47-4CE5-8A1F-9B5361ADEDBA_gui\" messageVisibleKind=\"initiating\">\n            <omgdi:waypoint x=\"570.376\" y=\"290.0\"/>\n            <omgdi:waypoint x=\"570.376\" y=\"227.0\"/>\n            <omgdi:waypoint x=\"724.0\" y=\"227.0\"/>\n            <omgdi:waypoint x=\"724.0\" y=\"107.0\"/>\n            <omgdi:waypoint x=\"961.0\" y=\"107.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-FE6FA624-C078-4C22-8F71-C4AA356F0B26\" id=\"sid-FE6FA624-C078-4C22-8F71-C4AA356F0B26_gui\" messageVisibleKind=\"non_initiating\">\n            <omgdi:waypoint x=\"492.0\" y=\"458.0\"/>\n            <omgdi:waypoint x=\"492.0\" y=\"570.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-320964AC-116E-4587-B654-697AA7798E91\" id=\"sid-320964AC-116E-4587-B654-697AA7798E91_gui\">\n            <omgdi:waypoint x=\"795.0\" y=\"554.1218253968254\"/>\n            <omgdi:waypoint x=\"670.0\" y=\"569.3499999999999\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-6CCE226D-DCC5-42B8-ACCE-DCE615D4B080\" id=\"sid-6CCE226D-DCC5-42B8-ACCE-DCE615D4B080_gui\" messageVisibleKind=\"initiating\">\n            <omgdi:waypoint x=\"415.0\" y=\"434.0\"/>\n            <omgdi:waypoint x=\"312.0\" y=\"434.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-F374ADBB-901A-4854-8E6C-C2A2C8D1AD31\" id=\"sid-F374ADBB-901A-4854-8E6C-C2A2C8D1AD31_gui\" messageVisibleKind=\"initiating\">\n            <omgdi:waypoint x=\"479.0\" y=\"338.0\"/>\n            <omgdi:waypoint x=\"479.0\" y=\"410.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-795D9557-CD4A-43E1-9480-0860725D43CC\" id=\"sid-795D9557-CD4A-43E1-9480-0860725D43CC_gui\" messageVisibleKind=\"initiating\">\n            <omgdi:waypoint x=\"614.0\" y=\"410.0\"/>\n            <omgdi:waypoint x=\"614.0\" y=\"338.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-6725C384-470C-4734-8A61-051237278034\" id=\"sid-6725C384-470C-4734-8A61-051237278034_gui\">\n            <omgdi:waypoint x=\"670.0\" y=\"458.0\"/>\n            <omgdi:waypoint x=\"670.0\" y=\"570.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"sid-00099919-7167-455D-9ED1-45E9A55816F2\" id=\"sid-00099919-7167-455D-9ED1-45E9A55816F2_gui\">\n            <omgdi:waypoint x=\"254.1207419109184\" y=\"582.25\"/>\n            <omgdi:waypoint x=\"477.8125\" y=\"516.1365612526562\"/>\n         </bpmndi:BPMNEdge>\n      </bpmndi:BPMNPlane>\n      <bpmndi:BPMNLabelStyle id=\"sid-f85b6acb-3d20-4bf8-94f8-f098e23cc633\">\n         <omgdc:Font isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\" name=\"Arial\" size=\"11.0\"/>\n      </bpmndi:BPMNLabelStyle>\n   </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/pools-with-collection-marker.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:signavio=\"http://www.signavio.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" exporter=\"Signavio Process Editor, http://www.signavio.com\" exporterVersion=\"7.9.1\" expressionLanguage=\"http://www.w3.org/1999/XPath\" id=\"sid-11d59c94-a550-4f02-b9b0-acf8be8457b6\" targetNamespace=\"http://www.signavio.com/bpmn20\" typeLanguage=\"http://www.w3.org/2001/XMLSchema\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n   <collaboration id=\"sid-7788c70f-79bb-43c5-b833-c116b0311b6e\">\n      <participant id=\"sid-28C02E4A-4338-4FE9-B25F-AB85D6C2AD13\" name=\"expanded pools with collection marker\" processRef=\"sid-75300E01-F7DD-43BF-9259-0E90723DA323\">\n         <participantMultiplicity id=\"sid-a4e85590-bd67-418d-a617-53bcfcfde620\" maximum=\"2\" minimum=\"2\"/>\n      </participant>\n      <participant id=\"sid-219F4A95-2008-4322-8219-2A6DD351D650\" name=\"collapsed pools with collection marker\">\n         <participantMultiplicity id=\"sid-05c760dd-8fd7-4aa1-9ae3-6aa387204401\" maximum=\"2\" minimum=\"2\"/>\n      </participant>\n      <participant id=\"sid-CB4B9CE6-DB33-4EA9-A0FD-63D6EA6DE1E6\" name=\"expanded pools with collection marker\" processRef=\"sid-E66A17B2-1B58-42A8-B250-1D3B10AACB53\">\n         <participantMultiplicity id=\"sid-653a64a3-74c0-4339-8491-27b0fe50f2ff\" maximum=\"2\" minimum=\"2\"/>\n      </participant>\n   </collaboration>\n   <process id=\"sid-E66A17B2-1B58-42A8-B250-1D3B10AACB53\" isClosed=\"false\" isExecutable=\"false\" name=\"expanded pools with collection marker\" processType=\"None\">\n      <extensionElements/>\n      <laneSet id=\"sid-8575ab26-0f97-494e-bfc1-734e7e718599\">\n         <lane id=\"sid-811FC1B1-39ED-450D-BB8C-7A93F13830AC\">\n         </lane>\n      </laneSet>\n   </process>\n   <process id=\"sid-75300E01-F7DD-43BF-9259-0E90723DA323\" isClosed=\"false\" isExecutable=\"false\" name=\"expanded pools with collection marker\" processType=\"None\">\n      <extensionElements/>\n      <laneSet id=\"sid-a68decc8-182e-41c7-8809-459772b8a44f\">\n         <lane id=\"sid-B3715BDD-013D-49AA-A8FC-61F30F2A3F15\">\n         </lane>\n         <lane id=\"sid-28BEA138-116F-4696-A782-8605CAF7D2D4\">\n            <childLaneSet id=\"sid-69dfd8ca-8c22-41af-9038-0ec0f395ccfc\">\n               <lane id=\"sid-70006BA1-1BB8-453B-868C-D6C05CBCEB8A\">\n               </lane>\n               <lane id=\"sid-7FB26450-1277-45B1-8982-2F49842D9FAB\">\n                  <childLaneSet id=\"sid-5d5af198-a10f-4e41-8e88-a56b81c09fa9\">\n                     <lane id=\"sid-9D2BBA66-877C-48E8-BF93-9AD9836A6809\">\n                     </lane>\n                     <lane id=\"sid-33F00A3E-C6EE-41AD-9111-D6E2B69F96EC\">\n                     </lane>\n                  </childLaneSet>\n               </lane>\n            </childLaneSet>\n         </lane>\n         <lane id=\"sid-526954EA-1E5E-4B57-BC6C-EE2B6282F583\">\n            <childLaneSet id=\"sid-48b68743-de3d-4393-ac39-a9db89b5b69c\">\n               <lane id=\"sid-F10336F2-6435-4A3E-B2AE-359DE8319989\">\n               </lane>\n               <lane id=\"sid-199F6A5F-4203-4662-BE4D-FD9292F6D28B\">\n               </lane>\n            </childLaneSet>\n         </lane>\n      </laneSet>\n   </process>\n   <bpmndi:BPMNDiagram id=\"sid-ea81a042-2eb5-42fd-9b23-9e9026e75ee9\">\n      <bpmndi:BPMNPlane bpmnElement=\"sid-7788c70f-79bb-43c5-b833-c116b0311b6e\" id=\"sid-56b3929c-334d-4bd4-88ee-9b7346879fef\">\n         <bpmndi:BPMNShape bpmnElement=\"sid-28C02E4A-4338-4FE9-B25F-AB85D6C2AD13\" id=\"sid-28C02E4A-4338-4FE9-B25F-AB85D6C2AD13_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"1500.0\" width=\"694.0\" x=\"175.0\" y=\"540.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-a2e7e29f-ab7c-4535-aa22-cd309fcd1685\">\n               <omgdc:Bounds height=\"230.57142639160156\" width=\"12.000000000000028\" x=\"179.99999999999997\" y=\"1174.7142868041992\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-219F4A95-2008-4322-8219-2A6DD351D650\" id=\"sid-219F4A95-2008-4322-8219-2A6DD351D650_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"60.0\" width=\"500.0\" x=\"225.0\" y=\"45.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-a2e7e29f-ab7c-4535-aa22-cd309fcd1685\">\n               <omgdc:Bounds height=\"20.0\" width=\"377.142822265625\" x=\"286.4285888671875\" y=\"62.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-CB4B9CE6-DB33-4EA9-A0FD-63D6EA6DE1E6\" id=\"sid-CB4B9CE6-DB33-4EA9-A0FD-63D6EA6DE1E6_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"325.0\" width=\"600.0\" x=\"175.0\" y=\"165.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-a2e7e29f-ab7c-4535-aa22-cd309fcd1685\">\n               <omgdc:Bounds height=\"230.57142639160156\" width=\"12.000000000000028\" x=\"179.99999999999997\" y=\"212.21428680419922\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-811FC1B1-39ED-450D-BB8C-7A93F13830AC\" id=\"sid-811FC1B1-39ED-450D-BB8C-7A93F13830AC_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"325.0\" width=\"570.0\" x=\"205.0\" y=\"165.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-B3715BDD-013D-49AA-A8FC-61F30F2A3F15\" id=\"sid-B3715BDD-013D-49AA-A8FC-61F30F2A3F15_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"250.0\" width=\"664.0\" x=\"205.0\" y=\"540.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-28BEA138-116F-4696-A782-8605CAF7D2D4\" id=\"sid-28BEA138-116F-4696-A782-8605CAF7D2D4_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"750.0\" width=\"664.0\" x=\"205.0\" y=\"1290.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-70006BA1-1BB8-453B-868C-D6C05CBCEB8A\" id=\"sid-70006BA1-1BB8-453B-868C-D6C05CBCEB8A_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"250.0\" width=\"634.0\" x=\"235.0\" y=\"1290.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-7FB26450-1277-45B1-8982-2F49842D9FAB\" id=\"sid-7FB26450-1277-45B1-8982-2F49842D9FAB_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"500.0\" width=\"634.0\" x=\"235.0\" y=\"1540.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-9D2BBA66-877C-48E8-BF93-9AD9836A6809\" id=\"sid-9D2BBA66-877C-48E8-BF93-9AD9836A6809_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"250.0\" width=\"604.0\" x=\"265.0\" y=\"1540.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-33F00A3E-C6EE-41AD-9111-D6E2B69F96EC\" id=\"sid-33F00A3E-C6EE-41AD-9111-D6E2B69F96EC_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"250.0\" width=\"604.0\" x=\"265.0\" y=\"1790.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-526954EA-1E5E-4B57-BC6C-EE2B6282F583\" id=\"sid-526954EA-1E5E-4B57-BC6C-EE2B6282F583_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"500.0\" width=\"664.0\" x=\"205.0\" y=\"790.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-F10336F2-6435-4A3E-B2AE-359DE8319989\" id=\"sid-F10336F2-6435-4A3E-B2AE-359DE8319989_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"250.0\" width=\"634.0\" x=\"235.0\" y=\"790.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"sid-199F6A5F-4203-4662-BE4D-FD9292F6D28B\" id=\"sid-199F6A5F-4203-4662-BE4D-FD9292F6D28B_gui\" isHorizontal=\"true\">\n            <omgdc:Bounds height=\"250.0\" width=\"634.0\" x=\"235.0\" y=\"1040.0\"/>\n         </bpmndi:BPMNShape>\n      </bpmndi:BPMNPlane>\n      <bpmndi:BPMNLabelStyle id=\"sid-a2e7e29f-ab7c-4535-aa22-cd309fcd1685\">\n         <omgdc:Font isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\" name=\"Arial\" size=\"12.0\"/>\n      </bpmndi:BPMNLabelStyle>\n   </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/pools.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n             xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n             xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\"\n             xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n             expressionLanguage=\"http://www.w3.org/1999/XPath\"\n             typeLanguage=\"http://www.w3.org/2001/XMLSchema\"\n             xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n    <collaboration id=\"sid-f8863819-d0a3-4398-8786-2aa28d8881ca\">\n        <participant id=\"sid-B6042939-0D7C-4AF0-BAFF-9C4E6077762C\" name=\"Pool with Lanes\" processRef=\"sid-BCDFC1B7-A79C-404F-991E-C2118E9BD3F9\">\n        </participant>\n        <participant id=\"sid-466F4E40-A5E9-4F4C-B93A-9CE8E398FAEF\" name=\"Collapsed Pool\">\n        </participant>\n        <participant id=\"sid-55BF12B8-A470-4AC8-BA67-9CD9635C0237\" name=\"Expanded Pool\" processRef=\"sid-D57EF85C-3D1F-4C36-B59C-AFC17EA2A83F\">\n        </participant>\n    </collaboration>\n    <process id=\"sid-D57EF85C-3D1F-4C36-B59C-AFC17EA2A83F\" isClosed=\"false\" isExecutable=\"false\" name=\"Expanded Pool\" processType=\"None\">\n    </process>\n    <process id=\"sid-BCDFC1B7-A79C-404F-991E-C2118E9BD3F9\" isClosed=\"false\" isExecutable=\"false\" name=\"Pool with Lanes\" processType=\"None\">\n        <laneSet id=\"sid-f997dc05-50b1-403b-beff-e24019286476\">\n            <lane id=\"sid-0573A65C-9800-42E4-86E0-9DB1CF5027E5\" name=\"Lane with Sublane\">\n                <childLaneSet id=\"sid-0728dccd-679d-4818-aa2a-b3aa5c2c0d4f\">\n                    <lane id=\"sid-54427248-3EE5-4B6B-B580-794CE6ABC2CD\" name=\"Sublane\">\n                    </lane>\n                    <lane id=\"sid-D9D4AB6C-736D-4C70-B79D-88D75AB42E05\" name=\"Sublane 2\">\n                    </lane>\n                </childLaneSet>\n            </lane>\n            <lane id=\"sid-6F662015-27C5-45EF-8576-795E32058777\" name=\"Single Lane\">\n            </lane>\n        </laneSet>\n    </process>\n    <bpmndi:BPMNDiagram id=\"sid-b70bf1fa-bbbf-4854-812e-f87fbb7a62d9\">\n        <bpmndi:BPMNPlane bpmnElement=\"sid-f8863819-d0a3-4398-8786-2aa28d8881ca\" id=\"sid-12cea966-e39b-469c-bbfa-c560094678a7\">\n            <bpmndi:BPMNShape bpmnElement=\"sid-B6042939-0D7C-4AF0-BAFF-9C4E6077762C\" id=\"sid-B6042939-0D7C-4AF0-BAFF-9C4E6077762C_gui\" isHorizontal=\"true\">\n                <omgdc:Bounds height=\"399.0\" width=\"594.0\" x=\"96.0\" y=\"460.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-c28ef72c-8dac-4861-9bdf-355327f4346e\">\n                    <omgdc:Bounds height=\"93.42857360839844\" width=\"12.000000000000014\" x=\"101.99999999999999\" y=\"612.7857131958008\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-466F4E40-A5E9-4F4C-B93A-9CE8E398FAEF\" id=\"sid-466F4E40-A5E9-4F4C-B93A-9CE8E398FAEF_gui\" isHorizontal=\"true\">\n                <omgdc:Bounds height=\"60.0\" width=\"594.0\" x=\"92.0\" y=\"57.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-c28ef72c-8dac-4861-9bdf-355327f4346e\">\n                    <omgdc:Bounds height=\"20.0\" width=\"144.28570556640625\" x=\"316.8571472167969\" y=\"76.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-55BF12B8-A470-4AC8-BA67-9CD9635C0237\" id=\"sid-55BF12B8-A470-4AC8-BA67-9CD9635C0237_gui\" isHorizontal=\"true\">\n                <omgdc:Bounds height=\"250.0\" width=\"600.0\" x=\"90.0\" y=\"165.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-c28ef72c-8dac-4861-9bdf-355327f4346e\">\n                    <omgdc:Bounds height=\"89.14286041259766\" width=\"12.000000000000014\" x=\"95.99999999999999\" y=\"245.42856979370117\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-0573A65C-9800-42E4-86E0-9DB1CF5027E5\" id=\"sid-0573A65C-9800-42E4-86E0-9DB1CF5027E5_gui\" isHorizontal=\"true\">\n                <omgdc:Bounds height=\"266.0\" width=\"564.0\" x=\"126.0\" y=\"593.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-c28ef72c-8dac-4861-9bdf-355327f4346e\">\n                    <omgdc:Bounds height=\"109.71428680419922\" width=\"12.000000000000028\" x=\"132.0\" y=\"671.1428565979004\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-54427248-3EE5-4B6B-B580-794CE6ABC2CD\" id=\"sid-54427248-3EE5-4B6B-B580-794CE6ABC2CD_gui\" isHorizontal=\"true\">\n                <omgdc:Bounds height=\"133.0\" width=\"534.0\" x=\"156.0\" y=\"593.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-c28ef72c-8dac-4861-9bdf-355327f4346e\">\n                    <omgdc:Bounds height=\"48.0\" width=\"12.0\" x=\"162.0\" y=\"635.5\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-D9D4AB6C-736D-4C70-B79D-88D75AB42E05\" id=\"sid-D9D4AB6C-736D-4C70-B79D-88D75AB42E05_gui\" isHorizontal=\"true\">\n                <omgdc:Bounds height=\"133.0\" width=\"534.0\" x=\"156.0\" y=\"726.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-c28ef72c-8dac-4861-9bdf-355327f4346e\">\n                    <omgdc:Bounds height=\"60.0\" width=\"12.0\" x=\"162.0\" y=\"762.5\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-6F662015-27C5-45EF-8576-795E32058777\" id=\"sid-6F662015-27C5-45EF-8576-795E32058777_gui\" isHorizontal=\"true\">\n                <omgdc:Bounds height=\"133.0\" width=\"564.0\" x=\"126.0\" y=\"460.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-c28ef72c-8dac-4861-9bdf-355327f4346e\">\n                    <omgdc:Bounds height=\"68.57142639160156\" width=\"12.0\" x=\"132.0\" y=\"492.2142868041992\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n        </bpmndi:BPMNPlane>\n        <bpmndi:BPMNLabelStyle id=\"sid-c28ef72c-8dac-4861-9bdf-355327f4346e\">\n            <omgdc:Font isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\" name=\"Arial\" size=\"12.0\"/>\n        </bpmndi:BPMNLabelStyle>\n    </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/task-types.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n             xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n             xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\"\n             xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n             expressionLanguage=\"http://www.w3.org/1999/XPath\"\n             id=\"task-types-diagram\"\n             typeLanguage=\"http://www.w3.org/2001/XMLSchema\"\n             xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n    <process id=\"task-types\" isClosed=\"false\" isExecutable=\"false\" processType=\"None\">\n        <sendTask completionQuantity=\"1\" id=\"sid-DC73E8B3-54C4-44E3-A172-E10E072A37CF\" implementation=\"webService\" isForCompensation=\"false\" name=\"Send Task\" startQuantity=\"1\" />\n        <receiveTask completionQuantity=\"1\" id=\"sid-18A8B7B4-13B7-4F5E-8D27-FC63B5F6FC32\" implementation=\"webService\" instantiate=\"false\" isForCompensation=\"false\" name=\"Receive Task\" startQuantity=\"1\" />\n        <userTask completionQuantity=\"1\" id=\"sid-DD2A4023-C8B5-4C7A-87A6-F9BE5F8E6E4A\" implementation=\"webService\" isForCompensation=\"false\" name=\"User Task\" startQuantity=\"1\" />\n        <manualTask completionQuantity=\"1\" id=\"sid-6D88755E-A486-41A5-99DE-355AB75503A0\" isForCompensation=\"false\" name=\"Manual Task\" startQuantity=\"1\" />\n        <serviceTask completionQuantity=\"1\" id=\"sid-2283F70F-1590-4D2A-A79D-0788721A3BD3\" implementation=\"webService\" isForCompensation=\"false\" name=\"Service Task\" startQuantity=\"1\" />\n        <businessRuleTask completionQuantity=\"1\" id=\"sid-05937FE7-AACD-4DC5-9607-9C0AD6EA9655\" implementation=\"webService\" isForCompensation=\"false\" name=\"Business Rule Task&#10;\" startQuantity=\"1\" />\n        <scriptTask completionQuantity=\"1\" id=\"sid-0C42A159-4787-4799-A340-A55F7FA6CBDA\" isForCompensation=\"false\" name=\"Script Task\" scriptFormat=\"\" startQuantity=\"1\">\n            <script/>\n        </scriptTask>\n        <receiveTask completionQuantity=\"1\" id=\"sid-D049CA0A-81EE-481B-B9E4-5A1577B3D729\" implementation=\"webService\" instantiate=\"true\" isForCompensation=\"false\" name=\"Receive Task&#10;(Instantiating)&#10;\" startQuantity=\"1\" />\n    </process>\n    <bpmndi:BPMNDiagram id=\"sid-565cb505-781d-4873-8263-dc70591a87a9\">\n        <bpmndi:BPMNPlane bpmnElement=\"task-types\" id=\"sid-7ebdcce4-7617-4e73-a47c-5facab598852\">\n            <bpmndi:BPMNShape bpmnElement=\"sid-DC73E8B3-54C4-44E3-A172-E10E072A37CF\" id=\"sid-DC73E8B3-54C4-44E3-A172-E10E072A37CF_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"45.0\" y=\"75.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-e0061864-4ad9-48c3-ae14-465c7a037c45\">\n                    <omgdc:Bounds height=\"12.0\" width=\"63.42857360839844\" x=\"63.28571319580078\" y=\"107.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-18A8B7B4-13B7-4F5E-8D27-FC63B5F6FC32\" id=\"sid-18A8B7B4-13B7-4F5E-8D27-FC63B5F6FC32_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"190.0\" y=\"75.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-e0061864-4ad9-48c3-ae14-465c7a037c45\">\n                    <omgdc:Bounds height=\"12.0\" width=\"77.14286041259766\" x=\"201.42856979370117\" y=\"107.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-DD2A4023-C8B5-4C7A-87A6-F9BE5F8E6E4A\" id=\"sid-DD2A4023-C8B5-4C7A-87A6-F9BE5F8E6E4A_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"45.0\" y=\"200.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-e0061864-4ad9-48c3-ae14-465c7a037c45\">\n                    <omgdc:Bounds height=\"12.0\" width=\"60.0\" x=\"65.0\" y=\"232.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-6D88755E-A486-41A5-99DE-355AB75503A0\" id=\"sid-6D88755E-A486-41A5-99DE-355AB75503A0_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"190.0\" y=\"200.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-e0061864-4ad9-48c3-ae14-465c7a037c45\">\n                    <omgdc:Bounds height=\"12.0\" width=\"73.71428680419922\" x=\"203.1428565979004\" y=\"232.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-2283F70F-1590-4D2A-A79D-0788721A3BD3\" id=\"sid-2283F70F-1590-4D2A-A79D-0788721A3BD3_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"45.0\" y=\"325.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-e0061864-4ad9-48c3-ae14-465c7a037c45\">\n                    <omgdc:Bounds height=\"12.0\" width=\"75.42857360839844\" x=\"57.28571319580078\" y=\"357.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-05937FE7-AACD-4DC5-9607-9C0AD6EA9655\" id=\"sid-05937FE7-AACD-4DC5-9607-9C0AD6EA9655_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"190.0\" y=\"325.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-e0061864-4ad9-48c3-ae14-465c7a037c45\">\n                    <omgdc:Bounds height=\"24.0\" width=\"84.0\" x=\"198.0\" y=\"351.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-0C42A159-4787-4799-A340-A55F7FA6CBDA\" id=\"sid-0C42A159-4787-4799-A340-A55F7FA6CBDA_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"45.0\" y=\"450.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-e0061864-4ad9-48c3-ae14-465c7a037c45\">\n                    <omgdc:Bounds height=\"12.0\" width=\"67.71428680419922\" x=\"61.14285659790039\" y=\"482.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-D049CA0A-81EE-481B-B9E4-5A1577B3D729\" id=\"sid-D049CA0A-81EE-481B-B9E4-5A1577B3D729_gui\">\n                <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"190.0\" y=\"450.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-e0061864-4ad9-48c3-ae14-465c7a037c45\">\n                    <omgdc:Bounds height=\"24.0\" width=\"86.57142639160156\" x=\"196.71428680419922\" y=\"476.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n        </bpmndi:BPMNPlane>\n        <bpmndi:BPMNLabelStyle id=\"sid-e0061864-4ad9-48c3-ae14-465c7a037c45\">\n            <omgdc:Font isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\" name=\"Arial\" size=\"12.0\"/>\n        </bpmndi:BPMNLabelStyle>\n    </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/text-annotation.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n             xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n             xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\"\n             xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\"\n             xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n             expressionLanguage=\"http://www.w3.org/1999/XPath\"\n             typeLanguage=\"http://www.w3.org/2001/XMLSchema\"\n             xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n    <collaboration id=\"sid-49651cba-f289-4cd9-9a5b-8969178ca335\">\n        <participant id=\"_Participant_2\" name=\"Pool\" processRef=\"Process_1\">\n        </participant>\n        <textAnnotation id=\"TextAnnotation_1\" textFormat=\"text/plain\">\n            <text>Test test consetetursadipscingelitrametamet nonumy</text>\n        </textAnnotation>\n        <association associationDirection=\"None\" id=\"Association_1\" sourceRef=\"TextAnnotation_1\" targetRef=\"_Participant_2\">\n        </association>\n    </collaboration>\n    <process id=\"Process_1\" isClosed=\"false\" isExecutable=\"false\" name=\"Pool\" processType=\"None\">\n        <extensionElements/>\n        <laneSet id=\"sid-d72f7e1f-1ff7-4acd-8c18-2665c93f2f70\">\n            <lane id=\"sid-20961CB3-C62C-427D-BDB6-60540C6DDB27\">\n            </lane>\n        </laneSet>\n        <association associationDirection=\"None\" id=\"sid-69238ACB-D883-4966-8B04-ED6B08BD768E\" sourceRef=\"sid-B802FDA8-0B67-48E0-B9B3-124D4FE51208\" targetRef=\"sid-20961CB3-C62C-427D-BDB6-60540C6DDB27\">\n        </association>\n        <textAnnotation id=\"sid-B802FDA8-0B67-48E0-B9B3-124D4FE51208\" textFormat=\"text/plain\">\n            <text>Lorem ipsum dolor sit amet, consetetursadipscingelitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor s\n            </text>\n        </textAnnotation>\n    </process>\n    <bpmndi:BPMNDiagram id=\"sid-960bc49b-b0b7-416d-9690-c6bac6c75959\">\n        <bpmndi:BPMNPlane bpmnElement=\"sid-49651cba-f289-4cd9-9a5b-8969178ca335\" id=\"sid-2cab5264-8ff4-4c79-8102-439d73e6a2ae\">\n            <bpmndi:BPMNShape bpmnElement=\"_Participant_2\" id=\"_Participant_2_gui\" isHorizontal=\"true\">\n                <omgdc:Bounds height=\"250.0\" width=\"577.0\" x=\"338.0\" y=\"170.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-86581e21-80e0-4748-b7d7-60415bfb954e\">\n                    <omgdc:Bounds height=\"24.85714340209961\" width=\"12.0\" x=\"343.0\" y=\"282.5714282989502\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"TextAnnotation_1\" id=\"TextAnnotation_1_gui\">\n                <omgdc:Bounds height=\"74.0\" width=\"217.0\" x=\"864.0\" y=\"48.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-71eec29f-7cba-4b30-818c-4860d4588b18\">\n                    <omgdc:Bounds height=\"36.0\" width=\"212.57142639160156\" x=\"868.0\" y=\"63.52000045776367\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNEdge bpmnElement=\"Association_1\" id=\"Association_1_gui\">\n                <omgdi:waypoint x=\"930.0\" y=\"122.0\"/>\n                <omgdi:waypoint x=\"734.0\" y=\"170.0\"/>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNShape bpmnElement=\"sid-20961CB3-C62C-427D-BDB6-60540C6DDB27\" id=\"sid-20961CB3-C62C-427D-BDB6-60540C6DDB27_gui\" isHorizontal=\"true\">\n                <omgdc:Bounds height=\"250.0\" width=\"547.0\" x=\"368.0\" y=\"170.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-B802FDA8-0B67-48E0-B9B3-124D4FE51208\" id=\"sid-B802FDA8-0B67-48E0-B9B3-124D4FE51208_gui\">\n                <omgdc:Bounds height=\"162.0\" width=\"217.0\" x=\"1126.0\" y=\"214.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-71eec29f-7cba-4b30-818c-4860d4588b18\">\n                    <omgdc:Bounds height=\"108.00000762939453\" width=\"210.85714721679688\" x=\"1130.0\" y=\"235.76000213623047\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-69238ACB-D883-4966-8B04-ED6B08BD768E\" id=\"sid-69238ACB-D883-4966-8B04-ED6B08BD768E_gui\">\n                <omgdi:waypoint x=\"1126.0\" y=\"291.7666735324408\"/>\n                <omgdi:waypoint x=\"915.0\" y=\"293.17478887744596\"/>\n            </bpmndi:BPMNEdge>\n        </bpmndi:BPMNPlane>\n        <bpmndi:BPMNLabelStyle id=\"sid-71eec29f-7cba-4b30-818c-4860d4588b18\">\n            <omgdc:Font isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\" name=\"Arial\" size=\"11.0\"/>\n        </bpmndi:BPMNLabelStyle>\n        <bpmndi:BPMNLabelStyle id=\"sid-86581e21-80e0-4748-b7d7-60415bfb954e\">\n            <omgdc:Font isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\" name=\"Arial\" size=\"12.0\"/>\n        </bpmndi:BPMNLabelStyle>\n    </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/vertical-pools.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" exporter=\"Camunda Modeler\" exporterVersion=\"5.16.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n  <collaboration id=\"Collaboration_0m9vq4y\">\n    <participant id=\"Participant_00h09d6\" name=\"Collapsed Pool\" />\n    <participant id=\"Participant_1wpkruh\" name=\"Extended Pool\" processRef=\"Process_01t5csh\" />\n    <participant id=\"Participant_1xkqrsy\" name=\"Pool with Lanes\" processRef=\"Process_10fpr09\" />\n  </collaboration>\n  <process id=\"Process_01t5csh\" isExecutable=\"false\" />\n  <process id=\"Process_10fpr09\" isExecutable=\"false\">\n    <laneSet id=\"LaneSet_1cmncwp\">\n      <lane id=\"Lane_07czuri\" name=\"Single Lane\" />\n      <lane id=\"Lane_1tqhum3\" name=\"Lane with Sublane\">\n        <childLaneSet id=\"LaneSet_1xtuknm\">\n          <lane id=\"Lane_0amfnv8\" name=\"Sublane\" />\n          <lane id=\"Lane_0juuif9\" name=\"Sublane 2\" />\n        </childLaneSet>\n      </lane>\n    </laneSet>\n  </process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_0m9vq4y\">\n      <bpmndi:BPMNShape id=\"Participant_050dim5_di\" bpmnElement=\"Participant_00h09d6\" isHorizontal=\"false\">\n        <omgdc:Bounds y=\"160\" x=\"57\" height=\"600\" width=\"60\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_1wpkruh_di\" bpmnElement=\"Participant_1wpkruh\" isHorizontal=\"false\">\n        <omgdc:Bounds y=\"160\" x=\"165\" height=\"600\" width=\"250\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_1xkqrsy_di\" bpmnElement=\"Participant_1xkqrsy\" isHorizontal=\"false\">\n        <omgdc:Bounds y=\"160\" x=\"460\" height=\"600\" width=\"400\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_07czuri_di\" bpmnElement=\"Lane_07czuri\" isHorizontal=\"false\">\n        <omgdc:Bounds y=\"190\" x=\"460\" height=\"570\" width=\"130\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1tqhum3_di\" bpmnElement=\"Lane_1tqhum3\" isHorizontal=\"false\">\n        <omgdc:Bounds y=\"190\" x=\"590\" height=\"570\" width=\"270\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0amfnv8_di\" bpmnElement=\"Lane_0amfnv8\" isHorizontal=\"false\">\n        <omgdc:Bounds y=\"220\" x=\"590\" height=\"540\" width=\"140\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0juuif9_di\" bpmnElement=\"Lane_0juuif9\" isHorizontal=\"false\">\n        <omgdc:Bounds y=\"220\" x=\"730\" height=\"540\" width=\"130\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/draw/xor.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions\n        xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n        xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n        xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\"\n        xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\"\n        xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n        expressionLanguage=\"http://www.w3.org/1999/XPath\"\n        typeLanguage=\"http://www.w3.org/2001/XMLSchema\"\n        xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n    <process id=\"sid-c741bcc9-b6f4-404a-be48-6ea42a846afa\" isClosed=\"false\" isExecutable=\"false\" processType=\"None\">\n        <exclusiveGateway gatewayDirection=\"Unspecified\" id=\"sid-81AA9CF4-08E7-4B17-B1FF-8479FD9E24EA\">\n        </exclusiveGateway>\n        <exclusiveGateway gatewayDirection=\"Unspecified\" id=\"sid-84DF847F-0735-450E-99C5-A62D974448C7\">\n        </exclusiveGateway>\n        <association associationDirection=\"None\" id=\"sid-31ADAC7A-ED0C-4A3E-966D-1705847A10A5\" sourceRef=\"sid-84DF847F-0735-450E-99C5-A62D974448C7\" targetRef=\"sid-84DF847F-0735-450E-99C5-A62D974448C7\">\n        </association>\n        <textAnnotation id=\"sid-7C319B57-5406-4CBB-BB14-AB42FB8CA81C\" textFormat=\"text/plain\">\n            <text>Should be blank</text>\n        </textAnnotation>\n    </process>\n    <bpmndi:BPMNDiagram id=\"sid-9f60d3e0-407e-487d-ba50-585f911b8d8b\">\n        <bpmndi:BPMNPlane bpmnElement=\"sid-c741bcc9-b6f4-404a-be48-6ea42a846afa\" id=\"sid-bdbb97bd-653b-4a7b-b2e1-f95f74a2baf8\">\n            <bpmndi:BPMNShape bpmnElement=\"sid-81AA9CF4-08E7-4B17-B1FF-8479FD9E24EA\" id=\"sid-81AA9CF4-08E7-4B17-B1FF-8479FD9E24EA_gui\" isMarkerVisible=\"true\">\n                <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"175.0\" y=\"105.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-84DF847F-0735-450E-99C5-A62D974448C7\" id=\"sid-84DF847F-0735-450E-99C5-A62D974448C7_gui\" isMarkerVisible=\"false\">\n                <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"90.0\" y=\"105.0\"/>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"sid-7C319B57-5406-4CBB-BB14-AB42FB8CA81C\" id=\"sid-7C319B57-5406-4CBB-BB14-AB42FB8CA81C_gui\">\n                <omgdc:Bounds height=\"50.0\" width=\"125.0\" x=\"105.0\" y=\"240.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"sid-48c53a3a-3175-4b48-b1ef-a1cad607a430\">\n                    <omgdc:Bounds height=\"12.0\" width=\"96.85713958740234\" x=\"109.0\" y=\"256.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNEdge bpmnElement=\"sid-31ADAC7A-ED0C-4A3E-966D-1705847A10A5\" id=\"sid-31ADAC7A-ED0C-4A3E-966D-1705847A10A5_gui\">\n                <omgdi:waypoint x=\"110.5\" y=\"240.20431823652171\"/>\n                <omgdi:waypoint x=\"110.5\" y=\"145.0\"/>\n            </bpmndi:BPMNEdge>\n        </bpmndi:BPMNPlane>\n        <bpmndi:BPMNLabelStyle id=\"sid-48c53a3a-3175-4b48-b1ef-a1cad607a430\">\n            <omgdc:Font isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\" name=\"Arial\" size=\"11.0\"/>\n        </bpmndi:BPMNLabelStyle>\n    </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/empty-definitions.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\"\n  id=\"empty-definitions\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  \n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/error/categoryValue.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:signavio=\"http://www.signavio.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" exporter=\"Signavio Process Editor, http://www.signavio.com\" exporterVersion=\"8.4.1\" expressionLanguage=\"http://www.w3.org/1999/XPath\" id=\"sid-73c85f47-caf7-49f4-81c2-ccd9c46beedb\" targetNamespace=\"http://www.signavio.com/bpmn20\" typeLanguage=\"http://www.w3.org/2001/XMLSchema\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n  <categoryValue id=\"sid-afd7e63e-916e-4bd0-a9f0-98cbff749193\" value=\"group with label\"/>\n  <process id=\"sid-d21bd22a-e617-4562-9cbd-2546073c1cf1\" isExecutable=\"false\" processType=\"None\">\n    <extensionElements>\n      <signavio:signavioDiagramMetaData metaKey=\"revisionid\" metaValue=\"a97a57cd8c4145d09f902344a2f6eec7\"/>\n    </extensionElements>\n    <group categoryValueRef=\"sid-afd7e63e-916e-4bd0-a9f0-98cbff749193\" id=\"sid-1FB8E9C5-D54C-4FCA-A2B2-256090EC79DF\">\n      <extensionElements>\n        <signavio:signavioMetaData metaKey=\"userstory\" metaValue=\"\"/>\n      </extensionElements>\n    </group>\n  </process>\n  <bpmndi:BPMNDiagram id=\"sid-73344385-3bbb-419c-ad69-a9db64e271c7\">\n    <bpmndi:BPMNPlane bpmnElement=\"sid-d21bd22a-e617-4562-9cbd-2546073c1cf1\" id=\"sid-def820ae-1226-4abe-9eb0-7b5543824627\">\n      <bpmndi:BPMNShape bpmnElement=\"sid-1FB8E9C5-D54C-4FCA-A2B2-256090EC79DF\" id=\"sid-1FB8E9C5-D54C-4FCA-A2B2-256090EC79DF_gui\">\n        <omgdc:Bounds height=\"234.0\" width=\"346.0\" x=\"180.0\" y=\"135.0\"/>\n        <bpmndi:BPMNLabel labelStyle=\"sid-41bec41f-8420-426c-bf18-f704a8dd71d2\">\n          <omgdc:Bounds height=\"12.0\" width=\"96.0\" x=\"184.0\" y=\"137.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-41bec41f-8420-426c-bf18-f704a8dd71d2\">\n      <omgdc:Font isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\" name=\"Arial\" size=\"11.0\"/>\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n</definitions>"
  },
  {
    "path": "test/fixtures/bpmn/error/di-plane-no-bpmn-element.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_F2BQoOJhEeOt3puKo8GLGA\" targetNamespace=\"http://activiti.org/bpmn\">\n  <!-- Collaboration_2 removed -->\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_2\">\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/error/duplicate-ids.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions\n  xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n  xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n  id=\"definitions\"\n  targetNamespace=\"http://bpmn.io/schema/bpmn\">\n\n  <bpmn2:process id=\"test\" />\n  <bpmn2:process id=\"test\" />\n\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"test\">\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/error/invalid-child.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"test\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n\n  <someElement a=\"b\" />\n\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/error/missing-namespace.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://www.example.com\">\n  <collaboration name=\"TEST\">\n    <participant id=\"Participant_1\" name=\"Participant Name\"/>\n  </collaboration>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\" name=\"Default Collaboration Diagram\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" >\n      <bpmndi:BPMNShape id=\"BPMNShape_Participant_1\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds height=\"370.0\" width=\"1571.0\" x=\"30.0\" y=\"70.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>"
  },
  {
    "path": "test/fixtures/bpmn/error/no-process-collaboration.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions\n  xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n  xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n  id=\"definitions\"\n  targetNamespace=\"http://bpmn.io/schema/bpmn\">\n\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\">\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/error/no-xml.txt",
    "content": "this is no xml"
  },
  {
    "path": "test/fixtures/bpmn/event-sub-processes.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess_1\" triggeredByEvent=\"true\">\n      <bpmn:startEvent id=\"StartEvent_1\" isInterrupting=\"false\">\n        <bpmn:messageEventDefinition />\n      </bpmn:startEvent>\n      <bpmn:startEvent id=\"StartEvent_2\" />\n      <bpmn:startEvent id=\"StartEvent_3\" isInterrupting=\"false\">\n        <bpmn:timerEventDefinition />\n      </bpmn:startEvent>\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"SubProcess_2\" triggeredByEvent=\"true\" />\n    <bpmn:subProcess id=\"SubProcess_3\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"92\" y=\"46\" width=\"149\" height=\"138\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"119\" y=\"75\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"92\" y=\"111\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_2_di\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds x=\"119\" y=\"127\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"92\" y=\"163\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_3_di\" bpmnElement=\"StartEvent_3\">\n        <dc:Bounds x=\"180\" y=\"75\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"153\" y=\"111\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_2_di\" bpmnElement=\"SubProcess_2\" isExpanded=\"true\">\n        <dc:Bounds x=\"299\" y=\"46\" width=\"144\" height=\"138\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_3_di\" bpmnElement=\"SubProcess_3\" isExpanded=\"true\">\n        <dc:Bounds x=\"503\" y=\"46\" width=\"161\" height=\"137\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/extension/camunda.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:camunda=\"http://camunda.org/schema/1.0/bpmn\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_FVEpwO_VEeOtYvXzz5ksgw\" exporter=\"camunda modeler\" exporterVersion=\"2.5.0\" targetNamespace=\"http://camunda.org/schema/1.0/bpmn\">\n  <bpmn2:process id=\"testProcess\" isExecutable=\"true\">\n    <bpmn2:startEvent id=\"StartEvent_1\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:sendTask id=\"send\" name=\"send\">\n      <bpmn2:extensionElements>\n        <camunda:inputOutput>\n          <camunda:inputParameter name=\"var1\">\n            <camunda:map>\n              <camunda:entry key=\"a\">\n                <camunda:list>\n                  <camunda:value>stringInListNestedInMap</camunda:value>\n                  <camunda:value>${ 'b' }</camunda:value>\n                </camunda:list>\n              </camunda:entry>\n            </camunda:map>\n          </camunda:inputParameter>\n          <camunda:inputParameter name=\"var2\">stringConstantValue</camunda:inputParameter>\n        </camunda:inputOutput>\n      </bpmn2:extensionElements>\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n    </bpmn2:sendTask>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"StartEvent_1\" targetRef=\"send\"/>\n    <bpmn2:endEvent id=\"EndEvent_1\">\n      <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_2\" name=\"\" sourceRef=\"send\" targetRef=\"EndEvent_1\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"testProcess\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"128.0\" y=\"178.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_UserTask_2\" bpmnElement=\"send\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"214.0\" y=\"156.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_StartEvent_2\" targetElement=\"_BPMNShape_UserTask_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"164.0\" y=\"196.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"214.0\" y=\"196.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"364.0\" y=\"178.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"_BPMNShape_UserTask_2\" targetElement=\"_BPMNShape_EndEvent_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"314.0\" y=\"196.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"364.0\" y=\"196.0\"/>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/extension/custom-override.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:camunda=\"http://camunda.org/schema/1.0/bpmn\" xmlns:custom=\"http://customdescriptor.com/bpmn2\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_FVEpwO_VEeOtYvXzz5ksgw\" exporter=\"camunda modeler\" exporterVersion=\"2.5.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"testProcess\" isExecutable=\"true\">\n    <bpmn2:startEvent id=\"StartEvent_1\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:sendTask id=\"send\" name=\"send\">\n      <bpmn2:extensionElements>\n        <camunda:inputOutput>\n          <camunda:inputParameter name=\"var1\">\n            <camunda:map>\n              <camunda:entry key=\"a\">\n                <camunda:list>\n                  <camunda:value>stringInListNestedInMap</camunda:value>\n                  <camunda:value>${ 'b' }</camunda:value>\n                </camunda:list>\n              </camunda:entry>\n            </camunda:map>\n          </camunda:inputParameter>\n          <camunda:inputParameter name=\"var2\">stringConstantValue</camunda:inputParameter>\n        </camunda:inputOutput>\n        <custom:CustomSendElementOverride name=\"custom\" value=\"1\" />\n      </bpmn2:extensionElements>\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n    </bpmn2:sendTask>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"StartEvent_1\" targetRef=\"send\"/>\n    <bpmn2:endEvent id=\"EndEvent_1\">\n      <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_2\" name=\"\" sourceRef=\"send\" targetRef=\"EndEvent_1\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"testProcess\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"128.0\" y=\"178.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_UserTask_2\" bpmnElement=\"send\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"214.0\" y=\"156.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_StartEvent_2\" targetElement=\"_BPMNShape_UserTask_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"164.0\" y=\"196.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"214.0\" y=\"196.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"364.0\" y=\"178.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"_BPMNShape_UserTask_2\" targetElement=\"_BPMNShape_EndEvent_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"314.0\" y=\"196.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"364.0\" y=\"196.0\"/>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/extension/custom.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:camunda=\"http://camunda.org/schema/1.0/bpmn\" xmlns:custom=\"http://customdescriptor.com/bpmn2\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_FVEpwO_VEeOtYvXzz5ksgw\" exporter=\"camunda modeler\" exporterVersion=\"2.5.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"testProcess\" isExecutable=\"true\">\n    <bpmn2:startEvent id=\"StartEvent_1\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:sendTask id=\"send\" name=\"send\">\n      <bpmn2:extensionElements>\n        <camunda:inputOutput>\n          <camunda:inputParameter name=\"var1\">\n            <camunda:map>\n              <camunda:entry key=\"a\">\n                <camunda:list>\n                  <camunda:value>stringInListNestedInMap</camunda:value>\n                  <camunda:value>${ 'b' }</camunda:value>\n                </camunda:list>\n              </camunda:entry>\n            </camunda:map>\n          </camunda:inputParameter>\n          <camunda:inputParameter name=\"var2\">stringConstantValue</camunda:inputParameter>\n        </camunda:inputOutput>\n        <custom:customSendElement name=\"custom\" value=\"1\" />\n      </bpmn2:extensionElements>\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n    </bpmn2:sendTask>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"StartEvent_1\" targetRef=\"send\"/>\n    <bpmn2:endEvent id=\"EndEvent_1\">\n      <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_2\" name=\"\" sourceRef=\"send\" targetRef=\"EndEvent_1\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"testProcess\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"128.0\" y=\"178.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_UserTask_2\" bpmnElement=\"send\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"214.0\" y=\"156.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_StartEvent_2\" targetElement=\"_BPMNShape_UserTask_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"164.0\" y=\"196.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"214.0\" y=\"196.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"364.0\" y=\"178.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"_BPMNShape_UserTask_2\" targetElement=\"_BPMNShape_EndEvent_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"314.0\" y=\"196.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"364.0\" y=\"196.0\"/>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/features/drop/drop.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n  xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n  xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\"\n  xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  expressionLanguage=\"http://www.w3.org/1999/XPath\"\n  targetNamespace=\"http://www.signavio.com/bpmn20\"\n  typeLanguage=\"http://www.w3.org/2001/XMLSchema\"\n  xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n\n   <process id=\"sid-a4cd48b2-5b11-4c1a-b7f7-ada3058503ee\" isClosed=\"false\" isExecutable=\"false\" processType=\"None\">\n      <task completionQuantity=\"1\" id=\"ID_Task_1\" isForCompensation=\"false\" startQuantity=\"1\">\n         <outgoing>ID_Sequenceflow_1</outgoing>\n      </task>\n      <task completionQuantity=\"1\" id=\"ID_Task_2\" isForCompensation=\"false\" startQuantity=\"1\">\n         <incoming>ID_Sequenceflow_1</incoming>\n      </task>\n      <subProcess completionQuantity=\"1\" id=\"ID_SubProcess_1\" isForCompensation=\"false\" startQuantity=\"1\" triggeredByEvent=\"false\">\n      </subProcess>\n      <sequenceFlow id=\"ID_Sequenceflow_1\" sourceRef=\"ID_Task_1\" targetRef=\"ID_Task_2\">\n      </sequenceFlow>\n   </process>\n   <bpmndi:BPMNDiagram id=\"sid-fc24e517-57a5-49e4-8688-13200425c940\">\n      <bpmndi:BPMNPlane bpmnElement=\"sid-a4cd48b2-5b11-4c1a-b7f7-ada3058503ee\" id=\"sid-dd68914a-715b-49b8-b74a-29880342d6df\">\n         <bpmndi:BPMNShape bpmnElement=\"ID_Task_1\" id=\"ID_Task_1_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"105.0\" y=\"90.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"ID_Task_2\" id=\"ID_Task_2_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"345.0\" y=\"90.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"ID_SubProcess_1\" id=\"ID_SubProcess_1_gui\" isExpanded=\"true\">\n            <omgdc:Bounds height=\"219.0\" width=\"432.0\" x=\"60.0\" y=\"215.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNEdge bpmnElement=\"ID_Sequenceflow_1\" id=\"ID_Sequenceflow_1_gui\">\n            <omgdi:waypoint x=\"205.0\" y=\"130.0\"/>\n            <omgdi:waypoint x=\"345.0\" y=\"130.0\"/>\n         </bpmndi:BPMNEdge>\n      </bpmndi:BPMNPlane>\n   </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/features/drop/recursive-task.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" \n   xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" \n   xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" \n   xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" \n   xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n   expressionLanguage=\"http://www.w3.org/1999/XPath\" \n   id=\"sid-9462d855-17c5-4105-aa19-c6a95cc4e3be\" \n   typeLanguage=\"http://www.w3.org/2001/XMLSchema\" \n   xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n   <process id=\"sid-294f3941-0297-48ea-b5d2-24c576587517\" isClosed=\"false\" isExecutable=\"false\" processType=\"None\">\n      <subProcess completionQuantity=\"1\" id=\"ID_subprocess_1\" isForCompensation=\"false\" startQuantity=\"1\" triggeredByEvent=\"false\">\n      </subProcess>\n      <task completionQuantity=\"1\" id=\"ID_task_1\" isForCompensation=\"false\" startQuantity=\"1\">\n         <outgoing>ID_sequenceflow_1</outgoing>\n      </task>\n      <sequenceFlow id=\"ID_sequenceflow_1\" sourceRef=\"ID_task_1\" targetRef=\"ID_task_1\">\n      </sequenceFlow>\n   </process>\n   <bpmndi:BPMNDiagram id=\"sid-fb46a8c1-9a89-400f-a5c5-e4057ab1d29a\">\n      <bpmndi:BPMNPlane bpmnElement=\"sid-294f3941-0297-48ea-b5d2-24c576587517\" id=\"sid-c2b161f4-5768-409e-8532-a7037b200d5d\">\n         <bpmndi:BPMNShape bpmnElement=\"ID_subprocess_1\" id=\"ID_subprocess_1_gui\" isExpanded=\"true\">\n            <omgdc:Bounds height=\"353.0\" width=\"392.0\" x=\"58.0\" y=\"60.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"ID_task_1\" id=\"ID_task_1_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"510.0\" y=\"225.0\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNEdge bpmnElement=\"ID_sequenceflow_1\" id=\"ID_sequenceflow_1_gui\">\n            <omgdi:waypoint x=\"560.0\" y=\"305.0\"/>\n            <omgdi:waypoint x=\"560.0\" y=\"364.0\"/>\n            <omgdi:waypoint x=\"836.0\" y=\"364.0\"/>\n            <omgdi:waypoint x=\"836.0\" y=\"265.0\"/>\n            <omgdi:waypoint x=\"610.0\" y=\"265.0\"/>\n         </bpmndi:BPMNEdge>\n      </bpmndi:BPMNPlane>\n   </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/features/replace/01_replace.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.23.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\" name=\"KEEP ME\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Task_1\" name=\"Task Caption\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n    <bpmn:exclusiveGateway id=\"ExclusiveGateway_1\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_3</bpmn:outgoing>\n    </bpmn:exclusiveGateway>\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"Task_1\" targetRef=\"ExclusiveGateway_1\" />\n    <bpmn:endEvent id=\"EndEvent_1\">\n      <bpmn:incoming>SequenceFlow_3</bpmn:incoming>\n      <bpmn:incoming>SequenceFlow_8</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_3\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"EndEvent_1\" />\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <bpmn:incoming>SequenceFlow_7</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_6</bpmn:outgoing>\n      <bpmn:startEvent id=\"StartEvent_2\" name=\"foo\">\n        <bpmn:outgoing>SequenceFlow_4</bpmn:outgoing>\n      </bpmn:startEvent>\n      <bpmn:task id=\"Task_2\">\n        <bpmn:incoming>SequenceFlow_4</bpmn:incoming>\n        <bpmn:outgoing>SequenceFlow_5</bpmn:outgoing>\n      </bpmn:task>\n      <bpmn:sequenceFlow id=\"SequenceFlow_4\" sourceRef=\"StartEvent_2\" targetRef=\"Task_2\" />\n      <bpmn:intermediateThrowEvent id=\"IntermediateThrowEvent_1\">\n        <bpmn:incoming>SequenceFlow_5</bpmn:incoming>\n      </bpmn:intermediateThrowEvent>\n      <bpmn:sequenceFlow id=\"SequenceFlow_5\" sourceRef=\"Task_2\" targetRef=\"IntermediateThrowEvent_1\" />\n    </bpmn:subProcess>\n    <bpmn:transaction id=\"Transaction_1\">\n      <bpmn:incoming>SequenceFlow_6</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_8</bpmn:outgoing>\n    </bpmn:transaction>\n    <bpmn:subProcess id=\"SubProcessCollapsed\" />\n    <bpmn:adHocSubProcess id=\"AdHocSubProcessCollapsed\" />\n    <bpmn:adHocSubProcess id=\"AdHocSubProcessExpanded\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_1\" cancelActivity=\"false\" attachedToRef=\"Task_1\">\n      <bpmn:timerEventDefinition>\n        <bpmn:timeDuration>P1D</bpmn:timeDuration>\n      </bpmn:timerEventDefinition>\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundaryEvent_2\" attachedToRef=\"Task_1\">\n      <bpmn:outgoing>SequenceFlow_7</bpmn:outgoing>\n      <bpmn:conditionalEventDefinition>\n        <bpmn:condition xsi:type=\"bpmn:tFormalExpression\">${a &lt; b}</bpmn:condition>\n      </bpmn:conditionalEventDefinition>\n    </bpmn:boundaryEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_6\" sourceRef=\"SubProcess_1\" targetRef=\"Transaction_1\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_7\" sourceRef=\"BoundaryEvent_2\" targetRef=\"SubProcess_1\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_8\" sourceRef=\"Transaction_1\" targetRef=\"EndEvent_1\" />\n    <bpmn:subProcess id=\"EventSubProcess_1\" triggeredByEvent=\"true\">\n      <bpmn:startEvent id=\"StartEvent_3\" isInterrupting=\"false\">\n        <bpmn:messageEventDefinition />\n      </bpmn:startEvent>\n      <bpmn:startEvent id=\"StartEvent_6\">\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_14m0uvi\" />\n      </bpmn:startEvent>\n    </bpmn:subProcess>\n    <bpmn:startEvent id=\"StartEvent_4\">\n      <bpmn:timerEventDefinition id=\"TimerEventDefinition_0la1q3n\" />\n    </bpmn:startEvent>\n    <bpmn:startEvent id=\"StartEvent_5\">\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_0mynzm8\" />\n    </bpmn:startEvent>\n    <bpmn:subProcess id=\"SubProcess_2\">\n      <bpmn:intermediateCatchEvent id=\"IntermediateCatchMessageEvent\">\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_0ntrjf5\" />\n      </bpmn:intermediateCatchEvent>\n      <bpmn:intermediateThrowEvent id=\"CompensationEvent\">\n        <bpmn:compensateEventDefinition id=\"CompensateEventDefinition_0xibqo0\" />\n      </bpmn:intermediateThrowEvent>\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"EventSubProcess_2\" triggeredByEvent=\"true\">\n      <bpmn:endEvent id=\"ErrorEvent\">\n        <bpmn:errorEventDefinition id=\"ErrorEventDefinition_1wj8dp2\" />\n      </bpmn:endEvent>\n    </bpmn:subProcess>\n    <bpmn:complexGateway id=\"ComplexGateway_1\" />\n    <bpmn:intermediateCatchEvent id=\"ConditionalEvent\">\n      <bpmn:conditionalEventDefinition id=\"ConditionalEventDefinition_0ubws14\">\n        <bpmn:condition xsi:type=\"bpmn:tFormalExpression\" />\n      </bpmn:conditionalEventDefinition>\n    </bpmn:intermediateCatchEvent>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"219\" y=\"104\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"213\" y=\"140\" width=\"49\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"394\" y=\"82\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_1_di\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"621\" y=\"97\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"481\" y=\"77\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_1_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"816\" y=\"104\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"669\" y=\"70\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0o3fiwu_di\" bpmnElement=\"ConditionalEvent\">\n        <dc:Bounds x=\"872\" y=\"480\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"221\" y=\"208\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_2_di\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds x=\"254\" y=\"249\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"265\" y=\"285\" width=\"16\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"388\" y=\"227\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_1_di\" bpmnElement=\"IntermediateThrowEvent_1\">\n        <dc:Bounds x=\"420\" y=\"349\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"273\" y=\"315\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_4_di\" bpmnElement=\"SequenceFlow_4\">\n        <di:waypoint x=\"290\" y=\"267\" />\n        <di:waypoint x=\"388\" y=\"267\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"174\" y=\"187\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_5_di\" bpmnElement=\"SequenceFlow_5\">\n        <di:waypoint x=\"438\" y=\"307\" />\n        <di:waypoint x=\"438\" y=\"349\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"273\" y=\"248\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Transaction_1_di\" bpmnElement=\"Transaction_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"610\" y=\"208\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcessCollapsed_di\" bpmnElement=\"SubProcessCollapsed\">\n        <dc:Bounds x=\"223\" y=\"437\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"AdHocSubProcessCollapsed_di\" bpmnElement=\"AdHocSubProcessCollapsed\">\n        <dc:Bounds x=\"355\" y=\"437\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"AdHocSubProcessExpanded_di\" bpmnElement=\"AdHocSubProcessExpanded\" isExpanded=\"true\">\n        <dc:Bounds x=\"494\" y=\"438\" width=\"140\" height=\"120\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EventSubProcess_1_di\" bpmnElement=\"EventSubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"659\" y=\"440\" width=\"193\" height=\"120\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_3_di\" bpmnElement=\"StartEvent_3\">\n        <dc:Bounds x=\"673\" y=\"481\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"526\" y=\"447\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0c3rmns_di\" bpmnElement=\"StartEvent_6\">\n        <dc:Bounds x=\"732\" y=\"481\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_03ri246_di\" bpmnElement=\"StartEvent_4\">\n        <dc:Bounds x=\"150\" y=\"652\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_03dsy11_di\" bpmnElement=\"StartEvent_5\">\n        <dc:Bounds x=\"882\" y=\"652\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0cb78c0_di\" bpmnElement=\"SubProcess_2\" isExpanded=\"true\">\n        <dc:Bounds x=\"221\" y=\"590\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0snvrjf_di\" bpmnElement=\"IntermediateCatchMessageEvent\">\n        <dc:Bounds x=\"262\" y=\"672\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0jo3l8m_di\" bpmnElement=\"CompensationEvent\">\n        <dc:Bounds x=\"412\" y=\"672\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0cmryx4_di\" bpmnElement=\"EventSubProcess_2\" isExpanded=\"true\">\n        <dc:Bounds x=\"659\" y=\"590\" width=\"193\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0pr5js5_di\" bpmnElement=\"ErrorEvent\">\n        <dc:Bounds x=\"752\" y=\"662\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_1g9qldn_di\" bpmnElement=\"ComplexGateway_1\">\n        <dc:Bounds x=\"212\" y=\"825\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_2_di\" bpmnElement=\"BoundaryEvent_2\">\n        <dc:Bounds x=\"382\" y=\"144\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"235\" y=\"110\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1_di\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds x=\"469\" y=\"144\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"322\" y=\"110\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"255\" y=\"122\" />\n        <di:waypoint x=\"394\" y=\"122\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"239\" y=\"42\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_2_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint x=\"494\" y=\"122\" />\n        <di:waypoint x=\"621\" y=\"122\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"578\" y=\"42\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_3_di\" bpmnElement=\"SequenceFlow_3\">\n        <di:waypoint x=\"671\" y=\"122\" />\n        <di:waypoint x=\"816\" y=\"122\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"718\" y=\"42\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_6_di\" bpmnElement=\"SequenceFlow_6\">\n        <di:waypoint x=\"571\" y=\"308\" />\n        <di:waypoint x=\"610\" y=\"308\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"425.5\" y=\"228\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_7_di\" bpmnElement=\"SequenceFlow_7\">\n        <di:waypoint x=\"400\" y=\"180\" />\n        <di:waypoint x=\"400\" y=\"208\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"233\" y=\"114\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_8_di\" bpmnElement=\"SequenceFlow_8\">\n        <di:waypoint x=\"834\" y=\"208\" />\n        <di:waypoint x=\"834\" y=\"140\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"644.5\" y=\"94\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram>\n    <bpmndi:BPMNPlane bpmnElement=\"SubProcessCollapsed\" />\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram>\n    <bpmndi:BPMNPlane bpmnElement=\"AdHocSubProcessCollapsed\" />\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/features/replace/association-gateways.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>SequenceFlow_0fn1a6r</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Task_1\" name=\"Task Caption\">\n      <bpmn:incoming>SequenceFlow_0fn1a6r</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_0fn1a6r\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n    <bpmn:endEvent id=\"EndEvent_1\">\n      <bpmn:incoming>SequenceFlow_19u6x8u</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:eventBasedGateway id=\"EventBasedGateway_02j1pg7\">\n      <bpmn:outgoing>SequenceFlow_0agwpbc</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_1p61uf0</bpmn:outgoing>\n    </bpmn:eventBasedGateway>\n    <bpmn:intermediateCatchEvent id=\"IntermediateCatchEvent_06ybm47\">\n      <bpmn:incoming>SequenceFlow_0agwpbc</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_19u6x8u</bpmn:outgoing>\n      <bpmn:timerEventDefinition />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_0agwpbc\" sourceRef=\"EventBasedGateway_02j1pg7\" targetRef=\"IntermediateCatchEvent_06ybm47\" />\n    <bpmn:receiveTask id=\"ReceiveTask_1r2e700\">\n      <bpmn:incoming>SequenceFlow_1p61uf0</bpmn:incoming>\n    </bpmn:receiveTask>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1p61uf0\" sourceRef=\"EventBasedGateway_02j1pg7\" targetRef=\"ReceiveTask_1r2e700\" />\n    <bpmn:exclusiveGateway id=\"ExclusiveGateway_140v6lc\">\n      <bpmn:outgoing>SequenceFlow_0608fzs</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_1rme11l</bpmn:outgoing>\n    </bpmn:exclusiveGateway>\n    <bpmn:sequenceFlow id=\"SequenceFlow_19u6x8u\" sourceRef=\"IntermediateCatchEvent_06ybm47\" targetRef=\"EndEvent_1\" />\n    <bpmn:intermediateThrowEvent id=\"IntermediateThrowEvent_1u9wi1k\">\n      <bpmn:incoming>SequenceFlow_0608fzs</bpmn:incoming>\n    </bpmn:intermediateThrowEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_0608fzs\" sourceRef=\"ExclusiveGateway_140v6lc\" targetRef=\"IntermediateThrowEvent_1u9wi1k\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_1rme11l\" sourceRef=\"ExclusiveGateway_140v6lc\" targetRef=\"ReceiveTask_1cqxjyr\" />\n    <bpmn:receiveTask id=\"ReceiveTask_1cqxjyr\">\n      <bpmn:incoming>SequenceFlow_1rme11l</bpmn:incoming>\n    </bpmn:receiveTask>\n    <bpmn:textAnnotation id=\"TextAnnotation_0e1etog\" />\n    <bpmn:association id=\"Association_1ncsghq\" sourceRef=\"StartEvent_1\" targetRef=\"TextAnnotation_0e1etog\" />\n    <bpmn:textAnnotation id=\"TextAnnotation_1ttal1r\" />\n    <bpmn:association id=\"Association_0x00yl3\" sourceRef=\"EventBasedGateway_02j1pg7\" targetRef=\"TextAnnotation_1ttal1r\" />\n    <bpmn:textAnnotation id=\"TextAnnotation_0vmdja7\" />\n    <bpmn:association id=\"Association_06tpzma\" sourceRef=\"EndEvent_1\" targetRef=\"TextAnnotation_0vmdja7\" />\n    <bpmn:textAnnotation id=\"TextAnnotation_0kwplau\" />\n    <bpmn:association id=\"Association_0gzxvep\" sourceRef=\"ExclusiveGateway_140v6lc\" targetRef=\"TextAnnotation_0kwplau\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"171\" y=\"171\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"144\" y=\"207\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"314\" y=\"149\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0fn1a6r_di\" bpmnElement=\"SequenceFlow_0fn1a6r\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"207\" y=\"189\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"314\" y=\"189\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"311\" y=\"179\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EndEvent_1_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"948\" y=\"171\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"921\" y=\"207\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_0e1etog_di\" bpmnElement=\"TextAnnotation_0e1etog\">\n        <dc:Bounds x=\"213\" y=\"15\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_1ncsghq_di\" bpmnElement=\"Association_1ncsghq\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"198\" y=\"173\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"241\" y=\"95\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EventBasedGateway_02j1pg7_di\" bpmnElement=\"EventBasedGateway_02j1pg7\">\n        <dc:Bounds x=\"573\" y=\"164\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"553\" y=\"214\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_06ybm47_di\" bpmnElement=\"IntermediateCatchEvent_06ybm47\">\n        <dc:Bounds x=\"733\" y=\"171\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"706\" y=\"207\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0agwpbc_di\" bpmnElement=\"SequenceFlow_0agwpbc\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"623\" y=\"189\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"733\" y=\"189\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"633\" y=\"179\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"ReceiveTask_1r2e700_di\" bpmnElement=\"ReceiveTask_1r2e700\">\n        <dc:Bounds x=\"701\" y=\"279\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1p61uf0_di\" bpmnElement=\"SequenceFlow_1p61uf0\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"623\" y=\"189\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"662\" y=\"189\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"662\" y=\"319\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"701\" y=\"319\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"617\" y=\"244\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_140v6lc_di\" bpmnElement=\"ExclusiveGateway_140v6lc\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"581\" y=\"412\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"561\" y=\"462\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_1ttal1r_di\" bpmnElement=\"TextAnnotation_1ttal1r\">\n        <dc:Bounds x=\"629\" y=\"36\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_0x00yl3_di\" bpmnElement=\"Association_0x00yl3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"608\" y=\"174\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"650\" y=\"116\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"TextAnnotation_0vmdja7_di\" bpmnElement=\"TextAnnotation_0vmdja7\">\n        <dc:Bounds x=\"891\" y=\"36\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_06tpzma_di\" bpmnElement=\"Association_06tpzma\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"962\" y=\"172\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"950\" y=\"116\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_19u6x8u_di\" bpmnElement=\"SequenceFlow_19u6x8u\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"769\" y=\"189\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"948\" y=\"189\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"813.5\" y=\"179\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_1u9wi1k_di\" bpmnElement=\"IntermediateThrowEvent_1u9wi1k\">\n        <dc:Bounds x=\"733\" y=\"419\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"706\" y=\"455\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0608fzs_di\" bpmnElement=\"SequenceFlow_0608fzs\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"631\" y=\"437\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"733\" y=\"437\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"637\" y=\"427\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1rme11l_di\" bpmnElement=\"SequenceFlow_1rme11l\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"631\" y=\"437\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"666\" y=\"437\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"666\" y=\"555\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"701\" y=\"555\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"621\" y=\"486\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"ReceiveTask_1cqxjyr_di\" bpmnElement=\"ReceiveTask_1cqxjyr\">\n        <dc:Bounds x=\"701\" y=\"515\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_0kwplau_di\" bpmnElement=\"TextAnnotation_0kwplau\">\n        <dc:Bounds x=\"437\" y=\"495\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_0gzxvep_di\" bpmnElement=\"Association_0gzxvep\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"592\" y=\"448\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"536\" y=\"495\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/features/replace/cancel-events.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.3.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:transaction id=\"Transaction_1\">\n      <bpmn:endEvent id=\"EndEvent_1\">\n        <bpmn:cancelEventDefinition />\n      </bpmn:endEvent>\n    </bpmn:transaction>\n    <bpmn:boundaryEvent id=\"BoundaryEvent_1\" attachedToRef=\"Transaction_1\" />\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <bpmn:endEvent id=\"EndEvent_2\" />\n    </bpmn:subProcess>\n    <bpmn:boundaryEvent id=\"BoundaryEvent_2\" attachedToRef=\"SubProcess_1\" />\n    <bpmn:transaction id=\"Transaction_2\">\n      <bpmn:endEvent id=\"EndEvent_3\">\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_0jj8o4w\" />\n      </bpmn:endEvent>\n    </bpmn:transaction>\n    <bpmn:task id=\"Activity_1\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_3\" attachedToRef=\"Activity_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Activity_1rswf6m_di\" bpmnElement=\"Activity_1\">\n        <dc:Bounds x=\"630\" y=\"400\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Transaction_1_di\" bpmnElement=\"Transaction_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"156\" y=\"45\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_1_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"318\" y=\"126\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"181\" y=\"162\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"564\" y=\"45\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_2_di\" bpmnElement=\"EndEvent_2\">\n        <dc:Bounds x=\"665\" y=\"131\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"528\" y=\"167\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0hggfqa_di\" bpmnElement=\"Transaction_2\" isExpanded=\"true\">\n        <dc:Bounds x=\"156\" y=\"370\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1fewq9p_di\" bpmnElement=\"EndEvent_3\">\n        <dc:Bounds x=\"318\" y=\"451\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_2_di\" bpmnElement=\"BoundaryEvent_2\">\n        <dc:Bounds x=\"593\" y=\"227\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"680\" y=\"350\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1_di\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds x=\"206\" y=\"227\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"379\" y=\"350\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1fm3j1i_di\" bpmnElement=\"BoundaryEvent_3\">\n        <dc:Bounds x=\"662\" y=\"462\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/features/replace/connection.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <bpmn:task id=\"Task_1\" />\n      <bpmn:boundaryEvent id=\"BoundaryEvent_1\" attachedToRef=\"Task_1\">\n        <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n      </bpmn:boundaryEvent>\n      <bpmn:task id=\"Task_2\">\n        <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n      </bpmn:task>\n      <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"BoundaryEvent_1\" targetRef=\"Task_2\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"77\" y=\"46\" width=\"452\" height=\"284\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"117\" y=\"79\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1_di\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds x=\"147\" y=\"141\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"120\" y=\"177\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"234\" y=\"204\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"165\" y=\"177\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"165\" y=\"244\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"234\" y=\"244\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"135\" y=\"201\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/features/replace/copy-properties.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:camunda=\"http://camunda.org/schema/1.0/bpmn\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.7.0-dev\">\n  <bpmn:collaboration id=\"Collaboration_0j2pyna\">\n    <bpmn:participant id=\"Participant_0x9lnke\" name=\"foobar\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" name=\"process_foo\" isExecutable=\"false\" camunda:versionTag=\"1.0\">\n    <bpmn:dataStoreReference id=\"DataStoreReference_1elrt45\" />\n    <bpmn:dataStoreReference id=\"DataStoreReference_1j8ymac\" />\n    <bpmn:dataObjectReference id=\"DataObjectReference_1js94kb\" dataObjectRef=\"DataObject_1l0h55k\" />\n    <bpmn:dataObject id=\"DataObject_1l0h55k\" />\n    <bpmn:dataObjectReference id=\"DataObjectReference_0hkbt95\" dataObjectRef=\"DataObject_1iu55n1\" />\n    <bpmn:dataObject id=\"DataObject_1iu55n1\" />\n    <bpmn:subProcess id=\"SubProcess_04tmqcs\">\n      <bpmn:userTask id=\"Task_1\" camunda:asyncBefore=\"true\" camunda:jobPriority=\"100\">\n        <bpmn:documentation>hello world</bpmn:documentation>\n        <bpmn:extensionElements>\n          <camunda:inputOutput>\n            <camunda:inputParameter name=\"Input_1\">foo</camunda:inputParameter>\n            <camunda:outputParameter name=\"Output_1\">bar</camunda:outputParameter>\n          </camunda:inputOutput>\n          <camunda:properties>\n            <camunda:property name=\"bar\" value=\"foo\" />\n          </camunda:properties>\n          <camunda:executionListener class=\"reallyClassy\" event=\"start\" />\n          <camunda:failedJobRetryTimeCycle>10</camunda:failedJobRetryTimeCycle>\n          <camunda:taskListener class=\"foobar\" event=\"create\" />\n        </bpmn:extensionElements>\n        <bpmn:incoming>SequenceFlow_1e74z8m</bpmn:incoming>\n        <bpmn:outgoing>SequenceFlow_1tdxph9</bpmn:outgoing>\n        <bpmn:property id=\"Property_0j0o7pl\" name=\"__targetRef_placeholder\" />\n        <bpmn:dataInputAssociation id=\"DataInputAssociation_0xdwl7n\">\n          <bpmn:sourceRef>DataStoreReference_1elrt45</bpmn:sourceRef>\n          <bpmn:targetRef>Property_0j0o7pl</bpmn:targetRef>\n        </bpmn:dataInputAssociation>\n        <bpmn:dataInputAssociation id=\"DataInputAssociation_188je0k\">\n          <bpmn:sourceRef>DataObjectReference_0hkbt95</bpmn:sourceRef>\n          <bpmn:targetRef>Property_0j0o7pl</bpmn:targetRef>\n        </bpmn:dataInputAssociation>\n        <bpmn:dataOutputAssociation id=\"DataOutputAssociation_1wf2bxo\">\n          <bpmn:targetRef>DataStoreReference_1j8ymac</bpmn:targetRef>\n        </bpmn:dataOutputAssociation>\n        <bpmn:dataOutputAssociation id=\"DataOutputAssociation_0hr21ne\">\n          <bpmn:targetRef>DataObjectReference_1js94kb</bpmn:targetRef>\n        </bpmn:dataOutputAssociation>\n      </bpmn:userTask>\n      <bpmn:startEvent id=\"StartEvent_1a4dsh8\">\n        <bpmn:outgoing>SequenceFlow_1e74z8m</bpmn:outgoing>\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"SequenceFlow_1e74z8m\" sourceRef=\"StartEvent_1a4dsh8\" targetRef=\"Task_1\" />\n      <bpmn:task id=\"Task_042z61e\">\n        <bpmn:incoming>SequenceFlow_1tdxph9</bpmn:incoming>\n      </bpmn:task>\n      <bpmn:sequenceFlow id=\"SequenceFlow_1tdxph9\" sourceRef=\"Task_1\" targetRef=\"Task_042z61e\" />\n    </bpmn:subProcess>\n    <bpmn:textAnnotation id=\"TextAnnotation_1cghzwc\" />\n    <bpmn:association id=\"Association_0edc446\" sourceRef=\"Task_1\" targetRef=\"TextAnnotation_1cghzwc\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_0j2pyna\">\n      <bpmndi:BPMNShape id=\"UserTask_033cl9l_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"261\" y=\"159.5\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1a4dsh8_di\" bpmnElement=\"StartEvent_1a4dsh8\">\n        <dc:Bounds x=\"168\" y=\"181.5\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"186\" y=\"217.5\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1e74z8m_di\" bpmnElement=\"SequenceFlow_1e74z8m\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"204\" y=\"199.5\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"261\" y=\"199.5\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"233\" y=\"174.5\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_042z61e_di\" bpmnElement=\"Task_042z61e\">\n        <dc:Bounds x=\"441\" y=\"159.5\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1tdxph9_di\" bpmnElement=\"SequenceFlow_1tdxph9\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"361\" y=\"199.5\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"441\" y=\"199.5\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"401\" y=\"184.5\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Participant_0x9lnke_di\" bpmnElement=\"Participant_0x9lnke\">\n        <dc:Bounds x=\"0\" y=\"0\" width=\"632\" height=\"417\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_1cghzwc_di\" bpmnElement=\"TextAnnotation_1cghzwc\">\n        <dc:Bounds x=\"50\" y=\"30.5\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_1elrt45_di\" bpmnElement=\"DataStoreReference_1elrt45\">\n        <dc:Bounds x=\"211\" y=\"347.5\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"236\" y=\"397.5\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_1j8ymac_di\" bpmnElement=\"DataStoreReference_1j8ymac\">\n        <dc:Bounds x=\"345\" y=\"347.5\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"370\" y=\"397.5\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_1js94kb_di\" bpmnElement=\"DataObjectReference_1js94kb\">\n        <dc:Bounds x=\"352\" y=\"20.5\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"370\" y=\"70.5\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_0hkbt95_di\" bpmnElement=\"DataObjectReference_0hkbt95\">\n        <dc:Bounds x=\"218\" y=\"20.5\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"236\" y=\"70.5\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_04tmqcs_di\" bpmnElement=\"SubProcess_04tmqcs\" isExpanded=\"true\">\n        <dc:Bounds x=\"153\" y=\"104.5\" width=\"459\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_0edc446_di\" bpmnElement=\"Association_0edc446\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"265\" y=\"165.5\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"121\" y=\"60.5\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_0xdwl7n_di\" bpmnElement=\"DataInputAssociation_0xdwl7n\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"244\" y=\"347.5\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"276\" y=\"239.5\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_1wf2bxo_di\" bpmnElement=\"DataOutputAssociation_1wf2bxo\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"323\" y=\"239.5\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"354\" y=\"347.5\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_0hr21ne_di\" bpmnElement=\"DataOutputAssociation_0hr21ne\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"329\" y=\"159.5\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"368\" y=\"70.5\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_188je0k_di\" bpmnElement=\"DataInputAssociation_188je0k\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"245\" y=\"70.5\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"275\" y=\"159.5\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/features/replace/data-elements.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process\" isExecutable=\"false\">\n    <bpmn:dataObjectReference id=\"DataObjectReference_1\" dataObjectRef=\"DataObject\" />\n    <bpmn:dataObject id=\"DataObject\" />\n    <bpmn:dataObjectReference id=\"DataObjectReference_2\" dataObjectRef=\"DataObject\" />\n    <bpmn:dataObjectReference id=\"DataObjectReference_NO_DataObject\" />\n    <bpmn:dataStoreReference id=\"DataStoreReference_1\" dataStoreRef=\"DataStore\" />\n    <bpmn:dataStore id=\"DataStore\" />\n    <bpmn:dataStoreReference id=\"DataStoreReference_NO_DataStore\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process\">\n      <bpmndi:BPMNShape id=\"DataObjectReference_1_di\" bpmnElement=\"DataObjectReference_1\">\n        <dc:Bounds x=\"200\" y=\"200\" width=\"36\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_2_di\" bpmnElement=\"DataObjectReference_2\">\n        <dc:Bounds x=\"300\" y=\"200\" width=\"36\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_NO_DataObject_di\" bpmnElement=\"DataObjectReference_NO_DataObject\">\n        <dc:Bounds x=\"300\" y=\"300\" width=\"36\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_1_di\" bpmnElement=\"DataStoreReference_1\">\n        <dc:Bounds x=\"400\" y=\"200\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_NO_DataStore_di\" bpmnElement=\"DataStoreReference_NO_DataStore\">\n        <dc:Bounds x=\"400\" y=\"300\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/features/replace/data-stores-positioned-against-participant.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_19f4rsu\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.12.0\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.15.0\">\n  <bpmn:collaboration id=\"Collaboration_0jl6l17\">\n    <bpmn:participant id=\"Participant_1d4xc0j\" processRef=\"Process_07mbex6\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_07mbex6\" isExecutable=\"true\">\n    <bpmn:startEvent id=\"StartEvent_1\" />\n    <bpmn:dataStoreReference id=\"DataStoreReference_0\" />\n    <bpmn:dataStoreReference id=\"DataStoreReference_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_0jl6l17\">\n      <bpmndi:BPMNShape id=\"Participant_1d4xc0j_di\" bpmnElement=\"Participant_1d4xc0j\" isHorizontal=\"true\">\n        <dc:Bounds x=\"129\" y=\"52\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"179\" y=\"159\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_0_di\" bpmnElement=\"DataStoreReference_0\">\n        <dc:Bounds x=\"275\" y=\"152\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_1_di\" bpmnElement=\"DataStoreReference_1\">\n        <dc:Bounds x=\"805\" y=\"152\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/features/replace/participants.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:collaboration id=\"Collaboration_1\">\n    <bpmn:participant id=\"Participant_1\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_1_di\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"200\" y=\"200\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/features/rules/event-based-gateway-outgoing-edge.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n  xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n  xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\"\n  xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\"\n  id=\"Definitions_1\"\n  targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:eventBasedGateway id=\"EventBasedGateway_1\" name=\"\" />\n    <bpmn:intermediateThrowEvent id=\"IntermediateThrowEvent_0\" />\n    <bpmn:intermediateCatchEvent id=\"IntermediateCatchEvent_0\" name=\"\">\n      <bpmn:messageEventDefinition />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:intermediateCatchEvent id=\"IntermediateCatchEvent_1\" name=\"\">\n      <bpmn:timerEventDefinition />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:intermediateCatchEvent id=\"IntermediateCatchEvent_2\" name=\"\">\n      <bpmn:conditionalEventDefinition />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:intermediateCatchEvent id=\"IntermediateCatchEvent_3\" name=\"\">\n      <bpmn:signalEventDefinition />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:receiveTask id=\"ReceiveTask_1\" name=\"\" />\n    <bpmn:task id=\"Task_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"EventBasedGateway_1_di\" bpmnElement=\"EventBasedGateway_1\">\n        <dc:Bounds x=\"46\" y=\"147\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"26\" y=\"197\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_0_di\" bpmnElement=\"IntermediateThrowEvent_0\">\n        <dc:Bounds x=\"216\" y=\"36\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"189\" y=\"72\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_0_di\" bpmnElement=\"IntermediateCatchEvent_0\">\n        <dc:Bounds x=\"216\" y=\"96\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"189\" y=\"132\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_1_di\" bpmnElement=\"IntermediateCatchEvent_1\">\n        <dc:Bounds x=\"216\" y=\"154\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"189\" y=\"190\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_2_di\" bpmnElement=\"IntermediateCatchEvent_2\">\n        <dc:Bounds x=\"216\" y=\"218\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"189\" y=\"254\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_3_di\" bpmnElement=\"IntermediateCatchEvent_3\">\n        <dc:Bounds x=\"216\" y=\"287\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"189\" y=\"323\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ReceiveTask_1_di\" bpmnElement=\"ReceiveTask_1\">\n        <dc:Bounds x=\"184\" y=\"377\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"184\" y=\"483\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/features/rules/link-event.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_incoming\" />\n    <bpmn:intermediateCatchEvent id=\"IntermediateCatchEvent\" name=\"\">\n      <bpmn:linkEventDefinition />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:intermediateThrowEvent id=\"IntermediateThrowEvent\" name=\"\">\n      <bpmn:linkEventDefinition />\n    </bpmn:intermediateThrowEvent>\n    <bpmn:task id=\"Task_outgoing\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_incoming_di\" bpmnElement=\"Task_incoming\">\n        <dc:Bounds x=\"224\" y=\"176\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_di\" bpmnElement=\"IntermediateCatchEvent\">\n        <dc:Bounds x=\"512\" y=\"128\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"485\" y=\"164\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_di\" bpmnElement=\"IntermediateThrowEvent\">\n        <dc:Bounds x=\"512\" y=\"247\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"485\" y=\"283\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_outgoing_di\" bpmnElement=\"Task_outgoing\">\n        <dc:Bounds x=\"713\" y=\"176\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/features/rules/text-annotation-association.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n  xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n  xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\"\n  xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  id=\"Definitions_1\"\n  targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\" />\n    <bpmn:textAnnotation id=\"TextAnnotation_1\">\n      <bpmn:text>A label</bpmn:text>\n    </bpmn:textAnnotation>\n    <bpmn:association id=\"Association_1\" sourceRef=\"StartEvent_1\" targetRef=\"TextAnnotation_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_1_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"285\" y=\"24\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_1_di\" bpmnElement=\"Association_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"207\" y=\"114\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"285\" y=\"83\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/flow-markers.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:signavio=\"http://www.signavio.com\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"sid-99115ee8-44b2-451c-8a03-e518d24c5283\" exporter=\"Signavio Process Editor, http://www.signavio.com\" exporterVersion=\"8.0.0\" targetNamespace=\"http://www.signavio.com/bpmn20\">\n  <dataStore id=\"sid-5dd31c58-1f9e-43bc-90c3-b648ee304dfe\" isUnlimited=\"false\"/>\n  <message id=\"sid-596C4565-5945-4525-9133-FC6BDD3011BA\"/>\n  <collaboration id=\"sid-81a32ec0-824a-4054-a133-cae53290b96a\">\n    <participant id=\"sid-E9A22478-7DA8-423A-BE30-D589EFC64E75\" name=\"external\"/>\n    <participant id=\"sid-CA537EF9-7829-498E-8058-DEB94EB54D25\" name=\"other external\"/>\n    <participant id=\"sid-8017E317-C1C3-44D1-BE7E-91FC52186A3A\" name=\"look inside\" processRef=\"sid-BB96F634-D3B8-401E-BDFF-8DCC81DD1C7F\"/>\n    <messageFlow id=\"sid-CF6AC14E-C673-4AB8-8B75-55C8B8644CC2\" sourceRef=\"sid-CA537EF9-7829-498E-8058-DEB94EB54D25\" targetRef=\"sid-8017E317-C1C3-44D1-BE7E-91FC52186A3A\"/>\n    <messageFlow id=\"sid-76F791BC-0884-4991-ADF8-64A05DB036D1\" messageRef=\"sid-596C4565-5945-4525-9133-FC6BDD3011BA\" sourceRef=\"sid-E9A22478-7DA8-423A-BE30-D589EFC64E75\" targetRef=\"sid-8017E317-C1C3-44D1-BE7E-91FC52186A3A\"/>\n    <messageFlow id=\"sid-30219B81-5753-4B9C-A8B5-CBBFD3B115A1\" messageRef=\"sid-596C4565-5945-4525-9133-FC6BDD3011BA\" sourceRef=\"sid-4E41E3B4-66AB-492E-AB51-C6499800D240\" targetRef=\"sid-E9A22478-7DA8-423A-BE30-D589EFC64E75\"/>\n    <messageFlow id=\"sid-C1F65713-8541-4308-9092-6D5AAB29DE01\" sourceRef=\"sid-E9A22478-7DA8-423A-BE30-D589EFC64E75\" targetRef=\"sid-4E41E3B4-66AB-492E-AB51-C6499800D240\"/>\n    <messageFlow id=\"sid-7C0D861C-CA43-4B5E-8764-1D759AF94D0C\" sourceRef=\"sid-8017E317-C1C3-44D1-BE7E-91FC52186A3A\" targetRef=\"sid-E9A22478-7DA8-423A-BE30-D589EFC64E75\"/>\n  </collaboration>\n  <process id=\"sid-BB96F634-D3B8-401E-BDFF-8DCC81DD1C7F\" name=\"look inside\" isExecutable=\"false\">\n    <laneSet id=\"sid-d4f6cbd0-6af0-4d3f-afcd-a35d36d2e262\">\n      <lane id=\"sid-C01CCEF6-E378-4B05-87B4-A8E73B9E33AC\">\n        <flowNodeRef>sid-37185958-C044-425D-9B8C-DB8DEE274097</flowNodeRef>\n        <flowNodeRef>sid-B681960F-8C8E-4E3E-8310-0DF3126FD429</flowNodeRef>\n        <flowNodeRef>sid-5616CC3E-C211-4BE0-A0FB-DED35046FA90</flowNodeRef>\n        <flowNodeRef>sid-4E41E3B4-66AB-492E-AB51-C6499800D240</flowNodeRef>\n      </lane>\n    </laneSet>\n    <dataObject id=\"sid-ab92b8a4-0f79-4a46-b388-f74d469db559\"/>\n    <task id=\"sid-37185958-C044-425D-9B8C-DB8DEE274097\">\n      <outgoing>sid-69CE7F49-8ECD-45B6-9BBD-327796B854CE</outgoing>\n      <outgoing>sid-7282B370-204F-44BE-AACA-B33047993F81</outgoing>\n      <ioSpecification id=\"sid-b06e80c1-e794-4469-a63f-d21d510b32bd\">\n        <dataOutput id=\"sid-33abed7e-c0d1-4ccb-a95a-ae5e61faba30\"/>\n        <inputSet id=\"sid-fd64d367-a3a9-4546-b3a7-983b5e2c517f\" name=\"DefaultInputSet\">\n          <outputSetRefs>sid-d548519b-5784-4e5b-9be9-7a9e082ae9b4</outputSetRefs>\n          <outputSetRefs>sid-d548519b-5784-4e5b-9be9-7a9e082ae9b4</outputSetRefs>\n        </inputSet>\n        <outputSet id=\"sid-d548519b-5784-4e5b-9be9-7a9e082ae9b4\" name=\"DefaultOutputSet\">\n          <dataOutputRefs>sid-33abed7e-c0d1-4ccb-a95a-ae5e61faba30</dataOutputRefs>\n          <inputSetRefs>sid-fd64d367-a3a9-4546-b3a7-983b5e2c517f</inputSetRefs>\n          <inputSetRefs>sid-fd64d367-a3a9-4546-b3a7-983b5e2c517f</inputSetRefs>\n        </outputSet>\n      </ioSpecification>\n      <dataInputAssociation id=\"sid-6B33BF63-4DC8-4EDB-B7C6-0030EEFFA3EB\">\n        <sourceRef>sid-2FB8A264-C197-4769-A020-02F3654875A0</sourceRef>\n      </dataInputAssociation>\n      <dataOutputAssociation id=\"sid-F26F0F24-45C1-44D2-81FF-467833EFE8CF\">\n        <sourceRef>sid-33abed7e-c0d1-4ccb-a95a-ae5e61faba30</sourceRef>\n        <targetRef>sid-F5232AB9-7F31-43EE-B0EC-A74EB8CD96DE</targetRef>\n      </dataOutputAssociation>\n    </task>\n    <exclusiveGateway id=\"sid-B681960F-8C8E-4E3E-8310-0DF3126FD429\" gatewayDirection=\"Diverging\" default=\"sid-6DCC22DB-1B44-4DE7-A9F5-60C2070B73CC\">\n      <incoming>sid-69CE7F49-8ECD-45B6-9BBD-327796B854CE</incoming>\n      <outgoing>sid-6DCC22DB-1B44-4DE7-A9F5-60C2070B73CC</outgoing>\n      <outgoing>sid-CC60949F-0A88-4902-9011-0FE6AA355254</outgoing>\n    </exclusiveGateway>\n    <intermediateThrowEvent id=\"sid-5616CC3E-C211-4BE0-A0FB-DED35046FA90\">\n      <incoming>sid-6DCC22DB-1B44-4DE7-A9F5-60C2070B73CC</incoming>\n      <incoming>sid-7282B370-204F-44BE-AACA-B33047993F81</incoming>\n    </intermediateThrowEvent>\n    <serviceTask id=\"sid-4E41E3B4-66AB-492E-AB51-C6499800D240\" implementation=\"webService\">\n      <incoming>sid-CC60949F-0A88-4902-9011-0FE6AA355254</incoming>\n      <ioSpecification id=\"sid-9d05d9fc-66b0-4657-b296-d75767622b00\">\n        <dataInput id=\"sid-d17816af-06d3-4ecd-b051-7b9d4c6ddcc2\"/>\n        <inputSet id=\"sid-9b67a3af-0e23-4f34-9f75-20cd544c9bad\" name=\"DefaultInputSet\">\n          <dataInputRefs>sid-d17816af-06d3-4ecd-b051-7b9d4c6ddcc2</dataInputRefs>\n          <outputSetRefs>sid-8f07615b-9240-4b27-b38e-a76869b913dc</outputSetRefs>\n          <outputSetRefs>sid-8f07615b-9240-4b27-b38e-a76869b913dc</outputSetRefs>\n        </inputSet>\n        <outputSet id=\"sid-8f07615b-9240-4b27-b38e-a76869b913dc\" name=\"DefaultOutputSet\">\n          <inputSetRefs>sid-9b67a3af-0e23-4f34-9f75-20cd544c9bad</inputSetRefs>\n          <inputSetRefs>sid-9b67a3af-0e23-4f34-9f75-20cd544c9bad</inputSetRefs>\n        </outputSet>\n      </ioSpecification>\n      <dataInputAssociation id=\"sid-7BBE0A25-CC78-4CCB-A0B4-E5EE77D9A65E\">\n        <sourceRef>sid-F5232AB9-7F31-43EE-B0EC-A74EB8CD96DE</sourceRef>\n        <targetRef>sid-d17816af-06d3-4ecd-b051-7b9d4c6ddcc2</targetRef>\n      </dataInputAssociation>\n    </serviceTask>\n    <sequenceFlow id=\"sid-6DCC22DB-1B44-4DE7-A9F5-60C2070B73CC\" sourceRef=\"sid-B681960F-8C8E-4E3E-8310-0DF3126FD429\" targetRef=\"sid-5616CC3E-C211-4BE0-A0FB-DED35046FA90\"/>\n    <sequenceFlow id=\"sid-69CE7F49-8ECD-45B6-9BBD-327796B854CE\" sourceRef=\"sid-37185958-C044-425D-9B8C-DB8DEE274097\" targetRef=\"sid-B681960F-8C8E-4E3E-8310-0DF3126FD429\"/>\n    <sequenceFlow id=\"sid-7282B370-204F-44BE-AACA-B33047993F81\" sourceRef=\"sid-37185958-C044-425D-9B8C-DB8DEE274097\" targetRef=\"sid-5616CC3E-C211-4BE0-A0FB-DED35046FA90\">\n      <conditionExpression xsi:type=\"tFormalExpression\">foo</conditionExpression>\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-CC60949F-0A88-4902-9011-0FE6AA355254\" sourceRef=\"sid-B681960F-8C8E-4E3E-8310-0DF3126FD429\" targetRef=\"sid-4E41E3B4-66AB-492E-AB51-C6499800D240\">\n      <conditionExpression xsi:type=\"tFormalExpression\">foo</conditionExpression>\n    </sequenceFlow>\n    <dataObjectReference id=\"sid-F5232AB9-7F31-43EE-B0EC-A74EB8CD96DE\" dataObjectRef=\"sid-ab92b8a4-0f79-4a46-b388-f74d469db559\"/>\n    <dataStoreReference id=\"sid-2FB8A264-C197-4769-A020-02F3654875A0\" dataStoreRef=\"sid-5dd31c58-1f9e-43bc-90c3-b648ee304dfe\"/>\n    <association id=\"sid-B40587A8-93DA-494D-AA64-8A7B60B65202\" sourceRef=\"sid-EEC70799-8E21-411A-9425-BD1DDA92FE0A\" targetRef=\"sid-C01CCEF6-E378-4B05-87B4-A8E73B9E33AC\"/>\n    <association id=\"sid-92AFFC7A-EA9B-4A5F-892F-311C0132A7A5\" sourceRef=\"sid-869F3923-E7C8-4307-B370-58BD6016C028\" targetRef=\"sid-B681960F-8C8E-4E3E-8310-0DF3126FD429\"/>\n    <textAnnotation id=\"sid-869F3923-E7C8-4307-B370-58BD6016C028\">\n      <text>A gateway</text>\n    </textAnnotation>\n    <textAnnotation id=\"sid-EEC70799-8E21-411A-9425-BD1DDA92FE0A\">\n      <text>A pool</text>\n    </textAnnotation>\n  </process>\n  <bpmndi:BPMNDiagram id=\"sid-e9e4b544-81bf-4303-bd45-e45c39794c2c\">\n    <bpmndi:BPMNPlane id=\"sid-71fa1645-e6f2-49d2-a936-c4d56b7593bc\" bpmnElement=\"sid-81a32ec0-824a-4054-a133-cae53290b96a\">\n      <bpmndi:BPMNShape id=\"sid-E9A22478-7DA8-423A-BE30-D589EFC64E75_gui\" bpmnElement=\"sid-E9A22478-7DA8-423A-BE30-D589EFC64E75\" isHorizontal=\"true\">\n        <omgdc:Bounds height=\"60.0\" width=\"500.0\" x=\"270.0\" y=\"652.0\"/>\n        <bpmndi:BPMNLabel labelStyle=\"sid-b3b67b2b-3b4c-4256-b506-376edded1e68\">\n          <omgdc:Bounds height=\"20.0\" width=\"81.42859\" x=\"479.2857\" y=\"669.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-CA537EF9-7829-498E-8058-DEB94EB54D25_gui\" bpmnElement=\"sid-CA537EF9-7829-498E-8058-DEB94EB54D25\" isHorizontal=\"true\">\n        <omgdc:Bounds height=\"60.0\" width=\"500.0\" x=\"915.0\" y=\"202.0\"/>\n        <bpmndi:BPMNLabel labelStyle=\"sid-b3b67b2b-3b4c-4256-b506-376edded1e68\">\n          <omgdc:Bounds height=\"20.0\" width=\"142.85715\" x=\"1093.5714\" y=\"219.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-8017E317-C1C3-44D1-BE7E-91FC52186A3A_gui\" bpmnElement=\"sid-8017E317-C1C3-44D1-BE7E-91FC52186A3A\" isHorizontal=\"true\">\n        <omgdc:Bounds height=\"361.0\" width=\"600.0\" x=\"165.0\" y=\"91.0\"/>\n        <bpmndi:BPMNLabel labelStyle=\"sid-b3b67b2b-3b4c-4256-b506-376edded1e68\">\n          <omgdc:Bounds height=\"63.428574\" width=\"12.0\" x=\"170.0\" y=\"239.7857\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-C01CCEF6-E378-4B05-87B4-A8E73B9E33AC_gui\" bpmnElement=\"sid-C01CCEF6-E378-4B05-87B4-A8E73B9E33AC\" isHorizontal=\"true\">\n        <omgdc:Bounds height=\"361.0\" width=\"570.0\" x=\"195.0\" y=\"91.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-37185958-C044-425D-9B8C-DB8DEE274097_gui\" bpmnElement=\"sid-37185958-C044-425D-9B8C-DB8DEE274097\">\n        <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"240.0\" y=\"247.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-B681960F-8C8E-4E3E-8310-0DF3126FD429_gui\" bpmnElement=\"sid-B681960F-8C8E-4E3E-8310-0DF3126FD429\" isMarkerVisible=\"true\">\n        <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"405.0\" y=\"267.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-5616CC3E-C211-4BE0-A0FB-DED35046FA90_gui\" bpmnElement=\"sid-5616CC3E-C211-4BE0-A0FB-DED35046FA90\">\n        <omgdc:Bounds height=\"30.0\" width=\"30.0\" x=\"410.0\" y=\"372.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-4E41E3B4-66AB-492E-AB51-C6499800D240_gui\" bpmnElement=\"sid-4E41E3B4-66AB-492E-AB51-C6499800D240\">\n        <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"612.5\" y=\"247.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-F5232AB9-7F31-43EE-B0EC-A74EB8CD96DE_gui\" bpmnElement=\"sid-F5232AB9-7F31-43EE-B0EC-A74EB8CD96DE\">\n        <omgdc:Bounds height=\"62.0\" width=\"55.0\" x=\"452.0\" y=\"160.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-2FB8A264-C197-4769-A020-02F3654875A0_gui\" bpmnElement=\"sid-2FB8A264-C197-4769-A020-02F3654875A0\">\n        <omgdc:Bounds height=\"60.173\" width=\"62.001\" x=\"225.0\" y=\"121.827\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-869F3923-E7C8-4307-B370-58BD6016C028_gui\" bpmnElement=\"sid-869F3923-E7C8-4307-B370-58BD6016C028\">\n        <omgdc:Bounds height=\"50.0\" width=\"100.0\" x=\"510.0\" y=\"314.0\"/>\n        <bpmndi:BPMNLabel labelStyle=\"sid-48484886-e724-441f-a0c0-ee5505fe4c68\">\n          <omgdc:Bounds height=\"12.0\" width=\"62.571426\" x=\"514.0\" y=\"330.5\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-EEC70799-8E21-411A-9425-BD1DDA92FE0A_gui\" bpmnElement=\"sid-EEC70799-8E21-411A-9425-BD1DDA92FE0A\">\n        <omgdc:Bounds height=\"50.0\" width=\"100.0\" x=\"885.0\" y=\"427.0\"/>\n        <bpmndi:BPMNLabel labelStyle=\"sid-48484886-e724-441f-a0c0-ee5505fe4c68\">\n          <omgdc:Bounds height=\"12.0\" width=\"38.57143\" x=\"889.0\" y=\"443.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-7BBE0A25-CC78-4CCB-A0B4-E5EE77D9A65E_gui\" bpmnElement=\"sid-7BBE0A25-CC78-4CCB-A0B4-E5EE77D9A65E\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"507.0\" y=\"205.42622\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"612.5\" y=\"260.77048\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-69CE7F49-8ECD-45B6-9BBD-327796B854CE_gui\" bpmnElement=\"sid-69CE7F49-8ECD-45B6-9BBD-327796B854CE\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"340.0\" y=\"287.1845\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"405.0\" y=\"287.42435\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-CF6AC14E-C673-4AB8-8B75-55C8B8644CC2_gui\" bpmnElement=\"sid-CF6AC14E-C673-4AB8-8B75-55C8B8644CC2\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"915.0\" y=\"232.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"765.0\" y=\"232.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-76F791BC-0884-4991-ADF8-64A05DB036D1_gui\" bpmnElement=\"sid-76F791BC-0884-4991-ADF8-64A05DB036D1\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"301.0\" y=\"652.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"301.0\" y=\"452.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-F26F0F24-45C1-44D2-81FF-467833EFE8CF_gui\" bpmnElement=\"sid-F26F0F24-45C1-44D2-81FF-467833EFE8CF\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"340.0\" y=\"261.6702\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"452.0\" y=\"204.9314\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-30219B81-5753-4B9C-A8B5-CBBFD3B115A1_gui\" bpmnElement=\"sid-30219B81-5753-4B9C-A8B5-CBBFD3B115A1\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"679.1667\" y=\"327.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"679.1667\" y=\"652.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-C1F65713-8541-4308-9092-6D5AAB29DE01_gui\" bpmnElement=\"sid-C1F65713-8541-4308-9092-6D5AAB29DE01\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"645.8333\" y=\"652.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"645.8333\" y=\"327.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-6B33BF63-4DC8-4EDB-B7C6-0030EEFFA3EB_gui\" bpmnElement=\"sid-6B33BF63-4DC8-4EDB-B7C6-0030EEFFA3EB\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"263.2746\" y=\"182.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"279.81888\" y=\"247.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-7282B370-204F-44BE-AACA-B33047993F81_gui\" bpmnElement=\"sid-7282B370-204F-44BE-AACA-B33047993F81\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"290.0\" y=\"327.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"290.0\" y=\"387.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"410.0\" y=\"387.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-7C0D861C-CA43-4B5E-8764-1D759AF94D0C_gui\" bpmnElement=\"sid-7C0D861C-CA43-4B5E-8764-1D759AF94D0C\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"335.0\" y=\"452.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"335.0\" y=\"652.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-92AFFC7A-EA9B-4A5F-892F-311C0132A7A5_gui\" bpmnElement=\"sid-92AFFC7A-EA9B-4A5F-892F-311C0132A7A5\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"510.0\" y=\"337.9035\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"445.0\" y=\"299.1316\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-6DCC22DB-1B44-4DE7-A9F5-60C2070B73CC_gui\" bpmnElement=\"sid-6DCC22DB-1B44-4DE7-A9F5-60C2070B73CC\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"425.0\" y=\"307.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"425.0\" y=\"372.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-B40587A8-93DA-494D-AA64-8A7B60B65202_gui\" bpmnElement=\"sid-B40587A8-93DA-494D-AA64-8A7B60B65202\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"885.0\" y=\"450.5579\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"765.0\" y=\"397.5037\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-CC60949F-0A88-4902-9011-0FE6AA355254_gui\" bpmnElement=\"sid-CC60949F-0A88-4902-9011-0FE6AA355254\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"445.0\" y=\"287.45886\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"612.5\" y=\"287.1055\"/>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-48484886-e724-441f-a0c0-ee5505fe4c68\">\n      <omgdc:Font name=\"Arial\" size=\"11.0\"/>\n    </bpmndi:BPMNLabelStyle>\n    <bpmndi:BPMNLabelStyle id=\"sid-b3b67b2b-3b4c-4256-b506-376edded1e68\">\n      <omgdc:Font name=\"Arial\" size=\"12.0\"/>\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n</definitions>"
  },
  {
    "path": "test/fixtures/bpmn/import/boundaryEvent.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_THeRQC65EeWXq9AVm82tjg\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:task id=\"Task_1\"/>\n    <bpmn2:boundaryEvent id=\"BoundaryEvent_1\" name=\"\" attachedToRef=\"Task_1\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:boundaryEvent>\n    <bpmn2:task id=\"Task_2\">\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n    </bpmn2:task>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"BoundaryEvent_1\" targetRef=\"Task_2\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"133.0\" y=\"118.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_BoundaryEvent_2\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"143.0\" y=\"180.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_2\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"301.0\" y=\"287.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_BoundaryEvent_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"161.0\" y=\"216.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"161.0\" y=\"327.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"301.0\" y=\"327.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"173.0\" y=\"327.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/import/collaboration.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_pHDz0KojEeOJhIBv1RySdg\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"Participant_2\" name=\"Pool\" processRef=\"Process_1\"/>\n    <bpmn2:participant id=\"Participant_1\" name=\"Pool\" processRef=\"Process_2\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Lane_1\" name=\"Lane 1\">\n        <bpmn2:childLaneSet xsi:type=\"bpmn2:tLaneSet\" id=\"LaneSet_2\">\n          <bpmn2:lane id=\"Lane_2\" name=\"Lane 2\"/>\n          <bpmn2:lane id=\"Lane_3\" name=\"Lane 3\">\n            <bpmn2:flowNodeRef>Task_1</bpmn2:flowNodeRef>\n          </bpmn2:lane>\n        </bpmn2:childLaneSet>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:task id=\"Task_1\"/>\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn2:startEvent id=\"StartEvent_1\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"356.0\" width=\"540.0\" x=\"222.0\" y=\"0.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_3\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds height=\"100.0\" width=\"600.0\" x=\"222.0\" y=\"415.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_2\" bpmnElement=\"Lane_1\" isHorizontal=\"true\">\n        <dc:Bounds height=\"356.0\" width=\"510.0\" x=\"252.0\" y=\"0.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_3\" bpmnElement=\"Lane_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"215.0\" width=\"480.0\" x=\"282.0\" y=\"0.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_4\" bpmnElement=\"Lane_3\" isHorizontal=\"true\">\n        <dc:Bounds height=\"142.0\" width=\"480.0\" x=\"282.0\" y=\"214.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_3\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"324.0\" y=\"448.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"1.0\" width=\"0.0\" x=\"342.0\" y=\"489.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"360.0\" y=\"246.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/import/collapsed/collaboration.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_gjIcQOGMEeOMxZBwjBin-g\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"_Participant_2\" name=\"Pool\" processRef=\"Process_1\"/>\n    <bpmn2:participant id=\"Participant_1\" name=\"Pool\" processRef=\"Process_2\"/>\n    <bpmn2:participant id=\"Participant_2\" name=\"Pool\" processRef=\"Process_3\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\"/>\n  <bpmn2:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Lane_1\" name=\"Lane\">\n        <bpmn2:flowNodeRef>SubProcess_2</bpmn2:flowNodeRef>\n        <bpmn2:flowNodeRef>SubProcess_1</bpmn2:flowNodeRef>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:subProcess id=\"SubProcess_2\">\n      <bpmn2:startEvent id=\"StartEvent_1\"/>\n    </bpmn2:subProcess>\n    <bpmn2:subProcess id=\"SubProcess_1\">\n      <bpmn2:task id=\"Task_1\"/>\n    </bpmn2:subProcess>\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_3\" isExecutable=\"false\">\n    <bpmn2:subProcess id=\"SubProcess_3\">\n      <bpmn2:startEvent id=\"StartEvent_2\"/>\n    </bpmn2:subProcess>\n    <bpmn2:subProcess id=\"SubProcess_4\">\n      <bpmn2:task id=\"Task_2\"/>\n    </bpmn2:subProcess>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"_Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"133.0\" width=\"540.0\" x=\"36.0\" y=\"24.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_3\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds height=\"217.0\" width=\"600.0\" x=\"36.0\" y=\"180.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_2\" bpmnElement=\"Lane_1\" isHorizontal=\"true\">\n        <dc:Bounds height=\"217.0\" width=\"570.0\" x=\"66.0\" y=\"180.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_2\" bpmnElement=\"SubProcess_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"144.0\" y=\"239.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_3\" bpmnElement=\"SubProcess_2\" isExpanded=\"true\">\n        <dc:Bounds height=\"150.0\" width=\"200.0\" x=\"396.0\" y=\"204.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"144.0\" y=\"239.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"528.0\" y=\"288.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"546.0\" y=\"329.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_4\" bpmnElement=\"Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"193.0\" width=\"600.0\" x=\"36.0\" y=\"420.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_4\" bpmnElement=\"SubProcess_3\" isExpanded=\"true\">\n        <dc:Bounds height=\"150.0\" width=\"200.0\" x=\"396.0\" y=\"442.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_3\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"538.0\" y=\"529.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"556.0\" y=\"570.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_5\" bpmnElement=\"SubProcess_4\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"144.0\" y=\"477.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_2\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"144.0\" y=\"477.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/import/collapsed/process.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_602NsOCpEeOMld_vAxsi8Q\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:subProcess id=\"SubProcess_1\">\n      <bpmn2:intermediateCatchEvent id=\"IntermediateCatchEvent_1\"/>\n    </bpmn2:subProcess>\n    <bpmn2:transaction id=\"Transaction_1\">\n      <bpmn2:userTask id=\"UserTask_1\"/>\n    </bpmn2:transaction>\n    <bpmn2:adHocSubProcess id=\"AdHocSubProcess_1\">\n      <bpmn2:startEvent id=\"StartEvent_1\"/>\n    </bpmn2:adHocSubProcess>\n    <bpmn2:subProcess id=\"SubProcess_3\">\n      <bpmn2:task id=\"Task_2\"/>\n    </bpmn2:subProcess>\n    <bpmn2:subProcess id=\"SubProcess_4\">\n      <bpmn2:subProcess id=\"SubProcess_5\">\n        <bpmn2:task id=\"Task_3\"/>\n      </bpmn2:subProcess>\n    </bpmn2:subProcess>\n    <bpmn2:subProcess id=\"SubProcess_2\">\n      <bpmn2:dataObject id=\"DataObject_1\" name=\"Data Object 1\"/>\n      <bpmn2:startEvent id=\"StartEvent_2\" name=\"start event\"/>\n      <bpmn2:dataObjectReference id=\"DataObjectReference_1\" name=\"data object\" dataObjectRef=\"DataObject_1\"/>\n    </bpmn2:subProcess>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_2\" bpmnElement=\"SubProcess_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"96.0\" y=\"108.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Transaction_2\" bpmnElement=\"Transaction_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"272.0\" y=\"108.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_AdHocSubProcess_2\" bpmnElement=\"AdHocSubProcess_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"456.0\" y=\"108.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_UserTask_2\" bpmnElement=\"UserTask_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"272.0\" y=\"108.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateCatchEvent_2\" bpmnElement=\"IntermediateCatchEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"128.0\" y=\"130.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"146.0\" y=\"171.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_4\" bpmnElement=\"SubProcess_3\" isExpanded=\"true\">\n        <dc:Bounds height=\"150.0\" width=\"200.0\" x=\"96.0\" y=\"252.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_7\" bpmnElement=\"Task_2\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"120.0\" y=\"272.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"488.0\" y=\"130.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"506.0\" y=\"171.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_5\" bpmnElement=\"SubProcess_4\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"648.0\" y=\"108.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_6\" bpmnElement=\"SubProcess_5\" isExpanded=\"true\">\n        <dc:Bounds height=\"140.0\" width=\"160.0\" x=\"618.0\" y=\"78.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_8\" bpmnElement=\"Task_3\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"648.0\" y=\"108.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_7\" bpmnElement=\"SubProcess_2\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"405.0\" y=\"276.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_3\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"395.0\" y=\"296.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"22.0\" width=\"66.0\" x=\"380.0\" y=\"337.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_DataObjectReference_3\" bpmnElement=\"DataObjectReference_1\">\n        <dc:Bounds height=\"50.0\" width=\"36.0\" x=\"479.0\" y=\"291.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"22.0\" width=\"70.0\" x=\"462.0\" y=\"346.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/import/collapsed/processWithChildren.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"_U0Z10NLzEeSKyddZMwwjAA\" targetNamespace=\"http://camunda.org/schema/1.0/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"0.7.0-dev\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:subProcess id=\"SubProcess_1\">\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_4</bpmn2:outgoing>\n      <bpmn2:startEvent id=\"StartEvent_2\" name=\"StartEvent_2\">\n        <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n      </bpmn2:startEvent>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_2\" name=\"\" sourceRef=\"StartEvent_2\" targetRef=\"ExclusiveGateway_1\" />\n      <bpmn2:exclusiveGateway id=\"ExclusiveGateway_1\">\n        <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n        <bpmn2:outgoing>SequenceFlow_5</bpmn2:outgoing>\n        <bpmn2:outgoing>SequenceFlow_6</bpmn2:outgoing>\n      </bpmn2:exclusiveGateway>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_5\" name=\"\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"Task_1\" />\n      <bpmn2:sequenceFlow id=\"SequenceFlow_6\" name=\"\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"ScriptTask_1\" />\n      <bpmn2:scriptTask id=\"ScriptTask_1\">\n        <bpmn2:incoming>SequenceFlow_6</bpmn2:incoming>\n        <bpmn2:outgoing>SequenceFlow_7</bpmn2:outgoing>\n      </bpmn2:scriptTask>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_7\" name=\"\" sourceRef=\"ScriptTask_1\" targetRef=\"EndEvent_3\" />\n      <bpmn2:task id=\"Task_1\">\n        <bpmn2:incoming>SequenceFlow_5</bpmn2:incoming>\n        <bpmn2:outgoing>SequenceFlow_3</bpmn2:outgoing>\n      </bpmn2:task>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_3\" name=\"\" sourceRef=\"Task_1\" targetRef=\"EndEvent_1\" />\n      <bpmn2:endEvent id=\"EndEvent_1\" name=\"EndEvent_1\">\n        <bpmn2:incoming>SequenceFlow_3</bpmn2:incoming>\n      </bpmn2:endEvent>\n      <bpmn2:endEvent id=\"EndEvent_3\" name=\"EndEvent_3\">\n        <bpmn2:incoming>SequenceFlow_7</bpmn2:incoming>\n      </bpmn2:endEvent>\n    </bpmn2:subProcess>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_4\" name=\"\" sourceRef=\"SubProcess_1\" targetRef=\"EndEvent_2\" />\n    <bpmn2:startEvent id=\"StartEvent_1\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"StartEvent_1\" targetRef=\"SubProcess_1\" />\n    <bpmn2:endEvent id=\"EndEvent_2\">\n      <bpmn2:incoming>SequenceFlow_4</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:startEvent id=\"StartEvent_4\">\n      <bpmn2:outgoing>SequenceFlow_9</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_9\" sourceRef=\"StartEvent_4\" targetRef=\"SubProcess_2\" />\n    <bpmn2:endEvent id=\"EndEvent_5\">\n      <bpmn2:incoming>SequenceFlow_8</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_8\" sourceRef=\"SubProcess_2\" targetRef=\"EndEvent_5\" />\n    <bpmn2:subProcess id=\"SubProcess_3\" />\n    <bpmn2:adHocSubProcess id=\"SubProcess_4\">\n      <bpmn2:multiInstanceLoopCharacteristics />\n      <bpmn2:startEvent id=\"StartEvent_5\" />\n    </bpmn2:adHocSubProcess>\n    <bpmn2:adHocSubProcess id=\"SubProcess_2\">\n      <bpmn2:incoming>SequenceFlow_9</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_8</bpmn2:outgoing>\n      <bpmn2:multiInstanceLoopCharacteristics />\n      <bpmn2:startEvent id=\"StartEvent_3\">\n        <bpmn2:outgoing>SequenceFlow_10</bpmn2:outgoing>\n      </bpmn2:startEvent>\n      <bpmn2:task id=\"Task_2\">\n        <bpmn2:incoming>SequenceFlow_10</bpmn2:incoming>\n        <bpmn2:outgoing>SequenceFlow_11</bpmn2:outgoing>\n      </bpmn2:task>\n      <bpmn2:endEvent id=\"EndEvent_4\">\n        <bpmn2:incoming>SequenceFlow_11</bpmn2:incoming>\n      </bpmn2:endEvent>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_10\" sourceRef=\"StartEvent_3\" targetRef=\"Task_2\" />\n      <bpmn2:sequenceFlow id=\"SequenceFlow_11\" sourceRef=\"Task_2\" targetRef=\"EndEvent_4\" />\n    </bpmn2:adHocSubProcess>\n    <bpmn2:subProcess id=\"SubProcess_5\">\n      <bpmn2:startEvent id=\"StartEvent_6\" />\n    </bpmn2:subProcess>\n    <bpmn2:subProcess id=\"SubProcess_6\" />\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_26\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"300\" y=\"176\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"273\" y=\"217\" width=\"90\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_8\" bpmnElement=\"SubProcess_1\">\n        <dc:Bounds x=\"532\" y=\"154\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_StartEvent_26\" targetElement=\"_BPMNShape_SubProcess_8\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"336\" y=\"194\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"532\" y=\"194\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"364\" y=\"194\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_27\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds x=\"396\" y=\"91\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"370\" y=\"132\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"564\" y=\"79\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"_BPMNShape_StartEvent_27\" targetElement=\"_BPMNShape_ExclusiveGateway_19\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"432\" y=\"109\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"480\" y=\"109\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"480\" y=\"145\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"412\" y=\"109\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_58\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"767\" y=\"91\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"740\" y=\"132\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_3\" bpmnElement=\"SequenceFlow_3\" sourceElement=\"_BPMNShape_Task_3\" targetElement=\"_BPMNShape_EndEvent_58\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"664\" y=\"119\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"704\" y=\"119\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"704\" y=\"109\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"767\" y=\"109\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"674\" y=\"111\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_59\" bpmnElement=\"EndEvent_2\">\n        <dc:Bounds x=\"875\" y=\"176\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"848\" y=\"217\" width=\"90\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_4\" bpmnElement=\"SequenceFlow_4\" sourceElement=\"_BPMNShape_SubProcess_8\" targetElement=\"_BPMNShape_EndEvent_59\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"632\" y=\"194\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"813\" y=\"195\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"875\" y=\"195\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"677.5\" y=\"176.5\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_ExclusiveGateway_19\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"455\" y=\"145\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"435\" y=\"200\" width=\"90\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_5\" bpmnElement=\"SequenceFlow_5\" sourceElement=\"_BPMNShape_ExclusiveGateway_19\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"505\" y=\"170\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"541\" y=\"170\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"541\" y=\"119\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"564\" y=\"119\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"496\" y=\"165\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_ScriptTask_2\" bpmnElement=\"ScriptTask_1\">\n        <dc:Bounds x=\"555\" y=\"229\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_6\" bpmnElement=\"SequenceFlow_6\" sourceElement=\"_BPMNShape_ExclusiveGateway_19\" targetElement=\"_BPMNShape_ScriptTask_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"480\" y=\"195\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"480\" y=\"269\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"555\" y=\"269\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"391\" y=\"662\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_60\" bpmnElement=\"EndEvent_3\">\n        <dc:Bounds x=\"740\" y=\"272\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"668\" y=\"685\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_7\" bpmnElement=\"SequenceFlow_7\" sourceElement=\"_BPMNShape_ScriptTask_2\" targetElement=\"_BPMNShape_EndEvent_60\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"655\" y=\"269\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"680\" y=\"269\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"680\" y=\"290\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"740\" y=\"290\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"650\" y=\"276.5\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"StartEvent_14sl8b4_di\" bpmnElement=\"StartEvent_4\">\n        <dc:Bounds x=\"287\" y=\"417\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"260\" y=\"453\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1t8nq5v_di\" bpmnElement=\"SequenceFlow_9\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"323\" y=\"435\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"376\" y=\"435\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"376\" y=\"435\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"407\" y=\"435\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"346\" y=\"425\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EndEvent_1j9tw48_di\" bpmnElement=\"EndEvent_5\">\n        <dc:Bounds x=\"883\" y=\"417\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"856\" y=\"453\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_10jatau_di\" bpmnElement=\"SequenceFlow_8\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"792\" y=\"435\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"834\" y=\"435\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"834\" y=\"435\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"883\" y=\"435\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"804\" y=\"425\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"StartEvent_19uwuw1_di\" bpmnElement=\"StartEvent_3\">\n        <dc:Bounds x=\"432\" y=\"371\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"405\" y=\"407\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1y93al0_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"525\" y=\"397\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0gkhyqw_di\" bpmnElement=\"SequenceFlow_10\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"468\" y=\"389\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"496\" y=\"389\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"496\" y=\"437\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"525\" y=\"437\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"466\" y=\"403\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EndEvent_1bmhzoz_di\" bpmnElement=\"EndEvent_4\">\n        <dc:Bounds x=\"683\" y=\"419\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"656\" y=\"455\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1s8bqj4_di\" bpmnElement=\"SequenceFlow_11\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"625\" y=\"437\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"683\" y=\"437\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"609\" y=\"412\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"SubProcess_081736t_di\" bpmnElement=\"SubProcess_3\">\n        <dc:Bounds x=\"363\" y=\"652\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_17rfv1e_di\" bpmnElement=\"StartEvent_5\">\n        <dc:Bounds x=\"573\" y=\"674\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"546\" y=\"710\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"AdHocSubProcess_0ojckgh_di\" bpmnElement=\"SubProcess_4\" isExpanded=\"false\">\n        <dc:Bounds x=\"541\" y=\"652\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"AdHocSubProcess_128w1vu_di\" bpmnElement=\"SubProcess_2\" isExpanded=\"true\">\n        <dc:Bounds x=\"407\" y=\"335\" width=\"385\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_0qs6p1k_di\" bpmnElement=\"SubProcess_5\" isExpanded=\"false\">\n        <dc:Bounds x=\"716\" y=\"652\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_0076vg5_di\" bpmnElement=\"StartEvent_6\">\n        <dc:Bounds x=\"495\" y=\"537\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"468\" y=\"573\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_15na7ob_di\" bpmnElement=\"SubProcess_6\" isExpanded=\"true\">\n        <dc:Bounds x=\"398\" y=\"796\" width=\"385\" height=\"200\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/import/collapsed-subprocess.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_0og86p5\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.8.0\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.15.0\">\n  <bpmn:process id=\"Process_1rjrv55\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"Subprocess\" name=\"SubProcess\">\n      <bpmn:task id=\"Task_B\" name=\"TaskB\" />\n    </bpmn:subProcess>\n    <bpmn:task id=\"Task_A\" name=\"TaskA\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1rjrv55\">\n      <bpmndi:BPMNShape id=\"Activity_0ndhgel_di\" bpmnElement=\"Subprocess\" isExpanded=\"false\">\n        <dc:Bounds x=\"160\" y=\"77\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0annkr0_di\" bpmnElement=\"Task_A\">\n        <dc:Bounds x=\"290\" y=\"77\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_2\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_2\" bpmnElement=\"Subprocess\">\n      <bpmndi:BPMNShape id=\"Activity_16df75v_di\" bpmnElement=\"Task_B\">\n        <dc:Bounds x=\"420\" y=\"77\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/import/data-store.inside-participant.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.15.0-dev\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn:collaboration id=\"Collaboration\">\n    <bpmn:participant id=\"Participant\" processRef=\"Process\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process\" isExecutable=\"false\">\n    <bpmn:dataStoreReference id=\"DataStoreReference\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"Participant_di\" bpmnElement=\"Participant\" isHorizontal=\"false\">\n        <dc:Bounds x=\"42\" y=\"46\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_0acedkc_di\" bpmnElement=\"DataStoreReference\">\n        <dc:Bounds x=\"100\" y=\"100\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"78\" y=\"122\" width=\"90\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/import/data-store.outside-participant.dangling.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_0s7ms7v\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"3.3.1\">\n  <bpmn:collaboration id=\"Collaboration\">\n    <bpmn:participant id=\"Participant_1\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\" />\n  <bpmn:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn:laneSet id=\"LaneSet\">\n        <bpmn:lane name=\"Lane 1\" id=\"Lane\" />\n    </bpmn:laneSet>\n    <bpmn:dataStoreReference id=\"DataStoreReference\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"Participant_1_di\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"158\" y=\"73\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_di\" bpmnElement=\"DataStoreReference\">\n        <dc:Bounds x=\"42\" y=\"350\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/import/data-store.outside-participant.participant.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.15.0-dev\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn:collaboration id=\"Collaboration\">\n    <bpmn:participant id=\"Participant\" processRef=\"Process\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process\" isExecutable=\"false\">\n    <bpmn:dataStoreReference id=\"DataStoreReference\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"Participant_di\" bpmnElement=\"Participant\" isHorizontal=\"false\">\n        <dc:Bounds x=\"42\" y=\"46\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_0acedkc_di\" bpmnElement=\"DataStoreReference\">\n        <dc:Bounds x=\"42\" y=\"350\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"67\" y=\"402\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/import/data-store.outside-participant.subprocess.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.15.0-dev\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn:collaboration id=\"Collaboration\">\n    <bpmn:participant id=\"Participant\" processRef=\"Process\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess\">\n      <bpmn:dataStoreReference id=\"DataStoreReference\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"Participant_di\" bpmnElement=\"Participant\" isHorizontal=\"false\">\n        <dc:Bounds x=\"42\" y=\"46\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_0acedkc_di\" bpmnElement=\"DataStoreReference\">\n        <dc:Bounds x=\"42\" y=\"346\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"20\" y=\"368\" width=\"90\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_1x9ru5n_di\" bpmnElement=\"SubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"261\" y=\"71\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/import/default-attrs.bpmn",
    "content": "<?xml version=\"1.0\"encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n             xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n             xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\"\n             xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\"\n             xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n             exporter=\"Signavio Process Editor, http://www.signavio.com\"\n             exporterVersion=\"8.1.1\"\n             expressionLanguage=\"http://www.w3.org/1999/XPath\"\n             id=\"sid-cfb874bb-23ca-47b0-ac68-b7b1cb824b1f\"\n             targetNamespace=\"http://www.signavio.com/bpmn20\"\n             typeLanguage=\"http://www.w3.org/2001/XMLSchema\"\n             xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n   <process id=\"sid-7c34ae8d-0b83-4c60-8872-200ac8efdf58\" isClosed=\"false\" isExecutable=\"false\" processType=\"None\">\n      <eventBasedGateway id=\"GATEWAY_1\" instantiate=\"false\" />\n   </process>\n   <bpmndi:BPMNDiagram id=\"sid-a323de14-b068-49b3-a252-669822cdf78c\">\n      <bpmndi:BPMNPlane bpmnElement=\"sid-7c34ae8d-0b83-4c60-8872-200ac8efdf58\" id=\"sid-8b686f77-8ed1-419f-823f-2527a66f1584\">\n         <bpmndi:BPMNShape bpmnElement=\"GATEWAY_1\" id=\"GATEWAY_1_gui\">\n            <omgdc:Bounds height=\"40.0\" width=\"40.0\" x=\"165.0\" y=\"165.0\"/>\n         </bpmndi:BPMNShape>\n      </bpmndi:BPMNPlane>\n   </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/import/error/boundaryEvent-invalidAttachToRef.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_THeRQC65EeWXq9AVm82tjg\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:boundaryEvent id=\"BoundaryEvent_1\" name=\"\" attachedToRef=\"NON_EXISTING_TASK\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:boundaryEvent>\n    <bpmn2:task id=\"Task_2\">\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n    </bpmn2:task>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"BoundaryEvent_1\" targetRef=\"Task_2\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_BoundaryEvent_2\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"143.0\" y=\"180.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_2\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"301.0\" y=\"287.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_BoundaryEvent_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"161.0\" y=\"216.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"161.0\" y=\"327.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"301.0\" y=\"327.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"173.0\" y=\"327.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/import/error/boundaryEvent-missingAttachToRef.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_THeRQC65EeWXq9AVm82tjg\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:task id=\"Task_1\"/>\n    <bpmn2:boundaryEvent id=\"BoundaryEvent_1\" name=\"\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:boundaryEvent>\n    <bpmn2:task id=\"Task_2\">\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n    </bpmn2:task>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"BoundaryEvent_1\" targetRef=\"Task_2\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"133.0\" y=\"118.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_BoundaryEvent_2\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"143.0\" y=\"180.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_2\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"301.0\" y=\"287.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_BoundaryEvent_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"161.0\" y=\"216.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"161.0\" y=\"327.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"301.0\" y=\"327.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"173.0\" y=\"327.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/import/error/dangling-process-message-flow.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"yes\"?>\n<semantic:definitions id=\"_1373649948794\" name=\"A.4.0\" targetNamespace=\"http://www.trisotech.com/definitions/_1373649948794\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:bpsim=\"http://www.bpsim.org/schemas/1.0\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:semantic=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n    <semantic:process isExecutable=\"false\" id=\"WFP-6-1\">\n        <semantic:task completionQuantity=\"1\" isForCompensation=\"false\" startQuantity=\"1\" name=\"Task 1\" id=\"_ab851300-b5de-4ad3-bbec-215553757fc8\">\n        </semantic:task>\n        <semantic:task completionQuantity=\"1\" isForCompensation=\"false\" startQuantity=\"1\" name=\"Task 2\" id=\"_80d1f02b-f39c-45c2-b731-43df75d81779\">\n        </semantic:task>\n    </semantic:process>\n    <semantic:process isExecutable=\"false\" id=\"WFP-6-2\">\n        <semantic:laneSet id=\"ls_1373649949139\">\n            <semantic:lane name=\"Lane 1\" id=\"_17bebb0f-f31e-475a-b1b1-76fcc2da172b\">\n                <semantic:flowNodeRef>_1c347d0d-750b-4c09-980d-6877caae409b</semantic:flowNodeRef>\n                <semantic:flowNodeRef>_6fed62c8-8241-4a1d-ae67-266fda7dcead</semantic:flowNodeRef>\n            </semantic:lane>\n        </semantic:laneSet>\n        <semantic:task completionQuantity=\"1\" isForCompensation=\"false\" startQuantity=\"1\" name=\"Task 5\" id=\"_1c347d0d-750b-4c09-980d-6877caae409b\">\n        </semantic:task>\n        <semantic:task completionQuantity=\"1\" isForCompensation=\"false\" startQuantity=\"1\" name=\"Task 3\" id=\"_6fed62c8-8241-4a1d-ae67-266fda7dcead\">\n        </semantic:task>\n    </semantic:process>\n    <semantic:message id=\"Message_1373649949207\"/>\n    <semantic:message id=\"Message_1373649949208\"/>\n    <semantic:collaboration id=\"C1373649949206\">\n        <semantic:participant name=\"Pool\" processRef=\"WFP-6-1\" id=\"_046bff4f-cea3-4512-a6b1-30517fb29f2c\"/>\n        <semantic:messageFlow messageRef=\"Message_1373649949207\" name=\"Message Flow 1\" sourceRef=\"_ab851300-b5de-4ad3-bbec-215553757fc8\" targetRef=\"_6fed62c8-8241-4a1d-ae67-266fda7dcead\" id=\"_b467921a-ef7b-44c5-bf78-fd624c400d17\"/>\n        <semantic:messageFlow messageRef=\"Message_1373649949208\" name=\"Message Flow 2\" sourceRef=\"_1c347d0d-750b-4c09-980d-6877caae409b\" targetRef=\"_80d1f02b-f39c-45c2-b731-43df75d81779\" id=\"_c311cc87-677e-47a4-bdb1-8744c4ec3147\"/>\n    </semantic:collaboration>\n    <bpmndi:BPMNDiagram documentation=\"\" id=\"Trisotech_Visio-_6\" name=\"A.4.0\" resolution=\"96.00000267028808\">\n        <bpmndi:BPMNPlane bpmnElement=\"C1373649949206\">\n            <bpmndi:BPMNShape bpmnElement=\"_046bff4f-cea3-4512-a6b1-30517fb29f2c\" isHorizontal=\"true\" id=\"S1373649949185__046bff4f-cea3-4512-a6b1-30517fb29f2c\">\n                <dc:Bounds height=\"144.0\" width=\"888.0\" x=\"72.0\" y=\"120.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"LS1373649949186\">\n                    <dc:Bounds height=\"24.316811814750004\" width=\"12.804751171874997\" x=\"76.0\" y=\"179.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"_17bebb0f-f31e-475a-b1b1-76fcc2da172b\" isHorizontal=\"true\" id=\"S1373649949187__17bebb0f-f31e-475a-b1b1-76fcc2da172b\">\n                <dc:Bounds height=\"203.0\" width=\"885.0\" x=\"75.0\" y=\"301.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"LS1373649949186\">\n                    <dc:Bounds height=\"35.5928127913125\" width=\"12.804751171874997\" x=\"75.0\" y=\"384.0\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"_ab851300-b5de-4ad3-bbec-215553757fc8\" id=\"S1373649949189__ab851300-b5de-4ad3-bbec-215553757fc8\">\n                <dc:Bounds height=\"68.0\" width=\"83.0\" x=\"199.0\" y=\"158.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"LS1373649949186\">\n                    <dc:Bounds height=\"12.804751171875008\" width=\"72.48293963254594\" x=\"204.33333333333334\" y=\"185.58187638256646\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"_80d1f02b-f39c-45c2-b731-43df75d81779\" id=\"S1373649949190__80d1f02b-f39c-45c2-b731-43df75d81779\">\n                <dc:Bounds height=\"68.0\" width=\"83.0\" x=\"758.0\" y=\"158.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"LS1373649949186\">\n                    <dc:Bounds height=\"12.804751171875008\" width=\"72.48293963254594\" x=\"763.3333333333334\" y=\"185.58187638256646\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"_1c347d0d-750b-4c09-980d-6877caae409b\" id=\"S1373649949193__1c347d0d-750b-4c09-980d-6877caae409b\">\n                <dc:Bounds height=\"68.0\" width=\"83.0\" x=\"758.0\" y=\"366.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"LS1373649949186\">\n                    <dc:Bounds height=\"12.804751171875008\" width=\"72.48293963254594\" x=\"763.3333333333334\" y=\"393.5818763825664\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape bpmnElement=\"_6fed62c8-8241-4a1d-ae67-266fda7dcead\" id=\"S1373649949200__6fed62c8-8241-4a1d-ae67-266fda7dcead\">\n                <dc:Bounds height=\"68.0\" width=\"83.0\" x=\"198.0\" y=\"368.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"LS1373649949186\">\n                    <dc:Bounds height=\"12.804751171875008\" width=\"72.48293963254594\" x=\"203.33333333333334\" y=\"395.5818763825664\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNEdge bpmnElement=\"_b467921a-ef7b-44c5-bf78-fd624c400d17\" id=\"E1373649949209__b467921a-ef7b-44c5-bf78-fd624c400d17\">\n                <di:waypoint x=\"241.0\" y=\"226.0\"/>\n                <di:waypoint x=\"240.0\" y=\"368.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"LS1373649949186\">\n                    <dc:Bounds height=\"12.804751171875008\" width=\"94.93333333333335\" x=\"186.32394750656172\" y=\"305.5818763825664\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNEdge bpmnElement=\"_c311cc87-677e-47a4-bdb1-8744c4ec3147\" id=\"E1373649949219__c311cc87-677e-47a4-bdb1-8744c4ec3147\">\n                <di:waypoint x=\"800.0\" y=\"366.0\"/>\n                <di:waypoint x=\"800.0\" y=\"226.0\"/>\n                <bpmndi:BPMNLabel labelStyle=\"LS1373649949186\">\n                    <dc:Bounds height=\"12.804751171875008\" width=\"94.93333333333335\" x=\"750.5935286089239\" y=\"307.8152520579301\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNEdge>\n        </bpmndi:BPMNPlane>\n    </bpmndi:BPMNDiagram>\n</semantic:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/import/error/invalid-flow-element.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_u8q6UPrKEeOYcLGs4Ul9qQ\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"_Participant_2\" name=\"Pool\" processRef=\"Process_1\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Lane_1\" name=\"Lane 1\">\n        <bpmn2:flowNodeRef>Task_1</bpmn2:flowNodeRef>\n        <bpmn2:flowNodeRef>TextAnnotation_1</bpmn2:flowNodeRef>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:task id=\"Task_1\"/>\n    <bpmn2:textAnnotation id=\"TextAnnotation_1\">\n      <bpmn2:text><![CDATA[FOOO\nBAR\nYOO!]]></bpmn2:text>\n    </bpmn2:textAnnotation>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"_Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"215.0\" width=\"540.0\" x=\"409.0\" y=\"161.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_2\" bpmnElement=\"Lane_1\" isHorizontal=\"true\">\n        <dc:Bounds height=\"215.0\" width=\"510.0\" x=\"439.0\" y=\"161.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"490.0\" y=\"195.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_TextAnnotation_2\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds height=\"106.0\" width=\"85.0\" x=\"744.0\" y=\"195.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/import/error/multiple-dis.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n  xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n  xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\"\n  xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\"\n  xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\"\n  id=\"gateway-testcase\"\n  targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\">\n    <bpmn:inclusiveGateway id=\"InclusiveGateway_1\"/>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_InclusiveGateway_2\" bpmnElement=\"InclusiveGateway_1\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"114.0\" y=\"99.0\"/>\n      </bpmndi:BPMNShape>\n      <!-- second DI element for InclusiveGateway_1 -->\n      <bpmndi:BPMNShape id=\"_BPMNShape_InclusiveGateway_3\" bpmnElement=\"InclusiveGateway_1\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"114.0\" y=\"129.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/import/groups.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"simple\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:group id=\"Group_1\" categoryValueRef=\"CategoryValue_1o9po2j\" />\n  </bpmn2:process>\n  <bpmn2:category id=\"Category_0fj5y1s\">\n    <bpmn2:categoryValue id=\"CategoryValue_1o9po2j\" />\n  </bpmn2:category>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Group_1_di\" bpmnElement=\"Group_1\">\n        <dc:Bounds x=\"280\" y=\"60\" width=\"430\" height=\"360\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/import/labels/collaboration-message-flows.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_qNeOgNTyEeORzsRKJ7o0Ew\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"_Participant_2\" name=\"pool\" processRef=\"Process_1\"/>\n    <bpmn2:participant id=\"Participant_4\" name=\"Pool\"/>\n    <bpmn2:participant id=\"Participant_5\" name=\"Pool\"/>\n    <bpmn2:messageFlow id=\"MessageFlow_1\" name=\"a labeled flow\" sourceRef=\"_Participant_2\" targetRef=\"Participant_4\"/>\n    <bpmn2:messageFlow id=\"MessageFlow_2\" name=\"\" sourceRef=\"Participant_5\" targetRef=\"Participant_4\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:dataObject id=\"DataObject_1\" name=\"Data Object 1\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"_Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"97.0\" width=\"540.0\" x=\"72.0\" y=\"48.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_6\" bpmnElement=\"Participant_4\" isHorizontal=\"true\">\n        <dc:Bounds height=\"100.0\" width=\"313.0\" x=\"72.0\" y=\"240.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_1\" bpmnElement=\"MessageFlow_1\" sourceElement=\"_BPMNShape_Participant_2\" targetElement=\"_BPMNShape_Participant_6\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"342.0\" y=\"144.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"342.0\" y=\"192.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"228.0\" y=\"192.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"228.0\" y=\"240.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"22.0\" width=\"84.0\" x=\"285.0\" y=\"192.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_7\" bpmnElement=\"Participant_5\" isHorizontal=\"true\">\n        <dc:Bounds height=\"100.0\" width=\"313.0\" x=\"504.0\" y=\"240.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_2\" bpmnElement=\"MessageFlow_2\" sourceElement=\"_BPMNShape_Participant_7\" targetElement=\"_BPMNShape_Participant_6\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"504.0\" y=\"290.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"384.0\" y=\"290.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"457.0\" y=\"290.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/import/labels/collaboration.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_qNeOgNTyEeORzsRKJ7o0Ew\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"_Participant_2\" name=\"single line\" processRef=\"Process_1\"/>\n    <bpmn2:participant id=\"Participant_1\" name=\"multi line label&#xD;&#xA;(manual break)\" processRef=\"Process_3\"/>\n    <bpmn2:participant id=\"Participant_2\" name=\"with lanes\" processRef=\"Process_2\"/>\n    <bpmn2:participant id=\"Participant_3\" name=\"pool with very long label\" processRef=\"Process_4\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:dataObject id=\"DataObject_1\" name=\"Data Object 1\"/>\n    <bpmn2:dataObjectReference id=\"DataObjectReference_1\" dataObjectRef=\"DataObject_1\"/>\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Lane_1\" name=\"single line label\"/>\n      <bpmn2:lane id=\"Lane_2\" name=\"multi-line label&#xD;&#xA;(manual break)\">\n        <bpmn2:childLaneSet xsi:type=\"bpmn2:tLaneSet\" id=\"LaneSet_2\">\n          <bpmn2:lane id=\"Lane_3\" name=\"nested lane\"/>\n          <bpmn2:lane id=\"Lane_4\" name=\"another nested lane\"/>\n        </bpmn2:childLaneSet>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_3\" isExecutable=\"false\">\n    <bpmn2:startEvent id=\"StartEvent_1\"/>\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_4\" isExecutable=\"false\">\n    <bpmn2:task id=\"Task_1\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"_Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"133.0\" width=\"540.0\" x=\"72.0\" y=\"48.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_3\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds height=\"148.0\" width=\"540.0\" x=\"72.0\" y=\"216.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_4\" bpmnElement=\"Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"469.0\" width=\"540.0\" x=\"72.0\" y=\"528.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_2\" bpmnElement=\"Lane_1\" isHorizontal=\"true\">\n        <dc:Bounds height=\"157.0\" width=\"510.0\" x=\"102.0\" y=\"528.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_3\" bpmnElement=\"Lane_2\" isHorizontal=\"true\">\n        <dc:Bounds height=\"313.0\" width=\"510.0\" x=\"102.0\" y=\"684.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_4\" bpmnElement=\"Lane_3\" isHorizontal=\"true\">\n        <dc:Bounds height=\"157.0\" width=\"480.0\" x=\"132.0\" y=\"684.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_5\" bpmnElement=\"Lane_4\" isHorizontal=\"true\">\n        <dc:Bounds height=\"157.0\" width=\"480.0\" x=\"132.0\" y=\"840.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_5\" bpmnElement=\"Participant_3\" isHorizontal=\"true\">\n        <dc:Bounds height=\"100.0\" width=\"540.0\" x=\"72.0\" y=\"396.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"516.0\" y=\"255.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"534.0\" y=\"296.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"492.0\" y=\"407.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_DataObjectReference_2\" bpmnElement=\"DataObjectReference_1\">\n        <dc:Bounds height=\"50.0\" width=\"36.0\" x=\"540.0\" y=\"72.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"22.0\" width=\"148.0\" x=\"484.0\" y=\"127.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/import/labels/embedded.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"test\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:ioSpecification id=\"InputOutputSpecification_1\"/>\n    <bpmn2:task id=\"Task_1\" name=\"A task\"/>\n    <bpmn2:callActivity id=\"CallActivity_1\" name=\"a call activity\"/>\n    <bpmn2:subProcess id=\"SubProcess_1\" name=\"an expanded subprocess\"/>\n    <bpmn2:transaction id=\"Transaction_1\" name=\"a transaction\"/>\n    <bpmn2:subProcess id=\"SubProcess_2\" name=\"a collapsed&#xD;&#xA;subprocess\"/>\n    <bpmn2:dataObject id=\"DataObject_1\" name=\"Data Object 1\"/>\n    <bpmn2:textAnnotation id=\"TextAnnotation_1\">\n      <bpmn2:text><![CDATA[Lorem ipsum \nfoo \nbar]]></bpmn2:text>\n    </bpmn2:textAnnotation>\n  </bpmn2:process>\n  <bpmn2:dataStore id=\"DataStore_1\" name=\"Data Store 1\"/>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_TextAnnotation_2\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds height=\"72.0\" width=\"95.0\" x=\"725.0\" y=\"306.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_2\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds height=\"169.0\" width=\"220.0\" x=\"204.0\" y=\"306.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_5\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"204.0\" y=\"96.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_CallActivity_2\" bpmnElement=\"CallActivity_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"324.0\" y=\"96.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Transaction_2\" bpmnElement=\"Transaction_1\" isExpanded=\"true\">\n        <dc:Bounds height=\"169.0\" width=\"220.0\" x=\"444.0\" y=\"306.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_3\" bpmnElement=\"SubProcess_2\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"444.0\" y=\"96.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/import/labels/external-no-di.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"test\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:ioSpecification id=\"InputOutputSpecification_1\"/>\n    <bpmn2:dataStoreReference id=\"_DataStoreReference_2\" name=\"a data store\" dataStoreRef=\"DataStore_1\"/>\n    <bpmn2:dataObject id=\"DataObject_1\" name=\"Data Object 1\"/>\n    <bpmn2:intermediateThrowEvent id=\"IntermediateThrowEvent_1\" name=\"a throw event\">\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n    </bpmn2:intermediateThrowEvent>\n    <bpmn2:startEvent id=\"StartEvent_1\" name=\"a start event\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"a sequence flow\" sourceRef=\"StartEvent_1\" targetRef=\"IntermediateThrowEvent_1\"/>\n    <bpmn2:exclusiveGateway id=\"ExclusiveGateway_1\" name=\"a gateway\"/>\n    <bpmn2:dataObjectReference id=\"DataObjectReference_1\" name=\"a data object&#xD;&#xA;reference\" dataObjectRef=\"DataObject_1\"/>\n  </bpmn2:process>\n  <bpmn2:dataStore id=\"DataStore_1\" name=\"Data Store 1\"/>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_ExclusiveGateway_3\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"84.0\" y=\"59.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_DataStoreReference_2\" bpmnElement=\"_DataStoreReference_2\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"192.0\" y=\"60.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_DataObjectReference_2\" bpmnElement=\"DataObjectReference_1\">\n        <dc:Bounds height=\"50.0\" width=\"36.0\" x=\"312.0\" y=\"60.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_3\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"424.0\" y=\"237.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateThrowEvent_2\" bpmnElement=\"IntermediateThrowEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"624.0\" y=\"337.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_StartEvent_3\" targetElement=\"_BPMNShape_IntermediateThrowEvent_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"460.0\" y=\"255.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"542.0\" y=\"255.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"542.0\" y=\"355.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"624.0\" y=\"355.0\"/>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/import/labels/external.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"test\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:ioSpecification id=\"InputOutputSpecification_1\"/>\n    <bpmn2:dataStoreReference id=\"_DataStoreReference_2\" name=\"a data store\" dataStoreRef=\"DataStore_1\"/>\n    <bpmn2:dataObject id=\"DataObject_1\" name=\"Data Object 1\"/>\n    <bpmn2:intermediateThrowEvent id=\"IntermediateThrowEvent_1\" name=\"a throw event\">\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n    </bpmn2:intermediateThrowEvent>\n    <bpmn2:startEvent id=\"StartEvent_1\" name=\"a start event\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"a sequence flow\" sourceRef=\"StartEvent_1\" targetRef=\"IntermediateThrowEvent_1\"/>\n    <bpmn2:exclusiveGateway id=\"ExclusiveGateway_1\" name=\"a gateway\"/>\n    <bpmn2:dataObjectReference id=\"DataObjectReference_1\" name=\"a data object&#xD;&#xA;reference\" dataObjectRef=\"DataObject_1\"/>\n    <bpmn2:endEvent id=\"EndEvent_1\" name=\"Loan Request&#xD;&#xA;Approved\">\n      <bpmn2:incoming>SequenceFlow_5</bpmn2:incoming>\n    </bpmn2:endEvent>\n  </bpmn2:process>\n  <bpmn2:dataStore id=\"DataStore_1\" name=\"Data Store 1\"/>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_ExclusiveGateway_3\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"84.0\" y=\"59.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"22.0\" width=\"65.0\" x=\"78.0\" y=\"28.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_DataStoreReference_2\" bpmnElement=\"_DataStoreReference_2\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"192.0\" y=\"60.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"22.0\" width=\"75.0\" x=\"180.0\" y=\"28.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_DataObjectReference_2\" bpmnElement=\"DataObjectReference_1\">\n        <dc:Bounds height=\"50.0\" width=\"36.0\" x=\"312.0\" y=\"60.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"38.0\" width=\"91.0\" x=\"285.0\" y=\"12.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_3\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"424.0\" y=\"237.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"22.0\" width=\"77.0\" x=\"404.0\" y=\"204.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateThrowEvent_2\" bpmnElement=\"IntermediateThrowEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"624.0\" y=\"337.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"22.0\" width=\"82.0\" x=\"601.0\" y=\"308.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_StartEvent_3\" targetElement=\"_BPMNShape_IntermediateThrowEvent_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"460.0\" y=\"255.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"542.0\" y=\"255.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"542.0\" y=\"355.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"624.0\" y=\"355.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"22.0\" width=\"99.0\" x=\"432.0\" y=\"317.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"252.0\" y=\"215.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"44.0\" width=\"119.0\" x=\"211.0\" y=\"256.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/import/multiple-diagrams.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_0j4810n\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.0.1\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n    <bpmn:userTask id=\"Task_1\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n    </bpmn:userTask>\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"Task_1\" targetRef=\"Task_2\" />\n    <bpmn:userTask id=\"Task_2\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_3</bpmn:outgoing>\n    </bpmn:userTask>\n    <bpmn:endEvent id=\"EndEvent_1\">\n      <bpmn:incoming>SequenceFlow_3</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_3\" sourceRef=\"Task_2\" targetRef=\"EndEvent_1\" />\n  </bpmn:process>\n  <bpmn:process id=\"Process_2\" isExecutable=\"true\">\n    <bpmn:startEvent id=\"StartEvent_2\" />\n    <bpmn:intermediateThrowEvent id=\"IntermediateThrowEvent_1\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_4\" sourceRef=\"StartEvent_2\" targetRef=\"IntermediateThrowEvent_1\" />\n    <bpmn:endEvent id=\"EndEvent_2\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_5\" sourceRef=\"IntermediateThrowEvent_1\" targetRef=\"EndEvent_2\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_2\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_2\" bpmnElement=\"Process_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds x=\"156\" y=\"81\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateThrowEvent_1\" bpmnElement=\"IntermediateThrowEvent_1\">\n        <dc:Bounds x=\"234\" y=\"81\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_2\">\n        <dc:Bounds x=\"328\" y=\"81\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_4\" bpmnElement=\"SequenceFlow_4\">\n        <di:waypoint x=\"192\" y=\"99\" />\n        <di:waypoint x=\"234\" y=\"99\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_5\" bpmnElement=\"SequenceFlow_5\">\n        <di:waypoint x=\"270\" y=\"99\" />\n        <di:waypoint x=\"328\" y=\"99\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_1\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"156\" y=\"103\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_1\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"242\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"392\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_1\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"542\" y=\"103\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"192\" y=\"121\" />\n        <di:waypoint x=\"242\" y=\"121\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint x=\"342\" y=\"121\" />\n        <di:waypoint x=\"392\" y=\"121\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_3\" bpmnElement=\"SequenceFlow_3\">\n        <di:waypoint x=\"492\" y=\"121\" />\n        <di:waypoint x=\"542\" y=\"121\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/import/position/position-testcase.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n   xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n   xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\"\n   xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\"\n   xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n   exporter=\"Signavio Process Editor, http://www.signavio.com\"\n   expressionLanguage=\"http://www.w3.org/1999/XPath\"\n   typeLanguage=\"http://www.w3.org/2001/XMLSchema\"\n   xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n   <process id=\"ID_Process\" isClosed=\"false\" isExecutable=\"false\" processType=\"None\">\n      <startEvent id=\"ID_Start\" name=\"Start\">\n         <outgoing>ID_Flow_1</outgoing>\n      </startEvent>\n      <task completionQuantity=\"1\" id=\"ID_Task\" isForCompensation=\"false\" startQuantity=\"1\" name=\"Task\">\n         <incoming>ID_Flow_1</incoming>\n         <outgoing>ID_Flow_2</outgoing>\n      </task>\n      <endEvent id=\"ID_End\">\n         <incoming>ID_Flow_2</incoming>\n      </endEvent>\n      <sequenceFlow id=\"ID_Flow_1\" sourceRef=\"ID_Start\" targetRef=\"ID_Task\">\n      </sequenceFlow>\n      <sequenceFlow id=\"ID_Flow_2\" sourceRef=\"ID_Task\" targetRef=\"ID_End\">\n      </sequenceFlow>\n   </process>\n   <bpmndi:BPMNDiagram id=\"sid-c84fe9a1-fd97-4781-869b-cf6e0e201897\">\n      <bpmndi:BPMNPlane bpmnElement=\"ID_Process\" id=\"sid-0876fbd9-fd46-4ba4-b587-3df596a7ba82\">\n         <bpmndi:BPMNShape bpmnElement=\"ID_Start\" id=\"ID_Start_gui\">\n            <omgdc:Bounds height=\"30.4\" width=\"30.4\" x=\"120.4\" y=\"135.4\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-794da868-7723-4248-8b91-33757c986477\">\n               <omgdc:Bounds height=\"12.6\" width=\"28\" x=\"100.4\" y=\"155.4\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"ID_Task\" id=\"ID_Task_gui\">\n            <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"195.0\" y=\"110.0\"/>\n            <bpmndi:BPMNLabel labelStyle=\"sid-794da868-7723-4248-8b91-33757c986477\">\n               <omgdc:Bounds height=\"12.0\" width=\"28\" x=\"230\" y=\"142.0\"/>\n            </bpmndi:BPMNLabel>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNShape bpmnElement=\"ID_End\" id=\"ID_End_gui\">\n            <omgdc:Bounds height=\"28.0\" width=\"28.0\" x=\"340.6\" y=\"136.6\"/>\n         </bpmndi:BPMNShape>\n         <bpmndi:BPMNEdge bpmnElement=\"ID_Flow_1\" id=\"ID_Flow_1_gui\">\n            <omgdi:waypoint x=\"150.0\" y=\"150.0\"/>\n            <omgdi:waypoint x=\"195.0\" y=\"150.0\"/>\n         </bpmndi:BPMNEdge>\n         <bpmndi:BPMNEdge bpmnElement=\"ID_Flow_2\" id=\"ID_Flow_2_gui\">\n            <omgdi:waypoint x=\"295.0\" y=\"150.0\"/>\n            <omgdi:waypoint x=\"340.0\" y=\"150.5\"/>\n         </bpmndi:BPMNEdge>\n      </bpmndi:BPMNPlane>\n      <bpmndi:BPMNLabelStyle id=\"sid-794da868-7723-4248-8b91-33757c986477\">\n         <omgdc:Font isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\" name=\"Arial\" size=\"12.0\"/>\n      </bpmndi:BPMNLabelStyle>\n   </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/import/process.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"simple\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:subProcess id=\"SubProcess_1\" name=\"Sub Process 1\">\n      <bpmn2:incoming>SequenceFlow_3</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n      <bpmn2:startEvent id=\"StartEvent_1\" name=\"Start Event 1\">\n        <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n      </bpmn2:startEvent>\n      <bpmn2:task id=\"Task_1\" name=\"Task\">\n        <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n      </bpmn2:task>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\"/>\n    </bpmn2:subProcess>\n    <bpmn2:endEvent id=\"EndEvent_1\" name=\"End Event\">\n      <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_2\" name=\"\" sourceRef=\"SubProcess_1\" targetRef=\"EndEvent_1\"/>\n    <bpmn2:startEvent id=\"StartEvent_2\" name=\"Start\">\n      <bpmn2:outgoing>SequenceFlow_3</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_3\" name=\"Flow\" sourceRef=\"StartEvent_2\" targetRef=\"SubProcess_1\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_2\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds height=\"300.0\" width=\"300.0\" x=\"300.0\" y=\"80.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"352.0\" y=\"242.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"420.0\" y=\"220.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_StartEvent_2\" targetElement=\"_BPMNShape_Task_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"388.0\" y=\"260.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"420.0\" y=\"260.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"650.0\" y=\"212.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"_BPMNShape_SubProcess_2\" targetElement=\"_BPMNShape_EndEvent_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"600.0\" y=\"230.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"650.0\" y=\"230.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_11\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"108.0\" y=\"212.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"126.0\" y=\"253.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_3\" bpmnElement=\"SequenceFlow_3\" sourceElement=\"_BPMNShape_StartEvent_11\" targetElement=\"_BPMNShape_SubProcess_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"144.0\" y=\"230.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"300.0\" y=\"230.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"21.0\" width=\"33.0\" x=\"192.0\" y=\"204.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/import/text-annotation-message-flow.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"simple\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"18.3.1\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"Collaboration_1apxmjs\">\n    <bpmn2:participant id=\"Participant_0pmdlbq\" processRef=\"Process_08lzk4r\" />\n    <bpmn2:participant id=\"Participant_1b6h7co\" processRef=\"Process_1dg06qb\" />\n    <bpmn2:messageFlow id=\"MessageFlow_1\" sourceRef=\"Event_1s8jl8h\" targetRef=\"Participant_1b6h7co\" />\n    <bpmn2:textAnnotation id=\"TextAnnotation_1\">\n      <bpmn2:text>TextAnnotation_1</bpmn2:text>\n    </bpmn2:textAnnotation>\n    <bpmn2:association id=\"Association_1\" associationDirection=\"None\" sourceRef=\"MessageFlow_1\" targetRef=\"TextAnnotation_1\" />\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_08lzk4r\">\n    <bpmn2:endEvent id=\"Event_1s8jl8h\">\n      <bpmn2:incoming>Flow_1wufvvv</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:sequenceFlow id=\"Flow_1wufvvv\" sourceRef=\"Activity_19vun9y\" targetRef=\"Event_1s8jl8h\" />\n    <bpmn2:startEvent id=\"Event_0a7hfxb\">\n      <bpmn2:outgoing>Flow_12788mj</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:sequenceFlow id=\"Flow_12788mj\" sourceRef=\"Event_0a7hfxb\" targetRef=\"Activity_19vun9y\" />\n    <bpmn2:task id=\"Activity_19vun9y\">\n      <bpmn2:incoming>Flow_12788mj</bpmn2:incoming>\n      <bpmn2:outgoing>Flow_1wufvvv</bpmn2:outgoing>\n    </bpmn2:task>\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_1dg06qb\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1apxmjs\">\n      <bpmndi:BPMNShape id=\"Participant_0pmdlbq_di\" bpmnElement=\"Participant_0pmdlbq\" isHorizontal=\"true\">\n        <dc:Bounds x=\"40\" y=\"10\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1s8jl8h_di\" bpmnElement=\"Event_1s8jl8h\">\n        <dc:Bounds x=\"312\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0a7hfxb_di\" bpmnElement=\"Event_0a7hfxb\">\n        <dc:Bounds x=\"72\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_19vun9y_di\" bpmnElement=\"Activity_19vun9y\">\n        <dc:Bounds x=\"170\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1wufvvv_di\" bpmnElement=\"Flow_1wufvvv\">\n        <di:waypoint x=\"270\" y=\"120\" />\n        <di:waypoint x=\"312\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_12788mj_di\" bpmnElement=\"Flow_12788mj\">\n        <di:waypoint x=\"108\" y=\"120\" />\n        <di:waypoint x=\"170\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Participant_1b6h7co_di\" bpmnElement=\"Participant_1b6h7co\" isHorizontal=\"true\">\n        <dc:Bounds x=\"40\" y=\"420\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_1_di\" bpmnElement=\"Association_1\">\n        <di:waypoint x=\"330\" y=\"320\" />\n        <di:waypoint x=\"460\" y=\"320\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"MessageFlow_1_di\" bpmnElement=\"MessageFlow_1\">\n        <di:waypoint x=\"330\" y=\"140\" />\n        <di:waypoint x=\"330\" y=\"420\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"TextAnnotation_1_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"460\" y=\"305\" width=\"120\" height=\"35\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/kitchen-sink.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:zeebe=\"http://camunda.org/schema/zeebe/1.0\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_0qv7gjd\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.16.0-dev\" modeler:executionPlatform=\"Camunda Cloud\" modeler:executionPlatformVersion=\"8.3.0\">\n  <bpmn:category id=\"Category_1tbggvc\">\n    <bpmn:categoryValue id=\"CategoryValue_19ltlrt\" value=\"Tasks\" />\n  </bpmn:category>\n  <bpmn:category id=\"Category_0jku76b\">\n    <bpmn:categoryValue id=\"CategoryValue_1e5k8u4\" value=\"Gateways\" />\n  </bpmn:category>\n  <bpmn:category id=\"Category_0m97nlo\">\n    <bpmn:categoryValue id=\"CategoryValue_1yjf52e\" value=\"Events\" />\n  </bpmn:category>\n  <bpmn:collaboration id=\"Collaboration_02tkzm4\">\n    <bpmn:participant id=\"Participant_1pudv9f\" name=\"Participant\" processRef=\"Process_0k3ryf8\" />\n    <bpmn:participant id=\"Participant_0tuweou\" name=\"Participant\">\n      <bpmn:participantMultiplicity />\n    </bpmn:participant>\n    <bpmn:messageFlow id=\"Flow_0mefziq\" sourceRef=\"Participant_1pudv9f\" targetRef=\"Participant_0tuweou\" messageRef=\"Message_1\" />\n    <bpmn:messageFlow id=\"Flow_14s7yr5\" sourceRef=\"Participant_0tuweou\" targetRef=\"Participant_1pudv9f\" />\n    <bpmn:group id=\"Group_0306c6g\" categoryValueRef=\"CategoryValue_19ltlrt\" />\n    <bpmn:group id=\"Group_06zgfh5\" categoryValueRef=\"CategoryValue_1e5k8u4\" />\n    <bpmn:group id=\"Group_1uodo9r\" categoryValueRef=\"CategoryValue_1yjf52e\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_0k3ryf8\" isExecutable=\"true\">\n    <bpmn:laneSet id=\"LaneSet_0566jog\">\n      <bpmn:lane id=\"Lane_1cofr07\">\n        <bpmn:flowNodeRef>Activity_1ketqts</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_1aw7nq3</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_09glvdf</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Gateway_0w4fbsk</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Gateway_0lwqw3q</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Gateway_0im7nvs</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Gateway_1gp70qr</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_088fmm5</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_0m5cdgr</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_1vk962b</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_0pzvbay</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_1njhrf7</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_0az045q</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_0rd4z0d</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_00twu86</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_1faweyu</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_01o5kun</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_0a3nmhs</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_0nn7qi2</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_0cvqzwg</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_0jf1q45</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_0d3edlz</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_0mf406j</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_1tb0m8u</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_1folo0q</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_1lhkn4m</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_0tlcssq</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_1d1oeak</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_1bjbr5h</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_0djfr8f</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_08egzqv</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_1125q3g</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_1ldvx66</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_011s9cd</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_1a96i3e</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_0e5q7rs</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Gateway_1la6tas</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Gateway_01lyed4</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_1ks0id1</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_0j90wfw</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_0ikqxya</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_1x9von4</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_13xao98</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_1pdjezb</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_1ks4j21</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_0ncmtxn</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_01qiiyi</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_1cax1xl</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_1o9cjfb</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_0t86sxc</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_11fzkjc</bpmn:flowNodeRef>\n      </bpmn:lane>\n      <bpmn:lane id=\"Lane_1vakzes\" name=\"Lane\">\n        <bpmn:flowNodeRef>Activity_0hcpwc9</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_0vheewc</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_1sosl74</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_0brc3us</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Gateway_0238ieb</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_0pfhghz</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_0gi9n9o</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_1ivfc6a</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_1ndsz41</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_0g37k20</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_0r6ceyw</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_137lgd1</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_1fi82ot</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Event_11sdw9z</bpmn:flowNodeRef>\n      </bpmn:lane>\n    </bpmn:laneSet>\n    <bpmn:businessRuleTask id=\"Activity_1ketqts\" name=\"Business Rule Task\" />\n    <bpmn:manualTask id=\"Activity_1aw7nq3\" />\n    <bpmn:receiveTask id=\"Activity_09glvdf\" />\n    <bpmn:exclusiveGateway id=\"Gateway_0w4fbsk\" name=\"Exclusive Gateway\" />\n    <bpmn:inclusiveGateway id=\"Gateway_0lwqw3q\" />\n    <bpmn:complexGateway id=\"Gateway_0im7nvs\" />\n    <bpmn:eventBasedGateway id=\"Gateway_1gp70qr\" />\n    <bpmn:subProcess id=\"Activity_088fmm5\" name=\"Event-Subprocess\" triggeredByEvent=\"true\">\n      <bpmn:startEvent id=\"Event_1l5ozbh\">\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_1digjva\" />\n      </bpmn:startEvent>\n      <bpmn:startEvent id=\"Event_1h3k36g\" isInterrupting=\"false\">\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_1ilob41\" />\n      </bpmn:startEvent>\n      <bpmn:startEvent id=\"Event_1p4tub5\">\n        <bpmn:timerEventDefinition id=\"TimerEventDefinition_1bg6z6t\" />\n      </bpmn:startEvent>\n      <bpmn:startEvent id=\"Event_16k3ggm\" isInterrupting=\"false\">\n        <bpmn:timerEventDefinition id=\"TimerEventDefinition_1ji0j4r\" />\n      </bpmn:startEvent>\n      <bpmn:startEvent id=\"Event_139t55w\">\n        <bpmn:conditionalEventDefinition id=\"ConditionalEventDefinition_1kitwxn\">\n          <bpmn:condition xsi:type=\"bpmn:tFormalExpression\" />\n        </bpmn:conditionalEventDefinition>\n      </bpmn:startEvent>\n      <bpmn:startEvent id=\"Event_1q5v0sf\" isInterrupting=\"false\">\n        <bpmn:conditionalEventDefinition id=\"ConditionalEventDefinition_02cyrya\">\n          <bpmn:condition xsi:type=\"bpmn:tFormalExpression\" />\n        </bpmn:conditionalEventDefinition>\n      </bpmn:startEvent>\n      <bpmn:startEvent id=\"Event_1g4mqp3\">\n        <bpmn:signalEventDefinition id=\"SignalEventDefinition_1jigagb\" />\n      </bpmn:startEvent>\n      <bpmn:startEvent id=\"Event_1f81cds\" isInterrupting=\"false\">\n        <bpmn:signalEventDefinition id=\"SignalEventDefinition_0smt1cj\" />\n      </bpmn:startEvent>\n      <bpmn:startEvent id=\"Event_19ahha0\">\n        <bpmn:errorEventDefinition id=\"ErrorEventDefinition_1h5lmci\" />\n      </bpmn:startEvent>\n      <bpmn:startEvent id=\"Event_00h2mai\">\n        <bpmn:escalationEventDefinition id=\"EscalationEventDefinition_1n1jtk8\" />\n      </bpmn:startEvent>\n      <bpmn:startEvent id=\"Event_0eql2pf\" isInterrupting=\"false\">\n        <bpmn:escalationEventDefinition id=\"EscalationEventDefinition_0hilmhu\" />\n      </bpmn:startEvent>\n      <bpmn:startEvent id=\"Event_09uyr4s\">\n        <bpmn:compensateEventDefinition id=\"CompensateEventDefinition_08fcqrr\" />\n      </bpmn:startEvent>\n    </bpmn:subProcess>\n    <bpmn:startEvent id=\"Event_0m5cdgr\" name=\"Start Event\">\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_09axst2\" messageRef=\"Message_1\" />\n    </bpmn:startEvent>\n    <bpmn:intermediateCatchEvent id=\"Event_1vk962b\">\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_1wqfsoo\" />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:subProcess id=\"Activity_0pzvbay\" name=\"Subprocess\">\n      <bpmn:multiInstanceLoopCharacteristics />\n    </bpmn:subProcess>\n    <bpmn:intermediateThrowEvent id=\"Event_1njhrf7\">\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_1x65mcp\" />\n    </bpmn:intermediateThrowEvent>\n    <bpmn:startEvent id=\"Event_0az045q\">\n      <bpmn:timerEventDefinition id=\"TimerEventDefinition_1ups2va\" />\n    </bpmn:startEvent>\n    <bpmn:intermediateCatchEvent id=\"Event_0rd4z0d\">\n      <bpmn:timerEventDefinition id=\"TimerEventDefinition_071dkih\" />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:endEvent id=\"Event_00twu86\">\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_1rjms9w\" />\n    </bpmn:endEvent>\n    <bpmn:startEvent id=\"Event_1faweyu\">\n      <bpmn:conditionalEventDefinition id=\"ConditionalEventDefinition_19su4pq\">\n        <bpmn:condition xsi:type=\"bpmn:tFormalExpression\" />\n      </bpmn:conditionalEventDefinition>\n    </bpmn:startEvent>\n    <bpmn:intermediateCatchEvent id=\"Event_01o5kun\">\n      <bpmn:conditionalEventDefinition id=\"ConditionalEventDefinition_160s4nq\">\n        <bpmn:condition xsi:type=\"bpmn:tFormalExpression\" />\n      </bpmn:conditionalEventDefinition>\n    </bpmn:intermediateCatchEvent>\n    <bpmn:intermediateCatchEvent id=\"Event_0a3nmhs\">\n      <bpmn:linkEventDefinition id=\"LinkEventDefinition_0eu3m1j\" name=\"\" />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:intermediateThrowEvent id=\"Event_0nn7qi2\">\n      <bpmn:linkEventDefinition id=\"LinkEventDefinition_0xn074p\" name=\"\" />\n    </bpmn:intermediateThrowEvent>\n    <bpmn:intermediateCatchEvent id=\"Event_0cvqzwg\">\n      <bpmn:signalEventDefinition id=\"SignalEventDefinition_1yy1u3c\" />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:startEvent id=\"Event_0jf1q45\">\n      <bpmn:signalEventDefinition id=\"SignalEventDefinition_17493ur\" />\n    </bpmn:startEvent>\n    <bpmn:intermediateThrowEvent id=\"Event_0d3edlz\">\n      <bpmn:signalEventDefinition id=\"SignalEventDefinition_1hgl68h\" />\n    </bpmn:intermediateThrowEvent>\n    <bpmn:endEvent id=\"Event_0mf406j\">\n      <bpmn:signalEventDefinition id=\"SignalEventDefinition_1o7kcql\" />\n    </bpmn:endEvent>\n    <bpmn:endEvent id=\"Event_1tb0m8u\">\n      <bpmn:errorEventDefinition id=\"ErrorEventDefinition_0lnltwf\" />\n    </bpmn:endEvent>\n    <bpmn:intermediateThrowEvent id=\"Event_1folo0q\">\n      <bpmn:escalationEventDefinition id=\"EscalationEventDefinition_18btf0r\" />\n    </bpmn:intermediateThrowEvent>\n    <bpmn:endEvent id=\"Event_1lhkn4m\">\n      <bpmn:escalationEventDefinition id=\"EscalationEventDefinition_0wu33ji\" />\n    </bpmn:endEvent>\n    <bpmn:endEvent id=\"Event_0tlcssq\">\n      <bpmn:terminateEventDefinition id=\"TerminateEventDefinition_0qzb9lz\" />\n    </bpmn:endEvent>\n    <bpmn:endEvent id=\"Event_1d1oeak\">\n      <bpmn:compensateEventDefinition id=\"CompensateEventDefinition_04gpe8z\" />\n    </bpmn:endEvent>\n    <bpmn:intermediateThrowEvent id=\"Event_1bjbr5h\">\n      <bpmn:compensateEventDefinition id=\"CompensateEventDefinition_1dpuxy8\" />\n    </bpmn:intermediateThrowEvent>\n    <bpmn:transaction id=\"Activity_0djfr8f\" name=\"Transaction\">\n      <bpmn:multiInstanceLoopCharacteristics />\n      <bpmn:endEvent id=\"Event_1cutsq6\">\n        <bpmn:cancelEventDefinition id=\"CancelEventDefinition_0fr4bjf\" />\n      </bpmn:endEvent>\n    </bpmn:transaction>\n    <bpmn:boundaryEvent id=\"Event_11fzkjc\" attachedToRef=\"Activity_0djfr8f\">\n      <bpmn:cancelEventDefinition id=\"CancelEventDefinition_1q9o9vy\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"Event_0t86sxc\" attachedToRef=\"Activity_0pzvbay\">\n      <bpmn:compensateEventDefinition id=\"CompensateEventDefinition_00rw9ri\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"Event_1o9cjfb\" cancelActivity=\"false\" attachedToRef=\"Activity_0pzvbay\">\n      <bpmn:escalationEventDefinition id=\"EscalationEventDefinition_07fctt8\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"Event_1cax1xl\" attachedToRef=\"Activity_0pzvbay\">\n      <bpmn:escalationEventDefinition id=\"EscalationEventDefinition_0tj2w4d\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"Event_01qiiyi\" attachedToRef=\"Activity_0pzvbay\">\n      <bpmn:errorEventDefinition id=\"ErrorEventDefinition_1y2eafx\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"Event_0ncmtxn\" cancelActivity=\"false\" attachedToRef=\"Activity_0pzvbay\">\n      <bpmn:signalEventDefinition id=\"SignalEventDefinition_04gift3\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"Event_1ks4j21\" attachedToRef=\"Activity_0pzvbay\">\n      <bpmn:signalEventDefinition id=\"SignalEventDefinition_1xvs6nt\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"Event_1pdjezb\" cancelActivity=\"false\" attachedToRef=\"Activity_0pzvbay\">\n      <bpmn:conditionalEventDefinition id=\"ConditionalEventDefinition_1ulkndr\">\n        <bpmn:condition xsi:type=\"bpmn:tFormalExpression\" />\n      </bpmn:conditionalEventDefinition>\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"Event_13xao98\" attachedToRef=\"Activity_0pzvbay\">\n      <bpmn:conditionalEventDefinition id=\"ConditionalEventDefinition_0wkuo44\">\n        <bpmn:condition xsi:type=\"bpmn:tFormalExpression\" />\n      </bpmn:conditionalEventDefinition>\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"Event_1x9von4\" cancelActivity=\"false\" attachedToRef=\"Activity_0pzvbay\">\n      <bpmn:timerEventDefinition id=\"TimerEventDefinition_1gysdks\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"Event_0ikqxya\" attachedToRef=\"Activity_0pzvbay\">\n      <bpmn:timerEventDefinition id=\"TimerEventDefinition_0kct1ik\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"Event_0j90wfw\" cancelActivity=\"false\" attachedToRef=\"Activity_0pzvbay\">\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_0mkmbes\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"Event_1ks0id1\" attachedToRef=\"Activity_0pzvbay\">\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_0a4jz6j\" />\n    </bpmn:boundaryEvent>\n    <bpmn:dataStoreReference id=\"DataStoreReference_1wvmfek\" name=\"Data Store Reference\" />\n    <bpmn:dataStoreReference id=\"DataStoreReference_1gynygb\" />\n    <bpmn:task id=\"Activity_0hcpwc9\">\n      <bpmn:incoming>Flow_0802uvc</bpmn:incoming>\n      <bpmn:multiInstanceLoopCharacteristics isSequential=\"true\" />\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"Flow_0802uvc\" sourceRef=\"Activity_1sosl74\" targetRef=\"Activity_0hcpwc9\" />\n    <bpmn:task id=\"Activity_0vheewc\">\n      <bpmn:property id=\"Property_0bs4ymr\" name=\"__targetRef_placeholder\" />\n      <bpmn:dataInputAssociation id=\"DataInputAssociation_0i6cauf\">\n        <bpmn:sourceRef>DataStoreReference_1gynygb</bpmn:sourceRef>\n        <bpmn:targetRef>Property_0bs4ymr</bpmn:targetRef>\n      </bpmn:dataInputAssociation>\n      <bpmn:dataInputAssociation id=\"DataInputAssociation_1xidkdu\">\n        <bpmn:sourceRef>DataObjectReference_0v2e6m7</bpmn:sourceRef>\n        <bpmn:targetRef>Property_0bs4ymr</bpmn:targetRef>\n      </bpmn:dataInputAssociation>\n    </bpmn:task>\n    <bpmn:dataObjectReference id=\"DataObjectReference_0v2e6m7\" dataObjectRef=\"DataObject_00ce2uh\" />\n    <bpmn:dataObject id=\"DataObject_00ce2uh\" />\n    <bpmn:task id=\"Activity_1sosl74\">\n      <bpmn:outgoing>Flow_0802uvc</bpmn:outgoing>\n      <bpmn:multiInstanceLoopCharacteristics />\n    </bpmn:task>\n    <bpmn:task id=\"Activity_0brc3us\">\n      <bpmn:dataOutputAssociation id=\"DataOutputAssociation_1dph7uw\">\n        <bpmn:targetRef>DataStoreReference_1wvmfek</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n      <bpmn:dataOutputAssociation id=\"DataOutputAssociation_14ddyds\">\n        <bpmn:targetRef>DataObjectReference_05ngfcy</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n      <bpmn:standardLoopCharacteristics />\n    </bpmn:task>\n    <bpmn:dataObjectReference id=\"DataObjectReference_05ngfcy\" name=\"Data Object Reference\" dataObjectRef=\"DataObject_13ulk9j\" />\n    <bpmn:dataObject id=\"DataObject_13ulk9j\" isCollection=\"true\" />\n    <bpmn:adHocSubProcess id=\"Activity_08egzqv\" name=\"Ad-Hoc Subprocess\">\n      <bpmn:standardLoopCharacteristics />\n    </bpmn:adHocSubProcess>\n    <bpmn:exclusiveGateway id=\"Gateway_0238ieb\" default=\"Flow_0a4nevl\">\n      <bpmn:outgoing>Flow_0a4nevl</bpmn:outgoing>\n    </bpmn:exclusiveGateway>\n    <bpmn:sequenceFlow id=\"Flow_0a4nevl\" sourceRef=\"Gateway_0238ieb\" targetRef=\"Activity_0pfhghz\" />\n    <bpmn:task id=\"Activity_0pfhghz\">\n      <bpmn:incoming>Flow_0a4nevl</bpmn:incoming>\n      <bpmn:outgoing>Flow_16zflj8</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"Activity_0gi9n9o\">\n      <bpmn:incoming>Flow_16zflj8</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"Flow_16zflj8\" sourceRef=\"Activity_0pfhghz\" targetRef=\"Activity_0gi9n9o\">\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\" />\n    </bpmn:sequenceFlow>\n    <bpmn:callActivity id=\"Activity_1ivfc6a\">\n      <bpmn:extensionElements>\n        <zeebe:calledElement propagateAllChildVariables=\"false\" />\n      </bpmn:extensionElements>\n      <bpmn:standardLoopCharacteristics />\n    </bpmn:callActivity>\n    <bpmn:boundaryEvent id=\"Event_11sdw9z\" attachedToRef=\"Activity_0vheewc\">\n      <bpmn:compensateEventDefinition id=\"CompensateEventDefinition_04l674p\" />\n    </bpmn:boundaryEvent>\n    <bpmn:task id=\"Activity_1ndsz41\" isForCompensation=\"true\" />\n    <bpmn:subProcess id=\"Activity_0g37k20\" />\n    <bpmn:sendTask id=\"Activity_1125q3g\" />\n    <bpmn:serviceTask id=\"Activity_1ldvx66\" />\n    <bpmn:scriptTask id=\"Activity_011s9cd\" />\n    <bpmn:userTask id=\"Activity_1a96i3e\" />\n    <bpmn:receiveTask id=\"Activity_0e5q7rs\" instantiate=\"true\" />\n    <bpmn:eventBasedGateway id=\"Gateway_1la6tas\" instantiate=\"true\" />\n    <bpmn:eventBasedGateway id=\"Gateway_01lyed4\" eventGatewayType=\"Parallel\" />\n    <bpmn:adHocSubProcess id=\"Activity_0r6ceyw\" />\n    <bpmn:transaction id=\"Activity_137lgd1\" />\n    <bpmn:subProcess id=\"Activity_1fi82ot\" triggeredByEvent=\"true\" />\n    <bpmn:textAnnotation id=\"TextAnnotation_1xqm9d8\">\n      <bpmn:text>Textannotation</bpmn:text>\n    </bpmn:textAnnotation>\n    <bpmn:association id=\"Association_057v11v\" sourceRef=\"Activity_1sosl74\" targetRef=\"TextAnnotation_1xqm9d8\" />\n    <bpmn:association id=\"Association_1n0wnaa\" associationDirection=\"One\" sourceRef=\"Event_11sdw9z\" targetRef=\"Activity_1ndsz41\" />\n  </bpmn:process>\n  <bpmn:message id=\"Message_1\" name=\"Message\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_02tkzm4\">\n      <bpmndi:BPMNShape id=\"Participant_1pudv9f_di\" bpmnElement=\"Participant_1pudv9f\" isHorizontal=\"true\">\n        <dc:Bounds x=\"140\" y=\"60\" width=\"1280\" height=\"1500\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1vakzes_di\" bpmnElement=\"Lane_1vakzes\" isHorizontal=\"true\">\n        <dc:Bounds x=\"170\" y=\"1220\" width=\"1250\" height=\"340\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1cofr07_di\" bpmnElement=\"Lane_1cofr07\" isHorizontal=\"true\">\n        <dc:Bounds x=\"170\" y=\"60\" width=\"1250\" height=\"1160\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_01mo9pp_di\" bpmnElement=\"Activity_1ketqts\">\n        <dc:Bounds x=\"220\" y=\"120\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0hidovz_di\" bpmnElement=\"Activity_1aw7nq3\">\n        <dc:Bounds x=\"370\" y=\"120\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1ikz49h_di\" bpmnElement=\"Activity_09glvdf\">\n        <dc:Bounds x=\"520\" y=\"120\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_0w4fbsk_di\" bpmnElement=\"Gateway_0w4fbsk\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"245\" y=\"295\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"246\" y=\"352\" width=\"48\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_0tgejt4_di\" bpmnElement=\"Gateway_0lwqw3q\">\n        <dc:Bounds x=\"395\" y=\"295\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_16hyhp9_di\" bpmnElement=\"Gateway_0im7nvs\">\n        <dc:Bounds x=\"545\" y=\"295\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_0bn5u03_di\" bpmnElement=\"Gateway_1gp70qr\">\n        <dc:Bounds x=\"695\" y=\"295\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_15puyrp_di\" bpmnElement=\"Activity_088fmm5\" isExpanded=\"true\">\n        <dc:Bounds x=\"340\" y=\"430\" width=\"310\" height=\"600\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_14dcyxe_di\" bpmnElement=\"Event_1l5ozbh\">\n        <dc:Bounds x=\"402\" y=\"472\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1ehuivh_di\" bpmnElement=\"Event_1h3k36g\">\n        <dc:Bounds x=\"552\" y=\"472\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1dovk1s_di\" bpmnElement=\"Event_1p4tub5\">\n        <dc:Bounds x=\"402\" y=\"532\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1blrlze_di\" bpmnElement=\"Event_16k3ggm\">\n        <dc:Bounds x=\"552\" y=\"532\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1q9fgnx_di\" bpmnElement=\"Event_139t55w\">\n        <dc:Bounds x=\"402\" y=\"592\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1anq0sn_di\" bpmnElement=\"Event_1q5v0sf\">\n        <dc:Bounds x=\"552\" y=\"592\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_05w0dyh_di\" bpmnElement=\"Event_1g4mqp3\">\n        <dc:Bounds x=\"402\" y=\"712\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1558ky5_di\" bpmnElement=\"Event_1f81cds\">\n        <dc:Bounds x=\"552\" y=\"712\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0r4brhv_di\" bpmnElement=\"Event_19ahha0\">\n        <dc:Bounds x=\"402\" y=\"772\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0zs1a5m_di\" bpmnElement=\"Event_00h2mai\">\n        <dc:Bounds x=\"402\" y=\"832\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_10cel4r_di\" bpmnElement=\"Event_0eql2pf\">\n        <dc:Bounds x=\"552\" y=\"832\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1wnz45q_di\" bpmnElement=\"Event_09uyr4s\">\n        <dc:Bounds x=\"402\" y=\"952\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_113y379_di\" bpmnElement=\"Event_0m5cdgr\">\n        <dc:Bounds x=\"252\" y=\"472\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"243\" y=\"515\" width=\"55\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1ocn95s_di\" bpmnElement=\"Event_1vk962b\">\n        <dc:Bounds x=\"702\" y=\"472\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0pzvbay_di\" bpmnElement=\"Activity_0pzvbay\" isExpanded=\"true\">\n        <dc:Bounds x=\"870\" y=\"430\" width=\"150\" height=\"600\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0qhdt4c_di\" bpmnElement=\"Event_1njhrf7\">\n        <dc:Bounds x=\"1152\" y=\"472\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1cnrcjh_di\" bpmnElement=\"Event_0az045q\">\n        <dc:Bounds x=\"252\" y=\"532\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1rh3u8m_di\" bpmnElement=\"Event_0rd4z0d\">\n        <dc:Bounds x=\"702\" y=\"532\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0s0bfzr_di\" bpmnElement=\"Event_00twu86\">\n        <dc:Bounds x=\"1302\" y=\"472\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_00bxzao_di\" bpmnElement=\"Event_1faweyu\">\n        <dc:Bounds x=\"252\" y=\"592\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1ceu8ke_di\" bpmnElement=\"Event_01o5kun\">\n        <dc:Bounds x=\"702\" y=\"592\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1peubqp_di\" bpmnElement=\"Event_0a3nmhs\">\n        <dc:Bounds x=\"702\" y=\"652\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1u7yxnj_di\" bpmnElement=\"Event_0nn7qi2\">\n        <dc:Bounds x=\"1152\" y=\"652\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1mgz9qb_di\" bpmnElement=\"Event_0cvqzwg\">\n        <dc:Bounds x=\"702\" y=\"712\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1czxrsk_di\" bpmnElement=\"Event_0jf1q45\">\n        <dc:Bounds x=\"252\" y=\"712\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0m7cya2_di\" bpmnElement=\"Event_0d3edlz\">\n        <dc:Bounds x=\"1152\" y=\"712\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_02l7dnu_di\" bpmnElement=\"Event_0mf406j\">\n        <dc:Bounds x=\"1302\" y=\"712\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1gojfpq_di\" bpmnElement=\"Event_1tb0m8u\">\n        <dc:Bounds x=\"1302\" y=\"772\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0ha64fc_di\" bpmnElement=\"Event_1folo0q\">\n        <dc:Bounds x=\"1152\" y=\"832\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1wlidtb_di\" bpmnElement=\"Event_1lhkn4m\">\n        <dc:Bounds x=\"1302\" y=\"832\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0ritd0j_di\" bpmnElement=\"Event_0tlcssq\">\n        <dc:Bounds x=\"1302\" y=\"892\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1wtzvuy_di\" bpmnElement=\"Event_1d1oeak\">\n        <dc:Bounds x=\"1302\" y=\"952\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_14q825i_di\" bpmnElement=\"Event_1bjbr5h\">\n        <dc:Bounds x=\"1152\" y=\"952\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_09bhoe2_di\" bpmnElement=\"Activity_0djfr8f\" isExpanded=\"true\">\n        <dc:Bounds x=\"870\" y=\"1050\" width=\"500\" height=\"120\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0une4rb_di\" bpmnElement=\"Event_1cutsq6\">\n        <dc:Bounds x=\"1302\" y=\"1092\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_1wvmfek_di\" bpmnElement=\"DataStoreReference_1wvmfek\">\n        <dc:Bounds x=\"196\" y=\"1265\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"197\" y=\"1322\" width=\"54\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1xoymf7\" bpmnElement=\"DataStoreReference_1gynygb\">\n        <dc:Bounds x=\"196\" y=\"1365\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0hcpwc9_di\" bpmnElement=\"Activity_0hcpwc9\">\n        <dc:Bounds x=\"920\" y=\"1350\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1kz9py6\" bpmnElement=\"Activity_0vheewc\">\n        <dc:Bounds x=\"353\" y=\"1350\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0axixfr\" bpmnElement=\"DataObjectReference_0v2e6m7\">\n        <dc:Bounds x=\"565\" y=\"1365\" width=\"36\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1sosl74_di\" bpmnElement=\"Activity_1sosl74\">\n        <dc:Bounds x=\"713\" y=\"1350\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0brc3us_di\" bpmnElement=\"Activity_0brc3us\">\n        <dc:Bounds x=\"353\" y=\"1250\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_05ngfcy_di\" bpmnElement=\"DataObjectReference_05ngfcy\">\n        <dc:Bounds x=\"565\" y=\"1265\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"554\" y=\"1322\" width=\"59\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0avyupr_di\" bpmnElement=\"Activity_08egzqv\" isExpanded=\"true\">\n        <dc:Bounds x=\"340\" y=\"1050\" width=\"310\" height=\"120\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_0238ieb_di\" bpmnElement=\"Gateway_0238ieb\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"738\" y=\"1475\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0pfhghz_di\" bpmnElement=\"Activity_0pfhghz\">\n        <dc:Bounds x=\"920\" y=\"1460\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0gi9n9o_di\" bpmnElement=\"Activity_0gi9n9o\">\n        <dc:Bounds x=\"1160\" y=\"1460\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1rx7qci_di\" bpmnElement=\"Activity_1ivfc6a\">\n        <dc:Bounds x=\"1160\" y=\"1350\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1ndsz41_di\" bpmnElement=\"Activity_1ndsz41\">\n        <dc:Bounds x=\"530\" y=\"1460\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_15v9195_di\" bpmnElement=\"Activity_0g37k20\">\n        <dc:Bounds x=\"1160\" y=\"1250\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0unvxpf_di\" bpmnElement=\"Activity_1125q3g\">\n        <dc:Bounds x=\"820\" y=\"120\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0bjari0_di\" bpmnElement=\"Activity_1ldvx66\">\n        <dc:Bounds x=\"970\" y=\"120\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1bqlir6_di\" bpmnElement=\"Activity_011s9cd\">\n        <dc:Bounds x=\"1120\" y=\"120\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1hulhoi_di\" bpmnElement=\"Activity_1a96i3e\">\n        <dc:Bounds x=\"1270\" y=\"120\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1qbuker_di\" bpmnElement=\"Activity_0e5q7rs\">\n        <dc:Bounds x=\"670\" y=\"120\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_0cr60ph_di\" bpmnElement=\"Gateway_1la6tas\">\n        <dc:Bounds x=\"845\" y=\"295\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_0t2p1hd_di\" bpmnElement=\"Gateway_01lyed4\">\n        <dc:Bounds x=\"995\" y=\"295\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_128ea86_di\" bpmnElement=\"Activity_0r6ceyw\">\n        <dc:Bounds x=\"1280\" y=\"1250\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_145p4eg_di\" bpmnElement=\"Activity_137lgd1\">\n        <dc:Bounds x=\"1280\" y=\"1350\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_1xqm9d8_di\" bpmnElement=\"TextAnnotation_1xqm9d8\">\n        <dc:Bounds x=\"800\" y=\"1270\" width=\"99.98694034205708\" height=\"29.992818085003794\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0ssrgjf_di\" bpmnElement=\"Activity_1fi82ot\">\n        <dc:Bounds x=\"1280\" y=\"1460\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_19lz4a4_di\" bpmnElement=\"Event_11sdw9z\">\n        <dc:Bounds x=\"435\" y=\"1412\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_08k4l1q_di\" bpmnElement=\"Event_1ks0id1\">\n        <dc:Bounds x=\"852\" y=\"472\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1revq16_di\" bpmnElement=\"Event_0j90wfw\">\n        <dc:Bounds x=\"1002\" y=\"472\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1bbkws3_di\" bpmnElement=\"Event_0ikqxya\">\n        <dc:Bounds x=\"852\" y=\"532\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1jugyc0_di\" bpmnElement=\"Event_1x9von4\">\n        <dc:Bounds x=\"1002\" y=\"532\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1a3l00n_di\" bpmnElement=\"Event_13xao98\">\n        <dc:Bounds x=\"852\" y=\"592\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0bn3zw5_di\" bpmnElement=\"Event_1pdjezb\">\n        <dc:Bounds x=\"1002\" y=\"592\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1amf1mc_di\" bpmnElement=\"Event_1ks4j21\">\n        <dc:Bounds x=\"852\" y=\"712\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0zefk00_di\" bpmnElement=\"Event_0ncmtxn\">\n        <dc:Bounds x=\"1002\" y=\"712\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0cv9d2f_di\" bpmnElement=\"Event_01qiiyi\">\n        <dc:Bounds x=\"852\" y=\"772\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0qt7y3u_di\" bpmnElement=\"Event_1cax1xl\">\n        <dc:Bounds x=\"852\" y=\"832\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_001oe0g_di\" bpmnElement=\"Event_1o9cjfb\">\n        <dc:Bounds x=\"1002\" y=\"832\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1tpwr9f_di\" bpmnElement=\"Event_0t86sxc\">\n        <dc:Bounds x=\"852\" y=\"952\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0ebrnw6_di\" bpmnElement=\"Event_11fzkjc\">\n        <dc:Bounds x=\"852\" y=\"1092\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_0802uvc_di\" bpmnElement=\"Flow_0802uvc\">\n        <di:waypoint x=\"813\" y=\"1390\" />\n        <di:waypoint x=\"920\" y=\"1390\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0a4nevl_di\" bpmnElement=\"Flow_0a4nevl\">\n        <di:waypoint x=\"788\" y=\"1500\" />\n        <di:waypoint x=\"920\" y=\"1500\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_16zflj8_di\" bpmnElement=\"Flow_16zflj8\">\n        <di:waypoint x=\"1020\" y=\"1500\" />\n        <di:waypoint x=\"1160\" y=\"1500\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Association_057v11v_di\" bpmnElement=\"Association_057v11v\">\n        <di:waypoint x=\"796\" y=\"1350\" />\n        <di:waypoint x=\"838\" y=\"1300\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Association_1n0wnaa_di\" bpmnElement=\"Association_1n0wnaa\">\n        <di:waypoint x=\"453\" y=\"1448\" />\n        <di:waypoint x=\"453\" y=\"1500\" />\n        <di:waypoint x=\"530\" y=\"1500\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Participant_0q26pjx_di\" bpmnElement=\"Participant_0tuweou\" isHorizontal=\"true\">\n        <dc:Bounds x=\"140\" y=\"1640\" width=\"1280\" height=\"60\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_0306c6g_di\" bpmnElement=\"Group_0306c6g\">\n        <dc:Bounds x=\"190\" y=\"80\" width=\"1210\" height=\"150\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"781\" y=\"87\" width=\"29\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_06zgfh5_di\" bpmnElement=\"Group_06zgfh5\">\n        <dc:Bounds x=\"190\" y=\"250\" width=\"1210\" height=\"120\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"770\" y=\"257\" width=\"50\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_1uodo9r_di\" bpmnElement=\"Group_1uodo9r\">\n        <dc:Bounds x=\"190\" y=\"390\" width=\"1210\" height=\"810\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"778\" y=\"397\" width=\"35\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_0i6cauf_di\" bpmnElement=\"DataInputAssociation_0i6cauf\">\n        <di:waypoint x=\"246\" y=\"1390\" />\n        <di:waypoint x=\"353\" y=\"1390\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_1xidkdu_di\" bpmnElement=\"DataInputAssociation_1xidkdu\">\n        <di:waypoint x=\"565\" y=\"1390\" />\n        <di:waypoint x=\"453\" y=\"1390\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_1dph7uw_di\" bpmnElement=\"DataOutputAssociation_1dph7uw\">\n        <di:waypoint x=\"353\" y=\"1290\" />\n        <di:waypoint x=\"246\" y=\"1290\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_14ddyds_di\" bpmnElement=\"DataOutputAssociation_14ddyds\">\n        <di:waypoint x=\"453\" y=\"1290\" />\n        <di:waypoint x=\"565\" y=\"1290\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0mefziq_di\" bpmnElement=\"Flow_0mefziq\">\n        <di:waypoint x=\"276\" y=\"1560\" />\n        <di:waypoint x=\"276\" y=\"1640\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_14s7yr5_di\" bpmnElement=\"Flow_14s7yr5\">\n        <di:waypoint x=\"400\" y=\"1640\" />\n        <di:waypoint x=\"400\" y=\"1560\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_0gk5o24\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1p3nz9z\" bpmnElement=\"Activity_0g37k20\" />\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram>\n    <bpmndi:BPMNPlane bpmnElement=\"Activity_0r6ceyw\" />\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram>\n    <bpmndi:BPMNPlane bpmnElement=\"Activity_137lgd1\" />\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram>\n    <bpmndi:BPMNPlane bpmnElement=\"Activity_1fi82ot\" />\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/multiple-diagrams-lanesets.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"3.3.1\">\n  <collaboration id=\"Collaboration_1\">\n    <participant id=\"Participant_1\" name=\"Pool\" processRef=\"Process_1\"/>\n  </collaboration>\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <laneSet id=\"LaneSet_1\" name=\"Lane Set 1\" />\n    <task id=\"Task_A\" name=\"A\">\n      <outgoing>SequenceFlow</outgoing>\n    </task>\n    <endEvent id=\"EndEvent_B\" name=\"B\">\n      <incoming>SequenceFlow</incoming>\n    </endEvent>\n    <sequenceFlow id=\"SequenceFlow\" sourceRef=\"Task_A\" targetRef=\"EndEvent_B\" />\n  </process>\n  <process id=\"Process_2\" isExecutable=\"false\">\n    <laneSet id=\"LaneSet_2\" name=\"Lane Set 2\" />\n    <task id=\"Task_B\" name=\"B\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_1_di\" bpmnElement=\"Participant_1\">\n        <omgdc:Bounds x=\"56\" y=\"31\" width=\"500\" height=\"500\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BpmnDiagram_1_Task_A_di\" bpmnElement=\"Task_A\">\n        <omgdc:Bounds x=\"156\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BpmnDiagram_1_EndEvent_B_di\" bpmnElement=\"EndEvent_B\">\n        <omgdc:Bounds x=\"306\" y=\"103\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"320\" y=\"147\" width=\"8\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BpmnDiagram_1_SequenceFlow_di\" bpmnElement=\"SequenceFlow\">\n        <omgdi:waypoint x=\"256\" y=\"121\" />\n        <omgdi:waypoint x=\"306\" y=\"121\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_2\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_2\" bpmnElement=\"Process_2\">\n      <bpmndi:BPMNShape id=\"BpmnDiagram_2_Task_B_di\" bpmnElement=\"Task_B\">\n        <omgdc:Bounds x=\"0\" y=\"0\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/multiple-diagrams-overlapping-di.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"3.3.1\">\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <task id=\"Task_A\" name=\"A\">\n      <outgoing>SequenceFlow</outgoing>\n    </task>\n    <endEvent id=\"EndEvent_B\" name=\"B\">\n      <incoming>SequenceFlow</incoming>\n    </endEvent>\n    <sequenceFlow id=\"SequenceFlow\" sourceRef=\"Task_A\" targetRef=\"EndEvent_B\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"BpmnDiagram_1_Task_A_di\" bpmnElement=\"Task_A\">\n        <omgdc:Bounds x=\"156\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BpmnDiagram_1_EndEvent_B_di\" bpmnElement=\"EndEvent_B\">\n        <omgdc:Bounds x=\"306\" y=\"103\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"320\" y=\"147\" width=\"8\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BpmnDiagram_1_SequenceFlow_di\" bpmnElement=\"SequenceFlow\">\n        <omgdi:waypoint x=\"256\" y=\"121\" />\n        <omgdi:waypoint x=\"306\" y=\"121\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_2\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_2\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"BpmnDiagram_2_Task_A_di\" bpmnElement=\"Task_A\">\n        <omgdc:Bounds x=\"156\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BpmnDiagram_2_EndEvent_B_di\" bpmnElement=\"EndEvent_B\">\n        <omgdc:Bounds x=\"306\" y=\"103\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"320\" y=\"147\" width=\"8\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BpmnDiagram_2_SequenceFlow_di\" bpmnElement=\"SequenceFlow\">\n        <omgdi:waypoint x=\"256\" y=\"121\" />\n        <omgdi:waypoint x=\"306\" y=\"121\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/multiple-diagrams.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"3.3.1\">\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <task id=\"Task_A\" name=\"A\" />\n  </process>\n  <process id=\"Process_2\" isExecutable=\"false\">\n    <task id=\"Task_B\" name=\"B\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"BpmnDiagram_1_Task_A_di\" bpmnElement=\"Task_A\">\n        <omgdc:Bounds x=\"156\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_2\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_2\" bpmnElement=\"Process_2\">\n      <bpmndi:BPMNShape id=\"BpmnDiagram_2_Task_B_di\" bpmnElement=\"Task_B\">\n        <omgdc:Bounds x=\"256\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/multiple-nested-processes.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"3.3.1\">\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <task id=\"Task_1A\" name=\"A\" />\n      <task id=\"Task_1B\" name=\"B\" />\n    </bpmn:subProcess>\n  </process>\n  <process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess_2\">\n      <task id=\"Task_2A\" name=\"A\" />\n      <task id=\"Task_2B\" name=\"B\" />\n    </bpmn:subProcess>\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\">\n        <dc:Bounds x=\"220\" y=\"50\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"SubProcessDiagram_1\">\n    <bpmndi:BPMNPlane id=\"SubProcessPlane_1\" bpmnElement=\"SubProcess_1\">\n      <bpmndi:BPMNShape id=\"Task_1A_di\" bpmnElement=\"Task_1A\">\n        <dc:Bounds x=\"220\" y=\"50\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1B_di\" bpmnElement=\"Task_1B\">\n        <dc:Bounds x=\"350\" y=\"50\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_2\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_2\" bpmnElement=\"Process_2\">\n      <bpmndi:BPMNShape id=\"SubProcess_2_di\" bpmnElement=\"SubProcess_2\">\n        <omgdc:Bounds x=\"256\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"SubProcess_2_diagram_A\">\n    <bpmndi:BPMNPlane id=\"SubProcessPlane_2_A\" bpmnElement=\"SubProcess_2\">\n      <bpmndi:BPMNShape id=\"Task_2A_di\" bpmnElement=\"Task_2A\">\n        <omgdc:Bounds x=\"256\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"SubProcess_2_diagram_B\">\n    <bpmndi:BPMNPlane id=\"SubProcessPlane_2_B\" bpmnElement=\"SubProcess_2\">\n      <bpmndi:BPMNShape id=\"Task_2B_di\" bpmnElement=\"Task_2B\">\n        <omgdc:Bounds x=\"256\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/nested-subprocesses.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_ywazMDK5EeScr6nb_20jUA\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:subProcess id=\"SubProcess_1\">\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n      <bpmn2:subProcess id=\"SubProcess_2\">\n        <bpmn2:incoming>SequenceFlow_4</bpmn2:incoming>\n        <bpmn2:outgoing>SequenceFlow_5</bpmn2:outgoing>\n        <bpmn2:startEvent id=\"StartEvent_1\">\n          <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n        </bpmn2:startEvent>\n        <bpmn2:sequenceFlow id=\"SequenceFlow_2\" name=\"\" sourceRef=\"StartEvent_1\" targetRef=\"UserTask_1\"/>\n        <bpmn2:userTask id=\"UserTask_1\">\n          <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n          <bpmn2:outgoing>SequenceFlow_3</bpmn2:outgoing>\n        </bpmn2:userTask>\n        <bpmn2:sequenceFlow id=\"SequenceFlow_3\" name=\"\" sourceRef=\"UserTask_1\" targetRef=\"EndEvent_1\"/>\n        <bpmn2:endEvent id=\"EndEvent_1\">\n          <bpmn2:incoming>SequenceFlow_3</bpmn2:incoming>\n        </bpmn2:endEvent>\n      </bpmn2:subProcess>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_5\" name=\"\" sourceRef=\"SubProcess_2\" targetRef=\"ExclusiveGateway_1\"/>\n      <bpmn2:startEvent id=\"StartEvent_3\">\n        <bpmn2:outgoing>SequenceFlow_4</bpmn2:outgoing>\n      </bpmn2:startEvent>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_4\" name=\"\" sourceRef=\"StartEvent_3\" targetRef=\"SubProcess_2\"/>\n      <bpmn2:exclusiveGateway id=\"ExclusiveGateway_1\">\n        <bpmn2:incoming>SequenceFlow_5</bpmn2:incoming>\n      </bpmn2:exclusiveGateway>\n    </bpmn2:subProcess>\n    <bpmn2:startEvent id=\"StartEvent_2\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"StartEvent_2\" targetRef=\"SubProcess_1\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_2\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds height=\"349.0\" width=\"841.0\" x=\"168.0\" y=\"144.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_3\" bpmnElement=\"SubProcess_2\" isExpanded=\"true\">\n        <dc:Bounds height=\"301.0\" width=\"517.0\" x=\"336.0\" y=\"168.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_8\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"415.0\" y=\"288.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"433.0\" y=\"329.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_9\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"26.0\" y=\"224.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_StartEvent_9\" targetElement=\"_BPMNShape_SubProcess_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"62.0\" y=\"242.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"115.0\" y=\"242.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"115.0\" y=\"318.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"168.0\" y=\"318.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"112.0\" y=\"264.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_UserTask_3\" bpmnElement=\"UserTask_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"564.0\" y=\"238.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"_BPMNShape_StartEvent_8\" targetElement=\"_BPMNShape_UserTask_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"433.0\" y=\"324.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"433.0\" y=\"415.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"614.0\" y=\"415.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"614.0\" y=\"318.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"430.0\" y=\"349.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_24\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"696.0\" y=\"348.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"714.0\" y=\"389.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_3\" bpmnElement=\"SequenceFlow_3\" sourceElement=\"_BPMNShape_UserTask_3\" targetElement=\"_BPMNShape_EndEvent_24\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"664.0\" y=\"278.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"794.0\" y=\"278.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"794.0\" y=\"366.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"732.0\" y=\"366.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"686.0\" y=\"278.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_10\" bpmnElement=\"StartEvent_3\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"216.0\" y=\"216.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"234.0\" y=\"257.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_4\" bpmnElement=\"SequenceFlow_4\" sourceElement=\"_BPMNShape_StartEvent_10\" targetElement=\"_BPMNShape_SubProcess_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"252.0\" y=\"234.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"294.0\" y=\"234.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"294.0\" y=\"318.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"336.0\" y=\"318.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"291.0\" y=\"245.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_ExclusiveGateway_2\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"936.0\" y=\"201.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"961.0\" y=\"256.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_5\" bpmnElement=\"SequenceFlow_5\" sourceElement=\"_BPMNShape_SubProcess_3\" targetElement=\"_BPMNShape_ExclusiveGateway_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"852.0\" y=\"253.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"936.0\" y=\"232.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"915.0\" y=\"236.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/sequence-flows.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"simple\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:endEvent id=\"EndEvent_1\" name=\"End Event 1\">\n      <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:task id=\"Task_1\" name=\"Task 1\"/>\n    <bpmn2:exclusiveGateway id=\"Gateway_1\" name=\"Gateway 1&#xD;&#xA;\">\n      <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:exclusiveGateway>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_2\" name=\"Sequence Flow 2\" sourceRef=\"Gateway_1\" targetRef=\"EndEvent_1\"/>\n    <bpmn2:task id=\"Task_2\" name=\"Task 2\">\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n    </bpmn2:task>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"Sequence Flow 1\" sourceRef=\"Gateway_1\" targetRef=\"Task_2\"/>\n    <bpmn2:task id=\"Task_3\" name=\"Task 3\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"708.0\" y=\"144.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"22.0\" width=\"65.0\" x=\"694.0\" y=\"185.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_2\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"732.0\" y=\"396.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_4\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"192.0\" y=\"336.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_ExclusiveGateway_2\" bpmnElement=\"Gateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"528.0\" y=\"316.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"553.0\" y=\"371.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_6\" bpmnElement=\"Task_3\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"348.0\" y=\"122.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_6\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"_BPMNShape_ExclusiveGateway_2\" targetElement=\"_BPMNShape_EndEvent_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"553.0\" y=\"316.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"553.0\" y=\"162.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"708.0\" y=\"162.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"22.0\" width=\"106.0\" x=\"564.0\" y=\"240.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_7\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_ExclusiveGateway_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"578.0\" y=\"341.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"934.0\" y=\"341.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"934.0\" y=\"436.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"832.0\" y=\"436.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"22.0\" width=\"47.0\" x=\"831.0\" y=\"312.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/bpmn/simple-resizable.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n    </bpmn:subProcess>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"SubProcess_1\" />\n    <bpmn:endEvent id=\"EndEvent_1\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"SubProcess_1\" targetRef=\"EndEvent_1\" />\n    <bpmn:group id=\"Group_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"174\" y=\"224\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"147\" y=\"260\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"339\" y=\"142\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"210\" y=\"242\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"339\" y=\"242\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"229.5\" y=\"232\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EndEvent_1_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"821\" y=\"224\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"794\" y=\"260\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_2_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"689\" y=\"242\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"821\" y=\"242\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"710\" y=\"232\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Group_1_di\" bpmnElement=\"Group_1\">\n        <dc:Bounds x=\"264\" y=\"42\" width=\"500\" height=\"400\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/fixtures/bpmn/simple.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"simple\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:subProcess id=\"SubProcess_1\" name=\"Sub Process 1\">\n      <bpmn2:incoming>SequenceFlow_3</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n      <bpmn2:startEvent id=\"StartEvent_1\" name=\"Start Event 1\">\n        <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n      </bpmn2:startEvent>\n      <bpmn2:task id=\"Task_1\" name=\"Task\">\n        <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n      </bpmn2:task>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\"/>\n    </bpmn2:subProcess>\n    <bpmn2:endEvent id=\"EndEvent_1\" name=\"End Event\">\n      <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_2\" name=\"\" sourceRef=\"SubProcess_1\" targetRef=\"EndEvent_1\"/>\n    <bpmn2:startEvent id=\"StartEvent_2\" name=\"Start\">\n      <bpmn2:outgoing>SequenceFlow_3</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_3\" name=\"Flow\" sourceRef=\"StartEvent_2\" targetRef=\"SubProcess_1\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_2\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds height=\"300.0\" width=\"300.0\" x=\"300.0\" y=\"80.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"352.0\" y=\"242.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"345\" y=\"285\" width=\"55\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"420.0\" y=\"220.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_StartEvent_2\" targetElement=\"_BPMNShape_Task_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"388.0\" y=\"260.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"420.0\" y=\"260.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"650.0\" y=\"212.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"645\" y=\"255\" width=\"51\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"_BPMNShape_SubProcess_2\" targetElement=\"_BPMNShape_EndEvent_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"600.0\" y=\"230.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"650.0\" y=\"230.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_11\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"108.0\" y=\"212.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"126.0\" y=\"253.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_3\" bpmnElement=\"SequenceFlow_3\" sourceElement=\"_BPMNShape_StartEvent_11\" targetElement=\"_BPMNShape_SubProcess_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"144.0\" y=\"230.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"300.0\" y=\"230.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"21.0\" width=\"33.0\" x=\"192.0\" y=\"204.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/fixtures/json/model/camunda.json",
    "content": "{\n  \"name\": \"Camunda\",\n  \"uri\": \"http://camunda.org/schema/1.0/bpmn\",\n  \"prefix\": \"camunda\",\n  \"xml\": {\n    \"tagAlias\": \"lowerCase\"\n  },\n  \"associations\": [],\n  \"types\": [\n    {\n      \"name\": \"InOutBinding\",\n      \"superClass\": [\n        \"Element\"\n      ],\n      \"isAbstract\": true,\n      \"properties\": [\n        {\n          \"name\": \"source\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"sourceExpression\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"target\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"businessKey\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"local\",\n          \"isAttr\": true,\n          \"type\": \"Boolean\",\n          \"default\": false\n        },\n        {\n          \"name\": \"variables\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"In\",\n      \"superClass\": [\n        \"InOutBinding\"\n      ],\n      \"meta\": {\n        \"allowedIn\": [\n          \"bpmn:CallActivity\"\n        ]\n      }\n    },\n    {\n      \"name\": \"Out\",\n      \"superClass\": [\n        \"InOutBinding\"\n      ],\n      \"meta\": {\n        \"allowedIn\": [\n          \"bpmn:CallActivity\"\n        ]\n      }\n    },\n    {\n      \"name\": \"AsyncCapable\",\n      \"isAbstract\": true,\n      \"extends\": [\n        \"bpmn:Activity\",\n        \"bpmn:Gateway\",\n        \"bpmn:Event\"\n      ],\n      \"properties\": [\n        {\n          \"name\": \"async\",\n          \"isAttr\": true,\n          \"type\": \"Boolean\",\n          \"default\": false\n        },\n        {\n          \"name\": \"asyncBefore\",\n          \"isAttr\": true,\n          \"type\": \"Boolean\",\n          \"default\": false\n        },\n        {\n          \"name\": \"asyncAfter\",\n          \"isAttr\": true,\n          \"type\": \"Boolean\",\n          \"default\": false\n        },\n        {\n          \"name\": \"exclusive\",\n          \"isAttr\": true,\n          \"type\": \"Boolean\",\n          \"default\": true\n        }\n      ]\n    },\n    {\n      \"name\": \"JobPriorized\",\n      \"isAbstract\": true,\n      \"extends\": [\n        \"bpmn:Process\",\n        \"camunda:AsyncCapable\"\n      ],\n      \"properties\": [\n        {\n          \"name\": \"jobPriority\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"SignalEventDefinition\",\n      \"isAbstract\": true,\n      \"extends\": [\n        \"bpmn:SignalEventDefinition\"\n      ],\n      \"properties\": [\n        {\n          \"name\": \"async\",\n          \"isAttr\": true,\n          \"type\": \"Boolean\",\n          \"default\": false\n        }\n      ]\n    },\n    {\n      \"name\": \"ErrorEventDefinition\",\n      \"isAbstract\": true,\n      \"extends\": [\n        \"bpmn:ErrorEventDefinition\"\n      ],\n      \"properties\": [\n        {\n          \"name\": \"errorCodeVariable\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"errorMessageVariable\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"PotentialStarter\",\n      \"superClass\": [\n        \"Element\"\n      ],\n      \"properties\": [\n        {\n          \"name\": \"resourceAssignmentExpression\",\n          \"type\": \"bpmn:ResourceAssignmentExpression\"\n        }\n      ]\n    },\n    {\n      \"name\": \"FormSupported\",\n      \"isAbstract\": true,\n      \"extends\": [\n        \"bpmn:StartEvent\",\n        \"bpmn:UserTask\"\n      ],\n      \"properties\": [\n        {\n          \"name\": \"formHandlerClass\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"formKey\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"Initiator\",\n      \"isAbstract\": true,\n      \"extends\": [ \"bpmn:StartEvent\" ],\n      \"properties\": [\n        {\n          \"name\": \"initiator\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ScriptTask\",\n      \"isAbstract\": true,\n      \"extends\": [\n        \"bpmn:ScriptTask\"\n      ],\n      \"properties\": [\n        {\n          \"name\": \"resultVariable\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"resource\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"Process\",\n      \"isAbstract\": true,\n      \"extends\": [\n        \"bpmn:Process\"\n      ],\n      \"properties\": [\n        {\n          \"name\": \"candidateStarterGroups\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"candidateStarterUsers\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"versionTag\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"EscalationEventDefinition\",\n      \"isAbstract\": true,\n      \"extends\": [\n        \"bpmn:EscalationEventDefinition\"\n      ],\n      \"properties\": [\n        {\n          \"name\": \"escalationCodeVariable\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"FormalExpression\",\n      \"isAbstract\": true,\n      \"extends\": [\n        \"bpmn:FormalExpression\"\n      ],\n      \"properties\": [\n        {\n          \"name\": \"resource\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"Assignable\",\n      \"extends\": [ \"bpmn:UserTask\" ],\n      \"properties\": [\n        {\n          \"name\": \"assignee\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"candidateUsers\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"candidateGroups\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"dueDate\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"followUpDate\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"priority\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"CallActivity\",\n      \"extends\": [ \"bpmn:CallActivity\" ],\n      \"properties\": [\n        {\n          \"name\": \"calledElementBinding\",\n          \"isAttr\": true,\n          \"type\": \"String\",\n          \"default\": \"latest\"\n        },\n        {\n          \"name\": \"calledElementVersion\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"calledElementTenantId\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"caseRef\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"caseBinding\",\n          \"isAttr\": true,\n          \"type\": \"String\",\n          \"default\": \"latest\"\n        },\n        {\n          \"name\": \"caseVersion\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"caseTenantId\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"variableMappingClass\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"variableMappingDelegateExpression\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ServiceTaskLike\",\n      \"extends\": [\n        \"bpmn:ServiceTask\",\n        \"bpmn:BusinessRuleTask\",\n        \"bpmn:SendTask\",\n        \"bpmn:MessageEventDefinition\"\n      ],\n      \"properties\": [\n        {\n          \"name\": \"expression\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"class\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"delegateExpression\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"resultVariable\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"DmnCapable\",\n      \"extends\": [\n        \"bpmn:BusinessRuleTask\"\n      ],\n      \"properties\": [\n        {\n          \"name\": \"decisionRef\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"decisionRefBinding\",\n          \"isAttr\": true,\n          \"type\": \"String\",\n          \"default\": \"latest\"\n        },\n        {\n          \"name\": \"decisionRefVersion\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"mapDecisionResult\",\n          \"isAttr\": true,\n          \"type\": \"String\",\n          \"default\": \"resultList\"\n        },\n        {\n          \"name\": \"decisionRefTenantId\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ExternalCapable\",\n      \"extends\": [\n        \"camunda:ServiceTaskLike\"\n      ],\n      \"properties\": [\n        {\n          \"name\": \"type\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"topic\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"TaskPriorized\",\n      \"extends\": [\n        \"bpmn:Process\",\n        \"camunda:ExternalCapable\"\n      ],\n      \"properties\": [\n        {\n          \"name\": \"taskPriority\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"Properties\",\n      \"superClass\": [\n        \"Element\"\n      ],\n      \"meta\": {\n        \"allowedIn\": [ \"*\" ]\n      },\n      \"properties\": [\n        {\n          \"name\": \"values\",\n          \"type\": \"Property\",\n          \"isMany\": true\n        }\n      ]\n    },\n    {\n      \"name\": \"Property\",\n      \"superClass\": [\n        \"Element\"\n      ],\n      \"properties\": [\n        {\n          \"name\": \"id\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        },\n        {\n          \"name\": \"name\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        },\n        {\n          \"name\": \"value\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        }\n      ]\n    },\n    {\n      \"name\": \"Connector\",\n      \"superClass\": [\n        \"Element\"\n      ],\n      \"meta\": {\n        \"allowedIn\": [\n          \"bpmn:ServiceTask\",\n          \"bpmn:BusinessRuleTask\",\n          \"bpmn:SendTask\"\n        ]\n      },\n      \"properties\": [\n        {\n          \"name\": \"inputOutput\",\n          \"type\": \"InputOutput\"\n        },\n        {\n          \"name\": \"connectorId\",\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"InputOutput\",\n      \"superClass\": [\n        \"Element\"\n      ],\n      \"meta\": {\n        \"allowedIn\": [\n          \"bpmn:Task\",\n          \"bpmn:UserTask\",\n          \"bpmn:ServiceTask\",\n          \"bpmn:SendTask\",\n          \"bpmn:BusinessRuleTask\",\n          \"bpmn:ReceiveTask\",\n          \"bpmn:ScriptTask\",\n          \"bpmn:ManualTask\",\n          \"bpmn:GlobalUserTask\",\n          \"bpmn:GlobalScriptTask\",\n          \"bpmn:GlobalBusinessRuleTask\",\n          \"bpmn:GlobalTask\",\n          \"bpmn:GlobalManualTask\",\n          \"bpmn:SubProcess\",\n          \"bpmn:Transaction\",\n          \"bpmn:IntermediateCatchEvent\",\n          \"bpmn:IntermediateThrowEvent\",\n          \"bpmn:EndEvent\",\n          \"bpmn:ThrowEvent\",\n          \"bpmn:CatchEvent\",\n          \"bpmn:ImplicitThrowEvent\",\n          \"bpmn:CallActivity\"\n        ]\n      },\n      \"properties\": [\n        {\n          \"name\": \"inputOutput\",\n          \"type\": \"InputOutput\"\n        },\n        {\n          \"name\": \"connectorId\",\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"inputParameters\",\n          \"isMany\": true,\n          \"type\": \"InputParameter\"\n        },\n        {\n          \"name\": \"outputParameters\",\n          \"isMany\": true,\n          \"type\": \"OutputParameter\"\n        }\n      ]\n    },\n    {\n      \"name\": \"InputOutputParameter\",\n      \"properties\": [\n        {\n          \"name\": \"name\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"value\",\n          \"isBody\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"definition\",\n          \"type\": \"InputOutputParameterDefinition\"\n        }\n      ]\n    },\n    {\n      \"name\": \"InputOutputParameterDefinition\",\n      \"isAbstract\": true\n    },\n    {\n      \"name\": \"List\",\n      \"superClass\": [ \"InputOutputParameterDefinition\" ],\n      \"properties\": [\n        {\n          \"name\": \"items\",\n          \"isMany\": true,\n          \"type\": \"InputOutputParameterDefinition\"\n        }\n      ]\n    },\n    {\n      \"name\": \"Map\",\n      \"superClass\": [ \"InputOutputParameterDefinition\" ],\n      \"properties\": [\n        {\n          \"name\": \"entries\",\n          \"isMany\": true,\n          \"type\": \"Entry\"\n        }\n      ]\n    },\n    {\n      \"name\": \"Entry\",\n      \"properties\": [\n        {\n          \"name\": \"key\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"value\",\n          \"isBody\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"definition\",\n          \"type\": \"InputOutputParameterDefinition\"\n        }\n      ]\n    },\n    {\n      \"name\": \"Value\",\n      \"superClass\": [\n        \"InputOutputParameterDefinition\"\n      ],\n      \"properties\": [\n        {\n          \"name\": \"id\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"name\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"value\",\n          \"isBody\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"Script\",\n      \"superClass\": [ \"InputOutputParameterDefinition\" ],\n      \"properties\": [\n        {\n          \"name\": \"scriptFormat\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"resource\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"value\",\n          \"isBody\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"Field\",\n      \"superClass\": [ \"Element\" ],\n      \"meta\": {\n        \"allowedIn\": [\n          \"bpmn:ServiceTask\",\n          \"bpmn:BusinessRuleTask\",\n          \"bpmn:SendTask\"\n        ]\n      },\n      \"properties\": [\n        {\n          \"name\": \"name\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"expression\",\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"stringValue\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"string\",\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"InputParameter\",\n      \"superClass\": [ \"InputOutputParameter\" ]\n    },\n    {\n      \"name\": \"OutputParameter\",\n      \"superClass\": [ \"InputOutputParameter\" ]\n    },\n    {\n      \"name\": \"Collectable\",\n      \"isAbstract\": true,\n      \"extends\": [ \"bpmn:MultiInstanceLoopCharacteristics\" ],\n      \"superClass\": [ \"camunda:AsyncCapable\" ],\n      \"properties\": [\n        {\n          \"name\": \"collection\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"elementVariable\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"FailedJobRetryTimeCycle\",\n      \"superClass\": [ \"Element\" ],\n      \"meta\": {\n        \"allowedIn\": [\n          \"bpmn:Task\",\n          \"bpmn:ServiceTask\",\n          \"bpmn:SendTask\",\n          \"bpmn:UserTask\",\n          \"bpmn:BusinessRuleTask\",\n          \"bpmn:ScriptTask\",\n          \"bpmn:ReceiveTask\",\n          \"bpmn:CallActivity\",\n          \"bpmn:TimerEventDefinition\",\n          \"bpmn:SignalEventDefinition\",\n          \"bpmn:MultiInstanceLoopCharacteristics\"\n        ]\n      },\n      \"properties\": [\n        {\n          \"name\": \"body\",\n          \"isBody\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ExecutionListener\",\n      \"superClass\": [ \"Element\" ],\n      \"meta\": {\n        \"allowedIn\": [\n          \"bpmn:Task\",\n          \"bpmn:ServiceTask\",\n          \"bpmn:UserTask\",\n          \"bpmn:BusinessRuleTask\",\n          \"bpmn:ScriptTask\",\n          \"bpmn:ReceiveTask\",\n          \"bpmn:ManualTask\",\n          \"bpmn:ExclusiveGateway\",\n          \"bpmn:SequenceFlow\",\n          \"bpmn:ParallelGateway\",\n          \"bpmn:InclusiveGateway\",\n          \"bpmn:EventBasedGateway\",\n          \"bpmn:StartEvent\",\n          \"bpmn:IntermediateCatchEvent\",\n          \"bpmn:IntermediateThrowEvent\",\n          \"bpmn:EndEvent\",\n          \"bpmn:BoundaryEvent\",\n          \"bpmn:CallActivity\",\n          \"bpmn:SubProcess\"\n        ]\n      },\n      \"properties\": [\n        {\n          \"name\": \"expression\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"class\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"delegateExpression\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"event\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"script\",\n          \"type\": \"Script\"\n        },\n        {\n          \"name\": \"fields\",\n          \"type\": \"Field\",\n          \"isMany\": true\n        }\n      ]\n    },\n    {\n      \"name\": \"TaskListener\",\n      \"superClass\": [ \"Element\" ],\n      \"meta\": {\n        \"allowedIn\": [\n          \"bpmn:UserTask\"\n        ]\n      },\n      \"properties\": [\n        {\n          \"name\": \"expression\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"class\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"delegateExpression\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"event\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"script\",\n          \"type\": \"Script\"\n        },\n        {\n          \"name\": \"fields\",\n          \"type\": \"Field\",\n          \"isMany\": true\n        }\n      ]\n    },\n    {\n      \"name\": \"FormProperty\",\n      \"superClass\": [ \"Element\" ],\n      \"meta\": {\n        \"allowedIn\": [\n          \"bpmn:StartEvent\",\n          \"bpmn:UserTask\"\n        ]\n      },\n      \"properties\": [\n        {\n          \"name\": \"id\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        },\n        {\n          \"name\": \"name\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        },\n        {\n          \"name\": \"type\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        },\n        {\n          \"name\": \"required\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        },\n        {\n          \"name\": \"readable\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        },\n        {\n          \"name\": \"writable\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        },\n        {\n          \"name\": \"variable\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        },\n        {\n          \"name\": \"expression\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        },\n        {\n          \"name\": \"datePattern\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        },\n        {\n          \"name\": \"default\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        },\n        {\n          \"name\": \"values\",\n          \"type\": \"Value\",\n          \"isMany\": true\n        }\n      ]\n    },\n    {\n      \"name\": \"FormData\",\n      \"superClass\": [ \"Element\" ],\n      \"meta\": {\n        \"allowedIn\": [\n          \"bpmn:StartEvent\",\n          \"bpmn:UserTask\"\n        ]\n      },\n      \"properties\": [\n        {\n          \"name\": \"fields\",\n          \"type\": \"FormField\",\n          \"isMany\": true\n        },\n        {\n          \"name\": \"businessKey\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        }\n      ]\n    },\n    {\n      \"name\": \"FormField\",\n      \"superClass\": [ \"Element\" ],\n      \"properties\": [\n        {\n          \"name\": \"id\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        },\n        {\n          \"name\": \"label\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        },\n        {\n          \"name\": \"type\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        },\n        {\n          \"name\": \"datePattern\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        },\n        {\n          \"name\": \"defaultValue\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        },\n        {\n          \"name\": \"properties\",\n          \"type\": \"Properties\"\n        },\n        {\n          \"name\": \"validation\",\n          \"type\": \"Validation\"\n        },\n        {\n          \"name\": \"values\",\n          \"type\": \"Value\",\n          \"isMany\": true\n        }\n      ]\n    },\n    {\n      \"name\": \"Validation\",\n      \"superClass\": [ \"Element\" ],\n      \"properties\": [\n        {\n          \"name\": \"constraints\",\n          \"type\": \"Constraint\",\n          \"isMany\": true\n        }\n      ]\n    },\n    {\n      \"name\": \"Constraint\",\n      \"superClass\": [ \"Element\" ],\n      \"properties\": [\n        {\n          \"name\": \"name\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        },\n        {\n          \"name\": \"config\",\n          \"type\": \"String\",\n          \"isAttr\": true\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionalEventDefinition\",\n      \"isAbstract\": true,\n      \"extends\": [\n        \"bpmn:ConditionalEventDefinition\"\n      ],\n      \"properties\": [\n        {\n          \"name\": \"variableName\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"variableEvent\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        }\n      ]\n    }\n  ],\n  \"emumerations\": [ ]\n}\n"
  },
  {
    "path": "test/fixtures/json/model/custom-override.json",
    "content": "{\n  \"name\": \"Custom descriptor Override\",\n  \"uri\": \"http://customdescriptor.com/bpmn2\",\n  \"prefix\": \"custom\",\n  \"xml\": {\n    \"tagAlias\": \"lowerCase\"\n  },\n  \"associations\": [],\n  \"types\": [\n    {\n      \"name\": \"CustomSendElementOverride\",\n      \"superClass\": [\n        \"Element\"\n      ],\n      \"properties\": [\n        {\n          \"name\": \"name\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"value\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ServiceTaskGroupOverride\",\n      \"extends\": [\n        \"bpmn:ServiceTask\",\n        \"bpmn:BusinessRuleTask\",\n        \"bpmn:SendTask\",\n        \"bpmn:MessageEventDefinition\"\n      ]\n    }\n  ],\n  \"emumerations\": [ ]\n}\n"
  },
  {
    "path": "test/fixtures/json/model/custom.json",
    "content": "{\n  \"name\": \"Custom descriptor\",\n  \"uri\": \"http://customdescriptor.com/bpmn2\",\n  \"prefix\": \"custom\",\n  \"xml\": {\n    \"tagAlias\": \"lowerCase\"\n  },\n  \"associations\": [],\n  \"types\": [\n    {\n      \"name\": \"CustomSendElement\",\n      \"superClass\": [\n        \"Element\"\n      ],\n      \"properties\": [\n        {\n          \"name\": \"name\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"value\",\n          \"isAttr\": true,\n          \"type\": \"String\"\n        },\n        {\n          \"name\": \"paths\",\n          \"type\": \"String\",\n          \"isMany\": true\n        }\n      ]\n    },\n    {\n      \"name\": \"ServiceTaskGroup\",\n      \"extends\": [\n        \"bpmn:ServiceTask\",\n        \"bpmn:BusinessRuleTask\",\n        \"bpmn:SendTask\",\n        \"bpmn:MessageEventDefinition\"\n      ]\n    }\n  ],\n  \"emumerations\": [ ]\n}\n"
  },
  {
    "path": "test/helper/TranslationCollector.js",
    "content": "import translate from 'diagram-js/lib/i18n/translate/translate';\n\nfunction collectTranslations(template, replacements) {\n  var log = {\n    type: 'translations',\n    msg: template\n  };\n\n  console.log(JSON.stringify(log));\n\n  return translate(template, replacements);\n}\n\nexport default {\n  translate: [ 'value', collectTranslations ]\n};"
  },
  {
    "path": "test/helper/index.js",
    "content": "/**\n * A helper file that may be used in test cases for bpmn-js and extensions.\n *\n * Provides the globals\n *\n * * bootstrapModeler(): bootstrap a modeler instance\n * * bootstrapViewer(): bootstrap a viewer instance\n * * inject(function(a, b) {}): inject the bpmn-js services in the given function\n *\n *\n * In addition it provides the utilities\n *\n * * insertCSS(name, css): add a CSS file to be used in test cases\n *\n *\n * It is recommended to expose the helper through a per-project utility and\n * and perform custom bootstrapping (CSS, ...) in that utility.\n *\n * ```\n * export * from 'bpmn-js/test/helper';\n *\n * import {\n *   insertCSS\n * } from 'bpmn-js/test/helper';\n *\n * // insert diagram.css\n * insertCSS('diagram.css', require('./some-css.css'));\n * ```\n */\n\nimport {\n  isFunction,\n  forEach,\n  merge\n} from 'min-dash';\n\nimport TestContainer from 'mocha-test-container-support';\n\nimport Modeler from '../../lib/Modeler';\nimport NavigatedViewer from '../../lib/NavigatedViewer';\nimport Viewer from '../../lib/Viewer';\n\nvar OPTIONS, BPMN_JS;\n\nimport translationModule from './TranslationCollector';\n\nexport var collectTranslations = window.__env__ && window.__env__.COLLECT_TRANSLATIONS;\n\n// inject logging translation module into default modules\nif (collectTranslations) {\n\n  [ Modeler, Viewer, NavigatedViewer ].forEach(function(constructor) {\n    constructor.prototype._modules.push(translationModule);\n  });\n}\n\nexport function bootstrapBpmnJS(BpmnJS, diagram, options, locals) {\n\n  return function() {\n    var testContainer;\n\n    // Make sure the test container is an optional dependency and we fall back\n    // to an empty <div> if it does not exist.\n    //\n    // This is needed if other libraries rely on this helper for testing\n    // while not adding the mocha-test-container-support as a dependency.\n    try {\n\n      // 'this' is the current test context\n      testContainer = TestContainer.get(this);\n    } catch (e) {\n      testContainer = document.createElement('div');\n      testContainer.classList.add('test-content-container');\n\n      document.body.appendChild(testContainer);\n    }\n\n    var _options = options,\n        _locals = locals;\n\n    if (_locals === undefined && isFunction(_options)) {\n      _locals = _options;\n      _options = null;\n    }\n\n    if (isFunction(_options)) {\n      _options = _options();\n    }\n\n    if (isFunction(_locals)) {\n      _locals = _locals();\n    }\n\n    _options = merge({\n      container: testContainer,\n      canvas: {\n        deferUpdate: false\n      }\n    }, OPTIONS, _options);\n\n    if (_locals) {\n      var mockModule = {};\n\n      forEach(_locals, function(v, k) {\n        mockModule[k] = [ 'value', v ];\n      });\n\n      _options.modules = [].concat(_options.modules || [], [ mockModule ]);\n    }\n\n    if (_options.modules && !_options.modules.length) {\n      _options.modules = undefined;\n    }\n\n    // used to extract translations used during tests\n    if (collectTranslations) {\n      _options.additionalModules = [].concat(\n        _options.additionalModules || [],\n        [ translationModule ]\n      );\n    }\n\n    clearBpmnJS();\n\n    var instance = new BpmnJS(_options);\n\n    setBpmnJS(instance);\n\n    return instance.importXML(diagram).then(function(result) {\n      return { error: null, warnings: result.warnings };\n    }).catch(function(err) {\n      return { error: err, warnings: err.warnings };\n    });\n  };\n}\n\n\n/**\n * Bootstrap the Modeler given the specified options and a number of locals (i.e. services)\n *\n * @example\n *\n * describe(function() {\n *\n *   var mockEvents;\n *\n *   beforeEach(bootstrapModeler('some-xml', function() {\n *     mockEvents = new Events();\n *\n *     return {\n *       events: mockEvents\n *     };\n *   }));\n *\n * });\n *\n * @param  {string} xml document to display\n * @param  {Object} (options) optional options to be passed to the diagram upon instantiation\n * @param  {Object|Function} locals  the local overrides to be used by the diagram or a function that produces them\n * @return {Function}         a function to be passed to beforeEach\n */\nexport function bootstrapModeler(diagram, options, locals) {\n  return bootstrapBpmnJS(Modeler, diagram, options, locals);\n}\n\n/**\n * Bootstrap the Viewer given the specified options and a number of locals (i.e. services)\n *\n * @example\n *\n * describe(function() {\n *\n *   var mockEvents;\n *\n *   beforeEach(bootstrapViewer('some-xml', function() {\n *     mockEvents = new Events();\n *\n *     return {\n *       events: mockEvents\n *     };\n *   }));\n *\n * });\n *\n * @param  {string} xml document to display\n * @param  {Object} (options) optional options to be passed to the diagram upon instantiation\n * @param  {Object|Function} locals  the local overrides to be used by the diagram or a function that produces them\n * @return {Function}         a function to be passed to beforeEach\n */\nexport function bootstrapViewer(diagram, options, locals) {\n  return bootstrapBpmnJS(Viewer, diagram, options, locals);\n}\n\n\n/**\n * Injects services of an instantiated diagram into the argument.\n *\n * Use it in conjunction with {@link #bootstrapModeler} or {@link #bootstrapViewer}.\n *\n * @example\n *\n * describe(function() {\n *\n *   var mockEvents;\n *\n *   beforeEach(bootstrapViewer(...));\n *\n *   it('should provide mocked events', inject(function(events) {\n *     expect(events).to.eql(mockEvents);\n *   }));\n *\n * });\n *\n * @param  {Function} fn the function to inject to\n * @return {Function} a function that can be passed to it to carry out the injection\n */\nexport function inject(fn) {\n  return function() {\n\n    if (!BPMN_JS) {\n      throw new Error(\n        'no bootstraped bpmn-js instance, ' +\n        'ensure you created it via #boostrap(Modeler|Viewer)'\n      );\n    }\n\n    return BPMN_JS.invoke(fn);\n  };\n}\n\n\n/**\n * Returns the current active BpmnJS instance.\n *\n * @return {BpmnJS}\n */\nexport function getBpmnJS() {\n  return BPMN_JS;\n}\n\nexport function clearBpmnJS() {\n\n  // clean up old bpmn-js instance\n  if (BPMN_JS) {\n    BPMN_JS.destroy();\n\n    BPMN_JS = null;\n  }\n}\n\n// This method always resolves.\n// It helps us to do done(err) within the same block.\nexport function createViewer(container, viewerInstance, xml, diagramId) {\n\n  clearBpmnJS();\n\n  var viewer = new viewerInstance({ container: container });\n\n  setBpmnJS(viewer);\n\n  return viewer.importXML(xml, diagramId).then(function(result) {\n    return { warnings: result.warnings, viewer: viewer };\n  }).catch(function(err) {\n    return { error: err, viewer: viewer, warnings: err.warnings };\n  });\n}\n\nfunction logConfigured(type, force) {\n  var url = new URL(window.location.href);\n\n  var log = ('searchParams' in url) && url.searchParams.get('log') || '';\n\n  return force || log.includes('save-xml');\n}\n\n/**\n * Enable logging on a modeler instance.\n *\n * @param  {import('bpmn-js')} modeler\n * @param  {boolean} [force=false]\n */\nexport function enableLogging(modeler, force) {\n\n  var saveXML = logConfigured('save-xml', force);\n\n  saveXML && modeler.on('commandStack.changed', function() {\n    Promise.resolve()\n      .then(() => modeler.saveXML({ format: true }))\n      .then((result) => console.log(result.xml));\n  });\n}\n\nexport function setBpmnJS(instance) {\n  BPMN_JS = instance;\n}\n\nexport function insertCSS(name, css) {\n  if (document.querySelector('[data-css-file=\"' + name + '\"]')) {\n    return;\n  }\n\n  var head = document.head || document.getElementsByTagName('head')[0],\n      style = document.createElement('style');\n  style.setAttribute('data-css-file', name);\n\n  style.type = 'text/css';\n  if (style.styleSheet) {\n    style.styleSheet.cssText = css;\n  } else {\n    style.appendChild(document.createTextNode(css));\n  }\n\n  head.appendChild(style);\n}"
  },
  {
    "path": "test/integration/CustomElementsSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport Modeler from 'lib/Modeler';\n\nimport {\n  createCanvasEvent as canvasEvent\n} from '../util/MockEvents';\n\n\nimport customElementsModules from './custom-elements';\n\nvar modelerModules = Modeler.prototype._modules,\n    customModules = [ customElementsModules ];\n\nvar testModules = [].concat(modelerModules, customModules);\n\nvar processDiagramXML = require('../fixtures/bpmn/simple.bpmn');\n\nvar collaborationDiagramXML = require('../fixtures/bpmn/collaboration.bpmn');\n\n\ndescribe('custom elements', function() {\n\n  describe('renderer', function() {\n\n    beforeEach(bootstrapModeler(processDiagramXML, {\n      modules: testModules\n    }));\n\n\n    var triangle, circle;\n\n    beforeEach(inject(function(elementFactory, canvas) {\n      triangle = elementFactory.createShape({\n        id: 'triangle',\n        type: 'custom:triangle',\n        x: 700, y: 100\n      });\n\n      canvas.addShape(triangle);\n\n      circle = elementFactory.createShape({\n        id: 'circle',\n        type: 'custom:circle',\n        x: 800, y: 100\n      });\n\n      canvas.addShape(circle);\n    }));\n\n\n    it('should render custom elements', inject(function(elementRegistry) {\n\n      // when\n\n      // then\n      expect(elementRegistry.get('triangle')).to.eql(triangle);\n      expect(elementRegistry.get('circle')).to.eql(circle);\n    }));\n\n\n    it('should get the correct custom elements path', inject(function(graphicsFactory) {\n\n      // when\n      var trianglePath = graphicsFactory.getShapePath(triangle),\n          circlePath = graphicsFactory.getShapePath(circle);\n\n      // then\n      expect(trianglePath).to.equal('M720,100l20,40l-40,0z');\n      expect(circlePath).to.equal('M870,170m0,-70a70,70,0,1,1,0,140a70,70,0,1,1,0,-140z');\n    }));\n\n\n    it('should still render bpmn elements', inject(function(elementFactory) {\n\n      // when\n      var startEvent = elementFactory.createShape({ type: 'bpmn:StartEvent' });\n\n      // then\n      expect(startEvent.businessObject.$type).to.equal('bpmn:StartEvent');\n    }));\n\n  });\n\n\n  describe('integration', function() {\n\n    describe('process diagram', function() {\n\n      beforeEach(bootstrapModeler(processDiagramXML, {\n        modules: testModules\n      }));\n\n\n      var triangle, circle;\n\n      beforeEach(inject(function(elementFactory, canvas) {\n\n        circle = elementFactory.createShape({\n          id: 'circle',\n          type: 'custom:circle',\n          x: 800, y: 100\n        });\n\n        canvas.addShape(circle);\n\n        triangle = elementFactory.createShape({\n          id: 'triangle',\n          type: 'custom:triangle',\n          x: 700, y: 100\n        });\n\n        canvas.addShape(triangle);\n      }));\n\n\n      it('should allow moving a custom shape inside another one',\n        inject(function(elementFactory, elementRegistry, dragging, move) {\n\n          // given\n          var circleGfx = elementRegistry.getGraphics(circle);\n\n          // when\n          move.start(canvasEvent({ x: 0, y: 0 }), triangle);\n\n          dragging.move(canvasEvent({ x: 100, y: 0 }));\n          dragging.hover({ element: circle, gfx: circleGfx });\n          dragging.move(canvasEvent({ x: 150, y: 50 }));\n\n          dragging.end();\n\n          // then\n          expect(triangle.parent).to.equal(circle);\n        })\n      );\n\n\n      it('should update the custom shape properties',\n        inject(function(elementFactory, elementRegistry, dragging, move) {\n\n          // given\n          var circleGfx = elementRegistry.getGraphics(circle);\n\n          // when\n          move.start(canvasEvent({ x: 0, y: 0 }), triangle);\n\n          dragging.move(canvasEvent({ x: 100, y: 0 }));\n          dragging.hover({ element: circle, gfx: circleGfx });\n          dragging.move(canvasEvent({ x: 150, y: 50 }));\n\n          dragging.end();\n\n          // then\n          expect(triangle.businessObject.leader).to.equal(circle);\n          expect(circle.businessObject.companions).to.include(triangle);\n        })\n      );\n\n\n      it('should not connect a bpmn element to a custom one',\n        inject(function(elementFactory, dragging, elementRegistry, connect) {\n\n          // given\n          var subProcess = elementRegistry.get('SubProcess_1'),\n              triangleGfx = elementRegistry.getGraphics(triangle);\n\n          // when\n          connect.start(canvasEvent({ x: 590, y: 90 }), subProcess);\n\n          dragging.move(canvasEvent({ x: 700, y: 100 }));\n          dragging.hover({ element: triangle, gfx: triangleGfx });\n          dragging.move(canvasEvent({ x: 715, y: 115 }));\n\n          dragging.end();\n\n          // then\n          expect(triangle.incoming).to.have.lengthOf(0);\n        })\n      );\n\n    });\n\n\n    describe('collaboration diagram', function() {\n\n      beforeEach(bootstrapModeler(collaborationDiagramXML, {\n        modules: testModules\n      }));\n\n\n      var triangle;\n\n      beforeEach(inject(function(elementFactory, canvas) {\n\n        triangle = elementFactory.createShape({\n          id: 'triangle',\n          type: 'custom:triangle',\n          x: 700, y: 100\n        });\n\n        canvas.addShape(triangle);\n      }));\n\n\n      it('should update parent when removing collaboration',\n        inject(function(elementRegistry, modeling, canvas) {\n\n          // given\n          var customTriangle = elementRegistry.get('triangle');\n\n          // when\n          modeling.removeElements([\n            elementRegistry.get('Participant_1'),\n            elementRegistry.get('Participant_2')\n          ]);\n\n          // then\n          expect(customTriangle.parent).to.eql(canvas.getRootElement());\n        })\n      );\n\n    });\n\n  });\n\n});\n"
  },
  {
    "path": "test/integration/ReimportSpec.js",
    "content": "import Modeler from 'lib/Modeler';\n\nimport TestContainer from 'mocha-test-container-support';\n\nfunction delay(fn) {\n  setTimeout(fn, 10);\n}\n\n\ndescribe.skip('scenario - successive reopening', function() {\n\n  var container;\n\n  beforeEach(function() {\n    container = TestContainer.get(this);\n  });\n\n\n  var boundaryXML = require('../fixtures/bpmn/boundary-events.bpmn'),\n      containersXML = require('../fixtures/bpmn/containers.bpmn'),\n      flowMarkersXML = require('../fixtures/bpmn/flow-markers.bpmn'),\n      simpleXML = require('../fixtures/bpmn/simple.bpmn');\n\n  var allDiagrams = [\n    boundaryXML,\n    containersXML,\n    flowMarkersXML,\n    simpleXML\n  ];\n\n  it('should import 100 diagrams', function(done) {\n\n    // this test needs time\n    this.timeout(30000);\n\n    var count = 0;\n\n    // given\n    var modeler = new Modeler({ container: container });\n\n    modeler.on('import.done', function(event) {\n\n      console.log('imported #' + count);\n\n      if (event.error) {\n        console.error('ERROR', event.error);\n      }\n\n      if (event.warnings && event.warnings.length) {\n        console.warn('WARNINGS', event.warnings);\n      }\n    });\n\n    function finish(err) {\n      modeler.destroy();\n\n      done(err);\n    }\n\n    function importNext() {\n\n      if (count === 100) {\n        return finish();\n      }\n\n      var i = count % allDiagrams.length;\n\n      var xml = allDiagrams[i];\n\n      // when\n      modeler.importXML(xml).then(function() {\n        count++;\n\n        delay(importNext);\n      }).catch(function(err) {\n        return finish(err);\n      });\n    }\n\n    // when\n    importNext();\n  });\n\n});\n"
  },
  {
    "path": "test/integration/SimpleModelingSpec.js",
    "content": "import Modeler from 'lib/Modeler';\n\nimport TestContainer from 'mocha-test-container-support';\n\ndescribe('scenario - simple modeling', function() {\n\n\n  var container;\n\n  beforeEach(function() {\n    container = TestContainer.get(this);\n  });\n\n\n  it('should build process from start to end event', function() {\n\n    // given\n    var modeler = new Modeler({ container: container });\n\n    // when\n    return modeler.createDiagram();\n  });\n\n});\n"
  },
  {
    "path": "test/integration/custom-elements/CustomElementFactory.js",
    "content": "import {\n  assign\n} from 'min-dash';\n\nimport inherits from 'inherits-browser';\n\nimport ElementFactory from 'lib/features/modeling/ElementFactory';\n\nimport {\n  DEFAULT_LABEL_SIZE\n} from 'lib/util/LabelUtil';\n\n\nexport default function CustomElementFactory(injector) {\n  injector.invoke(ElementFactory, this);\n\n  var self = this;\n\n  this.create = function(elementType, attrs) {\n    var type = attrs.type,\n        businessObject,\n        size;\n\n    if (elementType === 'label') {\n      return self._baseCreate(elementType, assign({ type: 'label' }, DEFAULT_LABEL_SIZE, attrs));\n    }\n\n    if (/^custom:/.test(type)) {\n      type = attrs.type.replace(/^custom:/, '');\n\n      businessObject = {};\n\n      size = self._getCustomElementSize(type);\n\n      return self._baseCreate(elementType,\n        assign({ type: elementType, businessObject: businessObject }, attrs, size));\n    }\n\n    return self.createElement(elementType, attrs);\n  };\n}\n\ninherits(CustomElementFactory, ElementFactory);\n\nCustomElementFactory.$inject = [ 'injector' ];\n\n\n/**\n * Sets the *width* and *height* for custom shapes.\n *\n * The following example shows an interface on how\n * to setup the custom element's dimensions.\n *\n * @example\n *\n *  var shapes = {\n *     triangle: { width: 40, height: 40 },\n *     rectangle: { width: 100, height: 20 }\n *  };\n *\n *   return shapes[type];\n *\n *\n * @param  {string} type\n *\n * @return {Bounds} { width, height}\n */\nCustomElementFactory.prototype._getCustomElementSize = function(type) {\n  if (!type) {\n    return { width: 100, height: 80 };\n  }\n\n  var shapes = {\n    triangle: { width: 40, height: 40 },\n    circle: { width: 140, height: 140 }\n  };\n\n  return shapes[type];\n};\n"
  },
  {
    "path": "test/integration/custom-elements/CustomRenderer.js",
    "content": "import inherits from 'inherits-browser';\n\nimport BaseRenderer from 'diagram-js/lib/draw/BaseRenderer';\n\nimport {\n  componentsToPath\n} from 'diagram-js/lib/util/RenderUtil';\n\nimport {\n  append as svgAppend,\n  attr as svgAttr,\n  create as svgCreate\n} from 'tiny-svg';\n\n\nexport default function CustomRenderer(eventBus, styles) {\n\n  BaseRenderer.call(this, eventBus, 2000);\n\n  this._styles = styles;\n\n  var self = this;\n\n  var computeStyle = styles.computeStyle;\n\n  this.handlers = {\n    'custom:triangle': function(parentGfx, element) {\n      return self.drawTriangle(parentGfx, element.width);\n    },\n    'custom:circle': function(parentGfx, element, attrs) {\n      return self.drawCircle(parentGfx, element.width, element.height, attrs);\n    }\n  };\n\n  this.drawTriangle = function(parentGfx, side, attrs) {\n    var halfSide = side / 2,\n        points;\n\n    points = [ { x: halfSide, y: 0 }, { x: side, y: side }, { x: 0, y: side } ];\n\n    var pointsString = points.map(function(point) {\n      return point.x + ',' + point.y;\n    }).join(' ');\n\n    attrs = computeStyle(attrs, {\n      stroke: '#3CAA82',\n      strokeWidth: 2,\n      fill: '#3CAA82'\n    });\n\n    var polygon = svgCreate('polygon');\n    svgAttr(polygon, { points: pointsString });\n    svgAttr(polygon, attrs);\n\n    svgAppend(parentGfx, polygon);\n\n    return polygon;\n  };\n\n  this.getTrianglePath = function(element) {\n    var x = element.x,\n        y = element.y,\n        width = element.width,\n        height = element.height;\n\n    var trianglePath = [\n      [ 'M', x + width / 2, y ],\n      [ 'l', width / 2, height ],\n      [ 'l', -width, 0 ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(trianglePath);\n  };\n\n  this.drawCircle = function(parentGfx, width, height, attrs) {\n    var cx = width / 2,\n        cy = height / 2;\n\n    attrs = computeStyle(attrs, {\n      stroke: '#4488aa',\n      strokeWidth: 4,\n      fill: 'white'\n    });\n\n    var circle = svgCreate('circle');\n    svgAttr(circle, {\n      cx: cx,\n      cy: cy,\n      r: Math.round((width + height) / 4)\n    });\n    svgAttr(circle, attrs);\n\n    svgAppend(parentGfx, circle);\n\n    return circle;\n  };\n\n  this.getCirclePath = function(shape) {\n    var cx = shape.x + shape.width / 2,\n        cy = shape.y + shape.height / 2,\n        radius = shape.width / 2;\n\n    var circlePath = [\n      [ 'M', cx, cy ],\n      [ 'm', 0, -radius ],\n      [ 'a', radius, radius, 0, 1, 1, 0, 2 * radius ],\n      [ 'a', radius, radius, 0, 1, 1, 0, -2 * radius ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(circlePath);\n  };\n\n}\n\ninherits(CustomRenderer, BaseRenderer);\n\nCustomRenderer.$inject = [ 'eventBus', 'styles' ];\n\n\nCustomRenderer.prototype.canRender = function(element) {\n  return /^custom:/.test(element.type);\n};\n\nCustomRenderer.prototype.drawShape = function(visuals, element) {\n  var type = element.type;\n  var h = this.handlers[type];\n\n  /* jshint -W040 */\n  return h(visuals, element);\n};\n\nCustomRenderer.prototype.drawConnection = function(visuals, element) {\n  var type = element.type;\n  var h = this.handlers[type];\n\n  /* jshint -W040 */\n  return h(visuals, element);\n};\n\nCustomRenderer.prototype.getShapePath = function(element) {\n  var type = element.type.replace(/^custom:/, '');\n\n  var shapes = {\n    triangle: this.getTrianglePath,\n    circle: this.getCirclePath\n  };\n\n  return shapes[type](element);\n};\n"
  },
  {
    "path": "test/integration/custom-elements/CustomRules.js",
    "content": "import { forEach } from 'min-dash';\n\nimport inherits from 'inherits-browser';\n\nimport RuleProvider from 'diagram-js/lib/features/rules/RuleProvider';\n\nvar HIGH_PRIORITY = 1500;\n\n\n/**\n * Specific rules for custom elements\n */\nexport default function CustomRules(eventBus) {\n  RuleProvider.call(this, eventBus);\n}\n\ninherits(CustomRules, RuleProvider);\n\nCustomRules.$inject = [ 'eventBus' ];\n\n\nCustomRules.prototype.init = function() {\n\n  this.addRule('connection.create', HIGH_PRIORITY, function(context) {\n    var source = context.source,\n        target = context.target;\n\n    return canConnect(source, target);\n  });\n\n  this.addRule('connection.reconnect', HIGH_PRIORITY, function(context) {\n\n    var connection = context.connection,\n        source = context.source,\n        target = connection.target;\n\n    return canConnect(source, target, connection);\n  });\n\n  this.addRule('connection.updateWaypoints', HIGH_PRIORITY, function(context) {\n\n    // OK! but visually ignore\n    return null;\n  });\n\n  this.addRule('elements.move', HIGH_PRIORITY, function(context) {\n\n    var target = context.target,\n        shapes = context.shapes,\n        position = context.position;\n\n    return canMove(shapes, target, position);\n  });\n\n  this.addRule('shape.create', HIGH_PRIORITY, function(context) {\n    var target = context.target,\n        shape = context.shape,\n        position = context.position;\n\n    return canCreate(shape, target, position);\n  });\n\n  this.addRule('shape.resize', HIGH_PRIORITY, function(context) {\n    var shape = context.shape;\n\n    if (isCustom(shape)) {\n      return false;\n    }\n  });\n};\n\nfunction canConnect(source, target) {\n  return !isCustom(source) && !isCustom(target);\n}\n\nfunction canCreate(shape, target) {\n  if (isType(target, 'custom:triangle')) {\n    return false;\n  }\n\n  if (isType(target, 'custom:circle')) {\n    if (isType(shape, 'custom:triangle')) {\n      return true;\n    }\n    return false;\n  }\n\n  if (isCustom(shape)) {\n    return true;\n  }\n}\n\nfunction canMove(shapes, target, position) {\n  var result;\n\n  forEach(shapes, function(shape) {\n    if (isType(shape, 'custom:triangle') && isType(target, 'custom:circle')) {\n      result = true;\n      return false;\n    }\n\n    if (isCustom(target)) {\n      result = false;\n      return false;\n    }\n\n    if (isCustom(shape)) {\n      result = true;\n      return false;\n    }\n  });\n\n  return result;\n}\n\nfunction isType(element, type) {\n  var patt = new RegExp(type, 'i');\n\n  return element && patt.test(element.type);\n}\n\nfunction isCustom(element) {\n  return element && /^custom:/.test(element.type);\n}\n"
  },
  {
    "path": "test/integration/custom-elements/CustomUpdater.js",
    "content": "import inherits from 'inherits-browser';\n\nimport {\n  is as isBpmn\n} from 'lib/util/ModelUtil';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\n\nfunction isCustom(element, type) {\n\n  if (!type) {\n    return /custom:/.test(element.type);\n  }\n\n  return element && element.type === type;\n}\n\nfunction ifCustomElement(fn) {\n  return function(event) {\n    var context = event.context,\n        element = context.shape || context.connection;\n\n    if (!isBpmn(element, 'bpmn:BaseElement')) {\n      fn(event);\n    }\n  };\n}\n\n/**\n * A handler responsible for updating the custom element's businessObject\n * once changes on the diagram happen\n */\nexport default function CustomUpdater(eventBus, modeling) {\n\n  CommandInterceptor.call(this, eventBus);\n\n  function updateTriangle(evt) {\n    var context = evt.context,\n        shape = context.shape,\n        businessObject = shape.businessObject,\n        leader = businessObject.leader,\n        companions,\n        parent,\n        idx;\n\n    if (!isCustom(shape, 'custom:triangle')) {\n      return;\n    }\n\n    parent = shape.parent;\n\n    if (!parent) {\n      return;\n    }\n\n    if (isBpmn(parent, 'bpmn:SubProcess')) {\n      shape.businessObject.foo = 'geil';\n    }\n\n    if (!isBpmn(parent, 'bpmn:SubProcess')) {\n      shape.businessObject.foo = 'bar';\n    }\n\n    if (isCustom(parent, 'custom:circle')) {\n      shape.businessObject.leader = parent;\n\n      if (!parent.businessObject.companions) {\n        parent.businessObject.companions = [];\n      }\n      parent.businessObject.companions.push(shape);\n    }\n\n    if (!isCustom(parent, 'custom:circle') && leader) {\n      companions = leader.businessObject.companions;\n\n      idx = companions.indexOf(shape);\n\n      companions.splice(idx, 1);\n\n      businessObject.leader = '';\n    }\n  }\n\n  this.executed([\n    'shape.move',\n    'shape.create'\n  ], ifCustomElement(updateTriangle));\n\n\n  /**\n   * When morphing a Process into a Collaboration or vice-versa,\n   * make sure that the existing custom elements get their parents updated.\n   */\n  function updateCustomElementsRoot(event) {\n    var context = event.context,\n        oldRoot = context.oldRoot,\n        newRoot = context.newRoot,\n        children = oldRoot.children;\n\n    var customChildren = children.filter(isCustom);\n\n    if (customChildren.length) {\n      modeling.moveElements(customChildren, { x: 0, y: 0 }, newRoot);\n    }\n  }\n\n  this.postExecute('canvas.updateRoot', updateCustomElementsRoot);\n}\n\ninherits(CustomUpdater, CommandInterceptor);\n\nCustomUpdater.$inject = [ 'eventBus', 'modeling' ];\n"
  },
  {
    "path": "test/integration/custom-elements/index.js",
    "content": "import CustomElementFactory from './CustomElementFactory';\nimport CustomRenderer from './CustomRenderer';\nimport CustomRules from './CustomRules';\nimport CustomUpdater from './CustomUpdater';\n\nexport default {\n  __init__: [\n    'customRenderer',\n    'customRules',\n    'customUpdater'\n  ],\n  elementFactory: [ 'type', CustomElementFactory ],\n  customRenderer: [ 'type', CustomRenderer ],\n  customRules: [ 'type', CustomRules ],\n  customUpdater: [ 'type', CustomUpdater ]\n};\n"
  },
  {
    "path": "test/integration/model/BpmnModdleSpec.js",
    "content": "import { BpmnModdle } from 'bpmn-moddle';\n\n\ndescribe('bpmn-moddle', function() {\n\n  function parse(xml) {\n    var moddle = new BpmnModdle();\n    return moddle.fromXML(xml, 'bpmn:Definitions');\n  }\n\n\n  describe('browser support', function() {\n\n    it('should parse simple xml', function() {\n\n      var xml =\n        '<?xml version=\"1.0\" encoding=\"UTF-8\"?>' +\n        '<bpmn2:definitions xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" ' +\n                           'id=\"simple\" ' +\n                           'targetNamespace=\"http://bpmn.io/schema/bpmn\">' +\n          '<bpmn2:process id=\"Process_1\"></bpmn2:process>' +\n        '</bpmn2:definitions>';\n\n      // when\n      return parse(xml).then(function(result) {\n\n        var definitions = result.rootElement;\n\n        // then\n        expect(definitions.id).to.equal('simple');\n        expect(definitions.targetNamespace).to.equal('http://bpmn.io/schema/bpmn');\n\n        expect(definitions.rootElements.length).to.equal(1);\n        expect(definitions.rootElements[0].id).to.equal('Process_1');\n      });\n    });\n\n\n    it('should parse complex xml', function() {\n\n      var xml = require('../../fixtures/bpmn/complex.bpmn');\n\n      var start = new Date().getTime();\n\n      // when\n      return parse(xml).then(function() {\n\n        // then\n        // parsing a XML document should not take too long\n        expect((new Date().getTime() - start)).to.be.below(1000);\n      });\n    });\n\n  });\n\n});\n"
  },
  {
    "path": "test/matchers/BoundsMatchers.js",
    "content": "import {\n  pick\n} from 'min-dash';\n\nimport {\n  getDi\n} from 'lib/util/ModelUtil';\n\nvar BOUNDS_ATTRS = [ 'x', 'y', 'width', 'height' ],\n    POSITION_ATTRS = [ 'x', 'y' ],\n    DIMENSION_ATTRS = [ 'width', 'height' ];\n\nfunction getBounds(s) {\n\n  if ('bounds' in s) {\n    s = s.bounds;\n  }\n\n  // TLBR object\n  if ('top' in s) {\n    return {\n      x: s.left,\n      y: s.top,\n      width: s.right - s.left,\n      height: s.bottom - s.top\n    };\n  }\n\n  // { x, y, width, height } object\n  else {\n    return pick(s, BOUNDS_ATTRS);\n  }\n}\n\nfunction getDimensions(s) {\n  return pick(getBounds(s), DIMENSION_ATTRS);\n}\n\nfunction getPosition(s) {\n  return pick(getBounds(s), POSITION_ATTRS);\n}\n\n\nexport default function(chai, utils) {\n\n  var Assertion = chai.Assertion;\n\n  function inspect(obj) {\n    return utils.inspect(obj).replace(/\\n /g, '');\n  }\n\n\n  /**\n   * A simple bounds matcher, that verifies an element\n   * has the correct { x, y, width, height }.\n   *\n   * @example\n   *\n   * expect(di.label).to.have.bounds({ x: 100, y: 100, width: 10, height: 20 });\n   * expect(shape).to.have.bounds({ top: 100, left: 0, right: 200, bottom: 50 });\n   *\n   * @param {Bounds|TLBR} exp\n   */\n  Assertion.addMethod('bounds', function(exp) {\n    var obj = this._obj;\n\n    assertBounds(this, obj.id ? obj.id : obj, getBounds(obj), getBounds(exp));\n  });\n\n\n  /**\n   * A simple bounds matcher, that verifies an element\n   * has the correct { x, y, width, height }.\n   *\n   * @example\n   *\n   * expect(di.label).to.have.diBounds({ x: 100, y: 100, width: 10, height: 20 });\n   * expect(shape).to.have.diBounds({ top: 100, left: 0, right: 200, bottom: 50 });\n   *\n   * @param {Bounds|TLBR} exp\n   */\n  Assertion.addMethod('diBounds', function(exp) {\n    var obj = this._obj;\n\n    var di = getDi(obj);\n\n    expect(di).to.exist;\n\n    assertBounds(this, di.id, getBounds(di), getBounds(exp));\n  });\n\n  /**\n   * A simple dimensions matcher, that verifies an element\n   * has the correct { width, height }.\n   *\n   * Unwraps `element.bounds` (BPMNDI) if present.\n   *\n   * @example\n   *\n   * expect(di.label).to.have.dimensions({ width: 10, height: 20 });\n   *\n   * @param {Dimensions} exp\n   */\n  Assertion.addMethod('dimensions', function(exp) {\n\n    var obj = this._obj;\n\n    assertDimensions(this, obj.id ? obj.id : obj, getDimensions(obj), getDimensions(exp));\n  });\n\n\n  /**\n   * A simple dimensions matcher, that verifies an elements\n   * DI has the correct { width, height }.\n   *\n   * Unwraps `element.bounds` (BPMNDI) if present.\n   *\n   * @example\n   *\n   * expect(di.label).to.have.diDimensions({ width: 10, height: 20 });\n   *\n   * @param {Dimensions} exp\n   */\n  Assertion.addMethod('diDimensions', function(exp) {\n\n    var obj = this._obj;\n\n    var di = getDi(obj);\n\n    expect(di).to.exist;\n\n    assertDimensions(this, di.id, getDimensions(di), getDimensions(exp));\n  });\n\n\n  /**\n   * A simple position matcher, that verifies an element\n   * has the correct { x, y }.\n   *\n   * Unwraps `element.bounds` (BPMNDI) if present.\n   *\n   * @example\n   *\n   * expect(taskShape).to.have.position({ x: 100, y: 150 });\n   *\n   * @param {Point} exp\n   */\n  Assertion.addMethod('position', function(exp) {\n\n    var obj = this._obj;\n\n    assertPosition(this, obj.id ? obj.id : obj, getPosition(obj), getPosition(exp));\n  });\n\n\n  /**\n   * A simple position matcher, that verifies an element\n   * has the correct DI position { x, y }.\n   *\n   * Unwraps `element.bounds` (BPMNDI) if present.\n   *\n   * @example\n   *\n   * expect(taskShape).to.have.diPosition({ x: 100, y: 150 });\n   *\n   * @param {Point} exp\n   */\n  Assertion.addMethod('diPosition', function(exp) {\n\n    var obj = this._obj;\n\n    var di = getDi(obj);\n\n    expect(di).to.exist;\n\n    assertPosition(this, di.id, getPosition(di), getPosition(exp));\n  });\n\n\n  // helpers ////////////////\n\n  function assertBounds(self, desc, bounds, expectedBounds) {\n\n    var matches = utils.eql(bounds, expectedBounds);\n\n    var boundsStr = inspect(bounds),\n        expectedBoundsStr = inspect(expectedBounds);\n\n    var theAssert = new Assertion(bounds);\n\n    // transfer flags\n    utils.transferFlags(self, theAssert, false);\n\n    theAssert.assert(\n      matches,\n      'expected <' + desc + '> bounds ' +\n          'to equal \\n  ' + expectedBoundsStr +\n          '\\nbut got\\n  ' + boundsStr,\n      'expected <' + desc + '> bounds ' +\n          'not to equal \\n  ' + expectedBoundsStr,\n      expectedBounds\n    );\n  }\n\n  function assertDimensions(self, desc, dimensions, expectedDimensions) {\n\n    var matches = utils.eql(dimensions, expectedDimensions);\n\n    var dimensionsStr = inspect(dimensions),\n        expectedDimensionsStr = inspect(expectedDimensions);\n\n    var theAssert = new Assertion(dimensions);\n\n    // transfer flags\n    utils.transferFlags(self, theAssert, false);\n\n    theAssert.assert(\n      matches,\n      'expected <' + desc + '> dimensions ' +\n          'to equal \\n  ' + expectedDimensionsStr +\n          '\\nbut got\\n  ' + dimensionsStr,\n      'expected <' + desc + '> dimensions ' +\n          'not to equal \\n  ' + expectedDimensionsStr,\n      expectedDimensions\n    );\n  }\n\n  function assertPosition(self, desc, position, expectedPosition) {\n\n    var matches = utils.eql(position, expectedPosition);\n\n    var positionStr = inspect(position),\n        expectedPositionStr = inspect(expectedPosition);\n\n\n    var theAssert = new Assertion(position);\n\n    // transfer flags\n    utils.transferFlags(self, theAssert, false);\n\n    theAssert.assert(\n      matches,\n      'expected <' + desc + '> position ' +\n          'to equal \\n  ' + expectedPositionStr +\n          '\\nbut got\\n  ' + positionStr,\n      'expected <' + desc + '> position ' +\n          'not to equal \\n  ' + expectedPositionStr,\n      expectedPosition\n    );\n  }\n\n}\n"
  },
  {
    "path": "test/matchers/ConnectionMatchers.js",
    "content": "import {\n  pick\n} from 'min-dash';\n\nimport {\n  getDi\n} from 'lib/util/ModelUtil';\n\nvar POSITION_ATTRS = [ 'x', 'y' ];\n\nfunction getPoint(point) {\n  return pick(point, POSITION_ATTRS);\n}\n\nfunction getPoints(waypoints) {\n  return waypoints.map(getPoint);\n}\n\n\nexport default function(chai, utils) {\n\n  var Assertion = chai.Assertion;\n\n  function inspect(obj) {\n    return utils.inspect(obj).replace(/\\n /g, '');\n  }\n\n  /**\n   * A simple waypoints matcher, that verifies a connection\n   * consists of the correct connection points.\n   *\n   * Does not take the original docking into account.\n   *\n   * @example\n   *\n   * expect(connection).to.have.waypoints([ { x: 100, y: 100 }, { x: 0, y: 0 } ]);\n   *\n   * @param {Connection|Array<Point>} exp\n   */\n  Assertion.addMethod('waypoints', function(exp) {\n    var obj = this._obj;\n\n    expect(obj).to.have.property('waypoints');\n\n    assertWaypoints(this, obj.id + '#waypoints', getPoints(obj.waypoints), getPoints(exp));\n  });\n\n\n  /**\n   * A simple waypoints matcher, that verifies a connection\n   * consists of the correct DI waypoints.\n   *\n   * Does not take the original docking into account.\n   *\n   * @example\n   *\n   * expect(connection).to.have.diWaypoints([ { x: 100, y: 100 }, { x: 0, y: 0 } ]);\n   *\n   * @param {Connection|Point[]} exp\n   */\n  Assertion.addMethod('diWaypoints', function(exp) {\n    var obj = this._obj;\n\n    var di = getDi(obj);\n\n    expect(di).to.exist;\n\n    expect(di).to.have.property('waypoint');\n\n    assertWaypoints(this, di + '#waypoint', getPoints(di.waypoint), getPoints(exp));\n  });\n\n\n  /**\n   * A simple waypoints matcher, that verifies a connection\n   * has the given start docking.\n   *\n   * @example\n   *\n   * expect(connection).to.have.startDocking({ x: 100, y: 100 });\n   *\n   * @param {Point} exp\n   */\n  Assertion.addMethod('startDocking', function(exp) {\n    var obj = this._obj;\n\n    var startPoint = obj.waypoints[0],\n        startDocking = startPoint && startPoint.original;\n\n    var matches = utils.eql(startDocking, exp);\n\n    var startDockingStr = inspect(startDocking),\n        expectedStartDockingStr = inspect(exp);\n\n    var theAssert = new Assertion(startDocking);\n\n    // transfer negate status\n    utils.transferFlags(this, theAssert, false);\n\n    theAssert.assert(\n      matches,\n      'expected <' + obj.id + '> to have startDocking ' +\n        expectedStartDockingStr + ' but got ' + startDockingStr\n    );\n  });\n\n  /**\n   * A simple waypoints matcher, that verifies a connection\n   * has the given start docking.\n   *\n   * @example\n   *\n   * expect(connection).to.have.endDocking({ x: 100, y: 100 });\n   *\n   * @param {Point} exp\n   */\n  Assertion.addMethod('endDocking', function(exp) {\n    var obj = this._obj;\n\n    var endPoint = obj.waypoints[obj.waypoints.length - 1],\n        endDocking = endPoint && endPoint.original;\n\n    var matches = utils.eql(endDocking, exp);\n\n    var endDockingStr = inspect(endDocking),\n        expectedEndDockingStr = inspect(exp);\n\n    var theAssert = new Assertion(endDocking);\n\n    // transfer negate status\n    utils.transferFlags(this, theAssert, false);\n\n    theAssert.assert(\n      matches,\n      'expected <' + obj.id + '> to have endDocking ' +\n        expectedEndDockingStr + ' but got ' + endDockingStr\n    );\n  });\n\n\n  // helpers ////////////////\n\n  function assertWaypoints(self, desc, waypoints, expectedWaypoints) {\n\n    var matches = utils.eql(waypoints, expectedWaypoints);\n\n    var waypointsStr = inspect(waypoints),\n        expectedWaypointsStr = inspect(expectedWaypoints);\n\n    var theAssert = new Assertion(waypoints);\n\n    // transfer negate status\n    utils.transferFlags(self, theAssert, false);\n\n    theAssert.assert(\n      matches,\n      'expected <' + desc + '> ' +\n          'to equal \\n  ' + expectedWaypointsStr +\n          '\\nbut got\\n  ' + waypointsStr,\n      'expected <' + desc + '> ' +\n          'not to equal \\n  ' + expectedWaypoints,\n      expectedWaypoints\n    );\n  }\n\n}"
  },
  {
    "path": "test/matchers/JSONMatcher.js",
    "content": "export default function(chai, utils) {\n\n  var Assertion = chai.Assertion;\n\n  Assertion.addMethod('jsonEqual', function(comparison, filter) {\n\n    var actual = JSON.stringify(this._obj, filter, '  ');\n    var expected = JSON.stringify(comparison, filter, '  ');\n\n    this.assert(\n      actual == expected,\n      'expected #{this} to json equal #{exp} but got #{act}',\n      'expected #{this} not to json equal #{exp}',\n      expected, // expected\n      actual, // actual\n      true // show diff\n    );\n  });\n}\n"
  },
  {
    "path": "test/spec/BaseModelerSpec.js",
    "content": "import BaseModeler from 'lib/BaseModeler';\nimport BaseViewer from 'lib/BaseViewer';\n\nimport inherits from 'inherits-browser';\n\n\nconst spy = sinon.spy;\n\n\ndescribe('BaseModeler', function() {\n\n  it('should instantiate', function() {\n\n    // when\n    var instance = new BaseModeler();\n\n    // then\n    expect(instance.importXML).to.exist;\n    expect(instance.saveXML).to.exist;\n\n    expect(instance instanceof BaseModeler).to.be.true;\n    expect(instance instanceof BaseViewer).to.be.true;\n  });\n\n\n  describe('#getModule', function() {\n\n    it('should allow override with context', function() {\n\n      // given\n      const options = {\n        __foo: 1,\n        some: {\n          other: {\n            thing: 'yes'\n          }\n        }\n      };\n\n      function SpecialModeler(options) {\n        this.getModules = spy(function(localOptions) {\n          expect(localOptions, 'options are passed').to.exist;\n\n          expect(localOptions).to.include(options);\n\n          return BaseModeler.prototype.getModules.call(this, localOptions);\n        });\n\n        BaseModeler.call(this, options);\n      }\n\n      inherits(SpecialModeler, BaseModeler);\n\n      // when\n      var instance = new SpecialModeler(options);\n\n      // then\n      expect(instance.getModules).to.have.been.calledOnce;\n\n      expect(instance instanceof SpecialModeler).to.be.true;\n      expect(instance instanceof BaseModeler).to.be.true;\n      expect(instance instanceof BaseViewer).to.be.true;\n    });\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/BaseViewerSpec.js",
    "content": "import BaseViewer from 'lib/BaseViewer';\n\nimport inherits from 'inherits-browser';\n\n\nconst spy = sinon.spy;\n\n\ndescribe('BaseViewer', function() {\n\n  it('should instantiate', function() {\n\n    // when\n    var instance = new BaseViewer();\n\n    // then\n    expect(instance.importXML).to.exist;\n    expect(instance.saveXML).to.exist;\n\n    expect(instance instanceof BaseViewer).to.be.true;\n  });\n\n\n  describe('#getModule', function() {\n\n    it('should allow override with context', function() {\n\n      // given\n      const options = {\n        __foo: 1,\n        some: {\n          other: {\n            thing: 'yes'\n          }\n        }\n      };\n\n      function SpecialViewer(options) {\n        this.getModules = spy(function(localOptions) {\n          expect(localOptions, 'options are passed').to.exist;\n\n          expect(localOptions).to.include(options);\n\n          return BaseViewer.prototype.getModules.call(this, localOptions);\n        });\n\n        BaseViewer.call(this, options);\n      }\n\n      inherits(SpecialViewer, BaseViewer);\n\n      // when\n      var instance = new SpecialViewer(options);\n\n      // then\n      expect(instance.getModules).to.have.been.calledOnce;\n\n      expect(instance instanceof SpecialViewer).to.be.true;\n      expect(instance instanceof BaseViewer).to.be.true;\n    });\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/Modeler.copy-paste.a.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_1q7lgbo\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.11.1\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.151.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:startEvent id=\"A\" name=\"A\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Event_083mmcb_di\" bpmnElement=\"A\">\n        <dc:Bounds x=\"152\" y=\"82\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"167\" y=\"125\" width=\"7\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/Modeler.copy-paste.b.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_1q7lgbo\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.11.1\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.151.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:startEvent id=\"B\" name=\"B\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Event_083mmcb_di\" bpmnElement=\"B\">\n        <dc:Bounds x=\"102\" y=\"82\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"117\" y=\"125\" width=\"7\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/Modeler.copy-paste.complex.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:camunda=\"http://camunda.org/schema/1.0/bpmn\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_0ykgsoo\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.2.0\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.17.0\">\n  <bpmn:error id=\"Error_1\" name=\"SomeError\" errorCode=\"100\" />\n  <bpmn:collaboration id=\"Collaboration\">\n    <bpmn:participant id=\"P1\" name=\"P1\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"P2\" name=\"P2\" processRef=\"Process_2\" />\n    <bpmn:messageFlow id=\"MessageFlow\" name=\"MessageFlow\" sourceRef=\"Activity_1\" targetRef=\"Start\" />\n    <bpmn:group id=\"Group_With_Name\" categoryValueRef=\"CategoryValue_1\" />\n    <bpmn:group id=\"Group_No_Name\" />\n    <bpmn:textAnnotation id=\"Text_Annotation\">\n      <bpmn:text>Text_Annotation</bpmn:text>\n    </bpmn:textAnnotation>\n    <bpmn:association id=\"Association\" sourceRef=\"P1\" targetRef=\"Text_Annotation\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" name=\"Process_1\" isExecutable=\"true\">\n    <bpmn:startEvent id=\"Start\" name=\"Start\" camunda:initiator=\"walt\">\n      <bpmn:outgoing>Flow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Say_Hello\" name=\"Say_Hello\">\n      <bpmn:extensionElements>\n        <camunda:executionListener expression=\"foo()\" event=\"start\" />\n        <camunda:inputOutput>\n          <camunda:inputParameter name=\"name\">${ foobar }</camunda:inputParameter>\n        </camunda:inputOutput>\n      </bpmn:extensionElements>\n      <bpmn:incoming>Flow_1</bpmn:incoming>\n      <bpmn:outgoing>Flow_2</bpmn:outgoing>\n      <bpmn:dataOutputAssociation id=\"DataOutputAssociation_1\">\n        <bpmn:targetRef>DataStoreReference</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n    </bpmn:task>\n    <bpmn:endEvent id=\"End\" name=\"End\">\n      <bpmn:incoming>Flow_2</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"Flow_1\" sourceRef=\"Start\" targetRef=\"Say_Hello\" />\n    <bpmn:sequenceFlow id=\"Flow_2\" sourceRef=\"Say_Hello\" targetRef=\"End\" />\n    <bpmn:dataStoreReference id=\"DataStoreReference\" name=\"DataStoreReference\" />\n    <bpmn:boundaryEvent id=\"Say_Hello_Error\" name=\"Say_Hello_Error\" attachedToRef=\"Say_Hello\">\n      <bpmn:errorEventDefinition id=\"ErrorEventDefinition_0hmbmox\" errorRef=\"Error_1\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"Say_Hello_Escalation\" name=\"Say_Hello_Escalation\" cancelActivity=\"false\" attachedToRef=\"Say_Hello\">\n      <bpmn:escalationEventDefinition id=\"EscalationEventDefinition_1\" escalationRef=\"Escalation_1\" />\n    </bpmn:boundaryEvent>\n  </bpmn:process>\n  <bpmn:process id=\"Process_2\" name=\"Process_2\" isExecutable=\"false\">\n    <bpmn:task id=\"Activity_1\">\n      <bpmn:dataOutputAssociation id=\"DataOutputAssociation\">\n        <bpmn:targetRef>DataObjectReference</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n    </bpmn:task>\n    <bpmn:dataObjectReference id=\"DataObjectReference\" dataObjectRef=\"DataObject\" />\n    <bpmn:dataObject id=\"DataObject\" />\n    <bpmn:subProcess id=\"Collapsed_Sub\" name=\"Collapsed_Sub\">\n      <bpmn:subProcess id=\"Sub_Process_Expanded_Nested\" name=\"Sub_Process_Expanded_Nested\" default=\"FlowDefault\">\n        <bpmn:incoming>Flow_3</bpmn:incoming>\n        <bpmn:outgoing>FlowDefault</bpmn:outgoing>\n        <bpmn:outgoing>FlowConditional</bpmn:outgoing>\n        <bpmn:startEvent id=\"Event_4\">\n          <bpmn:outgoing>Flow_7</bpmn:outgoing>\n        </bpmn:startEvent>\n        <bpmn:task id=\"Activity_4\">\n          <bpmn:incoming>Flow_7</bpmn:incoming>\n          <bpmn:outgoing>Flow_8</bpmn:outgoing>\n        </bpmn:task>\n        <bpmn:sequenceFlow id=\"Flow_7\" sourceRef=\"Event_4\" targetRef=\"Activity_4\" />\n        <bpmn:endEvent id=\"Event_5\">\n          <bpmn:incoming>Flow_8</bpmn:incoming>\n        </bpmn:endEvent>\n        <bpmn:sequenceFlow id=\"Flow_8\" sourceRef=\"Activity_4\" targetRef=\"Event_5\" />\n      </bpmn:subProcess>\n      <bpmn:startEvent id=\"Event_2\">\n        <bpmn:outgoing>Flow_3</bpmn:outgoing>\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_3\" sourceRef=\"Event_2\" targetRef=\"Sub_Process_Expanded_Nested\" />\n      <bpmn:exclusiveGateway id=\"Gateway_1\">\n        <bpmn:incoming>FlowDefault</bpmn:incoming>\n        <bpmn:outgoing>Flow_4</bpmn:outgoing>\n        <bpmn:outgoing>Flow_6</bpmn:outgoing>\n      </bpmn:exclusiveGateway>\n      <bpmn:sequenceFlow id=\"FlowDefault\" name=\"FlowDefault\" sourceRef=\"Sub_Process_Expanded_Nested\" targetRef=\"Gateway_1\" />\n      <bpmn:task id=\"Activity_5\">\n        <bpmn:incoming>Flow_4</bpmn:incoming>\n        <bpmn:outgoing>Flow_5</bpmn:outgoing>\n      </bpmn:task>\n      <bpmn:sequenceFlow id=\"Flow_4\" sourceRef=\"Gateway_1\" targetRef=\"Activity_5\">\n        <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">foo()</bpmn:conditionExpression>\n      </bpmn:sequenceFlow>\n      <bpmn:endEvent id=\"Event_3\">\n        <bpmn:incoming>Flow_5</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:sequenceFlow id=\"Flow_5\" sourceRef=\"Activity_5\" targetRef=\"Event_3\" />\n      <bpmn:task id=\"Activity_2\">\n        <bpmn:incoming>Flow_6</bpmn:incoming>\n      </bpmn:task>\n      <bpmn:sequenceFlow id=\"Flow_6\" sourceRef=\"Gateway_1\" targetRef=\"Activity_2\">\n        <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">bar()</bpmn:conditionExpression>\n      </bpmn:sequenceFlow>\n      <bpmn:task id=\"Activity_6\">\n        <bpmn:incoming>FlowConditional</bpmn:incoming>\n      </bpmn:task>\n      <bpmn:sequenceFlow id=\"FlowConditional\" name=\"FlowConditional\" sourceRef=\"Sub_Process_Expanded_Nested\" targetRef=\"Activity_6\">\n        <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">waat()</bpmn:conditionExpression>\n      </bpmn:sequenceFlow>\n      <bpmn:textAnnotation id=\"TextAnnotation_2\">\n        <bpmn:text>Conditions, Default Flow and friends</bpmn:text>\n      </bpmn:textAnnotation>\n    </bpmn:subProcess>\n    <bpmn:boundaryEvent id=\"Boundary_No_Message\" name=\"Boundary_No_Message\" cancelActivity=\"false\" attachedToRef=\"Activity_1\">\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_0n2euac\" />\n    </bpmn:boundaryEvent>\n  </bpmn:process>\n  <bpmn:category id=\"Category_1\">\n    <bpmn:categoryValue id=\"CategoryValue_1\" value=\"Group_With_Name\" />\n  </bpmn:category>\n  <bpmn:escalation id=\"Escalation_1\" name=\"Escalation\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"P1_di\" bpmnElement=\"P1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"160\" y=\"170\" width=\"530\" height=\"250\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_2_di\" bpmnElement=\"Flow_2\">\n        <di:waypoint x=\"500\" y=\"307\" />\n        <di:waypoint x=\"562\" y=\"307\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1_di\" bpmnElement=\"Flow_1\">\n        <di:waypoint x=\"345\" y=\"307\" />\n        <di:waypoint x=\"400\" y=\"307\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Start_di\" bpmnElement=\"Start\">\n        <dc:Bounds x=\"309\" y=\"289\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"315\" y=\"265\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Say_Hello_di\" bpmnElement=\"Say_Hello\">\n        <dc:Bounds x=\"400\" y=\"267\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"End_di\" bpmnElement=\"End\">\n        <dc:Bounds x=\"562\" y=\"289\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"570\" y=\"332\" width=\"20\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_di\" bpmnElement=\"DataStoreReference\">\n        <dc:Bounds x=\"555\" y=\"185\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"540\" y=\"242\" width=\"83\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0r07nr0_di\" bpmnElement=\"Say_Hello_Error\">\n        <dc:Bounds x=\"442\" y=\"329\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"420\" y=\"372\" width=\"82\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Say_Hello_Escalation_di\" bpmnElement=\"Say_Hello_Escalation\">\n        <dc:Bounds x=\"422\" y=\"249\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"395\" y=\"219\" width=\"90\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"P2_di\" bpmnElement=\"P2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"160\" y=\"570\" width=\"530\" height=\"190\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1_di\" bpmnElement=\"Activity_1\">\n        <dc:Bounds x=\"290\" y=\"610\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_di\" bpmnElement=\"DataObjectReference\">\n        <dc:Bounds x=\"482\" y=\"665\" width=\"36\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Collapsed_Sub_di\" bpmnElement=\"Collapsed_Sub\">\n        <dc:Bounds x=\"560\" y=\"610\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Boundary_No_Message_di\" bpmnElement=\"Boundary_No_Message\">\n        <dc:Bounds x=\"332\" y=\"672\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"306\" y=\"715\" width=\"89\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_With_Name_di\" bpmnElement=\"Group_With_Name\">\n        <dc:Bounds x=\"270\" y=\"520\" width=\"270\" height=\"220\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"367\" y=\"527\" width=\"79\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_No_Name_di\" bpmnElement=\"Group_No_Name\">\n        <dc:Bounds x=\"720\" y=\"210\" width=\"230\" height=\"180\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"792\" y=\"217\" width=\"87\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Text_Annotation_di\" bpmnElement=\"Text_Annotation\">\n        <dc:Bounds x=\"680\" y=\"80\" width=\"100\" height=\"30\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_1_di\" bpmnElement=\"DataOutputAssociation_1\">\n        <di:waypoint x=\"499\" y=\"272\" />\n        <di:waypoint x=\"555\" y=\"233\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_di\" bpmnElement=\"DataOutputAssociation\">\n        <di:waypoint x=\"390\" y=\"663\" />\n        <di:waypoint x=\"482\" y=\"686\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Association_di\" bpmnElement=\"Association\">\n        <di:waypoint x=\"616\" y=\"170\" />\n        <di:waypoint x=\"707\" y=\"110\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"MessageFlow_di\" bpmnElement=\"MessageFlow\">\n        <di:waypoint x=\"327\" y=\"610\" />\n        <di:waypoint x=\"327\" y=\"325\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"309\" y=\"465\" width=\"68\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_0xhesl2\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_Collapsed_Sub\" bpmnElement=\"Collapsed_Sub\">\n      <bpmndi:BPMNEdge id=\"FlowConditional_di\" bpmnElement=\"FlowConditional\">\n        <di:waypoint x=\"670\" y=\"250\" />\n        <di:waypoint x=\"730\" y=\"250\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"661\" y=\"232\" width=\"79\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_6_di\" bpmnElement=\"Flow_6\">\n        <di:waypoint x=\"475\" y=\"445\" />\n        <di:waypoint x=\"475\" y=\"530\" />\n        <di:waypoint x=\"550\" y=\"530\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_5_di\" bpmnElement=\"Flow_5\">\n        <di:waypoint x=\"650\" y=\"420\" />\n        <di:waypoint x=\"702\" y=\"420\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_4_di\" bpmnElement=\"Flow_4\">\n        <di:waypoint x=\"500\" y=\"420\" />\n        <di:waypoint x=\"550\" y=\"420\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"FlowDefault_di\" bpmnElement=\"FlowDefault\">\n        <di:waypoint x=\"475\" y=\"350\" />\n        <di:waypoint x=\"475\" y=\"395\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"461\" y=\"370\" width=\"59\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_3_di\" bpmnElement=\"Flow_3\">\n        <di:waypoint x=\"198\" y=\"250\" />\n        <di:waypoint x=\"300\" y=\"250\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Sub_Process_Expanded_Nested_di\" bpmnElement=\"Sub_Process_Expanded_Nested\" isExpanded=\"true\">\n        <dc:Bounds x=\"300\" y=\"150\" width=\"370\" height=\"200\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_8_di\" bpmnElement=\"Flow_8\">\n        <di:waypoint x=\"530\" y=\"250\" />\n        <di:waypoint x=\"592\" y=\"250\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_7_di\" bpmnElement=\"Flow_7\">\n        <di:waypoint x=\"376\" y=\"250\" />\n        <di:waypoint x=\"430\" y=\"250\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Event_4_di\" bpmnElement=\"Event_4\">\n        <dc:Bounds x=\"340\" y=\"232\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_4_di\" bpmnElement=\"Activity_4\">\n        <dc:Bounds x=\"430\" y=\"210\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_5_di\" bpmnElement=\"Event_5\">\n        <dc:Bounds x=\"592\" y=\"232\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_2_di\" bpmnElement=\"Event_2\">\n        <dc:Bounds x=\"162\" y=\"232\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_1_di\" bpmnElement=\"Gateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"450\" y=\"395\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_5_di\" bpmnElement=\"Activity_5\">\n        <dc:Bounds x=\"550\" y=\"380\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_3_di\" bpmnElement=\"Event_3\">\n        <dc:Bounds x=\"702\" y=\"402\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_2_di\" bpmnElement=\"Activity_2\">\n        <dc:Bounds x=\"550\" y=\"490\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_6_di\" bpmnElement=\"Activity_6\">\n        <dc:Bounds x=\"730\" y=\"210\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_2_di\" bpmnElement=\"TextAnnotation_2\">\n        <dc:Bounds x=\"590\" y=\"50\" width=\"100.00000762939453\" height=\"55.000003814697266\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/Modeler.copy-paste.empty.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_Other\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.2.0\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.17.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\" />\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/ModelerSpec.js",
    "content": "import { expectToBeAccessible } from '@bpmn-io/a11y';\n\nimport Modeler from 'lib/Modeler';\nimport Viewer from 'lib/Viewer';\nimport NavigatedViewer from 'lib/NavigatedViewer';\n\nimport { isAny } from 'lib/util/ModelUtil';\n\nimport Clipboard from 'diagram-js/lib/features/clipboard/Clipboard';\n\nimport TestContainer from 'mocha-test-container-support';\n\nimport {\n  createCanvasEvent\n} from '../util/MockEvents';\n\nimport {\n  setBpmnJS,\n  clearBpmnJS,\n  collectTranslations,\n  enableLogging\n} from 'test/TestHelper';\n\nimport {\n  pick,\n  find\n} from 'min-dash';\n\nimport { getDi } from 'lib/util/ModelUtil';\n\n\nvar singleStart = window.__env__ && window.__env__.SINGLE_START === 'modeler';\n\n\ndescribe('Modeler', function() {\n\n  var container;\n\n  var modeler;\n\n  beforeEach(function() {\n    container = TestContainer.get(this);\n  });\n\n  function createModeler(xml) {\n\n    clearBpmnJS();\n\n    modeler = new Modeler({\n      container: container,\n    });\n\n    setBpmnJS(modeler);\n\n    enableLogging(modeler, singleStart);\n\n    return modeler.importXML(xml).then(function(result) {\n      return { error: null, warnings: result.warnings, modeler: modeler };\n    }).catch(function(err) {\n      return { error: err, warnings: err.warnings, modeler: modeler };\n    });\n  }\n\n\n  (singleStart ? it.only : it)('should import simple process', function() {\n    var xml = require('../fixtures/bpmn/simple.bpmn');\n    return createModeler(xml).then(function(result) {\n\n      expect(result.error).not.to.exist;\n    });\n  });\n\n\n  it('should import collaboration', function() {\n    var xml = require('../fixtures/bpmn/collaboration-message-flows.bpmn');\n    return createModeler(xml).then(function(result) {\n\n      expect(result.error).not.to.exist;\n    });\n  });\n\n\n  it('should import nested lanes', function() {\n    var xml = require('./features/modeling/lanes/lanes.bpmn');\n    return createModeler(xml).then(function(result) {\n\n      expect(result.error).not.to.exist;\n    });\n  });\n\n\n  it('should import vertical collaboration', function() {\n    var xml = require('../fixtures/bpmn/collaboration-vertical.bpmn');\n    return createModeler(xml).then(function(result) {\n\n      expect(result.error).not.to.exist;\n    });\n  });\n\n\n  it('should import ioSpecification', function() {\n    var xml = require('./features/modeling/input-output/DataInputOutput.bpmn');\n    return createModeler(xml).then(function(result) {\n\n      expect(result.error).not.to.exist;\n    });\n  });\n\n\n  it.skip('should import complex', function() {\n    var xml = require('../fixtures/bpmn/complex.bpmn');\n    return createModeler(xml).then(function(result) {\n\n      expect(result.error).not.to.exist;\n    });\n  });\n\n\n  it('should not import empty definitions', function() {\n    var xml = require('../fixtures/bpmn/empty-definitions.bpmn');\n\n    // given\n    return createModeler(xml).then(function(result) {\n\n      var modeler = result.modeler;\n\n      // when\n      return modeler.importXML(xml);\n    }).catch(function(err) {\n\n      // then\n      expect(err.message).to.equal('no diagram to display');\n    });\n  });\n\n\n  it('should re-import simple process', function() {\n\n    var xml = require('../fixtures/bpmn/simple.bpmn');\n\n    // given\n    return createModeler(xml).then(function(result) {\n\n      var modeler = result.modeler;\n\n      // when\n      // mimic re-import of same diagram\n      return modeler.importXML(xml);\n    }).then(function(result) {\n\n      var warnings = result.warnings;\n\n      // then\n      expect(warnings).to.be.empty;\n    });\n  });\n\n\n  it('should switch between diagrams', function() {\n\n    var multipleXML = require('../fixtures/bpmn/multiple-diagrams.bpmn');\n\n    // given\n    return createModeler(multipleXML).then(function(result) {\n\n      var modeler = result.modeler;\n      var err = result.error;\n\n      if (err) {\n        throw err;\n      }\n\n      // when\n      return modeler.open('BpmnDiagram_2');\n    }).then(function(result) {\n\n      var warnings = result.warnings;\n\n      // then\n      expect(warnings).to.be.empty;\n    });\n  });\n\n\n  !collectTranslations && describe('translate support', function() {\n\n    var xml = require('../fixtures/bpmn/simple.bpmn');\n\n    it('should allow translation of multi-lingual strings', function() {\n\n      return createModeler(xml).then(function(result) {\n\n        var modeler = result.modeler;\n        var err = result.error;\n\n        if (err) {\n          throw err;\n        }\n\n        // given\n        var translate = modeler.get('translate');\n\n        // assume\n        expect(translate).to.exist;\n\n        // when\n        var interpolatedString = translate('HELLO {you}!', { you: 'WALT' });\n\n        // then\n        expect(interpolatedString).to.eql('HELLO WALT!');\n      });\n\n    });\n\n  });\n\n\n  it('should include Outline module by default', function() {\n\n    // given\n    var modeler = new Modeler();\n\n    // when\n    var outline = modeler.get('outline', false);\n\n    // then\n    expect(outline).to.exist;\n  });\n\n\n  describe('overlay support', function() {\n\n    it('should allow to add overlays', function() {\n\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n\n      return createModeler(xml).then(function(result) {\n\n        var modeler = result.modeler;\n        var err = result.error;\n\n        if (err) {\n          throw err;\n        }\n\n        // given\n        var overlays = modeler.get('overlays'),\n            elementRegistry = modeler.get('elementRegistry');\n\n        // assume\n        expect(overlays).to.exist;\n        expect(elementRegistry).to.exist;\n\n\n        // when\n        overlays.add('SubProcess_1', 'badge', {\n          position: {\n            bottom: 0,\n            right: 0\n          },\n          html: '<div style=\"max-width: 50px\">YUP GREAT STUFF!</div>'\n        });\n\n        overlays.add('StartEvent_1', 'badge', {\n          position: {\n            top: 0,\n            left: 0\n          },\n          html: '<div style=\"max-width: 50px\">YUP GREAT STUFF!</div>'\n        });\n\n        // then\n        expect(overlays.get({ element: 'SubProcess_1', type: 'badge' })).to.have.length(1);\n        expect(overlays.get({ element: 'StartEvent_1', type: 'badge' })).to.have.length(1);\n      });\n\n    });\n\n  });\n\n\n  describe('editor actions support', function() {\n\n    it('should ship all actions', function() {\n\n      // given\n      var expectedActions = [\n        'undo',\n        'redo',\n        'copy',\n        'duplicate',\n        'paste',\n        'cut',\n        'stepZoom',\n        'zoom',\n        'removeSelection',\n        'moveCanvas',\n        'moveSelection',\n        'selectElements',\n        'spaceTool',\n        'lassoTool',\n        'handTool',\n        'globalConnectTool',\n        'distributeElements',\n        'alignElements',\n        'setColor',\n        'directEditing',\n        'find',\n        'moveToOrigin',\n        'replaceElement'\n      ];\n\n      var modeler = new Modeler();\n\n      // when\n      var editorActions = modeler.get('editorActions');\n\n      // then\n      var actualActions = editorActions.getActions();\n\n      expect(actualActions).to.eql(expectedActions);\n    });\n\n  });\n\n\n  describe('bendpoint editing support', function() {\n\n    it('should allow to edit bendpoints', function() {\n\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n\n      return createModeler(xml).then(function(result) {\n\n        var modeler = result.modeler;\n        var err = result.error;\n\n        if (err) {\n          throw err;\n        }\n\n        // given\n        var bendpointMove = modeler.get('bendpointMove'),\n            dragging = modeler.get('dragging'),\n            elementRegistry = modeler.get('elementRegistry');\n\n        // assume\n        expect(bendpointMove).to.exist;\n\n        // when\n        bendpointMove.start(\n          createCanvasEvent({ x: 0, y: 0 }),\n          elementRegistry.get('SequenceFlow_1'),\n          1\n        );\n        dragging.move(createCanvasEvent({ x: 200, y: 200 }));\n      });\n\n    });\n\n  });\n\n\n  describe('color support', function() {\n\n    it('should allow color changes', function() {\n\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n\n      return createModeler(xml).then(function(result) {\n\n        var modeler = result.modeler;\n\n        // given\n        var modeling = modeler.get('modeling'),\n            elementRegistry = modeler.get('elementRegistry'),\n            eventShape = elementRegistry.get('StartEvent_2');\n\n        // when\n        // set color for StartEvent_2\n        modeling.setColor(eventShape, {\n          fill: 'FUCHSIA',\n          stroke: 'YELLOW'\n        });\n\n        // test saving process to get XML\n        return modeler.saveXML({ format: true });\n      }).then(function(result) {\n        var xml = result.xml;\n\n        expect(xml).not.to.contain('di=\"[object Object]\"');\n      });\n    });\n  });\n\n\n  describe('configuration', function() {\n\n    // given\n    var xml = require('../fixtures/bpmn/simple.bpmn');\n\n    it('should configure Canvas', function() {\n\n      // given\n      var modeler = new Modeler({\n        container: container,\n        canvas: {\n          deferUpdate: true\n        }\n      });\n\n      // when\n      return modeler.importXML(xml).then(function() {\n\n        var canvasConfig = modeler.get('config.canvas');\n\n        // then\n        expect(canvasConfig.deferUpdate).to.be.true;\n      });\n    });\n  });\n\n\n  describe('ids', function() {\n\n    it('should provide ids with moddle', function() {\n\n      // given\n      var modeler = new Modeler({ container: container });\n\n      // when\n      var moddle = modeler.get('moddle');\n\n      // then\n      expect(moddle.ids).to.exist;\n    });\n\n\n    it('should populate ids on import', function() {\n\n      // given\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n\n      var modeler = new Modeler({ container: container });\n\n      var moddle = modeler.get('moddle');\n      var elementRegistry = modeler.get('elementRegistry');\n\n      // when\n      return modeler.importXML(xml).then(function() {\n\n        var subProcess = elementRegistry.get('SubProcess_1').businessObject;\n        var bpmnEdge = getDi(elementRegistry.get('SequenceFlow_3'));\n\n        // then\n        expect(moddle.ids.assigned('SubProcess_1')).to.eql(subProcess);\n        expect(moddle.ids.assigned('BPMNEdge_SequenceFlow_3')).to.eql(bpmnEdge);\n      });\n\n    });\n\n\n    it('should clear ids before re-import', function() {\n\n      // given\n      var someXML = require('../fixtures/bpmn/simple.bpmn'),\n          otherXML = require('../fixtures/bpmn/basic.bpmn');\n\n      var modeler = new Modeler({ container: container });\n\n      var moddle = modeler.get('moddle');\n      var elementRegistry = modeler.get('elementRegistry');\n\n      // when\n      return modeler.importXML(someXML).then(function() {\n\n        return modeler.importXML(otherXML);\n      }).then(function() {\n\n        var task = elementRegistry.get('Task_1').businessObject;\n\n        // then\n        // not in other.bpmn\n        expect(moddle.ids.assigned('SubProcess_1')).to.be.false;\n\n        // in other.bpmn\n        expect(moddle.ids.assigned('Task_1')).to.eql(task);\n      });\n    });\n  });\n\n\n  it('should handle errors', function() {\n\n    var xml = 'invalid stuff';\n\n    var modeler = new Modeler({ container: container });\n\n    return modeler.importXML(xml).catch(function(err) {\n\n      expect(err).to.exist;\n    });\n  });\n\n\n  it('should error when accessing <di> from businessObject', function() {\n\n    var xml = require('../fixtures/bpmn/simple.bpmn');\n\n    var modeler = new Modeler({ container: container });\n\n    return modeler.importXML(xml).then(function() {\n\n      // given\n      var elementRegistry = modeler.get('elementRegistry'),\n          shape = elementRegistry.get('Task_1');\n\n      // then\n      expect(shape.di).to.exist;\n      expect(function() {\n        shape.businessObject.di;\n      }).to.throw(/The di is available through the diagram element only./);\n    });\n  });\n\n\n  it('should create new diagram', function() {\n    var modeler = new Modeler({ container: container });\n    return modeler.createDiagram();\n  });\n\n\n  describe('dependency injection', function() {\n\n    it('should provide self as <bpmnjs>', function() {\n\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n\n      return createModeler(xml).then(function(result) {\n\n        var modeler = result.modeler;\n        var err = result.error;\n\n        if (err) {\n          throw err;\n        }\n\n        expect(modeler.get('bpmnjs')).to.equal(modeler);\n      });\n    });\n\n\n    it('should allow Diagram#get before import', function() {\n\n      // when\n      var modeler = new Modeler({ container: container });\n\n      // then\n      var eventBus = modeler.get('eventBus');\n\n      expect(eventBus).to.exist;\n    });\n\n\n    it('should keep references to services across re-import', function() {\n\n      // given\n      var someXML = require('../fixtures/bpmn/simple.bpmn'),\n          otherXML = require('../fixtures/bpmn/basic.bpmn');\n\n      var modeler = new Modeler({ container: container });\n\n      var eventBus = modeler.get('eventBus'),\n          canvas = modeler.get('canvas');\n\n      // when\n      return modeler.importXML(someXML).then(function() {\n\n        // then\n        expect(modeler.get('canvas')).to.equal(canvas);\n        expect(modeler.get('eventBus')).to.equal(eventBus);\n\n        return modeler.importXML(otherXML);\n      }).then(function() {\n\n        // then\n        expect(modeler.get('canvas')).to.equal(canvas);\n        expect(modeler.get('eventBus')).to.equal(eventBus);\n      });\n\n    });\n\n\n    it('should inject mandatory modules', function() {\n\n      // given\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n\n      // when\n      return createModeler(xml).then(function(result) {\n\n        var modeler = result.modeler;\n        var err = result.error;\n\n        // then\n\n        if (err) {\n          throw err;\n        }\n\n        expect(modeler.get('alignElements')).to.exist;\n        expect(modeler.get('autoPlace')).to.exist;\n        expect(modeler.get('bpmnAutoResize')).to.exist;\n        expect(modeler.get('autoScroll')).to.exist;\n        expect(modeler.get('bendpoints')).to.exist;\n        expect(modeler.get('bpmnCopyPaste')).to.exist;\n        expect(modeler.get('bpmnSearch')).to.exist;\n        expect(modeler.get('contextPad')).to.exist;\n        expect(modeler.get('copyPaste')).to.exist;\n        expect(modeler.get('alignElements')).to.exist;\n        expect(modeler.get('distributeElements')).to.exist;\n        expect(modeler.get('editorActions')).to.exist;\n        expect(modeler.get('keyboard')).to.exist;\n        expect(modeler.get('keyboardMoveSelection')).to.exist;\n        expect(modeler.get('labelEditingProvider')).to.exist;\n        expect(modeler.get('labelLink')).to.exist;\n        expect(modeler.get('modeling')).to.exist;\n        expect(modeler.get('move')).to.exist;\n        expect(modeler.get('paletteProvider')).to.exist;\n        expect(modeler.get('resize')).to.exist;\n        expect(modeler.get('snapping')).to.exist;\n      });\n\n    });\n\n  });\n\n\n  describe('copy and paste', function() {\n\n    var m1, m2;\n\n    afterEach(function() {\n      if (m1) {\n        m1.destroy();\n      }\n\n      if (m2) {\n        m2.destroy();\n      }\n    });\n\n    function isNamedA(element) {\n      return element.type !== 'label' && element.businessObject.name === 'A';\n    }\n\n\n    it('should share Clipboard', function() {\n\n      var aXML = require('./Modeler.copy-paste.a.bpmn');\n      var bXML = require('./Modeler.copy-paste.b.bpmn');\n\n      var clipboardModule = {\n        'clipboard': [ 'value', new Clipboard() ]\n      };\n\n      m2 = new Modeler({\n        container: container,\n        additionalModules: [\n          clipboardModule\n        ]\n      });\n\n      m1 = new Modeler({\n        container: container,\n        additionalModules: [\n          clipboardModule\n        ]\n      });\n\n      return Promise.all([\n        m1.importXML(aXML),\n        m2.importXML(bXML)\n      ]).then(function() {\n\n        // given\n        // copy element <A> from m1\n        m1.invoke(function(selection, elementRegistry, editorActions) {\n          selection.select(elementRegistry.get('A'));\n\n          editorActions.trigger('copy');\n        });\n\n        // TODO(nikku): needed for our canvas utilities to work\n        setBpmnJS(m2);\n\n        m2.invoke(function(dragging, editorActions, elementRegistry) {\n\n          var processElement = elementRegistry.get('Process_1');\n\n          // when\n          // paste element <A> to m2, first try\n          editorActions.trigger('paste');\n          dragging.move(createCanvasEvent({ x: 150, y: 150 }));\n          dragging.move(createCanvasEvent({ x: 170, y: 150 }));\n          dragging.hover({ element: processElement });\n\n          dragging.end();\n\n          // then\n          expect(elementRegistry.get('A')).to.exist;\n          expect(elementRegistry.filter(isNamedA)).to.have.lengthOf(1);\n\n          // but when\n          // paste element <A> to m2, second try\n          editorActions.trigger('paste');\n          dragging.move(createCanvasEvent({ x: 150, y: 150 }));\n          dragging.move(createCanvasEvent({ x: 300, y: 150 }));\n          dragging.hover({ element: processElement });\n\n          dragging.end();\n\n          // then\n          expect(elementRegistry.filter(isNamedA)).to.have.lengthOf(2);\n        });\n\n      });\n\n    });\n\n\n    it('should copy + paste via serialized tree', function() {\n\n      this.timeout(3000);\n\n      var aXML = require('./Modeler.copy-paste.complex.bpmn');\n      var bXML = require('./Modeler.copy-paste.empty.bpmn');\n\n      m2 = new Modeler({\n        container: container\n      });\n\n      m1 = new Modeler({\n        container: container\n      });\n\n      return Promise.all([\n        m1.importXML(aXML),\n        m2.importXML(bXML)\n      ]).then(function() {\n\n        // given\n        // copy all from m1\n        var serializedTree = m1.invoke(function(clipboard, editorActions) {\n          editorActions.trigger('selectElements');\n\n          editorActions.trigger('copy');\n\n          return JSON.stringify(clipboard.get());\n        });\n\n        // assume\n        expect(serializedTree).to.exist;\n\n        // TODO(nikku): needed for our canvas utilities to work\n        setBpmnJS(m2);\n\n        m2.invoke(function(\n            moddle, clipboard, dragging,\n            editorActions, elementRegistry,\n            bpmnjs) {\n\n          var definitions = bpmnjs.getDefinitions();\n          var processElement = elementRegistry.get('Process_1');\n\n          // when\n          // deserialize tree\n          var tree = JSON.parse(serializedTree, createReviver(moddle));\n\n          // set to clipboard\n          clipboard.set(tree);\n\n          // paste all to m2\n          editorActions.trigger('paste');\n          dragging.move(createCanvasEvent({ x: 150, y: 150 }));\n          dragging.move(createCanvasEvent({ x: 170, y: 150 }));\n          dragging.hover({ element: processElement });\n\n          dragging.end();\n\n          // then\n          // elements exist with original IDs\n          var expectedIds = [\n            'P1',\n            'P2',\n            'DataStoreReference',\n            'DataObjectReference',\n            'DataOutputAssociation',\n            'Say_Hello_Error',\n            'Group_No_Name',\n            'Group_With_Name',\n            'Collapsed_Sub',\n            'Sub_Process_Expanded_Nested',\n            'FlowDefault',\n            'FlowConditional',\n            'Text_Annotation',\n            'Association'\n          ];\n\n          expectedIds.forEach(function(id) {\n            expect(elementRegistry.get(id), 'element <' + id + '>').to.exist;\n          });\n\n          // global elements exist\n          var expectedGlobals = [\n            [ 'Error_1', { name: 'SomeError', errorCode: '100' } ],\n            [ 'Escalation_1', { name: 'Escalation' } ],\n            [ 'Category_1', { } ]\n          ];\n\n          var globals = [\n            'bpmn:Error',\n            'bpmn:Category',\n            'bpmn:Escalation',\n            'bpmn:Signal',\n            'bpmn:Message'\n          ];\n\n          var globalElements = definitions.get('rootElements').filter(function(element) {\n            return isAny(element, globals);\n          });\n\n          // expect <expectedGlobals>\n          expect(globalElements).to.have.length(expectedGlobals.length);\n\n          expectedGlobals.forEach(function(expected) {\n            var id = expected[0];\n            var attrs = expected[1];\n\n            var actualGlobal = find(globalElements, function(el) {\n              return el.id === id;\n            });\n\n            expect(actualGlobal, 'global <' + id + '>').to.exist;\n\n            var actualAttrs = pick(actualGlobal, Object.keys(attrs));\n\n            expect(actualAttrs, 'global <' + id + '> attrs').to.eql(attrs);\n          });\n\n        });\n\n      });\n\n    });\n\n\n    it.skip('should copy + delete + paste');\n\n  });\n\n\n  describe('drill down', function() {\n\n    function verifyDrilldown() {\n\n      var drilldown = container.querySelector('.bjs-drilldown');\n      var breadcrumbs = container.querySelector('.bjs-breadcrumbs');\n      var djsContainer = container.querySelector('.djs-container');\n\n      // assume\n      expect(drilldown).to.exist;\n      expect(breadcrumbs).to.exist;\n      expect(djsContainer.classList.contains('bjs-breadcrumbs-shown')).to.be.false;\n\n      // when\n      drilldown.click();\n\n      // then\n      expect(djsContainer.classList.contains('bjs-breadcrumbs-shown')).to.be.true;\n    }\n\n    it('should allow drill down into collapsed sub-process', function() {\n      var xml = require('../fixtures/bpmn/collapsed-sub-process.bpmn');\n      return createModeler(xml).then(verifyDrilldown);\n    });\n\n\n    it('should allow drill down into collapsed sub-process after viewer.open', function() {\n      var xml = require('../fixtures/bpmn/collapsed-sub-process.bpmn');\n      return createModeler(xml)\n        .then(function() {\n          return modeler.open('rootProcess_diagram');\n        })\n        .then(verifyDrilldown);\n    });\n\n\n    it('should allow drill down into legacy collapsed sub-process', function() {\n      var xml = require('../fixtures/bpmn/collapsed-sub-process-legacy.bpmn');\n\n      return createModeler(xml).then(verifyDrilldown);\n    });\n\n\n    it('should allow creation of groups in collapsed subprocesses', function() {\n      var xml = require('../fixtures/bpmn/collapsed-sub-process.bpmn');\n\n      return createModeler(xml).then(function() {\n\n        // given\n        var elementRegistry = modeler.get('elementRegistry'),\n            elementFactory = modeler.get('elementFactory'),\n            modeling = modeler.get('modeling');\n\n        var collapsedProcessPlane = elementRegistry.get('collapsedProcess_plane'),\n            groupElement = elementFactory.createShape({ type: 'bpmn:Group' });\n\n        // when\n        var group = modeling.createShape(groupElement, { x: 100, y: 100 }, collapsedProcessPlane);\n\n        // then\n        expect(group).to.exist;\n        expect(group.parent).to.equal(collapsedProcessPlane);\n\n      });\n\n    });\n\n  });\n\n\n  it('should expose Viewer and NavigatedViewer', function() {\n    expect(Modeler.Viewer).to.equal(Viewer);\n    expect(Modeler.NavigatedViewer).to.equal(NavigatedViewer);\n  });\n\n\n  describe('accessibility', function() {\n\n    it('should report no issues', async function() {\n\n      // given\n      const xml = require('../fixtures/bpmn/simple.bpmn');\n      await createModeler(xml);\n\n      // then\n      await expectToBeAccessible(container);\n    });\n\n  });\n\n});\n\n\n// helpers //////////////\n\n\n/**\n * A factory function that returns a reviver to be\n * used with JSON#parse to reinstantiate moddle instances.\n *\n * @param { Moddle } moddle\n *\n * @return { (key: string, object: any) => any|null }\n */\nfunction createReviver(moddle) {\n\n  var elCache = {};\n\n  /**\n   * The actual reviewer that creates model instances\n   * for elements with a $type attribute.\n   *\n   * Elements with ids will be re-used, if already\n   * created.\n   *\n   * @param {string} key\n   * @param {any} object\n   *\n   * @return {any|null} actual element\n   */\n  return function(key, object) {\n\n    if (typeof object === 'object' && typeof object.$type === 'string') {\n\n      var objectId = object.id;\n\n      if (objectId && elCache[objectId]) {\n        return elCache[objectId];\n      }\n\n      var type = object.$type;\n      var attrs = Object.assign({}, object);\n\n      delete attrs.$type;\n\n      var newEl = moddle.create(type, attrs);\n\n      if (objectId) {\n        elCache[objectId] = newEl;\n      }\n\n      return newEl;\n    }\n\n    return object;\n  };\n}"
  },
  {
    "path": "test/spec/NavigatedViewerSpec.js",
    "content": "import { expectToBeAccessible } from '@bpmn-io/a11y';\n\nimport NavigatedViewer from 'lib/NavigatedViewer';\n\nimport EditorActionsModule from 'lib/features/editor-actions';\n\nimport TestContainer from 'mocha-test-container-support';\n\nimport {\n  createViewer\n} from 'test/TestHelper';\n\nvar singleStart = window.__env__ && window.__env__.SINGLE_START === 'navigated-viewer';\n\n\ndescribe('NavigatedViewer', function() {\n\n  var container;\n\n  beforeEach(function() {\n    container = TestContainer.get(this);\n  });\n\n\n  (singleStart ? it.only : it)('should import simple process', function() {\n    var xml = require('../fixtures/bpmn/simple.bpmn');\n    return createViewer(container, NavigatedViewer, xml).then(function(result) {\n\n      expect(result.error).not.to.exist;\n    });\n  });\n\n\n  describe('editor actions support', function() {\n\n    it('should not ship per default', function() {\n\n      // given\n      var navigatedViewer = new NavigatedViewer();\n\n      // when\n      var editorActions = navigatedViewer.get('editorActions', false);\n\n      // then\n      expect(editorActions).not.to.exist;\n    });\n\n\n    it('should ship non-modeling actions if included', function() {\n\n      // given\n      var expectedActions = [\n        'stepZoom',\n        'zoom',\n        'moveCanvas',\n        'selectElements'\n      ];\n\n      var navigatedViewer = new NavigatedViewer({\n        additionalModules: [\n          EditorActionsModule\n        ]\n      });\n\n      // when\n      var editorActions = navigatedViewer.get('editorActions');\n\n      // then\n      var actualActions = editorActions.getActions();\n\n      expect(actualActions).to.eql(expectedActions);\n    });\n  });\n\n\n  describe('navigation features', function() {\n\n    var xml = require('../fixtures/bpmn/simple.bpmn');\n\n    it('should include zoomScroll', function() {\n\n      return createViewer(container, NavigatedViewer, xml).then(function(result) {\n\n        var viewer = result.viewer;\n        var err = result.error;\n\n        expect(err).not.to.exist;\n        expect(viewer.get('zoomScroll')).to.exist;\n      });\n    });\n\n\n    it('should include moveCanvas', function() {\n      return createViewer(container, NavigatedViewer, xml).then(function(result) {\n\n        var viewer = result.viewer;\n        var err = result.error;\n\n        expect(err).not.to.exist;\n        expect(viewer.get('moveCanvas')).to.exist;\n      });\n    });\n  });\n\n\n  describe('accessibility', function() {\n\n    it('should report no issues', async function() {\n\n      // given\n      const xml = require('../fixtures/bpmn/simple.bpmn');\n      await createViewer(container, NavigatedViewer, xml);\n\n      // then\n      await expectToBeAccessible(container);\n    });\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/ViewerSpec.js",
    "content": "import { expectToBeAccessible } from '@bpmn-io/a11y';\n\nimport {\n  query as domQuery\n} from 'min-dom';\n\nimport TestContainer from 'mocha-test-container-support';\n\nimport Diagram from 'diagram-js/lib/Diagram';\n\nimport ViewerDefaultExport from '../../';\n\nimport Viewer from 'lib/Viewer';\n\nimport inherits from 'inherits-browser';\n\nimport {\n  createViewer\n} from 'test/TestHelper';\n\nimport { getDi } from 'lib/util/ModelUtil';\n\nvar singleStart = window.__env__ && window.__env__.SINGLE_START === 'viewer';\n\n\ndescribe('Viewer', function() {\n\n  var container;\n\n  beforeEach(function() {\n    container = TestContainer.get(this);\n  });\n\n\n  (singleStart ? it.only : it)('should import simple process', function() {\n    var xml = require('../fixtures/bpmn/simple.bpmn');\n\n    // when\n    return createViewer(container, Viewer, xml).then(function(result) {\n\n      var err = result.error;\n      var warnings = result.warnings;\n      var viewer = result.viewer;\n\n      // then\n      expect(err).not.to.exist;\n      expect(warnings).to.be.empty;\n\n      var definitions = viewer.getDefinitions();\n\n      expect(definitions).to.exist;\n      expect(definitions).to.eql(viewer._definitions);\n    });\n  });\n\n\n  it('should re-import simple process', function() {\n\n    var xml = require('../fixtures/bpmn/simple.bpmn');\n\n    // given\n    return createViewer(container, Viewer, xml).then(function(result) {\n\n      var viewer = result.viewer;\n\n      // when\n      // mimic re-import of same diagram\n      return viewer.importXML(xml).then(function(result) {\n\n        // then\n        expect(result.warnings).to.be.empty;\n      });\n\n    });\n  });\n\n\n  it('should be instance of Diagram', function() {\n\n    // when\n    var viewer = new Viewer({ container: container });\n\n    // then\n    expect(viewer).to.be.instanceof(Diagram);\n  });\n\n\n  it('should not include Outline module by default', function() {\n\n    // given\n    var viewer = new Viewer();\n\n    // when\n    var outline = viewer.get('outline', false);\n\n    // then\n    expect(outline).not.to.exist;\n  });\n\n\n  describe('overlay support', function() {\n\n    it('should allow to add overlays', function() {\n\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n\n      return createViewer(container, Viewer, xml).then(function(result) {\n\n        var err = result.error;\n        var viewer = result.viewer;\n\n        expect(err).not.to.exist;\n\n        // when\n        var overlays = viewer.get('overlays'),\n            elementRegistry = viewer.get('elementRegistry');\n\n        // then\n        expect(overlays).to.exist;\n        expect(elementRegistry).to.exist;\n\n        // when\n        overlays.add('SubProcess_1', {\n          position: {\n            bottom: 0,\n            right: 0\n          },\n          html: '<div style=\"max-width: 50px\">YUP GREAT STUFF!</div>'\n        });\n\n        // then\n        expect(overlays.get({ element: 'SubProcess_1' }).length).to.equal(1);\n      });\n\n    });\n\n  });\n\n\n  describe('editor actions support', function() {\n\n    it('should not ship per default', function() {\n\n      // given\n      var viewer = new Viewer();\n\n      // when\n      var editorActions = viewer.get('editorActions', false);\n\n      // then\n      expect(editorActions).not.to.exist;\n    });\n\n  });\n\n\n  describe('error handling', function() {\n\n    function expectMessage(e, expectedMessage) {\n\n      expect(e).to.exist;\n\n      if (expectedMessage instanceof RegExp) {\n        expect(e.message).to.match(expectedMessage);\n      } else {\n        expect(e.message).to.equal(expectedMessage);\n      }\n    }\n\n    function expectWarnings(warnings, expected) {\n\n      expect(warnings.length).to.equal(expected.length);\n\n      warnings.forEach(function(w, idx) {\n        expectMessage(w, expected[idx]);\n      });\n    }\n\n\n    it('should handle non-bpmn input', function() {\n\n      var xml = 'invalid stuff';\n\n      return createViewer(container, Viewer, xml).then(function(result) {\n\n        var err = result.error;\n\n        expect(err).to.exist;\n\n        expectMessage(err, /missing start tag/);\n      });\n    });\n\n\n    it('should handle invalid BPMNPlane#bpmnElement', function() {\n\n      var xml = require('../fixtures/bpmn/error/di-plane-no-bpmn-element.bpmn');\n\n      // when\n      return createViewer(container, Viewer, xml).then(function(result) {\n\n        var err = result.error;\n        var warnings = result.warnings;\n\n        // then\n        expect(err).not.to.exist;\n\n        expectWarnings(warnings, [\n          'unresolved reference <Collaboration_2>',\n          'no bpmnElement referenced in <bpmndi:BPMNPlane id=\"BPMNPlane_1\" />',\n          'correcting missing bpmnElement ' +\n            'on <bpmndi:BPMNPlane id=\"BPMNPlane_1\" /> ' +\n            'to <bpmn:Process id=\"Process_1\" />'\n        ]);\n      });\n    });\n\n\n    it('should handle invalid namespaced element', function() {\n\n      var xml = require('../fixtures/bpmn/error/categoryValue.bpmn');\n\n      // when\n      return createViewer(container, Viewer, xml).then(function(result) {\n\n        var err = result.error;\n        var warnings = result.warnings;\n\n        // then\n        expect(err).not.to.exist;\n\n        expectWarnings(warnings, [\n          /unparsable content <categoryValue> detected/,\n          'unresolved reference <sid-afd7e63e-916e-4bd0-a9f0-98cbff749193>'\n        ]);\n      });\n    });\n\n\n    it('should handle missing namespace', function() {\n\n      var xml = require('../fixtures/bpmn/error/missing-namespace.bpmn');\n\n      // when\n      return createViewer(container, Viewer, xml).then(function(result) {\n\n        var err = result.error;\n        var warnings = result.warnings;\n\n        // then\n        expect(err).to.exist;\n        expect(err.message).to.eql('failed to parse document as <bpmn:Definitions>');\n\n        expect(warnings).to.have.length(1);\n        expect(warnings[0].message).to.match(/unparsable content <definitions> detected/);\n      });\n    });\n\n\n    it('should handle duplicate ids', function() {\n\n      var xml = require('../fixtures/bpmn/error/duplicate-ids.bpmn');\n\n      // when\n      return createViewer(container, Viewer, xml).then(function(result) {\n\n        var err = result.error;\n        var warnings = result.warnings;\n\n        // then\n        expect(err).not.to.exist;\n\n        expectWarnings(warnings, [\n          /duplicate ID <test>/\n        ]);\n      });\n    });\n\n\n    it('should throw error due to missing diagram', function() {\n\n      var xml = require('../fixtures/bpmn/empty-definitions.bpmn');\n\n      // when\n      return createViewer(container, Viewer, xml).then(function(result) {\n\n        var err = result.error;\n\n        // then\n        expect(err.message).to.eql('no diagram to display');\n      });\n    });\n\n\n    it('should handle missing process/collaboration', function() {\n\n      var xml = require('../fixtures/bpmn/error/no-process-collaboration.bpmn');\n\n      // when\n      return createViewer(container, Viewer, xml).then(function(result) {\n\n        var err = result.error;\n\n        // then\n        expect(err.message).to.eql('no process or collaboration to display');\n      });\n    });\n\n\n    it('should error when accessing <di> from businessObject', function() {\n\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n\n      return createViewer(container, Viewer, xml).then(function(result) {\n\n        // given\n        var viewer = result.viewer,\n            elementRegistry = viewer.get('elementRegistry'),\n            shape = elementRegistry.get('Task_1');\n\n        // then\n        expect(shape.di).to.exist;\n\n        expect(function() {\n          shape.businessObject.di;\n        }).to.throw(/The di is available through the diagram element only./);\n      });\n    });\n\n  });\n\n\n  describe('dependency injection', function() {\n\n    it('should provide self as <bpmnjs>', function() {\n\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n\n      return createViewer(container, Viewer, xml).then(function(result) {\n\n        var viewer = result.viewer;\n        var err = result.error;\n\n        expect(viewer.get('bpmnjs')).to.equal(viewer);\n        expect(err).not.to.exist;\n      });\n    });\n\n\n    it('should allow Diagram#get before import', function() {\n\n      // when\n      var viewer = new Viewer({ container: container });\n\n      // then\n      var eventBus = viewer.get('eventBus');\n\n      expect(eventBus).to.exist;\n    });\n\n\n    it('should keep references to services across re-import', function() {\n\n      // given\n      var someXML = require('../fixtures/bpmn/simple.bpmn'),\n          otherXML = require('../fixtures/bpmn/basic.bpmn');\n\n      var viewer = new Viewer({ container: container });\n\n      var eventBus = viewer.get('eventBus'),\n          canvas = viewer.get('canvas');\n\n      // when\n      return viewer.importXML(someXML).then(function() {\n\n        // then\n        expect(viewer.get('canvas')).to.equal(canvas);\n        expect(viewer.get('eventBus')).to.equal(eventBus);\n\n        return viewer.importXML(otherXML);\n      }).then(function() {\n\n        // then\n        expect(viewer.get('canvas')).to.equal(canvas);\n        expect(viewer.get('eventBus')).to.equal(eventBus);\n      });\n    });\n\n  });\n\n\n  describe('drill down', function() {\n\n    function verifyDrilldown(xml) {\n\n      return createViewer(container, Viewer, xml).then(function() {\n        var drilldown = domQuery('.bjs-drilldown', container);\n        var breadcrumbs = domQuery('.bjs-breadcrumbs', container);\n        var djsContainer = domQuery('.djs-container', container);\n\n        // assume\n        expect(drilldown).to.exist;\n        expect(breadcrumbs).to.exist;\n        expect(djsContainer.classList.contains('bjs-breadcrumbs-shown')).to.be.false;\n\n        // when\n        drilldown.click();\n\n        // then\n        expect(djsContainer.classList.contains('bjs-breadcrumbs-shown')).to.be.true;\n      });\n\n    }\n\n    it('should allow drill down into collapsed sub-process', function() {\n      var xml = require('../fixtures/bpmn/collapsed-sub-process.bpmn');\n\n      return verifyDrilldown(xml);\n    });\n\n\n    it('should allow drill down into legacy collapsed sub-process', function() {\n      var xml = require('../fixtures/bpmn/collapsed-sub-process-legacy.bpmn');\n\n      return verifyDrilldown(xml);\n    });\n\n\n    it('should allow drill down into multi-di collapsed sub-process', function() {\n      var xml = require('../fixtures/bpmn/multiple-nested-processes.bpmn');\n\n      return verifyDrilldown(xml);\n    });\n\n  });\n\n\n  describe('creation', function() {\n\n    var testModules = [\n      { logger: [ 'type', function() { this.called = true; } ] }\n    ];\n\n    // given\n    var xml = require('../fixtures/bpmn/simple.bpmn');\n\n    var viewer;\n\n    afterEach(function() {\n      viewer.destroy();\n    });\n\n    it('should override default modules', function() {\n\n      // given\n      viewer = new Viewer({ container: container, modules: testModules });\n\n      // when\n      return viewer.importXML(xml).catch(function(err) {\n\n        // then\n        expect(err.message).to.equal('No provider for \"bpmnImporter\"! (Resolving: bpmnImporter)');\n      });\n\n    });\n\n\n    it('should add module to default modules', function() {\n\n      // given\n      viewer = new Viewer({ container: container, additionalModules: testModules });\n\n      // when\n      return viewer.importXML(xml).then(function(result) {\n\n        // then\n        var logger = viewer.get('logger');\n        expect(logger.called).to.be.true;\n      });\n\n    });\n\n\n    it('should use custom size and position', function() {\n\n      // when\n      viewer = new Viewer({\n        container: container,\n        width: 200,\n        height: 100,\n        position: 'fixed'\n      });\n\n      // then\n      expect(viewer._container.style.position).to.equal('fixed');\n      expect(viewer._container.style.width).to.equal('200px');\n      expect(viewer._container.style.height).to.equal('100px');\n    });\n\n\n    var camundaPackage = require('../fixtures/json/model/camunda');\n\n    it('should provide custom moddle extensions', function() {\n\n      var xml = require('../fixtures/bpmn/extension/camunda.bpmn');\n\n      // given\n      viewer = new Viewer({\n        container: container,\n        moddleExtensions: {\n          camunda: camundaPackage\n        }\n      });\n\n      // when\n      return viewer.importXML(xml).then(function(result) {\n\n        var elementRegistry = viewer.get('elementRegistry');\n\n        var taskShape = elementRegistry.get('send'),\n            sendTask = taskShape.businessObject;\n\n        // then\n        expect(sendTask).to.exist;\n\n        var extensionElements = sendTask.extensionElements;\n\n        // receive task should be moddle extended\n        expect(sendTask.$instanceOf('camunda:ServiceTaskLike')).to.be.true;\n\n        // extension elements should provide typed element\n        expect(extensionElements).to.exist;\n        expect(extensionElements.values).to.exist;\n\n        expect(extensionElements.values).to.have.length(1);\n        expect(extensionElements.values[0].$instanceOf('camunda:InputOutput')).to.be.true;\n      });\n\n    });\n\n\n    it('should allow to add default custom moddle extensions', function() {\n\n      // given\n      var xml = require('../fixtures/bpmn/extension/custom.bpmn'),\n          additionalModdleDescriptors = {\n            custom: require('../fixtures/json/model/custom')\n          };\n\n      function CustomViewer(options) {\n        Viewer.call(this, options);\n      }\n\n      inherits(CustomViewer, Viewer);\n\n      CustomViewer.prototype._moddleExtensions = additionalModdleDescriptors;\n\n      viewer = new CustomViewer({\n        container: container,\n        moddleExtensions: {\n          camunda: camundaPackage\n        }\n      });\n\n      // when\n      return viewer.importXML(xml).then(function(result) {\n\n        var elementRegistry = viewer.get('elementRegistry');\n\n        var taskShape = elementRegistry.get('send'),\n            sendTask = taskShape.businessObject;\n\n        // then\n        expect(sendTask).to.exist;\n\n        var extensionElements = sendTask.extensionElements;\n\n        // receive task should be moddle extended\n        expect(sendTask.$instanceOf('camunda:ServiceTaskLike')).to.be.true;\n        expect(sendTask.$instanceOf('custom:ServiceTaskGroup')).to.be.true;\n\n        // extension elements should provide typed element\n        expect(extensionElements).to.exist;\n\n        expect(extensionElements.values.length).to.equal(2);\n        expect(extensionElements.values[0].$instanceOf('camunda:InputOutput')).to.be.true;\n\n        expect(extensionElements.values[1].$instanceOf('custom:CustomSendElement')).to.be.true;\n      });\n\n    });\n\n\n    it('should allow user to override default custom moddle extensions', function() {\n\n      // given\n      var xml = require('../fixtures/bpmn/extension/custom-override.bpmn');\n\n      var additionalModdleDescriptors = {\n        custom: require('../fixtures/json/model/custom')\n      };\n\n      var customOverride = require('../fixtures/json/model/custom-override');\n\n      function CustomViewer(options) {\n        Viewer.call(this, options);\n      }\n\n      inherits(CustomViewer, Viewer);\n\n      CustomViewer.prototype._moddleExtensions = additionalModdleDescriptors;\n\n      viewer = new CustomViewer({\n        container: container,\n        moddleExtensions: {\n          camunda: camundaPackage,\n          custom : customOverride\n        }\n      });\n\n      // when\n      return viewer.importXML(xml).then(function(result) {\n\n        var elementRegistry = viewer.get('elementRegistry');\n\n        var taskShape = elementRegistry.get('send'),\n            sendTask = taskShape.businessObject;\n\n        // then\n        expect(sendTask).to.exist;\n\n        var extensionElements = sendTask.extensionElements;\n\n        // receive task should be moddle extended\n        expect(sendTask.$instanceOf('camunda:ServiceTaskLike')).to.be.true;\n        expect(sendTask.$instanceOf('custom:ServiceTaskGroupOverride')).to.be.true;\n\n        // extension elements should provide typed element\n        expect(extensionElements).to.exist;\n\n        expect(extensionElements.values.length).to.equal(2);\n        expect(extensionElements.values[0].$instanceOf('camunda:InputOutput')).to.be.true;\n\n        expect(extensionElements.values[1].$instanceOf('custom:CustomSendElementOverride')).to.be.true;\n      });\n\n    });\n\n  });\n\n\n  describe('configuration', function() {\n\n    var xml = require('../fixtures/bpmn/simple.bpmn');\n\n    it('should configure Canvas', function() {\n\n      // given\n      var viewer = new Viewer({\n        container: container,\n        canvas: {\n          deferUpdate: true\n        }\n      });\n\n      // when\n      return viewer.importXML(xml).then(function(result) {\n\n        var canvasConfig = viewer.get('config.canvas');\n\n        // then\n        expect(canvasConfig.deferUpdate).to.be.true;\n      });\n\n    });\n\n\n    describe('container', function() {\n\n      it('should attach if provided', function() {\n\n        var xml = require('../fixtures/bpmn/simple.bpmn');\n\n        var viewer = new Viewer({ container: container });\n\n        return viewer.importXML(xml).then(function(result) {\n\n          expect(viewer._container.parentNode).to.equal(container);\n        });\n      });\n\n\n      it('should not attach if absent', function() {\n\n        var xml = require('../fixtures/bpmn/simple.bpmn');\n\n        var viewer = new Viewer();\n\n        return viewer.importXML(xml).then(function(result) {\n\n          expect(viewer._container.parentNode).to.equal(null);\n        });\n      });\n\n    });\n\n  });\n\n\n  describe('#importXML', function() {\n\n    it('should emit <import.*> events', function() {\n\n      // given\n      var viewer = new Viewer({ container: container });\n\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n\n      var events = [];\n\n      viewer.on([\n        'import.parse.start',\n        'import.parse.complete',\n        'import.render.start',\n        'import.render.complete',\n        'import.done'\n      ], function(e) {\n\n        // log event type + event arguments\n        events.push([\n          e.type,\n          Object.keys(e).filter(function(key) {\n            return key !== 'type';\n          })\n        ]);\n      });\n\n      // when\n      return viewer.importXML(xml).then(function(result) {\n\n        // then\n        expect(events).to.eql([\n          [ 'import.parse.start', [ 'xml' ] ],\n          [ 'import.parse.complete', [ 'error', 'definitions', 'elementsById', 'references', 'warnings' ] ],\n          [ 'import.render.start', [ 'definitions' ] ],\n          [ 'import.render.complete', [ 'error', 'warnings' ] ],\n          [ 'import.done', [ 'error', 'warnings' ] ]\n        ]);\n      });\n    });\n\n\n    it('should work without callback', function(done) {\n\n      // given\n      var viewer = new Viewer({ container: container });\n\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n\n      // when\n      viewer.importXML(xml);\n\n      // then\n      viewer.on('import.done', function(event) {\n        done();\n      });\n    });\n\n\n    describe('multiple BPMNDiagram elements', function() {\n\n      var multipleXML = require('../fixtures/bpmn/multiple-diagrams.bpmn');\n\n\n      it('should import default without bpmnDiagram specified', function() {\n\n        // when\n        return createViewer(container, Viewer, multipleXML).then(function(result) {\n\n          var err = result.error;\n\n          // then\n          expect(err).not.to.exist;\n        });\n      });\n\n\n      it('should import bpmnDiagram specified by id', function() {\n\n        // when\n        return createViewer(container, Viewer, multipleXML, 'BpmnDiagram_2').then(function(result) {\n\n          var err = result.error;\n\n          // then\n          expect(err).not.to.exist;\n        });\n      });\n\n\n      it('should handle diagram not found', function() {\n\n        // given\n        var xml = require('../fixtures/bpmn/multiple-diagrams.bpmn');\n\n        // when\n        return createViewer(container, Viewer, xml, 'Diagram_IDontExist').then(function(result) {\n\n          var err = result.error;\n\n          // then\n          expect(err).to.exist;\n          expect(err.message).to.eql('BPMNDiagram <Diagram_IDontExist> not found');\n        });\n      });\n\n\n      describe('without callback', function() {\n\n        it('should open default', function(done) {\n\n          // given\n          var viewer = new Viewer({ container: container });\n\n          // when\n          viewer.importXML(multipleXML);\n\n          // then\n          viewer.on('import.done', function(event) {\n            done(event.error);\n          });\n        });\n\n\n        it('should open specified BPMNDiagram', function(done) {\n\n          // given\n          var viewer = new Viewer({ container: container });\n\n          // when\n          viewer.importXML(multipleXML, 'BpmnDiagram_2');\n\n          // then\n          viewer.on('import.done', function(event) {\n            done(event.error);\n          });\n        });\n\n      });\n\n    });\n\n  });\n\n\n  describe('#importDefinitions', function() {\n\n    describe('single diagram', function() {\n\n      var xml = require('../fixtures/bpmn/simple.bpmn'),\n          viewer,\n          definitions;\n\n      beforeEach(function() {\n        return createViewer(container, Viewer, xml, null).then(function(result) {\n\n          var error = result.error;\n          var tmpViewer = result.viewer;\n\n          if (error) {\n            throw error;\n          }\n\n          definitions = tmpViewer.getDefinitions();\n\n          tmpViewer.destroy();\n        });\n      });\n\n      beforeEach(function() {\n        viewer = new Viewer({ container: container });\n      });\n\n      afterEach(function() {\n        viewer.destroy();\n      });\n\n\n      it('should emit <import.*> events', function() {\n\n        // given\n        var events = [];\n\n        viewer.on([\n          'import.parse.start',\n          'import.parse.complete',\n          'import.render.start',\n          'import.render.complete',\n          'import.done'\n        ], function(e) {\n\n          // log event type + event arguments\n          events.push([\n            e.type,\n            Object.keys(e).filter(function(key) {\n              return key !== 'type';\n            })\n          ]);\n        });\n\n        // when\n        return viewer.importDefinitions(definitions).then(function() {\n\n          // then\n          expect(events).to.eql([\n            [ 'import.render.start', [ 'definitions' ] ],\n            [ 'import.render.complete', [ 'error', 'warnings' ] ]\n          ]);\n        });\n      });\n\n\n      it('should work without callback', function(done) {\n\n        // given\n        viewer.on('import.render.complete', function(context) {\n\n          // then\n          done(context.error);\n        });\n\n        // when\n        viewer.importDefinitions(definitions);\n      });\n\n    });\n\n\n    describe('multiple BPMNDiagram elements', function() {\n\n      var multipleXML = require('../fixtures/bpmn/multiple-diagrams.bpmn'),\n          viewer,\n          definitions;\n\n      beforeEach(function() {\n        return createViewer(container, Viewer, multipleXML).then(function(result) {\n\n          var error = result.error;\n          var tmpViewer = result.viewer;\n\n          if (error) {\n            throw error;\n          }\n\n          definitions = tmpViewer.getDefinitions();\n\n          tmpViewer.destroy();\n        });\n      });\n\n      beforeEach(function() {\n        viewer = new Viewer({ container: container });\n      });\n\n      afterEach(function() {\n        viewer.destroy();\n      });\n\n\n      it('should import default without bpmnDiagram specified', function() {\n\n        // when\n        return viewer.importDefinitions(definitions);\n      });\n\n\n      it('should import bpmnDiagram specified by id', function() {\n\n        // when\n        return viewer.importDefinitions(definitions, 'BpmnDiagram_2');\n      });\n\n\n      it('should handle diagram not found', function() {\n\n        // when\n        return viewer.importDefinitions(definitions, 'Diagram_IDontExist').catch(function(err) {\n\n          // then\n          expect(err).to.exist;\n          expect(err.message).to.eql('BPMNDiagram <Diagram_IDontExist> not found');\n        });\n      });\n\n\n      describe('without callback', function() {\n\n        it('should open default', function(done) {\n\n          // given\n          viewer.on('import.render.complete', function(event) {\n\n            // then\n            done(event.error);\n          });\n\n          // when\n          viewer.importDefinitions(definitions);\n        });\n\n\n        it('should open specified BPMNDiagram', function(done) {\n\n          // given\n          viewer.on('import.render.complete', function(event) {\n\n            // then\n            done(event.error);\n          });\n\n          // when\n          viewer.importDefinitions(definitions, 'BpmnDiagram_2');\n        });\n\n      });\n\n    });\n  });\n\n\n  describe('#open', function() {\n\n    var multipleXMLSimple = require('../fixtures/bpmn/multiple-diagrams.bpmn'),\n        multipleXMLOverlappingDI = require('../fixtures/bpmn/multiple-diagrams-overlapping-di.bpmn'),\n        multipleXMLWithLaneSet = require('../fixtures/bpmn/multiple-diagrams-lanesets.bpmn'),\n        diagram1 = 'BpmnDiagram_1',\n        diagram2 = 'BpmnDiagram_2';\n\n\n    it('should open the first diagram if id was not provided', function() {\n\n      var viewer, renderedDiagram;\n\n      // when\n      return createViewer(container, Viewer, multipleXMLSimple, diagram1).then(function(result) {\n\n        var err = result.error;\n        viewer = result.viewer;\n\n        expect(err).not.to.exist;\n\n        renderedDiagram = getDi(viewer.get('canvas').getRootElement());\n\n        return viewer.open();\n      }).then(function() {\n\n        // then\n        expect(getDi(viewer.get('canvas').getRootElement())).to.equal(renderedDiagram);\n      });\n    });\n\n\n    it('should switch between diagrams', function() {\n\n      var viewer, definitions;\n\n      // when\n      return createViewer(container, Viewer, multipleXMLSimple, diagram1).then(function(result) {\n\n        var err = result.error;\n        var warnings = result.warnings;\n        viewer = result.viewer;\n\n        // then\n\n        expect(err).not.to.exist;\n\n        expect(warnings).to.be.empty;\n\n        definitions = viewer.getDefinitions();\n\n        expect(definitions).to.exist;\n\n        return viewer.open(diagram2);\n      }).then(function(result) {\n\n        // then\n        var warnings = result.warnings;\n\n        expect(warnings).to.be.empty;\n\n        expect(definitions).to.equal(viewer.getDefinitions());\n\n        var elementRegistry = viewer.get('elementRegistry');\n\n        expect(elementRegistry.get('Task_A')).to.not.exist;\n        expect(elementRegistry.get('Task_B')).to.exist;\n      });\n    });\n\n\n    it('should switch between diagrams with overlapping DI', function() {\n\n      var viewer, definitions;\n\n      // when\n      return createViewer(container, Viewer, multipleXMLOverlappingDI, diagram1).then(function(result) {\n\n        var err = result.error;\n        var warnings = result.warnings;\n        viewer = result.viewer;\n\n        // then\n        expect(err).not.to.exist;\n\n        expect(warnings).to.be.empty;\n\n        definitions = viewer.getDefinitions();\n\n        expect(definitions).to.exist;\n\n        return viewer.open(diagram2);\n      }).then(function(result) {\n\n        var warnings = result.warnings;\n\n        expect(warnings).to.be.empty;\n\n        expect(definitions).to.equal(viewer.getDefinitions());\n      });\n    });\n\n\n    it('should switch between diagrams with laneSets', function() {\n\n      var viewer, definitions;\n\n      // when\n      return createViewer(container, Viewer, multipleXMLWithLaneSet, diagram2).then(function(result) {\n\n        var err = result.error;\n        var warnings = result.warnings;\n        viewer = result.viewer;\n\n        // then\n        expect(err).not.to.exist;\n\n        expect(warnings).to.be.empty;\n\n        definitions = viewer.getDefinitions();\n\n        expect(definitions).to.exist;\n\n        return viewer.open(diagram1);\n      }).then(function(result) {\n\n        // then\n        var warnings = result.warnings;\n\n        expect(warnings).to.be.empty;\n\n        expect(definitions).to.equal(viewer.getDefinitions());\n\n        var elementRegistry = viewer.get('elementRegistry');\n\n        expect(elementRegistry.get('Task_A')).to.exist;\n        expect(elementRegistry.get('Task_B')).to.not.exist;\n      });\n\n    });\n\n\n    it('should complete with error if xml was not imported', function() {\n\n      // given\n      var viewer = new Viewer();\n\n      // when\n      return viewer.open().catch(function(err) {\n\n        // then\n        expect(err).to.exist;\n        expect(err.message).to.eql('no XML imported');\n\n        var definitions = viewer.getDefinitions();\n\n        expect(definitions).to.not.exist;\n      });\n\n    });\n\n\n    it('should open with error if diagram does not exist', function() {\n\n      var viewer, definitions;\n\n      // when\n      return createViewer(container, Viewer, multipleXMLSimple, diagram1).then(function(result) {\n\n        var err = result.error;\n        var warnings = result.warnings;\n        viewer = result.viewer;\n\n        // then\n        expect(err).not.to.exist;\n\n        expect(warnings).to.be.empty;\n\n        definitions = viewer.getDefinitions();\n\n        expect(definitions).to.exist;\n\n        return viewer.open('Diagram_IDontExist');\n      }).catch(function(err) {\n\n        // then\n        expect(err).to.exist;\n        expect(err.message).to.eql('BPMNDiagram <Diagram_IDontExist> not found');\n\n        // definitions stay the same\n        expect(viewer.getDefinitions()).to.eql(definitions);\n      });\n    });\n\n\n    it('should emit <import.*> events', function() {\n\n      var viewer = new Viewer({ container: container });\n\n      var events = [];\n\n      return viewer.importXML(multipleXMLSimple, diagram1).then(function(result) {\n\n        // given\n        viewer.on([\n          'import.parse.start',\n          'import.parse.complete',\n          'import.render.start',\n          'import.render.complete',\n          'import.done'\n        ], function(e) {\n\n          // log event type + event arguments\n          events.push([\n            e.type,\n            Object.keys(e).filter(function(key) {\n              return key !== 'type';\n            })\n          ]);\n        });\n\n        // when\n        return viewer.open(diagram2);\n      }).then(function() {\n\n        // then\n        expect(events).to.eql([\n          [ 'import.render.start', [ 'definitions' ] ],\n          [ 'import.render.complete', [ 'error', 'warnings' ] ]\n        ]);\n      });\n    });\n\n  });\n\n\n  describe('#saveXML', function() {\n\n    it('should export XML', function() {\n\n      // given\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n\n      return createViewer(container, Viewer, xml).then(function(result) {\n\n        var err = result.error;\n        var viewer = result.viewer;\n\n        expect(err).not.to.exist;\n\n        // when\n        return viewer.saveXML({ format: true });\n      }).then(function(result) {\n\n        var xml = result.xml;\n\n        // then\n        expect(xml).to.contain('<?xml version=\"1.0\" encoding=\"UTF-8\"?>');\n        expect(xml).to.contain('<bpmn2:definitions');\n        expect(xml).to.contain('  ');\n      });\n    });\n\n\n    it('should emit <saveXML.*> events', function() {\n\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n\n      var viewer;\n      var events = [];\n\n      return createViewer(container, Viewer, xml).then(function(result) {\n\n        var err = result.error;\n        viewer = result.viewer;\n\n        expect(err).not.to.exist;\n\n        viewer.on([\n          'saveXML.start',\n          'saveXML.serialized',\n          'saveXML.done'\n        ], function(e) {\n\n          // log event type + event arguments\n          events.push([\n            e.type,\n            Object.keys(e).filter(function(key) {\n              return key !== 'type';\n            })\n          ]);\n        });\n\n        return viewer.importXML(xml);\n      }).then(function(result) {\n\n        // when\n        return viewer.saveXML();\n      }).then(function() {\n\n        // then\n        expect(events).to.eql([\n          [ 'saveXML.start', [ 'definitions' ] ],\n          [ 'saveXML.serialized', [ 'xml' ] ],\n          [ 'saveXML.done', [ 'xml' ] ]\n        ]);\n      });\n    });\n\n\n    it('should emit <saveXML.done> on error', function() {\n\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n\n      var viewer;\n      var events = [];\n\n      return createViewer(container, Viewer, xml).then(function(result) {\n\n        var err = result.error;\n        viewer = result.viewer;\n\n        expect(err).not.to.exist;\n\n        // when\n        viewer.on('saveXML.start', 250, function() {\n          throw new Error('failing pre-save listener');\n        });\n\n        viewer.on([\n          'saveXML.start',\n          'saveXML.serialized',\n          'saveXML.done'\n        ], function(e) {\n\n          // log event type + event arguments\n          events.push([\n            e.type,\n            Object.keys(e).filter(function(key) {\n              return key !== 'type';\n            })\n          ]);\n        });\n\n        return viewer.importXML(xml);\n      }).then(function(result) {\n\n        // when\n        return viewer.saveXML();\n      }).catch(function(error) {\n        events.push([ 'error' ]);\n      }).finally(function() {\n\n        // then\n        expect(events).to.eql([\n          [ 'saveXML.start', [ 'definitions' ] ],\n          [ 'saveXML.done', [ 'error' ] ],\n          [ 'error' ]\n        ]);\n      });\n\n    });\n\n\n    it('should emit <saveXML.done> on no definitions loaded', function() {\n\n      var events = [];\n\n      var viewer = new Viewer({\n        container: container\n      });\n\n      viewer.on([\n        'saveXML.start',\n        'saveXML.serialized',\n        'saveXML.done'\n      ], function(e) {\n\n        // log event type + event arguments\n        events.push([\n          e.type,\n          Object.keys(e).filter(function(key) {\n            return key !== 'type';\n          })\n        ]);\n      });\n\n      return viewer.saveXML().catch(function(error) {\n        events.push([ 'error' ]);\n      }).finally(function() {\n\n        // then\n        expect(events).to.eql([\n          [ 'saveXML.done', [ 'error' ] ],\n          [ 'error' ]\n        ]);\n      });\n\n    });\n\n  });\n\n\n  describe('#saveSVG', function() {\n\n    function currentTime() {\n      return new Date().getTime();\n    }\n\n    function validSVG(svg) {\n      var expectedStart = '<?xml version=\"1.0\" encoding=\"utf-8\"?>';\n      var expectedEnd = '</svg>';\n\n      expect(svg.indexOf(expectedStart)).to.equal(0);\n      expect(svg.indexOf(expectedEnd)).to.equal(svg.length - expectedEnd.length);\n\n      // ensure correct rendering of SVG contents\n      expect(svg.indexOf('undefined')).to.equal(-1);\n\n      // expect header to be written only once\n      expect(svg.indexOf('<svg width=\"100%\" height=\"100%\">')).to.equal(-1);\n      expect(svg.indexOf('<g class=\"viewport\"')).to.equal(-1);\n\n      // expect svg to not be empty\n      expect(svg.indexOf('<g')).not.to.equal(-1);\n\n      var parser = new DOMParser();\n      var svgNode = parser.parseFromString(svg, 'image/svg+xml');\n\n      // [comment, <!DOCTYPE svg>, svg]\n      expect(svgNode.childNodes).to.have.length(3);\n\n      // no error body\n      expect(svgNode.body).not.to.exist;\n\n      // FIXME(nre): make matcher\n      return true;\n    }\n\n\n    it('should export svg', function() {\n\n      // given\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n\n      return createViewer(container, Viewer, xml).then(function(result) {\n\n        var err = result.error;\n        var viewer = result.viewer;\n\n        if (err) {\n          throw err;\n        }\n\n        // when\n        return viewer.saveSVG();\n      }).then(function(result) {\n\n        var svg = result.svg;\n\n        // then\n        expect(validSVG(svg)).to.be.true;\n      });\n    });\n\n\n    it('should export huge svg', function() {\n\n      this.timeout(5000);\n\n      // given\n      var xml = require('../fixtures/bpmn/complex.bpmn');\n\n      return createViewer(container, Viewer, xml).then(function(result) {\n\n        var err = result.error;\n        var viewer = result.viewer;\n\n        if (err) {\n          throw err;\n        }\n\n        // when\n        return viewer.saveSVG();\n      }).then(function(result) {\n\n        var svg = result.svg;\n\n        var time = currentTime();\n\n        // then\n        expect(validSVG(svg)).to.be.true;\n\n        // no svg export should not take too long\n        expect(currentTime() - time).to.be.below(1000);\n      });\n    });\n\n\n    it('should remove outer-makers on export', function() {\n\n      // given\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n      function appendTestRect(svgDoc) {\n        var rect = document.createElementNS(svgDoc.namespaceURI, 'rect');\n        rect.setAttribute('class', 'outer-bound-marker');\n        rect.setAttribute('width', 500);\n        rect.setAttribute('height', 500);\n        rect.setAttribute('x', 10000);\n        rect.setAttribute('y', 10000);\n        svgDoc.appendChild(rect);\n      }\n\n      return createViewer(container, Viewer, xml).then(function(result) {\n\n        var err = result.error;\n        var viewer = result.viewer;\n\n        if (err) {\n          throw err;\n        }\n\n        var svgDoc = domQuery('svg', viewer._container);\n\n        appendTestRect(svgDoc);\n        appendTestRect(svgDoc);\n\n        expect(domQuery('.outer-bound-marker', svgDoc)).to.exist;\n\n        // when\n        return viewer.saveSVG();\n      }).then(function(result) {\n\n        var svg = result.svg;\n\n        var svgDoc = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n        svgDoc.innerHTML = svg;\n\n        // then\n        expect(validSVG(svg)).to.be.true;\n        expect(domQuery('.outer-bound-marker', svgDoc)).not.to.exist;\n\n      });\n    });\n\n\n    it('should emit <saveSVG.*> events', function() {\n\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n\n      var viewer;\n      var events = [];\n\n      return createViewer(container, Viewer, xml).then(function(result) {\n\n        var err = result.error;\n        viewer = result.viewer;\n\n        expect(err).not.to.exist;\n\n        viewer.on([\n          'saveSVG.start',\n          'saveSVG.done'\n        ], function(e) {\n\n          // log event type + event arguments\n          events.push([\n            e.type,\n            Object.keys(e).filter(function(key) {\n              return key !== 'type';\n            })\n          ]);\n        });\n\n        return viewer.importXML(xml);\n      }).then(function() {\n\n        // when\n        return viewer.saveSVG();\n      }).then(function() {\n\n        // then\n        expect(events).to.eql([\n          [ 'saveSVG.start', [ ] ],\n          [ 'saveSVG.done', [ 'error', 'svg' ] ]\n        ]);\n      });\n    });\n\n  });\n\n\n  describe('#on', function() {\n\n    it('should fire with given three', function() {\n\n      // given\n      var viewer = new Viewer({ container: container });\n\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n\n      // when\n      viewer.on('foo', 1000, function() {\n        return 'bar';\n      }, viewer);\n\n      // then\n      return viewer.importXML(xml).then(function() {\n        var eventBus = viewer.get('eventBus');\n\n        var result = eventBus.fire('foo');\n\n        expect(result).to.equal('bar');\n      });\n    });\n  });\n\n\n  describe('#off', function() {\n\n    var xml = require('../fixtures/bpmn/simple.bpmn');\n\n    it('should remove listener permanently', function() {\n\n      // given\n      var viewer = new Viewer({ container: container });\n\n      var handler = function() {\n        return 'bar';\n      };\n\n      viewer.on('foo', 1000, handler);\n\n      // when\n      viewer.off('foo');\n\n      // then\n      return viewer.importXML(xml).then(function() {\n        var eventBus = viewer.get('eventBus');\n\n        var result = eventBus.fire('foo');\n\n        expect(result).not.to.exist;\n      });\n    });\n\n\n    it('should remove listener on existing diagram instance', function() {\n\n      // given\n      var viewer = new Viewer({ container: container });\n\n      var handler = function() {\n        return 'bar';\n      };\n\n      viewer.on('foo', 1000, handler);\n\n      // when\n      return viewer.importXML(xml).then(function() {\n        var eventBus = viewer.get('eventBus');\n\n        // when\n        viewer.off('foo', handler);\n\n        var result = eventBus.fire('foo');\n\n        expect(result).not.to.exist;\n      });\n    });\n  });\n\n\n  describe('#destroy', function() {\n\n    it('should remove traces in document tree', function() {\n\n      // given\n      var viewer = new Viewer({\n        container: container\n      });\n\n      // when\n      viewer.destroy();\n\n      // then\n      expect(viewer._container.parentNode).not.to.exist;\n    });\n\n  });\n\n\n  describe('#attachTo', function() {\n\n    it('should attach the viewer', function() {\n\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n\n      var viewer = new Viewer();\n\n      return viewer.importXML(xml).then(function(result) {\n\n        // assume\n        expect(viewer._container.parentNode).not.to.exist;\n\n        var resizedSpy = sinon.spy();\n\n        viewer.on('canvas.resized', resizedSpy);\n\n        // when\n        viewer.attachTo(container);\n\n        // then\n        expect(viewer._container.parentNode).to.equal(container);\n\n        // should trigger resized\n        expect(resizedSpy).to.have.been.called;\n      });\n    });\n  });\n\n\n  describe('#detach', function() {\n\n    it('should detach the viewer', function() {\n\n      var xml = require('../fixtures/bpmn/simple.bpmn');\n\n      var viewer = new Viewer({ container: container });\n\n      return viewer.importXML(xml).then(function(result) {\n\n        // assume\n        expect(viewer._container.parentNode).to.equal(container);\n\n        // when\n        viewer.detach();\n\n        // then\n        expect(viewer._container.parentNode).not.to.exist;\n      });\n    });\n  });\n\n\n  describe('#clear', function() {\n\n    it('should NOT clear if no diagram', function() {\n\n      // given\n      var viewer = new Viewer({ container: container });\n\n      var eventBus = viewer.get('eventBus');\n\n      var spy = sinon.spy();\n\n      eventBus.on('diagram.clear', spy);\n\n      // when\n      viewer.clear();\n\n      // then\n      expect(spy).not.to.have.been.called;\n    });\n\n\n    it('should not throw if diagram is already empty', function() {\n\n      // given\n      var viewer = new Viewer({ container: container });\n\n      function clearDiagram() {\n        viewer.clear();\n      }\n\n      // then\n      expect(clearDiagram).to.not.throw();\n    });\n\n  });\n\n\n  it('default export', function() {\n    expect(ViewerDefaultExport).to.equal(Viewer);\n  });\n\n\n  describe('accessibility', function() {\n\n    it('should report no issues', async function() {\n\n      // given\n      const xml = require('../fixtures/bpmn/simple.bpmn');\n      await createViewer(container, Viewer, xml);\n\n      // then\n      await expectToBeAccessible(container);\n    });\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/draw/BpmnRenderUtilSpec.js",
    "content": "import {\n  isTypedEvent,\n  isThrowEvent,\n  isCollection,\n  getDi,\n  getSemantic,\n  getCirclePath,\n  getRoundRectPath,\n  getDiamondPath,\n  getRectPath,\n  getFillColor,\n  getStrokeColor,\n  getLabelColor\n} from 'lib/draw/BpmnRenderUtil';\n\n\ndescribe('BpmnRenderUtil', function() {\n\n  it('should expose isTypedEvent', function() {\n    expect(isTypedEvent).to.be.a('function');\n  });\n\n\n  it('should expose isThrowEvent', function() {\n    expect(isThrowEvent).to.be.a('function');\n  });\n\n\n  it('should expose isCollection', function() {\n    expect(isCollection).to.be.a('function');\n  });\n\n\n  it('should expose getDi', function() {\n    expect(getDi).to.be.a('function');\n  });\n\n\n  it('should expose getSemantic', function() {\n    expect(getSemantic).to.be.a('function');\n  });\n\n\n  it('should expose getCirclePath', function() {\n    expect(getCirclePath).to.be.a('function');\n  });\n\n\n  it('should expose getRoundRectPath', function() {\n    expect(getRoundRectPath).to.be.a('function');\n  });\n\n\n  it('should expose getDiamondPath', function() {\n    expect(getDiamondPath).to.be.a('function');\n  });\n\n\n  it('should expose getRectPath', function() {\n    expect(getRectPath).to.be.a('function');\n  });\n\n\n  it('should expose getFillColor', function() {\n    expect(getFillColor).to.be.a('function');\n  });\n\n\n  it('should expose getStrokeColor', function() {\n    expect(getStrokeColor).to.be.a('function');\n  });\n\n\n  it('should expose getLabelColor', function() {\n    expect(getLabelColor).to.be.a('function');\n  });\n\n});\n"
  },
  {
    "path": "test/spec/draw/BpmnRenderer.colors.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:color=\"http://www.omg.org/spec/BPMN/non-normative/color/1.0\" xmlns:bioc=\"http://bpmn.io/schema/bpmn/biocolor/1.0\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"2.2.4\">\n  <bpmn:collaboration id=\"Collaboration_12gf8gk\">\n    <bpmn:participant id=\"Participant_11xqomt\" name=\"Regressnahme &#10;Sachbearbeiter\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Participant_0igvg0r\" />\n    <bpmn:messageFlow id=\"MessageFlow_11bysyp\" sourceRef=\"Task_04aofbe\" targetRef=\"Participant_0igvg0r\" />\n    <bpmn:messageFlow id=\"MessageFlow_1qyovto\" sourceRef=\"Participant_0igvg0r\" targetRef=\"Task_04aofbe\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:sequenceFlow id=\"SequenceFlow_17ohrlh\" sourceRef=\"Task_04aofbe\" targetRef=\"EndEvent_01a6rq8\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_1qt82pt\" name=\"Nein\" sourceRef=\"ExclusiveGateway_092mc05\" targetRef=\"Task_04aofbe\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_0pqo7zt\" name=\"Ja\" sourceRef=\"ExclusiveGateway_092mc05\" targetRef=\"Task_02fdytg\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_0h9s0mp\" sourceRef=\"Task_0iirfhd\" targetRef=\"ExclusiveGateway_092mc05\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_1jrsqqc\" sourceRef=\"StartEvent_1mnut37\" targetRef=\"Task_0iirfhd\" />\n    <bpmn:startEvent id=\"StartEvent_1mnut37\" name=\"Regressverdacht gemeldet\">\n      <bpmn:outgoing>SequenceFlow_1jrsqqc</bpmn:outgoing>\n      <bpmn:messageEventDefinition />\n    </bpmn:startEvent>\n    <bpmn:callActivity id=\"Task_0iirfhd\" name=\"Fall prüfen\">\n      <bpmn:incoming>SequenceFlow_1jrsqqc</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_0h9s0mp</bpmn:outgoing>\n      <bpmn:property id=\"Property_1vr5ovt\" name=\"__targetRef_placeholder\" />\n      <bpmn:dataInputAssociation id=\"DataInputAssociation_1ncouqr\">\n        <bpmn:sourceRef>DataStoreReference_1clvrcw</bpmn:sourceRef>\n        <bpmn:targetRef>Property_1vr5ovt</bpmn:targetRef>\n      </bpmn:dataInputAssociation>\n      <bpmn:dataOutputAssociation id=\"DataOutputAssociation_1i89wkc\">\n        <bpmn:targetRef>DataObjectReference_0iua582</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n    </bpmn:callActivity>\n    <bpmn:exclusiveGateway id=\"ExclusiveGateway_092mc05\" name=\"Regress&#10;möglich?\">\n      <bpmn:incoming>SequenceFlow_0h9s0mp</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_0pqo7zt</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_1qt82pt</bpmn:outgoing>\n    </bpmn:exclusiveGateway>\n    <bpmn:task id=\"Task_02fdytg\" name=\"Zahlungsaufforderung an VN schicken\">\n      <bpmn:incoming>SequenceFlow_0pqo7zt</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:task id=\"Task_04aofbe\" name=\"Vorgang schließen\">\n      <bpmn:incoming>SequenceFlow_1qt82pt</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_17ohrlh</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:endEvent id=\"EndEvent_01a6rq8\" name=\"Vorgang geschlossen\">\n      <bpmn:incoming>SequenceFlow_17ohrlh</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:dataStoreReference id=\"DataStoreReference_1clvrcw\" name=\"DATA\" />\n    <bpmn:dataObjectReference id=\"DataObjectReference_0iua582\" dataObjectRef=\"DataObject_0lo7sfa\" />\n    <bpmn:dataObject id=\"DataObject_0lo7sfa\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_12gf8gk\">\n      <bpmndi:BPMNShape id=\"Participant_11xqomt_di\" bpmnElement=\"Participant_11xqomt\">\n        <dc:Bounds x=\"25\" y=\"143\" width=\"665\" height=\"305\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1mnut37_di\" bpmnElement=\"StartEvent_1mnut37\">\n        <dc:Bounds x=\"101\" y=\"211\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"77\" y=\"247\" width=\"84\" height=\"24\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0iirfhd_di\" bpmnElement=\"Task_0iirfhd\" bioc:stroke=\"blue\" bioc:fill=\"yellow\">\n        <dc:Bounds x=\"196\" y=\"189\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1jrsqqc_di\" bpmnElement=\"SequenceFlow_1jrsqqc\" bioc:stroke=\"blue\" bioc:fill=\"yellow\">\n        <di:waypoint x=\"137\" y=\"229\" />\n        <di:waypoint x=\"196\" y=\"229\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"122\" y=\"219\" width=\"90\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_092mc05_di\" bpmnElement=\"ExclusiveGateway_092mc05\" isMarkerVisible=\"true\" bioc:stroke=\"blue\" bioc:fill=\"yellow\">\n        <dc:Bounds x=\"318\" y=\"204\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"320\" y=\"163\" width=\"45\" height=\"24\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0h9s0mp_di\" bpmnElement=\"SequenceFlow_0h9s0mp\" bioc:stroke=\"rgba(255, 0, 0, 0.9)\">\n        <di:waypoint x=\"296\" y=\"229\" />\n        <di:waypoint x=\"318\" y=\"229\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"262\" y=\"219\" width=\"90\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_02fdytg_di\" bpmnElement=\"Task_02fdytg\">\n        <dc:Bounds x=\"430\" y=\"189\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0pqo7zt_di\" bpmnElement=\"SequenceFlow_0pqo7zt\" color:border-color=\"#FB8C00\" bioc:stroke=\"#3399aa\">\n        <di:waypoint x=\"368\" y=\"229\" />\n        <di:waypoint x=\"430\" y=\"229\" />\n        <bpmndi:BPMNLabel color:color=\"#FB8C00\">\n          <dc:Bounds x=\"392\" y=\"210\" width=\"13\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_04aofbe_di\" bpmnElement=\"Task_04aofbe\" color:border-color=\"#FB8C00\">\n        <dc:Bounds x=\"430\" y=\"311\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1qt82pt_di\" bpmnElement=\"SequenceFlow_1qt82pt\" bioc:stroke=\"blue\" bioc:fill=\"yellow\">\n        <di:waypoint x=\"343\" y=\"229\" />\n        <di:waypoint x=\"343\" y=\"351\" />\n        <di:waypoint x=\"430\" y=\"351\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"348\" y=\"282\" width=\"23\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EndEvent_01a6rq8_di\" bpmnElement=\"EndEvent_01a6rq8\">\n        <dc:Bounds x=\"574\" y=\"333\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"561\" y=\"369\" width=\"62\" height=\"24\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_17ohrlh_di\" bpmnElement=\"SequenceFlow_17ohrlh\" bioc:stroke=\"rgb(251, 140, 0)\" bioc:fill=\"rgb(255, 224, 178)\">\n        <di:waypoint x=\"530\" y=\"351\" />\n        <di:waypoint x=\"574\" y=\"351\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"507\" y=\"341\" width=\"90\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Participant_0j5gs6j_di\" bpmnElement=\"Participant_0igvg0r\">\n        <dc:Bounds x=\"313\" y=\"548\" width=\"378\" height=\"60\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_11bysyp_di\" bpmnElement=\"MessageFlow_11bysyp\" bioc:stroke=\"#FB8C00\" bioc:fill=\"#FFE0B2\">\n        <di:waypoint x=\"464\" y=\"391\" />\n        <di:waypoint x=\"464\" y=\"548\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"434\" y=\"470\" width=\"90\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"MessageFlow_1qyovto_di\" bpmnElement=\"MessageFlow_1qyovto\" bioc:stroke=\"#FB8C00\" bioc:fill=\"#FFE0B2\">\n        <di:waypoint x=\"501\" y=\"548\" />\n        <di:waypoint x=\"501\" y=\"391\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"471\" y=\"470\" width=\"90\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"DataStoreReference_1clvrcw_di\" bpmnElement=\"DataStoreReference_1clvrcw\" color:background-color=\"#FFE0B2\">\n        <dc:Bounds x=\"143\" y=\"364\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"154\" y=\"414\" width=\"29\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_1ncouqr_di\" bpmnElement=\"DataInputAssociation_1ncouqr\" bioc:stroke=\"#FB8C00\" bioc:fill=\"#FFE0B2\">\n        <di:waypoint x=\"180\" y=\"364\" />\n        <di:waypoint x=\"226\" y=\"269\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"DataObjectReference_0iua582_di\" bpmnElement=\"DataObjectReference_0iua582\">\n        <dc:Bounds x=\"283\" y=\"345\" width=\"36\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_1i89wkc_di\" bpmnElement=\"DataOutputAssociation_1i89wkc\" bioc:stroke=\"#FB8C00\" bioc:fill=\"#FFE0B2\">\n        <di:waypoint x=\"242\" y=\"269\" />\n        <di:waypoint x=\"233\" y=\"345\" />\n        <di:waypoint x=\"283\" y=\"363\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/draw/BpmnRenderer.connection-colors.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:bioc=\"http://bpmn.io/schema/bpmn/biocolor/1.0\" id=\"Definitions_19dhhgf\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"3.3.1\">\n  <bpmn:collaboration id=\"Collaboration_1pbeyt7\">\n    <bpmn:participant id=\"Participant_0ibnr2x\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Participant_1idiy26\" processRef=\"Process_0x3gxd5\" />\n    <bpmn:messageFlow id=\"MessageFlow_1facuin\" sourceRef=\"Participant_0ibnr2x\" targetRef=\"Participant_1idiy26\" />\n    <bpmn:messageFlow id=\"MessageFlow_1vmbq3n\" sourceRef=\"Participant_1idiy26\" targetRef=\"Participant_0ibnr2x\" />\n    <bpmn:textAnnotation id=\"TextAnnotation_1eywcut\">\n      <bpmn:text>YO</bpmn:text>\n    </bpmn:textAnnotation>\n    <bpmn:association id=\"Association_0r1hup8\" sourceRef=\"Participant_0ibnr2x\" targetRef=\"TextAnnotation_1eywcut\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\" />\n  <bpmn:process id=\"Process_0x3gxd5\" isExecutable=\"false\">\n    <bpmn:dataStoreReference id=\"DataStoreReference_046zpex\" />\n    <bpmn:task id=\"Task_049utn6\">\n      <bpmn:property id=\"Property_0kufae0\" name=\"__targetRef_placeholder\" />\n      <bpmn:dataInputAssociation id=\"DataInputAssociation\">\n        <bpmn:sourceRef>DataStoreReference_046zpex</bpmn:sourceRef>\n        <bpmn:targetRef>Property_0kufae0</bpmn:targetRef>\n      </bpmn:dataInputAssociation>\n      <bpmn:dataOutputAssociation id=\"DataOutputAssociation_0ixhole\">\n        <bpmn:targetRef>DataObjectReference_130kij0</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n    </bpmn:task>\n    <bpmn:dataObjectReference id=\"DataObjectReference_130kij0\" dataObjectRef=\"DataObject_1k959a8\" />\n    <bpmn:dataObject id=\"DataObject_1k959a8\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1pbeyt7\">\n      <bpmndi:BPMNShape id=\"Participant_0ibnr2x_di\" bpmnElement=\"Participant_0ibnr2x\" isHorizontal=\"true\">\n        <dc:Bounds x=\"201\" y=\"151\" width=\"468\" height=\"162\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_1eywcut_di\" bpmnElement=\"TextAnnotation_1eywcut\">\n        <dc:Bounds x=\"247\" y=\"81\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_0r1hup8_di\" bpmnElement=\"Association_0r1hup8\" bioc:stroke=\"#8E24AA\" bioc:fill=\"#E1BEE7\">\n        <di:waypoint x=\"253\" y=\"151\" />\n        <di:waypoint x=\"261\" y=\"111\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Participant_1idiy26_di\" bpmnElement=\"Participant_1idiy26\" isHorizontal=\"true\">\n        <dc:Bounds x=\"201\" y=\"374\" width=\"473\" height=\"192\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_1facuin_di\" bpmnElement=\"MessageFlow_1facuin\" bioc:stroke=\"rgb(23, 100, 344)\" bioc:fill=\"rgb(23, 100, 344)\">\n        <di:waypoint x=\"341\" y=\"313\" />\n        <di:waypoint x=\"341\" y=\"374\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"DataStoreReference_046zpex_di\" bpmnElement=\"DataStoreReference_046zpex\">\n        <dc:Bounds x=\"289\" y=\"483\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_049utn6_di\" bpmnElement=\"Task_049utn6\">\n        <dc:Bounds x=\"383\" y=\"404\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_di\" bpmnElement=\"DataInputAssociation\" bioc:stroke=\"rgb(23, 100, 344)\" bioc:fill=\"rgb(23, 100, 344)\">\n        <di:waypoint x=\"339\" y=\"519\" />\n        <di:waypoint x=\"412\" y=\"519\" />\n        <di:waypoint x=\"423\" y=\"484\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"DataObjectReference_130kij0_di\" bpmnElement=\"DataObjectReference_130kij0\">\n        <dc:Bounds x=\"537\" y=\"483\" width=\"36\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_0ixhole_di\" bpmnElement=\"DataOutputAssociation_0ixhole\" bioc:stroke=\"#8E24AA\" bioc:fill=\"#E1BEE7\">\n        <di:waypoint x=\"440\" y=\"484\" />\n        <di:waypoint x=\"446\" y=\"520\" />\n        <di:waypoint x=\"537\" y=\"510\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"MessageFlow_1vmbq3n_di\" bpmnElement=\"MessageFlow_1vmbq3n\" bioc:stroke=\"rgb(23, 100, 344)\" bioc:fill=\"rgb(23, 100, 344)\">\n        <di:waypoint x=\"438\" y=\"374\" />\n        <di:waypoint x=\"438\" y=\"313\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/draw/BpmnRenderer.group-colors.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:bioc=\"http://bpmn.io/schema/bpmn/biocolor/1.0\" id=\"Definitions_1nek5tb\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.4.1\">\n  <bpmn:process id=\"Process_12xkoyc\" isExecutable=\"true\">\n    <bpmn:group id=\"Group_08irt25\" categoryValueRef=\"CategoryValue_16jt3xn\" />\n  </bpmn:process>\n  <bpmn:category id=\"Category_1313spp\">\n    <bpmn:categoryValue id=\"CategoryValue_16jt3xn\" value=\"ASD\" />\n  </bpmn:category>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_12xkoyc\">\n      <bpmndi:BPMNShape id=\"Group_08irt25_di\" bpmnElement=\"Group_08irt25\" bioc:stroke=\"rgb(67, 160, 71)\" bioc:fill=\"rgb(200, 230, 201)\">\n        <dc:Bounds x=\"170\" y=\"70\" width=\"300\" height=\"190\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"189\" y=\"83\" width=\"22\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/draw/BpmnRenderer.labels.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"http://bpmn.io\" exporterVersion=\"0.10.1\">\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <startEvent id=\"StartEvent_1\" name=\"hunger&#10;noticed\" />\n    <task id=\"Task_1\" name=\"choose recipe aa&#10;ASDSAD&#10;DSAADS\" />\n    <exclusiveGateway id=\"ExclusiveGateway_1\" name=\"desired dish?\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"StartEvent_16g5oa3_di\" bpmnElement=\"StartEvent_1\">\n        <omgdc:Bounds x=\"157\" y=\"48\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"157\" y=\"91\" width=\"36\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0kmcz3u_di\" bpmnElement=\"Task_1\">\n        <omgdc:Bounds x=\"125\" y=\"131\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_04ookgz_di\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"150\" y=\"226\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"143\" y=\"274\" width=\"65\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/draw/BpmnRenderer.no-event-icons.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"12.0.0\">\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <sequenceFlow id=\"Flow_1nt6baa\" sourceRef=\"START_EVENT\" targetRef=\"CATCH_EVENT\" />\n    <task id=\"ACTVITIY\">\n      <incoming>Flow_1qympxx</incoming>\n      <outgoing>Flow_1635gbq</outgoing>\n    </task>\n    <sequenceFlow id=\"Flow_1qympxx\" sourceRef=\"CATCH_EVENT\" targetRef=\"ACTVITIY\" />\n    <sequenceFlow id=\"Flow_1635gbq\" sourceRef=\"ACTVITIY\" targetRef=\"END_EVENT\" />\n    <intermediateCatchEvent id=\"CATCH_EVENT\" name=\"CATCH_EVENT\" >\n      <incoming>Flow_1nt6baa</incoming>\n      <outgoing>Flow_1qympxx</outgoing>\n      <messageEventDefinition id=\"MessageEventDefinition_155nigy\" />\n    </intermediateCatchEvent>\n    <startEvent id=\"START_EVENT\" name=\"START_EVENT\">\n      <outgoing>Flow_1nt6baa</outgoing>\n      <timerEventDefinition id=\"TimerEventDefinition_1ot9ndh\" />\n    </startEvent>\n    <boundaryEvent id=\"BOUNDARY_EVENT\" name=\"BOUNDARY_EVENT\" attachedToRef=\"ACTVITIY\">\n      <errorEventDefinition id=\"ErrorEventDefinition_1t8kpuj\" />\n    </boundaryEvent>\n    <endEvent id=\"END_EVENT\" name=\"END_EVENT\">\n      <incoming>Flow_1635gbq</incoming>\n      <errorEventDefinition id=\"ErrorEventDefinition_15xc39q\" />\n    </endEvent>\n    <intermediateThrowEvent id=\"THROW_EVENT\" name=\"THROW\">\n      <messageEventDefinition id=\"MessageEventDefinition_155nagy\" />\n    </intermediateThrowEvent>\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"ACTVITIY_di\" bpmnElement=\"ACTVITIY\">\n        <omgdc:Bounds x=\"340\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0ssuqaa_di\" bpmnElement=\"CATCH_EVENT\">\n        <omgdc:Bounds x=\"242\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0g813my_di\" bpmnElement=\"START_EVENT\">\n        <omgdc:Bounds x=\"152\" y=\"102\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"134\" y=\"145\" width=\"73\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_05fteh0_di\" bpmnElement=\"END_EVENT\">\n        <omgdc:Bounds x=\"502\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1pb3v1z_di\" bpmnElement=\"BOUNDARY_EVENT\">\n        <omgdc:Bounds x=\"382\" y=\"142\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n\n      <bpmndi:BPMNShape id=\"THROW_EVENT_di\" bpmnElement=\"THROW_EVENT\">\n        <omgdc:Bounds x=\"682\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1nt6baa_di\" bpmnElement=\"Flow_1nt6baa\">\n        <omgdi:waypoint x=\"188\" y=\"120\" />\n        <omgdi:waypoint x=\"242\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1qympxx_di\" bpmnElement=\"Flow_1qympxx\">\n        <omgdi:waypoint x=\"278\" y=\"120\" />\n        <omgdi:waypoint x=\"340\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1635gbq_di\" bpmnElement=\"Flow_1635gbq\">\n        <omgdi:waypoint x=\"440\" y=\"120\" />\n        <omgdi:waypoint x=\"502\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/draw/BpmnRenderer.sequenceFlow-no-source.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" id=\"Definitions_16zlf0z\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"2.2.4\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\" />\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/draw/BpmnRenderer.simple-cropping.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\" name=\"Start Event\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:exclusiveGateway id=\"ExclusiveGateway_1\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n    </bpmn:exclusiveGateway>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"ExclusiveGateway_1\" />\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n      <bpmn:task id=\"Task_1\">\n        <bpmn:incoming>SequenceFlow_3</bpmn:incoming>\n      </bpmn:task>\n      <bpmn:startEvent id=\"StartEvent_2\">\n        <bpmn:outgoing>SequenceFlow_3</bpmn:outgoing>\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"SequenceFlow_3\" sourceRef=\"StartEvent_2\" targetRef=\"Task_1\" />\n    </bpmn:subProcess>\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"SubProcess_1\" />\n    <bpmn:textAnnotation id=\"TextAnnotation_1\" />\n    <bpmn:association id=\"Association_1\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"TextAnnotation_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"169\" y=\"245\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"159\" y=\"303\" width=\"55\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_1_di\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"333\" y=\"238\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"373\" y=\"368\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"514\" y=\"163\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"653\" y=\"223\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_2_di\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds x=\"553\" y=\"245\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"586\" y=\"361\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_3_di\" bpmnElement=\"SequenceFlow_3\">\n        <di:waypoint x=\"589\" y=\"263\" />\n        <di:waypoint x=\"621\" y=\"263\" />\n        <di:waypoint x=\"621\" y=\"263\" />\n        <di:waypoint x=\"653\" y=\"263\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"636\" y=\"327.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"TextAnnotation_1_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"308\" y=\"76\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"205\" y=\"263\" />\n        <di:waypoint x=\"333\" y=\"263\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"284\" y=\"333\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_2_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint x=\"383\" y=\"263\" />\n        <di:waypoint x=\"514\" y=\"263\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"463.5\" y=\"333\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Association_1_di\" bpmnElement=\"Association_1\">\n        <di:waypoint x=\"358\" y=\"238\" />\n        <di:waypoint x=\"358\" y=\"156\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/draw/BpmnRendererSpec.js",
    "content": "import {\n  bootstrapModeler,\n  bootstrapViewer,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  attr as svgAttr,\n  create as svgCreate\n} from 'tiny-svg';\n\nimport coreModule from 'lib/core';\nimport rendererModule from 'lib/draw';\nimport modelingModule from 'lib/features/modeling';\n\nimport {\n  query as domQuery,\n  queryAll as domQueryAll\n} from 'min-dom';\n\nimport { getVisual } from 'diagram-js/lib/util/GraphicsUtil';\n\nimport { isAny } from 'lib/features/modeling/util/ModelingUtil';\n\nimport { isExpanded } from 'lib/util/DiUtil';\n\nimport { isPlane } from 'lib/util/DrilldownUtil';\n\nimport {\n  getDi,\n  black,\n  white\n} from 'lib/draw/BpmnRenderUtil';\n\nimport customRendererModule from './custom-renderer';\n\nimport { expectSvgPath } from '../../util/svgHelpers';\n\n\n/**\n * @typedef {import('../../../lib/model/Types').Element} Element\n */\n\nfunction checkErrors(err, warnings) {\n  expect(warnings).to.be.empty;\n  expect(err).not.to.exist;\n}\n\n\ndescribe('draw - bpmn renderer', function() {\n\n  it('should render labels', function() {\n    var xml = require('./BpmnRenderer.labels.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render activity markers', function() {\n    var xml = require('../../fixtures/bpmn/draw/activity-markers.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render association markers', function() {\n    var xml = require('../../fixtures/bpmn/draw/associations.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render activity markers (combination)', function() {\n    var xml = require('../../fixtures/bpmn/draw/activity-markers-combination.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render conditional flows', function() {\n    var xml = require('../../fixtures/bpmn/draw/conditional-flow.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render conditional default flows', function() {\n    var xml = require('../../fixtures/bpmn/draw/conditional-flow-default.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      return checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render NO conditional flow (gateway)', function() {\n    var xml = require('../../fixtures/bpmn/draw/conditional-flow-gateways.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render conditional flow (typed task)', function() {\n    var xml = require('../../fixtures/bpmn/draw/conditional-flow-typed-task.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render data objects', function() {\n    var xml = require('../../fixtures/bpmn/draw/data-objects.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render events', function() {\n    var xml = require('../../fixtures/bpmn/draw/events.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render events (interrupting)', function() {\n    var xml = require('../../fixtures/bpmn/draw/events-interrupting.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render event subprocesses (collapsed)', function() {\n    var xml = require('../../fixtures/bpmn/draw/event-subprocesses-collapsed.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render event subprocesses (expanded)', function() {\n    var xml = require('../../fixtures/bpmn/draw/event-subprocesses-expanded.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render event subprocess icons', function() {\n    var xml = require('../../fixtures/bpmn/draw/event-subprocess-icons.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render gateways', function() {\n    var xml = require('../../fixtures/bpmn/draw/gateways.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render group', function() {\n    var xml = require('../../fixtures/bpmn/draw/group.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render message marker', function() {\n    var xml = require('../../fixtures/bpmn/draw/message-marker.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render message label', function() {\n    var xml = require('../../fixtures/bpmn/draw/message-label.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n      checkErrors(result.error, result.warnings);\n      inject(function(elementRegistry) {\n\n        var dataFlow = elementRegistry.getGraphics('dataFlow');\n\n        expect(domQuery('.djs-label', dataFlow)).to.exist;\n      })();\n    });\n  });\n\n\n  it('should render pools', function() {\n    var xml = require('../../fixtures/bpmn/draw/pools.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render vertical pools', function() {\n    var xml = require('../../fixtures/bpmn/draw/vertical-pools.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render pool collection marker', function() {\n    var xml = require('../../fixtures/bpmn/draw/pools-with-collection-marker.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render task types', function() {\n    var xml = require('../../fixtures/bpmn/draw/task-types.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render text annotations', function() {\n    var xml = require('../../fixtures/bpmn/draw/text-annotation.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render flow markers', function() {\n    var xml = require('../../fixtures/bpmn/flow-markers.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render xor gateways blank and with X', function() {\n    var xml = require('../../fixtures/bpmn/draw/xor.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render boundary events with correct z-index', function() {\n    var xml = require('../../fixtures/bpmn/draw/boundary-event-z-index.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render boundary events without flowNodeRef', function() {\n    var xml = require('../../fixtures/bpmn/draw/boundary-event-without-refnode.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render boundary event only once if referenced incorrectly via flowNodeRef (robustness)', function() {\n    var xml = require('../../fixtures/bpmn/draw/boundary-event-with-refnode.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render gateway event if attribute is missing in XML', function() {\n    var xml = require('../../fixtures/bpmn/draw/gateway-type-default.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      checkErrors(result.error, result.warnings);\n    });\n  });\n\n\n  it('should render call activity', function() {\n    var xml = require('../../fixtures/bpmn/draw/call-activity.bpmn');\n\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      var err = result.error;\n\n      expect(err).not.to.exist;\n\n      inject(function(elementRegistry) {\n\n        var callActivityGfx = elementRegistry.getGraphics('CallActivity');\n\n        // make sure the + marker is shown\n        expect(domQuery('[data-marker=sub-process]', callActivityGfx)).to.exist;\n      })();\n    });\n\n  });\n\n\n  it('should render adhoc sub process', function() {\n    var xml = require('../../fixtures/bpmn/draw/activity-markers-simple.bpmn');\n\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      var err = result.error;\n\n      expect(err).not.to.exist;\n\n      inject(function(elementRegistry) {\n\n        var callActivityGfx = elementRegistry.getGraphics('AdHocSubProcess');\n\n        // make sure the + marker is shown\n        expect(domQuery('[data-marker=adhoc]', callActivityGfx)).to.exist;\n      })();\n    });\n\n  });\n\n\n  it('should add random ID suffix to marker ID', function() {\n\n    var xml = require('../../fixtures/bpmn/simple.bpmn');\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      var err = result.error;\n\n      expect(err).not.to.exist;\n\n      inject(function(canvas) {\n        var svg = canvas._svg;\n        var markers = svg.querySelectorAll('marker');\n\n        expect(markers[0].id).to.match(/^marker-[A-Za-z0-9]+$/);\n      })();\n    });\n  });\n\n\n  it('should properly render colored markers', function() {\n    var xml = require('./BpmnRenderer.colors.bpmn');\n\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      var err = result.error;\n\n      expect(err).not.to.exist;\n\n      inject(function(canvas) {\n\n        [\n          [ 'SequenceFlow_1jrsqqc' , 'blue' , 'blue' ],\n          [ 'SequenceFlow_0h9s0mp' , 'rgba(255, 0, 0, 0.9)' ],\n          [ 'SequenceFlow_0pqo7zt' , 'rgb(251, 140, 0)' , 'rgb(251, 140, 0)' ],\n          [ 'SequenceFlow_1qt82pt' , 'blue' , 'blue' ],\n          [ 'SequenceFlow_17ohrlh' , 'rgb(251, 140, 0)' , 'rgb(251, 140, 0)' ],\n          [ 'MessageFlow_11bysyp' , 'rgb(251, 140, 0)' , 'rgb(255, 224, 178)' ],\n          [ 'MessageFlow_1qyovto' , 'rgb(251, 140, 0)' , 'rgb(255, 224, 178)' ],\n          [ 'DataInputAssociation_1ncouqr' , 'rgb(251, 140, 0)' , 'none' ],\n          [ 'DataOutputAssociation_1i89wkc' , 'rgb(251, 140, 0)' , 'none' ]\n        ].forEach(([ id, stroke, fill ]) => {\n          var svg = canvas._svg,\n              markerPath = svg.querySelector(`[data-element-id=\"${id}\"] marker path`);\n\n          expect(markerPath).to.exist;\n\n          stroke && expect(markerPath.style.stroke).to.eql(stroke);\n          fill && expect(markerPath.style.fill).to.eql(fill);\n        });\n      })();\n    });\n  });\n\n\n  it('should render collapsed subprocess marker centered', function() {\n    var xml = require('../../fixtures/bpmn/draw/activity-markers-simple.bpmn');\n\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      var err = result.error;\n\n      expect(err).not.to.exist;\n\n      inject(function(elementRegistry) {\n\n        var task = elementRegistry.getGraphics('SubProcessCollapsed');\n\n        const marker = domQuery('[data-marker=sub-process]', task);\n\n        expectDistance(task, marker, { x: 0 });\n      })();\n    });\n  });\n\n\n  it('should render compensation marker centered', function() {\n    var xml = require('../../fixtures/bpmn/draw/activity-markers-simple.bpmn');\n\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      var err = result.error;\n\n      expect(err).not.to.exist;\n\n      inject(function(elementRegistry) {\n\n        var task = elementRegistry.getGraphics('TaskCompensation');\n\n        const marker = domQuery('[data-marker=compensation]', task);\n\n        expectDistance(task, marker, { x: 0 });\n      })();\n    });\n  });\n\n  it('should render ad-hoc marker centered on expanded subprocess', function() {\n    var xml = require('../../fixtures/bpmn/draw/activity-markers-simple.bpmn');\n\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      var err = result.error;\n\n      expect(err).not.to.exist;\n\n      inject(function(elementRegistry) {\n\n        var task = elementRegistry.getGraphics('AdHocSubProcessExpanded');\n\n        const marker = domQuery('[data-marker=adhoc]', task);\n\n        expectDistance(task, marker, { x: 0 });\n      })();\n    });\n  });\n\n\n  it('should properly render connection markers (2)', function() {\n    var xml = require('./BpmnRenderer.connection-colors.bpmn');\n\n    return bootstrapViewer(xml).call(this).then(function(result) {\n\n      var err = result.error;\n\n      expect(err).not.to.exist;\n\n      inject(function(canvas) {\n\n        [\n          [ 'MessageFlow_1facuin', 'rgb(23, 100, 255)', 'rgb(23, 100, 255)' ],\n          [ 'MessageFlow_1vmbq3n', 'rgb(23, 100, 255)', 'rgb(23, 100, 255)' ],\n          [ 'DataInputAssociation', 'rgb(23, 100, 255)', 'none' ],\n          [ 'DataOutputAssociation_0ixhole', 'rgb(142, 36, 170)', 'none' ],\n        ].forEach(([ id, stroke, fill ]) => {\n          var svg = canvas._svg,\n              markerPath = svg.querySelector(`[data-element-id=\"${id}\"] marker path`);\n\n          expect(markerPath).to.exist;\n\n          stroke && expect(markerPath.style.stroke).to.eql(stroke);\n          fill && expect(markerPath.style.fill).to.eql(fill);\n\n        });\n      })();\n    });\n  });\n\n\n  it('should render sequenceFlows without source', function() {\n\n    var xml = require('./BpmnRenderer.sequenceFlow-no-source.bpmn');\n    return bootstrapModeler(xml, {\n      modules: [\n        coreModule,\n        rendererModule,\n        modelingModule\n      ]\n    }).call(this).then(function(result) {\n\n      var err = result.error;\n\n      expect(err).not.to.exist;\n\n      inject(function(elementFactory, graphicsFactory) {\n\n        // given\n        var g = svgCreate('g');\n\n        var connection = elementFactory.create('connection', {\n          type: 'bpmn:SequenceFlow',\n          waypoints: [\n            { x: 0, y: 0 },\n            { x: 10, y: 100 }\n          ]\n        });\n\n        var gfx = graphicsFactory.drawConnection(g, connection);\n\n        expect(gfx).to.exist;\n      })();\n    });\n\n  });\n\n\n  describe('colors', function() {\n\n    var xml = require('./BpmnRenderer.colors.bpmn');\n\n    var groupXML = require('./BpmnRenderer.group-colors.bpmn');\n\n    it('should render colors without warnings and errors', function() {\n      return bootstrapViewer(xml).call(this).then(function(result) {\n\n        checkErrors(result.error, result.warnings);\n      });\n    });\n\n\n    it('should render group colors', function() {\n      return bootstrapViewer(groupXML).call(this).then(function(result) {\n\n        checkErrors(result.error, result.warnings);\n      });\n    });\n\n\n    describe('default colors', function() {\n\n      var defaultFillColor = 'red',\n          defaultStrokeColor = 'lime',\n          defaultLabelColor = 'blue';\n\n      // TODO(philippfromme): remove once we drop PhantomJS\n      function expectedColors(color) {\n\n        var conversionValues = {\n          blue: '#0000ff',\n          lime: '#00ff00',\n          red: '#ff0000',\n          yellow: '#ffff00',\n          'rgb(251, 140, 0)': '#fb8c00',\n          '#FB8C00': 'rgb(251, 140, 0)',\n          '#3399aa': 'rgb(51, 153, 170)'\n        };\n\n        return [\n          color,\n          color.toLowerCase(),\n          color.toUpperCase(),\n          conversionValues[ color ],\n          conversionValues[ color ] && conversionValues[ color ].toLowerCase(),\n          conversionValues[ color ] && conversionValues[ color ].toUpperCase()\n        ];\n      }\n\n      beforeEach(bootstrapViewer(xml,{\n        bpmnRenderer: {\n          defaultFillColor: defaultFillColor,\n          defaultStrokeColor: defaultStrokeColor,\n          defaultLabelColor: defaultLabelColor\n        }\n      }));\n\n      function expectFillColor(element, color) {\n        expect(expectedColors(color)).to.include(element.style.fill);\n      }\n\n      function expectStrokeColor(element, color) {\n        expect(expectedColors(color)).to.include(element.style.stroke);\n      }\n\n      /**\n       * Expect colors depending on element type.\n       *\n       * @param {Element} element - Element.\n       * @param {SVGElement} gfx - Graphics of element.\n       * @param {string} fillColor - Fill color to expect.\n       * @param {string} strokeColor - Stroke color to expect.\n       */\n      function expectColors(element, gfx, fillColor, strokeColor, labelColor) {\n        var djsVisual = domQuery('.djs-visual', gfx);\n\n        var circle, path, polygon, polyline, rect, text;\n\n        if (element.labelTarget) {\n          text = domQuery('text', djsVisual);\n\n          expectFillColor(text, labelColor);\n        } else if (element.waypoints) {\n          path = domQuery('path', djsVisual);\n          polyline = domQuery('polyline', djsVisual);\n\n          expectStrokeColor(path || polyline, strokeColor);\n        } else if (isAny(element, [ 'bpmn:StartEvent', 'bpmn:EndEvent' ])) {\n          circle = domQuery('circle', djsVisual);\n\n          expectFillColor(circle, fillColor);\n          expectStrokeColor(circle, strokeColor);\n        } else if (isAny(element, [ 'bpmn:Task', 'bpmn:SubProcess', 'bpmn:Participant' ])) {\n          rect = domQuery('rect', djsVisual);\n          text = domQuery('text', djsVisual);\n\n          expectFillColor(rect, fillColor);\n          expectStrokeColor(rect, strokeColor);\n          expectFillColor(text, labelColor);\n        } else if (isAny(element, [ 'bpmn:Gateway' ])) {\n          polygon = domQuery('polygon', djsVisual);\n\n          expectFillColor(polygon, fillColor);\n          expectStrokeColor(polygon, strokeColor);\n        }\n      }\n\n\n      it('should render default colors without overriding', inject(function(canvas, elementRegistry) {\n        var rootElement = canvas.getRootElement();\n\n        elementRegistry.forEach(function(element) {\n          if (element === rootElement) {\n            return;\n          }\n\n          var gfx = elementRegistry.getGraphics(element),\n              di = getDi(element),\n              fillColor = di.get('color:background-color') || di.get('bioc:fill') || defaultFillColor,\n              strokeColor = di.get('color:border-color') || di.get('bioc:stroke') || defaultStrokeColor,\n              labelDi = di.get('label'),\n              labelColor = labelDi && labelDi.get('color:color') || defaultLabelColor;\n\n          expectColors(element, gfx, fillColor, strokeColor, labelColor);\n        });\n      }));\n\n\n      describe('events', function() {\n\n        const diagramXML = require('../../fixtures/bpmn/draw/events.bpmn');\n\n        beforeEach(bootstrapModeler(diagramXML, {\n          bpmnRenderer: {\n            defaultFillColor: defaultFillColor,\n            defaultStrokeColor: defaultStrokeColor,\n            defaultLabelColor: defaultLabelColor\n          }\n        }));\n\n        it('should not fill multiple parallel events', inject(function(elementRegistry) {\n\n          // given\n          var parallelMultiple = elementRegistry.get('StartEvent_multiple_parallel_1');\n          var visual = getVisual(elementRegistry.getGraphics(parallelMultiple));\n          var path = domQuery('path', visual);\n\n          // then\n          expectFillColor(path, defaultFillColor);\n          expectStrokeColor(path, defaultStrokeColor);\n\n        }));\n\n      });\n\n    });\n\n  });\n\n\n  describe('path', function() {\n\n    var diagramXML = require('./BpmnRenderer.simple-cropping.bpmn');\n\n    var testModules = [ coreModule, rendererModule ];\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n    describe('circle', function() {\n\n      it('should return a circle path', inject(function(elementRegistry, graphicsFactory) {\n\n        // given\n        var eventElement = elementRegistry.get('StartEvent_1');\n\n        // when\n        var startPath = graphicsFactory.getShapePath(eventElement);\n\n        // then\n        expect(startPath).to.equal('M187,263m0,-18a18,18,0,1,1,0,36a18,18,0,1,1,0,-36z');\n      }));\n\n\n      it('should return a diamond path', inject(function(elementRegistry, graphicsFactory) {\n\n        // given\n        var gatewayElement = elementRegistry.get('ExclusiveGateway_1');\n\n        // when\n        var gatewayPath = graphicsFactory.getShapePath(gatewayElement);\n\n        // then\n        expect(gatewayPath).to.equal('M358,238l25,25l-25,25l-25,-25z');\n      }));\n\n\n      it('should return a rounded rectangular path', inject(function(elementRegistry, graphicsFactory) {\n\n        // given\n        var subProcessElement = elementRegistry.get('SubProcess_1');\n\n        // when\n        var subProcessPath = graphicsFactory.getShapePath(subProcessElement);\n\n        // then\n        expect(subProcessPath).to.equal('M524,163l330,0a10,10,0,0,1,10,10l0,180a10,10,0,0,1,' +\n          '-10,10l-330,0a10,10,0,0,1,-10,-10l0,-180a10,10,0,0,1,10,-10z');\n      }));\n\n\n      it('should return a rectangular path', inject(function(elementRegistry, graphicsFactory) {\n\n        // given\n        var TextAnnotationElement = elementRegistry.get('TextAnnotation_1');\n\n        // when\n        var TextAnnotationPath = graphicsFactory.getShapePath(TextAnnotationElement);\n\n        // then\n        expect(TextAnnotationPath).to.equal('M308,76l100,0l0,80l-100,0z');\n      }));\n\n\n      it('should return a rounded rectangular path for external label', inject(function(elementRegistry, graphicsFactory) {\n\n        // given\n        const event = elementRegistry.get('StartEvent_1');\n        const label = event.labels[0];\n\n        // when\n        const labelPath = graphicsFactory.getShapePath(label);\n\n        // then\n        expectSvgPath(\n          labelPath,\n          'M163,303l47,0a4,4,0,0,1,4,4l0,6a4,4,0,0,1,-4,4l-47,0a4,4,0,0,1,-4,-4l0,-6a4,4,0,0,1,4,-4z'\n        );\n      }));\n\n    });\n\n  });\n\n\n  describe('extension API', function() {\n\n    var diagramXML = require('../../fixtures/bpmn/simple.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: [\n        coreModule,\n        rendererModule\n      ]\n    }));\n\n\n    it('should expose helpers', inject(function(bpmnRenderer) {\n\n      // then\n\n      // unsafe to use render APIs\n      expect(bpmnRenderer._drawPath).to.be.a('function');\n      expect(bpmnRenderer._renderer).to.be.a('function');\n\n      // very unsafe to use internal state\n      expect(bpmnRenderer.handlers).to.exist;\n    }));\n\n  });\n\n\n  describe('attrs', function() {\n\n    describe('colors', function() {\n\n      const diagramXML = require('../../fixtures/bpmn/kitchen-sink.bpmn');\n\n      class CustomColors {\n        constructor(eventBus) {\n          eventBus.on([ 'render.shape', 'render.connection' ], 100000, (_, context) => {\n            context.attrs = {\n              fill: 'yellow',\n              fillOpacity: 0.1, // should be ignored\n              stroke: 'blue',\n              strokeDasharray: '0, 10', // should be ignored\n              strokeWidth: 10 // should be ignored\n            };\n          });\n        }\n      }\n\n      CustomColors.$inject = [ 'eventBus' ];\n\n      beforeEach(bootstrapModeler(diagramXML, {\n        bpmnRenderer: {\n          defaultFillColor: 'cyan',\n          defaultStrokeColor: 'red'\n        },\n        additionalModules: [\n          {\n            __init__: [ 'customColors' ],\n            customColors: [ 'type', CustomColors ]\n          }\n        ]\n      }));\n\n\n      it('should override colors', inject(function(canvas) {\n\n        // then\n        var container = canvas.getContainer();\n\n        // expect fill and stroke overridden\n        domQueryAll('.djs-visual *', container).forEach(element => {\n          expect(svgAttr(element, 'fill')).not.to.equal('cyan');\n          expect(svgAttr(element, 'fill')).not.to.equal(white);\n          expect(svgAttr(element, 'stroke')).not.to.equal('red');\n          expect(svgAttr(element, 'stroke')).not.to.equal(black);\n        });\n\n        // expect all others not overridden\n        domQueryAll('.djs-visual *', container).forEach(element => {\n          expect(svgAttr(element, 'stroke-dasharray')).not.to.equal('0, 9000');\n          expect(svgAttr(element, 'stroke-width')).not.to.equal('9000');\n        });\n      }));\n\n    });\n\n\n    describe('bounds', function() {\n\n      const diagramXML = require('../../fixtures/bpmn/kitchen-sink.bpmn');\n\n      class CustomBounds {\n        constructor(eventBus) {\n          eventBus.on('render.shape', 100000, (_, context) => {\n            context.attrs = {\n              width: 200,\n              height: 100,\n              fillOpacity: 0.1, // should be ignored\n              strokeDasharray: '0, 9000', // should be ignored\n              strokeWidth: 9000 // should be ignored\n            };\n          });\n        }\n      }\n\n      CustomBounds.$inject = [ 'eventBus' ];\n\n      beforeEach(bootstrapModeler(diagramXML, {\n        additionalModules: [\n          {\n            __init__: [ 'customBounds' ],\n            customBounds: [ 'type', CustomBounds ]\n          }\n        ]\n      }));\n\n\n      it('should override bounds', inject(function(canvas, elementRegistry) {\n\n        // then\n        var container = canvas.getContainer();\n\n        // expect width and height overridden\n        elementRegistry.filter(element => {\n          return isAny(element, [\n            'bpmn:AdHocSubProcess',\n            'bpmn:Group',\n            'bpmn:Lane',\n            'bpmn:Participant',\n            'bpmn:SubProcess',\n            'bpmn:TextAnnotation',\n            'bpmn:Transaction'\n          ]);\n        }).forEach(element => {\n          if (isPlane(element)) {\n            return;\n          }\n\n          var visual = getVisual(elementRegistry.getGraphics(element));\n\n          var rect = domQuery('rect', visual);\n\n          if (rect) {\n\n            if (isCollapsedSubProcess(element)) {\n              expect(svgAttr(rect, 'width')).to.equal('100');\n              expect(svgAttr(rect, 'height')).to.equal('80');\n            } else {\n              expect(svgAttr(rect, 'width')).to.equal('200');\n              expect(svgAttr(rect, 'height')).to.equal('100');\n            }\n          }\n        });\n\n        // expect all others not overridden\n        domQueryAll('.djs-visual *', container).forEach(element => {\n          expect(svgAttr(element, 'stroke-dasharray')).not.to.equal('0, 9000');\n          expect(svgAttr(element, 'stroke-width')).not.to.equal('9000');\n        });\n      }));\n    });\n\n  });\n\n\n  describe('custom icons', function() {\n\n    var xml = require('./BpmnRenderer.no-event-icons.bpmn');\n\n    beforeEach(bootstrapViewer(xml, {\n      additionalModules: [ customRendererModule ]\n    }));\n\n\n    it('should render blank', inject(function(elementRegistry) {\n\n      // given\n      var events = [\n        'START_EVENT',\n        'THROW_EVENT',\n        'CATCH_EVENT',\n        'END_EVENT',\n        'BOUNDARY_EVENT'\n      ];\n\n      for (var elementId of events) {\n\n        var gfx = elementRegistry.getGraphics(elementId);\n        var iconGfx = domQuery('path', gfx);\n\n        expect(iconGfx, `icon on element <#${ elementId }>`).not.to.exist;\n      }\n    }));\n\n  });\n\n});\n\nfunction isCollapsedSubProcess(element) {\n  return isAny(element, [\n    'bpmn:SubProcess',\n    'bpmn:AdHocSubProcess',\n    'bpmn:Transaction'\n  ]) && !isExpanded(element);\n}\n\n/**\n * Expect distance between two elements.\n *\n * @param {SVGAElement} element1\n * @param {SVGAElement} element2\n * @param { { x: number; y: number } } distance\n * @param {number} [tolerance=3]\n *\n * @returns {void}\n */\nfunction expectDistance(element1, element2, distance, tolerance = 3) {\n  const {\n    x = Infinity,\n    y = Infinity\n  } = distance;\n\n  const bbox1 = element1.getBoundingClientRect();\n  const bbox2 = element2.getBoundingClientRect();\n\n  const center1 = {\n    x: bbox1.left + (bbox1.width / 2),\n    y: bbox1.top + (bbox1.height / 2)\n  };\n\n  const center2 = {\n    x: bbox2.left + (bbox2.width / 2),\n    y: bbox2.top + (bbox2.height / 2)\n  };\n\n  expect(Math.abs(center1.x - center2.x)).to.be.lessThan(x + tolerance);\n  expect(Math.abs(center1.y - center2.y)).to.be.lessThan(y + tolerance);\n}"
  },
  {
    "path": "test/spec/draw/TextRenderer.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"http://bpmn.io\" exporterVersion=\"0.0.0\">\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <startEvent id=\"StartEvent_1\" name=\"EVENT\" />\n    <task id=\"Task_1bjzik3\" name=\"TASK\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"StartEvent_16g5oa3_di\" bpmnElement=\"StartEvent_1\">\n        <omgdc:Bounds x=\"239\" y=\"184\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"237\" y=\"226\" width=\"39\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1bjzik3_di\" bpmnElement=\"Task_1bjzik3\">\n        <omgdc:Bounds x=\"347\" y=\"162\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/draw/TextRendererSpec.js",
    "content": "import {\n  bootstrapViewer,\n  inject\n} from 'test/TestHelper';\n\n\ndescribe('draw - TextRenderer', function() {\n\n  var diagramXML = require('./TextRenderer.bpmn');\n\n\n  describe('API', function() {\n\n    beforeEach(bootstrapViewer(diagramXML));\n\n    it('should expose #createText', inject(function(textRenderer) {\n\n      // when\n      var text = textRenderer.createText('FOO');\n\n      // then\n      expect(text).to.exist;\n    }));\n\n\n    it('should expose #getExternalLabelBounds', inject(function(textRenderer) {\n\n      // given\n      var bounds = {\n        x: 0,\n        y: 0,\n        width: 100,\n        height: 100\n      };\n\n      // when\n      var layoutedBounds = textRenderer.getExternalLabelBounds(\n        bounds,\n        'FOO\\nBar\\nFOOBAR'\n      );\n\n      // then\n      expect(layoutedBounds).to.exist;\n\n      expect(layoutedBounds.x).to.exist;\n      expect(layoutedBounds.y).to.exist;\n      expect(layoutedBounds.width).to.exist;\n      expect(layoutedBounds.height).to.exist;\n    }));\n\n\n    it('should expose #getTextAnnotationBounds', inject(function(textRenderer) {\n\n      // given\n      var bounds = {\n        x: 0,\n        y: 0,\n        width: 100,\n        height: 100\n      };\n\n      // when\n      var layoutedBounds = textRenderer.getTextAnnotationBounds(\n        bounds,\n        'FOO\\nBar\\nFOOBAR'\n      );\n\n      // then\n      expect(layoutedBounds).to.exist;\n\n      expect(layoutedBounds.x).to.exist;\n      expect(layoutedBounds.y).to.exist;\n      expect(layoutedBounds.width).to.exist;\n      expect(layoutedBounds.height).to.exist;\n    }));\n\n  });\n\n\n  describe('style override', function() {\n\n    beforeEach(bootstrapViewer(diagramXML, {\n      textRenderer: {\n        defaultStyle: {\n          fontFamily: 'monospace',\n          fontSize: '15px',\n          lineHeight: '24px'\n        },\n        externalStyle: {\n          fontWeight: 'bold'\n        }\n      }\n    }));\n\n\n    it('should render', inject(function(textRenderer) {\n\n      // when\n      var defaultStyle = textRenderer.getDefaultStyle();\n      var externalStyle = textRenderer.getExternalStyle();\n\n      // then\n      expect(defaultStyle.fontFamily).to.eql('monospace');\n      expect(defaultStyle.fontSize).to.eql('15px');\n      expect(defaultStyle.lineHeight).to.eql('24px');\n\n      expect(externalStyle.fontFamily).to.eql('monospace');\n      expect(externalStyle.fontSize).to.eql(14);\n      expect(externalStyle.fontWeight).to.eql('bold');\n    }));\n\n  });\n\n});"
  },
  {
    "path": "test/spec/draw/custom-renderer/CustomRenderer.js",
    "content": "import inherits from 'inherits-browser';\n\nimport BaseRenderer from 'diagram-js/lib/draw/BaseRenderer';\n\nimport {\n  is,\n  isAny\n} from 'lib/util/ModelUtil';\n\nimport {\n  isLabel\n} from 'lib/util/LabelUtil';\n\n\nvar HIGH_PRIORITY = 1250;\n\n\nexport default function CustomRenderer(\n    bpmnRenderer,\n    eventBus) {\n\n  this._bpmnRenderer = bpmnRenderer;\n\n  BaseRenderer.call(this, eventBus, HIGH_PRIORITY);\n}\n\ninherits(CustomRenderer, BaseRenderer);\n\nCustomRenderer.prototype.canRender = function(element) {\n\n  if (isLabel(element)) {\n    return false;\n  }\n\n  return !!(\n    isAny(element, [ 'bpmn:Event' ])\n  );\n};\n\nCustomRenderer.prototype.drawShape = function(parentGfx, element) {\n\n  var renderer = this._bpmnRenderer.handlers[\n    [\n      'bpmn:StartEvent',\n      'bpmn:IntermediateCatchEvent',\n      'bpmn:IntermediateThrowEvent',\n      'bpmn:BoundaryEvent',\n      'bpmn:EndEvent'\n    ].find(t => is(element, t))\n  ];\n\n  return renderer(parentGfx, element, { renderIcon: false });\n};\n\nCustomRenderer.$inject = [\n  'bpmnRenderer',\n  'eventBus'\n];"
  },
  {
    "path": "test/spec/draw/custom-renderer/index.js",
    "content": "import CustomRenderer from './CustomRenderer';\n\nexport default {\n  __init__: [ 'customRenderer' ],\n  customRenderer: [ 'type', CustomRenderer ]\n};"
  },
  {
    "path": "test/spec/environment/MockingSpec.js",
    "content": "import {\n  bootstrapViewer,\n  inject\n} from 'test/TestHelper';\n\nimport Events from 'diagram-js/lib/core/EventBus';\n\nimport Viewer from 'lib/Viewer';\n\n\ndescribe('environment - mocking', function() {\n\n  var diagramXML = require('../../fixtures/bpmn/simple.bpmn');\n\n  var mockEvents, bootstrapCalled;\n\n  beforeEach(bootstrapViewer(diagramXML, {\n    modules: Viewer.prototype._modules\n  }, function() {\n    mockEvents = new Events();\n\n    bootstrapCalled = true;\n\n    return {\n      eventBus: mockEvents\n    };\n  }));\n\n  afterEach(function() {\n    bootstrapCalled = false;\n  });\n\n\n  it('should use spy', inject(function(eventBus) {\n\n    expect(eventBus).to.eql(mockEvents);\n    expect(bootstrapCalled).to.be.true;\n  }));\n\n\n  it('should reparse bootstrap code', inject(function(eventBus) {\n\n    expect(bootstrapCalled).to.be.true;\n  }));\n\n\n  it('should inject bpmnjs', inject(function(bpmnjs) {\n\n    expect(bpmnjs).to.exist;\n  }));\n\n});\n"
  },
  {
    "path": "test/spec/features/align-elements/AlignElementsContextPadProviderSpec.js",
    "content": "import {\n  bootstrapModeler,\n  getBpmnJS,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  query as domQuery\n} from 'min-dom';\n\nimport alignElementsModule from 'lib/features/align-elements';\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\n\ndescribe('features/align-elements - context pad', function() {\n\n  var testModules = [ alignElementsModule, modelingModule, coreModule ];\n\n  var basicXML = require('../../../fixtures/bpmn/align-elements.bpmn');\n\n  beforeEach(bootstrapModeler(basicXML, { modules: testModules }));\n\n\n  it('should provide button to open menu', inject(function(elementRegistry, contextPad) {\n\n    // given\n    var elements = [\n      elementRegistry.get('EndEvent_lane'),\n      elementRegistry.get('Task_lane'),\n      elementRegistry.get('SubProcess_lane')\n    ];\n\n    // when\n    contextPad.open(elements);\n\n    // then\n    expect(getEntry(elements, 'align-elements')).to.exist;\n  }));\n\n\n  it('should NOT provide button if no actions are available', inject(\n    function(elementRegistry, contextPad, popupMenu) {\n\n      // given\n      var elements = [\n        elementRegistry.get('EndEvent_lane'),\n        elementRegistry.get('Task_lane'),\n        elementRegistry.get('SubProcess_lane')\n      ];\n      popupMenu.registerProvider('align-elements', 0, {\n        getPopupMenuEntries: function() {\n          return function() {\n            return {};\n          };\n        }\n      });\n\n      // when\n      contextPad.open(elements);\n\n      // then\n      expect(getEntry(elements, 'align-elements')).not.to.exist;\n    })\n  );\n\n\n  it('should open popup menu when item is clicked', inject(\n    function(elementRegistry, contextPad, popupMenu) {\n\n      // given\n      var elements = [\n        elementRegistry.get('EndEvent_lane'),\n        elementRegistry.get('Task_lane'),\n        elementRegistry.get('SubProcess_lane')\n      ];\n      contextPad.open(elements);\n\n      // when\n      var entry = getEntry(elements, 'align-elements');\n      entry.click();\n\n      // then\n      expect(popupMenu.isOpen()).to.be.true;\n    })\n  );\n});\n\n\n// helper //////////////////////////////////////////////////////////////////////\nfunction getEntry(target, actionName) {\n  return padEntry(getBpmnJS().invoke(function(contextPad) {\n    return contextPad.getPad(target).html;\n  }), actionName);\n}\n\nfunction padEntry(element, name) {\n  return domQuery('[data-action=\"' + name + '\"]', element);\n}\n"
  },
  {
    "path": "test/spec/features/align-elements/AlignElementsMenuProviderSpec.js",
    "content": "import {\n  bootstrapModeler,\n  getBpmnJS,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  query as domQuery\n} from 'min-dom';\n\nimport {\n  forEach\n} from 'min-dash';\n\nimport alignElementsModule from 'lib/features/align-elements';\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\n\ndescribe('features/align-elements - popup menu', function() {\n\n  var testModules = [ alignElementsModule, modelingModule, coreModule ];\n\n  var basicXML = require('../../../fixtures/bpmn/align-elements.bpmn');\n\n  beforeEach(bootstrapModeler(basicXML, { modules: testModules }));\n\n\n  it('should provide alignment buttons', inject(function(elementRegistry, popupMenu) {\n\n    // given\n    var elements = [\n      elementRegistry.get('EndEvent_lane'),\n      elementRegistry.get('Task_lane'),\n      elementRegistry.get('SubProcess_lane')\n    ];\n\n    // when\n    popupMenu.open(elements, 'align-elements', {\n      x: 0,\n      y: 0\n    });\n\n    // then\n    forEach([\n      'left',\n      'center',\n      'right',\n      'top',\n      'middle',\n      'bottom'\n    ], function(alignment) {\n      expect(getEntry('align-elements-' + alignment)).to.exist;\n    });\n  }));\n\n\n  it('should close popup menu when button is clicked', inject(\n    function(elementRegistry, popupMenu) {\n\n      // given\n      var elements = [\n        elementRegistry.get('EndEvent_lane'),\n        elementRegistry.get('Task_lane'),\n        elementRegistry.get('SubProcess_lane')\n      ];\n      popupMenu.open(elements, 'align-elements', {\n        x: 0,\n        y: 0\n      });\n      var entry = getEntry('align-elements-center');\n\n      // when\n      entry.click();\n\n      // then\n      expect(popupMenu.isOpen()).to.be.false;\n    })\n  );\n\n\n  it('should properly size icons even with border-box', inject(function(elementRegistry, popupMenu, canvas) {\n\n    // given\n    var container = canvas.getContainer();\n    var elements = [\n      elementRegistry.get('EndEvent_lane'),\n      elementRegistry.get('Task_lane'),\n      elementRegistry.get('SubProcess_lane')\n    ];\n\n    // when\n    container.style['box-sizing'] = 'border-box';\n    popupMenu.open(elements, 'align-elements', {\n      x: 0,\n      y: 0\n    });\n\n    // then\n    var entry = getEntry('align-elements-left'),\n        icon = domQuery('svg', entry);\n\n    var bbox = icon.getBoundingClientRect();\n\n    expect(bbox.width).to.eql(20);\n    expect(bbox.height).to.eql(20);\n  }));\n});\n\n\n// helper //////////////////////////////////////////////////////////////////////\nfunction getEntry(actionName) {\n  return padEntry(getBpmnJS().invoke(function(popupMenu) {\n    return popupMenu._current.container;\n  }), actionName);\n}\n\nfunction padEntry(element, name) {\n  return domQuery('[data-id=\"' + name + '\"]', element);\n}\n"
  },
  {
    "path": "test/spec/features/align-elements/BpmnAlignElementsSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport alignElementsModule from 'lib/features/align-elements';\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/align-elements', function() {\n\n  var testModules = [ alignElementsModule, modelingModule, coreModule ];\n\n  var basicXML = require('../../../fixtures/bpmn/align-elements.bpmn');\n\n  beforeEach(bootstrapModeler(basicXML, { modules: testModules }));\n\n  describe('integration', function() {\n\n    it('should align to the left', inject(function(elementRegistry, alignElements) {\n\n      // given\n      var taskBoundEvt = elementRegistry.get('Task_boundary_evt'),\n          task = elementRegistry.get('Task_lane'),\n          subProcess = elementRegistry.get('SubProcess_lane'),\n          endEvent = elementRegistry.get('EndEvent_lane'),\n          elements = [ taskBoundEvt, task, subProcess, endEvent ];\n\n      // when\n      alignElements.trigger(elements, 'left');\n\n      // then\n      expect(taskBoundEvt.x).to.equal(276);\n      expect(task.x).to.equal(276);\n      expect(subProcess.x).to.equal(276);\n      expect(endEvent.x).to.equal(276);\n    }));\n\n\n    it('should align to the right', inject(function(elementRegistry, alignElements) {\n\n      // given\n      var taskHello = elementRegistry.get('Task_hello'),\n          task = elementRegistry.get('Task_lane'),\n          subProcess = elementRegistry.get('SubProcess_lane'),\n          endEvent = elementRegistry.get('EndEvent_lane'),\n          elements = [ taskHello, task, subProcess, endEvent ];\n\n      // when\n      alignElements.trigger(elements, 'right');\n\n      // then\n      expect(task.x).to.equal(860);\n      expect(taskHello.x).to.equal(860);\n      expect(subProcess.x).to.equal(610);\n      expect(endEvent.x).to.equal(924);\n    }));\n\n\n    it('should align to the center', inject(function(elementRegistry, alignElements) {\n\n      // given\n      var task = elementRegistry.get('Task_lane'),\n          taskHello = elementRegistry.get('Task_hello'),\n          subProcess = elementRegistry.get('SubProcess_lane'),\n          endEvent = elementRegistry.get('EndEvent_lane'),\n          elements = [ task, taskHello, subProcess, endEvent ];\n\n      // when\n      alignElements.trigger(elements, 'center');\n\n      // then\n      expect(task.x).to.equal(568);\n      expect(taskHello.x).to.equal(568);\n      expect(subProcess.x).to.equal(443);\n      expect(endEvent.x).to.equal(600);\n    }));\n\n\n    it('should align to the top', inject(function(elementRegistry, alignElements) {\n\n      // given\n      var task = elementRegistry.get('Task_lane'),\n          subProcess = elementRegistry.get('SubProcess_lane'),\n          endEvent = elementRegistry.get('EndEvent_lane'),\n          elements = [ task, subProcess, endEvent ];\n\n      // when\n      alignElements.trigger(elements, 'top');\n\n      // then\n      expect(task.y).to.equal(445);\n      expect(subProcess.y).to.equal(445);\n      expect(endEvent.y).to.equal(445);\n    }));\n\n\n    it('should align to the bottom', inject(function(elementRegistry, alignElements) {\n\n      // given\n      var task = elementRegistry.get('Task_lane'),\n          subProcess = elementRegistry.get('SubProcess_lane'),\n          endEvent = elementRegistry.get('EndEvent_lane'),\n          elements = [ task, subProcess, endEvent ];\n\n      // when\n      alignElements.trigger(elements, 'bottom');\n\n      // then\n      expect(task.y).to.equal(831);\n      expect(subProcess.y).to.equal(711);\n      expect(endEvent.y).to.equal(875);\n    }));\n\n\n    it('should align to the middle', inject(function(elementRegistry, alignElements) {\n\n      // given\n      var task = elementRegistry.get('Task_lane'),\n          subProcess = elementRegistry.get('SubProcess_lane'),\n          endEvent = elementRegistry.get('EndEvent_lane'),\n          elements = [ task, subProcess, endEvent ];\n\n      // when\n      alignElements.trigger(elements, 'middle');\n\n      // then\n      expect(task.y).to.equal(638);\n      expect(subProcess.y).to.equal(578);\n      expect(endEvent.y).to.equal(660);\n    }));\n\n  });\n\n\n  describe('rules', function() {\n\n    it('should not align boundary event', inject(function(alignElements, elementRegistry) {\n\n      // given\n      var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n          host = elementRegistry.get('Task_boundary_evt');\n      var elements = [\n        host,\n        elementRegistry.get('Task_hello'),\n        boundaryEvent\n      ];\n      var initialRelativePosition = {\n        x: boundaryEvent.x - host.x,\n        y: boundaryEvent.y - host.y\n      };\n\n      // when\n      alignElements.trigger(elements, 'middle');\n\n      // then\n      expect(boundaryEvent.x).to.equal(initialRelativePosition.x + host.x);\n      expect(boundaryEvent.y).to.equal(initialRelativePosition.y + host.y);\n    }));\n\n\n    it('should not align container children', inject(\n      function(alignElements, elementRegistry) {\n\n        // given\n        var elements = elementRegistry.getAll('SubProcessChild').slice(1),\n            child = elementRegistry.get('Task_hello');\n        var initialRelativePosition = {\n          x: child.x - child.parent.x,\n          y: child.y - child.parent.y\n        };\n\n        // when\n        alignElements.trigger(elements, 'middle');\n\n        // then\n        expect(child.x).to.equal(initialRelativePosition.x + child.parent.x);\n        expect(child.y).to.equal(initialRelativePosition.y + child.parent.y);\n      })\n    );\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/append-preview/AppendPreview.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_0sp5wo7\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.16.0\" modeler:executionPlatform=\"Camunda Cloud\" modeler:executionPlatformVersion=\"8.3.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:startEvent id=\"StartEvent_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"179\" y=\"79\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/append-preview/AppendPreviewSpec.js",
    "content": "import { queryAll as domQueryAll } from 'min-dom';\n\nimport {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport appendPreviewModule from 'lib/features/append-preview';\nimport coreModule from 'lib/core';\n\ndescribe('features/append-preview', function() {\n\n  var diagramXML = require('./AppendPreview.bpmn');\n\n  before(bootstrapModeler(diagramXML, {\n    modules: [\n      coreModule,\n      appendPreviewModule\n    ]\n  }));\n\n\n  it('should create', inject(function(appendPreview, canvas, elementRegistry) {\n\n    // given\n    var startEvent = elementRegistry.get('StartEvent_1');\n\n    // when\n    appendPreview.create(startEvent, 'bpmn:Task');\n\n    // then\n    expect(canvas.getLayer('complex-preview')).to.exist;\n    expect(domQueryAll('.djs-dragger', canvas.getLayer('complex-preview'))).to.have.length(2);\n  }));\n\n\n  it('should clean up', inject(function(appendPreview, canvas, elementRegistry) {\n\n    // given\n    var startEvent = elementRegistry.get('StartEvent_1');\n\n    // when\n    appendPreview.create(startEvent, 'bpmn:Task');\n\n    // assume\n    expect(canvas.getLayer('complex-preview')).to.exist;\n    expect(domQueryAll('.djs-dragger', canvas.getLayer('complex-preview'))).to.have.length(2);\n\n    // when\n    appendPreview.cleanUp();\n\n    // then\n    expect(domQueryAll('.djs-dragger', canvas.getLayer('complex-preview'))).to.be.empty;\n  }));\n\n});"
  },
  {
    "path": "test/spec/features/auto-place/BpmnAutoPlace.boundary-events.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"http://bpmn.io\" exporterVersion=\"0.10.1\">\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <task id=\"TASK_1\" name=\"TASK_1\">\n      <outgoing>SequenceFlow_0o6gp3o</outgoing>\n    </task>\n    <boundaryEvent id=\"BOUNDARY_BOTTOM\" name=\"BOUNDARY_BOTTOM\" attachedToRef=\"TASK_1\" />\n    <task id=\"TASK_2\" name=\"TASK_2\">\n      <incoming>SequenceFlow_0o6gp3o</incoming>\n    </task>\n    <sequenceFlow id=\"SequenceFlow_0o6gp3o\" sourceRef=\"TASK_1\" targetRef=\"TASK_2\" />\n    <task id=\"TASK_3\" name=\"TASK_3\" />\n    <boundaryEvent id=\"BOUNDARY_TOP\" name=\"BOUNDARY_TOP\" attachedToRef=\"TASK_1\" />\n    <boundaryEvent id=\"BOUNDARY_TOP_RIGHT\" name=\"BOUNDARY_TOP_RIGHT\" attachedToRef=\"TASK_2\" />\n    <subProcess id=\"SUBPROCESS\" name=\"SUBPROCESS\" />\n    <boundaryEvent id=\"BOUNDARY_SUBPROCESS_BOTTOM\" name=\"BOUNDARY_SUBPROCESS_BOTTOM\" attachedToRef=\"SUBPROCESS\" />\n    <boundaryEvent id=\"BOUNDARY_SUBPROCESS_TOP\" name=\"BOUNDARY_SUBPROCESS_TOP\" attachedToRef=\"SUBPROCESS\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"TASK_1_di\" bpmnElement=\"TASK_1\">\n        <omgdc:Bounds x=\"121\" y=\"93\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BOUNDARY_BOTTOM_di\" bpmnElement=\"BOUNDARY_BOTTOM\">\n        <omgdc:Bounds x=\"155\" y=\"155\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"72\" y=\"188\" width=\"87\" height=\"24\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TASK_2_di\" bpmnElement=\"TASK_2\">\n        <omgdc:Bounds x=\"305\" y=\"93\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0o6gp3o_di\" bpmnElement=\"SequenceFlow_0o6gp3o\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"221\" y=\"133\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"305\" y=\"133\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"263\" y=\"112\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"TASK_3_di\" bpmnElement=\"TASK_3\">\n        <omgdc:Bounds x=\"305\" y=\"203\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BOUNDARY_TOP_di\" bpmnElement=\"BOUNDARY_TOP\">\n        <omgdc:Bounds x=\"156\" y=\"75\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"78\" y=\"52\" width=\"86\" height=\"24\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BOUNDARY_TOP_RIGHT_di\" bpmnElement=\"BOUNDARY_TOP_RIGHT\">\n        <omgdc:Bounds x=\"387\" y=\"75\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"363\" y=\"44\" width=\"84\" height=\"24\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SUBPROCESS_di\" bpmnElement=\"SUBPROCESS\" isExpanded=\"true\">\n        <omgdc:Bounds x=\"142\" y=\"314\" width=\"258\" height=\"141\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BOUNDARY_SUBPROCESS_BOTTOM_di\" bpmnElement=\"BOUNDARY_SUBPROCESS_BOTTOM\">\n        <omgdc:Bounds x=\"192\" y=\"437\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"110\" y=\"473\" width=\"86\" height=\"36\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BOUNDARY_SUBPROCESS_TOP_di\" bpmnElement=\"BOUNDARY_SUBPROCESS_TOP\">\n        <omgdc:Bounds x=\"189\" y=\"296\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"98\" y=\"259\" width=\"86\" height=\"36\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/auto-place/BpmnAutoPlace.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"18.3.1\">\n  <bpmn:collaboration id=\"Collaboration_09g5uaj\">\n    <bpmn:participant id=\"Participant_1hdbpnb\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Participant_0m1jnxc\" processRef=\"Process_0zt9gmm\" />\n    <bpmn:messageFlow id=\"MessageFlow_1\" sourceRef=\"Participant_0m1jnxc\" targetRef=\"TASK_2\" />\n    <bpmn:textAnnotation id=\"TextAnnotation_0czqc1j\" />\n    <bpmn:association id=\"Association_1ebqqnb\" sourceRef=\"TASK_3\" targetRef=\"TextAnnotation_0czqc1j\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>SequenceFlow_16tlpj7</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"TASK_0\" name=\"TASK_0\">\n      <bpmn:incoming>SequenceFlow_16tlpj7</bpmn:incoming>\n      <bpmn:incoming>SequenceFlow_19p2kv6</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:task id=\"TASK_3\" name=\"TASK_3\">\n      <bpmn:outgoing>SequenceFlow_18dnq8n</bpmn:outgoing>\n      <bpmn:dataOutputAssociation id=\"DataOutputAssociation_16lcc1g\">\n        <bpmn:targetRef>DataStoreReference_0r0lie7</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n    </bpmn:task>\n    <bpmn:task id=\"TASK_4\" name=\"TASK_4\">\n      <bpmn:incoming>SequenceFlow_18dnq8n</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:task id=\"TASK_5\" name=\"TASK_5\">\n      <bpmn:incoming>SequenceFlow_0n4l6q7</bpmn:incoming>\n      <bpmn:incoming>SequenceFlow_10nwqsy</bpmn:incoming>\n      <bpmn:incoming>SequenceFlow_13ubee5</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:startEvent id=\"StartEvent_0wxeenz\">\n      <bpmn:outgoing>SequenceFlow_0n4l6q7</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:startEvent id=\"StartEvent_1m0lwft\">\n      <bpmn:outgoing>SequenceFlow_10nwqsy</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:startEvent id=\"StartEvent_06jwo6i\">\n      <bpmn:outgoing>SequenceFlow_13ubee5</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:startEvent id=\"START_EVENT_1\" name=\"START_EVENT_1\" />\n    <bpmn:intermediateThrowEvent id=\"IntermediateThrowEvent_0yy98gf\">\n      <bpmn:outgoing>SequenceFlow_19p2kv6</bpmn:outgoing>\n    </bpmn:intermediateThrowEvent>\n    <bpmn:dataStoreReference id=\"DataStoreReference_0r0lie7\" />\n    <bpmn:subProcess id=\"SUBPROCESS_1\" name=\"SUBPROCESS_1\">\n      <bpmn:task id=\"TASK_6\" name=\"TASK_6\" />\n    </bpmn:subProcess>\n    <bpmn:sequenceFlow id=\"SequenceFlow_16tlpj7\" sourceRef=\"StartEvent_1\" targetRef=\"TASK_0\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_19p2kv6\" sourceRef=\"IntermediateThrowEvent_0yy98gf\" targetRef=\"TASK_0\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_18dnq8n\" sourceRef=\"TASK_3\" targetRef=\"TASK_4\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_0n4l6q7\" sourceRef=\"StartEvent_0wxeenz\" targetRef=\"TASK_5\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_10nwqsy\" sourceRef=\"StartEvent_1m0lwft\" targetRef=\"TASK_5\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_13ubee5\" sourceRef=\"StartEvent_06jwo6i\" targetRef=\"TASK_5\" />\n    <bpmn:task id=\"TASK_1\" name=\"TASK_1\">\n      <bpmn:incoming>SequenceFlow_0s1mty3</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:startEvent id=\"StartEvent_0f2fdfi\">\n      <bpmn:outgoing>SequenceFlow_0s1mty3</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"TASK_2\" name=\"TASK_2\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_0s1mty3\" sourceRef=\"StartEvent_0f2fdfi\" targetRef=\"TASK_1\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"TASK_1\" targetRef=\"TASK_2\" />\n  </bpmn:process>\n  <bpmn:process id=\"Process_0zt9gmm\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_09g5uaj\">\n      <bpmndi:BPMNShape id=\"Participant_1hdbpnb_di\" bpmnElement=\"Participant_1hdbpnb\" isHorizontal=\"true\">\n        <dc:Bounds x=\"160\" y=\"85\" width=\"1190\" height=\"550\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"244\" y=\"176\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"17\" y=\"112\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TASK_0_di\" bpmnElement=\"TASK_0\">\n        <dc:Bounds x=\"321\" y=\"154\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TASK_3_di\" bpmnElement=\"TASK_3\">\n        <dc:Bounds x=\"796\" y=\"227\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TASK_4_di\" bpmnElement=\"TASK_4\">\n        <dc:Bounds x=\"1230\" y=\"227\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TASK_5_di\" bpmnElement=\"TASK_5\">\n        <dc:Bounds x=\"321\" y=\"490\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_0wxeenz_di\" bpmnElement=\"StartEvent_0wxeenz\">\n        <dc:Bounds x=\"210\" y=\"453\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"-17\" y=\"393\" width=\"90\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1m0lwft_di\" bpmnElement=\"StartEvent_1m0lwft\">\n        <dc:Bounds x=\"244\" y=\"512\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"17\" y=\"452\" width=\"90\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_06jwo6i_di\" bpmnElement=\"StartEvent_06jwo6i\">\n        <dc:Bounds x=\"210\" y=\"579\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"-17\" y=\"519\" width=\"90\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"START_EVENT_1_di\" bpmnElement=\"START_EVENT_1\">\n        <dc:Bounds x=\"1166\" y=\"346\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"1142\" y=\"386\" width=\"85\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_0yy98gf_di\" bpmnElement=\"IntermediateThrowEvent_0yy98gf\">\n        <dc:Bounds x=\"419\" y=\"105\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"192\" y=\"45\" width=\"90\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_0r0lie7_di\" bpmnElement=\"DataStoreReference_0r0lie7\">\n        <dc:Bounds x=\"889\" y=\"345\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"669\" y=\"299\" width=\"90\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TASK_1_di\" bpmnElement=\"TASK_1\">\n        <dc:Bounds x=\"321\" y=\"290\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_0f2fdfi_di\" bpmnElement=\"StartEvent_0f2fdfi\">\n        <dc:Bounds x=\"244\" y=\"312\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"17\" y=\"241\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TASK_2_di\" bpmnElement=\"TASK_2\">\n        <dc:Bounds x=\"479\" y=\"290\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SUBPROCESS_1_di\" bpmnElement=\"SUBPROCESS_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"725\" y=\"408\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TASK_6_di\" bpmnElement=\"TASK_6\">\n        <dc:Bounds x=\"750\" y=\"470\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_16tlpj7_di\" bpmnElement=\"SequenceFlow_16tlpj7\">\n        <di:waypoint x=\"280\" y=\"194\" />\n        <di:waypoint x=\"321\" y=\"194\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"100.5\" y=\"73\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_19p2kv6_di\" bpmnElement=\"SequenceFlow_19p2kv6\">\n        <di:waypoint x=\"419\" y=\"123\" />\n        <di:waypoint x=\"371\" y=\"123\" />\n        <di:waypoint x=\"371\" y=\"154\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"150\" y=\"2\" width=\"90\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_18dnq8n_di\" bpmnElement=\"SequenceFlow_18dnq8n\">\n        <di:waypoint x=\"896\" y=\"267\" />\n        <di:waypoint x=\"1230\" y=\"267\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"818\" y=\"146\" width=\"90\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0n4l6q7_di\" bpmnElement=\"SequenceFlow_0n4l6q7\">\n        <di:waypoint x=\"246\" y=\"471\" />\n        <di:waypoint x=\"284\" y=\"471\" />\n        <di:waypoint x=\"284\" y=\"508\" />\n        <di:waypoint x=\"321\" y=\"508\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"54\" y=\"384\" width=\"90\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_10nwqsy_di\" bpmnElement=\"SequenceFlow_10nwqsy\">\n        <di:waypoint x=\"280\" y=\"530\" />\n        <di:waypoint x=\"321\" y=\"530\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"56\" y=\"409\" width=\"90\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_13ubee5_di\" bpmnElement=\"SequenceFlow_13ubee5\">\n        <di:waypoint x=\"246\" y=\"597\" />\n        <di:waypoint x=\"284\" y=\"597\" />\n        <di:waypoint x=\"284\" y=\"549\" />\n        <di:waypoint x=\"321\" y=\"549\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"54\" y=\"467\" width=\"90\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0s1mty3_di\" bpmnElement=\"SequenceFlow_0s1mty3\">\n        <di:waypoint x=\"280\" y=\"330\" />\n        <di:waypoint x=\"321\" y=\"330\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"100.5\" y=\"202\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"421\" y=\"330\" />\n        <di:waypoint x=\"479\" y=\"330\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"250\" y=\"202\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Participant_0m1jnxc_di\" bpmnElement=\"Participant_0m1jnxc\" isHorizontal=\"true\">\n        <dc:Bounds x=\"160\" y=\"720\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_0czqc1j_di\" bpmnElement=\"TextAnnotation_0czqc1j\">\n        <dc:Bounds x=\"898\" y=\"156\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_16lcc1g_di\" bpmnElement=\"DataOutputAssociation_16lcc1g\">\n        <di:waypoint x=\"871\" y=\"307\" />\n        <di:waypoint x=\"895\" y=\"345\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Association_1ebqqnb_di\" bpmnElement=\"Association_1ebqqnb\">\n        <di:waypoint x=\"887\" y=\"228\" />\n        <di:waypoint x=\"932\" y=\"186\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"MessageFlow_1_di\" bpmnElement=\"MessageFlow_1\">\n        <di:waypoint x=\"529\" y=\"720\" />\n        <di:waypoint x=\"529\" y=\"370\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/auto-place/BpmnAutoPlace.multi-connection.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"TASK_1\" name=\"TASK_1\">\n      <bpmn:outgoing>SequenceFlow_0uj471x</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_0sys8ww</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_1q8yl3p</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_1dh9p3h</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"TASK_2\" name=\"TASK_2\">\n      <bpmn:incoming>SequenceFlow_0uj471x</bpmn:incoming>\n      <bpmn:incoming>SequenceFlow_1dh9p3h</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_0uj471x\" sourceRef=\"TASK_1\" targetRef=\"TASK_2\" />\n    <bpmn:task id=\"TASK_3\" name=\"TASK_3\">\n      <bpmn:incoming>SequenceFlow_0sys8ww</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_0sys8ww\" sourceRef=\"TASK_1\" targetRef=\"TASK_3\" />\n    <bpmn:task id=\"TASK_4\" name=\"TASK_4\">\n      <bpmn:incoming>SequenceFlow_1q8yl3p</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1q8yl3p\" sourceRef=\"TASK_1\" targetRef=\"TASK_4\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_1dh9p3h\" sourceRef=\"TASK_1\" targetRef=\"TASK_2\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"TASK_1_di\" bpmnElement=\"TASK_1\">\n        <dc:Bounds x=\"66.87482219061161\" y=\"115.89615931721193\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TASK_2_di\" bpmnElement=\"TASK_2\">\n        <dc:Bounds x=\"361.8748221906116\" y=\"116\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0uj471x_di\" bpmnElement=\"SequenceFlow_0uj471x\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"167\" y=\"156\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"362\" y=\"156\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"264.5\" y=\"135\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"TASK_3_di\" bpmnElement=\"TASK_3\">\n        <dc:Bounds x=\"206.8748221906116\" y=\"247.89615931721193\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0sys8ww_di\" bpmnElement=\"SequenceFlow_0sys8ww\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"117\" y=\"196\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"117\" y=\"288\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"207\" y=\"288\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"132\" y=\"236\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"TASK_4_di\" bpmnElement=\"TASK_4\">\n        <dc:Bounds x=\"206.8748221906116\" y=\"358.8961593172119\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1q8yl3p_di\" bpmnElement=\"SequenceFlow_1q8yl3p\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"117\" y=\"196\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"117\" y=\"399\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"207\" y=\"399\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"132\" y=\"291.5\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1dh9p3h_di\" bpmnElement=\"SequenceFlow_1dh9p3h\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"117\" y=\"116\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"117\" y=\"50\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"412\" y=\"50\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"412\" y=\"116\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"264.5\" y=\"29\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/auto-place/BpmnAutoPlace.subprocess.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_1phrppp\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.25.0\" modeler:executionPlatform=\"Camunda Cloud\" modeler:executionPlatformVersion=\"8.5.0\">\n  <bpmn:process id=\"Process_0e3fgm1\" isExecutable=\"true\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>Flow_1qlbfsz</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:subProcess id=\"Sub_Process\">\n      <bpmn:incoming>Flow_1qlbfsz</bpmn:incoming>\n      <bpmn:outgoing>Flow_0au85uv</bpmn:outgoing>\n      <bpmn:startEvent id=\"Nested_Start_Event\" />\n    </bpmn:subProcess>\n    <bpmn:sequenceFlow id=\"Flow_1qlbfsz\" sourceRef=\"StartEvent_1\" targetRef=\"Sub_Process\" />\n    <bpmn:endEvent id=\"Event_06byytn\">\n      <bpmn:incoming>Flow_0au85uv</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"Flow_0au85uv\" sourceRef=\"Sub_Process\" targetRef=\"Event_06byytn\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_0e3fgm1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"179\" y=\"159\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0aamzwi_di\" bpmnElement=\"Sub_Process\">\n        <dc:Bounds x=\"270\" y=\"137\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_06byytn_di\" bpmnElement=\"Event_06byytn\">\n        <dc:Bounds x=\"432\" y=\"159\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1qlbfsz_di\" bpmnElement=\"Flow_1qlbfsz\">\n        <di:waypoint x=\"215\" y=\"177\" />\n        <di:waypoint x=\"270\" y=\"177\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0au85uv_di\" bpmnElement=\"Flow_0au85uv\">\n        <di:waypoint x=\"370\" y=\"177\" />\n        <di:waypoint x=\"432\" y=\"177\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_01vxuwr\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0kcojux\" bpmnElement=\"Sub_Process\">\n      <bpmndi:BPMNShape id=\"Event_08tsh87_di\" bpmnElement=\"Nested_Start_Event\">\n        <dc:Bounds x=\"179\" y=\"79\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/auto-place/BpmnAutoPlace.subprocess.horizontal.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_1ovis1u\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.25.0\" modeler:executionPlatform=\"Camunda Cloud\" modeler:executionPlatformVersion=\"8.5.0\">\n  <bpmn:collaboration id=\"Collaboration_0dgrh13\">\n    <bpmn:participant id=\"Participant_0c4fywu\" name=\"Horizontal Participant\" processRef=\"Process_1vizv6s\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1vizv6s\" isExecutable=\"true\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>Flow_1jtt4p9</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:endEvent id=\"Event_1qgvgxz\">\n      <bpmn:incoming>Flow_06nuoit</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:subProcess id=\"Sub_Process\">\n      <bpmn:incoming>Flow_1jtt4p9</bpmn:incoming>\n      <bpmn:outgoing>Flow_06nuoit</bpmn:outgoing>\n      <bpmn:startEvent id=\"Nested_Start_Event\" />\n    </bpmn:subProcess>\n    <bpmn:sequenceFlow id=\"Flow_1jtt4p9\" sourceRef=\"StartEvent_1\" targetRef=\"Sub_Process\" />\n    <bpmn:sequenceFlow id=\"Flow_06nuoit\" sourceRef=\"Sub_Process\" targetRef=\"Event_1qgvgxz\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_0dgrh13\">\n      <bpmndi:BPMNShape id=\"Participant_0c4fywu_di\" bpmnElement=\"Participant_0c4fywu\" isHorizontal=\"true\">\n        <dc:Bounds x=\"130\" y=\"82\" width=\"600\" height=\"250\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"189\" y=\"189\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1qgvgxz_di\" bpmnElement=\"Event_1qgvgxz\">\n        <dc:Bounds x=\"442\" y=\"189\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1mo1y9x_di\" bpmnElement=\"Sub_Process\">\n        <dc:Bounds x=\"280\" y=\"167\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1jtt4p9_di\" bpmnElement=\"Flow_1jtt4p9\">\n        <di:waypoint x=\"225\" y=\"207\" />\n        <di:waypoint x=\"280\" y=\"207\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_06nuoit_di\" bpmnElement=\"Flow_06nuoit\">\n        <di:waypoint x=\"380\" y=\"207\" />\n        <di:waypoint x=\"442\" y=\"207\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_0gq0ymm\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0xsxkoi\" bpmnElement=\"Sub_Process\">\n      <bpmndi:BPMNShape id=\"Event_1j73q1w_di\" bpmnElement=\"Nested_Start_Event\">\n        <dc:Bounds x=\"179\" y=\"99\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/auto-place/BpmnAutoPlace.subprocess.vertical.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_1jxp3r0\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.25.0\" modeler:executionPlatform=\"Camunda Cloud\" modeler:executionPlatformVersion=\"8.5.0\">\n  <bpmn:collaboration id=\"Collaboration_06osak8\">\n    <bpmn:participant id=\"Participant_18fv1fi\" name=\"Vertical Participant\" processRef=\"Process_1lyi61o\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1lyi61o\" isExecutable=\"true\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>Flow_1ijzj0g</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:sequenceFlow id=\"Flow_1ijzj0g\" sourceRef=\"StartEvent_1\" targetRef=\"Sub_Process\" />\n    <bpmn:subProcess id=\"Sub_Process\">\n      <bpmn:incoming>Flow_1ijzj0g</bpmn:incoming>\n      <bpmn:outgoing>Flow_01mvjj3</bpmn:outgoing>\n      <bpmn:startEvent id=\"Nested_Start_Event\" />\n    </bpmn:subProcess>\n    <bpmn:endEvent id=\"Event_1me7vnf\">\n      <bpmn:incoming>Flow_01mvjj3</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"Flow_01mvjj3\" sourceRef=\"Sub_Process\" targetRef=\"Event_1me7vnf\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_06osak8\">\n      <bpmndi:BPMNShape id=\"Participant_18fv1fi_di\" bpmnElement=\"Participant_18fv1fi\" isHorizontal=\"false\">\n        <dc:Bounds x=\"82\" y=\"130\" width=\"250\" height=\"600\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"189\" y=\"189\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0i9698c_di\" bpmnElement=\"Sub_Process\">\n        <dc:Bounds x=\"157\" y=\"280\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1me7vnf_di\" bpmnElement=\"Event_1me7vnf\">\n        <dc:Bounds x=\"189\" y=\"422\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1ijzj0g_di\" bpmnElement=\"Flow_1ijzj0g\">\n        <di:waypoint x=\"207\" y=\"225\" />\n        <di:waypoint x=\"207\" y=\"280\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_01mvjj3_di\" bpmnElement=\"Flow_01mvjj3\">\n        <di:waypoint x=\"207\" y=\"360\" />\n        <di:waypoint x=\"207\" y=\"422\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_03lwc42\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0ciovsg\" bpmnElement=\"Sub_Process\">\n      <bpmndi:BPMNShape id=\"Event_1hsswpp_di\" bpmnElement=\"Nested_Start_Event\">\n        <dc:Bounds x=\"159\" y=\"79\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/auto-place/BpmnAutoPlace.vertical.boundary-events.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.20.0\">\n  <collaboration id=\"Collaboration_00uhzgy\">\n    <participant id=\"Participant_0z8w6pv\" name=\"Vertical Container\" processRef=\"Process_0d17hu8\" />\n  </collaboration>\n  <process id=\"Process_0d17hu8\" isExecutable=\"false\">\n    <task id=\"V_TASK_1\" name=\"TASK_1\">\n      <outgoing>Flow_1y0zvux</outgoing>\n    </task>\n    <task id=\"V_TASK_2\" name=\"TASK_2\">\n      <incoming>Flow_1y0zvux</incoming>\n    </task>\n    <task id=\"V_TASK_3\" name=\"TASK_3\" />\n    <subProcess id=\"V_SUBPROCESS\" name=\"SUBPROCESS\" />\n    <boundaryEvent id=\"V_BOUNDARY_LEFT\" name=\"BOUNDARY_LEFT\" attachedToRef=\"V_TASK_1\" />\n    <boundaryEvent id=\"V_BOUNDARY_RIGHT\" name=\"BOUNDARY_RIGHT\" attachedToRef=\"V_TASK_1\" />\n    <boundaryEvent id=\"V_BOUNDARY_BOTTOM_LEFT\" name=\"BOUNDARY_BOTTOM_LEFT\" attachedToRef=\"V_TASK_2\" />\n    <boundaryEvent id=\"V_BOUNDARY_SUBPROCESS_LEFT\" name=\"BOUNDARY_SUBPROCESS_LEFT\" attachedToRef=\"V_SUBPROCESS\" />\n    <boundaryEvent id=\"V_BOUNDARY_SUBPROCESS_RIGHT\" name=\"BOUNDARY_SUBPROCESS_RIGHT\" attachedToRef=\"V_SUBPROCESS\" />\n    <sequenceFlow id=\"Flow_1y0zvux\" sourceRef=\"V_TASK_1\" targetRef=\"V_TASK_2\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Collaboration_00uhzgy\">\n      <bpmndi:BPMNShape id=\"Participant_0z8w6pv_di\" bpmnElement=\"Participant_0z8w6pv\" isHorizontal=\"false\">\n        <omgdc:Bounds x=\"150\" y=\"70\" width=\"720\" height=\"460\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_128m38c_di\" bpmnElement=\"V_TASK_1\">\n        <omgdc:Bounds x=\"280\" y=\"160\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0yg8kwt_di\" bpmnElement=\"V_TASK_2\">\n        <omgdc:Bounds x=\"280\" y=\"290\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0x017g4_di\" bpmnElement=\"V_TASK_3\">\n        <omgdc:Bounds x=\"410\" y=\"290\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1m7ggp4_di\" bpmnElement=\"V_SUBPROCESS\" isExpanded=\"true\">\n        <omgdc:Bounds x=\"560\" y=\"160\" width=\"140\" height=\"250\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1eqqcds_di\" bpmnElement=\"V_BOUNDARY_SUBPROCESS_RIGHT\">\n        <omgdc:Bounds x=\"682\" y=\"192\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"718\" y=\"160\" width=\"84\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0o5rw4a_di\" bpmnElement=\"V_BOUNDARY_SUBPROCESS_LEFT\">\n        <omgdc:Bounds x=\"542\" y=\"192\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"468\" y=\"150\" width=\"84\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0g6qahc_di\" bpmnElement=\"V_BOUNDARY_BOTTOM_LEFT\">\n        <omgdc:Bounds x=\"262\" y=\"352\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"238\" y=\"395\" width=\"85\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0ppxmxi_di\" bpmnElement=\"V_BOUNDARY_RIGHT\">\n        <omgdc:Bounds x=\"362\" y=\"182\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"381\" y=\"156\" width=\"80\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0e90iez_di\" bpmnElement=\"V_BOUNDARY_LEFT\">\n        <omgdc:Bounds x=\"262\" y=\"182\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"199\" y=\"156\" width=\"82\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1y0zvux_di\" bpmnElement=\"Flow_1y0zvux\">\n        <omgdi:waypoint x=\"330\" y=\"240\" />\n        <omgdi:waypoint x=\"330\" y=\"290\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/auto-place/BpmnAutoPlace.vertical.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_1ignc9k\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.19.0\" modeler:executionPlatform=\"Camunda Cloud\" modeler:executionPlatformVersion=\"8.4.0\">\n  <bpmn:collaboration id=\"Collaboration_0p66v1k\">\n    <bpmn:participant id=\"Participant_19mkn6l\" name=\"Vertical Container\" processRef=\"Process_0f5io8u\" />\n    <bpmn:textAnnotation id=\"TextAnnotation_0mgb6fp\" />\n    <bpmn:association id=\"Association_0r7uwu2\" associationDirection=\"None\" sourceRef=\"V_Task_3\" targetRef=\"TextAnnotation_0mgb6fp\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_0f5io8u\" isExecutable=\"true\">\n    <bpmn:laneSet id=\"LaneSet_0dssf78\" />\n    <bpmn:startEvent id=\"Start_Event_0\">\n      <bpmn:outgoing>Flow_1mfxkzi</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"V_Task_0\" name=\"V_Task_0\">\n      <bpmn:incoming>Flow_1mfxkzi</bpmn:incoming>\n      <bpmn:incoming>Flow_0hd2tlx</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:intermediateThrowEvent id=\"Event_11wc1st\">\n      <bpmn:outgoing>Flow_0hd2tlx</bpmn:outgoing>\n    </bpmn:intermediateThrowEvent>\n    <bpmn:startEvent id=\"Start_Event_1\">\n      <bpmn:outgoing>Flow_05pkcjk</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"V_Task_1\" name=\"V_Task_1\">\n      <bpmn:incoming>Flow_05pkcjk</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"V_Task_3\" name=\"V_Task_3\">\n      <bpmn:outgoing>Flow_1atamhe</bpmn:outgoing>\n      <bpmn:dataOutputAssociation id=\"DataOutputAssociation_0ztmifm\">\n        <bpmn:targetRef>DataStoreReference_0urqui4</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n    </bpmn:task>\n    <bpmn:task id=\"V_Task_4\" name=\"V_Task_4\">\n      <bpmn:incoming>Flow_1atamhe</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:task id=\"V_Task_5\" name=\"V_Task_5\">\n      <bpmn:incoming>Flow_07bte1m</bpmn:incoming>\n      <bpmn:incoming>Flow_1u4h0mv</bpmn:incoming>\n      <bpmn:incoming>Flow_1fj63ew</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:startEvent id=\"Start_Event_5c\">\n      <bpmn:outgoing>Flow_1fj63ew</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"V_Task_2\" name=\"V_Task_2\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:subProcess id=\"V_Sub_Process_1\" name=\"V_Sub_Process_1\">\n      <bpmn:task id=\"V_TASK_6\" name=\"V_TASK_6\" />\n    </bpmn:subProcess>\n    <bpmn:sequenceFlow id=\"Flow_1mfxkzi\" sourceRef=\"Start_Event_0\" targetRef=\"V_Task_0\" />\n    <bpmn:sequenceFlow id=\"Flow_0hd2tlx\" sourceRef=\"Event_11wc1st\" targetRef=\"V_Task_0\" />\n    <bpmn:sequenceFlow id=\"Flow_05pkcjk\" sourceRef=\"Start_Event_1\" targetRef=\"V_Task_1\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"V_Task_1\" targetRef=\"V_Task_2\" />\n    <bpmn:sequenceFlow id=\"Flow_1atamhe\" sourceRef=\"V_Task_3\" targetRef=\"V_Task_4\" />\n    <bpmn:sequenceFlow id=\"Flow_07bte1m\" sourceRef=\"Start_Event_5b\" targetRef=\"V_Task_5\" />\n    <bpmn:sequenceFlow id=\"Flow_1u4h0mv\" sourceRef=\"Start_Event_5a\" targetRef=\"V_Task_5\" />\n    <bpmn:sequenceFlow id=\"Flow_1fj63ew\" sourceRef=\"Start_Event_5c\" targetRef=\"V_Task_5\" />\n    <bpmn:startEvent id=\"Start_Event\" name=\"Start_Event\" />\n    <bpmn:startEvent id=\"Start_Event_5a\">\n      <bpmn:outgoing>Flow_1u4h0mv</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:startEvent id=\"Start_Event_5b\">\n      <bpmn:outgoing>Flow_07bte1m</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:dataStoreReference id=\"DataStoreReference_0urqui4\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_0p66v1k\">\n      <bpmndi:BPMNShape id=\"Participant_19mkn6l_di\" bpmnElement=\"Participant_19mkn6l\" isHorizontal=\"false\">\n        <dc:Bounds x=\"160\" y=\"80\" width=\"780\" height=\"1150\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0tma4cw_di\" bpmnElement=\"Start_Event_0\">\n        <dc:Bounds x=\"292\" y=\"202\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_07pv6zp_di\" bpmnElement=\"V_Task_0\">\n        <dc:Bounds x=\"260\" y=\"290\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_11wc1st_di\" bpmnElement=\"Event_11wc1st\">\n        <dc:Bounds x=\"202\" y=\"372\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0j193v2_di\" bpmnElement=\"Start_Event_1\">\n        <dc:Bounds x=\"432\" y=\"202\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1mgae2h_di\" bpmnElement=\"V_Task_1\">\n        <dc:Bounds x=\"400\" y=\"290\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_01nha6s_di\" bpmnElement=\"V_Task_3\">\n        <dc:Bounds x=\"320\" y=\"760\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1rsjcrk_di\" bpmnElement=\"V_Task_4\">\n        <dc:Bounds x=\"320\" y=\"1090\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0fm33gl_di\" bpmnElement=\"V_Task_5\">\n        <dc:Bounds x=\"590\" y=\"290\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_082abml_di\" bpmnElement=\"Start_Event_5c\">\n        <dc:Bounds x=\"692\" y=\"172\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0fh6yd7_di\" bpmnElement=\"V_Task_2\">\n        <dc:Bounds x=\"400\" y=\"450\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_0urqui4_di\" bpmnElement=\"DataStoreReference_0urqui4\">\n        <dc:Bounds x=\"225\" y=\"835\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_03j5prr_di\" bpmnElement=\"V_Sub_Process_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"658\" y=\"570\" width=\"182\" height=\"310\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1przuj1_di\" bpmnElement=\"V_TASK_6\">\n        <dc:Bounds x=\"700\" y=\"600\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0zdlsl0_di\" bpmnElement=\"Start_Event\">\n        <dc:Bounds x=\"602\" y=\"1002\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"650\" y=\"1013\" width=\"59\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0iix2qp_di\" bpmnElement=\"Start_Event_5a\">\n        <dc:Bounds x=\"622\" y=\"212\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0axdds6_di\" bpmnElement=\"Start_Event_5b\">\n        <dc:Bounds x=\"582\" y=\"172\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1mfxkzi_di\" bpmnElement=\"Flow_1mfxkzi\">\n        <di:waypoint x=\"310\" y=\"238\" />\n        <di:waypoint x=\"310\" y=\"290\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0hd2tlx_di\" bpmnElement=\"Flow_0hd2tlx\">\n        <di:waypoint x=\"220\" y=\"372\" />\n        <di:waypoint x=\"220\" y=\"330\" />\n        <di:waypoint x=\"260\" y=\"330\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_05pkcjk_di\" bpmnElement=\"Flow_05pkcjk\">\n        <di:waypoint x=\"450\" y=\"238\" />\n        <di:waypoint x=\"450\" y=\"290\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_06dk35w_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"450\" y=\"370\" />\n        <di:waypoint x=\"450\" y=\"450\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1atamhe_di\" bpmnElement=\"Flow_1atamhe\">\n        <di:waypoint x=\"370\" y=\"840\" />\n        <di:waypoint x=\"370\" y=\"1090\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_07bte1m_di\" bpmnElement=\"Flow_07bte1m\">\n        <di:waypoint x=\"600\" y=\"208\" />\n        <di:waypoint x=\"600\" y=\"249\" />\n        <di:waypoint x=\"620\" y=\"249\" />\n        <di:waypoint x=\"620\" y=\"290\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1u4h0mv_di\" bpmnElement=\"Flow_1u4h0mv\">\n        <di:waypoint x=\"640\" y=\"248\" />\n        <di:waypoint x=\"640\" y=\"290\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1fj63ew_di\" bpmnElement=\"Flow_1fj63ew\">\n        <di:waypoint x=\"710\" y=\"208\" />\n        <di:waypoint x=\"710\" y=\"244\" />\n        <di:waypoint x=\"660\" y=\"244\" />\n        <di:waypoint x=\"660\" y=\"290\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"TextAnnotation_0mgb6fp_di\" bpmnElement=\"TextAnnotation_0mgb6fp\">\n        <dc:Bounds x=\"470\" y=\"840\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_0r7uwu2_di\" bpmnElement=\"Association_0r7uwu2\">\n        <di:waypoint x=\"420\" y=\"818\" />\n        <di:waypoint x=\"479\" y=\"840\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_0ztmifm_di\" bpmnElement=\"DataOutputAssociation_0ztmifm\">\n        <di:waypoint x=\"320\" y=\"825\" />\n        <di:waypoint x=\"275\" y=\"848\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/auto-place/BpmnAutoPlace.vertical.multi-connection.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.20.0\">\n  <bpmn:collaboration id=\"Collaboration_1l65oiw\">\n    <bpmn:participant id=\"Participant_0p0tobq\" name=\"Vertical Container\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:sequenceFlow id=\"SequenceFlow_1q8yl3p\" sourceRef=\"V_TASK_1\" targetRef=\"V_TASK_4\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_0uj471x\" sourceRef=\"V_TASK_1\" targetRef=\"V_TASK_2\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_0sys8ww\" sourceRef=\"V_TASK_1\" targetRef=\"V_TASK_3\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_1dh9p3h\" sourceRef=\"V_TASK_1\" targetRef=\"V_TASK_2\" />\n    <bpmn:task id=\"V_TASK_1\" name=\"TASK_1\">\n      <bpmn:outgoing>SequenceFlow_0uj471x</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_0sys8ww</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_1q8yl3p</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_1dh9p3h</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"V_TASK_3\" name=\"TASK_3\">\n      <bpmn:incoming>SequenceFlow_0sys8ww</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:task id=\"V_TASK_4\" name=\"TASK_4\">\n      <bpmn:incoming>SequenceFlow_1q8yl3p</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:task id=\"V_TASK_2\" name=\"TASK_2\">\n      <bpmn:incoming>SequenceFlow_0uj471x</bpmn:incoming>\n      <bpmn:incoming>SequenceFlow_1dh9p3h</bpmn:incoming>\n    </bpmn:task>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1l65oiw\">\n      <bpmndi:BPMNShape id=\"Participant_0p0tobq_di\" bpmnElement=\"Participant_0p0tobq\" isHorizontal=\"false\">\n        <dc:Bounds x=\"170\" y=\"100\" width=\"500\" height=\"500\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TASK_1_di\" bpmnElement=\"V_TASK_1\">\n        <dc:Bounds x=\"280\" y=\"180\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TASK_3_di\" bpmnElement=\"V_TASK_3\">\n        <dc:Bounds x=\"408\" y=\"320\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TASK_4_di\" bpmnElement=\"V_TASK_4\">\n        <dc:Bounds x=\"529\" y=\"320\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TASK_2_di\" bpmnElement=\"V_TASK_2\">\n        <dc:Bounds x=\"280\" y=\"470\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1q8yl3p_di\" bpmnElement=\"SequenceFlow_1q8yl3p\">\n        <di:waypoint x=\"380\" y=\"230\" />\n        <di:waypoint x=\"579\" y=\"230\" />\n        <di:waypoint x=\"579\" y=\"320\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"291.5\" y=\"132\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0uj471x_di\" bpmnElement=\"SequenceFlow_0uj471x\">\n        <di:waypoint x=\"330\" y=\"260\" />\n        <di:waypoint x=\"330\" y=\"470\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"135\" y=\"264.5\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0sys8ww_di\" bpmnElement=\"SequenceFlow_0sys8ww\">\n        <di:waypoint x=\"380\" y=\"230\" />\n        <di:waypoint x=\"458\" y=\"230\" />\n        <di:waypoint x=\"458\" y=\"320\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"236\" y=\"132\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1dh9p3h_di\" bpmnElement=\"SequenceFlow_1dh9p3h\">\n        <di:waypoint x=\"280\" y=\"230\" />\n        <di:waypoint x=\"220\" y=\"230\" />\n        <di:waypoint x=\"220\" y=\"520\" />\n        <di:waypoint x=\"280\" y=\"520\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"29\" y=\"264.5\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/auto-place/BpmnAutoPlaceSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport autoPlaceModule from 'lib/features/auto-place';\nimport coreModule from 'lib/core';\nimport labelEditingModule from 'lib/features/label-editing';\nimport modelingModule from 'lib/features/modeling';\nimport selectionModule from 'diagram-js/lib/features/selection';\n\nimport { getBusinessObject } from '../../../../lib/util/ModelUtil';\n\n\ndescribe('features/auto-place', function() {\n\n  describe('element placement', function() {\n\n    var diagramXML = require('./BpmnAutoPlace.bpmn');\n\n    before(bootstrapModeler(diagramXML, {\n      modules: [\n        coreModule,\n        modelingModule,\n        autoPlaceModule,\n        selectionModule\n      ]\n    }));\n\n\n    describe('should place bpmn:FlowNode', function() {\n\n      it('at default distance after START_EVENT_1', autoPlace({\n        element: 'bpmn:Task',\n        behind: 'START_EVENT_1',\n        expectedBounds: { x: 1252, y: 324, width: 100, height: 80 }\n      }));\n\n\n      it('at incoming distance after TASK_0', autoPlace({\n        element: 'bpmn:Task',\n        behind: 'TASK_0',\n        expectedBounds: { x: 462, y: 154, width: 100, height: 80 }\n      }));\n\n\n      it('at incoming distance / quorum after TASK_5', autoPlace({\n        element: 'bpmn:Task',\n        behind: 'TASK_5',\n        expectedBounds: { x: 496, y: 490, width: 100, height: 80 }\n      }));\n\n\n      it('at existing outgoing / below TASK_2', autoPlace({\n        element: 'bpmn:Task',\n        behind: 'TASK_1',\n        expectedBounds: { x: 479, y: 400, width: 100, height: 80 }\n      }));\n\n\n      it('ignoring existing, far away outgoing of TASK_3', autoPlace({\n        element: 'bpmn:Task',\n        behind: 'TASK_3',\n        expectedBounds: { x: 946, y: 227, width: 100, height: 80 }\n      }));\n\n\n      it('behind bpmn:SubProcess', autoPlace({\n        element: 'bpmn:Task',\n        behind: 'SUBPROCESS_1',\n        expectedBounds: { x: 1125, y: 468, width: 100, height: 80 }\n      }));\n\n\n      it('after TASK_6', autoPlace({\n        element: 'bpmn:Task',\n        behind: 'TASK_6',\n        expectedBounds: { x: 900, y: 470, width: 100, height: 80 }\n      }));\n\n    });\n\n\n    describe('should place bpmn:DataStoreReference', function() {\n\n      it('bottom right of source', autoPlace({\n        element: 'bpmn:DataStoreReference',\n        behind: 'TASK_2',\n        expectedBounds: { x: 569, y: 410, width: 50, height: 50 }\n      }));\n\n\n      it('next to existing', autoPlace({\n        element: 'bpmn:DataStoreReference',\n        behind: 'TASK_3',\n        expectedBounds: { x: 969, y: 347, width: 50, height: 50 }\n      }));\n\n    });\n\n\n    describe('should place bpmn:TextAnnotation', function() {\n\n      it('top right of source', autoPlace({\n        element: 'bpmn:TextAnnotation',\n        behind: 'TASK_2',\n        expectedBounds: { x: 579, y: 210, width: 100, height: 30 }\n      }));\n\n\n      it('above existing', autoPlace({\n        element: 'bpmn:TextAnnotation',\n        behind: 'TASK_3',\n        expectedBounds: { x: 896, y: 96, width: 100, height: 30 }\n      }));\n\n\n      describe('on connection', function() {\n\n        it('top right', autoPlace({\n          element: 'bpmn:TextAnnotation',\n          behind: 'SequenceFlow_1',\n          expectedBounds: { x: 500, y: 265, width: 100, height: 30 }\n        }));\n\n\n        it('above existing', autoPlace({\n          element: 'bpmn:TextAnnotation',\n          behind: 'SequenceFlow_1',\n          expectedBounds: { x: 500, y: 205, width: 100, height: 30 }\n        }));\n\n      });\n\n\n      describe('on messageflow', function() {\n\n        it('bottom right', autoPlace({\n          element: 'bpmn:TextAnnotation',\n          behind: 'MessageFlow_1',\n          expectedBounds: { x: 579, y: 580, width: 100, height: 30 }\n        }));\n\n\n        it('next to existing', autoPlace({\n          element: 'bpmn:TextAnnotation',\n          behind: 'MessageFlow_1',\n          expectedBounds: { x: 709, y: 580, width: 100, height: 30 }\n        }));\n\n      });\n\n    });\n\n  });\n\n\n  describe('vertical element placement', function() {\n\n    var diagramXML = require('./BpmnAutoPlace.vertical.bpmn');\n\n    before(bootstrapModeler(diagramXML, {\n      modules: [\n        coreModule,\n        modelingModule,\n        autoPlaceModule,\n        selectionModule\n      ]\n    }));\n\n\n    describe('should place bpmn:FlowNode', function() {\n\n      it('at default distance after Start Event', autoPlace({\n        element: 'bpmn:Task',\n        behind: 'Start_Event',\n        expectedBounds: { x: 570, y: 1088, width: 100, height: 80 }\n      }));\n\n\n      it('at incoming distance after V_Task_0', autoPlace({\n        element: 'bpmn:Task',\n        behind: 'V_Task_0',\n        expectedBounds: { x: 260, y: 422, width: 100, height: 80 }\n      }));\n\n\n      it('at incoming distance / quorum after V_Task_5', autoPlace({\n        element: 'bpmn:Task',\n        behind: 'V_Task_5',\n        expectedBounds: { x: 590, y: 452, width: 100, height: 80 }\n      }));\n\n\n      it('at existing outgoing / right of V_Task_2', autoPlace({\n        element: 'bpmn:Task',\n        behind: 'V_Task_1',\n        expectedBounds: { x: 530, y: 450, width: 100, height: 80 }\n      }));\n\n\n      it('ignoring existing, far away outgoing of V_Task_3', autoPlace({\n        element: 'bpmn:Task',\n        behind: 'V_Task_3',\n        expectedBounds: { x: 450, y: 1090, width: 100, height: 80 }\n      }));\n\n\n      it('behind bpmn:SubProcess', autoPlace({\n        element: 'bpmn:Task',\n        behind: 'V_Sub_Process_1',\n        expectedBounds: { x: 699, y: 930, width: 100, height: 80 }\n      }));\n\n\n      it('below V_TASK_6', autoPlace({\n        element: 'bpmn:Task',\n        behind: 'V_TASK_6',\n        expectedBounds: { x: 700, y: 730, width: 100, height: 80 }\n      }));\n\n    });\n\n\n    describe('should place bpmn:DataStoreReference', function() {\n\n      it('bottom right of source', autoPlace({\n        element: 'bpmn:DataStoreReference',\n        behind: 'V_Task_2',\n        expectedBounds: { x: 310, y: 520, width: 50, height: 50 }\n      }));\n\n\n      it('next to existing', autoPlace({\n        element: 'bpmn:DataStoreReference',\n        behind: 'V_Task_3',\n        expectedBounds: { x: 230, y: 915, width: 50, height: 50 }\n      }));\n\n    });\n\n\n    describe('should place bpmn:TextAnnotation', function() {\n\n      it('bottom right of source', autoPlace({\n        element: 'bpmn:TextAnnotation',\n        behind: 'V_Task_2',\n        expectedBounds: { x: 550, y: 530, width: 100, height: 30 }\n      }));\n\n\n      it('right of existing', autoPlace({\n        element: 'bpmn:TextAnnotation',\n        behind: 'V_Task_3',\n        expectedBounds: { x: 600, y: 840, width: 100, height: 30 }\n      }));\n\n\n      describe('on connection', function() {\n\n        it('bottom right', autoPlace({\n          element: 'bpmn:TextAnnotation',\n          behind: 'SequenceFlow_1',\n          expectedBounds: { x: 500, y: 445, width: 100, height: 30 }\n        }));\n\n\n        it('right of existing', autoPlace({\n          element: 'bpmn:TextAnnotation',\n          behind: 'SequenceFlow_1',\n          expectedBounds: { x: 630, y: 445, width: 100, height: 30 }\n        }));\n\n      });\n\n    });\n\n  });\n\n\n  describe('integration', function() {\n\n    var diagramXML = require('./BpmnAutoPlace.bpmn');\n\n    before(bootstrapModeler(diagramXML, {\n      modules: [\n        autoPlaceModule,\n        coreModule,\n        labelEditingModule,\n        modelingModule,\n        selectionModule\n      ]\n    }));\n\n\n    it('should complete direct edit on autoPlace', inject(\n      function(autoPlace, directEditing, elementFactory, elementRegistry) {\n\n        // given\n        var element = elementFactory.createShape({ type: 'bpmn:Task' });\n\n        var source = elementRegistry.get('TASK_2');\n\n        directEditing.activate(source);\n\n        directEditing._textbox.content.textContent = 'foo';\n\n        // when\n        autoPlace.append(source, element);\n\n        // then\n        expect(getBusinessObject(source).name).to.equal('foo');\n      }\n    ));\n\n\n    it('should select + direct edit on autoPlace', inject(\n      function(autoPlace, elementRegistry, elementFactory, selection, directEditing) {\n\n        // given\n        var element = elementFactory.createShape({ type: 'bpmn:Task' });\n\n        var source = elementRegistry.get('TASK_2');\n\n        // when\n        var newShape = autoPlace.append(source, element);\n\n        // then\n        expect(selection.get()).to.eql([ newShape ]);\n\n        expect(directEditing.isActive()).to.be.true;\n        expect(directEditing._active.element).to.equal(newShape);\n      }\n    ));\n\n  });\n\n\n  describe('multi connection handling', function() {\n\n    var diagramXML = require('./BpmnAutoPlace.multi-connection.bpmn');\n\n    before(bootstrapModeler(diagramXML, {\n      modules: [\n        coreModule,\n        modelingModule,\n        autoPlaceModule,\n        selectionModule,\n        labelEditingModule\n      ]\n    }));\n\n\n    it('should ignore multiple source -> target connections', inject(\n      function(autoPlace, elementRegistry, elementFactory, selection, directEditing) {\n\n        // given\n        var element = elementFactory.createShape({ type: 'bpmn:Task' });\n\n        var source = elementRegistry.get('TASK_1');\n        var alignedElement = elementRegistry.get('TASK_3');\n\n        // when\n        var newShape = autoPlace.append(source, element);\n\n        // then\n        expect(newShape.x).to.eql(alignedElement.x);\n      }\n    ));\n\n  });\n\n\n  describe('vertical multi connection handling', function() {\n\n    var diagramXML = require('./BpmnAutoPlace.vertical.multi-connection.bpmn');\n\n    before(bootstrapModeler(diagramXML, {\n      modules: [\n        coreModule,\n        modelingModule,\n        autoPlaceModule,\n        selectionModule,\n        labelEditingModule\n      ]\n    }));\n\n\n    it('should ignore multiple source -> target connections', inject(\n      function(autoPlace, elementRegistry, elementFactory, selection, directEditing) {\n\n        // given\n        var element = elementFactory.createShape({ type: 'bpmn:Task' });\n\n        var source = elementRegistry.get('V_TASK_1');\n        var alignedElement = elementRegistry.get('V_TASK_3');\n\n        // when\n        var newShape = autoPlace.append(source, element);\n\n        // then\n        expect(newShape.y).to.eql(alignedElement.y);\n      }\n    ));\n\n  });\n\n\n  describe('boundary event connection handling', function() {\n\n    var diagramXML = require('./BpmnAutoPlace.boundary-events.bpmn');\n\n    before(bootstrapModeler(diagramXML, {\n      modules: [\n        coreModule,\n        modelingModule,\n        autoPlaceModule,\n        selectionModule\n      ]\n    }));\n\n\n    it('should place bottom right of BOUNDARY_BOTTOM', autoPlace({\n      element: 'bpmn:Task',\n      behind: 'BOUNDARY_BOTTOM',\n      expectedBounds: { x: 241, y: 213, width: 100, height: 80 }\n    }));\n\n\n    it('should place bottom right of BOUNDARY_SUBPROCESS_BOTTOM', autoPlace({\n      element: 'bpmn:Task',\n      behind: 'BOUNDARY_SUBPROCESS_BOTTOM',\n      expectedBounds: { x: 278, y: 495, width: 100, height: 80 }\n    }));\n\n\n    it('should place top right of BOUNDARY_TOP', autoPlace({\n      element: 'bpmn:Task',\n      behind: 'BOUNDARY_TOP',\n      expectedBounds: { x: 242, y: -27, width: 100, height: 80 }\n    }));\n\n\n    it('should place top right of BOUNDARY_TOP_RIGHT without infinite loop', autoPlace({\n      element: 'bpmn:Task',\n      behind: 'BOUNDARY_TOP_RIGHT',\n      expectedBounds: { x: 473, y: -27, width: 100, height: 80 }\n    }));\n\n\n    it('should place top right of BOUNDARY_SUBPROCESS_TOP', autoPlace({\n      element: 'bpmn:Task',\n      behind: 'BOUNDARY_SUBPROCESS_TOP',\n      expectedBounds: { x: 275, y: 194, width: 100, height: 80 }\n    }));\n\n  });\n\n\n  describe('vertical boundary event connection handling', function() {\n\n    var diagramXML = require('./BpmnAutoPlace.vertical.boundary-events.bpmn');\n\n    before(bootstrapModeler(diagramXML, {\n      modules: [\n        coreModule,\n        modelingModule,\n        autoPlaceModule,\n        selectionModule\n      ]\n    }));\n\n\n    it('should place bottom right of V_BOUNDARY_RIGHT', autoPlace({\n      element: 'bpmn:Task',\n      behind: 'V_BOUNDARY_RIGHT',\n      expectedBounds: { x: 420, y: 268, width: 100, height: 80 }\n    }));\n\n\n    it('should place bottom right of V_BOUNDARY_SUBPROCESS_RIGHT', autoPlace({\n      element: 'bpmn:Task',\n      behind: 'V_BOUNDARY_SUBPROCESS_RIGHT',\n      expectedBounds: { x: 740, y: 278, width: 100, height: 80 }\n    }));\n\n\n    it('should place bottom left of V_BOUNDARY_LEFT', autoPlace({\n      element: 'bpmn:Task',\n      behind: 'V_BOUNDARY_LEFT',\n      expectedBounds: { x: 140, y: 268, width: 100, height: 80 }\n    }));\n\n\n    it('should place bottom left of V_BOUNDARY_BOTTOM_LEFT', autoPlace({\n      element: 'bpmn:Task',\n      behind: 'V_BOUNDARY_BOTTOM_LEFT',\n      expectedBounds: { x: 140, y: 438, width: 100, height: 80 }\n    }));\n\n\n    it('should place bottom left of V_BOUNDARY_SUBPROCESS_LEFT', autoPlace({\n      element: 'bpmn:Task',\n      behind: 'V_BOUNDARY_SUBPROCESS_LEFT',\n      expectedBounds: { x: 420, y: 278, width: 100, height: 80 }\n    }));\n\n  });\n\n\n  describe('nested element placement', function() {\n\n    describe('in collapsed subprocess', function() {\n\n      var diagramXML = require('./BpmnAutoPlace.subprocess.bpmn');\n\n      before(bootstrapModeler(diagramXML, {\n        modules: [\n          coreModule,\n          modelingModule,\n          autoPlaceModule\n        ]\n      }));\n\n      beforeEach(inject(function(canvas) {\n        canvas.setRootElement(canvas.findRoot('Sub_Process_plane'));\n      }));\n\n\n      it('should place node horizontally after Nested_Start_Event', autoPlace({\n        element: 'bpmn:Task',\n        behind: 'Nested_Start_Event',\n        expectedBounds: { x: 265, y: 57, width: 100, height: 80 }\n      }));\n\n\n      it('should place annotation horizontally above Nested_Start_Event', autoPlace({\n        element: 'bpmn:TextAnnotation',\n        behind: 'Nested_Start_Event',\n        expectedBounds: { x: 215, y: -1, width: 100, height: 30 }\n      }));\n\n\n      it('should place data store horizontally below Nested_Start_Event', autoPlace({\n        element: 'bpmn:DataStoreReference',\n        behind: 'Nested_Start_Event',\n        expectedBounds: { x: 205, y: 155, width: 50, height: 50 }\n      }));\n\n    });\n\n\n    describe('in collapsed horizontal subprocess', function() {\n\n      var diagramXML = require('./BpmnAutoPlace.subprocess.horizontal.bpmn');\n\n      before(bootstrapModeler(diagramXML, {\n        modules: [\n          coreModule,\n          modelingModule,\n          autoPlaceModule\n        ]\n      }));\n\n      beforeEach(inject(function(canvas) {\n        canvas.setRootElement(canvas.findRoot('Sub_Process_plane'));\n      }));\n\n\n      it('should place node horizontally after Nested_Start_Event', autoPlace({\n        element: 'bpmn:Task',\n        behind: 'Nested_Start_Event',\n        expectedBounds: { x: 265, y: 77, width: 100, height: 80 }\n      }));\n\n\n      it('should place annotation horizontally above Nested_Start_Event', autoPlace({\n        element: 'bpmn:TextAnnotation',\n        behind: 'Nested_Start_Event',\n        expectedBounds: { x: 215, y: 19, width: 100, height: 30 }\n      }));\n\n\n      it('should place data store horizontally below Nested_Start_Event', autoPlace({\n        element: 'bpmn:DataStoreReference',\n        behind: 'Nested_Start_Event',\n        expectedBounds: { x: 205, y: 175, width: 50, height: 50 }\n      }));\n\n    });\n\n\n    describe('in collapsed vertical subprocess', function() {\n\n      var diagramXML = require('./BpmnAutoPlace.subprocess.vertical.bpmn');\n\n      before(bootstrapModeler(diagramXML, {\n        modules: [\n          coreModule,\n          modelingModule,\n          autoPlaceModule\n        ]\n      }));\n\n      beforeEach(inject(function(canvas) {\n        canvas.setRootElement(canvas.findRoot('Sub_Process_plane'));\n      }));\n\n\n      it('should place node vertically after Nested_Start_Event', autoPlace({\n        element: 'bpmn:Task',\n        behind: 'Nested_Start_Event',\n        expectedBounds: { x: 127, y: 165, width: 100, height: 80 }\n      }));\n\n\n      it('should place annotation vertically right of Nested_Start_Event', autoPlace({\n        element: 'bpmn:TextAnnotation',\n        behind: 'Nested_Start_Event',\n        expectedBounds: { x: 245, y: 115, width: 100, height: 30 }\n      }));\n\n\n      it('should place data store vertically left of Nested_Start_Event', autoPlace({\n        element: 'bpmn:DataStoreReference',\n        behind: 'Nested_Start_Event',\n        expectedBounds: { x: 69, y: 105, width: 50, height: 50 }\n      }));\n\n    });\n\n  });\n\n});\n\n\n// helpers //////////\n\nfunction autoPlace(cfg) {\n\n  var element = cfg.element,\n      behind = cfg.behind,\n      expectedBounds = cfg.expectedBounds;\n\n  return inject(function(autoPlace, elementRegistry, elementFactory) {\n\n    var sourceEl = elementRegistry.get(behind);\n\n    // assume\n    expect(sourceEl).to.exist;\n\n    if (typeof element === 'string') {\n      element = { type: element };\n    }\n\n    var shape = elementFactory.createShape(element);\n\n    // when\n    var placedShape = autoPlace.append(sourceEl, shape);\n\n    // then\n    expect(placedShape).to.have.bounds(expectedBounds);\n  });\n}\n"
  },
  {
    "path": "test/spec/features/auto-resize/AutoResize.lanes.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:collaboration id=\"Collaboration_1\">\n    <bpmn:participant id=\"Participant_Lanes\" processRef=\"Process_Lanes\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_Lanes\" isExecutable=\"false\">\n    <bpmn:laneSet>\n      <bpmn:lane id=\"Lane\">\n        <bpmn:childLaneSet xsi:type=\"bpmn:tLaneSet\">\n          <bpmn:lane id=\"Lane_Nested\" name=\"Lane_Nested\">\n            <bpmn:flowNodeRef>StartEvent_1</bpmn:flowNodeRef>\n            <bpmn:flowNodeRef>Task_1</bpmn:flowNodeRef>\n          </bpmn:lane>\n        </bpmn:childLaneSet>\n      </bpmn:lane>\n    </bpmn:laneSet>\n    <bpmn:task id=\"Task_1\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_Lanes_di\" bpmnElement=\"Participant_Lanes\">\n        <dc:Bounds x=\"247\" y=\"160\" width=\"371\" height=\"178\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"345\" y=\"231\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"318\" y=\"267\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"472\" y=\"209\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"381\" y=\"249\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"472\" y=\"249\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"370\" y=\"239\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Lane_di\" bpmnElement=\"Lane\">\n        <dc:Bounds x=\"277\" y=\"160\" width=\"341\" height=\"178\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_Nested_di\" bpmnElement=\"Lane_Nested\">\n        <dc:Bounds x=\"307\" y=\"160\" width=\"311\" height=\"178\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/auto-resize/AutoResize.multi-selection.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <bpmn:task id=\"Task_1\" />\n    </bpmn:subProcess>\n    <bpmn:task id=\"Task_2\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"94\" y=\"197\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"320\" y=\"90\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"319\" y=\"224\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/auto-resize/AutoResize.nested-sub-processes.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <bpmn:subProcess id=\"SubProcess_2\">\n        <bpmn:subProcess id=\"SubProcess_3\">\n          <bpmn:startEvent id=\"StartEvent_1\">\n            <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n          </bpmn:startEvent>\n          <bpmn:task id=\"Task_1\">\n            <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n          </bpmn:task>\n          <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n        </bpmn:subProcess>\n      </bpmn:subProcess>\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"106\" y=\"74\" width=\"574\" height=\"257\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_2_di\" bpmnElement=\"SubProcess_2\" isExpanded=\"true\">\n        <dc:Bounds x=\"126\" y=\"94\" width=\"528\" height=\"212\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_3_di\" bpmnElement=\"SubProcess_3\" isExpanded=\"true\">\n        <dc:Bounds x=\"146\" y=\"114\" width=\"481\" height=\"165\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"181\" y=\"175\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"154\" y=\"211\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"481\" y=\"153\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"217\" y=\"193\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"481\" y=\"193\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"304\" y=\"183\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/auto-resize/AutoResize.participant.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:collaboration id=\"Collaboration_1\">\n    <bpmn:participant id=\"Participant_1\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Task_1\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_1_di\" bpmnElement=\"Participant_1\">\n        <dc:Bounds x=\"247\" y=\"160\" width=\"371\" height=\"178\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"322\" y=\"231\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"295\" y=\"267\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"472\" y=\"209\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"358\" y=\"249\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"472\" y=\"249\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"370\" y=\"239\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/auto-resize/AutoResize.space-tool.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.2.2\">\n  <bpmn:collaboration id=\"Collaboration_1\">\n    <bpmn:participant id=\"Participant_1\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n    <bpmn:task id=\"Task_1\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n    </bpmn:task>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_0rw90rw_di\" bpmnElement=\"Participant_1\">\n        <dc:Bounds x=\"100\" y=\"52\" width=\"123\" height=\"120\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"150\" y=\"94\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"123\" y=\"130\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0u9b7yl_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"255\" y=\"72\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_156nnmr_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"186\" y=\"112\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"255\" y=\"112\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"175.5\" y=\"87\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/auto-resize/AutoResize.sub-processes.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <bpmn:startEvent id=\"StartEvent_1\">\n        <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n      </bpmn:startEvent>\n      <bpmn:task id=\"Task_1\">\n        <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n      </bpmn:task>\n      <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"120\" y=\"52\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"163\" y=\"130\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"136\" y=\"166\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"287\" y=\"108\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"199\" y=\"148\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"287\" y=\"148\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"198\" y=\"138\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/auto-resize/AutoResizeSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  pick,\n  assign\n} from 'min-dash';\n\nimport autoResizeModule from 'lib/features/auto-resize';\nimport modelingModule from 'lib/features/modeling';\nimport createModule from 'diagram-js/lib/features/create';\nimport coreModule from 'lib/core';\nimport moveModule from 'diagram-js/lib/features/move';\n\nimport {\n  createCanvasEvent as canvasEvent\n} from '../../../util/MockEvents';\n\nfunction getBounds(shape) {\n  return pick(shape, [ 'x', 'y', 'width', 'height' ]);\n}\n\n\ndescribe('features/auto-resize', function() {\n\n  var testModules = [\n    coreModule,\n    modelingModule,\n    autoResizeModule,\n    createModule,\n    moveModule\n  ];\n\n  describe('participant', function() {\n\n    var diagramXML = require('./AutoResize.participant.bpmn');\n\n    var taskShape,\n        participantShape,\n        startEventShape,\n        originalBounds;\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n    beforeEach(inject(function(elementRegistry) {\n\n      taskShape = elementRegistry.get('Task_1');\n      participantShape = elementRegistry.get('Participant_1');\n      startEventShape = elementRegistry.get('StartEvent_1');\n\n      originalBounds = getBounds(participantShape);\n\n      expect(originalBounds).to.eql({ x: 247, y: 160, width: 371, height: 178 });\n\n    }));\n\n\n    describe('after moving', function() {\n\n      it('should expand the right edge', inject(function(modeling) {\n\n        // when\n        modeling.moveElements([ taskShape ], { x: 100, y: 0 }, participantShape);\n\n        // then\n        var expectedBounds = assign(originalBounds, { width: 525 });\n\n        expect(participantShape).to.have.bounds(expectedBounds);\n      }));\n\n\n      it('should expand the top edge', inject(function(modeling) {\n\n        // when\n        modeling.moveElements([ taskShape ], { x: 0, y: -50 }, participantShape);\n\n        // then\n        var expectedBounds = assign(originalBounds, { y: 99, height: 239 });\n\n        expect(participantShape).to.have.bounds(expectedBounds);\n      }));\n\n\n      it('should expand the bottom edge', inject(function(modeling) {\n\n        // when\n        modeling.moveElements([ taskShape ], { x: 0, y: 50 }, participantShape);\n\n        // then\n        var expectedBounds = assign(originalBounds, { height: 239 });\n\n        expect(participantShape).to.have.bounds(expectedBounds);\n      }));\n\n\n      it('should expand the left edge', inject(function(modeling) {\n\n        // when\n        modeling.moveElements([ startEventShape ], { x: -100, y: 0 }, participantShape);\n\n        // then\n        var expectedBounds = assign(originalBounds, { x: 122, width: 496 });\n\n        expect(participantShape).to.have.bounds(expectedBounds);\n      }));\n\n\n      it('should expand the bottom right edges', inject(function(modeling) {\n\n        // when\n        modeling.moveElements([ taskShape ], { x: 50, y: 50 }, participantShape);\n\n        // then\n        var expectedBounds = assign(originalBounds, { width: 475, height: 239 });\n\n        expect(participantShape).to.have.bounds(expectedBounds);\n      }));\n\n\n      it('should expand the top left edges', inject(function(modeling) {\n\n        // when\n        modeling.moveElements([ startEventShape ], { x: -100, y: -100 }, participantShape);\n\n        // then\n        expect(participantShape).to.have.bounds({ x: 122, y: 71, width: 496, height: 267 });\n      }));\n\n\n      it('should resize the parent on element/parent edge intersect', inject(function(modeling) {\n\n        // when\n        modeling.moveElements([ taskShape ], { x: 0, y: 49 }, participantShape);\n\n        // then\n        var expectedBounds = assign(originalBounds, { height: 238 });\n\n        expect(participantShape).to.have.bounds(expectedBounds);\n      }));\n\n\n      it('should not resize the parent if element is placed near the bottom', inject(function(modeling) {\n\n        // when\n        modeling.moveElements([ taskShape ], { x: 0, y: 47 }, participantShape);\n\n        // then\n        expect(participantShape).to.have.bounds(originalBounds);\n      }));\n\n\n      describe('undo / redo support', function() {\n\n        it('should undo', inject(function(modeling, commandStack) {\n\n          // when\n          modeling.moveElements([ startEventShape ], { x: -100, y: -100 }, participantShape);\n          commandStack.undo();\n\n          // then\n          expect(participantShape).to.have.bounds(originalBounds);\n        }));\n\n\n        it('should redo', inject(function(modeling, commandStack) {\n\n          // when\n          modeling.moveElements([ startEventShape ], { x: -100, y: -100 }, participantShape);\n          commandStack.undo();\n          commandStack.redo();\n\n          // then\n          expect(participantShape).to.have.bounds({ x: 122, y: 71, width: 496, height: 267 });\n        }));\n\n      });\n\n    });\n\n\n    describe('after moving multiple elements', function() {\n\n      it('should expand the right edge', inject(function(modeling, selection) {\n\n        // when\n        modeling.moveElements([ taskShape, startEventShape ], { x: 200, y: 0 }, participantShape);\n\n        // then\n        var expectedBounds = assign(originalBounds, { width: 625 });\n\n        expect(participantShape).to.have.bounds(expectedBounds);\n      }));\n\n\n      it('should expand the bottom edge', inject(function(modeling, selection) {\n\n        // when\n        modeling.moveElements([ taskShape, startEventShape ], { x: 0, y: 48 }, participantShape);\n\n        // then\n        var expectedBounds = assign(originalBounds, { height: 237 });\n\n        expect(participantShape).to.have.bounds(expectedBounds);\n      }));\n\n    });\n\n\n    describe('after appending', function() {\n\n      it('should expand the bottom right edges', inject(function(modeling) {\n\n        // when\n        modeling.appendShape(taskShape, { type: 'bpmn:Task' }, { x: 660, y: 350 }, participantShape);\n\n        // then\n        var expectedBounds = assign(originalBounds, { width: 563, height: 290 });\n\n        expect(participantShape).to.have.bounds(expectedBounds);\n      }));\n\n\n      it('should undo resizing', inject(function(modeling, commandStack) {\n\n        // given\n        modeling.appendShape(taskShape, { type: 'bpmn:Task' }, { x: 660, y: 250 }, participantShape);\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(participantShape).to.have.bounds(originalBounds);\n      }));\n\n\n      it('should redo resizing and restore shapes and connections',\n        inject(function(modeling, commandStack) {\n\n          // given\n          var taskShape2 = modeling.appendShape(taskShape, { type: 'bpmn:Task' }, { x: 660, y: 250 }, participantShape);\n\n          // when\n          commandStack.undo();\n          commandStack.redo();\n\n          // then\n          var expectedBounds = assign(originalBounds, { width: 563 });\n\n          expect(participantShape).to.have.bounds(expectedBounds);\n\n          expect(taskShape2).to.exist;\n          expect(taskShape.outgoing).not.to.be.empty;\n          expect(taskShape2.incoming).not.to.be.empty;\n        })\n      );\n\n    });\n\n\n    it('should not auto-resize when adding lane', inject(function(modeling) {\n\n      // given\n      var laneAttrs = {\n        type: 'bpmn:Lane',\n        width: 341,\n        height: 178\n      };\n\n      // when\n      modeling.createShape(laneAttrs, { x: 280, y: 200 }, participantShape);\n\n      // then\n      expect(participantShape).to.have.bounds(originalBounds);\n    }));\n\n  });\n\n\n  describe('lane', function() {\n\n    var diagramXML = require('./AutoResize.lanes.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    it('should fit new element', inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Participant_Lanes');\n\n      // when\n      modeling.createShape({ type: 'bpmn:Task' }, { x: 600, y: 320 }, participantShape);\n\n      // then\n      expect(participantShape).to.have.bounds({ x: 247, y: 160, width: 503, height: 260 });\n    }));\n\n\n    it('should fit multiple moved elements', inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Participant_Lanes'),\n          taskShape = elementRegistry.get('Task_1'),\n          startEventShape = elementRegistry.get('StartEvent_1');\n\n      var originalBounds = getBounds(participantShape);\n\n      // when\n      modeling.moveElements([ taskShape, startEventShape ], { x: 200, y: 0 }, participantShape);\n\n      // then\n      var expectedBounds = assign(originalBounds, { width: 625 });\n\n      expect(participantShape).to.have.bounds(expectedBounds);\n    }));\n\n  });\n\n\n  describe('sub processes', function() {\n\n    var diagramXML = require('./AutoResize.sub-processes.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n    it('should auto-resize after moving children', inject(function(elementRegistry, modeling) {\n\n      // given\n      var subProcessShape = elementRegistry.get('SubProcess_1'),\n          taskShape = elementRegistry.get('Task_1'),\n          startEventShape = elementRegistry.get('StartEvent_1');\n\n      var originalBounds = getBounds(subProcessShape);\n\n      // when\n      modeling.moveElements([ taskShape, startEventShape ], { x: 200, y: 0 }, subProcessShape);\n\n      // then\n      var expectedBounds = assign(originalBounds, { width: 567 });\n\n      expect(subProcessShape).to.have.bounds(expectedBounds);\n    }));\n\n\n    it('should auto-resize to fit new element', inject(function(elementRegistry, modeling) {\n\n      // given\n      var subProcessShape = elementRegistry.get('SubProcess_1');\n\n      var originalBounds = getBounds(subProcessShape);\n\n      // when\n      modeling.createShape({ type: 'bpmn:Task' }, { x: 450, y: 250 }, subProcessShape);\n\n      // then\n      var expectedBounds = assign(originalBounds, { width: 480, height: 298 });\n\n      expect(subProcessShape).to.have.bounds(expectedBounds);\n    }));\n\n\n    it('should auto-resize after dropping selection inside',\n      inject(function(selection, move, dragging, elementRegistry, modeling) {\n\n        // given\n        var subProcessShape = elementRegistry.get('SubProcess_1'),\n            taskShape = elementRegistry.get('Task_1'),\n            startEventShape = elementRegistry.get('StartEvent_1');\n\n        var originalBounds = getBounds(subProcessShape);\n\n        // when\n        selection.select([ taskShape, startEventShape ]);\n\n        move.start(canvasEvent({ x: 265, y: 235 }), startEventShape);\n\n        dragging.hover({\n          element: subProcessShape,\n          gfx: elementRegistry.getGraphics(subProcessShape)\n        });\n\n        dragging.move(canvasEvent({ x: 450, y: 235 }));\n\n        dragging.end();\n\n        // then\n        var expectedBounds = assign(originalBounds, { width: 552 });\n\n        expect(subProcessShape).to.have.bounds(expectedBounds);\n      })\n    );\n\n\n    it('should not auto-resize after dropping selection outside',\n      inject(function(selection, canvas, move, dragging, elementRegistry, modeling) {\n\n        // given\n        var subProcessShape = elementRegistry.get('SubProcess_1'),\n            taskShape = elementRegistry.get('Task_1'),\n            startEventShape = elementRegistry.get('StartEvent_1'),\n            rootShape = canvas.getRootElement();\n\n        var originalBounds = getBounds(subProcessShape);\n\n        // when\n        selection.select([ taskShape, startEventShape ]);\n\n        move.start(canvasEvent({ x: 390, y: 110 }), taskShape);\n\n        dragging.hover({\n          element: rootShape,\n          gfx: elementRegistry.getGraphics(rootShape)\n        });\n\n        dragging.move(canvasEvent({ x: 600, y: 110 }));\n\n        dragging.end();\n\n        // then\n        expect(subProcessShape).to.have.bounds(originalBounds);\n      })\n    );\n\n  });\n\n\n  describe('after moving multiple elements', function() {\n\n    var diagramXML = require('./AutoResize.multi-selection.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n    var taskShape_1,\n        taskShape_2,\n        subProcessShape_1,\n        rootShape;\n\n    beforeEach(inject(function(elementRegistry, canvas) {\n      taskShape_1 = elementRegistry.get('Task_1');\n      taskShape_2 = elementRegistry.get('Task_2');\n      subProcessShape_1 = elementRegistry.get('SubProcess_1');\n      rootShape = canvas.getRootElement();\n    }));\n\n\n    it('should not expand, if elements keep their parents (different original parents)', inject(function(modeling) {\n\n      // given\n      var originalBounds = getBounds(subProcessShape_1);\n\n      // when\n      modeling.moveElements([ taskShape_1, taskShape_2 ],\n        { x: -100, y: 0 }, subProcessShape_1, { primaryShape: taskShape_1 });\n\n      // then\n      expect(subProcessShape_1).to.have.bounds(originalBounds);\n    }));\n\n\n    it('should expand non-primary parents', inject(function(modeling) {\n\n      // given\n      var originalBounds = getBounds(subProcessShape_1);\n\n      // when\n      modeling.moveElements([ taskShape_1, taskShape_2 ],\n        { x: 100, y: 0 }, rootShape, { primaryShape: taskShape_2 });\n\n      // then\n      var expectedBounds = assign(originalBounds, { width: 525 });\n      expect(subProcessShape_1).to.have.bounds(expectedBounds);\n    }));\n\n\n    it('should expand, if elements keep their parents (same original parent)', inject(function(modeling) {\n\n      // given\n      var originalBounds = getBounds(subProcessShape_1);\n      modeling.moveElements([ taskShape_2 ], { x: -110, y: 135 }, subProcessShape_1);\n\n      // when\n      modeling.moveElements([ taskShape_1, taskShape_2 ],\n        { x: -110, y: 0 }, subProcessShape_1, { primaryShape: taskShape_1 });\n\n      // then\n      var expectedBounds = assign(originalBounds, { x: 0, width: 444 });\n      expect(subProcessShape_1).to.have.bounds(expectedBounds);\n    }));\n\n\n    it('should expand, if primary shape changes parent', inject(function(modeling) {\n\n      // given\n      var originalBounds = getBounds(subProcessShape_1);\n\n      // when\n      modeling.moveElements([ taskShape_1, taskShape_2 ],\n        { x: 0, y: 50 }, subProcessShape_1, { primaryShape: taskShape_2 });\n\n      // then\n      var expectedBounds = assign(originalBounds, { y: 80, height: 317 });\n      expect(subProcessShape_1).to.have.bounds(expectedBounds);\n    }));\n\n\n    it('should expand top and bottom edge, if primary shape changes parent', inject(function(modeling) {\n\n      // given\n      var originalBounds = getBounds(subProcessShape_1);\n\n      // when\n      modeling.moveElements([ taskShape_1, taskShape_2 ],\n        { x: 0, y: 100 }, subProcessShape_1, { primaryShape: taskShape_2 });\n\n      // then\n      var expectedBounds = assign(originalBounds, { y: 130, height: 334 });\n      expect(subProcessShape_1).to.have.bounds(expectedBounds);\n    }));\n\n  });\n\n\n  describe('nested sub processes', function() {\n\n    var diagramXML = require('./AutoResize.nested-sub-processes.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    it('should recursively expand parent element', inject(function(elementRegistry, modeling) {\n\n      var taskShape = elementRegistry.get('Task_1'),\n          subProcessShape_2 = elementRegistry.get('SubProcess_2'),\n          subProcessShape_3 = elementRegistry.get('SubProcess_3');\n\n      var originalBounds = getBounds(subProcessShape_2);\n\n      modeling.moveElements([ taskShape ], { x: 100, y: 0 }, subProcessShape_3);\n\n      var expectedBounds = assign(originalBounds, { width: 755 });\n\n      expect(subProcessShape_2).to.have.bounds(expectedBounds);\n    }));\n\n\n    it('should recursively expand last parent element', inject(function(elementRegistry, modeling) {\n\n      var taskShape = elementRegistry.get('Task_1'),\n          subProcessShape_1 = elementRegistry.get('SubProcess_1'),\n          subProcessShape_3 = elementRegistry.get('SubProcess_3');\n\n      var originalBounds = getBounds(subProcessShape_1);\n\n      modeling.moveElements([ taskShape ], { x: 100, y: 0 }, subProcessShape_3);\n\n      var expectedBounds = assign(originalBounds, { width: 875 });\n\n      expect(subProcessShape_1).to.have.bounds(expectedBounds);\n    }));\n\n  });\n\n\n  describe('space-tool', function() {\n\n    var diagramXML = require('./AutoResize.space-tool.bpmn');\n\n    var taskShape,\n        participantShape,\n        originalBounds;\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n    beforeEach(inject(function(elementRegistry) {\n\n      taskShape = elementRegistry.get('Task_1');\n      participantShape = elementRegistry.get('Participant_1');\n\n      originalBounds = getBounds(participantShape);\n\n    }));\n\n\n    it('should not expand after space-tool', inject(function(modeling) {\n\n      // given\n      var delta = { x: 50, y: 0 },\n          direction = 'e';\n\n      // when\n      modeling.createSpace([ taskShape ], [], delta, direction);\n\n      // then\n      var newBounds = getBounds(participantShape);\n\n      expect(originalBounds).to.eql(newBounds);\n    }));\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/context-pad/ContextPad.activation.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"_YWzgwMAgEeWCy-VqtWH9BA\" targetNamespace=\"http://activiti.org/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"18.3.1\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:category id=\"Category_1\">\n    <bpmn2:categoryValue id=\"CategoryValue_1\" />\n  </bpmn2:category>\n  <bpmn2:collaboration id=\"Collaboration_1ya2k54\">\n    <bpmn2:participant id=\"Participant_1ifebeg\" processRef=\"Process_1\" />\n    <bpmn2:participant id=\"Participant_1g4vnfq\" processRef=\"Process_01vjiz5\" />\n    <bpmn2:messageFlow id=\"MessageFlow_1\" sourceRef=\"Participant_1g4vnfq\" targetRef=\"Participant_1ifebeg\" />\n    <bpmn2:group id=\"Group_1\" categoryValueRef=\"CategoryValue_1\" />\n    <bpmn2:textAnnotation id=\"TextAnnotation_1\">\n      <bpmn2:text>simple text annotation</bpmn2:text>\n    </bpmn2:textAnnotation>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:eventBasedGateway id=\"EventBasedGateway_1\" />\n    <bpmn2:task id=\"Task_1\">\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n    </bpmn2:task>\n    <bpmn2:task id=\"Task_2\" isForCompensation=\"true\" />\n    <bpmn2:endEvent id=\"EndEvent_1\" />\n    <bpmn2:dataStoreReference id=\"DataStoreReference\" />\n    <bpmn2:dataObjectReference id=\"DataObjectReference\" dataObjectRef=\"DataObject_1\" />\n    <bpmn2:dataObject id=\"DataObject_1\" name=\"Data Object 1\" />\n    <bpmn2:task id=\"Task_3\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:task>\n    <bpmn2:boundaryEvent id=\"BoundaryEvent_1\" name=\"\" attachedToRef=\"Task_1\">\n      <bpmn2:compensateEventDefinition id=\"CompensateEventDefinition_1\" />\n    </bpmn2:boundaryEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"Task_3\" targetRef=\"Task_1\" />\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_01vjiz5\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1ya2k54\">\n      <bpmndi:BPMNShape id=\"Participant_1ifebeg_di\" bpmnElement=\"Participant_1ifebeg\" isHorizontal=\"true\">\n        <dc:Bounds x=\"160\" y=\"52\" width=\"990\" height=\"330\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EventBasedGateway_2\" bpmnElement=\"EventBasedGateway_1\">\n        <dc:Bounds x=\"378\" y=\"72\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"133\" y=\"127\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"354\" y=\"180\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_4\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"534\" y=\"180\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"566\" y=\"80\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"314\" y=\"121\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_DataStoreReference_2\" bpmnElement=\"DataStoreReference\">\n        <dc:Bounds x=\"379\" y=\"312\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"95\" y=\"367\" width=\"79\" height=\"21\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_DataObjectReference_2\" bpmnElement=\"DataObjectReference\">\n        <dc:Bounds x=\"583\" y=\"312\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"257\" y=\"367\" width=\"149\" height=\"21\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0l4jury_di\" bpmnElement=\"Task_3\">\n        <dc:Bounds x=\"210\" y=\"180\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_BoundaryEvent_2\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds x=\"379\" y=\"242\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1kmsvyl_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"310\" y=\"220\" />\n        <di:waypoint x=\"354\" y=\"220\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Participant_1g4vnfq_di\" bpmnElement=\"Participant_1g4vnfq\" isHorizontal=\"true\">\n        <dc:Bounds x=\"550\" y=\"570\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_1_di\" bpmnElement=\"MessageFlow_1\">\n        <di:waypoint x=\"850\" y=\"570\" />\n        <di:waypoint x=\"850\" y=\"382\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Group_1_di\" bpmnElement=\"Group_1\">\n        <dc:Bounds x=\"310\" y=\"410\" width=\"190\" height=\"110\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_1_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"1030\" y=\"120\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/context-pad/ContextPadProviderSpec.js",
    "content": "import {\n  bootstrapModeler,\n  getBpmnJS,\n  inject\n} from 'test/TestHelper';\n\nimport TestContainer from 'mocha-test-container-support';\n\nimport {\n  query as domQuery,\n  queryAll as domQueryAll\n} from 'min-dom';\n\nimport {\n  is\n} from 'lib/util/ModelUtil';\n\nimport {\n  createCanvasEvent as canvasEvent\n} from '../../../util/MockEvents';\n\nimport contextPadModule from 'lib/features/context-pad';\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\nimport replaceMenuModule from 'lib/features/popup-menu';\nimport createModule from 'diagram-js/lib/features/create';\nimport customRulesModule from '../../../util/custom-rules';\nimport autoPlaceModule from 'lib/features/auto-place';\nimport appendMenuProvider from 'lib/features/popup-menu';\n\n\ndescribe('features - context-pad', function() {\n\n  var testModules = [\n    coreModule,\n    modelingModule,\n    contextPadModule,\n    replaceMenuModule,\n    customRulesModule,\n    createModule,\n    appendMenuProvider\n  ];\n\n\n  describe('remove action rules', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/simple.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    var deleteAction;\n\n    beforeEach(inject(function(contextPad) {\n\n      deleteAction = function(target) {\n        return padEntry(contextPad.getPad(target).html, 'delete');\n      };\n    }));\n\n\n    it('should add delete action by default', inject(function(elementRegistry, contextPad) {\n\n      // given\n      var element = elementRegistry.get('StartEvent_1');\n\n      // when\n      contextPad.open(element);\n\n      // then\n      expect(deleteAction(element)).to.exist;\n    }));\n\n\n    it('should add delete action to elements label by default', inject(function(elementRegistry, contextPad) {\n\n      // given\n      var element = elementRegistry.get('StartEvent_1');\n      var label = element.label;\n\n      // when\n      contextPad.open(label);\n\n      // then\n      expect(deleteAction(label)).to.exist;\n    }));\n\n\n    it('should include delete action when rule returns true',\n      inject(function(elementRegistry, contextPad, customRules) {\n\n        // given\n        customRules.addRule('elements.delete', 1500, function() {\n          return true;\n        });\n\n        var element = elementRegistry.get('StartEvent_1');\n\n        // when\n        contextPad.open(element);\n\n        // then\n        expect(deleteAction(element)).to.exist;\n      })\n    );\n\n\n    it('should NOT include delete action when rule returns false',\n      inject(function(elementRegistry, contextPad, customRules) {\n\n        // given\n        customRules.addRule('elements.delete', 1500, function() {\n          return false;\n        });\n\n        var element = elementRegistry.get('StartEvent_1');\n\n        // when\n        contextPad.open(element);\n\n        // then\n        expect(deleteAction(element)).not.to.exist;\n      })\n    );\n\n\n    it('should call rules with [ element ]', inject(function(elementRegistry, contextPad, customRules) {\n\n      // given\n      var element = elementRegistry.get('StartEvent_1');\n\n      customRules.addRule('elements.delete', 1500, function(context) {\n\n        // element array is actually passed\n        expect(context.elements).to.eql([ element ]);\n\n        return true;\n      });\n\n      // then\n      expect(function() {\n        contextPad.open(element);\n      }).not.to.throw();\n    }));\n\n\n    it('should include delete action when [ element ] is returned from rule',\n      inject(function(elementRegistry, contextPad, customRules) {\n\n        // given\n        customRules.addRule('elements.delete', 1500, function(context) {\n          return context.elements;\n        });\n\n        var element = elementRegistry.get('StartEvent_1');\n\n        // when\n        contextPad.open(element);\n\n        // then\n        expect(deleteAction(element)).to.exist;\n      })\n    );\n\n\n    it('should NOT include delete action when [ ] is returned from rule',\n      inject(function(elementRegistry, contextPad, customRules) {\n\n        // given\n        customRules.addRule('elements.delete', 1500, function() {\n          return [];\n        });\n\n        var element = elementRegistry.get('StartEvent_1');\n\n        // when\n        contextPad.open(element);\n\n        // then\n        expect(deleteAction(element)).not.to.exist;\n      })\n    );\n\n\n    describe('multi-element', function() {\n\n      it('should add delete action by default', inject(\n        function(elementRegistry, contextPad) {\n\n          // given\n          var event = elementRegistry.get('StartEvent_1'),\n              task = elementRegistry.get('Task_1');\n\n          // when\n          contextPad.open([ event, task ]);\n\n          // then\n          expect(deleteAction([ event, task ])).to.exist;\n        }\n      ));\n\n\n      it('should NOT add delete action when rule returns false', inject(\n        function(elementRegistry, contextPad, customRules) {\n\n          // given\n          customRules.addRule('elements.delete', 1500, function() {\n            return false;\n          });\n\n          var event = elementRegistry.get('StartEvent_1'),\n              task = elementRegistry.get('Task_1');\n\n          // when\n          contextPad.open([ event, task ]);\n\n          // then\n          expect(deleteAction([ event, task ])).not.to.exist;\n        }\n      ));\n\n\n      it('should trigger batch delete', inject(\n        function(elementRegistry, contextPad, customRules) {\n\n          // given\n          var event = elementRegistry.get('StartEvent_1'),\n              task = elementRegistry.get('Task_1');\n\n          contextPad.open([ event, task ]);\n\n          // when\n          contextPad.trigger('click', padEvent('delete'));\n\n          // then\n          expect(elementRegistry.get('StartEvent_1')).not.to.exist;\n          expect(elementRegistry.get('Task_1')).not.to.exist;\n        }\n      ));\n\n    });\n\n  });\n\n\n  describe('available entries', function() {\n\n    var diagramXML = require('./ContextPad.activation.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n    function expectContextPadEntries(elementOrId, expectedEntries) {\n\n      getBpmnJS().invoke(function(elementRegistry, contextPad) {\n\n        var element = typeof elementOrId === 'string' ? elementRegistry.get(elementOrId) : elementOrId;\n\n        contextPad.open(element, true);\n\n        var entries = contextPad._current.entries;\n\n        expectedEntries.forEach(function(name) {\n\n          if (name.charAt(0) === '!') {\n            name = name.substring(1);\n\n            expect(entries).not.to.have.property(name);\n          } else {\n            expect(entries).to.have.property(name);\n          }\n        });\n      });\n    }\n\n\n    it('should provide Task entries', inject(function() {\n\n      expectContextPadEntries('Task_1', [\n        'connect',\n        'replace',\n        'append.end-event',\n        'append.gateway',\n        'append.append-task',\n        'append.intermediate-event',\n        'append.text-annotation'\n      ]);\n    }));\n\n\n    it('should provide EventBasedGateway entries', inject(function() {\n\n      expectContextPadEntries('EventBasedGateway_1', [\n        'connect',\n        'replace',\n        'append.receive-task',\n        'append.message-intermediate-event',\n        'append.timer-intermediate-event',\n        'append.condition-intermediate-event',\n        'append.signal-intermediate-event',\n        'append.text-annotation',\n        '!append.task'\n      ]);\n    }));\n\n\n    it('should provide EndEvent entries', inject(function() {\n\n      expectContextPadEntries('EndEvent_1', [\n        'connect',\n        'replace',\n        '!append.task'\n      ]);\n    }));\n\n\n    it('should provide Compensation Activity entries', inject(function() {\n\n      expectContextPadEntries('Task_2', [\n        'connect',\n        'replace',\n        '!append.end-event',\n        'append.text-annotation'\n      ]);\n    }));\n\n\n    it('should provide Compensate Boundary entries', inject(function() {\n\n      expectContextPadEntries('BoundaryEvent_1', [\n        'connect',\n        'replace',\n        'append.compensation-activity',\n        '!append.end-event'\n      ]);\n    }));\n\n\n    it('should provide DataStoreReference entries', inject(function() {\n\n      expectContextPadEntries('DataStoreReference', [\n        'connect',\n        'append.text-annotation',\n        'replace',\n        '!append.end-event'\n      ]);\n    }));\n\n\n    it('should provide DataObjectReference entries', inject(function() {\n\n      expectContextPadEntries('DataObjectReference', [\n        'connect',\n        'append.text-annotation',\n        'replace',\n        '!append.end-event'\n      ]);\n    }));\n\n\n    it('should provide Group entries', inject(function() {\n\n      expectContextPadEntries('Group_1', [\n        'append.text-annotation',\n        'delete',\n        '!replace'\n      ]);\n    }));\n\n\n    it('should provide Text Annotation entries', inject(function() {\n\n      expectContextPadEntries('TextAnnotation_1', [\n        'connect',\n        'delete',\n        '!replace',\n        '!append.text-annotation'\n      ]);\n    }));\n\n\n    it('should provide SequenceFlow entries', inject(function() {\n\n      expectContextPadEntries('SequenceFlow_1', [\n        'append.text-annotation',\n        'delete',\n        'replace',\n        '!connect'\n      ]);\n    }));\n\n\n    it('should provide MessageFlow entries', inject(function() {\n\n      expectContextPadEntries('MessageFlow_1', [\n        'append.text-annotation',\n        'delete',\n        '!replace',\n        '!connect'\n      ]);\n    }));\n\n  });\n\n\n  describe('create', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/simple.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    it('should attach boundary event', inject(function(dragging, contextPad, elementRegistry) {\n\n      // given\n      var task = elementRegistry.get('Task_1');\n\n      // when\n      contextPad.open(task);\n\n      contextPad.trigger('dragstart', padEvent('append.intermediate-event'));\n\n      dragging.move(canvasEvent({ x: task.x, y: task.y }));\n      dragging.hover({ element: task });\n      dragging.move(canvasEvent({ x: task.x + 80, y: task.y + 70 }));\n      dragging.end();\n\n      // then\n      expect(task.attachers).to.have.length(1);\n    }));\n\n\n    it('should attach boundary event to other target', inject(\n      function(dragging, contextPad, elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task_1');\n\n        var subProcess = elementRegistry.get('SubProcess_1');\n\n        // when\n        contextPad.open(task);\n\n        contextPad.trigger('dragstart', padEvent('append.intermediate-event'));\n\n        dragging.move(canvasEvent({ x: subProcess.x, y: subProcess.y }));\n        dragging.hover({ element: subProcess });\n        dragging.move(canvasEvent({ x: subProcess.x + 80, y: subProcess.y + 5 }));\n        dragging.end();\n\n        // then\n        expect(subProcess.attachers).to.have.length(1);\n      })\n    );\n\n\n    it('should append gateway with marker', inject(\n      function(dragging, contextPad, elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task_1');\n\n        // when\n        contextPad.open(task);\n\n        contextPad.trigger('dragstart', padEvent('append.gateway'));\n\n        dragging.move(canvasEvent({ x: task.x, y: task.y }));\n        dragging.hover({ element: task });\n        dragging.move(canvasEvent({ x: task.x + task.width + 30, y: task.y }));\n\n        var context = dragging.context(),\n            elements = context.data.elements;\n\n        dragging.end();\n\n        // then\n        expect(elements).to.have.length(1);\n        expect(is(elements[0], 'bpmn:ExclusiveGateway')).to.be.true;\n        expect(elements[0].di.isMarkerVisible).to.be.true;\n      })\n    );\n\n\n    describe('drop onto sub-process', function() {\n\n      var basicTests = [\n        { action: 'append.append-task', expectedElement: 'bpmn:Task' },\n        { action: 'append.intermediate-event', expectedElement: 'bpmn:IntermediateThrowEvent' }\n      ];\n\n\n      for (const { action, expectedElement, iit = it } of basicTests) {\n\n        iit(`should create ${expectedElement}`, inject(function(dragging, contextPad, elementRegistry) {\n\n          // given\n          var subProcess = elementRegistry.get('SubProcess_1');\n\n          // when\n          contextPad.open(subProcess);\n\n          contextPad.trigger('dragstart', padEvent(action));\n\n          dragging.move(canvasEvent({ x: subProcess.x, y: subProcess.y }));\n          dragging.hover({ element: subProcess });\n          dragging.move(canvasEvent({ x: subProcess.x + 200, y: subProcess.y + 70 }));\n          dragging.end();\n\n          // then\n          // find new, unnamed element\n          var newElement = subProcess.children.find(element => {\n            return (\n              is(element, expectedElement) &&\n              !element.businessObject.name\n            );\n          });\n\n          expect(newElement, `element of type ${expectedElement}`).to.exist;\n\n          expect(newElement.incoming, 'incoming connections').to.be.empty;\n        }));\n\n      }\n\n    });\n\n  });\n\n\n  describe('replace', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/simple.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    it('should show popup menu in the correct position', inject(function(elementRegistry, contextPad) {\n\n      // given\n      var element = elementRegistry.get('StartEvent_1'),\n          padding = { y: 6, x: 1 },\n          padMenuRect,\n          replaceMenuRect;\n\n      contextPad.open(element);\n\n      // when\n      contextPad.trigger('click', padEvent('replace'));\n\n      padMenuRect = contextPad.getPad(element).html.getBoundingClientRect();\n      replaceMenuRect = getPopupMenu().getBoundingClientRect();\n\n      // then\n      expect(replaceMenuRect.left).to.be.at.most(padMenuRect.left + padding.x);\n      expect(replaceMenuRect.top).to.be.at.most(padMenuRect.bottom + padding.y);\n    }));\n\n\n    it('should hide wrench if replacement is disallowed', inject(\n      function(elementRegistry, contextPad, customRules) {\n\n        // given\n        var element = elementRegistry.get('StartEvent_1');\n\n        // disallow replacement\n        customRules.addRule('shape.replace', function(context) {\n          return !is(context.element, 'bpmn:StartEvent');\n        });\n\n        // when\n        contextPad.open(element);\n\n        var padNode = contextPad.getPad(element).html;\n\n        // then\n        expect(padEntry(padNode, 'replace')).not.to.exist;\n      }\n    ));\n\n\n    it('should show wrench if replacement is allowed', inject(\n      function(elementRegistry, contextPad, customRules) {\n\n        // given\n        var element = elementRegistry.get('EndEvent_1');\n\n        // disallow replacement\n        customRules.addRule('shape.replace', function(context) {\n          return !is(context.element, 'bpmn:StartEvent');\n        });\n\n        // when\n        contextPad.open(element);\n\n        var padNode = contextPad.getPad(element).html;\n\n        // then\n        expect(padEntry(padNode, 'replace')).to.exist;\n      }\n    ));\n\n\n    describe('create + <CTRL>', function() {\n\n      it('should open replace', inject(\n        function(create, dragging, canvas, elementFactory, popupMenu) {\n\n          // given\n          var rootShape = canvas.getRootElement(),\n              startEvent = elementFactory.createShape({ type: 'bpmn:StartEvent' });\n\n          // when\n          create.start(canvasEvent({ x: 0, y: 0 }), startEvent);\n\n          dragging.move(canvasEvent({ x: 50, y: 50 }));\n          dragging.hover({ element: rootShape });\n          dragging.move(canvasEvent({ x: 75, y: 75 }));\n\n          dragging.end(canvasEvent({ x: 75, y: 75 }, { ctrlKey: true, metaKey: true }));\n\n          // then\n          expect(popupMenu.isOpen()).to.be.true;\n        }\n      ));\n\n\n      it('should open boundary event replace menu', inject(\n        function(create, dragging, canvas, elementFactory, modeling, popupMenu) {\n\n          // given\n          var rootShape = canvas.getRootElement();\n          var task = elementFactory.createShape({ type: 'bpmn:Task' });\n          var intermediateEvent = elementFactory.createShape({ type: 'bpmn:IntermediateThrowEvent' });\n\n          modeling.createShape(task, { x: 100, y: 100 }, rootShape);\n\n          // when\n          create.start(canvasEvent({ x: 0, y: 0 }), intermediateEvent);\n\n          dragging.move(canvasEvent({ x: 50, y: 50 }));\n          dragging.hover({ element: task });\n          dragging.move(canvasEvent({ x: 50, y: 65 }));\n\n          dragging.end(canvasEvent({ x: 50, y: 65 }, { ctrlKey: true, metaKey: true }));\n\n          // then\n          var replaceMenuEntries = domQueryAll('[data-id$=\"-boundary\"]', getPopupMenu());\n          expect(replaceMenuEntries).to.have.length(12);\n        }\n      ));\n\n\n      it('should not open non-existing replace menu', inject(\n        function(create, dragging, canvas, elementFactory) {\n\n          // given\n          var rootShape = canvas.getRootElement(),\n              group = elementFactory.createShape({ type: 'bpmn:Group' }),\n              replaceMenu;\n\n          // when\n          create.start(canvasEvent({ x: 0, y: 0 }), group);\n\n          dragging.move(canvasEvent({ x: 50, y: 50 }));\n          dragging.hover({ element: rootShape });\n          dragging.move(canvasEvent({ x: 300, y: 300 }));\n\n          dragging.end(canvasEvent({ x: 300, y: 300 }, { ctrlKey: true, metaKey: true }));\n\n          replaceMenu = domQuery('.bpmn-replace', getPopupMenu());\n\n          // then\n          expect(replaceMenu).not.to.exist;\n        }\n      ));\n\n\n      it('should NOT open replace menu if context pad NOT open', inject(\n        function(canvas, create, dragging, elementFactory) {\n\n          // given\n          var rootShape = canvas.getRootElement(),\n              startEvent = elementFactory.createShape({ type: 'bpmn:StartEvent' }),\n              task = elementFactory.createShape({ type: 'bpmn:Task' });\n\n          // when\n          create.start(canvasEvent({ x: 0, y: 0 }), [ startEvent, task ]);\n\n          dragging.move(canvasEvent({ x: 50, y: 50 }));\n          dragging.hover({ element: rootShape });\n          dragging.move(canvasEvent({ x: 75, y: 75 }));\n\n          dragging.end(canvasEvent({ x: 75, y: 75 }, { ctrlKey: true, metaKey: true }));\n\n          // then\n          var replaceMenu = getPopupMenu();\n          expect(replaceMenu).not.to.exist;\n        }\n      ));\n\n    });\n\n  });\n\n\n  describe('auto place', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/simple.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules.concat(autoPlaceModule)\n    }));\n\n\n    it('should trigger', inject(function(elementRegistry, contextPad) {\n\n      // given\n      var element = elementRegistry.get('Task_1');\n\n      contextPad.open(element);\n\n      // mock event\n      var event = padEvent('append.gateway');\n\n      // when\n      contextPad.trigger('click', event);\n\n      // then\n      expect(element.outgoing).to.have.length(1);\n    }));\n\n  });\n\n\n  describe('disabled auto-place', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/simple.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules.concat(autoPlaceModule),\n      contextPad: {\n        autoPlace: false\n      }\n    }));\n\n    var container;\n\n    beforeEach(function() {\n      container = TestContainer.get(this);\n    });\n\n\n    it('should default to drag start', inject(function(elementRegistry, contextPad, dragging) {\n\n      // given\n      var element = elementRegistry.get('Task_1');\n\n      contextPad.open(element);\n\n      // mock event\n      var event = {\n        clientX: 100,\n        clientY: 100,\n        target: padEntry(container, 'append.gateway'),\n        preventDefault: function() {}\n      };\n\n      // when\n      contextPad.trigger('click', event);\n\n      // then\n      expect(dragging.context()).to.exist;\n    }));\n\n  });\n\n\n  describe('preview', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/simple.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules.concat(autoPlaceModule)\n    }));\n\n\n    it('should preview append', inject(function(canvas, elementRegistry, contextPad) {\n\n      // given\n      var element = elementRegistry.get('Task_1');\n\n      contextPad.open(element);\n\n      // mock event\n      var event = padEvent('append.gateway');\n\n      // when\n      contextPad.trigger('hover', event);\n\n      // then\n      expect(canvas.getLayer('complex-preview')).to.exist;\n      expect(domQueryAll('.djs-dragger', canvas.getLayer('complex-preview'))).to.have.length(2);\n    }));\n\n\n    it('should remove append preview on close', inject(function(canvas, elementRegistry, contextPad) {\n\n      // given\n      var element = elementRegistry.get('Task_1');\n\n      contextPad.open(element);\n\n      // mock event\n      var event = padEvent('append.gateway');\n\n      contextPad.trigger('hover', event);\n\n      expect(canvas.getLayer('complex-preview')).to.exist;\n      expect(domQueryAll('.djs-dragger', canvas.getLayer('complex-preview'))).to.have.length(2);\n\n      // when\n      contextPad.close();\n\n      // then\n      expect(domQueryAll('.djs-dragger', canvas.getLayer('complex-preview'))).to.have.length(0);\n    }));\n\n  });\n\n});\n\n\nfunction padEntry(element, name) {\n  return domQuery('[data-action=\"' + name + '\"]', element);\n}\n\n\nfunction padEvent(entry) {\n\n  return getBpmnJS().invoke(function(canvas) {\n\n    var target = padEntry(canvas.getContainer(), entry);\n\n    return {\n      target: target,\n      preventDefault: function() {},\n      clientX: 100,\n      clientY: 100\n    };\n  });\n}\n\n\nfunction getPopupMenu() {\n  const popup = getBpmnJS().get('popupMenu');\n\n  return popup._current && domQuery('.djs-popup', popup._current.container);\n}"
  },
  {
    "path": "test/spec/features/copy-paste/BpmnCopyPasteSpec.js",
    "content": "import {\n  bootstrapModeler,\n  getBpmnJS,\n  inject\n} from 'test/TestHelper';\n\nimport bpmnCopyPasteModule from 'lib/features/copy-paste';\nimport copyPasteModule from 'diagram-js/lib/features/copy-paste';\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\n\nimport camundaPackage from 'camunda-bpmn-moddle/resources/camunda.json';\n\nimport {\n  find,\n  forEach,\n  isArray,\n  isNumber,\n  keys,\n  map,\n  pick,\n  reduce\n} from 'min-dash';\n\nimport {\n  getBusinessObject,\n  getDi,\n  is\n} from 'lib/util/ModelUtil';\n\nimport { isRoot } from 'diagram-js/lib/util/ModelUtil';\n\n/**\n * @typedef {import('../../../../lib/model/Types').Element} Element\n */\n\n\ndescribe('features/copy-paste', function() {\n\n  var testModules = [\n    bpmnCopyPasteModule,\n    copyPasteModule,\n    coreModule,\n    modelingModule\n  ];\n\n  var basicXML = require('./basic.bpmn'),\n      copyPropertiesXML = require('./copy-properties.bpmn'),\n      propertiesXML = require('./properties.bpmn'),\n      complexXML = require('./complex.bpmn'),\n      collaborationXML = require('./collaboration.bpmn'),\n      collaborationMultipleXML = require('./collaboration-multiple.bpmn'),\n      collaborationAssociationsXML = require('./data-associations.bpmn'),\n      eventBasedGatewayXML = require('./event-based-gateway.bpmn'),\n      collapsedSubprocessXML = require('./collapsed-subprocess.bpmn'),\n      nestedSubprocessAnnotationsXML = require('./nested-subprocess-annotations.bpmn');\n\n\n  describe('basic diagram', function() {\n\n    beforeEach(bootstrapModeler(basicXML, {\n      modules: testModules\n    }));\n\n\n    describe('copy', function() {\n\n      it('should copy sub process', inject(function() {\n\n        // when\n        var tree = copy('SubProcess_1');\n\n        // then\n        expect(keys(tree)).to.have.length(3);\n\n        expect(getAllElementsInTree(tree, 0)).to.have.length(1);\n        expect(getAllElementsInTree(tree, 1)).to.have.length(3);\n        expect(getAllElementsInTree(tree, 2)).to.have.length(12);\n\n        expect(findDescriptorInTree('SubProcess_1', tree).isExpanded).to.be.true;\n      }));\n\n\n      describe('should copy boundary events without host', function() {\n\n        it('should copy/paste', inject(function(elementRegistry, canvas, copyPaste) {\n\n          // given\n          var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n              rootElement = canvas.getRootElement();\n\n          // when\n          copyPaste.copy(boundaryEvent);\n\n          var copiedElements = copyPaste.paste({\n            element: rootElement,\n            point: {\n              x: 1000,\n              y: 1000\n            }\n          });\n\n          // then\n          expect(rootElement.children).to.have.length(2);\n\n          expect(copiedElements).to.have.length(1);\n\n          expect(copiedElements[0].type).to.eql('bpmn:IntermediateCatchEvent');\n\n          expect(copiedElements[0].attachedToRef).to.be.undefined;\n\n          expect(copiedElements[0].host).to.be.undefined;\n\n          expect(copiedElements[0].id).not.to.eql(boundaryEvent.id);\n        }));\n\n\n        it('should copy/paste and reattach', inject(function(elementRegistry, canvas, copyPaste) {\n\n          // given\n          var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n              task = elementRegistry.get('Task_1'),\n              rootElement = canvas.getRootElement();\n\n          // when\n          copyPaste.copy(boundaryEvent);\n\n          var copiedElement = copyPaste.paste({\n            element: rootElement,\n            point: {\n              x: 1000,\n              y: 1000\n            }\n          })[0];\n\n          copyPaste.copy(copiedElement);\n\n          var attachedBoundaryEvent = copyPaste.paste({\n            element: task,\n            point: {\n              x: task.x,\n              y: task.y\n            },\n            hints: {\n              attach: 'attach'\n            }\n          })[0];\n\n          // then\n          expect(attachedBoundaryEvent.businessObject.attachedToRef).to.eql(task.businessObject);\n          expect(attachedBoundaryEvent.host).to.be.eql(task);\n          expect(attachedBoundaryEvent.type).to.eql('bpmn:BoundaryEvent');\n\n        }));\n\n      });\n\n\n      it('should not mutate copy', inject(function(copyPaste, elementRegistry, modeling) {\n\n        // given\n        var parent = elementRegistry.get('Process_1'),\n            event = elementRegistry.get('IntermediateThrowEvent_1');\n\n        copyPaste.copy(event);\n\n        // when\n        modeling.updateProperties(event, {\n          name: 'foo'\n        });\n\n        var elements = copyPaste.paste({\n          element: parent,\n          point: {\n            x: 1000,\n            y: 1000\n          }\n        });\n\n        // then\n        var pastedEvent = find(elements, function(element) {\n          return is(element, 'bpmn:IntermediateThrowEvent');\n        });\n\n        var pastedEventBo = getBusinessObject(pastedEvent);\n        expect(pastedEventBo.name).not.to.exist;\n      }));\n\n    });\n\n\n    it('should paste twice', inject(function(elementRegistry, canvas, copyPaste) {\n\n      // given\n      var subProcess = elementRegistry.get('SubProcess_1'),\n          rootElement = canvas.getRootElement();\n\n      // when\n      copyPaste.copy(subProcess);\n\n      copyPaste.paste({\n        element: rootElement,\n        point: {\n          x: 1000,\n          y: 1000\n        }\n      });\n\n      var elements = copyPaste.paste({\n        element: rootElement,\n        point: {\n          x: 2000,\n          y: 1000\n        }\n      });\n\n      // then\n      expect(rootElement.children).to.have.length(13);\n\n      var subProcesses = elements.filter(function(element) {\n        return is(element, 'bpmn:SubProcess');\n      });\n\n      expect(subProcesses[0].id).not.to.equal(subProcesses[1].id);\n      expect(subProcesses[0].businessObject).not.to.equal(subProcesses[1].businessObject);\n    }));\n\n\n    describe('integration', function() {\n\n      it('should copy conditionExpression and default flow properties',\n        inject(function(canvas, copyPaste, elementRegistry, modeling) {\n\n          // given\n          var subProcess = elementRegistry.get('SubProcess_1'),\n              rootElement = canvas.getRootElement();\n\n          // when\n          copyPaste.copy(subProcess);\n\n          modeling.removeShape(subProcess);\n\n          var elements = copyPaste.paste({\n            element: rootElement,\n            point: {\n              x: 300,\n              y: 300\n            }\n          });\n\n          // then\n          var task = find(elements, function(element) {\n            return is(element, 'bpmn:Task');\n          });\n\n          var taskBo = getBusinessObject(task);\n\n          var conditionalFlow = find(elementRegistry.getAll(), function(element) {\n            return is(element, 'bpmn:SequenceFlow') && element.businessObject.conditionExpression;\n          });\n\n          var defaultFlow = find(elementRegistry.getAll(), function(element) {\n            return is(element, 'bpmn:SequenceFlow') && taskBo.default.id === element.id;\n          });\n\n          expect(conditionalFlow).to.exist;\n          expect(defaultFlow).to.exist;\n          expect(Object.prototype.propertyIsEnumerable.call(taskBo, 'default')).to.be.false;\n        })\n      );\n\n\n      it('should copy attachedToRef properties', inject(function(canvas, copyPaste, elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task_1'),\n            boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n            rootElement = canvas.getRootElement();\n\n        // when\n        copyPaste.copy([ task, boundaryEvent ]);\n\n        var elements = copyPaste.paste({\n          element: rootElement,\n          point: {\n            x: 1000,\n            y: 1000\n          }\n        });\n\n        // then\n        task = find(elements, function(element) {\n          return is(element, 'bpmn:Task');\n        });\n\n        boundaryEvent = find(elements, function(element) {\n          return is(element, 'bpmn:BoundaryEvent');\n        });\n\n        // then\n        var boundaryEventBo = getBusinessObject(boundaryEvent);\n\n        expect(boundaryEventBo.attachedToRef).to.equal(getBusinessObject(task));\n      }));\n\n\n      it('should copy loopCharacteristics properties',\n        inject(function(canvas, copyPaste, elementRegistry, modeling) {\n\n          // given\n          var subProcess = elementRegistry.get('SubProcess_2'),\n              rootElement = canvas.getRootElement();\n\n          // when\n          copyPaste.copy(subProcess);\n\n          modeling.removeShape(subProcess);\n\n          var elements = copyPaste.paste({\n            element: rootElement,\n            point: {\n              x: 300,\n              y: 300\n            }\n          });\n\n          subProcess = find(elements, function(element) {\n            return is(element, 'bpmn:SubProcess');\n          });\n\n          var subProcessesBo = getBusinessObject(subProcess);\n\n          var loopCharacteristics = subProcessesBo.loopCharacteristics;\n\n          expect(loopCharacteristics.$type).to.equal('bpmn:MultiInstanceLoopCharacteristics');\n          expect(loopCharacteristics.isSequential).to.be.true;\n        })\n      );\n\n\n      it('should copy color properties',\n        inject(function(canvas, copyPaste, elementRegistry, modeling) {\n\n          // given\n          var task = elementRegistry.get('Task_1'),\n              rootElement = canvas.getRootElement(),\n              fill = '#ff0000',\n              stroke = '#00ff00';\n\n\n          // when\n          modeling.setColor(task, { fill: fill, stroke: stroke });\n\n          copyPaste.copy(task);\n\n          var elements = copyPaste.paste({\n            element: rootElement,\n            point: {\n              x: 1000,\n              y: 1000\n            }\n          });\n\n          // then\n          task = find(elements, function(element) {\n            return is(element, 'bpmn:Task');\n          });\n\n          var di = getDi(task);\n\n          expect(di.get('background-color')).to.equal(fill);\n          expect(di.get('border-color')).to.equal(stroke);\n\n          // TODO @barmac: remove when we drop bpmn.io properties\n          expect(di.fill).to.equal(fill);\n          expect(di.stroke).to.equal(stroke);\n        })\n      );\n\n\n      it('should copy label', inject(\n        function(canvas, copyPaste, elementRegistry) {\n\n          // given\n          var startEvent = elementRegistry.get('StartEvent_1'),\n              rootElement = canvas.getRootElement();\n\n          copyPaste.copy(startEvent);\n\n          // when\n          var elements = copyPaste.paste({\n            element: rootElement,\n            point: {\n              x: 50,\n              y: 50\n            }\n          });\n\n          // then\n          expect(elements).to.have.length(2);\n\n          var startEventCopy = find(elements, function(element) {\n            return is(element, 'bpmn:StartEvent');\n          });\n\n          var startEventCopyBo = getBusinessObject(startEventCopy);\n          var startEventCopyDi = getDi(startEventCopy);\n          var startEventCopyLabel = startEventCopy.label;\n\n          expect(startEventCopyBo).to.exist;\n          expect(startEventCopyBo.name).to.equal('hello');\n\n          expect(startEventCopyDi).to.exist;\n          expect(startEventCopyLabel).to.exist;\n\n          expect(startEventCopyLabel.di).to.equal(startEventCopyDi);\n          expect(startEventCopyLabel.businessObject).to.equal(startEventCopyBo);\n        }\n      ));\n\n\n      it('should copy name property', inject(\n        function(canvas, copyPaste, elementRegistry, modeling) {\n\n          // given\n          var startEvent = elementRegistry.get('StartEvent_1'),\n              rootElement = canvas.getRootElement();\n\n          copyPaste.copy(startEvent);\n\n          modeling.removeShape(startEvent);\n\n          // when\n          var elements = copyPaste.paste({\n            element: rootElement,\n            point: {\n              x: 300,\n              y: 300\n            }\n          });\n\n          // then\n          expect(elements).to.have.length(2);\n\n          startEvent = find(elements, function(element) {\n            return is(element, 'bpmn:StartEvent');\n          });\n\n          var startEventBo = getBusinessObject(startEvent);\n\n          expect(startEventBo.name).to.equal('hello');\n        }\n      ));\n\n\n      it('should wire DIs correctly', inject(\n        function(canvas, copyPaste, elementRegistry) {\n\n          // given\n          var subprcoess = elementRegistry.get('SubProcess_1'),\n              rootElement = canvas.getRootElement();\n\n          copyPaste.copy(subprcoess);\n\n          // when\n          var elements = copyPaste.paste({\n            element: rootElement,\n            point: {\n              x: 300,\n              y: 300\n            }\n          });\n\n          // then\n          var subprocess = elements[0];\n          var di = subprocess.di;\n\n          expect(di).to.exist;\n          expect(di.bpmnElement).to.exist;\n          expect(di.bpmnElement).to.equal(subprocess.businessObject);\n        }\n      ));\n\n    });\n\n\n    describe('rules', function() {\n\n      it('should allow copying boundary event without host', inject(function(elementRegistry) {\n\n        var boundaryEvent1 = elementRegistry.get('BoundaryEvent_1'),\n            boundaryEvent2 = elementRegistry.get('BoundaryEvent_2');\n\n        // when\n        var tree = copy([ boundaryEvent1, boundaryEvent2 ]);\n\n        expect(keys(tree)).to.have.length(1);\n      }));\n\n    });\n\n  });\n\n\n  describe('properties', function() {\n\n    beforeEach(bootstrapModeler(propertiesXML, { modules: testModules }));\n\n\n    function copyPasteElement(element) {\n\n      return getBpmnJS().invoke(function(canvas, copyPaste, elementRegistry, modeling) {\n\n        // given\n        element = elementRegistry.get(element);\n\n        var rootElement = canvas.getRootElement();\n\n        // when\n        copyPaste.copy(element);\n\n        modeling.removeShape(element);\n\n        return copyPaste.paste({\n          element: rootElement,\n          point: {\n            x: 1000,\n            y: 1000\n          }\n        });\n      });\n\n    }\n\n    it('should copy and paste non-interrupting boundary event', function() {\n\n      // when\n      var elements = copyPasteElement('SubProcess_NonInterrupting');\n\n      var subProcess = find(elements, function(element) {\n        return is(element, 'bpmn:SubProcess');\n      });\n\n      var boundaryEvent = subProcess.attachers[0],\n          boundaryEventBo = getBusinessObject(boundaryEvent);\n\n      // then\n      expect(boundaryEventBo.cancelActivity).to.be.false;\n    });\n\n\n    it('should copy and paste interrupting boundary event', function() {\n\n      // when\n      var elements = copyPasteElement('SubProcess_Interrupting');\n\n      var subProcess = find(elements, function(element) {\n        return is(element, 'bpmn:SubProcess');\n      });\n\n      var boundaryEvent = subProcess.attachers[0],\n          boundaryEventBo = getBusinessObject(boundaryEvent);\n\n      // then\n      expect(boundaryEventBo.cancelActivity).to.be.true;\n    });\n\n\n    it('should copy and paste event sub process', function() {\n\n      // when\n      var elements = copyPasteElement('SubProcess_Event');\n\n      var subProcess = find(elements, function(element) {\n        return is(element, 'bpmn:SubProcess');\n      });\n\n      var subProcessesBo = getBusinessObject(subProcess);\n\n      expect(subProcessesBo.triggeredByEvent).to.be.true;\n      expect(subProcessesBo.isExpanded).to.be.true;\n    });\n\n\n    it('should copy and paste transaction', function() {\n\n      // when\n      var elements = copyPasteElement('SubProcess_Transaction');\n\n      var transaction = find(elements, function(element) {\n        return is(element, 'bpmn:Transaction');\n      });\n\n      expect(transaction).to.exist;\n    });\n\n\n    it('should copy and paste group', function() {\n\n      // when\n      var elements = copyPasteElement('Group');\n\n      var group = find(elements, function(element) {\n        return is(element, 'bpmn:Group');\n      });\n\n      var groupBo = getBusinessObject(group);\n\n      expect(groupBo.categoryValueRef).to.exist;\n    });\n\n  });\n\n\n  describe('collaboration', function() {\n\n    beforeEach(bootstrapModeler(collaborationXML, { modules: testModules }));\n\n\n    describe('integration', function() {\n\n      it('expanded participant', integrationTest('Participant_1'));\n\n\n      it('collapsed participant', integrationTest('Participant_2'));\n\n    });\n\n\n    describe('rules', function() {\n\n      it('should NOT allow copying lanes without their parent participant', function() {\n\n        // when\n        var tree = copy([ 'Lane_1', 'Lane_2' ]);\n\n        // then\n        expect(keys(tree)).to.have.length(0);\n      });\n\n    });\n\n  });\n\n\n  describe('collaboration (multiple)', function() {\n\n    beforeEach(bootstrapModeler(collaborationMultipleXML, { modules: testModules }));\n\n\n    describe('basics', function() {\n\n      it('should paste onto lane', inject(function(copyPaste, elementRegistry) {\n\n        // given\n        var participant = elementRegistry.get('Participant_2'),\n            lane = elementRegistry.get('Lane_5'),\n            laneBo = getBusinessObject(lane),\n            task = elementRegistry.get('Task_1');\n\n        copyPaste.copy(task);\n\n        // when\n        copyPaste.paste({\n          element: lane,\n          point: {\n            x: 400,\n            y: 450\n          }\n        });\n\n        // then\n        expect(participant.children).to.have.length(7);\n\n        expect(lane.children).to.be.empty;\n        expect(laneBo.flowNodeRef).to.have.length(2);\n      }));\n\n\n      it('should paste onto nested lane', inject(function(copyPaste, elementRegistry) {\n\n        // given\n        var participant = elementRegistry.get('Participant_1'),\n            lane = elementRegistry.get('Lane_3'),\n            laneBo = getBusinessObject(lane),\n            task = elementRegistry.get('Task_2');\n\n        // when\n        copyPaste.copy(task);\n\n        copyPaste.paste({\n          element: lane,\n          point: {\n            x: 450,\n            y: 150\n          }\n        });\n\n        // then\n        expect(participant.children).to.have.length(5);\n\n        expect(lane.children).to.be.empty;\n        expect(lane.parent.children).to.have.length(2);\n        expect(laneBo.flowNodeRef).to.have.length(2);\n      }));\n\n    });\n\n\n    describe('integration', function() {\n\n      it('should copy and paste multiple participants', integrationTest([\n        'Participant_1',\n        'Participant_2'\n      ]));\n\n    });\n\n  });\n\n\n  describe('participants', function() {\n\n    beforeEach(bootstrapModeler(collaborationAssociationsXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    function expectEqual(copy, original) {\n      var originalBo = getBusinessObject(original);\n      var copyBo = getBusinessObject(copy);\n\n      expect(originalBo).not.to.equal(copyBo);\n\n      var originalProcessRef = originalBo.processRef;\n      var copyProcessRef = copyBo.processRef;\n\n      expect(copyProcessRef).not.to.equal(originalProcessRef);\n      expect(copyProcessRef.extensionElements).to.exist;\n      expect(copyProcessRef.extensionElements.values).to.have.length(1);\n      expect(copyProcessRef.get('flowElements')).to.have.length(originalProcessRef.get('flowElements').length);\n\n      var copyExecutionListener = copyProcessRef.extensionElements.values[0];\n      var originalExtensionListener = originalProcessRef.extensionElements.values[0];\n\n      expect(copyExecutionListener.$type).to.equal(originalExtensionListener.$type);\n      expect(copyExecutionListener.class).to.equal(originalExtensionListener.class);\n      expect(copyExecutionListener.event).to.equal(originalExtensionListener.event);\n    }\n\n\n    it('should copy participant with process', inject(\n      function(canvas, copyPaste, elementRegistry) {\n\n        // given\n        var participantInput = elementRegistry.get('Participant_Input'),\n            participantOutput = elementRegistry.get('Participant_Output'),\n            rootElement = canvas.getRootElement();\n\n        // when\n        copyPaste.copy([ participantInput, participantOutput ]);\n\n        var elements_1 = copyPaste.paste({\n          element: rootElement,\n          point: {\n            x: 5000,\n            y: 5000\n          }\n        });\n\n        // then\n        var participants_1 = elements_1.filter(function(element) {\n          return is(element, 'bpmn:Participant');\n        });\n\n        expect(participants_1).to.have.length(2);\n\n        expectEqual(participantInput, participants_1[0]);\n        expectEqual(participantOutput, participants_1[1]);\n\n        // but when\n        // paste second time\n        var elements_2 = copyPaste.paste({\n          element: rootElement,\n          point: {\n            x: 7000,\n            y: 5000\n          }\n        });\n\n        // then\n        var participants_2 = elements_2.filter(function(element) {\n          return is(element, 'bpmn:Participant');\n        });\n\n        expect(participants_2).to.have.length(2);\n\n        expectEqual(participants_2[0], participantInput);\n        expectEqual(participants_2[1], participantOutput);\n\n        expectEqual(participants_2[0], participants_1[0]);\n        expectEqual(participants_2[1], participants_1[1]);\n      }\n    ));\n\n\n    it('should copy and paste participant with DataInputAssociation',\n      integrationTest('Participant_Input'));\n\n\n    it('should copy and paste participant with DataOutputAssociation',\n      integrationTest('Participant_Output'));\n\n  });\n\n\n  describe('nested properties', function() {\n\n    beforeEach(bootstrapModeler(copyPropertiesXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    it('integration', integrationTest('Participant_1'));\n\n\n    it('should copy user task properties', inject(function(copyPaste, elementRegistry) {\n\n      var participant = elementRegistry.get('Participant_1'),\n          task = elementRegistry.get('Task_1'),\n          taskBo = getBusinessObject(task);\n\n      // when\n      copyPaste.copy(task);\n\n      var elements = copyPaste.paste({\n        element: participant,\n        point: {\n          x: 500,\n          y: 50\n        }\n      });\n\n      // then\n      var newTask = find(elements, function(element) {\n        return is(element, 'bpmn:Task');\n      });\n\n      var newTaskBo = getBusinessObject(newTask);\n\n      expect(newTaskBo.asyncBefore).to.equal(taskBo.asyncBefore);\n      expect(newTaskBo.documentation).to.jsonEqual(taskBo.documentation);\n      expect(newTaskBo.extensionElements).to.jsonEqual(taskBo.extensionElements);\n    }));\n\n  });\n\n\n  describe('event based gateway', function() {\n\n    beforeEach(bootstrapModeler(eventBasedGatewayXML, {\n      modules: testModules\n    }));\n\n\n    it('should copy and paste event based gateway connected to an event', integrationTest([\n      'EventBasedGateway_1',\n      'IntermediateCatchEvent_1'\n    ]));\n  });\n\n\n  describe('collapsed sub-process', function() {\n\n    beforeEach(bootstrapModeler(collapsedSubprocessXML, {\n      modules: testModules\n    }));\n\n\n    it('should paste with children', inject(\n      function(copyPaste, elementRegistry, modeling, bpmnjs) {\n\n        // given\n        var subProcess = elementRegistry.get('SUB_PROCESS'),\n            root = elementRegistry.get('PROCESS'),\n            definitions = bpmnjs.getDefinitions();\n\n        // when\n        copyPaste.copy(subProcess);\n\n        modeling.removeElements([ subProcess ]);\n\n        var pastedElements = copyPaste.paste({\n          element: root,\n          point: {\n            x: 500,\n            y: 50\n          }\n        });\n\n        // then\n        // elements pasted with original IDs\n        forEach([ 'SUB_PROCESS', 'SUB_TASK', 'SUB_BOUNDARY' ], function(id) {\n\n          var el = find(pastedElements, function(el) {\n            return el.id === id;\n          });\n\n          expect(el, 'element <' + id + '>').to.exist;\n        });\n\n        // referenced root element exists only once\n        var escalations = definitions.get('rootElements').filter(function(el) {\n          return el.$type === 'bpmn:Escalation';\n        });\n\n        expect(escalations).to.have.length(1);\n      }\n    ));\n\n  });\n\n\n  describe('expanded sub-process', function() {\n\n    beforeEach(bootstrapModeler(nestedSubprocessAnnotationsXML, {\n      modules: testModules\n    }));\n\n\n    it('should paste with children', inject(\n      function(canvas, copyPaste, elementRegistry) {\n\n        // given\n        var subProcess = elementRegistry.get('SubProcess_1'),\n            nestedSubProcess = elementRegistry.get('SubProcess_2'),\n            rootElement = canvas.getRootElement();\n\n        // when\n        copyPaste.copy(subProcess);\n\n        var pastedElements = copyPaste.paste({\n          element: rootElement,\n          point: {\n            x: 800,\n            y: 200\n          }\n        });\n\n        // then\n        var pastedSubProcesses = pastedElements.filter(function(el) {\n          return is(el, 'bpmn:SubProcess');\n        });\n\n        var pastedParentSubProcess = pastedSubProcesses.find(function(el) {\n          return el.parent === rootElement;\n        });\n\n        var pastedNestedSubProcess = pastedSubProcesses.find(function(el) {\n          return el.parent === pastedParentSubProcess;\n        });\n\n        expect(pastedSubProcesses).to.have.length(2);\n        expect(pastedNestedSubProcess).to.exist;\n        expect(pastedNestedSubProcess.children).to.have.length(nestedSubProcess.children.length);\n      }\n    ));\n\n\n    it('should paste with annotations', inject(\n      function(canvas, copyPaste, elementRegistry) {\n\n        // given\n        var subProcess = elementRegistry.get('SubProcess_1'),\n            rootElement = canvas.getRootElement();\n\n        // when\n        copyPaste.copy(subProcess);\n\n        var pastedElements = copyPaste.paste({\n          element: rootElement,\n          point: {\n            x: 800,\n            y: 200\n          }\n        });\n\n        // then\n        var pastedAnnotation = find(pastedElements, function(element) {\n          return is(element, 'bpmn:TextAnnotation');\n        });\n\n        var pastedAssociation = find(pastedElements, function(element) {\n          return is(element, 'bpmn:Association');\n        });\n\n        expect(pastedAnnotation).to.exist;\n        expect(pastedAssociation).to.exist;\n        expect(pastedAssociation.source).to.equal(\n          find(pastedElements, function(el) { return is(el, 'bpmn:Task'); })\n        );\n        expect(pastedAssociation.target).to.equal(pastedAnnotation);\n      }\n    ));\n\n  });\n\n\n  describe('complex', function() {\n\n    beforeEach(bootstrapModeler(complexXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    it('should mark as changed', inject(\n      function(canvas, eventBus, copyPaste, elementRegistry, commandStack) {\n\n        // given\n        var participant = elementRegistry.get('sid-187453C6-5AB5-4A6D-9A62-BF537E04EA0D'),\n            rootElement = canvas.getRootElement();\n\n        var changedSpy = sinon.spy(function(event) {\n          expect(event.elements).to.have.length(56);\n        });\n\n        // when\n        eventBus.on('elements.changed', changedSpy);\n\n        copyPaste.copy([ participant ]);\n\n        copyPaste.paste({\n          element: rootElement,\n          point: {\n            x: 800,\n            y: 300\n          }\n        });\n\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expect(changedSpy).to.have.been.calledThrice;\n      }\n    ));\n\n  });\n\n});\n\n\n// helpers //////////\n\n/**\n * Integration test involving copying, pasting, moving, undoing and redoing.\n *\n * @param {string|string[]} elementIds\n */\nfunction integrationTest(elementIds) {\n  if (!isArray(elementIds)) {\n    elementIds = [ elementIds ];\n  }\n\n  return function() {\n\n    getBpmnJS().invoke(function(canvas, commandStack, copyPaste, elementRegistry, modeling) {\n\n      // given\n      var allElements = elementRegistry.getAll();\n\n      var initialContext = {\n            length: allElements.length,\n            ids: getPropertyForElements(allElements, 'id'),\n            types: getPropertyForElements(allElements, 'type')\n          },\n          currentContext;\n\n      var elements = map(elementIds, function(elementId) {\n        return elementRegistry.get(elementId);\n      });\n\n      // (1) copy elements\n      copyPaste.copy(elements);\n\n      // (2) remove elements\n      modeling.removeElements(elements);\n\n      var rootElement = canvas.getRootElement();\n\n      // (3) paste elements\n      copyPaste.paste({\n        element: rootElement,\n        point: {\n          x: 500,\n          y: 500\n        }\n      });\n\n      // (4) move all elements except root\n      modeling.moveElements(elementRegistry.filter(element => !isRoot(element)), { x: 50, y: -50 });\n\n      // when\n      // (5) undo moving, pasting and removing\n      commandStack.undo();\n      commandStack.undo();\n      commandStack.undo();\n\n      elements = elementRegistry.getAll();\n\n      currentContext = {\n        length: elements.length,\n        ids: getPropertyForElements(elements, 'id')\n      };\n\n      // then\n      expect(initialContext.length).to.equal(currentContext.length);\n      expectCollection(initialContext.ids, currentContext.ids, true);\n\n      // when\n      // (6) redo removing, pasting and moving\n      commandStack.redo();\n      commandStack.redo();\n      commandStack.redo();\n\n      elements = elementRegistry.getAll();\n\n      currentContext = {\n        length: elements.length,\n        ids: getPropertyForElements(elements, 'id'),\n        types: getPropertyForElements(elements, 'type')\n      };\n\n      // then\n      expect(initialContext.length).to.equal(currentContext.length);\n      expectCollection(initialContext.ids, currentContext.ids, false);\n      expectCollection(initialContext.types, currentContext.types, true);\n    });\n\n  };\n}\n\nfunction getPropertyForElements(elements, property) {\n  return map(elements, function(element) {\n    return element[ property ];\n  });\n}\n\nfunction expectCollection(collection1, collection2, contains) {\n  expect(collection1).to.have.length(collection2.length);\n\n  forEach(collection2, function(element) {\n    if (!element.parent) {\n      return;\n    }\n\n    if (contains) {\n      expect(collection1).to.contain(element);\n    } else {\n      expect(collection1).not.to.contain(element);\n    }\n  });\n}\n\nfunction getAllElementsInTree(tree, depth) {\n  var depths;\n\n  if (isNumber(depth)) {\n    depths = pick(tree, [ depth ]);\n  } else {\n    depths = tree;\n  }\n\n  return reduce(depths, function(allElements, depth) {\n    return allElements.concat(depth);\n  }, []);\n}\n\nfunction findDescriptorInTree(elements, tree, depth) {\n  var foundDescriptors = _findDescriptorsInTree(elements, tree, depth);\n\n  if (foundDescriptors.length !== 1) {\n    return false;\n  }\n\n  return foundDescriptors[0];\n}\n\nfunction _findDescriptorsInTree(elements, tree, depth) {\n  if (!isArray(elements)) {\n    elements = [ elements ];\n  }\n\n  var depths;\n\n  if (isNumber(depth)) {\n    depths = pick(tree, [ depth ]);\n  } else {\n    depths = tree;\n  }\n\n  return reduce(elements, function(foundDescriptors, element) {\n    var foundDescriptor = reduce(depths, function(foundDescriptor, depth) {\n      return foundDescriptor || find(depth, function(descriptor) {\n        return element === descriptor.id || element.id === descriptor.id;\n      });\n    });\n\n    if (foundDescriptor) {\n      return foundDescriptors.concat(foundDescriptor);\n    }\n\n    return foundDescriptors;\n  }, []);\n}\n\n/**\n * Copy elements.\n *\n * @param {(string|Element)[]} elements\n *\n * @return {Object}\n */\nfunction copy(elements) {\n  if (!isArray(elements)) {\n    elements = [ elements ];\n  }\n\n  return getBpmnJS().invoke(function(copyPaste, elementRegistry) {\n\n    elements = elements.map(function(element) {\n      element = elementRegistry.get(element.id || element);\n\n      expect(element).to.exist;\n\n      return element;\n    });\n\n    return copyPaste.copy(elements);\n  });\n}\n"
  },
  {
    "path": "test/spec/features/copy-paste/ModdleCopySpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport copyPasteModule from 'lib/features/copy-paste';\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\n\nimport camundaModdleModule from 'camunda-bpmn-moddle/lib';\nimport camundaPackage from 'camunda-bpmn-moddle/resources/camunda.json';\n\nimport {\n  getBusinessObject,\n  is\n} from 'lib/util/ModelUtil';\n\nvar HIGH_PRIORITY = 3000;\n\n\ndescribe('features/copy-paste/ModdleCopy', function() {\n\n  var testModules = [\n    camundaModdleModule,\n    copyPasteModule,\n    coreModule,\n    modelingModule\n  ];\n\n  var basicXML = require('../../../fixtures/bpmn/basic.bpmn');\n\n  beforeEach(bootstrapModeler(basicXML, {\n    modules: testModules,\n    moddleExtensions: {\n      camunda: camundaPackage\n    }\n  }));\n\n\n  describe('simple', function() {\n\n    it('should copy primitive properties', inject(function(moddle, moddleCopy) {\n\n      // given\n      var userTask = moddle.create('bpmn:UserTask', {\n        asyncBefore: true\n      });\n\n      // when\n      var serviceTask = moddleCopy.copyElement(userTask, moddle.create('bpmn:ServiceTask'));\n\n      // then\n      expect(serviceTask.asyncBefore).to.be.true;\n\n      expectNoAttrs(serviceTask);\n    }));\n\n\n    it('should copy arrays of properties', inject(function(moddle, moddleCopy) {\n\n      // given\n      var messageEventDefinition = moddle.create('bpmn:MessageEventDefinition'),\n          signalEventDefinition = moddle.create('bpmn:SignalEventDefinition'),\n          startEvent = moddle.create('bpmn:StartEvent');\n\n      startEvent.eventDefinitions = [ messageEventDefinition, signalEventDefinition ];\n\n      // when\n      var endEvent = moddleCopy.copyElement(startEvent, moddle.create('bpmn:EndEvent'));\n\n      // then\n      var eventDefinitions = endEvent.eventDefinitions;\n\n      expect(eventDefinitions).to.have.length(2);\n      expect(eventDefinitions[0].$type).to.equal('bpmn:MessageEventDefinition');\n      expect(eventDefinitions[1].$type).to.equal('bpmn:SignalEventDefinition');\n\n      expectNoAttrs(endEvent);\n    }));\n\n\n    it('should NOT copy properties that are not allowed in target element', inject(\n      function(moddle, moddleCopy) {\n\n        // given\n        var userTask = moddle.create('bpmn:UserTask', {\n          assignee: 'foobar'\n        });\n\n        // when\n        var serviceTask = moddleCopy.copyElement(userTask, moddle.create('bpmn:ServiceTask'));\n\n        // then\n        expect(serviceTask.assignee).not.to.exist;\n\n        expectNoAttrs(serviceTask);\n      }\n    ));\n\n\n    it('should NOT copy IDs if taken', inject(function(moddle, moddleCopy, canvas, modeling) {\n\n      // given\n      var task = modeling.createShape({ type: 'bpmn:Task' },\n        { x: 0, y: 0 }, canvas.getRootElement());\n      var taskId = task.id;\n\n      // when\n      var userTask = moddleCopy.copyElement(task.businessObject, moddle.create('bpmn:UserTask'));\n\n      // then\n      expect(userTask.id).not.to.equal(taskId);\n\n      expectNoAttrs(userTask);\n    }));\n\n\n    it('should copy IDs if free', inject(function(moddle, moddleCopy, canvas, modeling) {\n\n      // given\n      var task = modeling.createShape({ type: 'bpmn:Task' },\n        { x: 0, y: 0 }, canvas.getRootElement());\n      var taskId = task.id;\n\n      // when\n      modeling.removeShape(task);\n      var userTask = moddleCopy.copyElement(task.businessObject, moddle.create('bpmn:UserTask'));\n\n      // then\n      expect(userTask.id).to.equal(taskId);\n\n      expectNoAttrs(userTask);\n    }));\n\n\n    it('should NOT copy <processRef>', inject(function(moddle, moddleCopy) {\n\n      // given\n      var processElement = moddle.create('bpmn:Process'),\n          participant = moddle.create('bpmn:Participant');\n\n      participant.processRef = processElement;\n\n      // when\n      var copiedParticipant = moddleCopy.copyElement(participant, moddle.create('bpmn:Participant'));\n\n      // then\n      expect(copiedParticipant).not.to.equal(participant);\n      expect(copiedParticipant.processRef).not.to.exist;\n    }));\n\n\n    it('should NOT copy misc references', inject(function(moddle, moddleCopy) {\n\n      // given\n      var label = moddle.create('bpmndi:BPMNLabel'),\n          labelStyle = moddle.create('bpmndi:BPMNLabelStyle');\n\n      label.labelStyle = labelStyle;\n\n      // when\n      var copiedLabel = moddleCopy.copyElement(label, moddle.create('bpmndi:BPMNLabel'));\n\n      // then\n      expect(copiedLabel.labelStyle).not.to.exist;\n    }));\n\n\n    it('should copy extension elements last', inject(function(moddleCopy, eventBus, moddle) {\n\n      // given\n      var connector = moddle.create('camunda:Connector'),\n          extensionElements = moddle.create('bpmn:ExtensionElements'),\n          messageEventDefinition = moddle.create('bpmn:MessageEventDefinition'),\n          messageEndEvent = moddle.create('bpmn:EndEvent');\n\n      connector.$parent = extensionElements;\n\n      extensionElements.$parent = messageEventDefinition;\n      extensionElements.values = [ connector ];\n\n      messageEventDefinition.$parent = messageEndEvent;\n      messageEventDefinition.extensionElements = extensionElements;\n\n      messageEndEvent.eventDefinitions = [ messageEventDefinition ];\n\n      var propertyNames = [];\n\n      eventBus.on('moddleCopy.canCopyProperty', function(context) {\n        var propertyName = context.propertyName;\n\n        propertyNames.push(propertyName);\n      });\n\n      moddleCopy.copyElement(messageEndEvent, moddle.create('bpmn:EndEvent'), [\n        'extensionElements',\n        'name'\n      ]);\n\n      expect(propertyNames).to.eql([\n        'name',\n        'extensionElements'\n      ]);\n    }));\n\n\n    it('should NOT copy empty extension elements', inject(function(moddle, moddleCopy) {\n\n      // given\n      var connector = moddle.create('camunda:Connector'),\n          extensionElements = moddle.create('bpmn:ExtensionElements'),\n          messageEventDefinition = moddle.create('bpmn:MessageEventDefinition'),\n          messageEndEvent = moddle.create('bpmn:EndEvent');\n\n      connector.$parent = extensionElements;\n\n      extensionElements.$parent = messageEventDefinition;\n      extensionElements.values = [ connector ];\n\n      messageEventDefinition.$parent = messageEndEvent;\n      messageEventDefinition.extensionElements = extensionElements;\n\n      messageEndEvent.eventDefinitions = [ messageEventDefinition ];\n\n      var startEvent = moddleCopy.copyElement(messageEndEvent, moddle.create('bpmn:StartEvent'));\n\n      // connector not allowed in start event\n      expect(startEvent.eventDefinitions[0].extensionElements).not.to.exist;\n    }));\n\n\n    it('should only copy specified properties', inject(function(moddle, moddleCopy) {\n\n      // given\n      var userTask = moddle.create('bpmn:UserTask', {\n        asyncBefore: true,\n        name: 'foo'\n      });\n\n      // when\n      var serviceTask = moddleCopy.copyElement(\n        userTask,\n        moddle.create('bpmn:ServiceTask'),\n        'asyncBefore'\n      );\n\n      // then\n      expect(serviceTask.asyncBefore).to.be.true;\n      expect(serviceTask.name).not.to.exist;\n\n      expectNoAttrs(serviceTask);\n    }));\n\n  });\n\n\n  describe('nested', function() {\n\n    it('should copy documentation', inject(function(moddle, moddleCopy) {\n\n      // given\n      var documentation = [\n        moddle.create('bpmn:Documentation', { text: 'FOO\\nBAR', textFormat: 'xyz' }),\n        moddle.create('bpmn:Documentation', { text: '<html></html>' })\n      ];\n\n      var userTask = moddle.create('bpmn:UserTask');\n\n      userTask.documentation = documentation;\n\n      // when\n      var serviceTask = moddleCopy.copyElement(userTask, moddle.create('bpmn:ServiceTask'));\n\n      expect(serviceTask.documentation[0].$parent).to.equal(serviceTask);\n      expect(serviceTask.documentation[0].text).to.equal('FOO\\nBAR');\n      expect(serviceTask.documentation[0].textFormat).to.equal('xyz');\n\n      expect(serviceTask.documentation[1].$parent).to.equal(serviceTask);\n      expect(serviceTask.documentation[1].text).to.equal('<html></html>');\n    }));\n\n\n    it('should copy execution listener', inject(function(moddle, moddleCopy) {\n\n      // given\n      var script = moddle.create('camunda:Script', {\n        scriptFormat: 'groovy',\n        value: 'foo = bar;'\n      });\n\n      var executionListener = moddle.create('camunda:ExecutionListener', {\n        event: 'start',\n        script: script\n      });\n\n      var extensionElements = moddle.create('bpmn:ExtensionElements'),\n          userTask = moddle.create('bpmn:UserTask');\n\n      executionListener.$parent = extensionElements;\n\n      extensionElements.$parent = userTask;\n      extensionElements.values = [ executionListener ];\n\n      userTask.extensionElements = extensionElements;\n\n      // when\n      var serviceTask = moddleCopy.copyElement(userTask, moddle.create('bpmn:ServiceTask'));\n\n      // then\n      executionListener = serviceTask.extensionElements.values[0];\n\n      expect(executionListener).to.exist;\n      expect(executionListener.$type).to.equal('camunda:ExecutionListener');\n      expect(executionListener.$parent).to.equal(serviceTask.extensionElements);\n      expect(executionListener.event).to.equal('start');\n\n      script = executionListener.script;\n\n      expect(script).to.exist;\n      expect(script.$type).to.equal('camunda:Script');\n      expect(script.$parent).to.equal(executionListener);\n      expect(script.scriptFormat).to.equal('groovy');\n      expect(script.value).to.equal('foo = bar;');\n    }));\n\n\n    it('should copy output parameter', inject(function(moddle, moddleCopy) {\n\n      // given\n      var outputParameter = moddle.create('camunda:OutputParameter', {\n        name: 'foo',\n        definition: moddle.create('camunda:List', {\n          items: [\n            moddle.create('camunda:Value', { value: '${1+1}' }),\n            moddle.create('camunda:Value', { value: '${1+2}' }),\n            moddle.create('camunda:Value', { value: '${1+3}' })\n          ]\n        })\n      });\n\n      var inputOutput = moddle.create('camunda:InputOutput', {\n        outputParameters: [ outputParameter ]\n      });\n\n      var extensionElements = moddle.create('bpmn:ExtensionElements'),\n          userTask = moddle.create('bpmn:UserTask');\n\n      extensionElements.$parent = userTask;\n      extensionElements.values = [ inputOutput ];\n\n      userTask.extensionElements = extensionElements;\n\n      // when\n      var subProcess = moddleCopy.copyElement(userTask, moddle.create('bpmn:SubProcess'));\n\n      // then\n      extensionElements = subProcess.extensionElements;\n\n      inputOutput = extensionElements.values[0];\n\n      expect(inputOutput.$type).to.equal('camunda:InputOutput');\n      expect(inputOutput.$parent).to.equal(extensionElements);\n\n      outputParameter = inputOutput.outputParameters[0];\n\n      expect(outputParameter.$type).to.equal('camunda:OutputParameter');\n      expect(outputParameter.$parent).to.equal(inputOutput);\n      expect(outputParameter.name).to.equal('foo');\n\n      var definition = outputParameter.definition;\n\n      expect(definition.$type).to.equal('camunda:List');\n      expect(definition.$parent).to.equal(outputParameter);\n\n      var items = definition.items;\n\n      expect(items[0].$type).to.equal('camunda:Value');\n      expect(items[0].$parent).to.equal(definition);\n      expect(items[0].value).to.equal('${1+1}');\n\n      expect(items[1].$type).to.equal('camunda:Value');\n      expect(items[1].$parent).to.equal(definition);\n      expect(items[1].value).to.equal('${1+2}');\n\n      expect(items[2].$type).to.equal('camunda:Value');\n      expect(items[2].$parent).to.equal(definition);\n      expect(items[2].value).to.equal('${1+3}');\n    }));\n\n  });\n\n\n  describe('integration', function() {\n\n    describe('camunda:Connector', function() {\n\n      it('should copy if parent is message event definition and is child of end event', inject(\n        function(moddle, moddleCopy) {\n\n          // given\n          var connector = moddle.create('camunda:Connector', {\n            connectorId: 'foo'\n          });\n\n          var extensionElements = moddle.create('bpmn:ExtensionElements'),\n              messageEventDefinition = moddle.create('bpmn:MessageEventDefinition'),\n              messageIntermediateThrowEvent = moddle.create('bpmn:IntermediateThrowEvent');\n\n          connector.$parent = extensionElements;\n\n          extensionElements.$parent = messageEventDefinition;\n          extensionElements.values = [ connector ];\n\n          messageEventDefinition.$parent = messageIntermediateThrowEvent;\n          messageEventDefinition.extensionElements = extensionElements;\n\n          messageIntermediateThrowEvent.eventDefinitions = [ messageEventDefinition ];\n\n          // when\n          var endEvent =\n            moddleCopy.copyElement(messageIntermediateThrowEvent, moddle.create('bpmn:EndEvent'));\n\n          // then\n          extensionElements = endEvent.eventDefinitions[0].extensionElements;\n\n          expect(extensionElements.values[0].$type).to.equal('camunda:Connector');\n          expect(extensionElements.values[0].connectorId).to.equal('foo');\n        }\n      ));\n\n    });\n\n\n    describe('camunda:Field', function() {\n\n      it('should copy if parent is message event definition and is child of end event', inject(\n        function(moddle, moddleCopy) {\n\n          // given\n          var field = moddle.create('camunda:Field', {\n            name: 'foo'\n          });\n\n          var extensionElements = moddle.create('bpmn:ExtensionElements'),\n              messageEventDefinition = moddle.create('bpmn:MessageEventDefinition'),\n              messageIntermediateThrowEvent = moddle.create('bpmn:IntermediateThrowEvent');\n\n          field.$parent = extensionElements;\n\n          extensionElements.$parent = messageEventDefinition;\n          extensionElements.values = [ field ];\n\n          messageEventDefinition.$parent = messageIntermediateThrowEvent;\n          messageEventDefinition.extensionElements = extensionElements;\n\n          messageIntermediateThrowEvent.eventDefinitions = [ messageEventDefinition ];\n\n          // when\n          var endEvent =\n            moddleCopy.copyElement(messageIntermediateThrowEvent, moddle.create('bpmn:EndEvent'));\n\n          // then\n          extensionElements = endEvent.eventDefinitions[0].extensionElements;\n\n          expect(extensionElements.values[0].$type).to.equal('camunda:Field');\n          expect(extensionElements.values[0].name).to.equal('foo');\n        }\n      ));\n\n    });\n\n\n    describe('camunda:FailedJobRetryTimeCycle', function() {\n\n      it('should copy if parent is SignalEventDefinition and is intermediate throwing', inject(\n        function(moddle, moddleCopy) {\n\n          // given\n          var retryCycle = moddle.create('camunda:FailedJobRetryTimeCycle', {\n            body: 'foo'\n          });\n\n          var extensionElements = moddle.create('bpmn:ExtensionElements'),\n              signalEventDefinition = moddle.create('bpmn:SignalEventDefinition'),\n              signalIntermediateThrowEvent = moddle.create('bpmn:IntermediateThrowEvent');\n\n          retryCycle.$parent = extensionElements;\n\n          extensionElements.$parent = signalEventDefinition;\n          extensionElements.values = [ retryCycle ];\n\n          signalEventDefinition.$parent = signalIntermediateThrowEvent;\n          signalEventDefinition.extensionElements = extensionElements;\n\n          signalIntermediateThrowEvent.eventDefinitions = [ signalEventDefinition ];\n\n          // when\n          var intermediateThrowEvent = moddleCopy.copyElement(\n            signalIntermediateThrowEvent,\n            moddle.create('bpmn:IntermediateThrowEvent')\n          );\n\n          // then\n          extensionElements = intermediateThrowEvent.eventDefinitions[0].extensionElements;\n\n          expect(extensionElements.values[0].$type).to.equal('camunda:FailedJobRetryTimeCycle');\n          expect(extensionElements.values[0].body).to.equal('foo');\n        }\n      ));\n\n\n      it('should copy if parent is TimerEventDefinition and is catching', inject(\n        function(moddle, moddleCopy) {\n\n          // given\n          var retryCycle = moddle.create('camunda:FailedJobRetryTimeCycle', {\n            body: 'foo'\n          });\n\n          var extensionElements = moddle.create('bpmn:ExtensionElements'),\n              timerEventDefinition = moddle.create('bpmn:TimerEventDefinition'),\n              timerStartEvent = moddle.create('bpmn:StartEvent');\n\n          retryCycle.$parent = extensionElements;\n\n          extensionElements.$parent = timerEventDefinition;\n          extensionElements.values = [ retryCycle ];\n\n          timerEventDefinition.$parent = timerStartEvent;\n          timerEventDefinition.extensionElements = extensionElements;\n\n          timerStartEvent.eventDefinitions = [ timerEventDefinition ];\n\n          // when\n          var intermediateCatchEvent =\n            moddleCopy.copyElement(timerStartEvent, moddle.create('bpmn:IntermediateCatchEvent'));\n\n          // then\n          extensionElements = intermediateCatchEvent.eventDefinitions[0].extensionElements;\n\n          expect(extensionElements.values[0].$type).to.equal('camunda:FailedJobRetryTimeCycle');\n          expect(extensionElements.values[0].body).to.equal('foo');\n        }\n      ));\n\n\n      it('should copy if parent is call activity', inject(function(moddle, moddleCopy) {\n\n        // given\n        var retryCycle = moddle.create('camunda:FailedJobRetryTimeCycle', {\n          body: 'foo'\n        });\n\n        var extensionElements = moddle.create('bpmn:ExtensionElements'),\n            loopCharacteristics = moddle.create('bpmn:MultiInstanceLoopCharacteristics'),\n            subProcess = moddle.create('bpmn:SubProcess');\n\n        retryCycle.$parent = extensionElements;\n\n        extensionElements.$parent = loopCharacteristics;\n        extensionElements.values = [ retryCycle ];\n\n        loopCharacteristics.$parent = subProcess;\n        loopCharacteristics.extensionElements = extensionElements;\n\n        subProcess.loopCharacteristics = loopCharacteristics;\n\n        // when\n        var callActivity = moddleCopy.copyElement(subProcess, moddle.create('bpmn:CallActivity'));\n\n        // then\n        extensionElements = callActivity.loopCharacteristics.extensionElements;\n\n        expect(extensionElements.values[0].$type).to.equal('camunda:FailedJobRetryTimeCycle');\n        expect(extensionElements.values[0].body).to.equal('foo');\n      }));\n\n    });\n\n\n    describe('generic properties', function() {\n\n      it('should not copy generic extension elements', inject(function(moddle, moddleCopy) {\n\n        // given\n        var genericExtensionElement = moddle.createAny('foo:property', {\n          value: 'foo'\n        });\n\n        var extensionElements = moddle.create('bpmn:ExtensionElements'),\n            startEvent = moddle.create('bpmn:StartEvent');\n\n        genericExtensionElement.$parent = extensionElements;\n\n        extensionElements.$parent = startEvent;\n        extensionElements.values = [ genericExtensionElement ];\n\n        startEvent.extensionElements = extensionElements;\n\n        // when\n        var endEvent = moddleCopy.copyElement(startEvent, moddle.create('bpmn:EndEvent'));\n\n        // then\n        expect(endEvent.extensionElements).not.to.exist;\n      }));\n\n    });\n\n  });\n\n\n  describe('events', function() {\n\n    it('should disallow copying properties', inject(function(moddleCopy, eventBus, moddle) {\n\n      // given\n      var task = moddle.create('bpmn:Task', {\n        name: 'foo'\n      });\n\n      eventBus.on('moddleCopy.canCopyProperties', HIGH_PRIORITY, function(context) {\n        var sourceElement = context.sourceElement;\n\n        if (is(sourceElement, 'bpmn:Task')) {\n          return false;\n        }\n      });\n\n      // when\n      var userTask = moddleCopy.copyElement(task, moddle.create('bpmn:UserTask'));\n\n      // then\n      expect(userTask.name).not.to.exist;\n    }));\n\n\n    it('should disallow copying property', inject(function(moddleCopy, eventBus, moddle) {\n\n      // given\n      var task = moddle.create('bpmn:Task', {\n        name: 'foo'\n      });\n\n      eventBus.on('moddleCopy.canCopyProperty', HIGH_PRIORITY, function(context) {\n\n        // verify provided properties\n        expect(context).to.have.property('parent');\n        expect(context).to.have.property('property');\n        expect(context).to.have.property('propertyName');\n\n        var propertyName = context.propertyName;\n\n        if (propertyName === 'name') {\n          return false;\n        }\n      });\n\n      // when\n      var userTask = moddleCopy.copyElement(task, moddle.create('bpmn:UserTask'));\n\n      // then\n      expect(userTask.name).not.to.exist;\n    }));\n\n\n    it('should disallow setting copied property', inject(function(moddleCopy, eventBus, moddle) {\n\n      // given\n      var task = moddle.create('bpmn:Task', {\n        name: 'foo'\n      });\n\n      eventBus.on('moddleCopy.canSetCopiedProperty', HIGH_PRIORITY, function(context) {\n\n        // verify provided properties\n        expect(context).to.have.property('parent');\n        expect(context).to.have.property('property');\n        expect(context).to.have.property('propertyName');\n\n        var property = context.property;\n\n        if (property === 'foo') {\n          return false;\n        }\n      });\n\n      // when\n      var userTask = moddleCopy.copyElement(task, moddle.create('bpmn:UserTask'));\n\n      // then\n      expect(userTask.name).not.to.exist;\n    }));\n\n\n    it('should copy primitive property', inject(function(moddleCopy, eventBus, moddle) {\n\n      // given\n      var task = moddle.create('bpmn:Task', {\n        name: 'foo'\n      });\n\n      eventBus.on('moddleCopy.canCopyProperty', HIGH_PRIORITY, function(context) {\n        var propertyName = context.propertyName;\n\n        if (propertyName === 'name') {\n          return 'bar';\n        }\n      });\n\n      // when\n      var userTask = moddleCopy.copyElement(task, moddle.create('bpmn:UserTask'));\n\n      // then\n      expect(userTask.name).to.equal('bar');\n    }));\n\n\n    describe('copy model element property', function() {\n\n      it('should copy and set parent', inject(function(moddleCopy, eventBus, moddle) {\n\n        // given\n        var startEvent = moddle.create('bpmn:StartEvent'),\n            messageEventDefinition = moddle.create('bpmn:MessageEventDefinition');\n\n        messageEventDefinition.$parent = startEvent;\n\n        startEvent.eventDefinitions = [ messageEventDefinition ];\n\n        eventBus.on('moddleCopy.canCopyProperty', HIGH_PRIORITY, function(context) {\n          var property = context.property;\n\n          if (is(property, 'bpmn:MessageEventDefinition')) {\n            return moddle.create('bpmn:MessageEventDefinition');\n          }\n        });\n\n        // when\n        var endEvent = moddleCopy.copyElement(startEvent, moddle.create('bpmn:EndEvent'));\n\n        // then\n        expect(endEvent.eventDefinitions).to.have.length(1);\n        expect(endEvent.eventDefinitions[0]).not.to.equal(messageEventDefinition);\n        expect(endEvent.eventDefinitions[0].$type).to.equal('bpmn:MessageEventDefinition');\n      }));\n\n\n      it('should clone', inject(function(moddleCopy, eventBus, moddle) {\n\n        // given\n        var task = moddle.create('bpmn:Task', {\n          name: 'foo'\n        });\n\n        eventBus.once('moddleCopy.canCopyProperty', HIGH_PRIORITY, function(context) {\n          var propertyName = context.propertyName;\n\n          var clone = context.clone;\n\n          expect(clone).to.be.true;\n\n          if (propertyName === 'name') {\n            return 'bar';\n          }\n        });\n\n        // when\n        var userTask = moddleCopy.copyElement(task, moddle.create('bpmn:UserTask'), null, true);\n\n        // then\n        expect(userTask.id).to.eql(task.id);\n      }));\n\n    });\n\n\n    it('should copy and NOT set parent', inject(function(canvas, moddleCopy, eventBus, moddle) {\n\n      // given\n      var definitions = getDefinitions(canvas.getRootElement()),\n          categoryValue = moddle.create('bpmn:CategoryValue'),\n          category = moddle.create('bpmn:Category'),\n          group = moddle.create('bpmn:Group'),\n          newCategoryValue,\n          newCategory,\n          newGroup;\n\n      categoryValue.$parent = category;\n\n      category.$parent = definitions;\n      category.categoryValue = [ categoryValue ];\n\n      definitions.rootElements.push(category);\n\n      group.categoryValueRef = categoryValue;\n\n      eventBus.on('moddleCopy.canCopyProperty', HIGH_PRIORITY, function(context) {\n        var propertyName = context.propertyName;\n\n        if (propertyName !== 'categoryValueRef') {\n          return;\n        }\n\n        newCategoryValue = moddle.create('bpmn:CategoryValue');\n        newCategory = moddle.create('bpmn:Category');\n\n        newCategoryValue.$parent = newCategory;\n\n        newCategory.$parent = definitions;\n        newCategory.categoryValue = [ newCategoryValue ];\n\n        definitions.rootElements.push(newCategory);\n\n        return newCategoryValue;\n      });\n\n      // when\n      newGroup = moddleCopy.copyElement(group, moddle.create('bpmn:Group'));\n\n      // then\n      expect(newGroup.categoryValueRef).to.exist;\n      expect(newGroup.categoryValueRef).not.to.equal(categoryValue);\n      expect(newGroup.categoryValueRef.$parent).to.equal(newCategory);\n    }));\n\n\n    describe('default events', function() {\n\n      describe('allowed references', function() {\n\n        it('should copy error reference', inject(function(moddle, moddleCopy) {\n\n          // given\n          var boundaryEvent = moddle.create('bpmn:BoundaryEvent'),\n              errorEventDefinition = moddle.create('bpmn:ErrorEventDefinition');\n\n          errorEventDefinition.$parent = boundaryEvent;\n\n          boundaryEvent.eventDefinitions = [ errorEventDefinition ];\n\n          var error = moddle.create('bpmn:Error');\n\n          errorEventDefinition.errorRef = error;\n\n          // when\n          var boundaryEventCopy = moddleCopy.copyElement(boundaryEvent, moddle.create('bpmn:BoundaryEvent'));\n\n          // then\n          expect(boundaryEventCopy.eventDefinitions).to.have.length(1);\n          expect(boundaryEventCopy.eventDefinitions[0]).not.to.equal(errorEventDefinition);\n          expect(boundaryEventCopy.eventDefinitions[0].$type).to.equal('bpmn:ErrorEventDefinition');\n          expect(boundaryEventCopy.eventDefinitions[0].errorRef).to.exist;\n          expect(boundaryEventCopy.eventDefinitions[0].errorRef).to.equal(error);\n        }));\n\n\n        it('should copy escalation reference', inject(function(moddle, moddleCopy) {\n\n          // given\n          var boundaryEvent = moddle.create('bpmn:BoundaryEvent'),\n              escalationEventDefinition = moddle.create('bpmn:EscalationEventDefinition');\n\n          escalationEventDefinition.$parent = boundaryEvent;\n\n          boundaryEvent.eventDefinitions = [ escalationEventDefinition ];\n\n          var error = moddle.create('bpmn:Escalation');\n\n          escalationEventDefinition.escalationRef = error;\n\n          // when\n          var boundaryEventCopy = moddleCopy.copyElement(boundaryEvent, moddle.create('bpmn:BoundaryEvent'));\n\n          // then\n          expect(boundaryEventCopy.eventDefinitions).to.have.length(1);\n          expect(boundaryEventCopy.eventDefinitions[0]).not.to.equal(escalationEventDefinition);\n          expect(boundaryEventCopy.eventDefinitions[0].$type).to.equal('bpmn:EscalationEventDefinition');\n          expect(boundaryEventCopy.eventDefinitions[0].escalationRef).to.exist;\n          expect(boundaryEventCopy.eventDefinitions[0].escalationRef).to.equal(error);\n        }));\n\n\n        it('should copy message reference (event)', inject(function(moddle, moddleCopy) {\n\n          // given\n          var boundaryEvent = moddle.create('bpmn:BoundaryEvent'),\n              messageEventDefinition = moddle.create('bpmn:MessageEventDefinition');\n\n          messageEventDefinition.$parent = boundaryEvent;\n\n          boundaryEvent.eventDefinitions = [ messageEventDefinition ];\n\n          var message = moddle.create('bpmn:Message');\n\n          messageEventDefinition.messageRef = message;\n\n          // when\n          var boundaryEventCopy = moddleCopy.copyElement(boundaryEvent, moddle.create('bpmn:BoundaryEvent'));\n\n          // then\n          expect(boundaryEventCopy.eventDefinitions).to.have.length(1);\n          expect(boundaryEventCopy.eventDefinitions[0]).not.to.equal(messageEventDefinition);\n          expect(boundaryEventCopy.eventDefinitions[0].$type).to.equal('bpmn:MessageEventDefinition');\n          expect(boundaryEventCopy.eventDefinitions[0].messageRef).to.exist;\n          expect(boundaryEventCopy.eventDefinitions[0].messageRef).to.equal(message);\n        }));\n\n\n        it('should copy message reference (receive task)', inject(function(moddle, moddleCopy) {\n\n          // given\n          var receiveTask = moddle.create('bpmn:ReceiveTask');\n\n          var message = moddle.create('bpmn:Message');\n\n          receiveTask.messageRef = message;\n\n          // when\n          var receiveTaskCopy = moddleCopy.copyElement(receiveTask, moddle.create('bpmn:ReceiveTask'));\n\n          // then\n          expect(receiveTaskCopy.messageRef).to.exist;\n          expect(receiveTaskCopy.messageRef).to.equal(message);\n        }));\n\n\n        it('should copy signal reference', inject(function(moddle, moddleCopy) {\n\n          // given\n          var boundaryEvent = moddle.create('bpmn:BoundaryEvent'),\n              signalEventDefinition = moddle.create('bpmn:SignalEventDefinition');\n\n          signalEventDefinition.$parent = boundaryEvent;\n\n          boundaryEvent.eventDefinitions = [ signalEventDefinition ];\n\n          var signal = moddle.create('bpmn:Signal');\n\n          signalEventDefinition.signalRef = signal;\n\n          // when\n          var boundaryEventCopy = moddleCopy.copyElement(boundaryEvent, moddle.create('bpmn:BoundaryEvent'));\n\n          // then\n          expect(boundaryEventCopy.eventDefinitions).to.have.length(1);\n          expect(boundaryEventCopy.eventDefinitions[0]).not.to.equal(signalEventDefinition);\n          expect(boundaryEventCopy.eventDefinitions[0].$type).to.equal('bpmn:SignalEventDefinition');\n          expect(boundaryEventCopy.eventDefinitions[0].signalRef).to.exist;\n          expect(boundaryEventCopy.eventDefinitions[0].signalRef).to.equal(signal);\n        }));\n\n      });\n\n\n      describe('disallowed properties', function() {\n\n        it('should NOT copy incoming and outgoing', inject(function(moddle, moddleCopy) {\n\n          // given\n          var incoming = moddle.create('bpmn:SequenceFlow'),\n              outgoing = moddle.create('bpmn:SequenceFlow'),\n              task = moddle.create('bpmn:Task', {\n                incoming: [ incoming ],\n                outgoing: [ outgoing ]\n              });\n\n          expect(task.get('incoming')).to.have.length(1);\n          expect(task.get('outgoing')).to.have.length(1);\n\n          // when\n          var taskCopy = moddleCopy.copyElement(task, moddle.create('bpmn:Task'));\n\n          // then\n          expect(taskCopy.get('incoming')).to.have.length(0);\n          expect(taskCopy.get('outgoing')).to.have.length(0);\n        }));\n\n      });\n\n    });\n\n  });\n\n\n  describe('custom', function() {\n\n    var customPackage = require('../../../fixtures/json/model/custom.json');\n\n    beforeEach(bootstrapModeler(basicXML, {\n      modules: testModules,\n      moddleExtensions: {\n        custom: customPackage\n      }\n    }));\n\n\n    it('should copy arrays of strings', inject(function(moddle, moddleCopy) {\n\n      // given\n      var paths = [ 'A', 'B', 'C' ];\n\n      var customElement = moddle.create('custom:CustomSendElement', {\n        paths: paths\n      });\n\n      // when\n      var newElement = moddleCopy.copyElement(\n        customElement,\n        moddle.create('custom:CustomSendElement')\n      );\n\n      // then\n      expect(newElement.paths).to.have.length(3);\n      expect(newElement.paths).to.eql(paths);\n\n      expectNoAttrs(newElement);\n    }));\n\n  });\n\n});\n\n\n// helpers //////////\n\nfunction expectNoAttrs(element) {\n  expect(element.$attrs).to.be.empty;\n}\n\nfunction getDefinitions(rootElement) {\n  var businessObject = getBusinessObject(rootElement);\n\n  return businessObject.$parent;\n}"
  },
  {
    "path": "test/spec/features/copy-paste/basic.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.2.1\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:laneSet />\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <bpmn:subProcess id=\"SubProcess_2\">\n        <bpmn:multiInstanceLoopCharacteristics isSequential=\"true\" />\n        <bpmn:startEvent id=\"StartEvent_1\" name=\"hello\">\n          <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n        </bpmn:startEvent>\n        <bpmn:endEvent id=\"EndEvent_1\" name=\"world!\">\n          <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n        </bpmn:endEvent>\n        <bpmn:task id=\"Task_1\" name=\"wait for it..\" default=\"SequenceFlow_2\">\n          <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n          <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n          <bpmn:outgoing>SequenceFlow_3</bpmn:outgoing>\n        </bpmn:task>\n        <bpmn:sequenceFlow id=\"SequenceFlow_2\" name=\"\" sourceRef=\"Task_1\" targetRef=\"EndEvent_1\" />\n        <bpmn:sequenceFlow id=\"SequenceFlow_1\" name=\"blah\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n        <bpmn:boundaryEvent id=\"BoundaryEvent_2\" attachedToRef=\"Task_1\">\n          <bpmn:timerEventDefinition />\n        </bpmn:boundaryEvent>\n        <bpmn:boundaryEvent id=\"BoundaryEvent_1\" attachedToRef=\"Task_1\">\n          <bpmn:messageEventDefinition />\n        </bpmn:boundaryEvent>\n        <bpmn:intermediateThrowEvent id=\"IntermediateThrowEvent_1\">\n          <bpmn:incoming>SequenceFlow_3</bpmn:incoming>\n        </bpmn:intermediateThrowEvent>\n        <bpmn:sequenceFlow id=\"SequenceFlow_3\" sourceRef=\"Task_1\" targetRef=\"IntermediateThrowEvent_1\">\n          <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">foo</bpmn:conditionExpression>\n        </bpmn:sequenceFlow>\n      </bpmn:subProcess>\n      <bpmn:textAnnotation id=\"TextAnnotation_1\">\n        <bpmn:text>foo</bpmn:text>\n      </bpmn:textAnnotation>\n      <bpmn:association id=\"Association_1f53xbo\" sourceRef=\"SubProcess_2\" targetRef=\"TextAnnotation_1\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_1kd6ist_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"156\" y=\"34\" width=\"613\" height=\"372\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_0gev7mx_di\" bpmnElement=\"SubProcess_2\" isExpanded=\"true\">\n        <dc:Bounds x=\"215\" y=\"118\" width=\"461\" height=\"259\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"235\" y=\"198\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"241\" y=\"149\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_0yejuvr_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"611\" y=\"198\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"615\" y=\"272\" width=\"29\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1fo63a7_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"361\" y=\"176\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0y69l8f_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint x=\"461\" y=\"216\" />\n        <di:waypoint x=\"611\" y=\"216\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"421\" y=\"166\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1rtr33r_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"271\" y=\"216\" />\n        <di:waypoint x=\"361\" y=\"216\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"305\" y=\"321\" width=\"21\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1c94bi9_di\" bpmnElement=\"BoundaryEvent_2\">\n        <dc:Bounds x=\"443\" y=\"238\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"348\" y=\"274\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_0h1hhgg_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"632\" y=\"58\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_1f53xbo_di\" bpmnElement=\"Association_1f53xbo\">\n        <di:waypoint x=\"663\" y=\"118\" />\n        <di:waypoint x=\"649\" y=\"88\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1404oxd_di\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds x=\"343\" y=\"238\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"248\" y=\"274\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_09kpyzx_di\" bpmnElement=\"IntermediateThrowEvent_1\">\n        <dc:Bounds x=\"526\" y=\"287\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"431\" y=\"323\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_07vo2r8_di\" bpmnElement=\"SequenceFlow_3\">\n        <di:waypoint x=\"411\" y=\"256\" />\n        <di:waypoint x=\"411\" y=\"305\" />\n        <di:waypoint x=\"526\" y=\"305\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"381\" y=\"250.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/copy-paste/collaboration-multiple.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.2.1\">\n  <bpmn:collaboration id=\"Collaboration_1\">\n    <bpmn:participant id=\"Participant_1\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Participant_2\" processRef=\"Process_08nr0a7\" />\n    <bpmn:messageFlow id=\"MessageFlow_1\" sourceRef=\"IntermediateThrowEvent_1\" targetRef=\"Task_2\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:laneSet>\n      <bpmn:lane id=\"Lane_2\">\n        <bpmn:flowNodeRef>Task_2</bpmn:flowNodeRef>\n      </bpmn:lane>\n      <bpmn:lane id=\"Lane_1\">\n        <bpmn:flowNodeRef>Task_1</bpmn:flowNodeRef>\n        <bpmn:childLaneSet>\n          <bpmn:lane id=\"Lane_4\" />\n          <bpmn:lane id=\"Lane_3\">\n            <bpmn:flowNodeRef>Task_1</bpmn:flowNodeRef>\n          </bpmn:lane>\n        </bpmn:childLaneSet>\n      </bpmn:lane>\n    </bpmn:laneSet>\n    <bpmn:task id=\"Task_1\" />\n    <bpmn:task id=\"Task_2\" />\n  </bpmn:process>\n  <bpmn:process id=\"Process_08nr0a7\" isExecutable=\"false\">\n    <bpmn:laneSet>\n      <bpmn:lane id=\"Lane_7\">\n        <bpmn:flowNodeRef>EndEvent_1</bpmn:flowNodeRef>\n      </bpmn:lane>\n      <bpmn:lane id=\"Lane_6\">\n        <bpmn:flowNodeRef>IntermediateThrowEvent_1</bpmn:flowNodeRef>\n      </bpmn:lane>\n      <bpmn:lane id=\"Lane_5\">\n        <bpmn:flowNodeRef>StartEvent_1</bpmn:flowNodeRef>\n      </bpmn:lane>\n    </bpmn:laneSet>\n    <bpmn:intermediateThrowEvent id=\"IntermediateThrowEvent_1\" />\n    <bpmn:endEvent id=\"EndEvent_1\" />\n    <bpmn:startEvent id=\"StartEvent_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_0pgdgt4_di\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"156\" y=\"96\" width=\"360\" height=\"308\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_1id96b4_di\" bpmnElement=\"Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"156\" y=\"440\" width=\"360\" height=\"246\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1gzt96j_di\" bpmnElement=\"Lane_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"186\" y=\"96\" width=\"330\" height=\"183\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1kulv9k_di\" bpmnElement=\"Lane_2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"186\" y=\"279\" width=\"330\" height=\"125\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0aws6ii_di\" bpmnElement=\"Lane_5\" isHorizontal=\"true\">\n        <dc:Bounds x=\"186\" y=\"440\" width=\"330\" height=\"83\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1sd1zl3_di\" bpmnElement=\"Lane_6\" isHorizontal=\"true\">\n        <dc:Bounds x=\"186\" y=\"523\" width=\"330\" height=\"83\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_16ah5rn_di\" bpmnElement=\"Lane_7\" isHorizontal=\"true\">\n        <dc:Bounds x=\"186\" y=\"606\" width=\"330\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_07r1iyh_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"204\" y=\"462\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"154\" y=\"491\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_0audt6r_di\" bpmnElement=\"IntermediateThrowEvent_1\">\n        <dc:Bounds x=\"274\" y=\"550\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"338\" y=\"578\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_1u50ypf_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"454\" y=\"630\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"514\" y=\"672\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1pamrp2_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"242\" y=\"116\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0n0k2nj_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"242\" y=\"302\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_150lriv_di\" bpmnElement=\"MessageFlow_1\">\n        <di:waypoint x=\"292\" y=\"550\" />\n        <di:waypoint x=\"292\" y=\"382\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"338\" y=\"453.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Lane_1yo0kyz_di\" bpmnElement=\"Lane_3\" isHorizontal=\"true\">\n        <dc:Bounds x=\"216\" y=\"96\" width=\"300\" height=\"121\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_022an7b_di\" bpmnElement=\"Lane_4\" isHorizontal=\"true\">\n        <dc:Bounds x=\"216\" y=\"217\" width=\"300\" height=\"62\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/copy-paste/collaboration.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.2.1\">\n  <bpmn:collaboration id=\"Collaboration_1\">\n    <bpmn:participant id=\"Participant_1\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Participant_2\" name=\"collapsed\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:laneSet>\n      <bpmn:lane id=\"Lane_2\" />\n      <bpmn:lane id=\"Lane_1\">\n        <bpmn:flowNodeRef>StartEvent_1</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>EndEvent_1</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Task_1</bpmn:flowNodeRef>\n      </bpmn:lane>\n    </bpmn:laneSet>\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:endEvent id=\"EndEvent_1\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:task id=\"Task_1\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"Task_1\" targetRef=\"EndEvent_1\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_0uu1rvj_di\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"169\" y=\"86\" width=\"433\" height=\"245\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1gl63sa_di\" bpmnElement=\"Lane_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"199\" y=\"86\" width=\"403\" height=\"120\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_13h648l_di\" bpmnElement=\"Lane_2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"199\" y=\"206\" width=\"403\" height=\"125\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_0o6vk5g_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"219\" y=\"128\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"114\" y=\"111\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_13xbgyg_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"351\" y=\"106\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0v3q8mo_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"255\" y=\"146\" />\n        <di:waypoint x=\"351\" y=\"146\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"186\" y=\"83\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EndEvent_1nef447_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"546\" y=\"128\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"441\" y=\"111\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1yvonen_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint x=\"451\" y=\"146\" />\n        <di:waypoint x=\"546\" y=\"146\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"381.5\" y=\"83\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Participant_145muai_di\" bpmnElement=\"Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"169\" y=\"350\" width=\"433\" height=\"60\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/copy-paste/collapsed-subprocess.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.2.0\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.17.0\">\n  <bpmn:process id=\"PROCESS\" name=\"PROCESS\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"SUB_PROCESS\" name=\"SUB_PROCESS\">\n      <bpmn:task id=\"SUB_TASK\" name=\"SUB_TASK\" />\n      <bpmn:boundaryEvent id=\"SUB_BOUNDARY\" name=\"SUB_BOUNDARY\" cancelActivity=\"false\" attachedToRef=\"SUB_TASK\">\n        <bpmn:escalationEventDefinition id=\"EscalationEventDefinition_1\" escalationRef=\"ESCALATION\" />\n      </bpmn:boundaryEvent>\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmn:escalation id=\"ESCALATION\" name=\"ESCALATION\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"PROCESS\">\n      <bpmndi:BPMNShape id=\"SUB_PROCESS_di\" bpmnElement=\"SUB_PROCESS\">\n        <dc:Bounds x=\"170\" y=\"80\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_2\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_SUB_PROCESS\" bpmnElement=\"SUB_PROCESS\">\n      <bpmndi:BPMNShape id=\"SUB_TASK_di\" bpmnElement=\"SUB_TASK\">\n        <dc:Bounds x=\"190\" y=\"80\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SUB_BOUNDARY_di\" bpmnElement=\"SUB_BOUNDARY\">\n        <dc:Bounds x=\"232\" y=\"142\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"208\" y=\"185\" width=\"84\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/copy-paste/complex.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:signavio=\"http://www.signavio.com\" id=\"sid-d5a68e61-ca67-438f-971d-6843c39b383e\" targetNamespace=\"http://www.signavio.com/bpmn20\" exporter=\"Camunda Modeler\" exporterVersion=\"3.5.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n  <dataStore id=\"sid-1f3b3b35-28a1-4fff-8835-ae271ef486d5\" name=\"HR-Tool\" capacity=\"0\" isUnlimited=\"false\" />\n  <collaboration id=\"sid-3524ea26-a8cb-4d8f-b997-347710bca219\">\n    <extensionElements />\n    <participant id=\"sid-CB881798-E52C-4F03-809F-765C5F84EE04\" name=\"Bewerbungsprüfung (fristgerecht) - Sachbearbeiter Personal\" processRef=\"sid-3C2D842A-E239-44F2-91A1-D809676A3462\" />\n    <participant id=\"sid-C583AB0E-16D2-4440-973E-F03090497640\" name=\"Bewerber\" />\n    <participant id=\"sid-187453C6-5AB5-4A6D-9A62-BF537E04EA0D\" name=\"Bewerbungseingang - &#10;Sachbearbeiter Personal\" processRef=\"sid-67C91933-43BF-4B55-A9FA-BB741C03A8C4\" />\n    <participant id=\"sid-A280AE73-E103-45BC-8078-8ADB6A8AF29C\" name=\"Bewerbungsprüfung - &#10;Sachbearbeiter Personal\" processRef=\"sid-F0778AC8-E593-4FF9-8CCE-C71768DF3E0D\" />\n    <participant id=\"sid-EED957F8-FF8A-4A3A-918A-944B41FF5D4D\" name=\"Bewerbungsprüfung - &#10;Führungskraft Fachbereich\" processRef=\"sid-83C27632-EEB8-4D1E-8F8B-BFCBBD2B88E8\" />\n    <participant id=\"sid-CC1C0D76-B3D1-4A22-B9D8-8C8FA4D85FB7\" name=\"Bewerbungsprüfung - &#10;Führungskraft Fachbereich\" processRef=\"sid-05D31FB1-4A4B-4D41-8E51-BE08330D6013\" />\n    <participant id=\"sid-6C68E5FA-5812-446E-A335-AD6B18AD9BC6\" name=\"Bewerber\" />\n    <participant id=\"sid-F18FD2E3-46A6-4E86-9AA9-D67094D0DCE7\" name=\"Führungskraft Fachbereich\" />\n    <participant id=\"sid-2E859D5D-83B3-461D-9FFF-2AAF49E71D2A\" name=\"Bewerber\" />\n    <participant id=\"sid-C95FEFFE-4759-4ABA-B11D-E4BA65DA268F\" name=\"Bewerber\" />\n    <participant id=\"sid-19D91440-484D-4E64-BC61-4ADA8E26CA29\" name=\"Bewerber-Beurteilung - &#10;Führungskraft Fachbereich\" processRef=\"sid-D042A222-1E2E-4AE5-A062-1CB78A7CD324\" />\n    <participant id=\"sid-EEF891AC-F8A7-4623-9BA3-F560E2782C9D\" name=\"Führungskraft Fachbereich\" />\n    <participant id=\"sid-527C14AA-A993-4E8C-A9CD-99639DF62466\" name=\"Durchführung Bewerbungsgespräch - &#10;Sachbearbeiter Personal\" processRef=\"sid-D0B76975-2A71-4345-9861-401E7CB66AF6\" />\n    <participant id=\"sid-7BD88080-E847-40D9-9714-C838543CEC18\" name=\"Management Bewerbungsgespräche -&#10; Sachbearbeiter Personal\" processRef=\"sid-35DD95AD-CA27-4826-8E4F-351207D0FA1A\" />\n    <participant id=\"sid-1C31EF64-81F8-4886-88E9-434DF53A7B5F\" name=\"Bewerber\" />\n    <participant id=\"sid-C08CDF7A-062A-4F46-80DA-02F243AB0B3F\" name=\"Management Arbeitsvertrag - &#10;Sachbearbeiter Personal\" processRef=\"sid-5F2C877A-F295-424C-A941-8AFE42AFD1AE\" />\n    <participant id=\"sid-43B00F10-A229-44CF-BAD4-7F7147D380E9\" name=\"Führungskraft Fachbereich\" />\n    <messageFlow id=\"sid-91E5F463-9CDA-4B49-8BB1-BD4C050EBBB2\" sourceRef=\"sid-C583AB0E-16D2-4440-973E-F03090497640\" targetRef=\"sid-8910ED9B-DADC-4E11-9AD5-E12448B57ADF\" />\n    <messageFlow id=\"sid-A6C70715-D7C5-46FB-8ADB-0DC89B3991FD\" sourceRef=\"sid-FF2BEA0D-55D5-4F2B-B7BA-195BC10CA9EB\" targetRef=\"sid-C583AB0E-16D2-4440-973E-F03090497640\" />\n    <messageFlow id=\"sid-1E7B8929-56CE-43DA-9B85-B91426258E04\" sourceRef=\"sid-C583AB0E-16D2-4440-973E-F03090497640\" targetRef=\"sid-6EED0CFD-023A-4ACC-B944-42D90A617BDF\" />\n    <messageFlow id=\"sid-309F9D94-670D-47BA-9511-3AB7AB0B9A83\" sourceRef=\"sid-05FFFE92-8A4C-43AB-8D9A-E14A1B0EE051\" targetRef=\"sid-C583AB0E-16D2-4440-973E-F03090497640\" />\n    <messageFlow id=\"sid-C529D2AE-4E4C-4985-A8CB-E6E74673BCAE\" sourceRef=\"sid-C583AB0E-16D2-4440-973E-F03090497640\" targetRef=\"sid-05FFFE92-8A4C-43AB-8D9A-E14A1B0EE051\" />\n    <messageFlow id=\"sid-95BFCA10-63D0-4D29-8E56-2270CACF3BA8\" sourceRef=\"sid-0C2D523B-E4EB-4776-AFA3-43B156AAE378\" targetRef=\"sid-D3CA93A5-3BCC-4DB3-8075-EAC0C0A53991\" />\n    <messageFlow id=\"sid-F9BB69AC-3000-4C14-94DC-8CC8D3F2B65D\" sourceRef=\"sid-303796CF-BA87-40A7-B2EC-9F6E10BD1060\" targetRef=\"sid-991275D8-E60A-440A-B2DD-094D2B0049A4\" />\n    <messageFlow id=\"sid-83275776-30AE-4168-9311-18544B088890\" sourceRef=\"sid-286F337E-9361-4B4D-AF78-7E403CA80DA1\" targetRef=\"sid-EEF891AC-F8A7-4623-9BA3-F560E2782C9D\" />\n    <messageFlow id=\"sid-B28E079A-EC0B-4A89-9BF3-6850173FADFC\" sourceRef=\"sid-4F2CDAD6-92D6-470B-B82C-8D07E050591A\" targetRef=\"sid-42305309-4E98-47F0-80C4-690E2DB222C0\" />\n    <messageFlow id=\"sid-4419C1F2-A991-4A8F-B055-31790C2A4425\" sourceRef=\"sid-8CE3896D-0181-49CE-A1A9-C085262DA0FA\" targetRef=\"sid-B7711D66-52EB-4437-AA0C-5671CE83C6E6\" />\n    <messageFlow id=\"sid-B8825EB2-D9F8-4506-BB4A-0330FF0FFAA9\" sourceRef=\"sid-155B51B2-12E4-4A0B-AFDF-DDBA2EE093D5\" targetRef=\"sid-2E859D5D-83B3-461D-9FFF-2AAF49E71D2A\" />\n    <messageFlow id=\"sid-03040B88-2530-4CC1-B5D2-B52CFA3F4144\" sourceRef=\"sid-2E859D5D-83B3-461D-9FFF-2AAF49E71D2A\" targetRef=\"sid-155B51B2-12E4-4A0B-AFDF-DDBA2EE093D5\" />\n    <messageFlow id=\"sid-DE7499BF-C4BD-4189-890C-F215087A424D\" sourceRef=\"sid-5695269D-E801-4953-B48D-EB281E7316F7\" targetRef=\"sid-C95FEFFE-4759-4ABA-B11D-E4BA65DA268F\" />\n    <messageFlow id=\"sid-D974B6C2-C395-4788-8AC8-28BAC3DEB097\" sourceRef=\"sid-C95FEFFE-4759-4ABA-B11D-E4BA65DA268F\" targetRef=\"sid-5695269D-E801-4953-B48D-EB281E7316F7\" />\n    <messageFlow id=\"sid-D4887F44-4F7F-47A6-9802-908D44DF7A6D\" sourceRef=\"sid-8ED06068-AA04-428D-860D-8CA2A0483C2A\" targetRef=\"sid-36E152C5-1864-4D96-9F9B-27133FD47EFE\" />\n    <messageFlow id=\"sid-37532634-B172-4542-96A6-7E347E3CEA37\" sourceRef=\"sid-597B2F0C-9759-421B-8F52-D8F26705F2BE\" targetRef=\"sid-36E152C5-1864-4D96-9F9B-27133FD47EFE\" />\n    <messageFlow id=\"sid-8B230C74-C9AA-43B1-953D-5BF07007A5FF\" sourceRef=\"sid-F197542D-D274-45BE-95A5-7A3608BBE27A\" targetRef=\"sid-36E152C5-1864-4D96-9F9B-27133FD47EFE\" />\n    <messageFlow id=\"sid-D42DDB33-3FF9-4C9A-A310-F65810A07BC6\" sourceRef=\"sid-1C31EF64-81F8-4886-88E9-434DF53A7B5F\" targetRef=\"sid-8376EFE7-7178-4B72-AF75-4CD3BCDCA599\" />\n    <messageFlow id=\"sid-939F496E-402A-4FCF-9A6F-C138E1A4F2DA\" sourceRef=\"sid-1C31EF64-81F8-4886-88E9-434DF53A7B5F\" targetRef=\"sid-158F070A-F137-4B82-8403-261AA7E86AB6\" />\n    <messageFlow id=\"sid-CD6D8956-F668-4D01-A8D1-C4D9643A2375\" sourceRef=\"sid-8376EFE7-7178-4B72-AF75-4CD3BCDCA599\" targetRef=\"sid-1C31EF64-81F8-4886-88E9-434DF53A7B5F\" />\n    <messageFlow id=\"sid-71473AE9-0707-44B9-A0D3-C315677EFA05\" sourceRef=\"sid-B316767E-63CE-4A62-A9BF-AB4F0A0D517F\" targetRef=\"sid-1C31EF64-81F8-4886-88E9-434DF53A7B5F\" />\n    <messageFlow id=\"sid-C41799EC-DD3A-4ED3-9E55-776983B28363\" sourceRef=\"sid-D453B3D6-0EA6-4607-A413-C6332ABE9F32\" targetRef=\"sid-F18FD2E3-46A6-4E86-9AA9-D67094D0DCE7\" />\n    <messageFlow id=\"sid-FD240858-85C6-4D1A-9336-5E043D753A72\" sourceRef=\"sid-8700D448-747C-4559-9A57-BFE8AAD639D4\" targetRef=\"sid-691FDEB6-F626-4AB1-8E90-3653C83C04EA\" />\n    <messageFlow id=\"sid-9C99A596-2527-45AC-9ABB-6626A36DB292\" sourceRef=\"sid-C5457771-C93B-44FD-8D70-05849F25C775\" targetRef=\"sid-6C68E5FA-5812-446E-A335-AD6B18AD9BC6\" />\n    <messageFlow id=\"sid-606B1F31-96AA-4799-8E9E-C4E6A968A715\" sourceRef=\"sid-6C68E5FA-5812-446E-A335-AD6B18AD9BC6\" targetRef=\"sid-C5457771-C93B-44FD-8D70-05849F25C775\" />\n    <messageFlow id=\"sid-2DE50901-E357-426B-AC39-60EA1842B6FA\" sourceRef=\"sid-6C68E5FA-5812-446E-A335-AD6B18AD9BC6\" targetRef=\"sid-9838543B-F6B3-4432-A9B3-8B790A762147\" />\n    <messageFlow id=\"sid-AC383C65-2E51-4F3E-ACE4-C973310B1447\" sourceRef=\"sid-1F104A2B-C7CC-49E1-87F1-8391D31274BE\" targetRef=\"sid-6C68E5FA-5812-446E-A335-AD6B18AD9BC6\" />\n    <messageFlow id=\"sid-09BC5894-5810-439D-9A36-FEF0B083B598\" sourceRef=\"sid-2EE25CB0-E8BA-491E-A773-BD4B27643246\" targetRef=\"sid-43B00F10-A229-44CF-BAD4-7F7147D380E9\" />\n    <messageFlow id=\"sid-6BFB777A-C370-4A2B-A6AA-82581B15C84E\" sourceRef=\"sid-BFDE4B6A-89F4-415B-8A22-7BA82C441A65\" targetRef=\"sid-43B00F10-A229-44CF-BAD4-7F7147D380E9\" />\n  </collaboration>\n  <process id=\"sid-67C91933-43BF-4B55-A9FA-BB741C03A8C4\" name=\"Bewerbungseingang - &#10;Sachbearbeiter Personal\" processType=\"None\" isClosed=\"false\" isExecutable=\"false\">\n    <extensionElements />\n    <laneSet id=\"sid-39cdd7f8-075e-4f93-a903-4ee6ec2494d8\">\n      <lane id=\"sid-E391B624-F6E8-428B-9C3E-7026F85C4F24\">\n        <flowNodeRef>sid-8E5D2B9D-6731-4FA7-BB27-C444A7236A69</flowNodeRef>\n        <flowNodeRef>sid-028EEE79-92D7-4C1B-B90D-905AA2697614</flowNodeRef>\n        <flowNodeRef>sid-7C1A234F-E066-438E-96E1-C0D7847288EA</flowNodeRef>\n        <flowNodeRef>sid-6EED0CFD-023A-4ACC-B944-42D90A617BDF</flowNodeRef>\n        <flowNodeRef>sid-CCECC1E8-CA9C-49BB-BEDF-75F173A11194</flowNodeRef>\n        <flowNodeRef>sid-F1FC14E4-8BBB-4647-9F9D-179663172496</flowNodeRef>\n        <flowNodeRef>sid-FF2BEA0D-55D5-4F2B-B7BA-195BC10CA9EB</flowNodeRef>\n        <flowNodeRef>sid-8910ED9B-DADC-4E11-9AD5-E12448B57ADF</flowNodeRef>\n        <flowNodeRef>sid-545B3227-D12A-43A8-B746-55E8C75F3A8A</flowNodeRef>\n        <flowNodeRef>sid-0FE7F936-F79B-4EB8-95F0-DC0AB97C682F</flowNodeRef>\n        <flowNodeRef>sid-05FFFE92-8A4C-43AB-8D9A-E14A1B0EE051</flowNodeRef>\n        <flowNodeRef>sid-28EA3990-9252-49F9-AD56-8FCDBFD7DA7D</flowNodeRef>\n        <flowNodeRef>sid-25203984-1D0A-494D-AD69-9140631D10FD</flowNodeRef>\n        <flowNodeRef>sid-6243D8FF-E57D-4D03-8234-40836D4E60D5</flowNodeRef>\n        <flowNodeRef>sid-72EBDBE9-3856-4AF7-9DDB-7C0F478E26D8</flowNodeRef>\n        <flowNodeRef>sid-57892D76-E413-4274-B8DE-FED72250C8A7</flowNodeRef>\n        <flowNodeRef>sid-6392228F-E287-40F3-9DD6-B91493F6B671</flowNodeRef>\n        <flowNodeRef>sid-EC21E3DA-12C5-4B74-83F7-530229F6C777</flowNodeRef>\n      </lane>\n    </laneSet>\n    <dataStoreReference id=\"sid-E8C87193-03FE-438D-A921-0BAB9FBD08D9\" name=\"HR-Tool\" dataStoreRef=\"sid-1f3b3b35-28a1-4fff-8835-ae271ef486d5\" />\n    <task id=\"sid-8E5D2B9D-6731-4FA7-BB27-C444A7236A69\" name=\"Bewertung erfassen\">\n      <incoming>sid-A83B900A-A119-4FC4-A77F-09849C8660C9</incoming>\n      <outgoing>sid-4A0A3787-3011-42F1-8CF7-16479922159E</outgoing>\n    </task>\n    <task id=\"sid-028EEE79-92D7-4C1B-B90D-905AA2697614\" name=\"Bewerbung ablegen\">\n      <incoming>sid-4A0A3787-3011-42F1-8CF7-16479922159E</incoming>\n      <outgoing>sid-8F7A2A97-7C59-4B9E-AE03-625BB085C0E4</outgoing>\n      <dataOutputAssociation id=\"sid-1C8DEB94-31C4-47FE-AA84-605810C351AF\">\n        <sourceRef>sid-028EEE79-92D7-4C1B-B90D-905AA2697614</sourceRef>\n        <targetRef>sid-E8C87193-03FE-438D-A921-0BAB9FBD08D9</targetRef>\n      </dataOutputAssociation>\n    </task>\n    <endEvent id=\"sid-7C1A234F-E066-438E-96E1-C0D7847288EA\" name=\"Bewerbung&#10;geprüft\">\n      <incoming>sid-8F7A2A97-7C59-4B9E-AE03-625BB085C0E4</incoming>\n    </endEvent>\n    <startEvent id=\"sid-6EED0CFD-023A-4ACC-B944-42D90A617BDF\" name=\"Bewerbung &#10;eingegangen\">\n      <outgoing>sid-7E6EBD99-9B3A-44CE-972E-9CCDA7924AD8</outgoing>\n      <messageEventDefinition id=\"sid-53384a61-8cf5-472a-bb4a-22e4c278f93d\" />\n    </startEvent>\n    <task id=\"sid-CCECC1E8-CA9C-49BB-BEDF-75F173A11194\" name=\"Vollständigkeit der Bewerbung &#10;prüfen\">\n      <incoming>sid-FD9AF1C4-E124-4C55-9B18-87804F8EC67E</incoming>\n      <outgoing>sid-85F7873E-4458-4406-9D6E-1F4CA6268D55</outgoing>\n    </task>\n    <exclusiveGateway id=\"sid-F1FC14E4-8BBB-4647-9F9D-179663172496\" name=\"Bewerbung &#10;fehlerhaft &#10;oder &#10;unvollständig?\" gatewayDirection=\"Diverging\">\n      <incoming>sid-85F7873E-4458-4406-9D6E-1F4CA6268D55</incoming>\n      <outgoing>sid-0D428B09-7C49-44AE-A257-7E810A541B0F</outgoing>\n      <outgoing>sid-F86867DE-BA70-47C1-8340-A6A5A3B645AA</outgoing>\n    </exclusiveGateway>\n    <task id=\"sid-FF2BEA0D-55D5-4F2B-B7BA-195BC10CA9EB\" name=\"Rückmeldung versenden\">\n      <incoming>sid-F86867DE-BA70-47C1-8340-A6A5A3B645AA</incoming>\n      <outgoing>sid-DC611CCE-BA2C-459D-974D-4D09E2C390E6</outgoing>\n    </task>\n    <intermediateCatchEvent id=\"sid-8910ED9B-DADC-4E11-9AD5-E12448B57ADF\" name=\"weiterführende &#10;Informationen&#10; erhalten\">\n      <incoming>sid-B9DF0BE4-4658-4908-8E4C-B528E8EA1FDD</incoming>\n      <outgoing>sid-7BA05743-5D0C-4D1C-B193-22FE2A156E22</outgoing>\n      <messageEventDefinition id=\"sid-311ec8d4-5c12-4c83-861f-5d6759cb5816\" />\n    </intermediateCatchEvent>\n    <eventBasedGateway id=\"sid-545B3227-D12A-43A8-B746-55E8C75F3A8A\" gatewayDirection=\"Mixed\">\n      <incoming>sid-DC611CCE-BA2C-459D-974D-4D09E2C390E6</incoming>\n      <incoming>sid-3C44D333-01F3-43B7-AE4F-F13DD6D05DAC</incoming>\n      <outgoing>sid-B9DF0BE4-4658-4908-8E4C-B528E8EA1FDD</outgoing>\n      <outgoing>sid-F9A96365-936B-4461-8D51-C38EBA362A68</outgoing>\n    </eventBasedGateway>\n    <intermediateCatchEvent id=\"sid-0FE7F936-F79B-4EB8-95F0-DC0AB97C682F\" name=\"Rückmeldefrist&#10;verstrichen\">\n      <incoming>sid-F9A96365-936B-4461-8D51-C38EBA362A68</incoming>\n      <outgoing>sid-9DE1A24F-5ED5-4095-B9C8-B7213895C7B7</outgoing>\n      <timerEventDefinition id=\"sid-fbc953bf-f275-4feb-8038-5522f5d28e40\" />\n    </intermediateCatchEvent>\n    <task id=\"sid-05FFFE92-8A4C-43AB-8D9A-E14A1B0EE051\" name=\"Beim Bewerber &#10;nachfragen\">\n      <incoming>sid-9DE1A24F-5ED5-4095-B9C8-B7213895C7B7</incoming>\n      <outgoing>sid-950B6B3A-BEDA-49E3-A901-6733165E80C3</outgoing>\n    </task>\n    <exclusiveGateway id=\"sid-28EA3990-9252-49F9-AD56-8FCDBFD7DA7D\" name=\"Bewerbung &#10;hinfällig?\" gatewayDirection=\"Diverging\">\n      <incoming>sid-950B6B3A-BEDA-49E3-A901-6733165E80C3</incoming>\n      <outgoing>sid-3C44D333-01F3-43B7-AE4F-F13DD6D05DAC</outgoing>\n      <outgoing>sid-E54CB8B4-BED9-43AF-B03B-DBE60483A68A</outgoing>\n    </exclusiveGateway>\n    <task id=\"sid-25203984-1D0A-494D-AD69-9140631D10FD\" name=\"Bewerbung zurücksenden\">\n      <incoming>sid-AEE9D356-E86D-4D7A-ABC5-AA6E76635A57</incoming>\n      <outgoing>sid-C2A9F8A3-0E65-4BA2-A854-4B34EE2D2DFD</outgoing>\n    </task>\n    <endEvent id=\"sid-6243D8FF-E57D-4D03-8234-40836D4E60D5\" name=\"Bewerbung &#10;zurück&#10;gesendet\">\n      <incoming>sid-C2A9F8A3-0E65-4BA2-A854-4B34EE2D2DFD</incoming>\n    </endEvent>\n    <exclusiveGateway id=\"sid-72EBDBE9-3856-4AF7-9DDB-7C0F478E26D8\" gatewayDirection=\"Converging\">\n      <incoming>sid-7BA05743-5D0C-4D1C-B193-22FE2A156E22</incoming>\n      <incoming>sid-7E6EBD99-9B3A-44CE-972E-9CCDA7924AD8</incoming>\n      <outgoing>sid-FD9AF1C4-E124-4C55-9B18-87804F8EC67E</outgoing>\n    </exclusiveGateway>\n    <exclusiveGateway id=\"sid-57892D76-E413-4274-B8DE-FED72250C8A7\" name=\"Bewerbung &#10;inhaltlich ok?\" gatewayDirection=\"Diverging\">\n      <incoming>sid-62177F1C-D8D7-488A-9F8A-E379831B4792</incoming>\n      <outgoing>sid-A83B900A-A119-4FC4-A77F-09849C8660C9</outgoing>\n      <outgoing>sid-8BC0544C-1924-4422-B5BE-5CC1501312F4</outgoing>\n    </exclusiveGateway>\n    <task id=\"sid-6392228F-E287-40F3-9DD6-B91493F6B671\" name=\"Bewerbung inhaltlich &#10;prüfen\">\n      <incoming>sid-0D428B09-7C49-44AE-A257-7E810A541B0F</incoming>\n      <outgoing>sid-62177F1C-D8D7-488A-9F8A-E379831B4792</outgoing>\n    </task>\n    <exclusiveGateway id=\"sid-EC21E3DA-12C5-4B74-83F7-530229F6C777\" gatewayDirection=\"Converging\">\n      <incoming>sid-E54CB8B4-BED9-43AF-B03B-DBE60483A68A</incoming>\n      <incoming>sid-8BC0544C-1924-4422-B5BE-5CC1501312F4</incoming>\n      <outgoing>sid-AEE9D356-E86D-4D7A-ABC5-AA6E76635A57</outgoing>\n    </exclusiveGateway>\n    <sequenceFlow id=\"sid-8BC0544C-1924-4422-B5BE-5CC1501312F4\" name=\"nein\" sourceRef=\"sid-57892D76-E413-4274-B8DE-FED72250C8A7\" targetRef=\"sid-EC21E3DA-12C5-4B74-83F7-530229F6C777\" />\n    <sequenceFlow id=\"sid-E54CB8B4-BED9-43AF-B03B-DBE60483A68A\" name=\"ja\" sourceRef=\"sid-28EA3990-9252-49F9-AD56-8FCDBFD7DA7D\" targetRef=\"sid-EC21E3DA-12C5-4B74-83F7-530229F6C777\" />\n    <sequenceFlow id=\"sid-AEE9D356-E86D-4D7A-ABC5-AA6E76635A57\" sourceRef=\"sid-EC21E3DA-12C5-4B74-83F7-530229F6C777\" targetRef=\"sid-25203984-1D0A-494D-AD69-9140631D10FD\" />\n    <sequenceFlow id=\"sid-A83B900A-A119-4FC4-A77F-09849C8660C9\" name=\"ja\" sourceRef=\"sid-57892D76-E413-4274-B8DE-FED72250C8A7\" targetRef=\"sid-8E5D2B9D-6731-4FA7-BB27-C444A7236A69\" />\n    <sequenceFlow id=\"sid-62177F1C-D8D7-488A-9F8A-E379831B4792\" sourceRef=\"sid-6392228F-E287-40F3-9DD6-B91493F6B671\" targetRef=\"sid-57892D76-E413-4274-B8DE-FED72250C8A7\" />\n    <sequenceFlow id=\"sid-FD9AF1C4-E124-4C55-9B18-87804F8EC67E\" sourceRef=\"sid-72EBDBE9-3856-4AF7-9DDB-7C0F478E26D8\" targetRef=\"sid-CCECC1E8-CA9C-49BB-BEDF-75F173A11194\" />\n    <sequenceFlow id=\"sid-7E6EBD99-9B3A-44CE-972E-9CCDA7924AD8\" sourceRef=\"sid-6EED0CFD-023A-4ACC-B944-42D90A617BDF\" targetRef=\"sid-72EBDBE9-3856-4AF7-9DDB-7C0F478E26D8\" />\n    <sequenceFlow id=\"sid-7BA05743-5D0C-4D1C-B193-22FE2A156E22\" sourceRef=\"sid-8910ED9B-DADC-4E11-9AD5-E12448B57ADF\" targetRef=\"sid-72EBDBE9-3856-4AF7-9DDB-7C0F478E26D8\" />\n    <sequenceFlow id=\"sid-3C44D333-01F3-43B7-AE4F-F13DD6D05DAC\" name=\"nein\" sourceRef=\"sid-28EA3990-9252-49F9-AD56-8FCDBFD7DA7D\" targetRef=\"sid-545B3227-D12A-43A8-B746-55E8C75F3A8A\" />\n    <sequenceFlow id=\"sid-C2A9F8A3-0E65-4BA2-A854-4B34EE2D2DFD\" sourceRef=\"sid-25203984-1D0A-494D-AD69-9140631D10FD\" targetRef=\"sid-6243D8FF-E57D-4D03-8234-40836D4E60D5\" />\n    <sequenceFlow id=\"sid-F86867DE-BA70-47C1-8340-A6A5A3B645AA\" name=\"ja\" sourceRef=\"sid-F1FC14E4-8BBB-4647-9F9D-179663172496\" targetRef=\"sid-FF2BEA0D-55D5-4F2B-B7BA-195BC10CA9EB\" />\n    <sequenceFlow id=\"sid-950B6B3A-BEDA-49E3-A901-6733165E80C3\" sourceRef=\"sid-05FFFE92-8A4C-43AB-8D9A-E14A1B0EE051\" targetRef=\"sid-28EA3990-9252-49F9-AD56-8FCDBFD7DA7D\" />\n    <sequenceFlow id=\"sid-9DE1A24F-5ED5-4095-B9C8-B7213895C7B7\" sourceRef=\"sid-0FE7F936-F79B-4EB8-95F0-DC0AB97C682F\" targetRef=\"sid-05FFFE92-8A4C-43AB-8D9A-E14A1B0EE051\" />\n    <sequenceFlow id=\"sid-F9A96365-936B-4461-8D51-C38EBA362A68\" sourceRef=\"sid-545B3227-D12A-43A8-B746-55E8C75F3A8A\" targetRef=\"sid-0FE7F936-F79B-4EB8-95F0-DC0AB97C682F\" />\n    <sequenceFlow id=\"sid-B9DF0BE4-4658-4908-8E4C-B528E8EA1FDD\" sourceRef=\"sid-545B3227-D12A-43A8-B746-55E8C75F3A8A\" targetRef=\"sid-8910ED9B-DADC-4E11-9AD5-E12448B57ADF\" />\n    <sequenceFlow id=\"sid-DC611CCE-BA2C-459D-974D-4D09E2C390E6\" sourceRef=\"sid-FF2BEA0D-55D5-4F2B-B7BA-195BC10CA9EB\" targetRef=\"sid-545B3227-D12A-43A8-B746-55E8C75F3A8A\" />\n    <sequenceFlow id=\"sid-0D428B09-7C49-44AE-A257-7E810A541B0F\" name=\"nein\" sourceRef=\"sid-F1FC14E4-8BBB-4647-9F9D-179663172496\" targetRef=\"sid-6392228F-E287-40F3-9DD6-B91493F6B671\" />\n    <sequenceFlow id=\"sid-85F7873E-4458-4406-9D6E-1F4CA6268D55\" sourceRef=\"sid-CCECC1E8-CA9C-49BB-BEDF-75F173A11194\" targetRef=\"sid-F1FC14E4-8BBB-4647-9F9D-179663172496\" />\n    <sequenceFlow id=\"sid-8F7A2A97-7C59-4B9E-AE03-625BB085C0E4\" sourceRef=\"sid-028EEE79-92D7-4C1B-B90D-905AA2697614\" targetRef=\"sid-7C1A234F-E066-438E-96E1-C0D7847288EA\" />\n    <sequenceFlow id=\"sid-4A0A3787-3011-42F1-8CF7-16479922159E\" sourceRef=\"sid-8E5D2B9D-6731-4FA7-BB27-C444A7236A69\" targetRef=\"sid-028EEE79-92D7-4C1B-B90D-905AA2697614\" />\n    <textAnnotation id=\"sid-0862744E-76C7-4681-8759-7B8E629828B8\">\n      <text>ID2</text>\n    </textAnnotation>\n    <association id=\"sid-23F431C6-D279-436A-86B4-9E6F3F05EFCC\" associationDirection=\"None\" sourceRef=\"sid-25203984-1D0A-494D-AD69-9140631D10FD\" targetRef=\"sid-0862744E-76C7-4681-8759-7B8E629828B8\" />\n  </process>\n  <process id=\"sid-3C2D842A-E239-44F2-91A1-D809676A3462\" name=\"Bewerbungsprüfung (fristgerecht) - Sachbearbeiter Personal\" processType=\"None\" isClosed=\"false\" isExecutable=\"false\">\n    <extensionElements />\n    <laneSet id=\"sid-afc2841d-4031-42d9-9f23-29fac02d634e\">\n      <lane id=\"sid-4E447BCA-4A6B-4944-8A1C-1A184D6A95FD\">\n        <flowNodeRef>sid-A9859F1C-A85B-4F2F-B2DF-E3F4F7FA67FA</flowNodeRef>\n        <flowNodeRef>sid-B9B94A24-2819-461A-B5E8-61182BDA87DD</flowNodeRef>\n        <flowNodeRef>sid-86DC77E1-24A3-499E-89D0-499B4BBFF67A</flowNodeRef>\n        <flowNodeRef>sid-F0DA46E1-7E86-4236-9D49-290DD7B87C61</flowNodeRef>\n        <flowNodeRef>sid-BEC67F12-04E9-4AE2-B59E-FEB109CD3DF8</flowNodeRef>\n        <flowNodeRef>sid-303796CF-BA87-40A7-B2EC-9F6E10BD1060</flowNodeRef>\n        <flowNodeRef>sid-D3CA93A5-3BCC-4DB3-8075-EAC0C0A53991</flowNodeRef>\n        <flowNodeRef>sid-282D9841-8694-47FB-A058-32A5B47CFB1E</flowNodeRef>\n        <flowNodeRef>sid-597B2F0C-9759-421B-8F52-D8F26705F2BE</flowNodeRef>\n        <flowNodeRef>sid-6460C9E2-AD85-4EA6-8922-F9BAB25F1C5F</flowNodeRef>\n      </lane>\n    </laneSet>\n    <task id=\"sid-A9859F1C-A85B-4F2F-B2DF-E3F4F7FA67FA\" name=\"Aufstellung der Bewerber erstellen\">\n      <incoming>sid-F3E23BCC-F29B-444C-BF2B-C2AA7D9D0DEF</incoming>\n      <outgoing>sid-770DE0CC-14BD-46C1-B93A-3C10BD8A3933</outgoing>\n      <property id=\"Property_17padiq\" name=\"__targetRef_placeholder\" />\n      <dataInputAssociation id=\"sid-310DFC6B-79B0-40BC-BF9E-D072E122A3A2\">\n        <sourceRef>sid-E8C87193-03FE-438D-A921-0BAB9FBD08D9</sourceRef>\n        <targetRef>Property_17padiq</targetRef>\n      </dataInputAssociation>\n      <dataOutputAssociation id=\"sid-9391DBA5-9C7B-4B14-B502-AB985711AD02\">\n        <sourceRef>sid-A9859F1C-A85B-4F2F-B2DF-E3F4F7FA67FA</sourceRef>\n        <targetRef>sid-8D8BD39F-1B08-433F-8F93-A1FF7520BA8B</targetRef>\n      </dataOutputAssociation>\n    </task>\n    <dataObjectReference id=\"sid-8D8BD39F-1B08-433F-8F93-A1FF7520BA8B\" name=\"Bewerber\" isCollection=\"true\" />\n    <exclusiveGateway id=\"sid-B9B94A24-2819-461A-B5E8-61182BDA87DD\" name=\"Bewerbungen&#10;eingegangen?\" gatewayDirection=\"Diverging\">\n      <incoming>sid-770DE0CC-14BD-46C1-B93A-3C10BD8A3933</incoming>\n      <outgoing>sid-155BB3AD-386C-4EF2-92C6-E2800D82A875</outgoing>\n      <outgoing>sid-3EB9F09F-9E44-4200-A845-09B78E5F6BA8</outgoing>\n    </exclusiveGateway>\n    <startEvent id=\"sid-86DC77E1-24A3-499E-89D0-499B4BBFF67A\" name=\"Vorfrist zur &#10;Stellenbesetzung&#10; abgelaufen\">\n      <outgoing>sid-F3E23BCC-F29B-444C-BF2B-C2AA7D9D0DEF</outgoing>\n      <timerEventDefinition id=\"sid-11ce2f25-c9e7-460a-9ebd-0525ac873dcd\" />\n    </startEvent>\n    <businessRuleTask id=\"sid-F0DA46E1-7E86-4236-9D49-290DD7B87C61\" name=\"Potentielle Kandidaten markieren\" implementation=\"webService\">\n      <incoming>sid-3EB9F09F-9E44-4200-A845-09B78E5F6BA8</incoming>\n      <outgoing>sid-BDC5800E-05A9-4D22-BA46-474DD7EBFF31</outgoing>\n      <property id=\"Property_1qmn4q3\" name=\"__targetRef_placeholder\" />\n      <dataInputAssociation id=\"sid-A1B5F8D2-3FF2-4FAE-A885-819174BB01BD\">\n        <sourceRef>sid-8D8BD39F-1B08-433F-8F93-A1FF7520BA8B</sourceRef>\n        <targetRef>Property_1qmn4q3</targetRef>\n      </dataInputAssociation>\n      <dataOutputAssociation id=\"sid-1D74E5C9-7875-42C7-B069-7EF805115BFB\">\n        <sourceRef>sid-F0DA46E1-7E86-4236-9D49-290DD7B87C61</sourceRef>\n        <targetRef>sid-8D8BD39F-1B08-433F-8F93-A1FF7520BA8B</targetRef>\n      </dataOutputAssociation>\n    </businessRuleTask>\n    <endEvent id=\"sid-BEC67F12-04E9-4AE2-B59E-FEB109CD3DF8\" name=\"Info &#10;versenden\">\n      <incoming>sid-155BB3AD-386C-4EF2-92C6-E2800D82A875</incoming>\n      <messageEventDefinition id=\"sid-a1976f34-7cf3-4b52-a0a6-65a738a6c05b\" />\n    </endEvent>\n    <task id=\"sid-303796CF-BA87-40A7-B2EC-9F6E10BD1060\" name=\"Liste der Bewerbung(en) zur Prüfung vorlegen\">\n      <incoming>sid-BDC5800E-05A9-4D22-BA46-474DD7EBFF31</incoming>\n      <outgoing>sid-F834923E-C5BB-44FF-9238-FE9B18B7ECD2</outgoing>\n    </task>\n    <intermediateCatchEvent id=\"sid-D3CA93A5-3BCC-4DB3-8075-EAC0C0A53991\" name=\"Bewertung(en)&#10;erhalten\">\n      <incoming>sid-F834923E-C5BB-44FF-9238-FE9B18B7ECD2</incoming>\n      <outgoing>sid-EA96E73A-B3ED-48A6-B066-5B38CA75DBE6</outgoing>\n      <messageEventDefinition id=\"sid-02d86d6c-66ae-4619-b8b4-0bd96bea426d\" />\n    </intermediateCatchEvent>\n    <task id=\"sid-282D9841-8694-47FB-A058-32A5B47CFB1E\" name=\"Bewertungen auswerten\">\n      <incoming>sid-EA96E73A-B3ED-48A6-B066-5B38CA75DBE6</incoming>\n      <outgoing>sid-1D3A1400-EBE2-4C67-B377-CC31EB9925E5</outgoing>\n    </task>\n    <task id=\"sid-597B2F0C-9759-421B-8F52-D8F26705F2BE\" name=\"Geeignete Kandidaten melden\">\n      <incoming>sid-1D3A1400-EBE2-4C67-B377-CC31EB9925E5</incoming>\n      <outgoing>sid-54D77E49-FBFB-4B81-932A-B8F5E3BE4C6A</outgoing>\n    </task>\n    <endEvent id=\"sid-6460C9E2-AD85-4EA6-8922-F9BAB25F1C5F\" name=\"Bewerbungen&#10;geprüft\">\n      <incoming>sid-54D77E49-FBFB-4B81-932A-B8F5E3BE4C6A</incoming>\n    </endEvent>\n    <sequenceFlow id=\"sid-54D77E49-FBFB-4B81-932A-B8F5E3BE4C6A\" sourceRef=\"sid-597B2F0C-9759-421B-8F52-D8F26705F2BE\" targetRef=\"sid-6460C9E2-AD85-4EA6-8922-F9BAB25F1C5F\" />\n    <sequenceFlow id=\"sid-1D3A1400-EBE2-4C67-B377-CC31EB9925E5\" sourceRef=\"sid-282D9841-8694-47FB-A058-32A5B47CFB1E\" targetRef=\"sid-597B2F0C-9759-421B-8F52-D8F26705F2BE\" />\n    <sequenceFlow id=\"sid-BDC5800E-05A9-4D22-BA46-474DD7EBFF31\" sourceRef=\"sid-F0DA46E1-7E86-4236-9D49-290DD7B87C61\" targetRef=\"sid-303796CF-BA87-40A7-B2EC-9F6E10BD1060\" />\n    <sequenceFlow id=\"sid-3EB9F09F-9E44-4200-A845-09B78E5F6BA8\" name=\"ja\" sourceRef=\"sid-B9B94A24-2819-461A-B5E8-61182BDA87DD\" targetRef=\"sid-F0DA46E1-7E86-4236-9D49-290DD7B87C61\" />\n    <sequenceFlow id=\"sid-EA96E73A-B3ED-48A6-B066-5B38CA75DBE6\" sourceRef=\"sid-D3CA93A5-3BCC-4DB3-8075-EAC0C0A53991\" targetRef=\"sid-282D9841-8694-47FB-A058-32A5B47CFB1E\" />\n    <sequenceFlow id=\"sid-F834923E-C5BB-44FF-9238-FE9B18B7ECD2\" sourceRef=\"sid-303796CF-BA87-40A7-B2EC-9F6E10BD1060\" targetRef=\"sid-D3CA93A5-3BCC-4DB3-8075-EAC0C0A53991\" />\n    <sequenceFlow id=\"sid-155BB3AD-386C-4EF2-92C6-E2800D82A875\" name=\"nein\" sourceRef=\"sid-B9B94A24-2819-461A-B5E8-61182BDA87DD\" targetRef=\"sid-BEC67F12-04E9-4AE2-B59E-FEB109CD3DF8\" />\n    <sequenceFlow id=\"sid-770DE0CC-14BD-46C1-B93A-3C10BD8A3933\" sourceRef=\"sid-A9859F1C-A85B-4F2F-B2DF-E3F4F7FA67FA\" targetRef=\"sid-B9B94A24-2819-461A-B5E8-61182BDA87DD\" />\n    <sequenceFlow id=\"sid-F3E23BCC-F29B-444C-BF2B-C2AA7D9D0DEF\" sourceRef=\"sid-86DC77E1-24A3-499E-89D0-499B4BBFF67A\" targetRef=\"sid-A9859F1C-A85B-4F2F-B2DF-E3F4F7FA67FA\" />\n    <textAnnotation id=\"sid-08F7E7A1-A19F-4324-8D38-CD160728FB9A\">\n      <text>Frist = 1 Monate vor Besetzung der Stelle</text>\n    </textAnnotation>\n    <textAnnotation id=\"sid-26C1D0AA-CDB7-43FC-A36A-DF0658A215B1\">\n      <text>ID1</text>\n    </textAnnotation>\n    <textAnnotation id=\"sid-86AEF0B1-9EB6-45FD-B9A3-DAE6F5ED71A4\">\n      <text>ID13</text>\n    </textAnnotation>\n    <association id=\"sid-1B51B1B0-FB1A-46CE-BC87-0D89AEA6845A\" associationDirection=\"None\" sourceRef=\"sid-86DC77E1-24A3-499E-89D0-499B4BBFF67A\" targetRef=\"sid-08F7E7A1-A19F-4324-8D38-CD160728FB9A\" />\n    <association id=\"sid-7164D016-D299-4243-A9FE-75910B69E8F4\" associationDirection=\"None\" sourceRef=\"sid-F0DA46E1-7E86-4236-9D49-290DD7B87C61\" targetRef=\"sid-86AEF0B1-9EB6-45FD-B9A3-DAE6F5ED71A4\" />\n    <association id=\"sid-1F6B2785-A15E-4C82-87C4-9708BDD521B6\" associationDirection=\"None\" sourceRef=\"sid-BEC67F12-04E9-4AE2-B59E-FEB109CD3DF8\" targetRef=\"sid-26C1D0AA-CDB7-43FC-A36A-DF0658A215B1\" />\n  </process>\n  <process id=\"sid-F0778AC8-E593-4FF9-8CCE-C71768DF3E0D\" name=\"Bewerbungsprüfung - &#10;Sachbearbeiter Personal\" processType=\"None\" isClosed=\"false\" isExecutable=\"false\">\n    <extensionElements />\n    <laneSet id=\"sid-1a44f038-f892-46b6-aa40-0870f1b61368\">\n      <lane id=\"sid-0F208AE2-EC60-4823-9B6A-D062A91587F2\">\n        <flowNodeRef>sid-F5C79AC7-BB82-4CEC-A1E0-DB441A30CE08</flowNodeRef>\n        <flowNodeRef>sid-FB3673BF-5359-4ACE-B2A2-1C546E2D95C0</flowNodeRef>\n        <flowNodeRef>sid-2416E79A-ED80-4834-B7A9-A2F6F1B1F5D8</flowNodeRef>\n        <flowNodeRef>sid-DDA78FB8-B5BB-490F-8AB6-144A28AB646B</flowNodeRef>\n        <flowNodeRef>sid-8ED06068-AA04-428D-860D-8CA2A0483C2A</flowNodeRef>\n        <flowNodeRef>sid-AD5109AB-9014-4810-AB7B-3A4990FB44D1</flowNodeRef>\n        <flowNodeRef>sid-6B8D60D6-2BC0-4969-A16A-ABCD8586DEAD</flowNodeRef>\n        <flowNodeRef>sid-BA5E7744-B79B-47D2-8D85-7D38B00D52CF</flowNodeRef>\n        <flowNodeRef>sid-23B471A9-0A76-483C-AD0B-65092D0477BF</flowNodeRef>\n      </lane>\n    </laneSet>\n    <dataStoreReference id=\"sid-8006DF6D-4AC4-4BD4-8BE5-95CA3CCC182D\" name=\"HR-Tool\" dataStoreRef=\"sid-1f3b3b35-28a1-4fff-8835-ae271ef486d5\" />\n    <startEvent id=\"sid-F5C79AC7-BB82-4CEC-A1E0-DB441A30CE08\" name=\"Bewerbungs-&#10;prüfung  &#10;gewünscht\">\n      <outgoing>sid-CD80152E-8A60-4DF8-87F7-23BD0CDA3C58</outgoing>\n    </startEvent>\n    <task id=\"sid-FB3673BF-5359-4ACE-B2A2-1C546E2D95C0\" name=\"Bewerbungen filtern\">\n      <incoming>sid-CD80152E-8A60-4DF8-87F7-23BD0CDA3C58</incoming>\n      <outgoing>sid-FDB13333-B493-4477-9DE4-C7E4C522F495</outgoing>\n      <property id=\"Property_0rxasu3\" name=\"__targetRef_placeholder\" />\n      <dataInputAssociation id=\"sid-D760E3B4-E755-4719-B905-F62FFF056D7B\">\n        <sourceRef>sid-8006DF6D-4AC4-4BD4-8BE5-95CA3CCC182D</sourceRef>\n        <targetRef>Property_0rxasu3</targetRef>\n      </dataInputAssociation>\n    </task>\n    <task id=\"sid-2416E79A-ED80-4834-B7A9-A2F6F1B1F5D8\" name=\"Bewerbung sichten\">\n      <incoming>sid-1B290110-0336-46CF-92EC-C45D43FA9307</incoming>\n      <outgoing>sid-3E4A80E2-14C5-4002-BFE9-15F53566593B</outgoing>\n      <multiInstanceLoopCharacteristics id=\"sid-997ad086-4bf6-4389-a797-6c564d14afb7\" />\n    </task>\n    <exclusiveGateway id=\"sid-DDA78FB8-B5BB-490F-8AB6-144A28AB646B\" name=\"Bewerber&#10;einladen?\" gatewayDirection=\"Diverging\">\n      <incoming>sid-3E4A80E2-14C5-4002-BFE9-15F53566593B</incoming>\n      <outgoing>sid-908C781B-BB04-488F-BA6F-07FCF03BDD32</outgoing>\n      <outgoing>sid-E5370FBF-0192-43B6-8288-43F5D7BE5854</outgoing>\n    </exclusiveGateway>\n    <task id=\"sid-8ED06068-AA04-428D-860D-8CA2A0483C2A\" name=\"Wunsch nach Bewerbungsgespräch addressieren\">\n      <incoming>sid-908C781B-BB04-488F-BA6F-07FCF03BDD32</incoming>\n      <outgoing>sid-50B9F1DF-70D3-48DF-A96D-482225E11A7D</outgoing>\n    </task>\n    <endEvent id=\"sid-AD5109AB-9014-4810-AB7B-3A4990FB44D1\" name=\"Bewerber &#10;eingeladen\">\n      <incoming>sid-50B9F1DF-70D3-48DF-A96D-482225E11A7D</incoming>\n    </endEvent>\n    <endEvent id=\"sid-6B8D60D6-2BC0-4969-A16A-ABCD8586DEAD\" name=\"Bewerbungen &#10;geprüft\">\n      <incoming>sid-E5370FBF-0192-43B6-8288-43F5D7BE5854</incoming>\n    </endEvent>\n    <exclusiveGateway id=\"sid-BA5E7744-B79B-47D2-8D85-7D38B00D52CF\" name=\"Bewerbungen&#10;vorhanden?\" gatewayDirection=\"Diverging\">\n      <incoming>sid-FDB13333-B493-4477-9DE4-C7E4C522F495</incoming>\n      <outgoing>sid-1B290110-0336-46CF-92EC-C45D43FA9307</outgoing>\n      <outgoing>sid-1E8A77DE-E3F1-4DFA-B20C-9EEBF0735E05</outgoing>\n    </exclusiveGateway>\n    <endEvent id=\"sid-23B471A9-0A76-483C-AD0B-65092D0477BF\" name=\"keine &#10;Bewerbungen&#10;vorhanden\">\n      <incoming>sid-1E8A77DE-E3F1-4DFA-B20C-9EEBF0735E05</incoming>\n    </endEvent>\n    <sequenceFlow id=\"sid-1E8A77DE-E3F1-4DFA-B20C-9EEBF0735E05\" name=\"nein\" sourceRef=\"sid-BA5E7744-B79B-47D2-8D85-7D38B00D52CF\" targetRef=\"sid-23B471A9-0A76-483C-AD0B-65092D0477BF\" />\n    <sequenceFlow id=\"sid-1B290110-0336-46CF-92EC-C45D43FA9307\" name=\"ja\" sourceRef=\"sid-BA5E7744-B79B-47D2-8D85-7D38B00D52CF\" targetRef=\"sid-2416E79A-ED80-4834-B7A9-A2F6F1B1F5D8\" />\n    <sequenceFlow id=\"sid-E5370FBF-0192-43B6-8288-43F5D7BE5854\" name=\"nein\" sourceRef=\"sid-DDA78FB8-B5BB-490F-8AB6-144A28AB646B\" targetRef=\"sid-6B8D60D6-2BC0-4969-A16A-ABCD8586DEAD\" />\n    <sequenceFlow id=\"sid-908C781B-BB04-488F-BA6F-07FCF03BDD32\" name=\"ja\" sourceRef=\"sid-DDA78FB8-B5BB-490F-8AB6-144A28AB646B\" targetRef=\"sid-8ED06068-AA04-428D-860D-8CA2A0483C2A\" />\n    <sequenceFlow id=\"sid-50B9F1DF-70D3-48DF-A96D-482225E11A7D\" sourceRef=\"sid-8ED06068-AA04-428D-860D-8CA2A0483C2A\" targetRef=\"sid-AD5109AB-9014-4810-AB7B-3A4990FB44D1\" />\n    <sequenceFlow id=\"sid-3E4A80E2-14C5-4002-BFE9-15F53566593B\" sourceRef=\"sid-2416E79A-ED80-4834-B7A9-A2F6F1B1F5D8\" targetRef=\"sid-DDA78FB8-B5BB-490F-8AB6-144A28AB646B\" />\n    <sequenceFlow id=\"sid-FDB13333-B493-4477-9DE4-C7E4C522F495\" sourceRef=\"sid-FB3673BF-5359-4ACE-B2A2-1C546E2D95C0\" targetRef=\"sid-BA5E7744-B79B-47D2-8D85-7D38B00D52CF\" />\n    <sequenceFlow id=\"sid-CD80152E-8A60-4DF8-87F7-23BD0CDA3C58\" sourceRef=\"sid-F5C79AC7-BB82-4CEC-A1E0-DB441A30CE08\" targetRef=\"sid-FB3673BF-5359-4ACE-B2A2-1C546E2D95C0\" />\n  </process>\n  <process id=\"sid-83C27632-EEB8-4D1E-8F8B-BFCBBD2B88E8\" name=\"Bewerbungsprüfung - &#10;Führungskraft Fachbereich\" processType=\"None\" isClosed=\"false\" isExecutable=\"false\">\n    <extensionElements />\n    <laneSet id=\"sid-506214d8-8005-40b8-949a-86b85e7605ca\">\n      <lane id=\"sid-B8B18E3A-EF8D-4D19-B5CD-C666D39E2E0D\">\n        <flowNodeRef>sid-991275D8-E60A-440A-B2DD-094D2B0049A4</flowNodeRef>\n        <flowNodeRef>sid-19BF350B-2D34-4049-B17C-AE0265F407CB</flowNodeRef>\n        <flowNodeRef>sid-D56D4E10-864F-4B2B-898E-AA9641C98E63</flowNodeRef>\n        <flowNodeRef>sid-0C2D523B-E4EB-4776-AFA3-43B156AAE378</flowNodeRef>\n      </lane>\n    </laneSet>\n    <startEvent id=\"sid-991275D8-E60A-440A-B2DD-094D2B0049A4\" name=\"Liste aller&#10;Bewerber &#10;übergeben\">\n      <outgoing>sid-2D215BCD-C98A-4B3A-B255-EDCE32FF2A97</outgoing>\n      <messageEventDefinition id=\"sid-ce5eed97-3a08-4f4a-be3c-7c1bae8d52b5\" />\n    </startEvent>\n    <task id=\"sid-19BF350B-2D34-4049-B17C-AE0265F407CB\" name=\"Bewerbung prüfen\">\n      <incoming>sid-2D215BCD-C98A-4B3A-B255-EDCE32FF2A97</incoming>\n      <outgoing>sid-0B7D8255-893E-404A-B0EF-CCB418B98B58</outgoing>\n      <multiInstanceLoopCharacteristics id=\"sid-0d3db5bd-a483-425f-9276-a7a38102ec45\" />\n    </task>\n    <task id=\"sid-D56D4E10-864F-4B2B-898E-AA9641C98E63\" name=\"Potentielle Kandidaten markieren\">\n      <incoming>sid-0B7D8255-893E-404A-B0EF-CCB418B98B58</incoming>\n      <outgoing>sid-73C9EBCD-9625-4469-B4AD-87B829C4BD8B</outgoing>\n    </task>\n    <endEvent id=\"sid-0C2D523B-E4EB-4776-AFA3-43B156AAE378\" name=\"Bewerber &#10;geprüft\">\n      <incoming>sid-73C9EBCD-9625-4469-B4AD-87B829C4BD8B</incoming>\n      <messageEventDefinition id=\"sid-e9b6617d-341e-4635-9fc5-97e9db07631c\" />\n    </endEvent>\n    <sequenceFlow id=\"sid-73C9EBCD-9625-4469-B4AD-87B829C4BD8B\" sourceRef=\"sid-D56D4E10-864F-4B2B-898E-AA9641C98E63\" targetRef=\"sid-0C2D523B-E4EB-4776-AFA3-43B156AAE378\" />\n    <sequenceFlow id=\"sid-0B7D8255-893E-404A-B0EF-CCB418B98B58\" sourceRef=\"sid-19BF350B-2D34-4049-B17C-AE0265F407CB\" targetRef=\"sid-D56D4E10-864F-4B2B-898E-AA9641C98E63\" />\n    <sequenceFlow id=\"sid-2D215BCD-C98A-4B3A-B255-EDCE32FF2A97\" sourceRef=\"sid-991275D8-E60A-440A-B2DD-094D2B0049A4\" targetRef=\"sid-19BF350B-2D34-4049-B17C-AE0265F407CB\" />\n  </process>\n  <process id=\"sid-05D31FB1-4A4B-4D41-8E51-BE08330D6013\" name=\"Bewerbungsprüfung - &#10;Führungskraft Fachbereich\" processType=\"None\" isClosed=\"false\" isExecutable=\"false\">\n    <extensionElements />\n    <laneSet id=\"sid-695d1920-1bc1-42dd-948a-41dbd5fea84f\">\n      <lane id=\"sid-B22F345F-EAB4-4D92-A810-C4B9AFCC4A6F\">\n        <flowNodeRef>sid-699FBA56-8A57-43AC-ACC4-090A9B4AB26A</flowNodeRef>\n        <flowNodeRef>sid-1FFCF5B7-A6EE-4D63-AC49-5CD21F277383</flowNodeRef>\n        <flowNodeRef>sid-CC14630C-7FFB-4CD2-954A-1D52340F34B4</flowNodeRef>\n        <flowNodeRef>sid-8BC4F3B3-CA44-48C2-B3FA-137EAEC7D012</flowNodeRef>\n        <flowNodeRef>sid-F197542D-D274-45BE-95A5-7A3608BBE27A</flowNodeRef>\n        <flowNodeRef>sid-3820CBDB-C1E3-47EA-BCE1-10C9DBAEDB37</flowNodeRef>\n        <flowNodeRef>sid-308728F0-D1C5-4383-AA70-41249841A930</flowNodeRef>\n        <flowNodeRef>sid-4FA5730A-F51C-4CEE-98F0-631553512966</flowNodeRef>\n        <flowNodeRef>sid-7F1356BF-93F9-41C2-937C-E943B8818EB3</flowNodeRef>\n      </lane>\n    </laneSet>\n    <startEvent id=\"sid-699FBA56-8A57-43AC-ACC4-090A9B4AB26A\" name=\"Bewerbungs-&#10;prüfung  &#10;gewünscht\">\n      <outgoing>sid-47EBB822-715D-4193-8711-59063E3E4F48</outgoing>\n    </startEvent>\n    <task id=\"sid-1FFCF5B7-A6EE-4D63-AC49-5CD21F277383\" name=\"Bewerbungen filtern\">\n      <incoming>sid-47EBB822-715D-4193-8711-59063E3E4F48</incoming>\n      <outgoing>sid-B4BDF60C-F40F-4247-B52F-0EA0038A9039</outgoing>\n      <property id=\"Property_15vitdv\" name=\"__targetRef_placeholder\" />\n      <dataInputAssociation id=\"sid-616032F1-DE57-4D70-B0F8-7BD6F4879437\">\n        <sourceRef>sid-8006DF6D-4AC4-4BD4-8BE5-95CA3CCC182D</sourceRef>\n        <targetRef>Property_15vitdv</targetRef>\n      </dataInputAssociation>\n    </task>\n    <task id=\"sid-CC14630C-7FFB-4CD2-954A-1D52340F34B4\" name=\"Bewerbung sichten\">\n      <incoming>sid-EF5AD02F-469C-45DB-AABA-29D5CDD54B58</incoming>\n      <outgoing>sid-5C3AB4AB-5292-4EC3-9A0F-BAD26D56DBD4</outgoing>\n      <multiInstanceLoopCharacteristics id=\"sid-1c722277-cc84-4f53-9009-9631016dffde\" />\n    </task>\n    <exclusiveGateway id=\"sid-8BC4F3B3-CA44-48C2-B3FA-137EAEC7D012\" name=\"Bewerber&#10;einladen?\" gatewayDirection=\"Diverging\">\n      <incoming>sid-5C3AB4AB-5292-4EC3-9A0F-BAD26D56DBD4</incoming>\n      <outgoing>sid-5C2E761C-74FF-405C-8F6E-416329D714BC</outgoing>\n      <outgoing>sid-E725BF0F-5B88-4D38-AE6A-7ABDA67CA7C7</outgoing>\n    </exclusiveGateway>\n    <task id=\"sid-F197542D-D274-45BE-95A5-7A3608BBE27A\" name=\"Wunsch nach Bewerbungsgespräch addressieren\">\n      <incoming>sid-E725BF0F-5B88-4D38-AE6A-7ABDA67CA7C7</incoming>\n      <outgoing>sid-5529AAF3-EC3E-409F-A020-8D0330A547E3</outgoing>\n    </task>\n    <endEvent id=\"sid-3820CBDB-C1E3-47EA-BCE1-10C9DBAEDB37\" name=\"Bewerber &#10;eingeladen\">\n      <incoming>sid-5529AAF3-EC3E-409F-A020-8D0330A547E3</incoming>\n    </endEvent>\n    <endEvent id=\"sid-308728F0-D1C5-4383-AA70-41249841A930\" name=\"Bewerbungen &#10;geprüft\">\n      <incoming>sid-5C2E761C-74FF-405C-8F6E-416329D714BC</incoming>\n    </endEvent>\n    <exclusiveGateway id=\"sid-4FA5730A-F51C-4CEE-98F0-631553512966\" name=\"Bewerbungen&#10;vorhanden?\" gatewayDirection=\"Diverging\">\n      <incoming>sid-B4BDF60C-F40F-4247-B52F-0EA0038A9039</incoming>\n      <outgoing>sid-F11A1E78-0DE1-46E5-9074-F665ED1985BE</outgoing>\n      <outgoing>sid-EF5AD02F-469C-45DB-AABA-29D5CDD54B58</outgoing>\n    </exclusiveGateway>\n    <endEvent id=\"sid-7F1356BF-93F9-41C2-937C-E943B8818EB3\" name=\"keine &#10;Bewerbungen&#10;vorhanden\">\n      <incoming>sid-F11A1E78-0DE1-46E5-9074-F665ED1985BE</incoming>\n    </endEvent>\n    <sequenceFlow id=\"sid-EF5AD02F-469C-45DB-AABA-29D5CDD54B58\" name=\"ja\" sourceRef=\"sid-4FA5730A-F51C-4CEE-98F0-631553512966\" targetRef=\"sid-CC14630C-7FFB-4CD2-954A-1D52340F34B4\" />\n    <sequenceFlow id=\"sid-F11A1E78-0DE1-46E5-9074-F665ED1985BE\" name=\"nein\" sourceRef=\"sid-4FA5730A-F51C-4CEE-98F0-631553512966\" targetRef=\"sid-7F1356BF-93F9-41C2-937C-E943B8818EB3\" />\n    <sequenceFlow id=\"sid-E725BF0F-5B88-4D38-AE6A-7ABDA67CA7C7\" name=\"ja\" sourceRef=\"sid-8BC4F3B3-CA44-48C2-B3FA-137EAEC7D012\" targetRef=\"sid-F197542D-D274-45BE-95A5-7A3608BBE27A\" />\n    <sequenceFlow id=\"sid-5C2E761C-74FF-405C-8F6E-416329D714BC\" name=\"nein\" sourceRef=\"sid-8BC4F3B3-CA44-48C2-B3FA-137EAEC7D012\" targetRef=\"sid-308728F0-D1C5-4383-AA70-41249841A930\" />\n    <sequenceFlow id=\"sid-5529AAF3-EC3E-409F-A020-8D0330A547E3\" sourceRef=\"sid-F197542D-D274-45BE-95A5-7A3608BBE27A\" targetRef=\"sid-3820CBDB-C1E3-47EA-BCE1-10C9DBAEDB37\" />\n    <sequenceFlow id=\"sid-5C3AB4AB-5292-4EC3-9A0F-BAD26D56DBD4\" sourceRef=\"sid-CC14630C-7FFB-4CD2-954A-1D52340F34B4\" targetRef=\"sid-8BC4F3B3-CA44-48C2-B3FA-137EAEC7D012\" />\n    <sequenceFlow id=\"sid-B4BDF60C-F40F-4247-B52F-0EA0038A9039\" sourceRef=\"sid-1FFCF5B7-A6EE-4D63-AC49-5CD21F277383\" targetRef=\"sid-4FA5730A-F51C-4CEE-98F0-631553512966\" />\n    <sequenceFlow id=\"sid-47EBB822-715D-4193-8711-59063E3E4F48\" sourceRef=\"sid-699FBA56-8A57-43AC-ACC4-090A9B4AB26A\" targetRef=\"sid-1FFCF5B7-A6EE-4D63-AC49-5CD21F277383\" />\n  </process>\n  <process id=\"sid-D042A222-1E2E-4AE5-A062-1CB78A7CD324\" name=\"Bewerber-Beurteilung - &#10;Führungskraft Fachbereich\" processType=\"None\" isClosed=\"false\" isExecutable=\"false\">\n    <extensionElements />\n    <laneSet id=\"sid-a1b72736-7f4b-4083-a9fb-440ea585667d\">\n      <lane id=\"sid-994BB7B0-64D8-4DC4-B549-0758628F5A16\">\n        <flowNodeRef>sid-B7711D66-52EB-4437-AA0C-5671CE83C6E6</flowNodeRef>\n        <flowNodeRef>sid-066B769F-EAEB-42E5-ACAB-341240A5F87D</flowNodeRef>\n        <flowNodeRef>sid-4F2CDAD6-92D6-470B-B82C-8D07E050591A</flowNodeRef>\n        <flowNodeRef>sid-943A343F-C038-49B9-8640-7BDABFB8E1BF</flowNodeRef>\n      </lane>\n    </laneSet>\n    <startEvent id=\"sid-B7711D66-52EB-4437-AA0C-5671CE83C6E6\" name=\"Bewerber-&#10;Bewertung &#10;angefordert\">\n      <outgoing>sid-F88DDF30-3F4D-4FA6-AA82-3B10300FFE98</outgoing>\n      <messageEventDefinition id=\"sid-6f972804-dc5c-4ff6-bce5-b54f303d2184\" />\n    </startEvent>\n    <task id=\"sid-066B769F-EAEB-42E5-ACAB-341240A5F87D\" name=\"Bewerber beurteilen\">\n      <incoming>sid-F88DDF30-3F4D-4FA6-AA82-3B10300FFE98</incoming>\n      <outgoing>sid-4E1F9DDA-0BDF-4BB0-90F5-E7A85C259444</outgoing>\n    </task>\n    <task id=\"sid-4F2CDAD6-92D6-470B-B82C-8D07E050591A\" name=\"Beurteilung zurücksenden\">\n      <incoming>sid-4E1F9DDA-0BDF-4BB0-90F5-E7A85C259444</incoming>\n      <outgoing>sid-6E0CD175-BAC0-4104-8555-C2473AD6956B</outgoing>\n    </task>\n    <endEvent id=\"sid-943A343F-C038-49B9-8640-7BDABFB8E1BF\" name=\"Bewerber &#10;beurteilt\">\n      <incoming>sid-6E0CD175-BAC0-4104-8555-C2473AD6956B</incoming>\n    </endEvent>\n    <sequenceFlow id=\"sid-6E0CD175-BAC0-4104-8555-C2473AD6956B\" sourceRef=\"sid-4F2CDAD6-92D6-470B-B82C-8D07E050591A\" targetRef=\"sid-943A343F-C038-49B9-8640-7BDABFB8E1BF\" />\n    <sequenceFlow id=\"sid-4E1F9DDA-0BDF-4BB0-90F5-E7A85C259444\" sourceRef=\"sid-066B769F-EAEB-42E5-ACAB-341240A5F87D\" targetRef=\"sid-4F2CDAD6-92D6-470B-B82C-8D07E050591A\" />\n    <sequenceFlow id=\"sid-F88DDF30-3F4D-4FA6-AA82-3B10300FFE98\" sourceRef=\"sid-B7711D66-52EB-4437-AA0C-5671CE83C6E6\" targetRef=\"sid-066B769F-EAEB-42E5-ACAB-341240A5F87D\" />\n  </process>\n  <process id=\"sid-D0B76975-2A71-4345-9861-401E7CB66AF6\" name=\"Durchführung Bewerbungsgespräch - &#10;Sachbearbeiter Personal\" processType=\"None\" isClosed=\"false\" isExecutable=\"false\">\n    <extensionElements />\n    <laneSet id=\"sid-e4f90877-6c3c-47d0-8114-07aef80491f2\">\n      <lane id=\"sid-13E4B11F-E8D5-434E-9AE3-A42ED2084731\">\n        <flowNodeRef>sid-155B51B2-12E4-4A0B-AFDF-DDBA2EE093D5</flowNodeRef>\n        <flowNodeRef>sid-3B833F36-ABCE-49A9-B268-445BAC9F758D</flowNodeRef>\n        <flowNodeRef>sid-A56AC510-264D-4291-B1CE-A035C2037437</flowNodeRef>\n        <flowNodeRef>sid-9A0A93AB-0A05-4D01-BF02-14A9C3189E84</flowNodeRef>\n        <flowNodeRef>sid-8CE3896D-0181-49CE-A1A9-C085262DA0FA</flowNodeRef>\n        <flowNodeRef>sid-42305309-4E98-47F0-80C4-690E2DB222C0</flowNodeRef>\n        <flowNodeRef>sid-4C1265A5-A535-48FB-99E9-68E0EC37C624</flowNodeRef>\n        <flowNodeRef>sid-53EE6F0D-43BE-4883-B018-3BB90743DC25</flowNodeRef>\n        <flowNodeRef>sid-91FF7684-71E6-497E-9938-0C9469B597EA</flowNodeRef>\n        <flowNodeRef>sid-286F337E-9361-4B4D-AF78-7E403CA80DA1</flowNodeRef>\n        <flowNodeRef>sid-DC5EFA1A-9841-4010-A16B-D771AA2B57C3</flowNodeRef>\n        <flowNodeRef>sid-8700D448-747C-4559-9A57-BFE8AAD639D4</flowNodeRef>\n        <flowNodeRef>sid-DB5144E8-CEDC-4333-BE75-A63907FDC5F0</flowNodeRef>\n      </lane>\n    </laneSet>\n    <task id=\"sid-155B51B2-12E4-4A0B-AFDF-DDBA2EE093D5\" name=\"Bewerbungs-gespräch &#10;führen\">\n      <incoming>sid-3906E383-5898-47F6-84FE-CBA12360BCF9</incoming>\n      <outgoing>sid-11A2840A-596D-4937-BB37-0D5952E03535</outgoing>\n    </task>\n    <dataObjectReference id=\"sid-DF651323-2973-4344-A5E5-4FFF3FDCD702\" name=\"Führungskraft&#10;Fachbereich\" />\n    <startEvent id=\"sid-3B833F36-ABCE-49A9-B268-445BAC9F758D\" name=\"Gesprächs-&#10;termin&#10;erreicht\">\n      <outgoing>sid-3906E383-5898-47F6-84FE-CBA12360BCF9</outgoing>\n      <conditionalEventDefinition id=\"sid-3334a259-921f-4caa-bf4e-fc23785e7a21\">\n        <condition>FOO</condition>\n      </conditionalEventDefinition>\n    </startEvent>\n    <task id=\"sid-A56AC510-264D-4291-B1CE-A035C2037437\" name=\"Bewerber beurteilen\">\n      <incoming>sid-D3213E0A-906E-4276-8DAF-208E4F416D51</incoming>\n      <outgoing>sid-CBB13D0A-5D67-4908-9D56-4E1A1E2D0E71</outgoing>\n    </task>\n    <parallelGateway id=\"sid-9A0A93AB-0A05-4D01-BF02-14A9C3189E84\" gatewayDirection=\"Diverging\">\n      <incoming>sid-11A2840A-596D-4937-BB37-0D5952E03535</incoming>\n      <outgoing>sid-D3213E0A-906E-4276-8DAF-208E4F416D51</outgoing>\n      <outgoing>sid-8E8DC42E-9AD4-4D6F-AEFC-C6FE6E91B6D3</outgoing>\n    </parallelGateway>\n    <task id=\"sid-8CE3896D-0181-49CE-A1A9-C085262DA0FA\" name=\"Beurteilung anfordern\">\n      <incoming>sid-8E8DC42E-9AD4-4D6F-AEFC-C6FE6E91B6D3</incoming>\n      <outgoing>sid-D3E0C8B2-1DEC-4283-9FB3-977DB4382650</outgoing>\n    </task>\n    <intermediateCatchEvent id=\"sid-42305309-4E98-47F0-80C4-690E2DB222C0\" name=\"Beurteilung &#10;erhalten\">\n      <incoming>sid-D3E0C8B2-1DEC-4283-9FB3-977DB4382650</incoming>\n      <outgoing>sid-1CA535D5-1E51-41B7-A555-3E8BB651FE97</outgoing>\n      <messageEventDefinition id=\"sid-7ef64170-097f-4830-b73c-f9f72fcadf0c\" />\n    </intermediateCatchEvent>\n    <parallelGateway id=\"sid-4C1265A5-A535-48FB-99E9-68E0EC37C624\" gatewayDirection=\"Converging\">\n      <incoming>sid-CBB13D0A-5D67-4908-9D56-4E1A1E2D0E71</incoming>\n      <incoming>sid-1CA535D5-1E51-41B7-A555-3E8BB651FE97</incoming>\n      <outgoing>sid-47FE04AD-8529-45E5-87E6-F7992404494A</outgoing>\n    </parallelGateway>\n    <task id=\"sid-53EE6F0D-43BE-4883-B018-3BB90743DC25\" name=\"Beurteilungen auswerten\">\n      <incoming>sid-47FE04AD-8529-45E5-87E6-F7992404494A</incoming>\n      <outgoing>sid-778CB5F7-7B50-4086-AEAF-A84CA5D34A8F</outgoing>\n    </task>\n    <exclusiveGateway id=\"sid-91FF7684-71E6-497E-9938-0C9469B597EA\" name=\"Kandidat &#10;für Stelle &#10;geeignet?\" gatewayDirection=\"Diverging\">\n      <incoming>sid-778CB5F7-7B50-4086-AEAF-A84CA5D34A8F</incoming>\n      <outgoing>sid-CB506E96-0C3C-4B65-9290-18EA192E62FE</outgoing>\n      <outgoing>sid-67782ED7-78C0-47F3-9EAC-46F9F194D843</outgoing>\n    </exclusiveGateway>\n    <task id=\"sid-286F337E-9361-4B4D-AF78-7E403CA80DA1\" name=\"Bewerbungs-&#10;daten aktualisieren\">\n      <incoming>sid-CB506E96-0C3C-4B65-9290-18EA192E62FE</incoming>\n      <outgoing>sid-7363B1EE-93CD-49D4-966B-8F1368A01010</outgoing>\n    </task>\n    <endEvent id=\"sid-DC5EFA1A-9841-4010-A16B-D771AA2B57C3\" name=\"Bewerbungs-&#10;gespräch &#10;durchgeführt &#10;(keine Besetzung)\">\n      <incoming>sid-7363B1EE-93CD-49D4-966B-8F1368A01010</incoming>\n    </endEvent>\n    <task id=\"sid-8700D448-747C-4559-9A57-BFE8AAD639D4\" name=\"Arbeits-&#10;vertrag anfordern\">\n      <incoming>sid-67782ED7-78C0-47F3-9EAC-46F9F194D843</incoming>\n      <outgoing>sid-ADF333C6-9197-4556-A2C4-19BBC7122609</outgoing>\n    </task>\n    <endEvent id=\"sid-DB5144E8-CEDC-4333-BE75-A63907FDC5F0\" name=\"Bewerbungs-&#10;gespräch &#10;durchgeführt &#10;(Besetzung erfolgt)\">\n      <incoming>sid-ADF333C6-9197-4556-A2C4-19BBC7122609</incoming>\n    </endEvent>\n    <sequenceFlow id=\"sid-67782ED7-78C0-47F3-9EAC-46F9F194D843\" name=\"ja\" sourceRef=\"sid-91FF7684-71E6-497E-9938-0C9469B597EA\" targetRef=\"sid-8700D448-747C-4559-9A57-BFE8AAD639D4\" />\n    <sequenceFlow id=\"sid-ADF333C6-9197-4556-A2C4-19BBC7122609\" sourceRef=\"sid-8700D448-747C-4559-9A57-BFE8AAD639D4\" targetRef=\"sid-DB5144E8-CEDC-4333-BE75-A63907FDC5F0\" />\n    <sequenceFlow id=\"sid-7363B1EE-93CD-49D4-966B-8F1368A01010\" sourceRef=\"sid-286F337E-9361-4B4D-AF78-7E403CA80DA1\" targetRef=\"sid-DC5EFA1A-9841-4010-A16B-D771AA2B57C3\" />\n    <sequenceFlow id=\"sid-11A2840A-596D-4937-BB37-0D5952E03535\" sourceRef=\"sid-155B51B2-12E4-4A0B-AFDF-DDBA2EE093D5\" targetRef=\"sid-9A0A93AB-0A05-4D01-BF02-14A9C3189E84\" />\n    <sequenceFlow id=\"sid-3906E383-5898-47F6-84FE-CBA12360BCF9\" sourceRef=\"sid-3B833F36-ABCE-49A9-B268-445BAC9F758D\" targetRef=\"sid-155B51B2-12E4-4A0B-AFDF-DDBA2EE093D5\" />\n    <sequenceFlow id=\"sid-778CB5F7-7B50-4086-AEAF-A84CA5D34A8F\" sourceRef=\"sid-53EE6F0D-43BE-4883-B018-3BB90743DC25\" targetRef=\"sid-91FF7684-71E6-497E-9938-0C9469B597EA\" />\n    <sequenceFlow id=\"sid-47FE04AD-8529-45E5-87E6-F7992404494A\" sourceRef=\"sid-4C1265A5-A535-48FB-99E9-68E0EC37C624\" targetRef=\"sid-53EE6F0D-43BE-4883-B018-3BB90743DC25\" />\n    <sequenceFlow id=\"sid-1CA535D5-1E51-41B7-A555-3E8BB651FE97\" sourceRef=\"sid-42305309-4E98-47F0-80C4-690E2DB222C0\" targetRef=\"sid-4C1265A5-A535-48FB-99E9-68E0EC37C624\" />\n    <sequenceFlow id=\"sid-D3E0C8B2-1DEC-4283-9FB3-977DB4382650\" sourceRef=\"sid-8CE3896D-0181-49CE-A1A9-C085262DA0FA\" targetRef=\"sid-42305309-4E98-47F0-80C4-690E2DB222C0\" />\n    <sequenceFlow id=\"sid-8E8DC42E-9AD4-4D6F-AEFC-C6FE6E91B6D3\" sourceRef=\"sid-9A0A93AB-0A05-4D01-BF02-14A9C3189E84\" targetRef=\"sid-8CE3896D-0181-49CE-A1A9-C085262DA0FA\" />\n    <sequenceFlow id=\"sid-CB506E96-0C3C-4B65-9290-18EA192E62FE\" name=\"nein\" sourceRef=\"sid-91FF7684-71E6-497E-9938-0C9469B597EA\" targetRef=\"sid-286F337E-9361-4B4D-AF78-7E403CA80DA1\" />\n    <sequenceFlow id=\"sid-CBB13D0A-5D67-4908-9D56-4E1A1E2D0E71\" sourceRef=\"sid-A56AC510-264D-4291-B1CE-A035C2037437\" targetRef=\"sid-4C1265A5-A535-48FB-99E9-68E0EC37C624\" />\n    <sequenceFlow id=\"sid-D3213E0A-906E-4276-8DAF-208E4F416D51\" sourceRef=\"sid-9A0A93AB-0A05-4D01-BF02-14A9C3189E84\" targetRef=\"sid-A56AC510-264D-4291-B1CE-A035C2037437\" />\n    <textAnnotation id=\"sid-9B744161-CE38-41EC-847E-D264A5BFA9CC\">\n      <text>ID7</text>\n    </textAnnotation>\n    <textAnnotation id=\"sid-A8C71BAE-B5D6-4BC1-BF48-636E34FDC5DA\">\n      <text>ID5</text>\n    </textAnnotation>\n    <textAnnotation id=\"sid-99DC1CC9-AD54-41FE-BA99-BBFCB0A1792D\">\n      <text>ID6</text>\n    </textAnnotation>\n    <textAnnotation id=\"sid-9CB103FC-4135-44AE-B4F6-3C1116CCC0FD\">\n      <text>ID1: Was passiert wenn sich kein Bewerber gemeldet hat? --&gt; Anpassen der Stellenausschreibung, löschen dieser? \nID2: Die Bewerbung soll auch archiviert werden, jedoch mit Status \"bei Eingang abgelehnt\"\nID3: Die Informationen wann welcher Bewerber eingeladen wurde, soll bitte im Tool erfasst werden.\nID4: Müssen hier die Bewerbungs-unterlagen zurückgesendet werden?\nID5: Müssen hier die Bewerbungsunterlagen zurückgesendet werden?\nID6: kann der Bewerber auch \"geparkt\" werden, wenn weitere Gespräche folgen? wenn ja, wie soll das geschehen?\nID7: Was passiert wenn der Teilnehmer nicht erscheint?\nID8: Müssen hier die Bewerbungsunterlagen zurückgesendet werden?\nID9: Wie laufen jetzt alle anderen Bewerbungsgespräche? Werden die neu gestartet? \nID10: Muss jetzt die Stelle offline genommen werden?\nID11: Wie funktioniert das genau? Prozesskopplung zu Management Bewerbungsgespräche?\nID12: Soll IT-unterstützt laufen, gemäß vordefiniertem Template\nID13: Vorgabe wie das Filtern von statten gehen soll?! --&gt; Business Rules</text>\n    </textAnnotation>\n    <textAnnotation id=\"sid-9FBF1EA9-75EA-44B0-8B16-9F82808B0566\">\n      <text>Annahmen:\n- alle Bewerbungen gehen über Personal ein.\n- unvollständige Bewerbungen werden nicht verfolgt bzw. nach einer Frist verworfen\n- Es wurden nur Bewerber eingeladen, da aus Personalsicht inhaltlich geprüft sind. (z.B. müssen die Bewerbungen vollständig sein!)</text>\n    </textAnnotation>\n    <textAnnotation id=\"sid-CC64D413-A2EA-438C-B0FE-27F814C0C97B\">\n      <text>Fehlt noch:\n- Teilnehmer kann rückmelden, dass er Bewerbung zurückzieht\n- Teilnehmer kann rückmelden, dass er Bewerbungsgespräch nicht wahrnehmen kann (komplette Absage oder neuen Termin vereinbaren)\n- Verwendung von Daten ist nicht konsistent im Modell eingezeichnet\n- Klärung der offenen ToDos direkt im Diagramm</text>\n    </textAnnotation>\n    <association id=\"sid-E9D52506-E99F-412F-803B-0A7BB95CFA2D\" associationDirection=\"None\" sourceRef=\"sid-3B833F36-ABCE-49A9-B268-445BAC9F758D\" targetRef=\"sid-9B744161-CE38-41EC-847E-D264A5BFA9CC\" />\n    <association id=\"sid-48E58EB6-ECEE-44B0-8AE3-DD8590112929\" associationDirection=\"None\" sourceRef=\"sid-53EE6F0D-43BE-4883-B018-3BB90743DC25\" targetRef=\"sid-99DC1CC9-AD54-41FE-BA99-BBFCB0A1792D\" />\n    <association id=\"sid-94C02BC5-3BDF-458B-AB2C-1B7880E74C90\" associationDirection=\"None\" sourceRef=\"sid-286F337E-9361-4B4D-AF78-7E403CA80DA1\" targetRef=\"sid-A8C71BAE-B5D6-4BC1-BF48-636E34FDC5DA\" />\n  </process>\n  <process id=\"sid-35DD95AD-CA27-4826-8E4F-351207D0FA1A\" name=\"Management Bewerbungsgespräche -&#10; Sachbearbeiter Personal\" processType=\"None\" isClosed=\"false\" isExecutable=\"false\">\n    <extensionElements />\n    <laneSet id=\"sid-8f563437-4bff-4b07-8408-606ed1134465\">\n      <lane id=\"sid-4A0FB2B3-2D67-46F7-ACB3-260FC62E3B5A\">\n        <flowNodeRef>sid-36E152C5-1864-4D96-9F9B-27133FD47EFE</flowNodeRef>\n        <flowNodeRef>sid-E91A2C66-8518-4301-8912-DA783975DD45</flowNodeRef>\n        <flowNodeRef>sid-B1C30549-F180-4515-9926-F2036892B4C1</flowNodeRef>\n      </lane>\n    </laneSet>\n    <startEvent id=\"sid-36E152C5-1864-4D96-9F9B-27133FD47EFE\" name=\"Wunsch für &#10;Gespräch(e) &#10;eingegangen\">\n      <outgoing>sid-369E18F1-20E3-4E09-A8B7-1FF568E57F23</outgoing>\n      <messageEventDefinition id=\"sid-ee0afed5-08eb-4773-87f6-18e964971020\" />\n    </startEvent>\n    <subProcess id=\"sid-B1C30549-F180-4515-9926-F2036892B4C1\">\n      <incoming>sid-369E18F1-20E3-4E09-A8B7-1FF568E57F23</incoming>\n      <outgoing>sid-D654E8D0-0A05-48F1-B102-B547E61DDDB6</outgoing>\n      <multiInstanceLoopCharacteristics id=\"sid-1c732dda-dc13-4c0a-816f-41b2616140c7\" />\n      <exclusiveGateway id=\"sid-6C9E668B-0059-4AA5-B3F8-CC74FCBAE32E\" gatewayDirection=\"Converging\">\n        <incoming>sid-97D1C665-6495-46A4-BA35-8961F07A076F</incoming>\n        <incoming>sid-258E87AC-23E8-4C39-92C8-5AE7DE19992A</incoming>\n        <outgoing>sid-F52F82C6-C6C5-4E39-A2A9-7F4F780748A5</outgoing>\n      </exclusiveGateway>\n      <exclusiveGateway id=\"sid-544B758B-A75C-410C-98CA-C84E19CBC367\" gatewayDirection=\"Converging\">\n        <incoming>sid-48AAE1F8-75D9-4031-ACAD-49BD8A16E9C8</incoming>\n        <incoming>sid-373FAB4D-A45B-45EC-9F85-B1076ABBFBA6</incoming>\n        <outgoing>sid-FE1C5021-4268-4AE6-8FBD-9DF197259520</outgoing>\n      </exclusiveGateway>\n      <endEvent id=\"sid-551C13CD-F975-42AC-84F3-ABB2B458485A\" name=\"Termin &#10;verworfen\">\n        <incoming>sid-9B1BDCA4-28B7-426E-A13C-66409FAC588B</incoming>\n      </endEvent>\n      <endEvent id=\"sid-636805C2-4600-43C3-8104-E68D0663C904\" name=\"Termin &#10;abgesagt\">\n        <incoming>sid-4D49AA03-7D9E-4086-A0D9-43E7C741DCD3</incoming>\n      </endEvent>\n      <endEvent id=\"sid-10B00DA4-44D4-4CD4-910E-C8952DA258A4\" name=\"Bewerbungs-&#10;gespräche &#10;organisiert\">\n        <incoming>sid-9E3DEB10-BFD8-4D7D-80EC-F98CD2E65DA4</incoming>\n      </endEvent>\n      <task id=\"sid-BFDE4B6A-89F4-415B-8A22-7BA82C441A65\" name=\"Termine bestätigen\">\n        <incoming>sid-F52F82C6-C6C5-4E39-A2A9-7F4F780748A5</incoming>\n        <outgoing>sid-9E3DEB10-BFD8-4D7D-80EC-F98CD2E65DA4</outgoing>\n      </task>\n      <task id=\"sid-42DAA51B-78CB-4098-8C74-1862994E0ED9\" name=\"Termin &#10;absagen\">\n        <incoming>sid-9FB7EAEB-5A8B-4D90-B3A7-6B52FCBD5D22</incoming>\n        <outgoing>sid-4D49AA03-7D9E-4086-A0D9-43E7C741DCD3</outgoing>\n      </task>\n      <exclusiveGateway id=\"sid-CCCFBB8A-9E33-4C98-BA16-30AA2A9D7D4B\" name=\"Auf Termin &#10;geeinigt?\" gatewayDirection=\"Diverging\">\n        <incoming>sid-04E0977B-6883-4B93-AD20-5A2F8B496DE6</incoming>\n        <outgoing>sid-9FB7EAEB-5A8B-4D90-B3A7-6B52FCBD5D22</outgoing>\n        <outgoing>sid-97D1C665-6495-46A4-BA35-8961F07A076F</outgoing>\n      </exclusiveGateway>\n      <task id=\"sid-2EE25CB0-E8BA-491E-A773-BD4B27643246\" name=\"Status der Bewerbung auf &#34;abgelehnt&#34; setzen\">\n        <incoming>sid-7E2E4777-EC3D-4484-8606-A1ACB6FE84BE</incoming>\n        <outgoing>sid-9B1BDCA4-28B7-426E-A13C-66409FAC588B</outgoing>\n      </task>\n      <task id=\"sid-8376EFE7-7178-4B72-AF75-4CD3BCDCA599\" name=\"Termin abstimmen\">\n        <incoming>sid-5F689961-FD7E-4383-8ECE-B6946007D211</incoming>\n        <outgoing>sid-04E0977B-6883-4B93-AD20-5A2F8B496DE6</outgoing>\n      </task>\n      <exclusiveGateway id=\"sid-3D74C40A-91BA-4671-BB9F-8D03623CAF68\" name=\"weiter auf &#10;Rückmeldung&#10; warten?\" gatewayDirection=\"Diverging\">\n        <incoming>sid-4FA0508C-2BC1-4ABB-8F75-ED27215EE73D</incoming>\n        <outgoing>sid-7E2E4777-EC3D-4484-8606-A1ACB6FE84BE</outgoing>\n        <outgoing>sid-373FAB4D-A45B-45EC-9F85-B1076ABBFBA6</outgoing>\n      </exclusiveGateway>\n      <exclusiveGateway id=\"sid-7F7FA2A5-7345-4F11-B0A5-2EEF60EE3CAC\" name=\"Bestätigung &#10;ok?\" gatewayDirection=\"Diverging\">\n        <incoming>sid-C642640E-F524-40F0-BD91-41961D14ED31</incoming>\n        <outgoing>sid-5F689961-FD7E-4383-8ECE-B6946007D211</outgoing>\n        <outgoing>sid-258E87AC-23E8-4C39-92C8-5AE7DE19992A</outgoing>\n      </exclusiveGateway>\n      <task id=\"sid-E2985FB2-CA52-4DFD-A6F0-563959923CB5\" name=\"Antwort auswerten\">\n        <incoming>sid-B8E5BEAC-DBF0-45D3-A8A5-1D0D1EF0E19B</incoming>\n        <outgoing>sid-C642640E-F524-40F0-BD91-41961D14ED31</outgoing>\n      </task>\n      <task id=\"sid-5695269D-E801-4953-B48D-EB281E7316F7\" name=\"Beim Bewerber&#10; nachfragen\">\n        <incoming>sid-7AD16339-3A08-4841-96D9-3164E76DCF8F</incoming>\n        <outgoing>sid-4FA0508C-2BC1-4ABB-8F75-ED27215EE73D</outgoing>\n      </task>\n      <intermediateCatchEvent id=\"sid-ED938847-69C7-421F-AFD0-0AECDB38C9F0\" name=\"Rückmeldefrist&#10; erreicht\">\n        <incoming>sid-97FBBC72-9B16-470C-BAF3-445654369DF9</incoming>\n        <outgoing>sid-7AD16339-3A08-4841-96D9-3164E76DCF8F</outgoing>\n        <timerEventDefinition id=\"sid-4a67b65d-b7b4-49e9-b576-855b1fde07d2\" />\n      </intermediateCatchEvent>\n      <intermediateCatchEvent id=\"sid-158F070A-F137-4B82-8403-261AA7E86AB6\" name=\"Antwort&#10;erhalten\">\n        <incoming>sid-1203CB8F-6985-4231-B352-DE313ECA48CE</incoming>\n        <outgoing>sid-B8E5BEAC-DBF0-45D3-A8A5-1D0D1EF0E19B</outgoing>\n        <messageEventDefinition id=\"sid-828138af-efda-4b8c-96ec-161cc3f31840\" />\n      </intermediateCatchEvent>\n      <eventBasedGateway id=\"sid-AE0A605B-D1DB-428A-83D7-38552EDA0289\" gatewayDirection=\"Diverging\">\n        <incoming>sid-FE1C5021-4268-4AE6-8FBD-9DF197259520</incoming>\n        <outgoing>sid-97FBBC72-9B16-470C-BAF3-445654369DF9</outgoing>\n        <outgoing>sid-1203CB8F-6985-4231-B352-DE313ECA48CE</outgoing>\n      </eventBasedGateway>\n      <startEvent id=\"sid-07E2F210-4975-43A8-AEE3-B913F6FB8B91\" name=\"Gespräch &#10;angefordert\">\n        <outgoing>sid-90EB4714-6D5C-48A0-87BB-BE2024FE22BD</outgoing>\n      </startEvent>\n      <task id=\"sid-B316767E-63CE-4A62-A9BF-AB4F0A0D517F\" name=\"Gesprächs-einladung versenden\">\n        <incoming>sid-8BB76718-C32D-4E09-B80B-7DC168E99147</incoming>\n        <outgoing>sid-48AAE1F8-75D9-4031-ACAD-49BD8A16E9C8</outgoing>\n      </task>\n      <task id=\"sid-A1EBC62D-CD4A-4D2B-A613-4873898F84F1\" name=\"Termin festlegen\">\n        <incoming>sid-90EB4714-6D5C-48A0-87BB-BE2024FE22BD</incoming>\n        <outgoing>sid-8BB76718-C32D-4E09-B80B-7DC168E99147</outgoing>\n      </task>\n      <sequenceFlow id=\"sid-97FBBC72-9B16-470C-BAF3-445654369DF9\" sourceRef=\"sid-AE0A605B-D1DB-428A-83D7-38552EDA0289\" targetRef=\"sid-ED938847-69C7-421F-AFD0-0AECDB38C9F0\" />\n      <sequenceFlow id=\"sid-4FA0508C-2BC1-4ABB-8F75-ED27215EE73D\" sourceRef=\"sid-5695269D-E801-4953-B48D-EB281E7316F7\" targetRef=\"sid-3D74C40A-91BA-4671-BB9F-8D03623CAF68\" />\n      <sequenceFlow id=\"sid-7E2E4777-EC3D-4484-8606-A1ACB6FE84BE\" name=\"nein\" sourceRef=\"sid-3D74C40A-91BA-4671-BB9F-8D03623CAF68\" targetRef=\"sid-2EE25CB0-E8BA-491E-A773-BD4B27643246\" />\n      <sequenceFlow id=\"sid-8BB76718-C32D-4E09-B80B-7DC168E99147\" sourceRef=\"sid-A1EBC62D-CD4A-4D2B-A613-4873898F84F1\" targetRef=\"sid-B316767E-63CE-4A62-A9BF-AB4F0A0D517F\" />\n      <sequenceFlow id=\"sid-1203CB8F-6985-4231-B352-DE313ECA48CE\" sourceRef=\"sid-AE0A605B-D1DB-428A-83D7-38552EDA0289\" targetRef=\"sid-158F070A-F137-4B82-8403-261AA7E86AB6\" />\n      <sequenceFlow id=\"sid-B8E5BEAC-DBF0-45D3-A8A5-1D0D1EF0E19B\" sourceRef=\"sid-158F070A-F137-4B82-8403-261AA7E86AB6\" targetRef=\"sid-E2985FB2-CA52-4DFD-A6F0-563959923CB5\" />\n      <sequenceFlow id=\"sid-C642640E-F524-40F0-BD91-41961D14ED31\" sourceRef=\"sid-E2985FB2-CA52-4DFD-A6F0-563959923CB5\" targetRef=\"sid-7F7FA2A5-7345-4F11-B0A5-2EEF60EE3CAC\" />\n      <sequenceFlow id=\"sid-5F689961-FD7E-4383-8ECE-B6946007D211\" name=\"nein\" sourceRef=\"sid-7F7FA2A5-7345-4F11-B0A5-2EEF60EE3CAC\" targetRef=\"sid-8376EFE7-7178-4B72-AF75-4CD3BCDCA599\" />\n      <sequenceFlow id=\"sid-9E3DEB10-BFD8-4D7D-80EC-F98CD2E65DA4\" sourceRef=\"sid-BFDE4B6A-89F4-415B-8A22-7BA82C441A65\" targetRef=\"sid-10B00DA4-44D4-4CD4-910E-C8952DA258A4\" />\n      <sequenceFlow id=\"sid-04E0977B-6883-4B93-AD20-5A2F8B496DE6\" sourceRef=\"sid-8376EFE7-7178-4B72-AF75-4CD3BCDCA599\" targetRef=\"sid-CCCFBB8A-9E33-4C98-BA16-30AA2A9D7D4B\" />\n      <sequenceFlow id=\"sid-9FB7EAEB-5A8B-4D90-B3A7-6B52FCBD5D22\" name=\"nein\" sourceRef=\"sid-CCCFBB8A-9E33-4C98-BA16-30AA2A9D7D4B\" targetRef=\"sid-42DAA51B-78CB-4098-8C74-1862994E0ED9\" />\n      <sequenceFlow id=\"sid-90EB4714-6D5C-48A0-87BB-BE2024FE22BD\" sourceRef=\"sid-07E2F210-4975-43A8-AEE3-B913F6FB8B91\" targetRef=\"sid-A1EBC62D-CD4A-4D2B-A613-4873898F84F1\" />\n      <sequenceFlow id=\"sid-7AD16339-3A08-4841-96D9-3164E76DCF8F\" sourceRef=\"sid-ED938847-69C7-421F-AFD0-0AECDB38C9F0\" targetRef=\"sid-5695269D-E801-4953-B48D-EB281E7316F7\" />\n      <sequenceFlow id=\"sid-97D1C665-6495-46A4-BA35-8961F07A076F\" name=\"ja\" sourceRef=\"sid-CCCFBB8A-9E33-4C98-BA16-30AA2A9D7D4B\" targetRef=\"sid-6C9E668B-0059-4AA5-B3F8-CC74FCBAE32E\" />\n      <sequenceFlow id=\"sid-4D49AA03-7D9E-4086-A0D9-43E7C741DCD3\" sourceRef=\"sid-42DAA51B-78CB-4098-8C74-1862994E0ED9\" targetRef=\"sid-636805C2-4600-43C3-8104-E68D0663C904\" />\n      <sequenceFlow id=\"sid-258E87AC-23E8-4C39-92C8-5AE7DE19992A\" name=\"ja\" sourceRef=\"sid-7F7FA2A5-7345-4F11-B0A5-2EEF60EE3CAC\" targetRef=\"sid-6C9E668B-0059-4AA5-B3F8-CC74FCBAE32E\" />\n      <sequenceFlow id=\"sid-48AAE1F8-75D9-4031-ACAD-49BD8A16E9C8\" sourceRef=\"sid-B316767E-63CE-4A62-A9BF-AB4F0A0D517F\" targetRef=\"sid-544B758B-A75C-410C-98CA-C84E19CBC367\" />\n      <sequenceFlow id=\"sid-9B1BDCA4-28B7-426E-A13C-66409FAC588B\" sourceRef=\"sid-2EE25CB0-E8BA-491E-A773-BD4B27643246\" targetRef=\"sid-551C13CD-F975-42AC-84F3-ABB2B458485A\" />\n      <sequenceFlow id=\"sid-373FAB4D-A45B-45EC-9F85-B1076ABBFBA6\" name=\"ja\" sourceRef=\"sid-3D74C40A-91BA-4671-BB9F-8D03623CAF68\" targetRef=\"sid-544B758B-A75C-410C-98CA-C84E19CBC367\" />\n      <sequenceFlow id=\"sid-FE1C5021-4268-4AE6-8FBD-9DF197259520\" sourceRef=\"sid-544B758B-A75C-410C-98CA-C84E19CBC367\" targetRef=\"sid-AE0A605B-D1DB-428A-83D7-38552EDA0289\" />\n      <sequenceFlow id=\"sid-F52F82C6-C6C5-4E39-A2A9-7F4F780748A5\" sourceRef=\"sid-6C9E668B-0059-4AA5-B3F8-CC74FCBAE32E\" targetRef=\"sid-BFDE4B6A-89F4-415B-8A22-7BA82C441A65\" />\n      <textAnnotation id=\"sid-E28EB527-2F0B-4491-82AE-F61274F75DF7\">\n        <text>ID4</text>\n      </textAnnotation>\n      <textAnnotation id=\"sid-E4AA7F18-9266-43DA-84E4-B3C4E5A27903\">\n        <text>ID3</text>\n      </textAnnotation>\n      <association id=\"sid-F9388202-3D20-4919-A2DB-088202A1DBC9\" associationDirection=\"None\" sourceRef=\"sid-2EE25CB0-E8BA-491E-A773-BD4B27643246\" targetRef=\"sid-E28EB527-2F0B-4491-82AE-F61274F75DF7\" />\n      <association id=\"sid-CC4AD237-37B5-4CDD-8697-237BE3E1F960\" associationDirection=\"None\" sourceRef=\"sid-B316767E-63CE-4A62-A9BF-AB4F0A0D517F\" targetRef=\"sid-E4AA7F18-9266-43DA-84E4-B3C4E5A27903\" />\n    </subProcess>\n    <endEvent id=\"sid-E91A2C66-8518-4301-8912-DA783975DD45\" name=\"Gespräch(e)&#10;vereinbart\">\n      <incoming>sid-D654E8D0-0A05-48F1-B102-B547E61DDDB6</incoming>\n    </endEvent>\n    <sequenceFlow id=\"sid-D654E8D0-0A05-48F1-B102-B547E61DDDB6\" sourceRef=\"sid-B1C30549-F180-4515-9926-F2036892B4C1\" targetRef=\"sid-E91A2C66-8518-4301-8912-DA783975DD45\" />\n    <sequenceFlow id=\"sid-369E18F1-20E3-4E09-A8B7-1FF568E57F23\" sourceRef=\"sid-36E152C5-1864-4D96-9F9B-27133FD47EFE\" targetRef=\"sid-B1C30549-F180-4515-9926-F2036892B4C1\" />\n  </process>\n  <process id=\"sid-5F2C877A-F295-424C-A941-8AFE42AFD1AE\" name=\"Management Arbeitsvertrag - &#10;Sachbearbeiter Personal\" processType=\"None\" isClosed=\"false\" isExecutable=\"false\">\n    <extensionElements />\n    <laneSet id=\"sid-05e8ed6e-6ec1-4900-b078-853e9db02228\">\n      <lane id=\"sid-3E1FA189-AC8C-4CF1-9057-3D2EF8C6D3AF\">\n        <flowNodeRef>sid-B104C31F-A70F-4206-AF8E-442C5C2EEE49</flowNodeRef>\n        <flowNodeRef>sid-1F104A2B-C7CC-49E1-87F1-8391D31274BE</flowNodeRef>\n        <flowNodeRef>sid-AB73793C-D47A-4738-B34F-A82C6219A92C</flowNodeRef>\n        <flowNodeRef>sid-9838543B-F6B3-4432-A9B3-8B790A762147</flowNodeRef>\n        <flowNodeRef>sid-EA77B0E4-4512-4A05-B100-88605F5B7995</flowNodeRef>\n        <flowNodeRef>sid-2E9539B9-F0F1-4AEE-ADDB-4C8AD7A3920C</flowNodeRef>\n        <flowNodeRef>sid-4D91885E-63D7-460F-ACAB-3B1300D396FB</flowNodeRef>\n        <flowNodeRef>sid-C5457771-C93B-44FD-8D70-05849F25C775</flowNodeRef>\n        <flowNodeRef>sid-7C6C6457-0FF6-4074-BC87-D5653F7F8037</flowNodeRef>\n        <flowNodeRef>sid-C0A39E1E-6BA6-4A7C-98C4-597CEF56D803</flowNodeRef>\n        <flowNodeRef>sid-691FDEB6-F626-4AB1-8E90-3653C83C04EA</flowNodeRef>\n        <flowNodeRef>sid-DD0BC4E1-4AA3-4835-A477-373EA263A593</flowNodeRef>\n        <flowNodeRef>sid-D16273A3-B9E4-4D02-8072-3868DC29A662</flowNodeRef>\n        <flowNodeRef>sid-C01A5EDF-FDDA-4675-86DD-EC939CA503EA</flowNodeRef>\n        <flowNodeRef>sid-5C56D37A-6C15-43CB-8253-E56329A0F15B</flowNodeRef>\n        <flowNodeRef>sid-D453B3D6-0EA6-4607-A413-C6332ABE9F32</flowNodeRef>\n        <flowNodeRef>sid-07626FBD-C7FA-466D-AC08-F579B7A9C2EA</flowNodeRef>\n      </lane>\n    </laneSet>\n    <task id=\"sid-B104C31F-A70F-4206-AF8E-442C5C2EEE49\" name=\"Vorlage Arbeits-&#10;vertrag erstellen\">\n      <incoming>sid-17FF4D83-66C9-45AC-8B63-3A4BC45B94B3</incoming>\n      <outgoing>sid-D833F570-90A1-46AB-B968-16751237C003</outgoing>\n    </task>\n    <task id=\"sid-1F104A2B-C7CC-49E1-87F1-8391D31274BE\" name=\"Arbeits-&#10;vertrag versenden\">\n      <incoming>sid-D833F570-90A1-46AB-B968-16751237C003</incoming>\n      <outgoing>sid-A2B3A2C7-61FA-40F5-9AF0-27FF0B6DE47D</outgoing>\n    </task>\n    <eventBasedGateway id=\"sid-AB73793C-D47A-4738-B34F-A82C6219A92C\" gatewayDirection=\"Mixed\">\n      <incoming>sid-A2B3A2C7-61FA-40F5-9AF0-27FF0B6DE47D</incoming>\n      <incoming>sid-6AD87C60-225D-4BAB-8EAE-3AB8D0C31754</incoming>\n      <outgoing>sid-B1598D75-E3CE-4CC5-8380-8FB570208B3B</outgoing>\n      <outgoing>sid-A2FA1E3C-8920-4F38-A2B1-BB75D9E33E85</outgoing>\n    </eventBasedGateway>\n    <intermediateCatchEvent id=\"sid-9838543B-F6B3-4432-A9B3-8B790A762147\" name=\"unterzeichneten&#10;Arbeitsvertrag&#10;erhalten\">\n      <incoming>sid-B1598D75-E3CE-4CC5-8380-8FB570208B3B</incoming>\n      <outgoing>sid-8110675A-7E69-4B6B-95B9-9DE5DEF4BF32</outgoing>\n      <messageEventDefinition id=\"sid-b786f138-fc0a-4a90-a3f8-b94d25594529\" />\n    </intermediateCatchEvent>\n    <task id=\"sid-EA77B0E4-4512-4A05-B100-88605F5B7995\" name=\"Arbeits-&#10;vertrag &#10;archivieren\">\n      <incoming>sid-E1876DA2-53A4-4F8B-8392-20655993C733</incoming>\n      <outgoing>sid-63119748-84AD-4A9B-8CDE-45B930B374B7</outgoing>\n    </task>\n    <endEvent id=\"sid-2E9539B9-F0F1-4AEE-ADDB-4C8AD7A3920C\" name=\"Stelle &#10;besetzt\">\n      <incoming>sid-63119748-84AD-4A9B-8CDE-45B930B374B7</incoming>\n    </endEvent>\n    <intermediateCatchEvent id=\"sid-4D91885E-63D7-460F-ACAB-3B1300D396FB\" name=\"Rückmeldefrist&#10;erreicht\">\n      <incoming>sid-A2FA1E3C-8920-4F38-A2B1-BB75D9E33E85</incoming>\n      <outgoing>sid-10D4CACF-4CA9-448C-93D1-BD9089C22BDE</outgoing>\n      <timerEventDefinition id=\"sid-0648e1e2-b801-4f82-94e5-2b455288cdbe\" />\n    </intermediateCatchEvent>\n    <task id=\"sid-C5457771-C93B-44FD-8D70-05849F25C775\" name=\"Beim Bewerber &#10;nachfragen\">\n      <incoming>sid-10D4CACF-4CA9-448C-93D1-BD9089C22BDE</incoming>\n      <outgoing>sid-BD42B065-FCDE-4B2A-9107-3602645F43B1</outgoing>\n    </task>\n    <exclusiveGateway id=\"sid-7C6C6457-0FF6-4074-BC87-D5653F7F8037\" name=\"auf &#10;Rückmeldung &#10;warten?\" gatewayDirection=\"Diverging\">\n      <incoming>sid-BD42B065-FCDE-4B2A-9107-3602645F43B1</incoming>\n      <outgoing>sid-17B8A293-C347-4830-BFA1-E4941E9B120F</outgoing>\n      <outgoing>sid-6AD87C60-225D-4BAB-8EAE-3AB8D0C31754</outgoing>\n    </exclusiveGateway>\n    <task id=\"sid-C0A39E1E-6BA6-4A7C-98C4-597CEF56D803\" name=\"Bewerbungs-&#10;daten aktualisieren\">\n      <incoming>sid-17B8A293-C347-4830-BFA1-E4941E9B120F</incoming>\n      <outgoing>sid-73D82202-2D46-4210-9113-A2BE24C342C8</outgoing>\n    </task>\n    <startEvent id=\"sid-691FDEB6-F626-4AB1-8E90-3653C83C04EA\" name=\"Arbeitsvertrag &#10;erforderlich\">\n      <outgoing>sid-17FF4D83-66C9-45AC-8B63-3A4BC45B94B3</outgoing>\n      <messageEventDefinition id=\"sid-e1f2b16a-8e4f-47c7-a0e8-c9adfaadfd30\" />\n    </startEvent>\n    <endEvent id=\"sid-DD0BC4E1-4AA3-4835-A477-373EA263A593\">\n      <incoming>sid-73D82202-2D46-4210-9113-A2BE24C342C8</incoming>\n    </endEvent>\n    <parallelGateway id=\"sid-D16273A3-B9E4-4D02-8072-3868DC29A662\" gatewayDirection=\"Diverging\">\n      <incoming>sid-8110675A-7E69-4B6B-95B9-9DE5DEF4BF32</incoming>\n      <outgoing>sid-E1876DA2-53A4-4F8B-8392-20655993C733</outgoing>\n      <outgoing>sid-FA4E05F6-ADB1-4F93-A0DA-3AEAEFB6D148</outgoing>\n      <outgoing>sid-E7730210-76BB-486F-BAB3-CA3994DF6AED</outgoing>\n    </parallelGateway>\n    <task id=\"sid-C01A5EDF-FDDA-4675-86DD-EC939CA503EA\" name=\"Bewerbungs-&#10;gespräch(e) absagen\">\n      <incoming>sid-FA4E05F6-ADB1-4F93-A0DA-3AEAEFB6D148</incoming>\n      <outgoing>sid-713C88F2-5563-41E9-9351-F1FEEEBA72DA</outgoing>\n    </task>\n    <endEvent id=\"sid-5C56D37A-6C15-43CB-8253-E56329A0F15B\" name=\"Bewerbungs-&#10;gespräch(e)&#10;abgesagt\">\n      <incoming>sid-713C88F2-5563-41E9-9351-F1FEEEBA72DA</incoming>\n    </endEvent>\n    <task id=\"sid-D453B3D6-0EA6-4607-A413-C6332ABE9F32\" name=\"Fachbereich informieren\">\n      <incoming>sid-E7730210-76BB-486F-BAB3-CA3994DF6AED</incoming>\n      <outgoing>sid-2365FF07-4092-4B79-976A-AD192FE4E4E9</outgoing>\n    </task>\n    <endEvent id=\"sid-07626FBD-C7FA-466D-AC08-F579B7A9C2EA\" name=\"Fachbereich &#10;informiert\">\n      <incoming>sid-2365FF07-4092-4B79-976A-AD192FE4E4E9</incoming>\n    </endEvent>\n    <sequenceFlow id=\"sid-2365FF07-4092-4B79-976A-AD192FE4E4E9\" sourceRef=\"sid-D453B3D6-0EA6-4607-A413-C6332ABE9F32\" targetRef=\"sid-07626FBD-C7FA-466D-AC08-F579B7A9C2EA\" />\n    <sequenceFlow id=\"sid-E7730210-76BB-486F-BAB3-CA3994DF6AED\" sourceRef=\"sid-D16273A3-B9E4-4D02-8072-3868DC29A662\" targetRef=\"sid-D453B3D6-0EA6-4607-A413-C6332ABE9F32\" />\n    <sequenceFlow id=\"sid-713C88F2-5563-41E9-9351-F1FEEEBA72DA\" sourceRef=\"sid-C01A5EDF-FDDA-4675-86DD-EC939CA503EA\" targetRef=\"sid-5C56D37A-6C15-43CB-8253-E56329A0F15B\" />\n    <sequenceFlow id=\"sid-FA4E05F6-ADB1-4F93-A0DA-3AEAEFB6D148\" sourceRef=\"sid-D16273A3-B9E4-4D02-8072-3868DC29A662\" targetRef=\"sid-C01A5EDF-FDDA-4675-86DD-EC939CA503EA\" />\n    <sequenceFlow id=\"sid-E1876DA2-53A4-4F8B-8392-20655993C733\" sourceRef=\"sid-D16273A3-B9E4-4D02-8072-3868DC29A662\" targetRef=\"sid-EA77B0E4-4512-4A05-B100-88605F5B7995\" />\n    <sequenceFlow id=\"sid-73D82202-2D46-4210-9113-A2BE24C342C8\" sourceRef=\"sid-C0A39E1E-6BA6-4A7C-98C4-597CEF56D803\" targetRef=\"sid-DD0BC4E1-4AA3-4835-A477-373EA263A593\" />\n    <sequenceFlow id=\"sid-17FF4D83-66C9-45AC-8B63-3A4BC45B94B3\" sourceRef=\"sid-691FDEB6-F626-4AB1-8E90-3653C83C04EA\" targetRef=\"sid-B104C31F-A70F-4206-AF8E-442C5C2EEE49\" />\n    <sequenceFlow id=\"sid-6AD87C60-225D-4BAB-8EAE-3AB8D0C31754\" name=\"ja\" sourceRef=\"sid-7C6C6457-0FF6-4074-BC87-D5653F7F8037\" targetRef=\"sid-AB73793C-D47A-4738-B34F-A82C6219A92C\" />\n    <sequenceFlow id=\"sid-17B8A293-C347-4830-BFA1-E4941E9B120F\" name=\"nein\" sourceRef=\"sid-7C6C6457-0FF6-4074-BC87-D5653F7F8037\" targetRef=\"sid-C0A39E1E-6BA6-4A7C-98C4-597CEF56D803\" />\n    <sequenceFlow id=\"sid-BD42B065-FCDE-4B2A-9107-3602645F43B1\" sourceRef=\"sid-C5457771-C93B-44FD-8D70-05849F25C775\" targetRef=\"sid-7C6C6457-0FF6-4074-BC87-D5653F7F8037\" />\n    <sequenceFlow id=\"sid-10D4CACF-4CA9-448C-93D1-BD9089C22BDE\" sourceRef=\"sid-4D91885E-63D7-460F-ACAB-3B1300D396FB\" targetRef=\"sid-C5457771-C93B-44FD-8D70-05849F25C775\" />\n    <sequenceFlow id=\"sid-A2FA1E3C-8920-4F38-A2B1-BB75D9E33E85\" sourceRef=\"sid-AB73793C-D47A-4738-B34F-A82C6219A92C\" targetRef=\"sid-4D91885E-63D7-460F-ACAB-3B1300D396FB\" />\n    <sequenceFlow id=\"sid-63119748-84AD-4A9B-8CDE-45B930B374B7\" sourceRef=\"sid-EA77B0E4-4512-4A05-B100-88605F5B7995\" targetRef=\"sid-2E9539B9-F0F1-4AEE-ADDB-4C8AD7A3920C\" />\n    <sequenceFlow id=\"sid-8110675A-7E69-4B6B-95B9-9DE5DEF4BF32\" sourceRef=\"sid-9838543B-F6B3-4432-A9B3-8B790A762147\" targetRef=\"sid-D16273A3-B9E4-4D02-8072-3868DC29A662\" />\n    <sequenceFlow id=\"sid-B1598D75-E3CE-4CC5-8380-8FB570208B3B\" sourceRef=\"sid-AB73793C-D47A-4738-B34F-A82C6219A92C\" targetRef=\"sid-9838543B-F6B3-4432-A9B3-8B790A762147\" />\n    <sequenceFlow id=\"sid-A2B3A2C7-61FA-40F5-9AF0-27FF0B6DE47D\" sourceRef=\"sid-1F104A2B-C7CC-49E1-87F1-8391D31274BE\" targetRef=\"sid-AB73793C-D47A-4738-B34F-A82C6219A92C\" />\n    <sequenceFlow id=\"sid-D833F570-90A1-46AB-B968-16751237C003\" sourceRef=\"sid-B104C31F-A70F-4206-AF8E-442C5C2EEE49\" targetRef=\"sid-1F104A2B-C7CC-49E1-87F1-8391D31274BE\" />\n    <textAnnotation id=\"sid-4FEF9487-CB3D-4D59-9804-557A8AE86B48\">\n      <text>ID12</text>\n    </textAnnotation>\n    <textAnnotation id=\"sid-F767618B-825D-4952-95F9-8FDA8D10C596\">\n      <text>ID8,9</text>\n    </textAnnotation>\n    <textAnnotation id=\"sid-0048F8AB-F92F-4371-9661-82765136E785\">\n      <text>ID11</text>\n    </textAnnotation>\n    <textAnnotation id=\"sid-B35D2825-DC27-4D6C-81EB-160C5741F700\">\n      <text>ID10</text>\n    </textAnnotation>\n    <association id=\"sid-457D4D89-6475-43CD-AB4E-0EC19248E141\" associationDirection=\"None\" sourceRef=\"sid-B104C31F-A70F-4206-AF8E-442C5C2EEE49\" targetRef=\"sid-4FEF9487-CB3D-4D59-9804-557A8AE86B48\" />\n    <association id=\"sid-ABF5CB6D-CFF9-445A-99DF-C541EF0CF6B8\" associationDirection=\"None\" sourceRef=\"sid-2E9539B9-F0F1-4AEE-ADDB-4C8AD7A3920C\" targetRef=\"sid-B35D2825-DC27-4D6C-81EB-160C5741F700\" />\n    <association id=\"sid-DD656687-20A5-4FD7-ADB7-30A876FAFB3E\" associationDirection=\"None\" sourceRef=\"sid-C0A39E1E-6BA6-4A7C-98C4-597CEF56D803\" targetRef=\"sid-F767618B-825D-4952-95F9-8FDA8D10C596\" />\n    <association id=\"sid-469B5AE7-5988-46A4-B631-4E4970E06765\" associationDirection=\"None\" sourceRef=\"sid-C01A5EDF-FDDA-4675-86DD-EC939CA503EA\" targetRef=\"sid-0048F8AB-F92F-4371-9661-82765136E785\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"sid-780f0a66-41b5-4f10-a81d-35e00c8c284d\">\n    <bpmndi:BPMNPlane id=\"sid-1780a274-6bf1-44a0-9a08-01bd7c9ad080\" bpmnElement=\"sid-3524ea26-a8cb-4d8f-b997-347710bca219\">\n      <bpmndi:BPMNShape id=\"sid-CB881798-E52C-4F03-809F-765C5F84EE04_gui\" bpmnElement=\"sid-CB881798-E52C-4F03-809F-765C5F84EE04\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"154\" y=\"680\" width=\"1097\" height=\"449\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-C583AB0E-16D2-4440-973E-F03090497640_gui\" bpmnElement=\"sid-C583AB0E-16D2-4440-973E-F03090497640\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"195\" y=\"65\" width=\"746\" height=\"60\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-187453C6-5AB5-4A6D-9A62-BF537E04EA0D_gui\" bpmnElement=\"sid-187453C6-5AB5-4A6D-9A62-BF537E04EA0D\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"160\" y=\"170\" width=\"1203\" height=\"388\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-E391B624-F6E8-428B-9C3E-7026F85C4F24_gui\" bpmnElement=\"sid-E391B624-F6E8-428B-9C3E-7026F85C4F24\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"190\" y=\"170\" width=\"1173\" height=\"388\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-8E5D2B9D-6731-4FA7-BB27-C444A7236A69_gui\" bpmnElement=\"sid-8E5D2B9D-6731-4FA7-BB27-C444A7236A69\">\n        <omgdc:Bounds x=\"843\" y=\"428\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-028EEE79-92D7-4C1B-B90D-905AA2697614_gui\" bpmnElement=\"sid-028EEE79-92D7-4C1B-B90D-905AA2697614\">\n        <omgdc:Bounds x=\"988\" y=\"428\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-7C1A234F-E066-438E-96E1-C0D7847288EA_gui\" bpmnElement=\"sid-7C1A234F-E066-438E-96E1-C0D7847288EA\">\n        <omgdc:Bounds x=\"1133\" y=\"454\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"1119\" y=\"482\" width=\"56\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-6EED0CFD-023A-4ACC-B944-42D90A617BDF_gui\" bpmnElement=\"sid-6EED0CFD-023A-4ACC-B944-42D90A617BDF\">\n        <omgdc:Bounds x=\"223\" y=\"453\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"206\" y=\"483\" width=\"64\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-CCECC1E8-CA9C-49BB-BEDF-75F173A11194_gui\" bpmnElement=\"sid-CCECC1E8-CA9C-49BB-BEDF-75F173A11194\">\n        <omgdc:Bounds x=\"358\" y=\"428\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-F1FC14E4-8BBB-4647-9F9D-179663172496_gui\" bpmnElement=\"sid-F1FC14E4-8BBB-4647-9F9D-179663172496\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"504\" y=\"448\" width=\"40\" height=\"40\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"489\" y=\"488\" width=\"71\" height=\"53\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-FF2BEA0D-55D5-4F2B-B7BA-195BC10CA9EB_gui\" bpmnElement=\"sid-FF2BEA0D-55D5-4F2B-B7BA-195BC10CA9EB\">\n        <omgdc:Bounds x=\"558\" y=\"269\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-8910ED9B-DADC-4E11-9AD5-E12448B57ADF_gui\" bpmnElement=\"sid-8910ED9B-DADC-4E11-9AD5-E12448B57ADF\">\n        <omgdc:Bounds x=\"771\" y=\"217\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"750\" y=\"247\" width=\"73\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-545B3227-D12A-43A8-B746-55E8C75F3A8A_gui\" bpmnElement=\"sid-545B3227-D12A-43A8-B746-55E8C75F3A8A\">\n        <omgdc:Bounds x=\"698\" y=\"289\" width=\"40\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-0FE7F936-F79B-4EB8-95F0-DC0AB97C682F_gui\" bpmnElement=\"sid-0FE7F936-F79B-4EB8-95F0-DC0AB97C682F\">\n        <omgdc:Bounds x=\"771\" y=\"294\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"749\" y=\"324\" width=\"74\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-05FFFE92-8A4C-43AB-8D9A-E14A1B0EE051_gui\" bpmnElement=\"sid-05FFFE92-8A4C-43AB-8D9A-E14A1B0EE051\">\n        <omgdc:Bounds x=\"846\" y=\"269\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-28EA3990-9252-49F9-AD56-8FCDBFD7DA7D_gui\" bpmnElement=\"sid-28EA3990-9252-49F9-AD56-8FCDBFD7DA7D\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"991\" y=\"289\" width=\"40\" height=\"40\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"983\" y=\"329\" width=\"56\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-25203984-1D0A-494D-AD69-9140631D10FD_gui\" bpmnElement=\"sid-25203984-1D0A-494D-AD69-9140631D10FD\">\n        <omgdc:Bounds x=\"1136\" y=\"269\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-6243D8FF-E57D-4D03-8234-40836D4E60D5_gui\" bpmnElement=\"sid-6243D8FF-E57D-4D03-8234-40836D4E60D5\">\n        <omgdc:Bounds x=\"1281\" y=\"295\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"1267\" y=\"323\" width=\"56\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-72EBDBE9-3856-4AF7-9DDB-7C0F478E26D8_gui\" bpmnElement=\"sid-72EBDBE9-3856-4AF7-9DDB-7C0F478E26D8\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"287\" y=\"448\" width=\"40\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-57892D76-E413-4274-B8DE-FED72250C8A7_gui\" bpmnElement=\"sid-57892D76-E413-4274-B8DE-FED72250C8A7\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"745\" y=\"448\" width=\"40\" height=\"40\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"733\" y=\"488\" width=\"64\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-6392228F-E287-40F3-9DD6-B91493F6B671_gui\" bpmnElement=\"sid-6392228F-E287-40F3-9DD6-B91493F6B671\">\n        <omgdc:Bounds x=\"601\" y=\"428\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-EC21E3DA-12C5-4B74-83F7-530229F6C777_gui\" bpmnElement=\"sid-EC21E3DA-12C5-4B74-83F7-530229F6C777\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"1070\" y=\"289\" width=\"40\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-E8C87193-03FE-438D-A921-0BAB9FBD08D9_gui\" bpmnElement=\"sid-E8C87193-03FE-438D-A921-0BAB9FBD08D9\">\n        <omgdc:Bounds x=\"1007\" y=\"580\" width=\"62\" height=\"60\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"1018\" y=\"640\" width=\"40\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-0862744E-76C7-4681-8759-7B8E629828B8_gui\" bpmnElement=\"sid-0862744E-76C7-4681-8759-7B8E629828B8\">\n        <omgdc:Bounds x=\"1195\" y=\"224\" width=\"29\" height=\"23\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-4E447BCA-4A6B-4944-8A1C-1A184D6A95FD_gui\" bpmnElement=\"sid-4E447BCA-4A6B-4944-8A1C-1A184D6A95FD\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"184\" y=\"680\" width=\"1067\" height=\"449\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-A9859F1C-A85B-4F2F-B2DF-E3F4F7FA67FA_gui\" bpmnElement=\"sid-A9859F1C-A85B-4F2F-B2DF-E3F4F7FA67FA\">\n        <omgdc:Bounds x=\"319\" y=\"872\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-8D8BD39F-1B08-433F-8F93-A1FF7520BA8B_gui\" bpmnElement=\"sid-8D8BD39F-1B08-433F-8F93-A1FF7520BA8B\">\n        <omgdc:Bounds x=\"427\" y=\"732\" width=\"88\" height=\"97\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"447\" y=\"829\" width=\"49\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-B9B94A24-2819-461A-B5E8-61182BDA87DD_gui\" bpmnElement=\"sid-B9B94A24-2819-461A-B5E8-61182BDA87DD\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"451\" y=\"892\" width=\"40\" height=\"40\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"436\" y=\"932\" width=\"70\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-86DC77E1-24A3-499E-89D0-499B4BBFF67A_gui\" bpmnElement=\"sid-86DC77E1-24A3-499E-89D0-499B4BBFF67A\">\n        <omgdc:Bounds x=\"244\" y=\"897\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"217\" y=\"927\" width=\"84\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-F0DA46E1-7E86-4236-9D49-290DD7B87C61_gui\" bpmnElement=\"sid-F0DA46E1-7E86-4236-9D49-290DD7B87C61\">\n        <omgdc:Bounds x=\"544\" y=\"872\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-BEC67F12-04E9-4AE2-B59E-FEB109CD3DF8_gui\" bpmnElement=\"sid-BEC67F12-04E9-4AE2-B59E-FEB109CD3DF8\">\n        <omgdc:Bounds x=\"458\" y=\"1001\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"447\" y=\"1029\" width=\"51\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-303796CF-BA87-40A7-B2EC-9F6E10BD1060_gui\" bpmnElement=\"sid-303796CF-BA87-40A7-B2EC-9F6E10BD1060\">\n        <omgdc:Bounds x=\"682\" y=\"871\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-D3CA93A5-3BCC-4DB3-8075-EAC0C0A53991_gui\" bpmnElement=\"sid-D3CA93A5-3BCC-4DB3-8075-EAC0C0A53991\">\n        <omgdc:Bounds x=\"818\" y=\"897\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"797\" y=\"927\" width=\"73\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-282D9841-8694-47FB-A058-32A5B47CFB1E_gui\" bpmnElement=\"sid-282D9841-8694-47FB-A058-32A5B47CFB1E\">\n        <omgdc:Bounds x=\"888\" y=\"872\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-597B2F0C-9759-421B-8F52-D8F26705F2BE_gui\" bpmnElement=\"sid-597B2F0C-9759-421B-8F52-D8F26705F2BE\">\n        <omgdc:Bounds x=\"1033\" y=\"872\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-6460C9E2-AD85-4EA6-8922-F9BAB25F1C5F_gui\" bpmnElement=\"sid-6460C9E2-AD85-4EA6-8922-F9BAB25F1C5F\">\n        <omgdc:Bounds x=\"1178\" y=\"898\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"1158\" y=\"926\" width=\"68\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-08F7E7A1-A19F-4324-8D38-CD160728FB9A_gui\" bpmnElement=\"sid-08F7E7A1-A19F-4324-8D38-CD160728FB9A\">\n        <omgdc:Bounds x=\"229\" y=\"798\" width=\"100\" height=\"68\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-26C1D0AA-CDB7-43FC-A36A-DF0658A215B1_gui\" bpmnElement=\"sid-26C1D0AA-CDB7-43FC-A36A-DF0658A215B1\">\n        <omgdc:Bounds x=\"516\" y=\"987\" width=\"42\" height=\"33\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-86AEF0B1-9EB6-45FD-B9A3-DAE6F5ED71A4_gui\" bpmnElement=\"sid-86AEF0B1-9EB6-45FD-B9A3-DAE6F5ED71A4\">\n        <omgdc:Bounds x=\"587\" y=\"977\" width=\"29\" height=\"33\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-9DE1A24F-5ED5-4095-B9C8-B7213895C7B7_gui\" bpmnElement=\"sid-9DE1A24F-5ED5-4095-B9C8-B7213895C7B7\">\n        <omgdi:waypoint x=\"801\" y=\"309\" />\n        <omgdi:waypoint x=\"846\" y=\"309\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-1C8DEB94-31C4-47FE-AA84-605810C351AF_gui\" bpmnElement=\"sid-1C8DEB94-31C4-47FE-AA84-605810C351AF\">\n        <omgdi:waypoint x=\"1038\" y=\"508\" />\n        <omgdi:waypoint x=\"1037\" y=\"580\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-85F7873E-4458-4406-9D6E-1F4CA6268D55_gui\" bpmnElement=\"sid-85F7873E-4458-4406-9D6E-1F4CA6268D55\">\n        <omgdi:waypoint x=\"458\" y=\"468\" />\n        <omgdi:waypoint x=\"504\" y=\"468\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-62177F1C-D8D7-488A-9F8A-E379831B4792_gui\" bpmnElement=\"sid-62177F1C-D8D7-488A-9F8A-E379831B4792\">\n        <omgdi:waypoint x=\"700\" y=\"468\" />\n        <omgdi:waypoint x=\"745\" y=\"468\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-0D428B09-7C49-44AE-A257-7E810A541B0F_gui\" bpmnElement=\"sid-0D428B09-7C49-44AE-A257-7E810A541B0F\">\n        <omgdi:waypoint x=\"544\" y=\"468\" />\n        <omgdi:waypoint x=\"600\" y=\"468\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"562\" y=\"443\" width=\"21\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-E54CB8B4-BED9-43AF-B03B-DBE60483A68A_gui\" bpmnElement=\"sid-E54CB8B4-BED9-43AF-B03B-DBE60483A68A\">\n        <omgdi:waypoint x=\"1031\" y=\"309\" />\n        <omgdi:waypoint x=\"1070\" y=\"309\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"1046\" y=\"284\" width=\"9\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-F86867DE-BA70-47C1-8340-A6A5A3B645AA_gui\" bpmnElement=\"sid-F86867DE-BA70-47C1-8340-A6A5A3B645AA\">\n        <omgdi:waypoint x=\"524\" y=\"448\" />\n        <omgdi:waypoint x=\"524.842567669863\" y=\"309.00359158542847\" />\n        <omgdi:waypoint x=\"558\" y=\"309\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"520\" y=\"354\" width=\"9\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-A83B900A-A119-4FC4-A77F-09849C8660C9_gui\" bpmnElement=\"sid-A83B900A-A119-4FC4-A77F-09849C8660C9\">\n        <omgdi:waypoint x=\"785\" y=\"468\" />\n        <omgdi:waypoint x=\"843\" y=\"468\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"810\" y=\"443\" width=\"9\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-1B51B1B0-FB1A-46CE-BC87-0D89AEA6845A_gui\" bpmnElement=\"sid-1B51B1B0-FB1A-46CE-BC87-0D89AEA6845A\">\n        <omgdi:waypoint x=\"254\" y=\"896\" />\n        <omgdi:waypoint x=\"243\" y=\"866\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-155BB3AD-386C-4EF2-92C6-E2800D82A875_gui\" bpmnElement=\"sid-155BB3AD-386C-4EF2-92C6-E2800D82A875\">\n        <omgdi:waypoint x=\"471\" y=\"931\" />\n        <omgdi:waypoint x=\"471\" y=\"1001\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"476\" y=\"956\" width=\"21\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-3C44D333-01F3-43B7-AE4F-F13DD6D05DAC_gui\" bpmnElement=\"sid-3C44D333-01F3-43B7-AE4F-F13DD6D05DAC\">\n        <omgdi:waypoint x=\"1011\" y=\"329\" />\n        <omgdi:waypoint x=\"1011.6673301253031\" y=\"364\" />\n        <omgdi:waypoint x=\"718.8031441607801\" y=\"364\" />\n        <omgdi:waypoint x=\"718\" y=\"329\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"855\" y=\"339\" width=\"21\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-EA96E73A-B3ED-48A6-B066-5B38CA75DBE6_gui\" bpmnElement=\"sid-EA96E73A-B3ED-48A6-B066-5B38CA75DBE6\">\n        <omgdi:waypoint x=\"848\" y=\"911\" />\n        <omgdi:waypoint x=\"887\" y=\"911\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-23F431C6-D279-436A-86B4-9E6F3F05EFCC_gui\" bpmnElement=\"sid-23F431C6-D279-436A-86B4-9E6F3F05EFCC\">\n        <omgdi:waypoint x=\"1190\" y=\"269\" />\n        <omgdi:waypoint x=\"1194\" y=\"247\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-B9DF0BE4-4658-4908-8E4C-B528E8EA1FDD_gui\" bpmnElement=\"sid-B9DF0BE4-4658-4908-8E4C-B528E8EA1FDD\">\n        <omgdi:waypoint x=\"719\" y=\"289\" />\n        <omgdi:waypoint x=\"719.1186848478005\" y=\"232.1975486707488\" />\n        <omgdi:waypoint x=\"771\" y=\"232\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-DC611CCE-BA2C-459D-974D-4D09E2C390E6_gui\" bpmnElement=\"sid-DC611CCE-BA2C-459D-974D-4D09E2C390E6\">\n        <omgdi:waypoint x=\"658\" y=\"309\" />\n        <omgdi:waypoint x=\"698\" y=\"309\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-1D74E5C9-7875-42C7-B069-7EF805115BFB_gui\" bpmnElement=\"sid-1D74E5C9-7875-42C7-B069-7EF805115BFB\">\n        <omgdi:waypoint x=\"584\" y=\"871\" />\n        <omgdi:waypoint x=\"584.0000000000001\" y=\"804.0980785814236\" />\n        <omgdi:waypoint x=\"515\" y=\"804\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-310DFC6B-79B0-40BC-BF9E-D072E122A3A2_gui\" bpmnElement=\"sid-310DFC6B-79B0-40BC-BF9E-D072E122A3A2\">\n        <omgdi:waypoint x=\"1007\" y=\"610\" />\n        <omgdi:waypoint x=\"369.0000000000001\" y=\"610.2774471932626\" />\n        <omgdi:waypoint x=\"369\" y=\"871\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-91E5F463-9CDA-4B49-8BB1-BD4C050EBBB2_gui\" bpmnElement=\"sid-91E5F463-9CDA-4B49-8BB1-BD4C050EBBB2\">\n        <omgdi:waypoint x=\"786\" y=\"125\" />\n        <omgdi:waypoint x=\"786\" y=\"217\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-F3E23BCC-F29B-444C-BF2B-C2AA7D9D0DEF_gui\" bpmnElement=\"sid-F3E23BCC-F29B-444C-BF2B-C2AA7D9D0DEF\">\n        <omgdi:waypoint x=\"274\" y=\"911\" />\n        <omgdi:waypoint x=\"319\" y=\"911\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-770DE0CC-14BD-46C1-B93A-3C10BD8A3933_gui\" bpmnElement=\"sid-770DE0CC-14BD-46C1-B93A-3C10BD8A3933\">\n        <omgdi:waypoint x=\"419\" y=\"911\" />\n        <omgdi:waypoint x=\"451\" y=\"912\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-7E6EBD99-9B3A-44CE-972E-9CCDA7924AD8_gui\" bpmnElement=\"sid-7E6EBD99-9B3A-44CE-972E-9CCDA7924AD8\">\n        <omgdi:waypoint x=\"253\" y=\"468\" />\n        <omgdi:waypoint x=\"287\" y=\"468\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-8BC0544C-1924-4422-B5BE-5CC1501312F4_gui\" bpmnElement=\"sid-8BC0544C-1924-4422-B5BE-5CC1501312F4\">\n        <omgdi:waypoint x=\"765\" y=\"448\" />\n        <omgdi:waypoint x=\"765.6791989805283\" y=\"398\" />\n        <omgdi:waypoint x=\"1090.5\" y=\"398\" />\n        <omgdi:waypoint x=\"1090\" y=\"329\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"918\" y=\"373\" width=\"21\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-A6C70715-D7C5-46FB-8ADB-0DC89B3991FD_gui\" bpmnElement=\"sid-A6C70715-D7C5-46FB-8ADB-0DC89B3991FD\">\n        <omgdi:waypoint x=\"608\" y=\"269\" />\n        <omgdi:waypoint x=\"608\" y=\"125\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-950B6B3A-BEDA-49E3-A901-6733165E80C3_gui\" bpmnElement=\"sid-950B6B3A-BEDA-49E3-A901-6733165E80C3\">\n        <omgdi:waypoint x=\"946\" y=\"309\" />\n        <omgdi:waypoint x=\"991\" y=\"309\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-54D77E49-FBFB-4B81-932A-B8F5E3BE4C6A_gui\" bpmnElement=\"sid-54D77E49-FBFB-4B81-932A-B8F5E3BE4C6A\">\n        <omgdi:waypoint x=\"1132\" y=\"911\" />\n        <omgdi:waypoint x=\"1177\" y=\"911\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-4A0A3787-3011-42F1-8CF7-16479922159E_gui\" bpmnElement=\"sid-4A0A3787-3011-42F1-8CF7-16479922159E\">\n        <omgdi:waypoint x=\"943\" y=\"468\" />\n        <omgdi:waypoint x=\"988\" y=\"468\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-1D3A1400-EBE2-4C67-B377-CC31EB9925E5_gui\" bpmnElement=\"sid-1D3A1400-EBE2-4C67-B377-CC31EB9925E5\">\n        <omgdi:waypoint x=\"987\" y=\"911\" />\n        <omgdi:waypoint x=\"1032\" y=\"911\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-1E7B8929-56CE-43DA-9B85-B91426258E04_gui\" bpmnElement=\"sid-1E7B8929-56CE-43DA-9B85-B91426258E04\">\n        <omgdi:waypoint x=\"238\" y=\"125\" />\n        <omgdi:waypoint x=\"238\" y=\"453\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-7BA05743-5D0C-4D1C-B193-22FE2A156E22_gui\" bpmnElement=\"sid-7BA05743-5D0C-4D1C-B193-22FE2A156E22\">\n        <omgdi:waypoint x=\"801\" y=\"232\" />\n        <omgdi:waypoint x=\"821\" y=\"232.1329438806149\" />\n        <omgdi:waypoint x=\"821\" y=\"196\" />\n        <omgdi:waypoint x=\"307.5\" y=\"196\" />\n        <omgdi:waypoint x=\"307\" y=\"448\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-309F9D94-670D-47BA-9511-3AB7AB0B9A83_gui\" bpmnElement=\"sid-309F9D94-670D-47BA-9511-3AB7AB0B9A83\">\n        <omgdi:waypoint x=\"877\" y=\"269\" />\n        <omgdi:waypoint x=\"877\" y=\"125\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-C529D2AE-4E4C-4985-A8CB-E6E74673BCAE_gui\" bpmnElement=\"sid-C529D2AE-4E4C-4985-A8CB-E6E74673BCAE\">\n        <omgdi:waypoint x=\"909\" y=\"125\" />\n        <omgdi:waypoint x=\"909\" y=\"269\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-FD9AF1C4-E124-4C55-9B18-87804F8EC67E_gui\" bpmnElement=\"sid-FD9AF1C4-E124-4C55-9B18-87804F8EC67E\">\n        <omgdi:waypoint x=\"327\" y=\"468\" />\n        <omgdi:waypoint x=\"358\" y=\"468\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-9391DBA5-9C7B-4B14-B502-AB985711AD02_gui\" bpmnElement=\"sid-9391DBA5-9C7B-4B14-B502-AB985711AD02\">\n        <omgdi:waypoint x=\"387\" y=\"871\" />\n        <omgdi:waypoint x=\"387.0000000000001\" y=\"780.8258485520023\" />\n        <omgdi:waypoint x=\"427\" y=\"780\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-AEE9D356-E86D-4D7A-ABC5-AA6E76635A57_gui\" bpmnElement=\"sid-AEE9D356-E86D-4D7A-ABC5-AA6E76635A57\">\n        <omgdi:waypoint x=\"1110\" y=\"309\" />\n        <omgdi:waypoint x=\"1136\" y=\"309\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-F834923E-C5BB-44FF-9238-FE9B18B7ECD2_gui\" bpmnElement=\"sid-F834923E-C5BB-44FF-9238-FE9B18B7ECD2\">\n        <omgdi:waypoint x=\"781\" y=\"911\" />\n        <omgdi:waypoint x=\"818\" y=\"912\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-A1B5F8D2-3FF2-4FAE-A885-819174BB01BD_gui\" bpmnElement=\"sid-A1B5F8D2-3FF2-4FAE-A885-819174BB01BD\">\n        <omgdi:waypoint x=\"515\" y=\"774\" />\n        <omgdi:waypoint x=\"607.0000000000001\" y=\"774.0980785814237\" />\n        <omgdi:waypoint x=\"607\" y=\"871\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-1F6B2785-A15E-4C82-87C4-9708BDD521B6_gui\" bpmnElement=\"sid-1F6B2785-A15E-4C82-87C4-9708BDD521B6\">\n        <omgdi:waypoint x=\"485\" y=\"1011\" />\n        <omgdi:waypoint x=\"515\" y=\"1002\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-7164D016-D299-4243-A9FE-75910B69E8F4_gui\" bpmnElement=\"sid-7164D016-D299-4243-A9FE-75910B69E8F4\">\n        <omgdi:waypoint x=\"591\" y=\"951\" />\n        <omgdi:waypoint x=\"588\" y=\"976\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-BDC5800E-05A9-4D22-BA46-474DD7EBFF31_gui\" bpmnElement=\"sid-BDC5800E-05A9-4D22-BA46-474DD7EBFF31\">\n        <omgdi:waypoint x=\"644\" y=\"911\" />\n        <omgdi:waypoint x=\"681\" y=\"911\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-C2A9F8A3-0E65-4BA2-A854-4B34EE2D2DFD_gui\" bpmnElement=\"sid-C2A9F8A3-0E65-4BA2-A854-4B34EE2D2DFD\">\n        <omgdi:waypoint x=\"1236\" y=\"309\" />\n        <omgdi:waypoint x=\"1281\" y=\"309\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-3EB9F09F-9E44-4200-A845-09B78E5F6BA8_gui\" bpmnElement=\"sid-3EB9F09F-9E44-4200-A845-09B78E5F6BA8\">\n        <omgdi:waypoint x=\"491\" y=\"911\" />\n        <omgdi:waypoint x=\"544\" y=\"911\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"513\" y=\"886\" width=\"9\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-8F7A2A97-7C59-4B9E-AE03-625BB085C0E4_gui\" bpmnElement=\"sid-8F7A2A97-7C59-4B9E-AE03-625BB085C0E4\">\n        <omgdi:waypoint x=\"1088\" y=\"468\" />\n        <omgdi:waypoint x=\"1133\" y=\"468\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-F9A96365-936B-4461-8D51-C38EBA362A68_gui\" bpmnElement=\"sid-F9A96365-936B-4461-8D51-C38EBA362A68\">\n        <omgdi:waypoint x=\"738\" y=\"309\" />\n        <omgdi:waypoint x=\"771\" y=\"309\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-A280AE73-E103-45BC-8078-8ADB6A8AF29C_gui\" bpmnElement=\"sid-A280AE73-E103-45BC-8078-8ADB6A8AF29C\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"425\" y=\"1403\" width=\"821\" height=\"195\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-23B471A9-0A76-483C-AD0B-65092D0477BF_gui\" bpmnElement=\"sid-23B471A9-0A76-483C-AD0B-65092D0477BF\">\n        <omgdc:Bounds x=\"717\" y=\"1420\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"697\" y=\"1448\" width=\"68\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-BA5E7744-B79B-47D2-8D85-7D38B00D52CF_gui\" bpmnElement=\"sid-BA5E7744-B79B-47D2-8D85-7D38B00D52CF\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"711\" y=\"1501\" width=\"40\" height=\"40\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"697\" y=\"1541\" width=\"68\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-6B8D60D6-2BC0-4969-A16A-ABCD8586DEAD_gui\" bpmnElement=\"sid-6B8D60D6-2BC0-4969-A16A-ABCD8586DEAD\">\n        <omgdc:Bounds x=\"958\" y=\"1420\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"938\" y=\"1448\" width=\"68\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-AD5109AB-9014-4810-AB7B-3A4990FB44D1_gui\" bpmnElement=\"sid-AD5109AB-9014-4810-AB7B-3A4990FB44D1\">\n        <omgdc:Bounds x=\"1182\" y=\"1507\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"1169\" y=\"1535\" width=\"54\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-8ED06068-AA04-428D-860D-8CA2A0483C2A_gui\" bpmnElement=\"sid-8ED06068-AA04-428D-860D-8CA2A0483C2A\">\n        <omgdc:Bounds x=\"1037\" y=\"1481\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-DDA78FB8-B5BB-490F-8AB6-144A28AB646B_gui\" bpmnElement=\"sid-DDA78FB8-B5BB-490F-8AB6-144A28AB646B\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"952\" y=\"1501\" width=\"40\" height=\"40\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"948\" y=\"1541\" width=\"49\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-2416E79A-ED80-4834-B7A9-A2F6F1B1F5D8_gui\" bpmnElement=\"sid-2416E79A-ED80-4834-B7A9-A2F6F1B1F5D8\">\n        <omgdc:Bounds x=\"807\" y=\"1481\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-FB3673BF-5359-4ACE-B2A2-1C546E2D95C0_gui\" bpmnElement=\"sid-FB3673BF-5359-4ACE-B2A2-1C546E2D95C0\">\n        <omgdc:Bounds x=\"562\" y=\"1481\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-D760E3B4-E755-4719-B905-F62FFF056D7B_gui\" bpmnElement=\"sid-D760E3B4-E755-4719-B905-F62FFF056D7B\">\n        <omgdi:waypoint x=\"611\" y=\"1612\" />\n        <omgdi:waypoint x=\"612\" y=\"1561\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-F5C79AC7-BB82-4CEC-A1E0-DB441A30CE08_gui\" bpmnElement=\"sid-F5C79AC7-BB82-4CEC-A1E0-DB441A30CE08\">\n        <omgdc:Bounds x=\"487\" y=\"1506\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"469\" y=\"1536\" width=\"66\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-CD80152E-8A60-4DF8-87F7-23BD0CDA3C58_gui\" bpmnElement=\"sid-CD80152E-8A60-4DF8-87F7-23BD0CDA3C58\">\n        <omgdi:waypoint x=\"517\" y=\"1521\" />\n        <omgdi:waypoint x=\"562\" y=\"1521\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-FDB13333-B493-4477-9DE4-C7E4C522F495_gui\" bpmnElement=\"sid-FDB13333-B493-4477-9DE4-C7E4C522F495\">\n        <omgdi:waypoint x=\"662\" y=\"1521\" />\n        <omgdi:waypoint x=\"711\" y=\"1521\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-3E4A80E2-14C5-4002-BFE9-15F53566593B_gui\" bpmnElement=\"sid-3E4A80E2-14C5-4002-BFE9-15F53566593B\">\n        <omgdi:waypoint x=\"907\" y=\"1521\" />\n        <omgdi:waypoint x=\"952\" y=\"1521\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-50B9F1DF-70D3-48DF-A96D-482225E11A7D_gui\" bpmnElement=\"sid-50B9F1DF-70D3-48DF-A96D-482225E11A7D\">\n        <omgdi:waypoint x=\"1137\" y=\"1521\" />\n        <omgdi:waypoint x=\"1182\" y=\"1521\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-908C781B-BB04-488F-BA6F-07FCF03BDD32_gui\" bpmnElement=\"sid-908C781B-BB04-488F-BA6F-07FCF03BDD32\">\n        <omgdi:waypoint x=\"992\" y=\"1521\" />\n        <omgdi:waypoint x=\"1037\" y=\"1521\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"1010\" y=\"1496\" width=\"9\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-E5370FBF-0192-43B6-8288-43F5D7BE5854_gui\" bpmnElement=\"sid-E5370FBF-0192-43B6-8288-43F5D7BE5854\">\n        <omgdi:waypoint x=\"972\" y=\"1501\" />\n        <omgdi:waypoint x=\"972\" y=\"1447\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"977\" y=\"1464\" width=\"21\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-1B290110-0336-46CF-92EC-C45D43FA9307_gui\" bpmnElement=\"sid-1B290110-0336-46CF-92EC-C45D43FA9307\">\n        <omgdi:waypoint x=\"751\" y=\"1521\" />\n        <omgdi:waypoint x=\"807\" y=\"1521\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"775\" y=\"1496\" width=\"9\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-1E8A77DE-E3F1-4DFA-B20C-9EEBF0735E05_gui\" bpmnElement=\"sid-1E8A77DE-E3F1-4DFA-B20C-9EEBF0735E05\">\n        <omgdi:waypoint x=\"731\" y=\"1501\" />\n        <omgdi:waypoint x=\"731\" y=\"1447\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"736\" y=\"1464\" width=\"21\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-0F208AE2-EC60-4823-9B6A-D062A91587F2_gui\" bpmnElement=\"sid-0F208AE2-EC60-4823-9B6A-D062A91587F2\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"455\" y=\"1403\" width=\"791\" height=\"195\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-EED957F8-FF8A-4A3A-918A-944B41FF5D4D_gui\" bpmnElement=\"sid-EED957F8-FF8A-4A3A-918A-944B41FF5D4D\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"384\" y=\"1164\" width=\"493\" height=\"182\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-0C2D523B-E4EB-4776-AFA3-43B156AAE378_gui\" bpmnElement=\"sid-0C2D523B-E4EB-4776-AFA3-43B156AAE378\">\n        <omgdc:Bounds x=\"818\" y=\"1241\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"808\" y=\"1269\" width=\"49\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-95BFCA10-63D0-4D29-8E56-2270CACF3BA8_gui\" bpmnElement=\"sid-95BFCA10-63D0-4D29-8E56-2270CACF3BA8\">\n        <omgdi:waypoint x=\"832\" y=\"1240\" />\n        <omgdi:waypoint x=\"832\" y=\"926\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-D56D4E10-864F-4B2B-898E-AA9641C98E63_gui\" bpmnElement=\"sid-D56D4E10-864F-4B2B-898E-AA9641C98E63\">\n        <omgdc:Bounds x=\"673\" y=\"1215\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-19BF350B-2D34-4049-B17C-AE0265F407CB_gui\" bpmnElement=\"sid-19BF350B-2D34-4049-B17C-AE0265F407CB\">\n        <omgdc:Bounds x=\"528\" y=\"1215\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-991275D8-E60A-440A-B2DD-094D2B0049A4_gui\" bpmnElement=\"sid-991275D8-E60A-440A-B2DD-094D2B0049A4\">\n        <omgdc:Bounds x=\"453\" y=\"1240\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"442\" y=\"1270\" width=\"53\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-F9BB69AC-3000-4C14-94DC-8CC8D3F2B65D_gui\" bpmnElement=\"sid-F9BB69AC-3000-4C14-94DC-8CC8D3F2B65D\">\n        <omgdi:waypoint x=\"731\" y=\"951\" />\n        <omgdi:waypoint x=\"731.7798643148516\" y=\"1144\" />\n        <omgdi:waypoint x=\"467.78749374306034\" y=\"1144\" />\n        <omgdi:waypoint x=\"467\" y=\"1239\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-2D215BCD-C98A-4B3A-B255-EDCE32FF2A97_gui\" bpmnElement=\"sid-2D215BCD-C98A-4B3A-B255-EDCE32FF2A97\">\n        <omgdi:waypoint x=\"482\" y=\"1254\" />\n        <omgdi:waypoint x=\"527\" y=\"1254\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-0B7D8255-893E-404A-B0EF-CCB418B98B58_gui\" bpmnElement=\"sid-0B7D8255-893E-404A-B0EF-CCB418B98B58\">\n        <omgdi:waypoint x=\"627\" y=\"1254\" />\n        <omgdi:waypoint x=\"672\" y=\"1254\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-73C9EBCD-9625-4469-B4AD-87B829C4BD8B_gui\" bpmnElement=\"sid-73C9EBCD-9625-4469-B4AD-87B829C4BD8B\">\n        <omgdi:waypoint x=\"772\" y=\"1254\" />\n        <omgdi:waypoint x=\"818\" y=\"1254\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-B8B18E3A-EF8D-4D19-B5CD-C666D39E2E0D_gui\" bpmnElement=\"sid-B8B18E3A-EF8D-4D19-B5CD-C666D39E2E0D\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"414\" y=\"1164\" width=\"463\" height=\"182\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-CC1C0D76-B3D1-4A22-B9D8-8C8FA4D85FB7_gui\" bpmnElement=\"sid-CC1C0D76-B3D1-4A22-B9D8-8C8FA4D85FB7\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"430\" y=\"1692\" width=\"816\" height=\"195\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-7F1356BF-93F9-41C2-937C-E943B8818EB3_gui\" bpmnElement=\"sid-7F1356BF-93F9-41C2-937C-E943B8818EB3\">\n        <omgdc:Bounds x=\"717\" y=\"1709\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"697\" y=\"1737\" width=\"68\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-4FA5730A-F51C-4CEE-98F0-631553512966_gui\" bpmnElement=\"sid-4FA5730A-F51C-4CEE-98F0-631553512966\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"711\" y=\"1790\" width=\"40\" height=\"40\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"697\" y=\"1830\" width=\"68\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-308728F0-D1C5-4383-AA70-41249841A930_gui\" bpmnElement=\"sid-308728F0-D1C5-4383-AA70-41249841A930\">\n        <omgdc:Bounds x=\"958\" y=\"1709\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"938\" y=\"1737\" width=\"68\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-3820CBDB-C1E3-47EA-BCE1-10C9DBAEDB37_gui\" bpmnElement=\"sid-3820CBDB-C1E3-47EA-BCE1-10C9DBAEDB37\">\n        <omgdc:Bounds x=\"1182\" y=\"1796\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"1169\" y=\"1824\" width=\"54\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-F197542D-D274-45BE-95A5-7A3608BBE27A_gui\" bpmnElement=\"sid-F197542D-D274-45BE-95A5-7A3608BBE27A\">\n        <omgdc:Bounds x=\"1037\" y=\"1770\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-8BC4F3B3-CA44-48C2-B3FA-137EAEC7D012_gui\" bpmnElement=\"sid-8BC4F3B3-CA44-48C2-B3FA-137EAEC7D012\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"952\" y=\"1790\" width=\"40\" height=\"40\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"948\" y=\"1830\" width=\"49\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-CC14630C-7FFB-4CD2-954A-1D52340F34B4_gui\" bpmnElement=\"sid-CC14630C-7FFB-4CD2-954A-1D52340F34B4\">\n        <omgdc:Bounds x=\"807\" y=\"1770\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-1FFCF5B7-A6EE-4D63-AC49-5CD21F277383_gui\" bpmnElement=\"sid-1FFCF5B7-A6EE-4D63-AC49-5CD21F277383\">\n        <omgdc:Bounds x=\"562\" y=\"1770\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-616032F1-DE57-4D70-B0F8-7BD6F4879437_gui\" bpmnElement=\"sid-616032F1-DE57-4D70-B0F8-7BD6F4879437\">\n        <omgdi:waypoint x=\"611\" y=\"1672\" />\n        <omgdi:waypoint x=\"612\" y=\"1770\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-699FBA56-8A57-43AC-ACC4-090A9B4AB26A_gui\" bpmnElement=\"sid-699FBA56-8A57-43AC-ACC4-090A9B4AB26A\">\n        <omgdc:Bounds x=\"487\" y=\"1795\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"469\" y=\"1825\" width=\"66\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-47EBB822-715D-4193-8711-59063E3E4F48_gui\" bpmnElement=\"sid-47EBB822-715D-4193-8711-59063E3E4F48\">\n        <omgdi:waypoint x=\"517\" y=\"1810\" />\n        <omgdi:waypoint x=\"562\" y=\"1810\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-B4BDF60C-F40F-4247-B52F-0EA0038A9039_gui\" bpmnElement=\"sid-B4BDF60C-F40F-4247-B52F-0EA0038A9039\">\n        <omgdi:waypoint x=\"662\" y=\"1810\" />\n        <omgdi:waypoint x=\"711\" y=\"1810\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-5C3AB4AB-5292-4EC3-9A0F-BAD26D56DBD4_gui\" bpmnElement=\"sid-5C3AB4AB-5292-4EC3-9A0F-BAD26D56DBD4\">\n        <omgdi:waypoint x=\"907\" y=\"1810\" />\n        <omgdi:waypoint x=\"952\" y=\"1810\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-5529AAF3-EC3E-409F-A020-8D0330A547E3_gui\" bpmnElement=\"sid-5529AAF3-EC3E-409F-A020-8D0330A547E3\">\n        <omgdi:waypoint x=\"1137\" y=\"1810\" />\n        <omgdi:waypoint x=\"1182\" y=\"1810\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-5C2E761C-74FF-405C-8F6E-416329D714BC_gui\" bpmnElement=\"sid-5C2E761C-74FF-405C-8F6E-416329D714BC\">\n        <omgdi:waypoint x=\"972\" y=\"1790\" />\n        <omgdi:waypoint x=\"972\" y=\"1736\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"977\" y=\"1753\" width=\"21\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-E725BF0F-5B88-4D38-AE6A-7ABDA67CA7C7_gui\" bpmnElement=\"sid-E725BF0F-5B88-4D38-AE6A-7ABDA67CA7C7\">\n        <omgdi:waypoint x=\"992\" y=\"1810\" />\n        <omgdi:waypoint x=\"1037\" y=\"1810\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"1010\" y=\"1785\" width=\"9\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-F11A1E78-0DE1-46E5-9074-F665ED1985BE_gui\" bpmnElement=\"sid-F11A1E78-0DE1-46E5-9074-F665ED1985BE\">\n        <omgdi:waypoint x=\"731\" y=\"1790\" />\n        <omgdi:waypoint x=\"731\" y=\"1736\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"736\" y=\"1753\" width=\"21\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-EF5AD02F-469C-45DB-AABA-29D5CDD54B58_gui\" bpmnElement=\"sid-EF5AD02F-469C-45DB-AABA-29D5CDD54B58\">\n        <omgdi:waypoint x=\"751\" y=\"1810\" />\n        <omgdi:waypoint x=\"807\" y=\"1810\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"775\" y=\"1785\" width=\"9\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-B22F345F-EAB4-4D92-A810-C4B9AFCC4A6F_gui\" bpmnElement=\"sid-B22F345F-EAB4-4D92-A810-C4B9AFCC4A6F\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"460\" y=\"1692\" width=\"786\" height=\"195\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-6C68E5FA-5812-446E-A335-AD6B18AD9BC6_gui\" bpmnElement=\"sid-6C68E5FA-5812-446E-A335-AD6B18AD9BC6\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"4471\" y=\"1007\" width=\"487\" height=\"45\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-F18FD2E3-46A6-4E86-9AA9-D67094D0DCE7_gui\" bpmnElement=\"sid-F18FD2E3-46A6-4E86-9AA9-D67094D0DCE7\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"4782\" y=\"1652\" width=\"249\" height=\"68\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-2E859D5D-83B3-461D-9FFF-2AAF49E71D2A_gui\" bpmnElement=\"sid-2E859D5D-83B3-461D-9FFF-2AAF49E71D2A\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"3064\" y=\"1007\" width=\"118\" height=\"57\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-C95FEFFE-4759-4ABA-B11D-E4BA65DA268F_gui\" bpmnElement=\"sid-C95FEFFE-4759-4ABA-B11D-E4BA65DA268F\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"1982\" y=\"978\" width=\"146\" height=\"60\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-19D91440-484D-4E64-BC61-4ADA8E26CA29_gui\" bpmnElement=\"sid-19D91440-484D-4E64-BC61-4ADA8E26CA29\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"3265\" y=\"1564\" width=\"493\" height=\"182\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-943A343F-C038-49B9-8640-7BDABFB8E1BF_gui\" bpmnElement=\"sid-943A343F-C038-49B9-8640-7BDABFB8E1BF\">\n        <omgdc:Bounds x=\"3696\" y=\"1641\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"3686\" y=\"1669\" width=\"49\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-4F2CDAD6-92D6-470B-B82C-8D07E050591A_gui\" bpmnElement=\"sid-4F2CDAD6-92D6-470B-B82C-8D07E050591A\">\n        <omgdc:Bounds x=\"3551\" y=\"1615\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-066B769F-EAEB-42E5-ACAB-341240A5F87D_gui\" bpmnElement=\"sid-066B769F-EAEB-42E5-ACAB-341240A5F87D\">\n        <omgdc:Bounds x=\"3406\" y=\"1615\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-B7711D66-52EB-4437-AA0C-5671CE83C6E6_gui\" bpmnElement=\"sid-B7711D66-52EB-4437-AA0C-5671CE83C6E6\">\n        <omgdc:Bounds x=\"3331\" y=\"1640\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"3318\" y=\"1670\" width=\"57\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-F88DDF30-3F4D-4FA6-AA82-3B10300FFE98_gui\" bpmnElement=\"sid-F88DDF30-3F4D-4FA6-AA82-3B10300FFE98\">\n        <omgdi:waypoint x=\"3360\" y=\"1654\" />\n        <omgdi:waypoint x=\"3405\" y=\"1654\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-4E1F9DDA-0BDF-4BB0-90F5-E7A85C259444_gui\" bpmnElement=\"sid-4E1F9DDA-0BDF-4BB0-90F5-E7A85C259444\">\n        <omgdi:waypoint x=\"3505\" y=\"1654\" />\n        <omgdi:waypoint x=\"3550\" y=\"1654\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-6E0CD175-BAC0-4104-8555-C2473AD6956B_gui\" bpmnElement=\"sid-6E0CD175-BAC0-4104-8555-C2473AD6956B\">\n        <omgdi:waypoint x=\"3650\" y=\"1654\" />\n        <omgdi:waypoint x=\"3695\" y=\"1654\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-994BB7B0-64D8-4DC4-B549-0758628F5A16_gui\" bpmnElement=\"sid-994BB7B0-64D8-4DC4-B549-0758628F5A16\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"3295\" y=\"1564\" width=\"463\" height=\"182\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-EEF891AC-F8A7-4623-9BA3-F560E2782C9D_gui\" bpmnElement=\"sid-EEF891AC-F8A7-4623-9BA3-F560E2782C9D\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"3726\" y=\"996\" width=\"249\" height=\"68\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-527C14AA-A993-4E8C-A9CD-99639DF62466_gui\" bpmnElement=\"sid-527C14AA-A993-4E8C-A9CD-99639DF62466\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"2913\" y=\"1100\" width=\"1164\" height=\"411\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-99DC1CC9-AD54-41FE-BA99-BBFCB0A1792D_gui\" bpmnElement=\"sid-99DC1CC9-AD54-41FE-BA99-BBFCB0A1792D\">\n        <omgdc:Bounds x=\"3614\" y=\"1363\" width=\"29\" height=\"22\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-A8C71BAE-B5D6-4BC1-BF48-636E34FDC5DA_gui\" bpmnElement=\"sid-A8C71BAE-B5D6-4BC1-BF48-636E34FDC5DA\">\n        <omgdc:Bounds x=\"3920\" y=\"1126\" width=\"29\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-9B744161-CE38-41EC-847E-D264A5BFA9CC_gui\" bpmnElement=\"sid-9B744161-CE38-41EC-847E-D264A5BFA9CC\">\n        <omgdc:Bounds x=\"3000\" y=\"1234\" width=\"29\" height=\"23\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-DB5144E8-CEDC-4333-BE75-A63907FDC5F0_gui\" bpmnElement=\"sid-DB5144E8-CEDC-4333-BE75-A63907FDC5F0\">\n        <omgdc:Bounds x=\"3945\" y=\"1285\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"3926\" y=\"1313\" width=\"66\" height=\"66\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-8700D448-747C-4559-9A57-BFE8AAD639D4_gui\" bpmnElement=\"sid-8700D448-747C-4559-9A57-BFE8AAD639D4\">\n        <omgdc:Bounds x=\"3800\" y=\"1259\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-DC5EFA1A-9841-4010-A16B-D771AA2B57C3_gui\" bpmnElement=\"sid-DC5EFA1A-9841-4010-A16B-D771AA2B57C3\">\n        <omgdc:Bounds x=\"3945\" y=\"1167\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"3914\" y=\"1195\" width=\"90\" height=\"53\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-286F337E-9361-4B4D-AF78-7E403CA80DA1_gui\" bpmnElement=\"sid-286F337E-9361-4B4D-AF78-7E403CA80DA1\">\n        <omgdc:Bounds x=\"3800\" y=\"1141\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-83275776-30AE-4168-9311-18544B088890_gui\" bpmnElement=\"sid-83275776-30AE-4168-9311-18544B088890\">\n        <omgdi:waypoint x=\"3850\" y=\"1141\" />\n        <omgdi:waypoint x=\"3850\" y=\"1064\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-94C02BC5-3BDF-458B-AB2C-1B7880E74C90_gui\" bpmnElement=\"sid-94C02BC5-3BDF-458B-AB2C-1B7880E74C90\">\n        <omgdi:waypoint x=\"3900\" y=\"1156\" />\n        <omgdi:waypoint x=\"3919\" y=\"1140\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-91FF7684-71E6-497E-9938-0C9469B597EA_gui\" bpmnElement=\"sid-91FF7684-71E6-497E-9938-0C9469B597EA\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"3715\" y=\"1279\" width=\"40\" height=\"40\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"3711\" y=\"1319\" width=\"48\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-53EE6F0D-43BE-4883-B018-3BB90743DC25_gui\" bpmnElement=\"sid-53EE6F0D-43BE-4883-B018-3BB90743DC25\">\n        <omgdc:Bounds x=\"3565\" y=\"1259\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-48E58EB6-ECEE-44B0-8AE3-DD8590112929_gui\" bpmnElement=\"sid-48E58EB6-ECEE-44B0-8AE3-DD8590112929\">\n        <omgdi:waypoint x=\"3615\" y=\"1339\" />\n        <omgdi:waypoint x=\"3614\" y=\"1363\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-4C1265A5-A535-48FB-99E9-68E0EC37C624_gui\" bpmnElement=\"sid-4C1265A5-A535-48FB-99E9-68E0EC37C624\">\n        <omgdc:Bounds x=\"3486\" y=\"1279\" width=\"40\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-42305309-4E98-47F0-80C4-690E2DB222C0_gui\" bpmnElement=\"sid-42305309-4E98-47F0-80C4-690E2DB222C0\">\n        <omgdc:Bounds x=\"3441\" y=\"1399\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"3428\" y=\"1429\" width=\"56\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-B28E079A-EC0B-4A89-9BF3-6850173FADFC_gui\" bpmnElement=\"sid-B28E079A-EC0B-4A89-9BF3-6850173FADFC\">\n        <omgdi:waypoint x=\"3600\" y=\"1614\" />\n        <omgdi:waypoint x=\"3600.5125515566237\" y=\"1536\" />\n        <omgdi:waypoint x=\"3455.5427807177925\" y=\"1536\" />\n        <omgdi:waypoint x=\"3455\" y=\"1429\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-8CE3896D-0181-49CE-A1A9-C085262DA0FA_gui\" bpmnElement=\"sid-8CE3896D-0181-49CE-A1A9-C085262DA0FA\">\n        <omgdc:Bounds x=\"3295\" y=\"1374\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-4419C1F2-A991-4A8F-B055-31790C2A4425_gui\" bpmnElement=\"sid-4419C1F2-A991-4A8F-B055-31790C2A4425\">\n        <omgdi:waypoint x=\"3345\" y=\"1454\" />\n        <omgdi:waypoint x=\"3345\" y=\"1639\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-9A0A93AB-0A05-4D01-BF02-14A9C3189E84_gui\" bpmnElement=\"sid-9A0A93AB-0A05-4D01-BF02-14A9C3189E84\">\n        <omgdc:Bounds x=\"3220\" y=\"1278\" width=\"40\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-A56AC510-264D-4291-B1CE-A035C2037437_gui\" bpmnElement=\"sid-A56AC510-264D-4291-B1CE-A035C2037437\">\n        <omgdc:Bounds x=\"3295\" y=\"1258\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-3B833F36-ABCE-49A9-B268-445BAC9F758D_gui\" bpmnElement=\"sid-3B833F36-ABCE-49A9-B268-445BAC9F758D\">\n        <omgdc:Bounds x=\"2992\" y=\"1284\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"2979\" y=\"1314\" width=\"57\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-E9D52506-E99F-412F-803B-0A7BB95CFA2D_gui\" bpmnElement=\"sid-E9D52506-E99F-412F-803B-0A7BB95CFA2D\">\n        <omgdi:waypoint x=\"3005\" y=\"1284\" />\n        <omgdi:waypoint x=\"3001\" y=\"1257\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-DF651323-2973-4344-A5E5-4FFF3FDCD702_gui\" bpmnElement=\"sid-DF651323-2973-4344-A5E5-4FFF3FDCD702\">\n        <omgdc:Bounds x=\"3097\" y=\"1409\" width=\"52\" height=\"52\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"3089\" y=\"1461\" width=\"69\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-155B51B2-12E4-4A0B-AFDF-DDBA2EE093D5_gui\" bpmnElement=\"sid-155B51B2-12E4-4A0B-AFDF-DDBA2EE093D5\">\n        <omgdc:Bounds x=\"3073\" y=\"1259\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-B8825EB2-D9F8-4506-BB4A-0330FF0FFAA9_gui\" bpmnElement=\"sid-B8825EB2-D9F8-4506-BB4A-0330FF0FFAA9\">\n        <omgdi:waypoint x=\"3105\" y=\"1259\" />\n        <omgdi:waypoint x=\"3105\" y=\"1064\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-03040B88-2530-4CC1-B5D2-B52CFA3F4144_gui\" bpmnElement=\"sid-03040B88-2530-4CC1-B5D2-B52CFA3F4144\">\n        <omgdi:waypoint x=\"3139\" y=\"1064\" />\n        <omgdi:waypoint x=\"3139\" y=\"1259\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-D3213E0A-906E-4276-8DAF-208E4F416D51_gui\" bpmnElement=\"sid-D3213E0A-906E-4276-8DAF-208E4F416D51\">\n        <omgdi:waypoint x=\"3260\" y=\"1298\" />\n        <omgdi:waypoint x=\"3295\" y=\"1298\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-CBB13D0A-5D67-4908-9D56-4E1A1E2D0E71_gui\" bpmnElement=\"sid-CBB13D0A-5D67-4908-9D56-4E1A1E2D0E71\">\n        <omgdi:waypoint x=\"3395\" y=\"1298\" />\n        <omgdi:waypoint x=\"3486\" y=\"1299\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-CB506E96-0C3C-4B65-9290-18EA192E62FE_gui\" bpmnElement=\"sid-CB506E96-0C3C-4B65-9290-18EA192E62FE\">\n        <omgdi:waypoint x=\"3735\" y=\"1279\" />\n        <omgdi:waypoint x=\"3735.5099637429494\" y=\"1181.0006737747826\" />\n        <omgdi:waypoint x=\"3800\" y=\"1181\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"3725\" y=\"1205\" width=\"21\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-8E8DC42E-9AD4-4D6F-AEFC-C6FE6E91B6D3_gui\" bpmnElement=\"sid-8E8DC42E-9AD4-4D6F-AEFC-C6FE6E91B6D3\">\n        <omgdi:waypoint x=\"3240\" y=\"1318\" />\n        <omgdi:waypoint x=\"3240.7395858164864\" y=\"1414.0583645499505\" />\n        <omgdi:waypoint x=\"3295\" y=\"1414\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-D3E0C8B2-1DEC-4283-9FB3-977DB4382650_gui\" bpmnElement=\"sid-D3E0C8B2-1DEC-4283-9FB3-977DB4382650\">\n        <omgdi:waypoint x=\"3395\" y=\"1414\" />\n        <omgdi:waypoint x=\"3440\" y=\"1414\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-1CA535D5-1E51-41B7-A555-3E8BB651FE97_gui\" bpmnElement=\"sid-1CA535D5-1E51-41B7-A555-3E8BB651FE97\">\n        <omgdi:waypoint x=\"3470\" y=\"1414\" />\n        <omgdi:waypoint x=\"3506.9865028051545\" y=\"1414.263821098874\" />\n        <omgdi:waypoint x=\"3506\" y=\"1318\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-47FE04AD-8529-45E5-87E6-F7992404494A_gui\" bpmnElement=\"sid-47FE04AD-8529-45E5-87E6-F7992404494A\">\n        <omgdi:waypoint x=\"3526\" y=\"1299\" />\n        <omgdi:waypoint x=\"3565\" y=\"1299\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-778CB5F7-7B50-4086-AEAF-A84CA5D34A8F_gui\" bpmnElement=\"sid-778CB5F7-7B50-4086-AEAF-A84CA5D34A8F\">\n        <omgdi:waypoint x=\"3665\" y=\"1299\" />\n        <omgdi:waypoint x=\"3715\" y=\"1299\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-3906E383-5898-47F6-84FE-CBA12360BCF9_gui\" bpmnElement=\"sid-3906E383-5898-47F6-84FE-CBA12360BCF9\">\n        <omgdi:waypoint x=\"3021\" y=\"1299\" />\n        <omgdi:waypoint x=\"3072\" y=\"1299\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-11A2840A-596D-4937-BB37-0D5952E03535_gui\" bpmnElement=\"sid-11A2840A-596D-4937-BB37-0D5952E03535\">\n        <omgdi:waypoint x=\"3172\" y=\"1298\" />\n        <omgdi:waypoint x=\"3220\" y=\"1298\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-7363B1EE-93CD-49D4-966B-8F1368A01010_gui\" bpmnElement=\"sid-7363B1EE-93CD-49D4-966B-8F1368A01010\">\n        <omgdi:waypoint x=\"3900\" y=\"1181\" />\n        <omgdi:waypoint x=\"3945\" y=\"1181\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-ADF333C6-9197-4556-A2C4-19BBC7122609_gui\" bpmnElement=\"sid-ADF333C6-9197-4556-A2C4-19BBC7122609\">\n        <omgdi:waypoint x=\"3900\" y=\"1299\" />\n        <omgdi:waypoint x=\"3945\" y=\"1299\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-67782ED7-78C0-47F3-9EAC-46F9F194D843_gui\" bpmnElement=\"sid-67782ED7-78C0-47F3-9EAC-46F9F194D843\">\n        <omgdi:waypoint x=\"3755\" y=\"1299\" />\n        <omgdi:waypoint x=\"3800\" y=\"1299\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"3773\" y=\"1274\" width=\"9\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-13E4B11F-E8D5-434E-9AE3-A42ED2084731_gui\" bpmnElement=\"sid-13E4B11F-E8D5-434E-9AE3-A42ED2084731\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"2943\" y=\"1100\" width=\"1134\" height=\"411\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-7BD88080-E847-40D9-9714-C838543CEC18_gui\" bpmnElement=\"sid-7BD88080-E847-40D9-9714-C838543CEC18\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"1332\" y=\"1105\" width=\"1510\" height=\"479\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-E91A2C66-8518-4301-8912-DA783975DD45_gui\" bpmnElement=\"sid-E91A2C66-8518-4301-8912-DA783975DD45\">\n        <omgdc:Bounds x=\"2773\" y=\"1339\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"2756\" y=\"1367\" width=\"62\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-B1C30549-F180-4515-9926-F2036892B4C1_gui\" bpmnElement=\"sid-B1C30549-F180-4515-9926-F2036892B4C1\" isExpanded=\"true\">\n        <omgdc:Bounds x=\"1465\" y=\"1146\" width=\"1266\" height=\"415\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-E28EB527-2F0B-4491-82AE-F61274F75DF7_gui\" bpmnElement=\"sid-E28EB527-2F0B-4491-82AE-F61274F75DF7\">\n        <omgdc:Bounds x=\"2358\" y=\"1162\" width=\"29\" height=\"33\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-E4AA7F18-9266-43DA-84E4-B3C4E5A27903_gui\" bpmnElement=\"sid-E4AA7F18-9266-43DA-84E4-B3C4E5A27903\">\n        <omgdc:Bounds x=\"1759\" y=\"1246\" width=\"29\" height=\"22\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-6C9E668B-0059-4AA5-B3F8-CC74FCBAE32E_gui\" bpmnElement=\"sid-6C9E668B-0059-4AA5-B3F8-CC74FCBAE32E\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"2443\" y=\"1372\" width=\"40\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-544B758B-A75C-410C-98CA-C84E19CBC367_gui\" bpmnElement=\"sid-544B758B-A75C-410C-98CA-C84E19CBC367\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"1819\" y=\"1301\" width=\"40\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-551C13CD-F975-42AC-84F3-ABB2B458485A_gui\" bpmnElement=\"sid-551C13CD-F975-42AC-84F3-ABB2B458485A\">\n        <omgdc:Bounds x=\"2396\" y=\"1216\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"2386\" y=\"1244\" width=\"48\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-636805C2-4600-43C3-8104-E68D0663C904_gui\" bpmnElement=\"sid-636805C2-4600-43C3-8104-E68D0663C904\">\n        <omgdc:Bounds x=\"2579\" y=\"1486\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"2570\" y=\"1514\" width=\"46\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-10B00DA4-44D4-4CD4-910E-C8952DA258A4_gui\" bpmnElement=\"sid-10B00DA4-44D4-4CD4-910E-C8952DA258A4\">\n        <omgdc:Bounds x=\"2659\" y=\"1378\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"2640\" y=\"1406\" width=\"66\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-BFDE4B6A-89F4-415B-8A22-7BA82C441A65_gui\" bpmnElement=\"sid-BFDE4B6A-89F4-415B-8A22-7BA82C441A65\">\n        <omgdc:Bounds x=\"2520\" y=\"1352\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-42DAA51B-78CB-4098-8C74-1862994E0ED9_gui\" bpmnElement=\"sid-42DAA51B-78CB-4098-8C74-1862994E0ED9\">\n        <omgdc:Bounds x=\"2440\" y=\"1460\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-CCCFBB8A-9E33-4C98-BA16-30AA2A9D7D4B_gui\" bpmnElement=\"sid-CCCFBB8A-9E33-4C98-BA16-30AA2A9D7D4B\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"2363\" y=\"1372\" width=\"40\" height=\"40\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"2357\" y=\"1412\" width=\"52\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-2EE25CB0-E8BA-491E-A773-BD4B27643246_gui\" bpmnElement=\"sid-2EE25CB0-E8BA-491E-A773-BD4B27643246\">\n        <omgdc:Bounds x=\"2251\" y=\"1190\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-F9388202-3D20-4919-A2DB-088202A1DBC9_gui\" bpmnElement=\"sid-F9388202-3D20-4919-A2DB-088202A1DBC9\">\n        <omgdi:waypoint x=\"2345\" y=\"1189\" />\n        <omgdi:waypoint x=\"2357\" y=\"1175\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-8376EFE7-7178-4B72-AF75-4CD3BCDCA599_gui\" bpmnElement=\"sid-8376EFE7-7178-4B72-AF75-4CD3BCDCA599\">\n        <omgdc:Bounds x=\"2231\" y=\"1352\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-3D74C40A-91BA-4671-BB9F-8D03623CAF68_gui\" bpmnElement=\"sid-3D74C40A-91BA-4671-BB9F-8D03623CAF68\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"2149\" y=\"1210\" width=\"40\" height=\"40\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"2135\" y=\"1250\" width=\"68\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-7F7FA2A5-7345-4F11-B0A5-2EEF60EE3CAC_gui\" bpmnElement=\"sid-7F7FA2A5-7345-4F11-B0A5-2EEF60EE3CAC\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"2149\" y=\"1372\" width=\"40\" height=\"40\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"2140\" y=\"1412\" width=\"59\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-E2985FB2-CA52-4DFD-A6F0-563959923CB5_gui\" bpmnElement=\"sid-E2985FB2-CA52-4DFD-A6F0-563959923CB5\">\n        <omgdc:Bounds x=\"2005\" y=\"1352\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-5695269D-E801-4953-B48D-EB281E7316F7_gui\" bpmnElement=\"sid-5695269D-E801-4953-B48D-EB281E7316F7\">\n        <omgdc:Bounds x=\"2005\" y=\"1190\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-DE7499BF-C4BD-4189-890C-F215087A424D_gui\" bpmnElement=\"sid-DE7499BF-C4BD-4189-890C-F215087A424D\">\n        <omgdi:waypoint x=\"2038\" y=\"1189\" />\n        <omgdi:waypoint x=\"2038\" y=\"1037\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-D974B6C2-C395-4788-8AC8-28BAC3DEB097_gui\" bpmnElement=\"sid-D974B6C2-C395-4788-8AC8-28BAC3DEB097\">\n        <omgdi:waypoint x=\"2071\" y=\"1037\" />\n        <omgdi:waypoint x=\"2071\" y=\"1189\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-ED938847-69C7-421F-AFD0-0AECDB38C9F0_gui\" bpmnElement=\"sid-ED938847-69C7-421F-AFD0-0AECDB38C9F0\">\n        <omgdc:Bounds x=\"1937\" y=\"1215\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"1915\" y=\"1245\" width=\"74\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-158F070A-F137-4B82-8403-261AA7E86AB6_gui\" bpmnElement=\"sid-158F070A-F137-4B82-8403-261AA7E86AB6\">\n        <omgdc:Bounds x=\"1937\" y=\"1379\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"1932\" y=\"1409\" width=\"40\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-AE0A605B-D1DB-428A-83D7-38552EDA0289_gui\" bpmnElement=\"sid-AE0A605B-D1DB-428A-83D7-38552EDA0289\">\n        <omgdc:Bounds x=\"1880\" y=\"1301\" width=\"40\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-07E2F210-4975-43A8-AEE3-B913F6FB8B91_gui\" bpmnElement=\"sid-07E2F210-4975-43A8-AEE3-B913F6FB8B91\">\n        <omgdc:Bounds x=\"1499\" y=\"1306\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"1486\" y=\"1336\" width=\"57\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-B316767E-63CE-4A62-A9BF-AB4F0A0D517F_gui\" bpmnElement=\"sid-B316767E-63CE-4A62-A9BF-AB4F0A0D517F\">\n        <omgdc:Bounds x=\"1693\" y=\"1280\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-CC4AD237-37B5-4CDD-8697-237BE3E1F960_gui\" bpmnElement=\"sid-CC4AD237-37B5-4CDD-8697-237BE3E1F960\">\n        <omgdi:waypoint x=\"1752\" y=\"1280\" />\n        <omgdi:waypoint x=\"1758\" y=\"1256\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-A1EBC62D-CD4A-4D2B-A613-4873898F84F1_gui\" bpmnElement=\"sid-A1EBC62D-CD4A-4D2B-A613-4873898F84F1\">\n        <omgdc:Bounds x=\"1559\" y=\"1281\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-97FBBC72-9B16-470C-BAF3-445654369DF9_gui\" bpmnElement=\"sid-97FBBC72-9B16-470C-BAF3-445654369DF9\">\n        <omgdi:waypoint x=\"1900\" y=\"1300\" />\n        <omgdi:waypoint x=\"1900.5\" y=\"1229.7051573394278\" />\n        <omgdi:waypoint x=\"1936\" y=\"1229\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-4FA0508C-2BC1-4ABB-8F75-ED27215EE73D_gui\" bpmnElement=\"sid-4FA0508C-2BC1-4ABB-8F75-ED27215EE73D\">\n        <omgdi:waypoint x=\"2104\" y=\"1229\" />\n        <omgdi:waypoint x=\"2149\" y=\"1230\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-7E2E4777-EC3D-4484-8606-A1ACB6FE84BE_gui\" bpmnElement=\"sid-7E2E4777-EC3D-4484-8606-A1ACB6FE84BE\">\n        <omgdi:waypoint x=\"2189\" y=\"1230\" />\n        <omgdi:waypoint x=\"2251\" y=\"1229\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"2210\" y=\"1205\" width=\"21\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-8BB76718-C32D-4E09-B80B-7DC168E99147_gui\" bpmnElement=\"sid-8BB76718-C32D-4E09-B80B-7DC168E99147\">\n        <omgdi:waypoint x=\"1658\" y=\"1320\" />\n        <omgdi:waypoint x=\"1692\" y=\"1320\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-1203CB8F-6985-4231-B352-DE313ECA48CE_gui\" bpmnElement=\"sid-1203CB8F-6985-4231-B352-DE313ECA48CE\">\n        <omgdi:waypoint x=\"1900\" y=\"1340\" />\n        <omgdi:waypoint x=\"1900.5\" y=\"1394.0307832982053\" />\n        <omgdi:waypoint x=\"1936\" y=\"1394\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-B8E5BEAC-DBF0-45D3-A8A5-1D0D1EF0E19B_gui\" bpmnElement=\"sid-B8E5BEAC-DBF0-45D3-A8A5-1D0D1EF0E19B\">\n        <omgdi:waypoint x=\"1966\" y=\"1394\" />\n        <omgdi:waypoint x=\"2004\" y=\"1393\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-C642640E-F524-40F0-BD91-41961D14ED31_gui\" bpmnElement=\"sid-C642640E-F524-40F0-BD91-41961D14ED31\">\n        <omgdi:waypoint x=\"2104\" y=\"1392\" />\n        <omgdi:waypoint x=\"2149\" y=\"1392\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-5F689961-FD7E-4383-8ECE-B6946007D211_gui\" bpmnElement=\"sid-5F689961-FD7E-4383-8ECE-B6946007D211\">\n        <omgdi:waypoint x=\"2189\" y=\"1392\" />\n        <omgdi:waypoint x=\"2231\" y=\"1392\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"2200\" y=\"1367\" width=\"21\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-9E3DEB10-BFD8-4D7D-80EC-F98CD2E65DA4_gui\" bpmnElement=\"sid-9E3DEB10-BFD8-4D7D-80EC-F98CD2E65DA4\">\n        <omgdi:waypoint x=\"2619\" y=\"1392\" />\n        <omgdi:waypoint x=\"2658\" y=\"1392\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-04E0977B-6883-4B93-AD20-5A2F8B496DE6_gui\" bpmnElement=\"sid-04E0977B-6883-4B93-AD20-5A2F8B496DE6\">\n        <omgdi:waypoint x=\"2331\" y=\"1392\" />\n        <omgdi:waypoint x=\"2362\" y=\"1392\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-9FB7EAEB-5A8B-4D90-B3A7-6B52FCBD5D22_gui\" bpmnElement=\"sid-9FB7EAEB-5A8B-4D90-B3A7-6B52FCBD5D22\">\n        <omgdi:waypoint x=\"2383\" y=\"1412\" />\n        <omgdi:waypoint x=\"2383.3030218043664\" y=\"1500.1988141169604\" />\n        <omgdi:waypoint x=\"2439\" y=\"1500\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"2373\" y=\"1431\" width=\"21\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-90EB4714-6D5C-48A0-87BB-BE2024FE22BD_gui\" bpmnElement=\"sid-90EB4714-6D5C-48A0-87BB-BE2024FE22BD\">\n        <omgdi:waypoint x=\"1529\" y=\"1320\" />\n        <omgdi:waypoint x=\"1558\" y=\"1320\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-7AD16339-3A08-4841-96D9-3164E76DCF8F_gui\" bpmnElement=\"sid-7AD16339-3A08-4841-96D9-3164E76DCF8F\">\n        <omgdi:waypoint x=\"1966\" y=\"1229\" />\n        <omgdi:waypoint x=\"2004\" y=\"1229\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-97D1C665-6495-46A4-BA35-8961F07A076F_gui\" bpmnElement=\"sid-97D1C665-6495-46A4-BA35-8961F07A076F\">\n        <omgdi:waypoint x=\"2402\" y=\"1392\" />\n        <omgdi:waypoint x=\"2443\" y=\"1392\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"2418\" y=\"1367\" width=\"9\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-4D49AA03-7D9E-4086-A0D9-43E7C741DCD3_gui\" bpmnElement=\"sid-4D49AA03-7D9E-4086-A0D9-43E7C741DCD3\">\n        <omgdi:waypoint x=\"2539\" y=\"1499\" />\n        <omgdi:waypoint x=\"2578\" y=\"1499\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-258E87AC-23E8-4C39-92C8-5AE7DE19992A_gui\" bpmnElement=\"sid-258E87AC-23E8-4C39-92C8-5AE7DE19992A\">\n        <omgdi:waypoint x=\"2169\" y=\"1372\" />\n        <omgdi:waypoint x=\"2169.1503114390325\" y=\"1319\" />\n        <omgdi:waypoint x=\"2463.9733004494883\" y=\"1319\" />\n        <omgdi:waypoint x=\"2463\" y=\"1372\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"2313\" y=\"1294\" width=\"9\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-48AAE1F8-75D9-4031-ACAD-49BD8A16E9C8_gui\" bpmnElement=\"sid-48AAE1F8-75D9-4031-ACAD-49BD8A16E9C8\">\n        <omgdi:waypoint x=\"1792\" y=\"1320\" />\n        <omgdi:waypoint x=\"1819\" y=\"1321\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-9B1BDCA4-28B7-426E-A13C-66409FAC588B_gui\" bpmnElement=\"sid-9B1BDCA4-28B7-426E-A13C-66409FAC588B\">\n        <omgdi:waypoint x=\"2351\" y=\"1229\" />\n        <omgdi:waypoint x=\"2396\" y=\"1229\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-373FAB4D-A45B-45EC-9F85-B1076ABBFBA6_gui\" bpmnElement=\"sid-373FAB4D-A45B-45EC-9F85-B1076ABBFBA6\">\n        <omgdi:waypoint x=\"2169\" y=\"1209\" />\n        <omgdi:waypoint x=\"2169.6503114390325\" y=\"1165\" />\n        <omgdi:waypoint x=\"1839.8116097592895\" y=\"1165\" />\n        <omgdi:waypoint x=\"1839\" y=\"1300\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"2001\" y=\"1140\" width=\"9\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-FE1C5021-4268-4AE6-8FBD-9DF197259520_gui\" bpmnElement=\"sid-FE1C5021-4268-4AE6-8FBD-9DF197259520\">\n        <omgdi:waypoint x=\"1859\" y=\"1321\" />\n        <omgdi:waypoint x=\"1880\" y=\"1321\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-F52F82C6-C6C5-4E39-A2A9-7F4F780748A5_gui\" bpmnElement=\"sid-F52F82C6-C6C5-4E39-A2A9-7F4F780748A5\">\n        <omgdi:waypoint x=\"2483\" y=\"1392\" />\n        <omgdi:waypoint x=\"2519\" y=\"1392\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-36E152C5-1864-4D96-9F9B-27133FD47EFE_gui\" bpmnElement=\"sid-36E152C5-1864-4D96-9F9B-27133FD47EFE\">\n        <omgdc:Bounds x=\"1395\" y=\"1338\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"1378\" y=\"1368\" width=\"64\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-D4887F44-4F7F-47A6-9802-908D44DF7A6D_gui\" bpmnElement=\"sid-D4887F44-4F7F-47A6-9802-908D44DF7A6D\">\n        <omgdi:waypoint x=\"1087\" y=\"1481\" />\n        <omgdi:waypoint x=\"1087.0895994902648\" y=\"1444.3782616037115\" />\n        <omgdi:waypoint x=\"1409.6193694131155\" y=\"1444.3782616037115\" />\n        <omgdi:waypoint x=\"1409\" y=\"1368\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-37532634-B172-4542-96A6-7E347E3CEA37_gui\" bpmnElement=\"sid-37532634-B172-4542-96A6-7E347E3CEA37\">\n        <omgdi:waypoint x=\"1082\" y=\"951\" />\n        <omgdi:waypoint x=\"1082.9257246007583\" y=\"1353.3893811587586\" />\n        <omgdi:waypoint x=\"1394\" y=\"1353\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-8B230C74-C9AA-43B1-953D-5BF07007A5FF_gui\" bpmnElement=\"sid-8B230C74-C9AA-43B1-953D-5BF07007A5FF\">\n        <omgdi:waypoint x=\"1087\" y=\"1770\" />\n        <omgdi:waypoint x=\"1087.0895994902648\" y=\"1740\" />\n        <omgdi:waypoint x=\"1409.6193694131155\" y=\"1740\" />\n        <omgdi:waypoint x=\"1409\" y=\"1368\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-369E18F1-20E3-4E09-A8B7-1FF568E57F23_gui\" bpmnElement=\"sid-369E18F1-20E3-4E09-A8B7-1FF568E57F23\">\n        <omgdi:waypoint x=\"1424\" y=\"1353\" />\n        <omgdi:waypoint x=\"1465\" y=\"1353\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-D654E8D0-0A05-48F1-B102-B547E61DDDB6_gui\" bpmnElement=\"sid-D654E8D0-0A05-48F1-B102-B547E61DDDB6\">\n        <omgdi:waypoint x=\"2731\" y=\"1353\" />\n        <omgdi:waypoint x=\"2773\" y=\"1353\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-4A0FB2B3-2D67-46F7-ACB3-260FC62E3B5A_gui\" bpmnElement=\"sid-4A0FB2B3-2D67-46F7-ACB3-260FC62E3B5A\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"1362\" y=\"1105\" width=\"1480\" height=\"479\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-1C31EF64-81F8-4886-88E9-434DF53A7B5F_gui\" bpmnElement=\"sid-1C31EF64-81F8-4886-88E9-434DF53A7B5F\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"1714\" y=\"1613\" width=\"637\" height=\"45\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-D42DDB33-3FF9-4C9A-A310-F65810A07BC6_gui\" bpmnElement=\"sid-D42DDB33-3FF9-4C9A-A310-F65810A07BC6\">\n        <omgdi:waypoint x=\"2264\" y=\"1613\" />\n        <omgdi:waypoint x=\"2264\" y=\"1432\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-939F496E-402A-4FCF-9A6F-C138E1A4F2DA_gui\" bpmnElement=\"sid-939F496E-402A-4FCF-9A6F-C138E1A4F2DA\">\n        <omgdi:waypoint x=\"1951\" y=\"1613\" />\n        <omgdi:waypoint x=\"1951\" y=\"1409\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-CD6D8956-F668-4D01-A8D1-C4D9643A2375_gui\" bpmnElement=\"sid-CD6D8956-F668-4D01-A8D1-C4D9643A2375\">\n        <omgdi:waypoint x=\"2297\" y=\"1432\" />\n        <omgdi:waypoint x=\"2297\" y=\"1613\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-71473AE9-0707-44B9-A0D3-C315677EFA05_gui\" bpmnElement=\"sid-71473AE9-0707-44B9-A0D3-C315677EFA05\">\n        <omgdi:waypoint x=\"1753\" y=\"1360\" />\n        <omgdi:waypoint x=\"1753\" y=\"1613\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-8006DF6D-4AC4-4BD4-8BE5-95CA3CCC182D_gui\" bpmnElement=\"sid-8006DF6D-4AC4-4BD4-8BE5-95CA3CCC182D\">\n        <omgdc:Bounds x=\"581\" y=\"1612\" width=\"62\" height=\"60\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"592\" y=\"1672\" width=\"40\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-C08CDF7A-062A-4F46-80DA-02F243AB0B3F_gui\" bpmnElement=\"sid-C08CDF7A-062A-4F46-80DA-02F243AB0B3F\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"4191\" y=\"1094\" width=\"1085\" height=\"516\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-B35D2825-DC27-4D6C-81EB-160C5741F700_gui\" bpmnElement=\"sid-B35D2825-DC27-4D6C-81EB-160C5741F700\">\n        <omgdc:Bounds x=\"5053\" y=\"1276\" width=\"29\" height=\"33\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-0048F8AB-F92F-4371-9661-82765136E785_gui\" bpmnElement=\"sid-0048F8AB-F92F-4371-9661-82765136E785\">\n        <omgdc:Bounds x=\"4911\" y=\"1459\" width=\"29\" height=\"22\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-F767618B-825D-4952-95F9-8FDA8D10C596_gui\" bpmnElement=\"sid-F767618B-825D-4952-95F9-8FDA8D10C596\">\n        <omgdc:Bounds x=\"5141\" y=\"1246\" width=\"29\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-4FEF9487-CB3D-4D59-9804-557A8AE86B48_gui\" bpmnElement=\"sid-4FEF9487-CB3D-4D59-9804-557A8AE86B48\">\n        <omgdc:Bounds x=\"4377\" y=\"1360\" width=\"29\" height=\"33\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-07626FBD-C7FA-466D-AC08-F579B7A9C2EA_gui\" bpmnElement=\"sid-07626FBD-C7FA-466D-AC08-F579B7A9C2EA\">\n        <omgdc:Bounds x=\"5001\" y=\"1531\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"4985\" y=\"1559\" width=\"61\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-D453B3D6-0EA6-4607-A413-C6332ABE9F32_gui\" bpmnElement=\"sid-D453B3D6-0EA6-4607-A413-C6332ABE9F32\">\n        <omgdc:Bounds x=\"4856\" y=\"1505\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-C41799EC-DD3A-4ED3-9E55-776983B28363_gui\" bpmnElement=\"sid-C41799EC-DD3A-4ED3-9E55-776983B28363\">\n        <omgdi:waypoint x=\"4905\" y=\"1585\" />\n        <omgdi:waypoint x=\"4905\" y=\"1652\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-5C56D37A-6C15-43CB-8253-E56329A0F15B_gui\" bpmnElement=\"sid-5C56D37A-6C15-43CB-8253-E56329A0F15B\">\n        <omgdc:Bounds x=\"5001\" y=\"1381\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"4982\" y=\"1409\" width=\"66\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-C01A5EDF-FDDA-4675-86DD-EC939CA503EA_gui\" bpmnElement=\"sid-C01A5EDF-FDDA-4675-86DD-EC939CA503EA\">\n        <omgdc:Bounds x=\"4856\" y=\"1355\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-469B5AE7-5988-46A4-B631-4E4970E06765_gui\" bpmnElement=\"sid-469B5AE7-5988-46A4-B631-4E4970E06765\">\n        <omgdi:waypoint x=\"4908\" y=\"1435\" />\n        <omgdi:waypoint x=\"4911\" y=\"1458\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-D16273A3-B9E4-4D02-8072-3868DC29A662_gui\" bpmnElement=\"sid-D16273A3-B9E4-4D02-8072-3868DC29A662\">\n        <omgdc:Bounds x=\"4771\" y=\"1273\" width=\"40\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-DD0BC4E1-4AA3-4835-A477-373EA263A593_gui\" bpmnElement=\"sid-DD0BC4E1-4AA3-4835-A477-373EA263A593\">\n        <omgdc:Bounds x=\"5211\" y=\"1169\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-691FDEB6-F626-4AB1-8E90-3653C83C04EA_gui\" bpmnElement=\"sid-691FDEB6-F626-4AB1-8E90-3653C83C04EA\">\n        <omgdc:Bounds x=\"4260\" y=\"1278\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"4241\" y=\"1308\" width=\"68\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-FD240858-85C6-4D1A-9336-5E043D753A72_gui\" bpmnElement=\"sid-FD240858-85C6-4D1A-9336-5E043D753A72\">\n        <omgdi:waypoint x=\"3850\" y=\"1339\" />\n        <omgdi:waypoint x=\"3850.0099637429494\" y=\"1420\" />\n        <omgdi:waypoint x=\"4274.745262850934\" y=\"1420\" />\n        <omgdi:waypoint x=\"4274\" y=\"1307\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-C0A39E1E-6BA6-4A7C-98C4-597CEF56D803_gui\" bpmnElement=\"sid-C0A39E1E-6BA6-4A7C-98C4-597CEF56D803\">\n        <omgdc:Bounds x=\"5066\" y=\"1143\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-DD656687-20A5-4FD7-ADB7-30A876FAFB3E_gui\" bpmnElement=\"sid-DD656687-20A5-4FD7-ADB7-30A876FAFB3E\">\n        <omgdi:waypoint x=\"5127\" y=\"1223\" />\n        <omgdi:waypoint x=\"5140\" y=\"1260\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-7C6C6457-0FF6-4074-BC87-D5653F7F8037_gui\" bpmnElement=\"sid-7C6C6457-0FF6-4074-BC87-D5653F7F8037\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"4981\" y=\"1163\" width=\"40\" height=\"40\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"4967\" y=\"1203\" width=\"68\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-C5457771-C93B-44FD-8D70-05849F25C775_gui\" bpmnElement=\"sid-C5457771-C93B-44FD-8D70-05849F25C775\">\n        <omgdc:Bounds x=\"4836\" y=\"1143\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-9C99A596-2527-45AC-9ABB-6626A36DB292_gui\" bpmnElement=\"sid-9C99A596-2527-45AC-9ABB-6626A36DB292\">\n        <omgdi:waypoint x=\"4869\" y=\"1143\" />\n        <omgdi:waypoint x=\"4869\" y=\"1052\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-606B1F31-96AA-4799-8E9E-C4E6A968A715_gui\" bpmnElement=\"sid-606B1F31-96AA-4799-8E9E-C4E6A968A715\">\n        <omgdi:waypoint x=\"4902\" y=\"1052\" />\n        <omgdi:waypoint x=\"4902\" y=\"1143\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-4D91885E-63D7-460F-ACAB-3B1300D396FB_gui\" bpmnElement=\"sid-4D91885E-63D7-460F-ACAB-3B1300D396FB\">\n        <omgdc:Bounds x=\"4761\" y=\"1168\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"4739\" y=\"1198\" width=\"74\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-2E9539B9-F0F1-4AEE-ADDB-4C8AD7A3920C_gui\" bpmnElement=\"sid-2E9539B9-F0F1-4AEE-ADDB-4C8AD7A3920C\">\n        <omgdc:Bounds x=\"5001\" y=\"1279\" width=\"28\" height=\"28\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"4997\" y=\"1307\" width=\"37\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-ABF5CB6D-CFF9-445A-99DF-C541EF0CF6B8_gui\" bpmnElement=\"sid-ABF5CB6D-CFF9-445A-99DF-C541EF0CF6B8\">\n        <omgdi:waypoint x=\"5028\" y=\"1292\" />\n        <omgdi:waypoint x=\"5052\" y=\"1291\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-EA77B0E4-4512-4A05-B100-88605F5B7995_gui\" bpmnElement=\"sid-EA77B0E4-4512-4A05-B100-88605F5B7995\">\n        <omgdc:Bounds x=\"4856\" y=\"1253\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-9838543B-F6B3-4432-A9B3-8B790A762147_gui\" bpmnElement=\"sid-9838543B-F6B3-4432-A9B3-8B790A762147\">\n        <omgdc:Bounds x=\"4701\" y=\"1278\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"4677\" y=\"1308\" width=\"79\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-2DE50901-E357-426B-AC39-60EA1842B6FA_gui\" bpmnElement=\"sid-2DE50901-E357-426B-AC39-60EA1842B6FA\">\n        <omgdi:waypoint x=\"4715\" y=\"1052\" />\n        <omgdi:waypoint x=\"4715\" y=\"1277\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-AB73793C-D47A-4738-B34F-A82C6219A92C_gui\" bpmnElement=\"sid-AB73793C-D47A-4738-B34F-A82C6219A92C\">\n        <omgdc:Bounds x=\"4616\" y=\"1273\" width=\"40\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-1F104A2B-C7CC-49E1-87F1-8391D31274BE_gui\" bpmnElement=\"sid-1F104A2B-C7CC-49E1-87F1-8391D31274BE\">\n        <omgdc:Bounds x=\"4471\" y=\"1253\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-AC383C65-2E51-4F3E-ACE4-C973310B1447_gui\" bpmnElement=\"sid-AC383C65-2E51-4F3E-ACE4-C973310B1447\">\n        <omgdi:waypoint x=\"4520\" y=\"1252\" />\n        <omgdi:waypoint x=\"4520\" y=\"1052\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-B104C31F-A70F-4206-AF8E-442C5C2EEE49_gui\" bpmnElement=\"sid-B104C31F-A70F-4206-AF8E-442C5C2EEE49\">\n        <omgdc:Bounds x=\"4330\" y=\"1253\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-457D4D89-6475-43CD-AB4E-0EC19248E141_gui\" bpmnElement=\"sid-457D4D89-6475-43CD-AB4E-0EC19248E141\">\n        <omgdi:waypoint x=\"4379\" y=\"1332\" />\n        <omgdi:waypoint x=\"4377\" y=\"1359\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-D833F570-90A1-46AB-B968-16751237C003_gui\" bpmnElement=\"sid-D833F570-90A1-46AB-B968-16751237C003\">\n        <omgdi:waypoint x=\"4430\" y=\"1292\" />\n        <omgdi:waypoint x=\"4470\" y=\"1292\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-A2B3A2C7-61FA-40F5-9AF0-27FF0B6DE47D_gui\" bpmnElement=\"sid-A2B3A2C7-61FA-40F5-9AF0-27FF0B6DE47D\">\n        <omgdi:waypoint x=\"4570\" y=\"1292\" />\n        <omgdi:waypoint x=\"4615\" y=\"1293\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-B1598D75-E3CE-4CC5-8380-8FB570208B3B_gui\" bpmnElement=\"sid-B1598D75-E3CE-4CC5-8380-8FB570208B3B\">\n        <omgdi:waypoint x=\"4655\" y=\"1293\" />\n        <omgdi:waypoint x=\"4700\" y=\"1292\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-8110675A-7E69-4B6B-95B9-9DE5DEF4BF32_gui\" bpmnElement=\"sid-8110675A-7E69-4B6B-95B9-9DE5DEF4BF32\">\n        <omgdi:waypoint x=\"4730\" y=\"1292\" />\n        <omgdi:waypoint x=\"4771\" y=\"1293\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-63119748-84AD-4A9B-8CDE-45B930B374B7_gui\" bpmnElement=\"sid-63119748-84AD-4A9B-8CDE-45B930B374B7\">\n        <omgdi:waypoint x=\"4955\" y=\"1292\" />\n        <omgdi:waypoint x=\"5000\" y=\"1292\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-A2FA1E3C-8920-4F38-A2B1-BB75D9E33E85_gui\" bpmnElement=\"sid-A2FA1E3C-8920-4F38-A2B1-BB75D9E33E85\">\n        <omgdi:waypoint x=\"4636\" y=\"1272\" />\n        <omgdi:waypoint x=\"4636.360002239837\" y=\"1183.1323587200968\" />\n        <omgdi:waypoint x=\"4760\" y=\"1183\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-10D4CACF-4CA9-448C-93D1-BD9089C22BDE_gui\" bpmnElement=\"sid-10D4CACF-4CA9-448C-93D1-BD9089C22BDE\">\n        <omgdi:waypoint x=\"4790\" y=\"1183\" />\n        <omgdi:waypoint x=\"4835\" y=\"1183\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-BD42B065-FCDE-4B2A-9107-3602645F43B1_gui\" bpmnElement=\"sid-BD42B065-FCDE-4B2A-9107-3602645F43B1\">\n        <omgdi:waypoint x=\"4935\" y=\"1183\" />\n        <omgdi:waypoint x=\"4980\" y=\"1183\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-17B8A293-C347-4830-BFA1-E4941E9B120F_gui\" bpmnElement=\"sid-17B8A293-C347-4830-BFA1-E4941E9B120F\">\n        <omgdi:waypoint x=\"5020\" y=\"1183\" />\n        <omgdi:waypoint x=\"5065\" y=\"1183\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"5032\" y=\"1158\" width=\"21\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-6AD87C60-225D-4BAB-8EAE-3AB8D0C31754_gui\" bpmnElement=\"sid-6AD87C60-225D-4BAB-8EAE-3AB8D0C31754\">\n        <omgdi:waypoint x=\"5001\" y=\"1163\" />\n        <omgdi:waypoint x=\"5001.360002239835\" y=\"1126.3114175851833\" />\n        <omgdi:waypoint x=\"4624.860002239836\" y=\"1126.3114175851833\" />\n        <omgdi:waypoint x=\"4624\" y=\"1272\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"4809\" y=\"1101\" width=\"9\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-17FF4D83-66C9-45AC-8B63-3A4BC45B94B3_gui\" bpmnElement=\"sid-17FF4D83-66C9-45AC-8B63-3A4BC45B94B3\">\n        <omgdi:waypoint x=\"4289\" y=\"1292\" />\n        <omgdi:waypoint x=\"4330\" y=\"1292\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-73D82202-2D46-4210-9113-A2BE24C342C8_gui\" bpmnElement=\"sid-73D82202-2D46-4210-9113-A2BE24C342C8\">\n        <omgdi:waypoint x=\"5165\" y=\"1183\" />\n        <omgdi:waypoint x=\"5210\" y=\"1183\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-E1876DA2-53A4-4F8B-8392-20655993C733_gui\" bpmnElement=\"sid-E1876DA2-53A4-4F8B-8392-20655993C733\">\n        <omgdi:waypoint x=\"4811\" y=\"1293\" />\n        <omgdi:waypoint x=\"4855\" y=\"1292\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-FA4E05F6-ADB1-4F93-A0DA-3AEAEFB6D148_gui\" bpmnElement=\"sid-FA4E05F6-ADB1-4F93-A0DA-3AEAEFB6D148\">\n        <omgdi:waypoint x=\"4791\" y=\"1312\" />\n        <omgdi:waypoint x=\"4791.630483194386\" y=\"1395.1414965169647\" />\n        <omgdi:waypoint x=\"4855\" y=\"1395\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-713C88F2-5563-41E9-9351-F1FEEEBA72DA_gui\" bpmnElement=\"sid-713C88F2-5563-41E9-9351-F1FEEEBA72DA\">\n        <omgdi:waypoint x=\"4955\" y=\"1395\" />\n        <omgdi:waypoint x=\"5000\" y=\"1395\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-E7730210-76BB-486F-BAB3-CA3994DF6AED_gui\" bpmnElement=\"sid-E7730210-76BB-486F-BAB3-CA3994DF6AED\">\n        <omgdi:waypoint x=\"4791\" y=\"1312\" />\n        <omgdi:waypoint x=\"4791.630483194386\" y=\"1545.1783551768249\" />\n        <omgdi:waypoint x=\"4855\" y=\"1545\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-2365FF07-4092-4B79-976A-AD192FE4E4E9_gui\" bpmnElement=\"sid-2365FF07-4092-4B79-976A-AD192FE4E4E9\">\n        <omgdi:waypoint x=\"4955\" y=\"1545\" />\n        <omgdi:waypoint x=\"5000\" y=\"1545\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-3E1FA189-AC8C-4CF1-9057-3D2EF8C6D3AF_gui\" bpmnElement=\"sid-3E1FA189-AC8C-4CF1-9057-3D2EF8C6D3AF\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"4221\" y=\"1094\" width=\"1055\" height=\"516\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-43B00F10-A229-44CF-BAD4-7F7147D380E9_gui\" bpmnElement=\"sid-43B00F10-A229-44CF-BAD4-7F7147D380E9\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"2251\" y=\"978\" width=\"356\" height=\"60\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-09BC5894-5810-439D-9A36-FEF0B083B598_gui\" bpmnElement=\"sid-09BC5894-5810-439D-9A36-FEF0B083B598\">\n        <omgdi:waypoint x=\"2301\" y=\"1189\" />\n        <omgdi:waypoint x=\"2301\" y=\"1037\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-6BFB777A-C370-4A2B-A6AA-82581B15C84E_gui\" bpmnElement=\"sid-6BFB777A-C370-4A2B-A6AA-82581B15C84E\">\n        <omgdi:waypoint x=\"2563\" y=\"1352\" />\n        <omgdi:waypoint x=\"2563\" y=\"1037\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-CC64D413-A2EA-438C-B0FE-27F814C0C97B_gui\" bpmnElement=\"sid-CC64D413-A2EA-438C-B0FE-27F814C0C97B\">\n        <omgdc:Bounds x=\"1864\" y=\"296\" width=\"535\" height=\"119\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-9FBF1EA9-75EA-44B0-8B16-9F82808B0566_gui\" bpmnElement=\"sid-9FBF1EA9-75EA-44B0-8B16-9F82808B0566\">\n        <omgdc:Bounds x=\"1864\" y=\"127\" width=\"535\" height=\"119\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-9CB103FC-4135-44AE-B4F6-3C1116CCC0FD_gui\" bpmnElement=\"sid-9CB103FC-4135-44AE-B4F6-3C1116CCC0FD\">\n        <omgdc:Bounds x=\"1864\" y=\"462\" width=\"523\" height=\"243\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/copy-paste/copy-properties.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:camunda=\"http://camunda.org/schema/1.0/bpmn\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.1.2\">\n  <bpmn:collaboration id=\"Collaboration_1\">\n    <bpmn:participant id=\"Participant_1\" name=\"Participant\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" name=\"Process\" isExecutable=\"false\" camunda:versionTag=\"1.0\">\n    <bpmn:dataStoreReference id=\"DataStoreReference_1\" />\n    <bpmn:dataStoreReference id=\"DataStoreReference_2\" />\n    <bpmn:dataObjectReference id=\"DataObjectReference_2\" dataObjectRef=\"DataObject_1l0h55k\" />\n    <bpmn:dataObject id=\"DataObject_1l0h55k\" />\n    <bpmn:dataObjectReference id=\"DataObjectReference_1\" dataObjectRef=\"DataObject_1iu55n1\" />\n    <bpmn:dataObject id=\"DataObject_1iu55n1\" />\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <bpmn:userTask id=\"Task_1\" camunda:asyncBefore=\"true\" camunda:jobPriority=\"100\">\n        <bpmn:documentation>hello world</bpmn:documentation>\n        <bpmn:extensionElements>\n          <camunda:inputOutput>\n            <camunda:inputParameter name=\"Input_1\">foo</camunda:inputParameter>\n            <camunda:outputParameter name=\"Output_1\">bar</camunda:outputParameter>\n          </camunda:inputOutput>\n          <camunda:properties>\n            <camunda:property name=\"bar\" value=\"foo\" />\n          </camunda:properties>\n          <camunda:executionListener class=\"reallyClassy\" event=\"start\" />\n          <camunda:failedJobRetryTimeCycle>10</camunda:failedJobRetryTimeCycle>\n          <camunda:taskListener class=\"foobar\" event=\"create\" />\n        </bpmn:extensionElements>\n        <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n        <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n        <bpmn:property id=\"Property_0j0o7pl\" name=\"__targetRef_placeholder\" />\n        <bpmn:dataInputAssociation id=\"DataInputAssociation_4\">\n          <bpmn:sourceRef>DataStoreReference_1</bpmn:sourceRef>\n          <bpmn:targetRef>Property_0j0o7pl</bpmn:targetRef>\n        </bpmn:dataInputAssociation>\n        <bpmn:dataInputAssociation id=\"DataInputAssociation_2\">\n          <bpmn:sourceRef>DataObjectReference_1</bpmn:sourceRef>\n          <bpmn:targetRef>Property_0j0o7pl</bpmn:targetRef>\n        </bpmn:dataInputAssociation>\n        <bpmn:dataOutputAssociation id=\"DataOutputAssociation_5\">\n          <bpmn:targetRef>DataStoreReference_2</bpmn:targetRef>\n        </bpmn:dataOutputAssociation>\n        <bpmn:dataOutputAssociation id=\"DataOutputAssociation_3\">\n          <bpmn:targetRef>DataObjectReference_2</bpmn:targetRef>\n        </bpmn:dataOutputAssociation>\n      </bpmn:userTask>\n      <bpmn:startEvent id=\"StartEvent_1\">\n        <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n      <bpmn:task id=\"Task_2\">\n        <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n      </bpmn:task>\n      <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"Task_1\" targetRef=\"Task_2\" />\n    </bpmn:subProcess>\n    <bpmn:textAnnotation id=\"TextAnnotation_1\" />\n    <bpmn:association id=\"Association_1\" sourceRef=\"Task_1\" targetRef=\"TextAnnotation_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"UserTask_033cl9l_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"261\" y=\"159.5\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1a4dsh8_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"168\" y=\"181.5\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"186\" y=\"217.5\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1e74z8m_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"204\" y=\"199.5\" />\n        <di:waypoint x=\"261\" y=\"199.5\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"233\" y=\"174.5\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_042z61e_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"441\" y=\"159.5\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1tdxph9_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint x=\"361\" y=\"199.5\" />\n        <di:waypoint x=\"441\" y=\"199.5\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"401\" y=\"184.5\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Participant_0x9lnke_di\" bpmnElement=\"Participant_1\">\n        <dc:Bounds x=\"0\" y=\"0\" width=\"632\" height=\"417\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_1cghzwc_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"50\" y=\"30.5\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_1elrt45_di\" bpmnElement=\"DataStoreReference_1\">\n        <dc:Bounds x=\"211\" y=\"347.5\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"236\" y=\"397.5\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_1j8ymac_di\" bpmnElement=\"DataStoreReference_2\">\n        <dc:Bounds x=\"345\" y=\"347.5\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"370\" y=\"397.5\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_1js94kb_di\" bpmnElement=\"DataObjectReference_2\">\n        <dc:Bounds x=\"352\" y=\"20.5\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"370\" y=\"70.5\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_0hkbt95_di\" bpmnElement=\"DataObjectReference_1\">\n        <dc:Bounds x=\"218\" y=\"20.5\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"236\" y=\"70.5\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_04tmqcs_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"153\" y=\"104.5\" width=\"459\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_0edc446_di\" bpmnElement=\"Association_1\">\n        <di:waypoint x=\"265\" y=\"165.5\" />\n        <di:waypoint x=\"121\" y=\"60.5\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_0xdwl7n_di\" bpmnElement=\"DataInputAssociation_4\">\n        <di:waypoint x=\"244\" y=\"347.5\" />\n        <di:waypoint x=\"276\" y=\"239.5\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_1wf2bxo_di\" bpmnElement=\"DataOutputAssociation_5\">\n        <di:waypoint x=\"323\" y=\"239.5\" />\n        <di:waypoint x=\"354\" y=\"347.5\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_0hr21ne_di\" bpmnElement=\"DataOutputAssociation_3\">\n        <di:waypoint x=\"329\" y=\"159.5\" />\n        <di:waypoint x=\"368\" y=\"70.5\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_188je0k_di\" bpmnElement=\"DataInputAssociation_2\">\n        <di:waypoint x=\"245\" y=\"70.5\" />\n        <di:waypoint x=\"275\" y=\"159.5\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/copy-paste/data-associations.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:camunda=\"http://camunda.org/schema/1.0/bpmn\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.3.2\">\n  <bpmn:collaboration id=\"Collaboration_1\">\n    <bpmn:participant id=\"Participant_Output\" processRef=\"Process_Output\" />\n    <bpmn:participant id=\"Participant_Input\" processRef=\"Process_Input\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_Output\" isExecutable=\"true\">\n    <bpmn:extensionElements>\n      <camunda:executionListener class=\"Foo\" event=\"start\" />\n    </bpmn:extensionElements>\n    <bpmn:task id=\"Task_1\">\n      <bpmn:dataOutputAssociation id=\"DataOutputAssociation_1\">\n        <bpmn:targetRef>DataStoreReference_1</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n    </bpmn:task>\n    <bpmn:dataStoreReference id=\"DataStoreReference_1\" />\n  </bpmn:process>\n  <bpmn:process id=\"Process_Input\" isExecutable=\"false\">\n    <bpmn:extensionElements>\n      <camunda:executionListener class=\"Bar\" event=\"start\" />\n    </bpmn:extensionElements>\n    <bpmn:dataStoreReference id=\"DataStoreReference_2\" />\n    <bpmn:task id=\"Task_2\">\n      <bpmn:property id=\"Property_0l7g57i\" name=\"__targetRef_placeholder\" />\n      <bpmn:dataInputAssociation id=\"DataInputAssociation_1\">\n        <bpmn:sourceRef>DataStoreReference_2</bpmn:sourceRef>\n        <bpmn:targetRef>Property_0l7g57i</bpmn:targetRef>\n      </bpmn:dataInputAssociation>\n    </bpmn:task>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_166hvof_di\" bpmnElement=\"Participant_Output\" isHorizontal=\"true\">\n        <dc:Bounds x=\"152\" y=\"60\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_17elucr_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"266\" y=\"100\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_1muhdww_di\" bpmnElement=\"DataStoreReference_1\">\n        <dc:Bounds x=\"596\" y=\"216\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"726\" y=\"266\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_0bncpb8_di\" bpmnElement=\"DataOutputAssociation_1\">\n        <di:waypoint x=\"366\" y=\"157\" />\n        <di:waypoint x=\"596\" y=\"233\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Participant_1duzt5k_di\" bpmnElement=\"Participant_Input\" isHorizontal=\"true\">\n        <dc:Bounds x=\"152\" y=\"354\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_0q26vzn_di\" bpmnElement=\"DataStoreReference_2\">\n        <dc:Bounds x=\"608\" y=\"491\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"738\" y=\"541\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_10pzi8y_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"276\" y=\"375\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_1sf5ecg_di\" bpmnElement=\"DataInputAssociation_1\">\n        <di:waypoint x=\"608\" y=\"508\" />\n        <di:waypoint x=\"376\" y=\"431\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/copy-paste/event-based-gateway.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.2.1\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:eventBasedGateway id=\"EventBasedGateway_1\">\n      <bpmn:outgoing>SequenceFlow_4</bpmn:outgoing>\n    </bpmn:eventBasedGateway>\n    <bpmn:intermediateCatchEvent id=\"IntermediateCatchEvent_1\">\n      <bpmn:incoming>SequenceFlow_4</bpmn:incoming>\n      <bpmn:messageEventDefinition />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_4\" sourceRef=\"EventBasedGateway_1\" targetRef=\"IntermediateCatchEvent_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"EventBasedGateway_1dkii50_di\" bpmnElement=\"EventBasedGateway_1\">\n        <dc:Bounds x=\"156\" y=\"555\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_1pvz0xw_di\" bpmnElement=\"IntermediateCatchEvent_1\">\n        <dc:Bounds x=\"262\" y=\"562\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1m3ovdd_di\" bpmnElement=\"SequenceFlow_4\">\n        <di:waypoint x=\"206\" y=\"580\" />\n        <di:waypoint x=\"262\" y=\"580\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/copy-paste/nested-subprocess-annotations.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.0.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <bpmn:subProcess id=\"SubProcess_2\">\n        <bpmn:task id=\"Task_1\" name=\"task 1\" />\n      </bpmn:subProcess>\n    </bpmn:subProcess>\n    <bpmn:textAnnotation id=\"TextAnnotation_1\">\n      <bpmn:text>Annotation sample</bpmn:text>\n    </bpmn:textAnnotation>\n    <bpmn:association id=\"Association_1\" associationDirection=\"None\" sourceRef=\"Task_1\" targetRef=\"TextAnnotation_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"160\" y=\"80\" width=\"500\" height=\"300\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_2_di\" bpmnElement=\"SubProcess_2\" isExpanded=\"true\">\n        <dc:Bounds x=\"200\" y=\"120\" width=\"300\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"260\" y=\"180\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_1_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"700\" y=\"100\" width=\"100\" height=\"41\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_1_di\" bpmnElement=\"Association_1\">\n        <di:waypoint x=\"360\" y=\"200\" />\n        <di:waypoint x=\"700\" y=\"115\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/copy-paste/properties.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.1.2\">\n  <bpmn:category id=\"Category\">\n    <bpmn:categoryValue id=\"CategoryValue\" value=\"Group\" />\n  </bpmn:category>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess_NonInterrupting\" />\n    <bpmn:subProcess id=\"SubProcess_Event\" triggeredByEvent=\"true\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_1\" cancelActivity=\"false\" attachedToRef=\"SubProcess_NonInterrupting\">\n      <bpmn:messageEventDefinition />\n    </bpmn:boundaryEvent>\n    <bpmn:subProcess id=\"SubProcess_Interrupting\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_2\" attachedToRef=\"SubProcess_Interrupting\">\n      <bpmn:timerEventDefinition />\n    </bpmn:boundaryEvent>\n    <bpmn:transaction id=\"SubProcess_Transaction\" />\n    <bpmn:group id=\"Group\" categoryValueRef=\"CategoryValue\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_1pvi3qq_di\" bpmnElement=\"SubProcess_NonInterrupting\" isExpanded=\"true\">\n        <dc:Bounds x=\"100\" y=\"100\" width=\"140\" height=\"120\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_0k446tj_di\" bpmnElement=\"SubProcess_Event\" isExpanded=\"true\">\n        <dc:Bounds x=\"300\" y=\"100\" width=\"140\" height=\"120\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1a6busd_di\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds x=\"152\" y=\"202\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"92\" y=\"178\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_0pj87vw_di\" bpmnElement=\"SubProcess_Interrupting\" isExpanded=\"true\">\n        <dc:Bounds x=\"100\" y=\"300\" width=\"140\" height=\"120\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1aqt6gt_di\" bpmnElement=\"BoundaryEvent_2\">\n        <dc:Bounds x=\"152\" y=\"402\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"97\" y=\"345\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Transaction_1so7kki_di\" bpmnElement=\"SubProcess_Transaction\" isExpanded=\"true\">\n        <dc:Bounds x=\"300\" y=\"300\" width=\"140\" height=\"120\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_di\" bpmnElement=\"Group\">\n        <dc:Bounds x=\"500\" y=\"100\" width=\"140\" height=\"120\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/distribute-elements/BpmnDistributeElementsSpec.js",
    "content": "import { forEach } from 'min-dash';\n\nimport {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport bpmnDistributeElements from 'lib/features/distribute-elements';\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\nimport { is } from 'lib/util/ModelUtil';\n\nfunction last(arr) {\n  return arr[arr.length - 1];\n}\n\n\ndescribe('features/distribute-elements', function() {\n\n  var testModules = [ bpmnDistributeElements, modelingModule, coreModule ];\n\n\n  describe('basics', function() {\n\n    var basicXML = require('../../../fixtures/bpmn/distribute-elements.bpmn');\n\n    beforeEach(bootstrapModeler(basicXML, { modules: testModules }));\n\n    var elements;\n\n    beforeEach(inject(function(elementRegistry, canvas) {\n      elements = elementRegistry.filter(function(element) {\n        return element.parent && !is(element, 'bpmn:Participant');\n      });\n    }));\n\n\n    it('should align horizontally', inject(function(distributeElements) {\n\n      // when\n      var rangeGroups = distributeElements.trigger(elements, 'horizontal'),\n          margin = rangeGroups[1].range.min - rangeGroups[0].range.max;\n\n      // then\n      expect(rangeGroups).to.have.length(9);\n\n      expect(margin).to.equal(83);\n\n      expect(rangeGroups[0].range).to.eql({\n        min: 132, max: 158\n      });\n\n      expect(last(rangeGroups).range).to.eql({\n        min: 1195, max: 1221\n      });\n\n    }));\n\n\n    it('should align vertically', inject(function(distributeElements) {\n\n      // when\n      var rangeGroups = distributeElements.trigger(elements, 'vertical'),\n          margin = rangeGroups[1].range.min - rangeGroups[0].range.max;\n\n      // then\n      expect(rangeGroups).to.have.length(4);\n\n      expect(margin).to.equal(17);\n\n      expect(rangeGroups[0].range).to.eql({\n        min: -42, max: 38\n      });\n\n      expect(last(rangeGroups).range).to.eql({\n        min: 373, max: 413\n      });\n\n    }));\n\n  });\n\n\n  describe('filtering elements', function() {\n\n    describe('process', function() {\n\n      var xml = require('../../../fixtures/bpmn/distribute-elements-filtering.bpmn'),\n          elements;\n\n      beforeEach(bootstrapModeler(xml, { modules: testModules }));\n\n\n      beforeEach(inject(function(elementRegistry) {\n        elements = elementRegistry.filter(function(element) {\n          return element.parent;\n        });\n      }));\n\n\n      it('should not distribute boundary events', inject(function(distributeElements, elementRegistry) {\n\n        // given\n        var boundaryEvent = elementRegistry.get('BoundaryEvent_1');\n\n        // when\n        var rangeGroups = distributeElements.trigger(elements, 'horizontal');\n\n        // then\n        expect(rangeGroups).to.have.length(3);\n\n        forEach(rangeGroups, function(rangeGroup) {\n          expect(rangeGroup.elements).not.to.include(boundaryEvent);\n        });\n      }));\n\n\n      it('should not distribute sub process children', inject(\n        function(distributeElements, elementRegistry) {\n\n          // given\n          var childElement = elementRegistry.get('SubProcessChild');\n\n          // when\n          var rangeGroups = distributeElements.trigger(elements, 'horizontal');\n\n          // then\n          expect(rangeGroups).to.have.length(3);\n\n          forEach(rangeGroups, function(rangeGroup) {\n            expect(rangeGroup.elements).not.to.include(childElement);\n          });\n        })\n      );\n    });\n\n\n    describe('collaboration', function() {\n\n      var xml = require('../../../fixtures/bpmn/distribute-elements-filtering.collaboration.bpmn'),\n          elements;\n\n      beforeEach(bootstrapModeler(xml, { modules: testModules }));\n\n\n      beforeEach(inject(function(elementRegistry) {\n        elements = elementRegistry.filter(function(element) {\n          return element.parent;\n        });\n      }));\n\n\n      it('should distribute participants', inject(function(distributeElements, elementRegistry) {\n\n        // given\n        var participants = elementRegistry.filter(function(element) {\n          return is(element, 'bpmn:Participant');\n        });\n\n        // when\n        var rangeGroups = distributeElements.trigger(elements, 'vertical');\n\n        // then\n        expect(rangeGroups).to.have.length(3);\n\n        var distributedElements = [];\n\n        forEach(rangeGroups, function(rangeGroup) {\n          distributedElements = distributedElements.concat(rangeGroup.elements);\n        });\n\n        expect(distributedElements).to.have.length(3);\n        expect(distributedElements).to.have.members(participants);\n      }));\n    });\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/distribute-elements/DistributeElementsMenuProviderSpec.js",
    "content": "import {\n  bootstrapModeler,\n  getBpmnJS,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  query as domQuery\n} from 'min-dom';\n\nimport {\n  forEach\n} from 'min-dash';\n\nimport distributeElementsModule from 'lib/features/distribute-elements';\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/distribute-elements - popup menu', function() {\n\n  var testModules = [ distributeElementsModule, modelingModule, coreModule ];\n\n  var basicXML = require('../../../fixtures/bpmn/distribute-elements.bpmn');\n\n  beforeEach(bootstrapModeler(basicXML, { modules: testModules }));\n\n\n  it('should provide distribution buttons', inject(function(elementRegistry, popupMenu) {\n\n    // given\n    var elements = [\n      elementRegistry.get('ExclusiveGateway_10cec0a'),\n      elementRegistry.get('Task_08pns8h'),\n      elementRegistry.get('Task_0511uak'),\n      elementRegistry.get('EndEvent_0c9irey')\n    ];\n\n    // when\n    popupMenu.open(elements, 'align-elements', {\n      x: 0,\n      y: 0\n    });\n\n    // then\n    forEach([\n      'horizontal',\n      'vertical'\n    ], function(distribution) {\n      expect(getEntry('distribute-elements-' + distribution)).to.exist;\n    });\n  }));\n\n  forEach([\n    'horizontal',\n    'vertical'\n  ], function(distribution) {\n    it('should close popup menu when button is clicked', inject(\n      function(elementRegistry, popupMenu) {\n\n        // given\n        var elements = [\n          elementRegistry.get('ExclusiveGateway_10cec0a'),\n          elementRegistry.get('Task_08pns8h'),\n          elementRegistry.get('Task_0511uak'),\n          elementRegistry.get('EndEvent_0c9irey')\n        ];\n        popupMenu.open(elements, 'align-elements', {\n          x: 0,\n          y: 0\n        });\n        var entry = getEntry('distribute-elements-' + distribution);\n\n        // when\n        entry.click();\n\n        // then\n        expect(popupMenu.isOpen()).to.be.false;\n      })\n    );\n  });\n\n});\n\n\n// helper //////////////////////////////////////////////////////////////////////\nfunction getEntry(actionName) {\n  return padEntry(getBpmnJS().invoke(function(popupMenu) {\n    return popupMenu._current.container;\n  }), actionName);\n}\n\nfunction padEntry(element, name) {\n  return domQuery('[data-id=\"' + name + '\"]', element);\n}\n"
  },
  {
    "path": "test/spec/features/drilldown/DrilldownIntegrationSpec.js",
    "content": "import {\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\nimport DrilldownModule from 'lib/features/drilldown';\nimport { bootstrapModeler, getBpmnJS } from '../../../helper';\n\n\ndescribe('features - drilldown', function() {\n\n  var testModules = [\n    coreModule,\n    modelingModule,\n    DrilldownModule\n  ];\n\n  var multiLayerXML = require('./nested-subprocesses.bpmn');\n\n  beforeEach(bootstrapModeler(multiLayerXML, { modules: testModules }));\n\n  describe('navigation - collaboration', function() {\n\n    var process, participant;\n\n    beforeEach(inject(function(canvas, elementFactory) {\n      process = canvas.getRootElement();\n      participant = elementFactory.createParticipantShape({ x: 100, y: 100 });\n    }));\n\n\n    it('should not reset scroll on create collaboration',\n      inject(function(canvas, modeling) {\n\n        // given\n        canvas.scroll({ dx: 500, dy: 500 });\n        canvas.zoom(0.5);\n        var zoomedAndScrolledViewbox = canvas.viewbox();\n\n        // when\n        modeling.createShape(participant, { x: 0, y: 0 }, process);\n\n\n        // then\n        expectViewbox(zoomedAndScrolledViewbox);\n      })\n    );\n\n\n    it('should not reset scroll on create collaboration - undo',\n      inject(function(canvas, modeling, commandStack) {\n\n        // given\n        canvas.scroll({ dx: 500, dy: 500 });\n        canvas.zoom(0.5);\n        var zoomedAndScrolledViewbox = canvas.viewbox();\n\n        // when\n        modeling.createShape(participant, { x: 0, y: 0 }, process);\n        commandStack.undo();\n\n        // then\n        expectViewbox(zoomedAndScrolledViewbox);\n      })\n    );\n\n\n    it('should not reset scroll on create collaboration - redo',\n      inject(function(canvas, modeling, commandStack) {\n\n        // given\n        canvas.scroll({ dx: 500, dy: 500 });\n        canvas.zoom(0.5);\n        var zoomedAndScrolledViewbox = canvas.viewbox();\n\n        // when\n        modeling.createShape(participant, { x: 400, y: 225 }, process);\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expectViewbox(zoomedAndScrolledViewbox);\n      })\n    );\n\n\n    it('should remember scroll and zoom after switching planes', inject(function(canvas, modeling) {\n\n      // given\n      canvas.scroll({ dx: 500, dy: 500 });\n      canvas.zoom(0.5);\n      var zoomedAndScrolledViewbox = canvas.viewbox();\n\n      modeling.createShape(participant, { x: 400, y: 225 }, process);\n      var collaboration = canvas.getRootElement();\n\n      // when\n      canvas.setRootElement(canvas.findRoot('collapsedProcess_plane'));\n      canvas.setRootElement(collaboration);\n\n      // then\n      var newViewbox = canvas.viewbox();\n      expect(newViewbox.x).to.eql(zoomedAndScrolledViewbox.x);\n      expect(newViewbox.y).to.eql(zoomedAndScrolledViewbox.y);\n      expect(newViewbox.scale).to.eql(zoomedAndScrolledViewbox.scale);\n    }));\n\n  });\n\n\n  describe('breadcrumbs - name changes', function() {\n\n    it('should update on plane name change',\n      inject(function(canvas, modeling) {\n\n        // given\n        canvas.setRootElement(canvas.findRoot('collapsedProcess_2_plane'));\n\n        // when\n        modeling.updateProperties(canvas.getRootElement(), { name: 'new name' });\n\n        // then\n        expectBreadcrumbs([\n          'Root',\n          'Collapsed Process',\n          'Expanded Process',\n          'new name'\n        ]);\n      })\n    );\n\n\n    it('should update on element name change',\n      inject(function(canvas, elementRegistry, modeling) {\n\n        // given\n        canvas.setRootElement(canvas.findRoot('collapsedProcess_2_plane'));\n        var shape = elementRegistry.get('collapsedProcess_2');\n\n        // when\n        modeling.updateProperties(shape, { name: 'new name' });\n\n        // then\n        expectBreadcrumbs([\n          'Root',\n          'Collapsed Process',\n          'Expanded Process',\n          'new name'\n        ]);\n      })\n    );\n\n\n    it('should update on process name change',\n      inject(function(canvas, elementRegistry, modeling) {\n\n        // given\n        canvas.setRootElement(canvas.findRoot('collapsedProcess_2_plane'));\n        var shape = elementRegistry.get('rootProcess');\n\n        // when\n        modeling.updateProperties(shape, { name: 'new name' });\n\n        // then\n        expectBreadcrumbs([\n          'new name',\n          'Collapsed Process',\n          'Expanded Process',\n          'Collapsed Process 2'\n        ]);\n      })\n    );\n\n  });\n\n});\n\n\n// helpers //////////\n\nfunction expectViewbox(expectedViewbox) {\n  return getBpmnJS().invoke(function(canvas) {\n\n    var viewbox = canvas.viewbox();\n\n    expect(viewbox.x).to.eql(expectedViewbox.x);\n    expect(viewbox.y).to.eql(expectedViewbox.y);\n    expect(viewbox.scale).to.eql(expectedViewbox.scale);\n  });\n}\n\nfunction getBreadcrumbs() {\n  return getBpmnJS().invoke(function(canvas) {\n    return canvas.getContainer().querySelector('.bjs-breadcrumbs');\n  });\n}\n\nfunction expectBreadcrumbs(expected) {\n  var breadcrumbs = getBreadcrumbs();\n\n  var crumbs = Array.from(breadcrumbs.children).map(function(element) {\n    return element.innerText;\n  });\n\n  expect(crumbs).to.eql(expected);\n}"
  },
  {
    "path": "test/spec/features/drilldown/DrilldownOverlayBehaviorSpec.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_007va6i\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.2.0-dev\">\n  <bpmn:process id=\"Process_1giw3j5\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"Subprocess_with_content\">\n      <bpmn:startEvent id=\"StartEvent_embedded\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"Subprocess_empty\" />\n    <bpmn:subProcess id=\"Subprocess_expanded\">\n      <bpmn:startEvent id=\"Event_14hgp9z\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1giw3j5\">\n      <bpmndi:BPMNShape id=\"Activity_175iapo_di\" bpmnElement=\"Subprocess_with_content\">\n        <dc:Bounds x=\"300\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1vrbgo0_di\" bpmnElement=\"Subprocess_empty\">\n        <dc:Bounds x=\"140\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Subprocess_expanded_di\" bpmnElement=\"Subprocess_expanded\" isExpanded=\"true\">\n        <dc:Bounds x=\"140\" y=\"220\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_14hgp9z_di\" bpmnElement=\"Event_14hgp9z\">\n        <dc:Bounds x=\"180\" y=\"302\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1widlc2\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0epf6vs\" bpmnElement=\"Subprocess_with_content\">\n      <bpmndi:BPMNShape id=\"StartEvent_embedded_di\" bpmnElement=\"StartEvent_embedded\">\n        <dc:Bounds x=\"132\" y=\"112\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1res3mc\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0iznbzu\" bpmnElement=\"Subprocess_empty\" />\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>"
  },
  {
    "path": "test/spec/features/drilldown/DrilldownOverlaysBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\nimport replaceModule from 'lib/features/replace';\nimport drilldownModule from 'lib/features/drilldown';\nimport { classes } from 'min-dom';\n\ndescribe('features/modeling/behavior - subprocess planes', function() {\n\n  var diagramXML = require('./DrilldownOverlayBehaviorSpec.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: [\n      coreModule,\n      modelingModule,\n      replaceModule,\n      drilldownModule\n    ]\n  }));\n\n\n  describe('create new drilldowns', function() {\n\n    it('should create drilldown for new process',\n      inject(function(elementFactory, modeling, canvas, overlays) {\n\n        // given\n        var subProcess = elementFactory.createShape({\n          type: 'bpmn:SubProcess',\n          isExpanded: false\n        });\n\n        // when\n        modeling.createShape(subProcess, { x: 300, y: 300 }, canvas.getRootElement());\n\n        // then\n        var elementOverlays = overlays.get({ element: subProcess });\n        expect(elementOverlays).to.not.be.empty;\n\n      })\n    );\n\n\n    it('should not create drilldown for expanded subprocess',\n      inject(function(elementFactory, modeling, canvas, overlays) {\n\n        // given\n        var subProcess = elementFactory.createShape({\n          type: 'bpmn:SubProcess',\n          isExpanded: true\n        });\n\n        // when\n        modeling.createShape(subProcess, { x: 300, y: 300 }, canvas.getRootElement());\n\n        // then\n        var elementOverlays = overlays.get({ element: subProcess });\n        expect(elementOverlays).to.be.empty;\n      })\n    );\n\n\n    it('should undo',\n      inject(function(elementFactory, modeling, commandStack, canvas, overlays) {\n\n        // given\n        var subProcess = elementFactory.createShape({\n          type: 'bpmn:SubProcess',\n          isExpanded: false\n        });\n        modeling.createShape(subProcess, { x: 300, y: 300 }, canvas.getRootElement());\n\n        // when\n        commandStack.undo();\n\n        // then\n        var elementOverlays = overlays.get({ element: subProcess });\n        expect(elementOverlays).to.be.empty;\n      })\n    );\n\n\n    it('should redo',\n      inject(function(elementFactory, modeling, commandStack, canvas, overlays) {\n\n        // given\n        var subProcess = elementFactory.createShape({\n          type: 'bpmn:SubProcess',\n          isExpanded: false\n        });\n        modeling.createShape(subProcess, { x: 300, y: 300 }, canvas.getRootElement());\n\n        // when\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        var elementOverlays = overlays.get({ element: subProcess });\n        expect(elementOverlays).to.not.be.empty;\n      })\n    );\n\n\n    it('should recreate drilldown on undo delete',\n      inject(function(elementRegistry, modeling, commandStack, overlays) {\n\n        // given\n        var subProcess = elementRegistry.get('Subprocess_with_content');\n        modeling.removeShape(subProcess);\n\n        // when\n        commandStack.undo();\n\n        // then\n        var elementOverlays = overlays.get({ element: subProcess });\n        expect(elementOverlays).to.not.be.empty;\n\n      })\n    );\n\n  });\n\n\n  describe('overlay visibility', function() {\n\n    describe('empty subprocess', function() {\n\n      it('should hide drilldown', inject(function(elementRegistry, overlays) {\n\n        // given\n        var subProcess = elementRegistry.get('Subprocess_empty');\n\n        // then\n        var overlay = overlays.get({ element: subProcess })[0];\n\n        expect(classes(overlay.html).contains('bjs-drilldown-empty')).to.be.true;\n      }));\n\n\n      it('should show when content is added',\n        inject(function(elementRegistry, overlays, elementFactory, modeling, canvas) {\n\n          // given\n          var subProcess = elementRegistry.get('Subprocess_empty');\n          var task = elementFactory.createShape({ type: 'bpmn:Task' });\n          var planeRoot = canvas.findRoot('Subprocess_empty_plane');\n\n          // when\n          modeling.createShape(task, { x: 300, y: 300 }, planeRoot);\n\n          // then\n          var overlay = overlays.get({ element: subProcess })[0];\n\n          expect(classes(overlay.html).contains('bjs-drilldown-empty')).to.be.false;\n        })\n      );\n\n\n      it('should undo',\n        inject(function(elementRegistry, overlays, elementFactory,\n            modeling, canvas, commandStack) {\n\n          // given\n          var subProcess = elementRegistry.get('Subprocess_empty');\n          var task = elementFactory.createShape({ type: 'bpmn:Task' });\n          var planeRoot = canvas.findRoot('Subprocess_empty_plane');\n\n          modeling.createShape(task, { x: 300, y: 300 }, planeRoot);\n\n          // when\n          commandStack.undo();\n\n          // then\n          var overlay = overlays.get({ element: subProcess })[0];\n\n          expect(classes(overlay.html).contains('bjs-drilldown-empty')).to.be.true;\n        })\n      );\n\n\n      it('should redo',\n        inject(function(elementRegistry, overlays, elementFactory,\n            modeling, canvas, commandStack) {\n\n          // given\n          var subProcess = elementRegistry.get('Subprocess_empty');\n          var task = elementFactory.createShape({ type: 'bpmn:Task' });\n          var planeRoot = canvas.findRoot('Subprocess_empty_plane');\n          modeling.createShape(task, { x: 300, y: 300 }, planeRoot);\n\n          // when\n          commandStack.undo();\n          commandStack.redo();\n\n          // then\n          var overlay = overlays.get({ element: subProcess })[0];\n\n          expect(classes(overlay.html).contains('bjs-drilldown-empty')).to.be.false;\n        })\n      );\n\n    });\n\n\n    describe('subprocess with content', function() {\n\n      it('should show drilldown', inject(function(elementRegistry, overlays) {\n\n        // given\n        var subProcess = elementRegistry.get('Subprocess_with_content');\n\n        // then\n        var overlay = overlays.get({ element: subProcess })[0];\n\n        expect(classes(overlay.html).contains('bjs-drilldown-empty')).to.be.false;\n      }));\n\n\n      it('should hide when content is removed',\n        inject(function(elementRegistry, overlays, modeling) {\n\n          // given\n          var subProcess = elementRegistry.get('Subprocess_with_content');\n          var startEvent = elementRegistry.get('StartEvent_embedded');\n\n          // when\n          modeling.removeShape(startEvent);\n\n          // then\n          var overlay = overlays.get({ element: subProcess })[0];\n\n          expect(classes(overlay.html).contains('bjs-drilldown-empty')).to.be.true;\n        })\n      );\n\n\n      it('should undo',\n        inject(function(elementRegistry, overlays, modeling, commandStack) {\n\n          // given\n          var subProcess = elementRegistry.get('Subprocess_with_content');\n          var startEvent = elementRegistry.get('StartEvent_embedded');\n          modeling.removeShape(startEvent);\n\n          // when\n          commandStack.undo();\n\n          // then\n          var overlay = overlays.get({ element: subProcess })[0];\n\n          expect(classes(overlay.html).contains('bjs-drilldown-empty')).to.be.false;\n        })\n      );\n\n\n      it('should redo',\n        inject(function(elementRegistry, overlays, modeling, commandStack) {\n\n          // given\n          var subProcess = elementRegistry.get('Subprocess_with_content');\n          var startEvent = elementRegistry.get('StartEvent_embedded');\n          modeling.removeShape(startEvent);\n\n          // when\n          commandStack.undo();\n          commandStack.redo();\n\n          // then\n          var overlay = overlays.get({ element: subProcess })[0];\n\n          expect(classes(overlay.html).contains('bjs-drilldown-empty')).to.be.true;\n        })\n      );\n\n    });\n\n  });\n\n\n  describe('expand/collapse', function() {\n\n    describe('collapse', function() {\n\n      it('should create new overlay on collapse',\n        inject(function(elementRegistry, modeling, canvas, overlays) {\n\n          // given\n          var subProcess = elementRegistry.get('Subprocess_expanded');\n\n          // when\n          modeling.toggleCollapse(subProcess);\n\n          // then\n          var elementOverlays = overlays.get({ element: subProcess });\n          expect(elementOverlays).to.not.be.empty;\n        }));\n\n\n      it('should undo',\n        inject(function(elementRegistry, modeling, overlays, commandStack) {\n\n          // given\n          var subProcess = elementRegistry.get('Subprocess_expanded');\n          modeling.toggleCollapse(subProcess);\n\n          // when\n          commandStack.undo();\n\n          // then\n          var elementOverlays = overlays.get({ element: subProcess });\n          expect(elementOverlays).to.be.empty;\n        }));\n\n\n      it('should redo',\n        inject(function(elementRegistry, modeling, overlays, commandStack) {\n\n          // given\n          var subProcess = elementRegistry.get('Subprocess_expanded');\n          modeling.toggleCollapse(subProcess);\n\n          // when\n          commandStack.undo();\n          commandStack.redo();\n\n          // then\n          var elementOverlays = overlays.get({ element: subProcess });\n          expect(elementOverlays).to.not.be.empty;\n        }));\n\n    });\n\n\n    describe('expand', function() {\n\n      it('should remove overlay on expand',\n        inject(function(elementRegistry, modeling, overlays) {\n\n          // given\n          var subProcess = elementRegistry.get('Subprocess_with_content');\n\n          // when\n          modeling.toggleCollapse(subProcess);\n\n          // then\n          var elementOverlays = overlays.get({ element: subProcess });\n          expect(elementOverlays).to.be.empty;\n        }));\n\n\n      it('should undo',\n        inject(function(elementRegistry, modeling, overlays, commandStack) {\n\n          // given\n          var subProcess = elementRegistry.get('Subprocess_with_content');\n          modeling.toggleCollapse(subProcess);\n\n          // when\n          commandStack.undo();\n\n          // then\n          var elementOverlays = overlays.get({ element: subProcess });\n          expect(elementOverlays).to.not.empty;\n        }));\n\n\n      it('should redo',\n        inject(function(elementRegistry, modeling, overlays, commandStack) {\n\n          // given\n          var subProcess = elementRegistry.get('Subprocess_with_content');\n          modeling.toggleCollapse(subProcess);\n\n          // when\n          commandStack.undo();\n          commandStack.redo();\n\n          // then\n          var elementOverlays = overlays.get({ element: subProcess });\n          expect(elementOverlays).to.be.empty;\n        }));\n\n    });\n\n  });\n\n\n  it('should only show one overlay', inject(function(elementRegistry, overlays, modeling) {\n\n    // given\n    var filledSubProcess = elementRegistry.get('Subprocess_with_content');\n    var emptySubProcessPlane = elementRegistry.get('Subprocess_empty_plane');\n\n    // when\n    modeling.moveShape(filledSubProcess, { x: 0, y: 0 }, emptySubProcessPlane);\n\n    // then\n    var elementOverlays = overlays.get({ element: filledSubProcess });\n    expect(elementOverlays).to.have.lengthOf(1);\n  }));\n\n});\n"
  },
  {
    "path": "test/spec/features/drilldown/DrilldownSpec.js",
    "content": "import { expectToBeAccessible } from '@bpmn-io/a11y';\n\nimport {\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport drilldownModule from 'lib/features/drilldown';\nimport modelingModule from 'lib/features/modeling';\nimport { bootstrapModeler, getBpmnJS } from '../../../helper';\nimport { classes } from 'min-dom';\n\n\ndescribe('features - drilldown', function() {\n\n  var testModules = [\n    coreModule,\n    modelingModule,\n    drilldownModule\n  ];\n\n  var collaborationXML = require('./collaboration-subprocesses.bpmn');\n  var multiLayerXML = require('./nested-subprocesses.bpmn');\n  var legacyXML = require('./legacy-subprocesses.bpmn');\n\n  beforeEach(bootstrapModeler(multiLayerXML, { modules: testModules }));\n\n\n  describe('Overlays', function() {\n\n    it('should show overlay on Subprocess with content', inject(function(elementRegistry, overlays) {\n\n      // given\n      var collapsedProcess = elementRegistry.get('collapsedProcess');\n      var overlay = overlays.get({ element: collapsedProcess });\n\n      // then\n      expect(overlay).to.exist;\n    }));\n\n\n    it('should not show overlay on Subprocess without content', inject(function(elementRegistry, overlays) {\n\n      // given\n      var collapsedProcess = elementRegistry.get('collapsedProcess_withoutContent');\n      var overlay = overlays.get({ element: collapsedProcess });\n\n      // then\n      expect(overlay).to.not.exist;\n    }));\n\n\n    it('should switch plane on click', inject(function(elementRegistry, overlays, canvas) {\n\n      // given\n      var collapsedProcess = elementRegistry.get('collapsedProcess');\n      var overlay = overlays.get({ element: collapsedProcess })[0];\n\n      // when\n      overlay.html.click();\n\n      // then\n      var collapsedRoot = canvas.getRootElement();\n\n      expect(collapsedRoot.businessObject).to.equal(collapsedProcess.businessObject);\n    }));\n\n  });\n\n\n  describe('Breadcrumbs', function() {\n\n    it('should not show breadcrumbs in root view', inject(function(canvas) {\n\n      // given\n      var container = canvas.getContainer();\n\n      // then\n      expect(classes(container).contains('bjs-breadcrumbs-shown')).to.be.false;\n    }));\n\n\n    it('should show breadcrumbs in subprocess view', inject(function(canvas) {\n\n      // given\n      var container = canvas.getContainer();\n\n      // when\n      canvas.setRootElement(canvas.findRoot('collapsedProcess_plane'));\n\n      // then\n      expect(classes(container).contains('bjs-breadcrumbs-shown')).to.be.true;\n    }));\n\n\n    it('should show execution tree', inject(function(canvas) {\n\n      // when\n      canvas.setRootElement(canvas.findRoot('collapsedProcess_2_plane'));\n\n      // then\n      expectBreadcrumbs([\n        'Root',\n        'Collapsed Process',\n        'Expanded Process',\n        'Collapsed Process 2'\n      ]);\n    }));\n\n\n    it('should switch to process plane on click', inject(function(canvas) {\n\n      // given\n      var subRoot = canvas.findRoot('collapsedProcess_plane');\n      var nestedRoot = canvas.findRoot('collapsedProcess_2_plane');\n\n      canvas.setRootElement(nestedRoot);\n\n      // when\n      clickBreadcrumb(1);\n\n      // then\n      expectBreadcrumbs([\n        'Root',\n        'Collapsed Process'\n      ]);\n\n      expect(\n        canvas.getRootElement()\n      ).to.equal(subRoot);\n    }));\n\n\n    it('should switch to root', inject(function(canvas) {\n\n      // given\n      var processRoot = canvas.findRoot('rootProcess');\n      var nestedRoot = canvas.findRoot('collapsedProcess_2_plane');\n\n      canvas.setRootElement(nestedRoot);\n\n      // when\n      clickBreadcrumb(0);\n\n      // then\n      expectBreadcrumbs([\n        'Root'\n      ]);\n\n      expect(\n        canvas.getRootElement()\n      ).to.equal(processRoot);\n    }));\n\n\n    it('should switch to containing process plane on embedded click', inject(function(canvas) {\n\n      // given\n      var subRoot = canvas.findRoot('collapsedProcess_plane');\n      var nestedRoot = canvas.findRoot('collapsedProcess_2_plane');\n\n      canvas.setRootElement(nestedRoot);\n\n      // when\n      clickBreadcrumb(2);\n\n      // then\n      expectBreadcrumbs([\n        'Root',\n        'Collapsed Process'\n      ]);\n\n      expect(\n        canvas.getRootElement()\n      ).to.equal(subRoot);\n    }));\n\n  });\n\n\n  describe('Navigation', function() {\n\n    it('should reset scroll and zoom', inject(function(canvas) {\n\n      // given\n      canvas.scroll({ dx: 500, dy: 500 });\n      canvas.zoom(0.5);\n\n      // when\n      canvas.setRootElement(canvas.findRoot('collapsedProcess_plane'));\n\n      // then\n      expectViewbox({\n        x: 0,\n        y: 0,\n        scale: 1\n      });\n    }));\n\n\n    it('should remember scroll and zoom', inject(function(canvas) {\n\n      // given\n      var rootRoot = canvas.getRootElement();\n      var planeRoot = canvas.findRoot('collapsedProcess_plane');\n\n      canvas.scroll({ dx: 500, dy: 500 });\n      canvas.zoom(0.5);\n\n      var rootViewbox = canvas.viewbox();\n\n      canvas.setRootElement(planeRoot);\n      canvas.scroll({ dx: 100, dy: 100 });\n\n      var planeViewbox = canvas.viewbox();\n\n      // when\n      canvas.setRootElement(rootRoot);\n\n      // then\n      expectViewbox(rootViewbox);\n\n      // but when\n      canvas.setRootElement(planeRoot);\n\n      // then\n      expectViewbox(planeViewbox);\n    }));\n\n\n    it('should not reset viewbox on root change', inject(function(canvas, modeling) {\n\n      // given\n      canvas.scroll({ dx: 500, dy: 500 });\n      canvas.zoom(0.5);\n      var zoomedAndScrolledViewbox = canvas.viewbox();\n\n      // when\n      modeling.makeCollaboration();\n\n      // then\n      expectViewbox(zoomedAndScrolledViewbox);\n    }));\n\n    // helpers //////////\n\n    function expectViewbox(expectedViewbox) {\n      return getBpmnJS().invoke(function(canvas) {\n\n        var viewbox = canvas.viewbox();\n\n        expect(viewbox.x).to.eql(expectedViewbox.x);\n        expect(viewbox.y).to.eql(expectedViewbox.y);\n        expect(viewbox.scale).to.eql(expectedViewbox.scale);\n      });\n    }\n\n  });\n\n\n  describe('Collaboration', function() {\n\n    beforeEach(bootstrapModeler(collaborationXML, { modules: testModules }));\n\n    describe('Overlays', function() {\n\n      it('should show overlay', inject(function(elementRegistry, overlays) {\n\n        // given\n        var collapsedProcess = elementRegistry.get('collapsedProcess');\n        var overlay = overlays.get({ element: collapsedProcess });\n\n        // then\n        expect(overlay).to.exist;\n      }));\n\n\n      it('should switch plane on click', inject(function(elementRegistry, overlays, canvas) {\n\n        // given\n        var collapsedProcess = elementRegistry.get('collapsedProcess');\n        var overlay = overlays.get({ element: collapsedProcess })[0];\n\n        // when\n        overlay.html.click();\n\n        // then\n        var collapsedRoot = canvas.getRootElement();\n\n        expect(collapsedRoot.businessObject).to.equal(collapsedProcess.businessObject);\n      }));\n\n    });\n\n\n    describe('Breadcrumbs', function() {\n\n      it('should not show breadcrumbs in root view', inject(function(canvas) {\n\n        // given\n        var container = canvas.getContainer();\n\n        // then\n        expect(classes(container).contains('bjs-breadcrumbs-shown')).to.be.false;\n      }));\n\n\n      it('should show breadcrumbs in subprocess view', inject(function(canvas) {\n\n        // given\n        var container = canvas.getContainer();\n\n        // when\n        canvas.setRootElement(canvas.findRoot('collapsedProcess_plane'));\n\n        // then\n        expect(classes(container).contains('bjs-breadcrumbs-shown')).to.be.true;\n      }));\n\n\n      it('should show execution tree', inject(function(canvas) {\n\n        // when\n        canvas.setRootElement(canvas.findRoot('collapsedProcess_2_plane'));\n\n        // then\n        expectBreadcrumbs([\n          'Root',\n          'Collapsed Process',\n          'Expanded Process',\n          'Collapsed Process 2'\n        ]);\n      }));\n\n\n      it('should switch to process plane on click', inject(function(canvas) {\n\n        // given\n        var subRoot = canvas.findRoot('collapsedProcess_plane');\n        var nestedRoot = canvas.findRoot('collapsedProcess_2_plane');\n\n        canvas.setRootElement(nestedRoot);\n\n        // when\n        clickBreadcrumb(1);\n\n        // then\n        expectBreadcrumbs([\n          'Root',\n          'Collapsed Process'\n        ]);\n\n        expect(\n          canvas.getRootElement()\n        ).to.equal(subRoot);\n      }));\n\n\n      it('should switch to root', inject(function(canvas) {\n\n        // given\n        var collaboration = canvas.findRoot('Collaboration_0wnumpk');\n        var nestedRoot = canvas.findRoot('collapsedProcess_2_plane');\n\n        canvas.setRootElement(nestedRoot);\n\n        // when\n        clickBreadcrumb(0);\n\n        expect(\n          canvas.getRootElement()\n        ).to.equal(collaboration);\n      }));\n\n\n      it('should switch to containing process plane on embedded click', inject(function(canvas) {\n\n        // given\n        var subRoot = canvas.findRoot('collapsedProcess_plane');\n        var nestedRoot = canvas.findRoot('collapsedProcess_2_plane');\n\n        canvas.setRootElement(nestedRoot);\n\n        // when\n        clickBreadcrumb(2);\n\n        // then\n        expectBreadcrumbs([\n          'Root',\n          'Collapsed Process'\n        ]);\n\n        expect(\n          canvas.getRootElement()\n        ).to.equal(subRoot);\n      }));\n\n    });\n\n\n    describe('Navigation', function() {\n\n      it('should reset scroll and zoom', inject(function(canvas) {\n\n        // given\n        canvas.scroll({ dx: 500, dy: 500 });\n        canvas.zoom(0.5);\n\n        // when\n        canvas.setRootElement(canvas.findRoot('collapsedProcess_plane'));\n\n        // then\n        expectViewbox({\n          x: 0,\n          y: 0,\n          scale: 1\n        });\n      }));\n\n\n      it('should remember scroll and zoom', inject(function(canvas) {\n\n        // given\n        var rootRoot = canvas.getRootElement();\n        var planeRoot = canvas.findRoot('collapsedProcess_plane');\n\n        canvas.scroll({ dx: 500, dy: 500 });\n        canvas.zoom(0.5);\n\n        var rootViewbox = canvas.viewbox();\n\n        canvas.setRootElement(planeRoot);\n        canvas.scroll({ dx: 100, dy: 100 });\n\n        var planeViewbox = canvas.viewbox();\n\n        // when\n        canvas.setRootElement(rootRoot);\n\n        // then\n        expectViewbox(rootViewbox);\n\n        // but when\n        canvas.setRootElement(planeRoot);\n\n        // then\n        expectViewbox(planeViewbox);\n      }));\n\n\n      it('should not reset viewbox on root change', inject(function(canvas, modeling) {\n\n        // given\n        canvas.scroll({ dx: 500, dy: 500 });\n        canvas.zoom(0.5);\n        var zoomedAndScrolledViewbox = canvas.viewbox();\n\n        // when\n        modeling.makeProcess();\n\n        // then\n        expectViewbox(zoomedAndScrolledViewbox);\n\n      }));\n\n      // helpers //////////\n\n      function expectViewbox(expectedViewbox) {\n        return getBpmnJS().invoke(function(canvas) {\n\n          var viewbox = canvas.viewbox();\n\n          expect(viewbox.x).to.eql(expectedViewbox.x);\n          expect(viewbox.y).to.eql(expectedViewbox.y);\n          expect(viewbox.scale).to.eql(expectedViewbox.scale);\n        });\n      }\n\n    });\n\n  });\n\n\n  describe('features - drilldown - Legacy Processes', function() {\n\n    beforeEach(bootstrapModeler(legacyXML, { modules: testModules }));\n\n    it('should import collapsed subprocess', inject(function(canvas) {\n\n      // when\n      var inlineProcess1 = canvas.findRoot('inlineSubprocess_plane');\n      var inlineProcess2 = canvas.findRoot('inlineSubprocess_2_plane');\n\n      // then\n      expect(inlineProcess1).to.exist;\n      expect(inlineProcess2).to.exist;\n    }));\n\n\n    it('should import data associations on subprocess', inject(function(elementRegistry) {\n\n      // when\n      var dataInputAssociation = elementRegistry.get('DataInputAssociation_1');\n      var dataOutputAssociation = elementRegistry.get('DataOutputAssociation_1');\n\n      // then\n      expect(dataInputAssociation).to.exist;\n      expect(dataOutputAssociation).to.exist;\n    }));\n\n\n    it('should move inlined elements to sensible position', inject(function(elementRegistry) {\n\n      // when\n      var startEvent = elementRegistry.get('subprocess_startEvent');\n\n      // then\n      expect(startEvent).to.exist;\n      expect(startEvent.x).to.equal(180);\n      expect(startEvent.y).to.equal(160);\n    }));\n\n\n    it('should create new planes for empty processes', inject(function(canvas) {\n\n      // when\n      var emptyRoot = canvas.findRoot('emptyProcess_plane');\n\n      // then\n      expect(emptyRoot).to.exist;\n    }));\n\n  });\n\n\n  describe('a11y', function() {\n\n    it('should report no violations', inject(async function(canvas) {\n\n      // given\n      const container = canvas.getContainer();\n\n      // then\n      await expectToBeAccessible(container);\n    }));\n  });\n});\n\n\ndescribe('features/drilldown - integration', function() {\n\n  var testModules = [\n    coreModule,\n    modelingModule,\n    drilldownModule\n  ];\n\n  var workingXML = require('./nested-subprocesses.bpmn');\n\n  beforeEach(bootstrapModeler(workingXML, { modules: testModules }));\n\n\n  describe('error handling - should handle broken DI', function() {\n\n    const subprocessMissingDi_XML = require('./subprocess-missing-di.bpmn');\n    const subprocessMissingBpmnDiagram_XML = require('./subprocess-missing-bpmndiagram.bpmn');\n    const processMissingBpmnDiagram_XML = require('./process-missing-bpmndiagram.bpmn');\n\n    const planeMissingBpmnElement_XML = require('./plane-missing-bpmnelement.bpmn');\n    const diagramMissingPlane_XML = require('./diagram-missing-plane.bpmn');\n\n\n    async function importXML(xml) {\n      const bpmnJS = getBpmnJS();\n\n      let result;\n\n      try {\n        result = await bpmnJS.importXML(xml);\n      } catch (error) {\n        result = {\n          error,\n          warnings: error.warnings\n        };\n      }\n\n      return result;\n    }\n\n\n    it('no <bpmndi:BPMNDiagram#plane />', async function() {\n\n      const {\n        error,\n        warnings\n      } = await importXML(diagramMissingPlane_XML);\n\n      // then\n      expect(error).not.to.exist;\n      expect(warnings).to.be.empty;\n    });\n\n\n    it('no <bpmndi:BPMNPlane#bpmnElement />', async function() {\n\n      const {\n        error,\n        warnings\n      } = await importXML(planeMissingBpmnElement_XML);\n\n      // then\n      expect(error).not.to.exist;\n      expect(warnings).to.be.empty;\n    });\n\n\n    it('no <bpmndi:BPMNShape /> for sub process', async function() {\n\n      const {\n        error,\n        warnings\n      } = await importXML(subprocessMissingDi_XML);\n\n      // then\n      expect(error).not.to.exist;\n      expect(warnings).to.be.empty;\n    });\n\n\n    it('no <bpmndi:BPMNDiagram /> for sub process', async function() {\n\n      const {\n        error,\n        warnings\n      } = await importXML(subprocessMissingBpmnDiagram_XML);\n\n      // then\n      expect(error).not.to.exist;\n      expect(warnings).to.be.empty;\n    });\n\n\n    it('no <bpmndi:BPMNDiagram /> for process', async function() {\n\n      const {\n        error,\n        warnings\n      } = await importXML(processMissingBpmnDiagram_XML);\n\n      // then\n      expect(error).not.to.exist;\n      expect(warnings).to.be.empty;\n    });\n  });\n\n});\n\n\n// helpers\n\nfunction getBreadcrumbs() {\n  return getBpmnJS().invoke(function(canvas) {\n    return canvas.getContainer().querySelector('.bjs-breadcrumbs');\n  });\n}\n\nfunction expectBreadcrumbs(expected) {\n  var breadcrumbs = getBreadcrumbs();\n\n  var crumbs = Array.from(breadcrumbs.children).map(function(element) {\n    return element.innerText;\n  });\n\n  expect(crumbs).to.eql(expected);\n}\n\nfunction clickBreadcrumb(index) {\n  getBreadcrumbs().children[index].click();\n}"
  },
  {
    "path": "test/spec/features/drilldown/collaboration-subprocesses.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:signavio=\"http://www.signavio.com\" id=\"sid-edcb32b0-ba3c-4331-9874-58685c514c55\" targetNamespace=\"http://www.signavio.com\" expressionLanguage=\"http://www.w3.org/TR/XPath\" exporter=\"Signavio Process Editor, http://www.signavio.com\" exporterVersion=\"15.4.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n  <error id=\"sid-c4218475-d7d4-4ee6-ae73-5d44c49114b8\" />\n  <collaboration id=\"Collaboration_0wnumpk\">\n    <participant id=\"Participant_07oikz7\" processRef=\"rootProcess\" />\n  </collaboration>\n  <process id=\"rootProcess\" name=\"Root\" processType=\"None\" isClosed=\"false\" isExecutable=\"false\">\n    <startEvent id=\"sid-6687E2F4-B03D-4E57-A62B-68FA642BE19C\">\n      <outgoing>sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300</outgoing>\n    </startEvent>\n    <parallelGateway id=\"parallelGateway\" gatewayDirection=\"Diverging\">\n      <incoming>sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300</incoming>\n      <outgoing>sid-F06605E1-AEC1-4B39-8843-4AD3F547B557</outgoing>\n      <outgoing>sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500</outgoing>\n    </parallelGateway>\n    <subProcess id=\"collapsedProcess\" name=\"Collapsed Process\">\n      <incoming>sid-F06605E1-AEC1-4B39-8843-4AD3F547B557</incoming>\n      <outgoing>sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05</outgoing>\n      <startEvent id=\"sid-AB14D824-C8B9-4211-B224-C5AF8CED8BBD\">\n        <outgoing>sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657</outgoing>\n      </startEvent>\n      <task id=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724\" name=\"Check Items\">\n        <incoming>sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657</incoming>\n        <outgoing>sid-FB543319-8DFB-4445-AAA3-720137FB230B</outgoing>\n      </task>\n      <subProcess id=\"expandedProcess\" name=\"Expanded Process\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffff\" />\n          <signavio:signavioMetaData metaKey=\"bordercolor\" metaValue=\"#000000\" />\n        </extensionElements>\n        <incoming>sid-FB543319-8DFB-4445-AAA3-720137FB230B</incoming>\n        <outgoing>sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0</outgoing>\n        <startEvent id=\"sid-3B0273A0-FE3B-4525-9E1F-FBAE2F53C2E7\">\n          <outgoing>sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC</outgoing>\n        </startEvent>\n        <subProcess id=\"collapsedProcess_2\" name=\"Collapsed Process 2\">\n          <incoming>sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC</incoming>\n          <outgoing>sid-910420B0-D11B-4F9D-B285-703D8AC0BA90</outgoing>\n          <startEvent id=\"sid-C67DBACD-2E96-4A69-97F0-9B04CCB255EC\">\n            <outgoing>sid-A7460113-CB75-491D-817B-5E1A8C606B8C</outgoing>\n          </startEvent>\n          <task id=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830\" name=\"Call External Supplier\">\n            <incoming>sid-A7460113-CB75-491D-817B-5E1A8C606B8C</incoming>\n            <outgoing>sid-01982395-64E8-43EF-A6D3-CDD276C312AA</outgoing>\n          </task>\n          <endEvent id=\"sid-987C40F8-82D3-4637-ABCE-A85A5E2AB8A9\">\n            <incoming>sid-01982395-64E8-43EF-A6D3-CDD276C312AA</incoming>\n          </endEvent>\n          <sequenceFlow id=\"sid-A7460113-CB75-491D-817B-5E1A8C606B8C\" sourceRef=\"sid-C67DBACD-2E96-4A69-97F0-9B04CCB255EC\" targetRef=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830\" />\n          <sequenceFlow id=\"sid-01982395-64E8-43EF-A6D3-CDD276C312AA\" sourceRef=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830\" targetRef=\"sid-987C40F8-82D3-4637-ABCE-A85A5E2AB8A9\" />\n        </subProcess>\n        <endEvent id=\"sid-17C71FEB-D00D-46D0-ACBE-BB424A3EE5A5\">\n          <incoming>sid-910420B0-D11B-4F9D-B285-703D8AC0BA90</incoming>\n        </endEvent>\n        <sequenceFlow id=\"sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC\" sourceRef=\"sid-3B0273A0-FE3B-4525-9E1F-FBAE2F53C2E7\" targetRef=\"collapsedProcess_2\" />\n        <sequenceFlow id=\"sid-910420B0-D11B-4F9D-B285-703D8AC0BA90\" sourceRef=\"collapsedProcess_2\" targetRef=\"sid-17C71FEB-D00D-46D0-ACBE-BB424A3EE5A5\" />\n      </subProcess>\n      <endEvent id=\"sid-EE9F103D-15EA-4FBB-A4DB-8B94E5F04390\">\n        <incoming>sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0</incoming>\n      </endEvent>\n      <sequenceFlow id=\"sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657\" sourceRef=\"sid-AB14D824-C8B9-4211-B224-C5AF8CED8BBD\" targetRef=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724\" />\n      <sequenceFlow id=\"sid-FB543319-8DFB-4445-AAA3-720137FB230B\" sourceRef=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724\" targetRef=\"expandedProcess\" />\n      <sequenceFlow id=\"sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0\" sourceRef=\"expandedProcess\" targetRef=\"sid-EE9F103D-15EA-4FBB-A4DB-8B94E5F04390\" />\n    </subProcess>\n    <subProcess id=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B\" name=\"Procure Payment\">\n      <incoming>sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500</incoming>\n      <outgoing>sid-5B23450F-AF5E-4519-B134-32107776BD44</outgoing>\n      <startEvent id=\"sid-A13CFBB9-5471-4439-96FA-B65862CA7B21\">\n        <outgoing>sid-E71F5783-AFE7-44ED-8A9C-378C95087448</outgoing>\n      </startEvent>\n      <subProcess id=\"sid-ECEB5194-0BF8-4913-A76F-963DC1FD1D7F\" name=\"Charge Card\">\n        <incoming>sid-E71F5783-AFE7-44ED-8A9C-378C95087448</incoming>\n        <outgoing>sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16</outgoing>\n        <startEvent id=\"sid-F2CCFED7-AD11-4A21-80EE-71D9C96549C8\">\n          <outgoing>sid-3BB6D6CA-BF45-4D15-A1AB-64686C41DB32</outgoing>\n        </startEvent>\n        <task id=\"sid-29B8F97B-1A0D-4280-A62D-5093316C484B\" name=\"Charge Card\">\n          <incoming>sid-3BB6D6CA-BF45-4D15-A1AB-64686C41DB32</incoming>\n          <outgoing>sid-4E25B80E-EF68-4EE5-BB08-C1F54F1A7C39</outgoing>\n        </task>\n        <endEvent id=\"sid-F5AE4FCD-976F-4426-B1FF-7FCAA4CE2393\">\n          <incoming>sid-4E25B80E-EF68-4EE5-BB08-C1F54F1A7C39</incoming>\n        </endEvent>\n        <sequenceFlow id=\"sid-3BB6D6CA-BF45-4D15-A1AB-64686C41DB32\" sourceRef=\"sid-F2CCFED7-AD11-4A21-80EE-71D9C96549C8\" targetRef=\"sid-29B8F97B-1A0D-4280-A62D-5093316C484B\" />\n        <sequenceFlow id=\"sid-4E25B80E-EF68-4EE5-BB08-C1F54F1A7C39\" sourceRef=\"sid-29B8F97B-1A0D-4280-A62D-5093316C484B\" targetRef=\"sid-F5AE4FCD-976F-4426-B1FF-7FCAA4CE2393\" />\n      </subProcess>\n      <subProcess id=\"sid-5DCDF44C-56B4-47A2-9085-00004E76F3A8\" name=\"Accounting Stuff, I don&#39;t know\">\n        <incoming>sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16</incoming>\n        <outgoing>sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519</outgoing>\n        <startEvent id=\"sid-2098A7EE-D7D8-405E-AF61-95BA48E891B6\">\n          <outgoing>sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC</outgoing>\n        </startEvent>\n        <task id=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB\" name=\"Accounting Stuff, I don&#39;t know\">\n          <incoming>sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC</incoming>\n          <outgoing>sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E</outgoing>\n        </task>\n        <endEvent id=\"sid-DAFD7764-8FA5-417B-BB33-55E483687A7D\">\n          <incoming>sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E</incoming>\n        </endEvent>\n        <sequenceFlow id=\"sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC\" sourceRef=\"sid-2098A7EE-D7D8-405E-AF61-95BA48E891B6\" targetRef=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB\" />\n        <sequenceFlow id=\"sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E\" sourceRef=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB\" targetRef=\"sid-DAFD7764-8FA5-417B-BB33-55E483687A7D\" />\n      </subProcess>\n      <endEvent id=\"sid-345BB5A6-CE3B-4711-972A-81E47BA4B667\">\n        <incoming>sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519</incoming>\n      </endEvent>\n      <sequenceFlow id=\"sid-E71F5783-AFE7-44ED-8A9C-378C95087448\" sourceRef=\"sid-A13CFBB9-5471-4439-96FA-B65862CA7B21\" targetRef=\"sid-ECEB5194-0BF8-4913-A76F-963DC1FD1D7F\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"bordercolor\" metaValue=\"#000000\" />\n        </extensionElements>\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16\" sourceRef=\"sid-ECEB5194-0BF8-4913-A76F-963DC1FD1D7F\" targetRef=\"sid-5DCDF44C-56B4-47A2-9085-00004E76F3A8\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"bordercolor\" metaValue=\"#000000\" />\n        </extensionElements>\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519\" sourceRef=\"sid-5DCDF44C-56B4-47A2-9085-00004E76F3A8\" targetRef=\"sid-345BB5A6-CE3B-4711-972A-81E47BA4B667\" />\n    </subProcess>\n    <parallelGateway id=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\" gatewayDirection=\"Converging\">\n      <incoming>sid-5B23450F-AF5E-4519-B134-32107776BD44</incoming>\n      <incoming>sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05</incoming>\n      <outgoing>sid-F7DA1903-6A1A-4858-AF4B-286A968C957F</outgoing>\n    </parallelGateway>\n    <endEvent id=\"sid-A53C38A9-456B-4AC9-9D4A-6EC9663BA77C\">\n      <incoming>sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4</incoming>\n    </endEvent>\n    <subProcess id=\"parallelGateway_withoutContent\" name=\"Ship Items (todo)\">\n      <incoming>sid-F7DA1903-6A1A-4858-AF4B-286A968C957F</incoming>\n      <outgoing>sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3</outgoing>\n    </subProcess>\n    <endEvent id=\"sid-DA90DE99-58B0-4371-B71D-87A718ACB64D\">\n      <incoming>sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3</incoming>\n    </endEvent>\n    <boundaryEvent id=\"sid-C586DCF2-0B1B-4878-8042-F9869023F21B\" attachedToRef=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B\">\n      <outgoing>sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4</outgoing>\n      <errorEventDefinition id=\"sid-804c8ce9-8013-49e6-a6f5-bf97d24f6cf0\" errorRef=\"sid-c4218475-d7d4-4ee6-ae73-5d44c49114b8\" />\n    </boundaryEvent>\n    <sequenceFlow id=\"sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3\" sourceRef=\"parallelGateway_withoutContent\" targetRef=\"sid-DA90DE99-58B0-4371-B71D-87A718ACB64D\" />\n    <sequenceFlow id=\"sid-F7DA1903-6A1A-4858-AF4B-286A968C957F\" sourceRef=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\" targetRef=\"parallelGateway_withoutContent\" />\n    <sequenceFlow id=\"sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4\" sourceRef=\"sid-C586DCF2-0B1B-4878-8042-F9869023F21B\" targetRef=\"sid-A53C38A9-456B-4AC9-9D4A-6EC9663BA77C\" />\n    <sequenceFlow id=\"sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05\" sourceRef=\"collapsedProcess\" targetRef=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\" />\n    <sequenceFlow id=\"sid-5B23450F-AF5E-4519-B134-32107776BD44\" sourceRef=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B\" targetRef=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\" />\n    <sequenceFlow id=\"sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500\" sourceRef=\"parallelGateway\" targetRef=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B\" />\n    <sequenceFlow id=\"sid-F06605E1-AEC1-4B39-8843-4AD3F547B557\" sourceRef=\"parallelGateway\" targetRef=\"collapsedProcess\" />\n    <sequenceFlow id=\"sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300\" sourceRef=\"sid-6687E2F4-B03D-4E57-A62B-68FA642BE19C\" targetRef=\"parallelGateway\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"sid-cbeafa41-c891-415c-ab0d-3eb4a233f9ed\">\n    <bpmndi:BPMNPlane id=\"sid-5fb4720f-4b99-4727-8770-dd4166bcd5e4\" bpmnElement=\"Collaboration_0wnumpk\">\n      <bpmndi:BPMNShape id=\"Participant_07oikz7_di\" bpmnElement=\"Participant_07oikz7\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"109\" y=\"46\" width=\"660\" height=\"420\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3_gui\" bpmnElement=\"sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3\">\n        <omgdi:waypoint x=\"675\" y=\"215\" />\n        <omgdi:waypoint x=\"720\" y=\"215\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-F7DA1903-6A1A-4858-AF4B-286A968C957F_gui\" bpmnElement=\"sid-F7DA1903-6A1A-4858-AF4B-286A968C957F\">\n        <omgdi:waypoint x=\"530\" y=\"215.41484716157206\" />\n        <omgdi:waypoint x=\"575\" y=\"215.2183406113537\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4_gui\" bpmnElement=\"sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4\">\n        <omgdi:waypoint x=\"420\" y=\"370\" />\n        <omgdi:waypoint x=\"420\" y=\"427.89053746720595\" />\n        <omgdi:waypoint x=\"515\" y=\"428\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05_gui\" bpmnElement=\"sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05\">\n        <omgdi:waypoint x=\"445\" y=\"110\" />\n        <omgdi:waypoint x=\"510.5\" y=\"110\" />\n        <omgdi:waypoint x=\"510.5\" y=\"195\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-5B23450F-AF5E-4519-B134-32107776BD44_gui\" bpmnElement=\"sid-5B23450F-AF5E-4519-B134-32107776BD44\">\n        <omgdi:waypoint x=\"445\" y=\"315\" />\n        <omgdi:waypoint x=\"510.5\" y=\"315\" />\n        <omgdi:waypoint x=\"510.5\" y=\"235\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500_gui\" bpmnElement=\"sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500\">\n        <omgdi:waypoint x=\"255.5\" y=\"235\" />\n        <omgdi:waypoint x=\"255.5\" y=\"315\" />\n        <omgdi:waypoint x=\"345\" y=\"315\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-F06605E1-AEC1-4B39-8843-4AD3F547B557_gui\" bpmnElement=\"sid-F06605E1-AEC1-4B39-8843-4AD3F547B557\">\n        <omgdi:waypoint x=\"255.5\" y=\"195\" />\n        <omgdi:waypoint x=\"255.5\" y=\"110\" />\n        <omgdi:waypoint x=\"345\" y=\"110\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300_gui\" bpmnElement=\"sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300\">\n        <omgdi:waypoint x=\"190\" y=\"215.09316770186336\" />\n        <omgdi:waypoint x=\"235\" y=\"215.37267080745343\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-6687E2F4-B03D-4E57-A62B-68FA642BE19C_gui\" bpmnElement=\"sid-6687E2F4-B03D-4E57-A62B-68FA642BE19C\">\n        <omgdc:Bounds x=\"160\" y=\"200\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"parallelGateway_gui\" bpmnElement=\"parallelGateway\">\n        <omgdc:Bounds x=\"235\" y=\"195\" width=\"40\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B_gui\" bpmnElement=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\">\n        <omgdc:Bounds x=\"490\" y=\"195\" width=\"40\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-A53C38A9-456B-4AC9-9D4A-6EC9663BA77C_gui\" bpmnElement=\"sid-A53C38A9-456B-4AC9-9D4A-6EC9663BA77C\">\n        <omgdc:Bounds x=\"515\" y=\"414\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-DA90DE99-58B0-4371-B71D-87A718ACB64D_gui\" bpmnElement=\"sid-DA90DE99-58B0-4371-B71D-87A718ACB64D\">\n        <omgdc:Bounds x=\"720\" y=\"201\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"collapsedProcess_gui\" bpmnElement=\"collapsedProcess\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"345\" y=\"70\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-c53530f5-9da8-4535-ae6d-c94859ea5b93\">\n          <omgdc:Bounds x=\"352.99214363098145\" y=\"102\" width=\"84.08571243286133\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B_gui\" bpmnElement=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"345\" y=\"275\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-c53530f5-9da8-4535-ae6d-c94859ea5b93\">\n          <omgdc:Bounds x=\"349.520715713501\" y=\"307\" width=\"91.02856826782227\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"parallelGateway_withoutContent_gui\" bpmnElement=\"parallelGateway_withoutContent\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"575\" y=\"175\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-c53530f5-9da8-4535-ae6d-c94859ea5b93\">\n          <omgdc:Bounds x=\"595.7207126617432\" y=\"201\" width=\"58.62857437133789\" height=\"24\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-C586DCF2-0B1B-4878-8042-F9869023F21B_gui\" bpmnElement=\"sid-C586DCF2-0B1B-4878-8042-F9869023F21B\">\n        <omgdc:Bounds x=\"405\" y=\"340\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-c53530f5-9da8-4535-ae6d-c94859ea5b93\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"sid-99a6a759-9161-4f4a-a83d-9ad6b9fbdc7e\">\n    <bpmndi:BPMNPlane id=\"sid-62501c88-ba6c-44ea-90f1-3ccf6a7cea2f\" bpmnElement=\"collapsedProcess\">\n      <bpmndi:BPMNEdge id=\"sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0_gui\" bpmnElement=\"sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0\">\n        <omgdi:waypoint x=\"658\" y=\"154.85467980295567\" />\n        <omgdi:waypoint x=\"703\" y=\"154.9655172413793\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-FB543319-8DFB-4445-AAA3-720137FB230B_gui\" bpmnElement=\"sid-FB543319-8DFB-4445-AAA3-720137FB230B\">\n        <omgdi:waypoint x=\"325\" y=\"154.89539748953976\" />\n        <omgdi:waypoint x=\"370\" y=\"154.80125523012552\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657_gui\" bpmnElement=\"sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657\">\n        <omgdi:waypoint x=\"180\" y=\"155\" />\n        <omgdi:waypoint x=\"225\" y=\"155\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-AB14D824-C8B9-4211-B224-C5AF8CED8BBD_gui\" bpmnElement=\"sid-AB14D824-C8B9-4211-B224-C5AF8CED8BBD\">\n        <omgdc:Bounds x=\"150\" y=\"140\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724_gui\" bpmnElement=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724\">\n        <omgdc:Bounds x=\"225\" y=\"115\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-592ddc98-48fc-42b3-b7f9-1df8b6d368c5\">\n          <omgdc:Bounds x=\"241.44285583496094\" y=\"147\" width=\"67.11428833007812\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"expandedProcess_gui\" bpmnElement=\"expandedProcess\" isExpanded=\"true\">\n        <omgdc:Bounds x=\"370\" y=\"79\" width=\"288\" height=\"151\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-592ddc98-48fc-42b3-b7f9-1df8b6d368c5\">\n          <omgdc:Bounds x=\"378\" y=\"89\" width=\"65.57142639160156\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-910420B0-D11B-4F9D-B285-703D8AC0BA90_gui\" bpmnElement=\"sid-910420B0-D11B-4F9D-B285-703D8AC0BA90\">\n        <omgdi:waypoint x=\"565\" y=\"155\" />\n        <omgdi:waypoint x=\"610\" y=\"155\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC_gui\" bpmnElement=\"sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC\">\n        <omgdi:waypoint x=\"420\" y=\"155\" />\n        <omgdi:waypoint x=\"465\" y=\"155\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-3B0273A0-FE3B-4525-9E1F-FBAE2F53C2E7_gui\" bpmnElement=\"sid-3B0273A0-FE3B-4525-9E1F-FBAE2F53C2E7\">\n        <omgdc:Bounds x=\"390\" y=\"140\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"collapsedProcess_2_gui\" bpmnElement=\"collapsedProcess_2\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"465\" y=\"115\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-592ddc98-48fc-42b3-b7f9-1df8b6d368c5\">\n          <omgdc:Bounds x=\"481.4778537750244\" y=\"141\" width=\"67.11429214477539\" height=\"24\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-17C71FEB-D00D-46D0-ACBE-BB424A3EE5A5_gui\" bpmnElement=\"sid-17C71FEB-D00D-46D0-ACBE-BB424A3EE5A5\">\n        <omgdc:Bounds x=\"610\" y=\"141\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-EE9F103D-15EA-4FBB-A4DB-8B94E5F04390_gui\" bpmnElement=\"sid-EE9F103D-15EA-4FBB-A4DB-8B94E5F04390\">\n        <omgdc:Bounds x=\"703\" y=\"141\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-592ddc98-48fc-42b3-b7f9-1df8b6d368c5\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"sid-0bbc44a9-8a6a-44a1-8b61-0cf870c26fe4\">\n    <bpmndi:BPMNPlane id=\"sid-275fa3fd-9114-4005-b305-71f6c1411c24\" bpmnElement=\"collapsedProcess_2\">\n      <bpmndi:BPMNEdge id=\"sid-01982395-64E8-43EF-A6D3-CDD276C312AA_gui\" bpmnElement=\"sid-01982395-64E8-43EF-A6D3-CDD276C312AA\">\n        <omgdi:waypoint x=\"405\" y=\"145\" />\n        <omgdi:waypoint x=\"450\" y=\"145\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-A7460113-CB75-491D-817B-5E1A8C606B8C_gui\" bpmnElement=\"sid-A7460113-CB75-491D-817B-5E1A8C606B8C\">\n        <omgdi:waypoint x=\"260\" y=\"145\" />\n        <omgdi:waypoint x=\"305\" y=\"145\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-C67DBACD-2E96-4A69-97F0-9B04CCB255EC_gui\" bpmnElement=\"sid-C67DBACD-2E96-4A69-97F0-9B04CCB255EC\">\n        <omgdc:Bounds x=\"230\" y=\"130\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830_gui\" bpmnElement=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830\">\n        <omgdc:Bounds x=\"305\" y=\"105\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-efc2a4e3-a5c6-411d-80d4-64f3a53bc4a4\">\n          <omgdc:Bounds x=\"321.44285583496094\" y=\"131\" width=\"67.11428833007812\" height=\"24\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-987C40F8-82D3-4637-ABCE-A85A5E2AB8A9_gui\" bpmnElement=\"sid-987C40F8-82D3-4637-ABCE-A85A5E2AB8A9\">\n        <omgdc:Bounds x=\"450\" y=\"131\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-efc2a4e3-a5c6-411d-80d4-64f3a53bc4a4\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"sid-19b0e874-234e-4bee-b83c-068fe088c591\">\n    <bpmndi:BPMNPlane id=\"sid-89d69f37-848f-4da3-bb9a-df3a9889286d\" bpmnElement=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B\">\n      <bpmndi:BPMNEdge id=\"sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519_gui\" bpmnElement=\"sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519\">\n        <omgdi:waypoint x=\"510\" y=\"185\" />\n        <omgdi:waypoint x=\"555\" y=\"185\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16_gui\" bpmnElement=\"sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16\">\n        <omgdi:waypoint x=\"365\" y=\"185\" />\n        <omgdi:waypoint x=\"410\" y=\"185\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-E71F5783-AFE7-44ED-8A9C-378C95087448_gui\" bpmnElement=\"sid-E71F5783-AFE7-44ED-8A9C-378C95087448\">\n        <omgdi:waypoint x=\"220\" y=\"185\" />\n        <omgdi:waypoint x=\"265\" y=\"185\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-A13CFBB9-5471-4439-96FA-B65862CA7B21_gui\" bpmnElement=\"sid-A13CFBB9-5471-4439-96FA-B65862CA7B21\">\n        <omgdc:Bounds x=\"190\" y=\"170\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-ECEB5194-0BF8-4913-A76F-963DC1FD1D7F_gui\" bpmnElement=\"sid-ECEB5194-0BF8-4913-A76F-963DC1FD1D7F\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"265\" y=\"145\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-3bb65e49-bd30-45eb-a52f-e94a5e93edbc\">\n          <omgdc:Bounds x=\"281.09214210510254\" y=\"177\" width=\"67.88571548461914\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-5DCDF44C-56B4-47A2-9085-00004E76F3A8_gui\" bpmnElement=\"sid-5DCDF44C-56B4-47A2-9085-00004E76F3A8\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"410\" y=\"145\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-3bb65e49-bd30-45eb-a52f-e94a5e93edbc\">\n          <omgdc:Bounds x=\"424.5492877960205\" y=\"165\" width=\"70.9714241027832\" height=\"36\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-345BB5A6-CE3B-4711-972A-81E47BA4B667_gui\" bpmnElement=\"sid-345BB5A6-CE3B-4711-972A-81E47BA4B667\">\n        <omgdc:Bounds x=\"555\" y=\"171\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-3bb65e49-bd30-45eb-a52f-e94a5e93edbc\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"sid-5e1db01c-46b0-40b0-bb83-67add2799cae\">\n    <bpmndi:BPMNPlane id=\"sid-ecd0155e-80cf-40cd-85a9-edf72b8d2a6c\" bpmnElement=\"sid-ECEB5194-0BF8-4913-A76F-963DC1FD1D7F\">\n      <bpmndi:BPMNEdge id=\"sid-4E25B80E-EF68-4EE5-BB08-C1F54F1A7C39_gui\" bpmnElement=\"sid-4E25B80E-EF68-4EE5-BB08-C1F54F1A7C39\">\n        <omgdi:waypoint x=\"485\" y=\"175\" />\n        <omgdi:waypoint x=\"530\" y=\"175\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-3BB6D6CA-BF45-4D15-A1AB-64686C41DB32_gui\" bpmnElement=\"sid-3BB6D6CA-BF45-4D15-A1AB-64686C41DB32\">\n        <omgdi:waypoint x=\"340\" y=\"175\" />\n        <omgdi:waypoint x=\"385\" y=\"175\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-F2CCFED7-AD11-4A21-80EE-71D9C96549C8_gui\" bpmnElement=\"sid-F2CCFED7-AD11-4A21-80EE-71D9C96549C8\">\n        <omgdc:Bounds x=\"310\" y=\"160\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-29B8F97B-1A0D-4280-A62D-5093316C484B_gui\" bpmnElement=\"sid-29B8F97B-1A0D-4280-A62D-5093316C484B\">\n        <omgdc:Bounds x=\"385\" y=\"135\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-2e7107aa-4946-4b44-a3c0-a137c1775d39\">\n          <omgdc:Bounds x=\"401.05714416503906\" y=\"167\" width=\"67.88571166992188\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-F5AE4FCD-976F-4426-B1FF-7FCAA4CE2393_gui\" bpmnElement=\"sid-F5AE4FCD-976F-4426-B1FF-7FCAA4CE2393\">\n        <omgdc:Bounds x=\"530\" y=\"161\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-2e7107aa-4946-4b44-a3c0-a137c1775d39\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"sid-63fc7b22-cc85-458f-aaab-e165a0e36240\">\n    <bpmndi:BPMNPlane id=\"sid-3f3c0ecd-73e0-4a0a-b05c-0b6bd60eeeb1\" bpmnElement=\"sid-5DCDF44C-56B4-47A2-9085-00004E76F3A8\">\n      <bpmndi:BPMNEdge id=\"sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E_gui\" bpmnElement=\"sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E\">\n        <omgdi:waypoint x=\"415\" y=\"265\" />\n        <omgdi:waypoint x=\"460\" y=\"265\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC_gui\" bpmnElement=\"sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC\">\n        <omgdi:waypoint x=\"270\" y=\"265\" />\n        <omgdi:waypoint x=\"315\" y=\"265\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-2098A7EE-D7D8-405E-AF61-95BA48E891B6_gui\" bpmnElement=\"sid-2098A7EE-D7D8-405E-AF61-95BA48E891B6\">\n        <omgdc:Bounds x=\"240\" y=\"250\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB_gui\" bpmnElement=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB\">\n        <omgdc:Bounds x=\"315\" y=\"225\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-d93ac8fb-7a66-4ace-93a6-71582a8ab1a1\">\n          <omgdc:Bounds x=\"329.51428604125977\" y=\"245\" width=\"70.97142791748047\" height=\"36\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-DAFD7764-8FA5-417B-BB33-55E483687A7D_gui\" bpmnElement=\"sid-DAFD7764-8FA5-417B-BB33-55E483687A7D\">\n        <omgdc:Bounds x=\"460\" y=\"251\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-d93ac8fb-7a66-4ace-93a6-71582a8ab1a1\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram>\n    <bpmndi:BPMNPlane bpmnElement=\"parallelGateway_withoutContent\" />\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/drilldown/diagram-missing-plane.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"DEFINITIONS\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.12.0\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.19.0\">\n  <bpmn:process id=\"PROCESS\" isExecutable=\"true\">\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"PROCESS\"></bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_2\">\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>"
  },
  {
    "path": "test/spec/features/drilldown/legacy-subprocesses.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_0763oqv\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.8.0\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.15.0\">\n  <bpmn:process id=\"Process_0vkcvif\" isExecutable=\"true\">\n    <bpmn:startEvent id=\"StartEvent_1\" />\n    <bpmn:subProcess id=\"inlineSubprocess\">\n      <bpmn:property id=\"Property_0baelcu\" name=\"__targetRef_placeholder\" />\n      <bpmn:dataInputAssociation id=\"DataInputAssociation_1\">\n        <bpmn:sourceRef>DataObjectReference_0kmm4fv</bpmn:sourceRef>\n        <bpmn:targetRef>Property_0baelcu</bpmn:targetRef>\n      </bpmn:dataInputAssociation>\n      <bpmn:dataOutputAssociation id=\"DataOutputAssociation_1\">\n        <bpmn:targetRef>DataObjectReference_0kmm4fv</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n      <bpmn:startEvent id=\"Event_0lrpy3a\">\n        <bpmn:outgoing>Flow_0obnxbt</bpmn:outgoing>\n      </bpmn:startEvent>\n      <bpmn:sequenceFlow id=\"Flow_0obnxbt\" sourceRef=\"Event_0lrpy3a\" targetRef=\"inlineSubprocess_2\" />\n      <bpmn:endEvent id=\"Event_1ic2bhx\">\n        <bpmn:incoming>Flow_1d6ajf7</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:subProcess id=\"inlineSubprocess_2\">\n        <bpmn:incoming>Flow_0obnxbt</bpmn:incoming>\n        <bpmn:outgoing>Flow_1d6ajf7</bpmn:outgoing>\n        <bpmn:startEvent id=\"subprocess_startEvent\" />\n      </bpmn:subProcess>\n      <bpmn:sequenceFlow id=\"Flow_1d6ajf7\" sourceRef=\"inlineSubprocess_2\" targetRef=\"Event_1ic2bhx\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"emptyProcess\" />\n    <bpmn:dataObjectReference id=\"DataObjectReference_0kmm4fv\" dataObjectRef=\"DataObject_0zfveu8\" />\n    <bpmn:dataObject id=\"DataObject_0zfveu8\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_0vkcvif\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"179\" y=\"159\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_0kmm4fv_di\" bpmnElement=\"DataObjectReference_0kmm4fv\">\n        <dc:Bounds x=\"572\" y=\"515\" width=\"36\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"inlineSubprocess_di\" bpmnElement=\"inlineSubprocess\">\n        <dc:Bounds x=\"220\" y=\"50\" width=\"720\" height=\"380\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_1_di\" bpmnElement=\"DataInputAssociation_1\">\n        <di:waypoint x=\"608\" y=\"526\" />\n        <di:waypoint x=\"730\" y=\"430\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_1_di\" bpmnElement=\"DataOutputAssociation_1\">\n        <di:waypoint x=\"425\" y=\"430\" />\n        <di:waypoint x=\"572\" y=\"527\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1d6ajf7_di\" bpmnElement=\"Flow_1d6ajf7\">\n        <di:waypoint x=\"740\" y=\"240\" />\n        <di:waypoint x=\"782\" y=\"240\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0obnxbt_di\" bpmnElement=\"Flow_0obnxbt\">\n        <di:waypoint x=\"308\" y=\"240\" />\n        <di:waypoint x=\"350\" y=\"240\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Event_0lrpy3a_di\" bpmnElement=\"Event_0lrpy3a\">\n        <dc:Bounds x=\"272\" y=\"222\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1ic2bhx_di\" bpmnElement=\"Event_1ic2bhx\">\n        <dc:Bounds x=\"782\" y=\"222\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"inlineSubprocess_2_di\" bpmnElement=\"inlineSubprocess_2\">\n        <dc:Bounds x=\"350\" y=\"120\" width=\"390\" height=\"240\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"subprocess_startEvent_di\" bpmnElement=\"subprocess_startEvent\">\n        <dc:Bounds x=\"410\" y=\"222\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1hpaeri_di\" bpmnElement=\"emptyProcess\">\n        <dc:Bounds x=\"960\" y=\"50\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ignored_di\">\n        <dc:Bounds x=\"0\" y=\"0\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>"
  },
  {
    "path": "test/spec/features/drilldown/nested-subprocesses.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:signavio=\"http://www.signavio.com\" id=\"sid-edcb32b0-ba3c-4331-9874-58685c514c55\" targetNamespace=\"http://www.signavio.com\" expressionLanguage=\"http://www.w3.org/TR/XPath\" exporter=\"Signavio Process Editor, http://www.signavio.com\" exporterVersion=\"15.4.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n  <error id=\"sid-c4218475-d7d4-4ee6-ae73-5d44c49114b8\" />\n  <process id=\"rootProcess\" name=\"Root\" processType=\"None\" isClosed=\"false\" isExecutable=\"false\">\n    <startEvent id=\"sid-6687E2F4-B03D-4E57-A62B-68FA642BE19C\">\n      <outgoing>sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300</outgoing>\n    </startEvent>\n    <parallelGateway id=\"parallelGateway\" gatewayDirection=\"Diverging\">\n      <incoming>sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300</incoming>\n      <outgoing>sid-F06605E1-AEC1-4B39-8843-4AD3F547B557</outgoing>\n      <outgoing>sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500</outgoing>\n    </parallelGateway>\n    <subProcess id=\"collapsedProcess\" name=\"Collapsed Process\">\n      <incoming>sid-F06605E1-AEC1-4B39-8843-4AD3F547B557</incoming>\n      <outgoing>sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05</outgoing>\n      <startEvent id=\"sid-AB14D824-C8B9-4211-B224-C5AF8CED8BBD\">\n        <outgoing>sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657</outgoing>\n      </startEvent>\n      <task id=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724\" name=\"Check Items\">\n        <incoming>sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657</incoming>\n        <outgoing>sid-FB543319-8DFB-4445-AAA3-720137FB230B</outgoing>\n      </task>\n      <subProcess id=\"expandedProcess\" name=\"Expanded Process\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffff\" />\n          <signavio:signavioMetaData metaKey=\"bordercolor\" metaValue=\"#000000\" />\n        </extensionElements>\n        <incoming>sid-FB543319-8DFB-4445-AAA3-720137FB230B</incoming>\n        <outgoing>sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0</outgoing>\n        <startEvent id=\"sid-3B0273A0-FE3B-4525-9E1F-FBAE2F53C2E7\">\n          <outgoing>sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC</outgoing>\n        </startEvent>\n        <subProcess id=\"collapsedProcess_2\" name=\"Collapsed Process 2\">\n          <incoming>sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC</incoming>\n          <outgoing>sid-910420B0-D11B-4F9D-B285-703D8AC0BA90</outgoing>\n          <startEvent id=\"sid-C67DBACD-2E96-4A69-97F0-9B04CCB255EC\">\n            <outgoing>sid-A7460113-CB75-491D-817B-5E1A8C606B8C</outgoing>\n          </startEvent>\n          <task id=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830\" name=\"Call External Supplier\">\n            <incoming>sid-A7460113-CB75-491D-817B-5E1A8C606B8C</incoming>\n            <outgoing>sid-01982395-64E8-43EF-A6D3-CDD276C312AA</outgoing>\n          </task>\n          <endEvent id=\"sid-987C40F8-82D3-4637-ABCE-A85A5E2AB8A9\">\n            <incoming>sid-01982395-64E8-43EF-A6D3-CDD276C312AA</incoming>\n          </endEvent>\n          <sequenceFlow id=\"sid-A7460113-CB75-491D-817B-5E1A8C606B8C\" sourceRef=\"sid-C67DBACD-2E96-4A69-97F0-9B04CCB255EC\" targetRef=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830\">\n          </sequenceFlow>\n          <sequenceFlow id=\"sid-01982395-64E8-43EF-A6D3-CDD276C312AA\" sourceRef=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830\" targetRef=\"sid-987C40F8-82D3-4637-ABCE-A85A5E2AB8A9\">\n          </sequenceFlow>\n        </subProcess>\n        <endEvent id=\"sid-17C71FEB-D00D-46D0-ACBE-BB424A3EE5A5\">\n          <incoming>sid-910420B0-D11B-4F9D-B285-703D8AC0BA90</incoming>\n        </endEvent>\n        <sequenceFlow id=\"sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC\" sourceRef=\"sid-3B0273A0-FE3B-4525-9E1F-FBAE2F53C2E7\" targetRef=\"collapsedProcess_2\">\n        </sequenceFlow>\n        <sequenceFlow id=\"sid-910420B0-D11B-4F9D-B285-703D8AC0BA90\" sourceRef=\"collapsedProcess_2\" targetRef=\"sid-17C71FEB-D00D-46D0-ACBE-BB424A3EE5A5\">\n        </sequenceFlow>\n      </subProcess>\n      <endEvent id=\"sid-EE9F103D-15EA-4FBB-A4DB-8B94E5F04390\">\n        <incoming>sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0</incoming>\n      </endEvent>\n      <sequenceFlow id=\"sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657\" sourceRef=\"sid-AB14D824-C8B9-4211-B224-C5AF8CED8BBD\" targetRef=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-FB543319-8DFB-4445-AAA3-720137FB230B\" sourceRef=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724\" targetRef=\"expandedProcess\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0\" sourceRef=\"expandedProcess\" targetRef=\"sid-EE9F103D-15EA-4FBB-A4DB-8B94E5F04390\">\n      </sequenceFlow>\n    </subProcess>\n    <subProcess id=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B\" name=\"Procure Payment\">\n      <incoming>sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500</incoming>\n      <outgoing>sid-5B23450F-AF5E-4519-B134-32107776BD44</outgoing>\n      <startEvent id=\"sid-A13CFBB9-5471-4439-96FA-B65862CA7B21\">\n        <outgoing>sid-E71F5783-AFE7-44ED-8A9C-378C95087448</outgoing>\n      </startEvent>\n      <subProcess id=\"sid-ECEB5194-0BF8-4913-A76F-963DC1FD1D7F\" name=\"Charge Card\">\n        <incoming>sid-E71F5783-AFE7-44ED-8A9C-378C95087448</incoming>\n        <outgoing>sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16</outgoing>\n        <startEvent id=\"sid-F2CCFED7-AD11-4A21-80EE-71D9C96549C8\">\n          <outgoing>sid-3BB6D6CA-BF45-4D15-A1AB-64686C41DB32</outgoing>\n        </startEvent>\n        <task id=\"sid-29B8F97B-1A0D-4280-A62D-5093316C484B\" name=\"Charge Card\">\n          <incoming>sid-3BB6D6CA-BF45-4D15-A1AB-64686C41DB32</incoming>\n          <outgoing>sid-4E25B80E-EF68-4EE5-BB08-C1F54F1A7C39</outgoing>\n        </task>\n        <endEvent id=\"sid-F5AE4FCD-976F-4426-B1FF-7FCAA4CE2393\">\n          <incoming>sid-4E25B80E-EF68-4EE5-BB08-C1F54F1A7C39</incoming>\n        </endEvent>\n        <sequenceFlow id=\"sid-3BB6D6CA-BF45-4D15-A1AB-64686C41DB32\" sourceRef=\"sid-F2CCFED7-AD11-4A21-80EE-71D9C96549C8\" targetRef=\"sid-29B8F97B-1A0D-4280-A62D-5093316C484B\">\n        </sequenceFlow>\n        <sequenceFlow id=\"sid-4E25B80E-EF68-4EE5-BB08-C1F54F1A7C39\" sourceRef=\"sid-29B8F97B-1A0D-4280-A62D-5093316C484B\" targetRef=\"sid-F5AE4FCD-976F-4426-B1FF-7FCAA4CE2393\">\n        </sequenceFlow>\n      </subProcess>\n      <subProcess id=\"sid-5DCDF44C-56B4-47A2-9085-00004E76F3A8\" name=\"Accounting Stuff, I don&#39;t know\">\n        <incoming>sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16</incoming>\n        <outgoing>sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519</outgoing>\n        <startEvent id=\"sid-2098A7EE-D7D8-405E-AF61-95BA48E891B6\">\n          <outgoing>sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC</outgoing>\n        </startEvent>\n        <task id=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB\" name=\"Accounting Stuff, I don&#39;t know\">\n          <incoming>sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC</incoming>\n          <outgoing>sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E</outgoing>\n        </task>\n        <endEvent id=\"sid-DAFD7764-8FA5-417B-BB33-55E483687A7D\">\n          <incoming>sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E</incoming>\n        </endEvent>\n        <sequenceFlow id=\"sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC\" sourceRef=\"sid-2098A7EE-D7D8-405E-AF61-95BA48E891B6\" targetRef=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB\">\n        </sequenceFlow>\n        <sequenceFlow id=\"sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E\" sourceRef=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB\" targetRef=\"sid-DAFD7764-8FA5-417B-BB33-55E483687A7D\">\n        </sequenceFlow>\n      </subProcess>\n      <endEvent id=\"sid-345BB5A6-CE3B-4711-972A-81E47BA4B667\">\n        <incoming>sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519</incoming>\n      </endEvent>\n      <sequenceFlow id=\"sid-E71F5783-AFE7-44ED-8A9C-378C95087448\" sourceRef=\"sid-A13CFBB9-5471-4439-96FA-B65862CA7B21\" targetRef=\"sid-ECEB5194-0BF8-4913-A76F-963DC1FD1D7F\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"bordercolor\" metaValue=\"#000000\" />\n        </extensionElements>\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16\" sourceRef=\"sid-ECEB5194-0BF8-4913-A76F-963DC1FD1D7F\" targetRef=\"sid-5DCDF44C-56B4-47A2-9085-00004E76F3A8\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"bordercolor\" metaValue=\"#000000\" />\n        </extensionElements>\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519\" sourceRef=\"sid-5DCDF44C-56B4-47A2-9085-00004E76F3A8\" targetRef=\"sid-345BB5A6-CE3B-4711-972A-81E47BA4B667\">\n      </sequenceFlow>\n    </subProcess>\n    <parallelGateway id=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\" gatewayDirection=\"Converging\">\n      <incoming>sid-5B23450F-AF5E-4519-B134-32107776BD44</incoming>\n      <incoming>sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05</incoming>\n      <outgoing>sid-F7DA1903-6A1A-4858-AF4B-286A968C957F</outgoing>\n    </parallelGateway>\n    <boundaryEvent id=\"sid-C586DCF2-0B1B-4878-8042-F9869023F21B\" attachedToRef=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B\">\n      <outgoing>sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4</outgoing>\n      <errorEventDefinition id=\"sid-804c8ce9-8013-49e6-a6f5-bf97d24f6cf0\" errorRef=\"sid-c4218475-d7d4-4ee6-ae73-5d44c49114b8\" />\n    </boundaryEvent>\n    <endEvent id=\"sid-A53C38A9-456B-4AC9-9D4A-6EC9663BA77C\">\n      <incoming>sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4</incoming>\n    </endEvent>\n    <subProcess id=\"parallelGateway_withoutContent\" name=\"Ship Items (todo)\">\n      <incoming>sid-F7DA1903-6A1A-4858-AF4B-286A968C957F</incoming>\n      <outgoing>sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3</outgoing>\n    </subProcess>\n    <endEvent id=\"sid-DA90DE99-58B0-4371-B71D-87A718ACB64D\">\n      <incoming>sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3</incoming>\n    </endEvent>\n    <sequenceFlow id=\"sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300\" sourceRef=\"sid-6687E2F4-B03D-4E57-A62B-68FA642BE19C\" targetRef=\"parallelGateway\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-F06605E1-AEC1-4B39-8843-4AD3F547B557\" sourceRef=\"parallelGateway\" targetRef=\"collapsedProcess\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500\" sourceRef=\"parallelGateway\" targetRef=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-5B23450F-AF5E-4519-B134-32107776BD44\" sourceRef=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B\" targetRef=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05\" sourceRef=\"collapsedProcess\" targetRef=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4\" sourceRef=\"sid-C586DCF2-0B1B-4878-8042-F9869023F21B\" targetRef=\"sid-A53C38A9-456B-4AC9-9D4A-6EC9663BA77C\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-F7DA1903-6A1A-4858-AF4B-286A968C957F\" sourceRef=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\" targetRef=\"parallelGateway_withoutContent\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3\" sourceRef=\"parallelGateway_withoutContent\" targetRef=\"sid-DA90DE99-58B0-4371-B71D-87A718ACB64D\">\n    </sequenceFlow>\n  </process>\n  <bpmndi:BPMNDiagram id=\"sid-cbeafa41-c891-415c-ab0d-3eb4a233f9ed\">\n    <bpmndi:BPMNPlane id=\"sid-5fb4720f-4b99-4727-8770-dd4166bcd5e4\" bpmnElement=\"rootProcess\">\n      <bpmndi:BPMNEdge id=\"sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3_gui\" bpmnElement=\"sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3\">\n        <omgdi:waypoint x=\"675\" y=\"215\" />\n        <omgdi:waypoint x=\"720\" y=\"215\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-F7DA1903-6A1A-4858-AF4B-286A968C957F_gui\" bpmnElement=\"sid-F7DA1903-6A1A-4858-AF4B-286A968C957F\">\n        <omgdi:waypoint x=\"530\" y=\"215.41484716157206\" />\n        <omgdi:waypoint x=\"575\" y=\"215.2183406113537\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4_gui\" bpmnElement=\"sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4\">\n        <omgdi:waypoint x=\"420\" y=\"370\" />\n        <omgdi:waypoint x=\"420\" y=\"427.89053746720595\" />\n        <omgdi:waypoint x=\"515\" y=\"428\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05_gui\" bpmnElement=\"sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05\">\n        <omgdi:waypoint x=\"445\" y=\"110\" />\n        <omgdi:waypoint x=\"510.5\" y=\"110\" />\n        <omgdi:waypoint x=\"510.5\" y=\"195\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-5B23450F-AF5E-4519-B134-32107776BD44_gui\" bpmnElement=\"sid-5B23450F-AF5E-4519-B134-32107776BD44\">\n        <omgdi:waypoint x=\"445\" y=\"315\" />\n        <omgdi:waypoint x=\"510.5\" y=\"315\" />\n        <omgdi:waypoint x=\"510.5\" y=\"235\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500_gui\" bpmnElement=\"sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500\">\n        <omgdi:waypoint x=\"255.5\" y=\"235\" />\n        <omgdi:waypoint x=\"255.5\" y=\"315\" />\n        <omgdi:waypoint x=\"345\" y=\"315\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-F06605E1-AEC1-4B39-8843-4AD3F547B557_gui\" bpmnElement=\"sid-F06605E1-AEC1-4B39-8843-4AD3F547B557\">\n        <omgdi:waypoint x=\"255.5\" y=\"195\" />\n        <omgdi:waypoint x=\"255.5\" y=\"110\" />\n        <omgdi:waypoint x=\"345\" y=\"110\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300_gui\" bpmnElement=\"sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300\">\n        <omgdi:waypoint x=\"190\" y=\"215.09316770186336\" />\n        <omgdi:waypoint x=\"235\" y=\"215.37267080745343\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-6687E2F4-B03D-4E57-A62B-68FA642BE19C_gui\" bpmnElement=\"sid-6687E2F4-B03D-4E57-A62B-68FA642BE19C\">\n        <omgdc:Bounds x=\"160\" y=\"200\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"parallelGateway_gui\" bpmnElement=\"parallelGateway\">\n        <omgdc:Bounds x=\"235\" y=\"195\" width=\"40\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"collapsedProcess_gui\" bpmnElement=\"collapsedProcess\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"345\" y=\"70\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-c53530f5-9da8-4535-ae6d-c94859ea5b93\">\n          <omgdc:Bounds x=\"352.99214363098145\" y=\"102\" width=\"84.08571243286133\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B_gui\" bpmnElement=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"345\" y=\"275\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-c53530f5-9da8-4535-ae6d-c94859ea5b93\">\n          <omgdc:Bounds x=\"349.520715713501\" y=\"307\" width=\"91.02856826782227\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B_gui\" bpmnElement=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\">\n        <omgdc:Bounds x=\"490\" y=\"195\" width=\"40\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-A53C38A9-456B-4AC9-9D4A-6EC9663BA77C_gui\" bpmnElement=\"sid-A53C38A9-456B-4AC9-9D4A-6EC9663BA77C\">\n        <omgdc:Bounds x=\"515\" y=\"413.89053746720595\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"parallelGateway_withoutContent_gui\" bpmnElement=\"parallelGateway_withoutContent\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"575\" y=\"175\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-c53530f5-9da8-4535-ae6d-c94859ea5b93\">\n          <omgdc:Bounds x=\"595.7207126617432\" y=\"201\" width=\"58.62857437133789\" height=\"24\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-DA90DE99-58B0-4371-B71D-87A718ACB64D_gui\" bpmnElement=\"sid-DA90DE99-58B0-4371-B71D-87A718ACB64D\">\n        <omgdc:Bounds x=\"720\" y=\"201\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-C586DCF2-0B1B-4878-8042-F9869023F21B_gui\" bpmnElement=\"sid-C586DCF2-0B1B-4878-8042-F9869023F21B\">\n        <omgdc:Bounds x=\"405\" y=\"340\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-c53530f5-9da8-4535-ae6d-c94859ea5b93\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"sid-99a6a759-9161-4f4a-a83d-9ad6b9fbdc7e\">\n    <bpmndi:BPMNPlane id=\"sid-62501c88-ba6c-44ea-90f1-3ccf6a7cea2f\" bpmnElement=\"collapsedProcess\">\n      <bpmndi:BPMNShape id=\"sid-AB14D824-C8B9-4211-B224-C5AF8CED8BBD_gui\" bpmnElement=\"sid-AB14D824-C8B9-4211-B224-C5AF8CED8BBD\">\n        <omgdc:Bounds x=\"150\" y=\"140\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724_gui\" bpmnElement=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724\">\n        <omgdc:Bounds x=\"225\" y=\"115\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-592ddc98-48fc-42b3-b7f9-1df8b6d368c5\">\n          <omgdc:Bounds x=\"241.44285583496094\" y=\"147\" width=\"67.11428833007812\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-3B0273A0-FE3B-4525-9E1F-FBAE2F53C2E7_gui\" bpmnElement=\"sid-3B0273A0-FE3B-4525-9E1F-FBAE2F53C2E7\">\n        <omgdc:Bounds x=\"390\" y=\"140\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"collapsedProcess_2_gui\" bpmnElement=\"collapsedProcess_2\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"465\" y=\"115\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-592ddc98-48fc-42b3-b7f9-1df8b6d368c5\">\n          <omgdc:Bounds x=\"481.4778537750244\" y=\"141\" width=\"67.11429214477539\" height=\"24\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-17C71FEB-D00D-46D0-ACBE-BB424A3EE5A5_gui\" bpmnElement=\"sid-17C71FEB-D00D-46D0-ACBE-BB424A3EE5A5\">\n        <omgdc:Bounds x=\"610\" y=\"141\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC_gui\" bpmnElement=\"sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC\">\n        <omgdi:waypoint x=\"420\" y=\"155\" />\n        <omgdi:waypoint x=\"465\" y=\"155\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-910420B0-D11B-4F9D-B285-703D8AC0BA90_gui\" bpmnElement=\"sid-910420B0-D11B-4F9D-B285-703D8AC0BA90\">\n        <omgdi:waypoint x=\"565\" y=\"155\" />\n        <omgdi:waypoint x=\"610\" y=\"155\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"expandedProcess_gui\" bpmnElement=\"expandedProcess\" isExpanded=\"true\">\n        <omgdc:Bounds x=\"370\" y=\"79\" width=\"288\" height=\"151\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-592ddc98-48fc-42b3-b7f9-1df8b6d368c5\">\n          <omgdc:Bounds x=\"378\" y=\"89\" width=\"65.57142639160156\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-EE9F103D-15EA-4FBB-A4DB-8B94E5F04390_gui\" bpmnElement=\"sid-EE9F103D-15EA-4FBB-A4DB-8B94E5F04390\">\n        <omgdc:Bounds x=\"703\" y=\"141\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657_gui\" bpmnElement=\"sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657\">\n        <omgdi:waypoint x=\"180\" y=\"155\" />\n        <omgdi:waypoint x=\"225\" y=\"155\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-FB543319-8DFB-4445-AAA3-720137FB230B_gui\" bpmnElement=\"sid-FB543319-8DFB-4445-AAA3-720137FB230B\">\n        <omgdi:waypoint x=\"325\" y=\"154.89539748953976\" />\n        <omgdi:waypoint x=\"370\" y=\"154.80125523012552\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0_gui\" bpmnElement=\"sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0\">\n        <omgdi:waypoint x=\"658\" y=\"154.85467980295567\" />\n        <omgdi:waypoint x=\"703\" y=\"154.9655172413793\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-592ddc98-48fc-42b3-b7f9-1df8b6d368c5\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"sid-0bbc44a9-8a6a-44a1-8b61-0cf870c26fe4\">\n    <bpmndi:BPMNPlane id=\"sid-275fa3fd-9114-4005-b305-71f6c1411c24\" bpmnElement=\"collapsedProcess_2\">\n      <bpmndi:BPMNShape id=\"sid-C67DBACD-2E96-4A69-97F0-9B04CCB255EC_gui\" bpmnElement=\"sid-C67DBACD-2E96-4A69-97F0-9B04CCB255EC\">\n        <omgdc:Bounds x=\"230\" y=\"130\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830_gui\" bpmnElement=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830\">\n        <omgdc:Bounds x=\"305\" y=\"105\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-efc2a4e3-a5c6-411d-80d4-64f3a53bc4a4\">\n          <omgdc:Bounds x=\"321.44285583496094\" y=\"131\" width=\"67.11428833007812\" height=\"24\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-987C40F8-82D3-4637-ABCE-A85A5E2AB8A9_gui\" bpmnElement=\"sid-987C40F8-82D3-4637-ABCE-A85A5E2AB8A9\">\n        <omgdc:Bounds x=\"450\" y=\"131\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-A7460113-CB75-491D-817B-5E1A8C606B8C_gui\" bpmnElement=\"sid-A7460113-CB75-491D-817B-5E1A8C606B8C\">\n        <omgdi:waypoint x=\"260\" y=\"145\" />\n        <omgdi:waypoint x=\"305\" y=\"145\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-01982395-64E8-43EF-A6D3-CDD276C312AA_gui\" bpmnElement=\"sid-01982395-64E8-43EF-A6D3-CDD276C312AA\">\n        <omgdi:waypoint x=\"405\" y=\"145\" />\n        <omgdi:waypoint x=\"450\" y=\"145\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-efc2a4e3-a5c6-411d-80d4-64f3a53bc4a4\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"sid-19b0e874-234e-4bee-b83c-068fe088c591\">\n    <bpmndi:BPMNPlane id=\"sid-89d69f37-848f-4da3-bb9a-df3a9889286d\" bpmnElement=\"sid-D0CDA908-DDCE-4E82-88D0-F1A919B8AE8B\">\n      <bpmndi:BPMNShape id=\"sid-A13CFBB9-5471-4439-96FA-B65862CA7B21_gui\" bpmnElement=\"sid-A13CFBB9-5471-4439-96FA-B65862CA7B21\">\n        <omgdc:Bounds x=\"190\" y=\"170\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-ECEB5194-0BF8-4913-A76F-963DC1FD1D7F_gui\" bpmnElement=\"sid-ECEB5194-0BF8-4913-A76F-963DC1FD1D7F\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"265\" y=\"145\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-3bb65e49-bd30-45eb-a52f-e94a5e93edbc\">\n          <omgdc:Bounds x=\"281.09214210510254\" y=\"177\" width=\"67.88571548461914\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-5DCDF44C-56B4-47A2-9085-00004E76F3A8_gui\" bpmnElement=\"sid-5DCDF44C-56B4-47A2-9085-00004E76F3A8\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"410\" y=\"145\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-3bb65e49-bd30-45eb-a52f-e94a5e93edbc\">\n          <omgdc:Bounds x=\"424.5492877960205\" y=\"165\" width=\"70.9714241027832\" height=\"36\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-345BB5A6-CE3B-4711-972A-81E47BA4B667_gui\" bpmnElement=\"sid-345BB5A6-CE3B-4711-972A-81E47BA4B667\">\n        <omgdc:Bounds x=\"555\" y=\"171\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-E71F5783-AFE7-44ED-8A9C-378C95087448_gui\" bpmnElement=\"sid-E71F5783-AFE7-44ED-8A9C-378C95087448\">\n        <omgdi:waypoint x=\"220\" y=\"185\" />\n        <omgdi:waypoint x=\"265\" y=\"185\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16_gui\" bpmnElement=\"sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16\">\n        <omgdi:waypoint x=\"365\" y=\"185\" />\n        <omgdi:waypoint x=\"410\" y=\"185\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519_gui\" bpmnElement=\"sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519\">\n        <omgdi:waypoint x=\"510\" y=\"185\" />\n        <omgdi:waypoint x=\"555\" y=\"185\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-3bb65e49-bd30-45eb-a52f-e94a5e93edbc\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"sid-5e1db01c-46b0-40b0-bb83-67add2799cae\">\n    <bpmndi:BPMNPlane id=\"sid-ecd0155e-80cf-40cd-85a9-edf72b8d2a6c\" bpmnElement=\"sid-ECEB5194-0BF8-4913-A76F-963DC1FD1D7F\">\n      <bpmndi:BPMNShape id=\"sid-F2CCFED7-AD11-4A21-80EE-71D9C96549C8_gui\" bpmnElement=\"sid-F2CCFED7-AD11-4A21-80EE-71D9C96549C8\">\n        <omgdc:Bounds x=\"310\" y=\"160\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-29B8F97B-1A0D-4280-A62D-5093316C484B_gui\" bpmnElement=\"sid-29B8F97B-1A0D-4280-A62D-5093316C484B\">\n        <omgdc:Bounds x=\"385\" y=\"135\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-2e7107aa-4946-4b44-a3c0-a137c1775d39\">\n          <omgdc:Bounds x=\"401.05714416503906\" y=\"167\" width=\"67.88571166992188\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-F5AE4FCD-976F-4426-B1FF-7FCAA4CE2393_gui\" bpmnElement=\"sid-F5AE4FCD-976F-4426-B1FF-7FCAA4CE2393\">\n        <omgdc:Bounds x=\"530\" y=\"161\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-3BB6D6CA-BF45-4D15-A1AB-64686C41DB32_gui\" bpmnElement=\"sid-3BB6D6CA-BF45-4D15-A1AB-64686C41DB32\">\n        <omgdi:waypoint x=\"340\" y=\"175\" />\n        <omgdi:waypoint x=\"385\" y=\"175\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-4E25B80E-EF68-4EE5-BB08-C1F54F1A7C39_gui\" bpmnElement=\"sid-4E25B80E-EF68-4EE5-BB08-C1F54F1A7C39\">\n        <omgdi:waypoint x=\"485\" y=\"175\" />\n        <omgdi:waypoint x=\"530\" y=\"175\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-2e7107aa-4946-4b44-a3c0-a137c1775d39\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"sid-63fc7b22-cc85-458f-aaab-e165a0e36240\">\n    <bpmndi:BPMNPlane id=\"sid-3f3c0ecd-73e0-4a0a-b05c-0b6bd60eeeb1\" bpmnElement=\"sid-5DCDF44C-56B4-47A2-9085-00004E76F3A8\">\n      <bpmndi:BPMNShape id=\"sid-2098A7EE-D7D8-405E-AF61-95BA48E891B6_gui\" bpmnElement=\"sid-2098A7EE-D7D8-405E-AF61-95BA48E891B6\">\n        <omgdc:Bounds x=\"240\" y=\"250\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB_gui\" bpmnElement=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB\">\n        <omgdc:Bounds x=\"315\" y=\"225\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-d93ac8fb-7a66-4ace-93a6-71582a8ab1a1\">\n          <omgdc:Bounds x=\"329.51428604125977\" y=\"245\" width=\"70.97142791748047\" height=\"36\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-DAFD7764-8FA5-417B-BB33-55E483687A7D_gui\" bpmnElement=\"sid-DAFD7764-8FA5-417B-BB33-55E483687A7D\">\n        <omgdc:Bounds x=\"460\" y=\"251\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC_gui\" bpmnElement=\"sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC\">\n        <omgdi:waypoint x=\"270\" y=\"265\" />\n        <omgdi:waypoint x=\"315\" y=\"265\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E_gui\" bpmnElement=\"sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E\">\n        <omgdi:waypoint x=\"415\" y=\"265\" />\n        <omgdi:waypoint x=\"460\" y=\"265\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-d93ac8fb-7a66-4ace-93a6-71582a8ab1a1\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/drilldown/plane-missing-bpmnelement.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"DEFINITIONS\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.12.0\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.19.0\">\n  <bpmn:process id=\"PROCESS\" isExecutable=\"true\">\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"PROCESS\"></bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_2\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_2\"></bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>"
  },
  {
    "path": "test/spec/features/drilldown/process-missing-bpmndiagram.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"DEFINITIONS\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.12.0\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.19.0\">\n  <bpmn:process id=\"PROCESS\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"SUB_PROCESS_PLANE\">\n      <bpmn:task id=\"TASK_IN_SUBPROCESS\" name=\"TASK_IN_SUBPROCESS\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_2\" bpmnElement=\"SUB_PROCESS_PLANE\">\n      <bpmndi:BPMNShape id=\"TASK_IN_SUBPROCESS_di\" bpmnElement=\"TASK_IN_SUBPROCESS\" isExpanded=\"false\">\n        <dc:Bounds x=\"160\" y=\"90\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/drilldown/subprocess-missing-bpmndiagram.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"DEFINITIONS\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.12.0\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.19.0\">\n  <bpmn:process id=\"PROCESS\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"SUB_PROCESS\"></bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"PROCESS\">\n      <bpmndi:BPMNShape id=\"SUB_PROCESS_di\" bpmnElement=\"SUB_PROCESS\" isExpanded=\"false\">\n        <dc:Bounds x=\"160\" y=\"90\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>"
  },
  {
    "path": "test/spec/features/drilldown/subprocess-missing-di.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"DEFINITIONS\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.12.0\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.19.0\">\n  <bpmn:process id=\"PROCESS\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"SUB_PROCESS_NO_DI\">\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"PROCESS\">\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_2\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_2\" bpmnElement=\"SUB_PROCESS_NO_DI\">\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>"
  },
  {
    "path": "test/spec/features/editor-actions/BpmnEditorActionsSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nvar pick = require('min-dash').pick;\n\nvar getBBox = require('diagram-js/lib/util/Elements').getBBox;\n\nvar getParent = require('lib/features/modeling/util/ModelingUtil').getParent;\n\n\nimport bpmnEditorActionsModule from 'lib/features/editor-actions';\nimport selectionModule from 'diagram-js/lib/features/selection';\nimport alignElementsModule from 'diagram-js/lib/features/align-elements';\nimport distributeElementsModule from 'diagram-js/lib/features/distribute-elements';\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\nimport contextPad from 'lib/features/context-pad';\n\nvar basicXML = require('../../../fixtures/bpmn/nested-subprocesses.bpmn');\nvar collaborationXML = require('../../../fixtures/bpmn/collaboration.bpmn');\n\n\ndescribe('features/editor-actions', function() {\n\n  describe('#moveToOrigin', function() {\n\n    function testMoveToOrigin(xml) {\n\n      return function() {\n\n        beforeEach(bootstrapModeler(xml, {\n          modules: [\n            bpmnEditorActionsModule,\n            modelingModule,\n            coreModule\n          ]\n        }));\n\n\n        it('should move to origin', inject(function(editorActions) {\n\n          // given\n          var elements = editorActions.trigger('selectElements'),\n              boundingBox;\n\n          // when\n          editorActions.trigger('moveToOrigin');\n\n          boundingBox = getBBox(elements);\n\n          // then\n          expect(pick(boundingBox, [ 'x', 'y' ])).to.eql({ x: 0, y: 0 });\n        }));\n\n      };\n\n    }\n\n\n    describe('single process', testMoveToOrigin(basicXML));\n\n\n    describe('collaboration', testMoveToOrigin(collaborationXML));\n\n\n    describe('subprocesses', function() {\n\n      beforeEach(bootstrapModeler(basicXML, {\n        modules: [\n          bpmnEditorActionsModule,\n          modelingModule,\n          coreModule\n        ]\n      }));\n\n      it('should ignore children of subprocesses', inject(\n        function(editorActions, elementRegistry) {\n\n          // given\n          var startEvent = elementRegistry.get('StartEvent_3'),\n              startEventParent = getParent(startEvent);\n\n          // when\n          editorActions.trigger('moveToOrigin');\n\n          // then\n          expect(getParent(startEvent)).to.equal(startEventParent);\n        }\n      ));\n\n    });\n\n  });\n\n\n  describe('#alignElements', function() {\n\n    beforeEach(bootstrapModeler(basicXML, {\n      modules: [\n        selectionModule,\n        alignElementsModule,\n        bpmnEditorActionsModule,\n        modelingModule,\n        coreModule\n      ]\n    }));\n\n\n    it('should align items', inject(\n      function(elementRegistry, selection, editorActions) {\n\n        // given\n        var elementIds = [ 'StartEvent_1', 'UserTask_1', 'EndEvent_1' ];\n        var elements = elementIds.map(function(id) {\n          return elementRegistry.get(id);\n        });\n\n        // when\n        selection.select(elements);\n        editorActions.trigger('alignElements', { type: 'middle' });\n\n        // then\n        expect(elements.map(function(e) {\n          return e.y + e.height / 2;\n        })).to.eql([ 311, 311, 311 ]);\n      }\n    ));\n\n\n    it('should not align if too few elements', inject(\n      function(elementRegistry, eventBus, editorActions, selection) {\n\n        // given\n        var elementIds = [ 'StartEvent_1' ];\n        var elements = elementIds.map(function(id) {\n          return elementRegistry.get(id);\n        });\n\n        var changedSpy = sinon.spy();\n\n        // when\n        eventBus.once('commandStack.changed', changedSpy);\n\n        selection.select(elements);\n        editorActions.trigger('alignElements', { type: 'center' });\n\n        // then\n        expect(changedSpy).not.to.have.been.called;\n      }\n    ));\n\n  });\n\n\n  describe('#distributeElements', function() {\n\n    beforeEach(bootstrapModeler(basicXML, {\n      modules: [\n        selectionModule,\n        distributeElementsModule,\n        bpmnEditorActionsModule,\n        modelingModule,\n        coreModule\n      ]\n    }));\n\n\n    it('should distribute items', inject(\n      function(elementRegistry, selection, editorActions) {\n\n        // given\n        var elementIds = [ 'StartEvent_1', 'UserTask_1', 'EndEvent_1' ];\n        var elements = elementIds.map(function(id) {\n          return elementRegistry.get(id);\n        });\n\n        // when\n        selection.select(elements);\n        editorActions.trigger('distributeElements', { type: 'horizontal' });\n\n        // then\n        expect(elements.map(function(e) {\n          return e.x + e.width / 2;\n        })).to.eql([ 433, 574, 714 ]);\n      }\n    ));\n\n\n    it('should not distribute if too few elements', inject(\n      function(elementRegistry, eventBus, editorActions, selection) {\n\n        // given\n        var elementIds = [ 'StartEvent_1', 'UserTask_1' ];\n        var elements = elementIds.map(function(id) {\n          return elementRegistry.get(id);\n        });\n\n        var changedSpy = sinon.spy();\n\n        // when\n        eventBus.once('commandStack.changed', changedSpy);\n\n        selection.select(elements);\n        editorActions.trigger('distributeElements', { type: 'horizontal' });\n\n        // then\n        expect(changedSpy).not.to.have.been.called;\n      }\n    ));\n\n  });\n\n\n  describe('#replaceElement', function() {\n\n    beforeEach(bootstrapModeler(basicXML, {\n      modules: [\n        selectionModule,\n        bpmnEditorActionsModule,\n        modelingModule,\n        coreModule,\n        contextPad\n      ]\n    }));\n\n\n    it('should open replace element', inject(function(elementRegistry, selection, editorActions, eventBus) {\n\n      // given\n      const element = elementRegistry.get('StartEvent_1');\n\n      selection.select(element);\n      var changedSpy = sinon.spy();\n\n      // when\n      eventBus.once('popupMenu.open', changedSpy);\n\n      editorActions.trigger('replaceElement', {});\n\n      // then\n      expect(changedSpy).to.have.been.called;\n    }));\n\n\n    it('should not open replace element if no selection', inject(function(editorActions, eventBus) {\n\n      // given\n      var changedSpy = sinon.spy();\n\n      // when\n      eventBus.once('popupMenu.open', changedSpy);\n\n      editorActions.trigger('replaceElement', {});\n\n      // then\n      expect(changedSpy).to.not.have.been.called;\n    }));\n\n\n    it('should not open replace element if multiple elements selected', inject(function(elementRegistry, selection, editorActions, eventBus) {\n\n      // given\n      var elementIds = [ 'StartEvent_1', 'UserTask_1' ];\n      var elements = elementIds.map(function(id) {\n        return elementRegistry.get(id);\n      });\n\n      selection.select(elements);\n      var changedSpy = sinon.spy();\n\n      // when\n      eventBus.once('popupMenu.open', changedSpy);\n\n      editorActions.trigger('replaceElement', {});\n\n      // then\n      expect(changedSpy).to.not.have.been.called;\n    }));\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/grid-snapping/BpmnGridSnapping.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1kkksuc\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"2.0.0-0\">\n  <bpmn:collaboration id=\"Collaboration_1\">\n    <bpmn:participant id=\"Participant_1\" name=\"Participant_1\" processRef=\"Process_1\" />\n    <bpmn:textAnnotation id=\"TextAnnotation_1\">\n      <bpmn:text>TextAnnotation_1</bpmn:text>\n    </bpmn:textAnnotation>\n    <bpmn:association id=\"Association_0punwjh\" sourceRef=\"Participant_1\" targetRef=\"TextAnnotation_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"SubProcess_1\" name=\"SubProcess_1\">\n      <bpmn:task id=\"Task_1\" name=\"Task_1\">\n        <bpmn:incoming>SequenceFlow_0e7hjjz</bpmn:incoming>\n        <bpmn:outgoing>SequenceFlow_0jhtpzs</bpmn:outgoing>\n      </bpmn:task>\n      <bpmn:startEvent id=\"StartEvent_1\" name=\"StartEvent_1\">\n        <bpmn:outgoing>SequenceFlow_0e7hjjz</bpmn:outgoing>\n      </bpmn:startEvent>\n      <bpmn:endEvent id=\"EndEvent_1\" name=\"EndEvent_1\">\n        <bpmn:incoming>SequenceFlow_0jhtpzs</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:sequenceFlow id=\"SequenceFlow_0e7hjjz\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n      <bpmn:sequenceFlow id=\"SequenceFlow_0jhtpzs\" sourceRef=\"Task_1\" targetRef=\"EndEvent_1\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_1brw48p_di\" bpmnElement=\"Participant_1\">\n        <dc:Bounds x=\"100\" y=\"100\" width=\"590\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_11f0dg1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"150\" y=\"130\" width=\"350\" height=\"190\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_0bnhhhy_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"700\" y=\"20\" width=\"110\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_0punwjh_di\" bpmnElement=\"Association_0punwjh\">\n        <di:waypoint x=\"646\" y=\"100\" />\n        <di:waypoint x=\"706\" y=\"70\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_10ndd1c_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"273\" y=\"180\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_0ck0xbl_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"190\" y=\"202\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"176\" y=\"245\" width=\"64\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_0fx80e1_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"420\" y=\"202\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"408\" y=\"245\" width=\"60\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0e7hjjz_di\" bpmnElement=\"SequenceFlow_0e7hjjz\">\n        <di:waypoint x=\"226\" y=\"220\" />\n        <di:waypoint x=\"273\" y=\"220\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0jhtpzs_di\" bpmnElement=\"SequenceFlow_0jhtpzs\">\n        <di:waypoint x=\"373\" y=\"220\" />\n        <di:waypoint x=\"420\" y=\"220\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/grid-snapping/BpmnGridSnappingSpec.js",
    "content": "import {\r\n  bootstrapModeler,\r\n  inject\r\n} from 'test/TestHelper';\r\n\r\nimport coreModule from 'lib/core';\r\nimport createModule from 'diagram-js/lib/features/create';\r\nimport gridSnappingModule from 'lib/features/grid-snapping';\r\nimport modelingModule from 'lib/features/modeling';\r\nimport moveModule from 'diagram-js/lib/features/move';\r\n\r\nimport {\r\n  createCanvasEvent as canvasEvent\r\n} from '../../../util/MockEvents';\r\n\r\nimport { getMid } from 'diagram-js/lib/layout/LayoutUtil';\r\n\r\nimport {\r\n  isString,\r\n  pick,\r\n  assign\r\n} from 'min-dash';\r\n\r\nvar LOW_PRIORITY = 500;\r\n\r\n\r\ndescribe('features/grid-snapping', function() {\r\n\r\n  describe('basics', function() {\r\n\r\n    describe('create', function() {\r\n\r\n      var diagramXML = require('./basic.bpmn');\r\n\r\n      beforeEach(bootstrapModeler(diagramXML, {\r\n        modules: [\r\n          coreModule,\r\n          createModule,\r\n          gridSnappingModule,\r\n          modelingModule,\r\n          moveModule\r\n        ]\r\n      }));\r\n\r\n\r\n      it('start event', inject(function(canvas, create, dragging, elementFactory, eventBus) {\r\n\r\n        // given\r\n        var rootElement = canvas.getRootElement(),\r\n            rootGfx = canvas.getGraphics(rootElement);\r\n\r\n        var startEvent = elementFactory.createShape({ type: 'bpmn:StartEvent' });\r\n\r\n        var events = recordEvents(eventBus, [\r\n          'create.move',\r\n          'create.end'\r\n        ]);\r\n\r\n        // when\r\n        create.start(canvasEvent({ x: 100, y: 100 }), startEvent);\r\n\r\n        dragging.hover({ element: rootElement, gfx: rootGfx });\r\n\r\n        dragging.move(canvasEvent({ x: 106, y: 112 }));\r\n        dragging.move(canvasEvent({ x: 112, y: 124 }));\r\n        dragging.move(canvasEvent({ x: 118, y: 136 }));\r\n        dragging.move(canvasEvent({ x: 124, y: 148 }));\r\n        dragging.move(canvasEvent({ x: 130, y: 160 }));\r\n\r\n        dragging.end();\r\n\r\n        // then\r\n        expect(events.map(position)).to.eql([\r\n          { x: 100, y: 100 }, // move (triggered on create.start thanks to autoActivate)\r\n          { x: 110, y: 110 }, // move\r\n          { x: 110, y: 120 }, // move\r\n          { x: 120, y: 140 }, // move\r\n          { x: 120, y: 150 }, // move\r\n          { x: 130, y: 160 }, // move\r\n          { x: 130, y: 160 } // end\r\n        ]);\r\n\r\n        // expect snapped\r\n        expect(getMid(startEvent)).to.eql({\r\n          x: 130,\r\n          y: 160\r\n        });\r\n      }));\r\n\r\n    });\r\n\r\n  });\r\n\r\n\r\n  describe('snap top-left on move', function() {\r\n\r\n    var diagramXML = require('./BpmnGridSnapping.bpmn');\r\n\r\n    beforeEach(bootstrapModeler(diagramXML, {\r\n      modules: [\r\n        coreModule,\r\n        createModule,\r\n        gridSnappingModule,\r\n        modelingModule,\r\n        moveModule,\r\n        gridSnappingModule\r\n      ]\r\n    }));\r\n\r\n    var participant,\r\n        subProcess,\r\n        textAnnotation;\r\n\r\n    beforeEach(inject(function(elementRegistry) {\r\n      participant = elementRegistry.get('Participant_1');\r\n      subProcess = elementRegistry.get('SubProcess_1');\r\n      textAnnotation = elementRegistry.get('TextAnnotation_1');\r\n    }));\r\n\r\n\r\n    it('participant', inject(function(dragging, eventBus, move) {\r\n\r\n      // given\r\n      var events = recordEvents(eventBus, [\r\n        'shape.move.move',\r\n        'shape.move.end'\r\n      ]);\r\n\r\n      // when\r\n      move.start(canvasEvent({ x: 100, y: 100 }), participant);\r\n\r\n      dragging.move(canvasEvent({ x: 106, y: 112 }));\r\n      dragging.move(canvasEvent({ x: 112, y: 124 }));\r\n      dragging.move(canvasEvent({ x: 118, y: 136 }));\r\n      dragging.move(canvasEvent({ x: 124, y: 148 }));\r\n      dragging.move(canvasEvent({ x: 130, y: 160 }));\r\n\r\n      dragging.end();\r\n\r\n      // then\r\n      expect(events.map(position('top-left'))).to.eql([\r\n        { x: 110, y: 110 }, // move\r\n        { x: 110, y: 120 }, // move\r\n        { x: 120, y: 140 }, // move\r\n        { x: 120, y: 150 }, // move\r\n        { x: 130, y: 160 }, // move\r\n        { x: 130, y: 160 } // end\r\n      ]);\r\n\r\n      // expect snapped to top-left\r\n      expect(participant.x).to.equal(130);\r\n      expect(participant.y).to.equal(160);\r\n    }));\r\n\r\n\r\n    it('sub process', inject(function(dragging, eventBus, move) {\r\n\r\n      // given\r\n      var events = recordEvents(eventBus, [\r\n        'shape.move.move',\r\n        'shape.move.end'\r\n      ]);\r\n\r\n      // when\r\n      move.start(canvasEvent({ x: 150, y: 130 }), subProcess);\r\n\r\n      dragging.move(canvasEvent({ x: 156, y: 142 }));\r\n      dragging.move(canvasEvent({ x: 162, y: 154 }));\r\n      dragging.move(canvasEvent({ x: 168, y: 166 }));\r\n      dragging.move(canvasEvent({ x: 174, y: 178 }));\r\n      dragging.move(canvasEvent({ x: 180, y: 190 }));\r\n\r\n      dragging.end();\r\n\r\n      // then\r\n      expect(events.map(position('top-left'))).to.eql([\r\n        { x: 160, y: 140 }, // move\r\n        { x: 160, y: 150 }, // move\r\n        { x: 170, y: 170 }, // move\r\n        { x: 170, y: 180 }, // move\r\n        { x: 180, y: 190 }, // move\r\n        { x: 180, y: 190 } // end\r\n      ]);\r\n\r\n      // expect snapped to top-left\r\n      expect(subProcess.x).to.equal(180);\r\n      expect(subProcess.y).to.equal(190);\r\n    }));\r\n\r\n\r\n    it('text annotation', inject(function(dragging, eventBus, move) {\r\n\r\n      // given\r\n      var events = recordEvents(eventBus, [\r\n        'shape.move.move',\r\n        'shape.move.end'\r\n      ]);\r\n\r\n      // when\r\n      move.start(canvasEvent({ x: 700, y: 20 }), textAnnotation);\r\n\r\n      dragging.move(canvasEvent({ x: 706, y: 32 }));\r\n      dragging.move(canvasEvent({ x: 712, y: 44 }));\r\n      dragging.move(canvasEvent({ x: 718, y: 56 }));\r\n      dragging.move(canvasEvent({ x: 724, y: 68 }));\r\n      dragging.move(canvasEvent({ x: 730, y: 80 }));\r\n\r\n      dragging.end();\r\n\r\n      // then\r\n      expect(events.map(position('top-left'))).to.eql([\r\n        { x: 710, y: 30 }, // move\r\n        { x: 710, y: 40 }, // move\r\n        { x: 720, y: 60 }, // move\r\n        { x: 720, y: 70 }, // move\r\n        { x: 730, y: 80 }, // move\r\n        { x: 730, y: 80 } // end\r\n      ]);\r\n\r\n      // expect snapped to top-left\r\n      expect(textAnnotation.x).to.equal(730);\r\n      expect(textAnnotation.y).to.equal(80);\r\n    }));\r\n\r\n  });\r\n\r\n\r\n  describe('auto resize <nwse> on toggle collapse', function() {\r\n\r\n    var diagramXML = require('./BpmnGridSnapping.bpmn');\r\n\r\n    beforeEach(bootstrapModeler(diagramXML, {\r\n      modules: [\r\n        coreModule,\r\n        createModule,\r\n        gridSnappingModule,\r\n        modelingModule,\r\n        moveModule,\r\n        gridSnappingModule\r\n      ]\r\n    }));\r\n\r\n    var participant,\r\n        subProcess;\r\n\r\n    beforeEach(inject(function(elementRegistry) {\r\n      participant = elementRegistry.get('Participant_1');\r\n      subProcess = elementRegistry.get('SubProcess_1');\r\n    }));\r\n\r\n\r\n    describe('collapsing', function() {\r\n\r\n      it('participant (no auto resize)', inject(function(bpmnReplace) {\r\n\r\n        // given\r\n        var collapsedBounds = assign(\r\n          getBounds(participant),\r\n          { height: 60 }\r\n        );\r\n\r\n        // when\r\n        var collapsedParticipant = bpmnReplace.replaceElement(participant,\r\n          {\r\n            type: 'bpmn:Participant',\r\n            isExpanded: false\r\n          }\r\n        );\r\n\r\n        // then\r\n        expect(collapsedParticipant).to.have.bounds(collapsedBounds);\r\n      }));\r\n\r\n\r\n      it('sub process (no auto resize)', inject(function(bpmnReplace) {\r\n\r\n        // given\r\n        var mid = getMid(subProcess);\r\n\r\n        // when\r\n        var collapsedSubProcess = bpmnReplace.replaceElement(subProcess,\r\n          {\r\n            type: 'bpmn:SubProcess',\r\n            isExpanded: false\r\n          }\r\n        );\r\n\r\n        // then\r\n        expect(getMid(collapsedSubProcess)).to.eql(mid);\r\n        expect(collapsedSubProcess).to.include({\r\n          width: 100,\r\n          height: 80\r\n        });\r\n      }));\r\n\r\n    });\r\n\r\n\r\n    describe('expanding', function() {\r\n\r\n      it('participant (auto resize <nwse>)', inject(function(bpmnReplace) {\r\n\r\n        // given\r\n        var bounds = getBounds(participant);\r\n\r\n        var collapsedParticipant = bpmnReplace.replaceElement(participant,\r\n          {\r\n            type: 'bpmn:Participant',\r\n            isExpanded: false\r\n          }\r\n        );\r\n\r\n        // when\r\n        var expandedParticipant = bpmnReplace.replaceElement(collapsedParticipant,\r\n          {\r\n            type: 'bpmn:Participant',\r\n            isExpanded: true\r\n          }\r\n        );\r\n\r\n        // then\r\n        expect(expandedParticipant).to.have.bounds(bounds);\r\n      }));\r\n\r\n\r\n      it('sub process (auto resize <nwse>)', inject(function(bpmnReplace) {\r\n\r\n        // given\r\n        var collapsedSubProcess = bpmnReplace.replaceElement(subProcess,\r\n          {\r\n            type: 'bpmn:SubProcess',\r\n            isExpanded: false\r\n          }\r\n        );\r\n\r\n        // when\r\n        var expandedSubProcess = bpmnReplace.replaceElement(collapsedSubProcess,\r\n          {\r\n            type: 'bpmn:SubProcess',\r\n            isExpanded: true\r\n          }\r\n        );\r\n\r\n        // then\r\n        expect(expandedSubProcess).to.include({\r\n          x: 150,\r\n          y: 120,\r\n          width: 360,\r\n          height: 210\r\n        });\r\n      }));\r\n\r\n    });\r\n\r\n  });\r\n\r\n});\r\n\r\n// helpers //////////\r\n\r\nfunction recordEvents(eventBus, eventTypes) {\r\n  var events = [];\r\n\r\n  eventTypes.forEach(function(eventType) {\r\n    eventBus.on(eventType, LOW_PRIORITY, function(event) {\r\n      events.push(event);\r\n    });\r\n  });\r\n\r\n  return events;\r\n}\r\n\r\n/**\r\n * Returns x and y of an event. If called with string that specifies orientation if will return\r\n * x and y of specified orientation.\r\n *\r\n * @param {Object|string} event - Event or orientation <top|right|bottom|left>\r\n *\r\n * @return {Object}\r\n */\r\nfunction position(event) {\r\n  var orientation;\r\n\r\n  if (isString(event)) {\r\n    orientation = event;\r\n\r\n    return function(event) {\r\n      var shape = event.shape;\r\n\r\n      var x = event.x,\r\n          y = event.y;\r\n\r\n      if (/top/.test(orientation)) {\r\n        y -= shape.height / 2;\r\n      }\r\n\r\n      if (/right/.test(orientation)) {\r\n        x += shape.width / 2;\r\n      }\r\n\r\n      if (/bottom/.test(orientation)) {\r\n        y += shape.height / 2;\r\n      }\r\n\r\n      if (/left/.test(orientation)) {\r\n        x -= shape.width / 2;\r\n      }\r\n\r\n      return {\r\n        x: x,\r\n        y: y\r\n      };\r\n    };\r\n  }\r\n\r\n  return {\r\n    x: event.x,\r\n    y: event.y\r\n  };\r\n}\r\n\r\nfunction getBounds(shape) {\r\n  return pick(shape, [ 'x', 'y', 'width', 'height' ]);\r\n}"
  },
  {
    "path": "test/spec/features/grid-snapping/basic.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\" />\n    <bpmn:task id=\"Task_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"353\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/grid-snapping/behavior/AutoPlaceBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.0.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:startEvent id=\"StartEvent_1\" />\n    <bpmn:task id=\"Task_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"BPMNShape_StartEvent_1\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"82\" y=\"87\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"50\" y=\"260\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/grid-snapping/behavior/AutoPlaceBehaviorSpec.js",
    "content": "import {\r\n  bootstrapModeler,\r\n  inject\r\n} from 'test/TestHelper';\r\n\r\nimport { getMid } from 'diagram-js/lib/layout/LayoutUtil';\r\n\r\nimport autoPlaceModule from 'lib/features/auto-place';\r\nimport coreModule from 'lib/core';\r\nimport gridSnappingModule from 'lib/features/grid-snapping';\r\nimport modelingModule from 'lib/features/modeling';\r\n\r\n\r\ndescribe('features/grid-snapping - auto-place', function() {\r\n\r\n  var diagramXML = require('./AutoPlaceBehavior.bpmn');\r\n\r\n  beforeEach(bootstrapModeler(diagramXML, {\r\n    modules: [\r\n      autoPlaceModule,\r\n      coreModule,\r\n      gridSnappingModule,\r\n      modelingModule\r\n    ]\r\n  }));\r\n\r\n\r\n  describe('flow node', function() {\r\n\r\n    it('without existing elements', inject(function(autoPlace, elementFactory, elementRegistry) {\r\n\r\n      // given\r\n      var shape1 = elementFactory.createShape({\r\n        id: 'Task_2',\r\n        type: 'bpmn:Task'\r\n      });\r\n\r\n      var source = elementRegistry.get('StartEvent_1');\r\n\r\n      // when\r\n      autoPlace.append(source, shape1);\r\n\r\n      // then\r\n      shape1 = elementRegistry.get('Task_2');\r\n\r\n      expect(getMid(shape1)).to.eql({\r\n        x: 220, // 218 snapped to 220\r\n        y: 105 // not snapped\r\n      });\r\n    }));\r\n\r\n\r\n    it('with existing elements', inject(function(autoPlace, elementFactory, elementRegistry) {\r\n\r\n      // given\r\n      var shape1 = elementFactory.createShape({\r\n        id: 'Task_2',\r\n        type: 'bpmn:Task'\r\n      });\r\n\r\n      var source = elementRegistry.get('StartEvent_1');\r\n\r\n      autoPlace.append(source, shape1);\r\n\r\n      var shape2 = elementFactory.createShape({\r\n        id: 'Task_3',\r\n        type: 'bpmn:Task'\r\n      });\r\n\r\n      // when\r\n      autoPlace.append(source, shape2);\r\n\r\n      // then\r\n      shape2 = elementRegistry.get('Task_3');\r\n\r\n      expect(getMid(shape2)).to.eql({\r\n        x: 220, // 220 snapped to 220\r\n        y: 220 // 215 snapped to 220\r\n      });\r\n    }));\r\n\r\n  });\r\n\r\n\r\n  describe('text annotation', function() {\r\n\r\n    it('without existing elements', inject(function(autoPlace, elementFactory, elementRegistry) {\r\n\r\n      // given\r\n      var shape1 = elementFactory.createShape({\r\n        id: 'TextAnnotation_1',\r\n        type: 'bpmn:TextAnnotation'\r\n      });\r\n\r\n      var source = elementRegistry.get('StartEvent_1');\r\n\r\n      // when\r\n      autoPlace.append(source, shape1);\r\n\r\n      // then\r\n      shape1 = elementRegistry.get('TextAnnotation_1');\r\n\r\n      expect(getMid(shape1)).to.eql({\r\n        x: 170, // 168 snapped to 170\r\n        y: 15 // 22 snapped to 15\r\n      });\r\n    }));\r\n\r\n\r\n    it('with existing elements', inject(function(autoPlace, elementFactory, elementRegistry) {\r\n\r\n      // given\r\n      var shape1 = elementFactory.createShape({\r\n        id: 'TextAnnotation_1',\r\n        type: 'bpmn:TextAnnotation'\r\n      });\r\n\r\n      var source = elementRegistry.get('StartEvent_1');\r\n\r\n      autoPlace.append(source, shape1);\r\n\r\n      var shape2 = elementFactory.createShape({\r\n        id: 'TextAnnotation_2',\r\n        type: 'bpmn:TextAnnotation'\r\n      });\r\n\r\n      // when\r\n      autoPlace.append(source, shape2);\r\n\r\n      // then\r\n      shape2 = elementRegistry.get('TextAnnotation_2');\r\n\r\n      expect(getMid(shape2)).to.eql({\r\n        x: 170, // 168 snapped to 170\r\n        y: -45 // -45 snapped to -45\r\n      });\r\n    }));\r\n\r\n  });\r\n\r\n\r\n  describe('data object/store reference', function() {\r\n\r\n    it('without existing elements', inject(function(autoPlace, elementFactory, elementRegistry) {\r\n\r\n      // given\r\n      var shape1 = elementFactory.createShape({\r\n        id: 'DataObjectReference_1',\r\n        type: 'bpmn:DataObjectReference'\r\n      });\r\n\r\n      var source = elementRegistry.get('Task_1');\r\n\r\n      // when\r\n      autoPlace.append(source, shape1);\r\n\r\n      // then\r\n      shape1 = elementRegistry.get('DataObjectReference_1');\r\n\r\n      expect(getMid(shape1)).to.eql({\r\n        x: 160, // 158 snapped to 160\r\n        y: 400 // 398 snapped to 400\r\n      });\r\n    }));\r\n\r\n\r\n    it('with existing elements', inject(function(autoPlace, elementFactory, elementRegistry) {\r\n\r\n      // given\r\n      var shape1 = elementFactory.createShape({\r\n        id: 'DataObjectReference_1',\r\n        type: 'bpmn:DataObjectReference'\r\n      });\r\n\r\n      var source = elementRegistry.get('Task_1');\r\n\r\n      autoPlace.append(source, shape1);\r\n\r\n      var shape2 = elementFactory.createShape({\r\n        id: 'DataObjectReference_2',\r\n        type: 'bpmn:DataObjectReference'\r\n      });\r\n\r\n      // when\r\n      autoPlace.append(source, shape2);\r\n\r\n      // then\r\n      shape2 = elementRegistry.get('DataObjectReference_2');\r\n\r\n      expect(getMid(shape2)).to.eql({\r\n        x: 230, // 226 snapped to 230\r\n        y: 400 // 398 snapped to 400\r\n      });\r\n    }));\r\n\r\n  });\r\n\r\n});"
  },
  {
    "path": "test/spec/features/grid-snapping/behavior/AutoResizeBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.1.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <bpmn:task id=\"Task_1\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"100\" y=\"100\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"275\" y=\"175\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/grid-snapping/behavior/AutoResizeBehaviorSpec.js",
    "content": "import {\r\n  bootstrapModeler,\r\n  inject\r\n} from 'test/TestHelper';\r\n\r\nimport autoResizeModule from 'lib/features/auto-resize';\r\nimport coreModule from 'lib/core';\r\nimport gridSnappingModule from 'lib/features/grid-snapping';\r\nimport modelingModule from 'lib/features/modeling';\r\n\r\n\r\ndescribe('features/grid-snapping - auto-resize', function() {\r\n\r\n  var diagramXML = require('./AutoResizeBehavior.bpmn');\r\n\r\n  beforeEach(bootstrapModeler(diagramXML, {\r\n    modules: [\r\n      autoResizeModule,\r\n      coreModule,\r\n      gridSnappingModule,\r\n      modelingModule\r\n    ]\r\n  }));\r\n\r\n\r\n  it('should snap <sw> (width, height)', inject(function(elementRegistry, modeling) {\r\n\r\n    // given\r\n    var subProcess = elementRegistry.get('SubProcess_1'),\r\n        task = elementRegistry.get('Task_1');\r\n\r\n    [\r\n      { x: 100, y: 100, width: 350, height: 270 },\r\n      { x: 100, y: 100, width: 450, height: 270 },\r\n      { x: 100, y: 100, width: 450, height: 360 },\r\n      { x: 100, y: 100, width: 450, height: 360 },\r\n      { x: 100, y: 100, width: 560, height: 460 }\r\n    ].forEach(function(bounds) {\r\n\r\n      // when\r\n      modeling.moveElements([ task ], { x: 36, y: 48 }, subProcess);\r\n\r\n      // then\r\n      expect(subProcess).to.have.bounds(bounds);\r\n    });\r\n  }));\r\n\r\n});"
  },
  {
    "path": "test/spec/features/grid-snapping/behavior/CreateParticipantBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1sgpq8p\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.1.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"SubProcess_1\" />\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n    </bpmn:subProcess>\n    <bpmn:endEvent id=\"EndEvent_1\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"SubProcess_1\" targetRef=\"EndEvent_1\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_1\" attachedToRef=\"SubProcess_1\">\n      <bpmn:outgoing>SequenceFlow_3</bpmn:outgoing>\n    </bpmn:boundaryEvent>\n    <bpmn:endEvent id=\"EndEvent_2\">\n      <bpmn:incoming>SequenceFlow_3</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_3\" sourceRef=\"BoundaryEvent_1\" targetRef=\"EndEvent_2\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"5\" y=\"187\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1ope89t_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"41\" y=\"205\" />\n        <di:waypoint x=\"100\" y=\"205\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"SubProcess_0qd2wll_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"100\" y=\"105\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_01vi313_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"509\" y=\"187\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0lo6y23_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint x=\"450\" y=\"205\" />\n        <di:waypoint x=\"509\" y=\"205\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_0vmvyig_di\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds x=\"257\" y=\"287\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_1a5k354_di\" bpmnElement=\"EndEvent_2\">\n        <dc:Bounds x=\"343\" y=\"369\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1lxbayl_di\" bpmnElement=\"SequenceFlow_3\">\n        <di:waypoint x=\"275\" y=\"323\" />\n        <di:waypoint x=\"275\" y=\"387\" />\n        <di:waypoint x=\"343\" y=\"387\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/grid-snapping/behavior/CreateParticipantBehaviorSpec.js",
    "content": "import {\r\n  bootstrapModeler,\r\n  inject\r\n} from 'test/TestHelper';\r\n\r\nimport coreModule from 'lib/core';\r\nimport createModule from 'diagram-js/lib/features/create';\r\nimport gridSnappingModule from 'lib/features/grid-snapping';\r\nimport modelingModule from 'lib/features/modeling';\r\n\r\nimport { createCanvasEvent as canvasEvent } from '../../../../util/MockEvents';\r\n\r\n\r\ndescribe('features/grid-snapping - create participant', function() {\r\n\r\n  var diagramXML = require('./CreateParticipantBehavior.bpmn');\r\n\r\n  beforeEach(bootstrapModeler(diagramXML, {\r\n    modules: [\r\n      coreModule,\r\n      createModule,\r\n      gridSnappingModule,\r\n      modelingModule\r\n    ]\r\n  }));\r\n\r\n\r\n  it('should snap width and height', inject(\r\n    function(create, dragging, elementFactory, elementRegistry) {\r\n\r\n      // given\r\n      var process = elementRegistry.get('Process_1'),\r\n          processGfx = elementRegistry.getGraphics(process);\r\n\r\n      var participant = elementFactory.createParticipantShape();\r\n\r\n      // when\r\n      create.start(canvasEvent({ x: 100, y: 100 }), participant);\r\n\r\n      dragging.hover({ element: process, gfx: processGfx });\r\n\r\n      dragging.move(canvasEvent({ x: 100, y: 100 }));\r\n\r\n      dragging.end();\r\n\r\n      // then\r\n      expect(participant.width).to.equal(610);\r\n      expect(participant.height).to.equal(340);\r\n    }\r\n  ));\r\n\r\n});"
  },
  {
    "path": "test/spec/features/grid-snapping/behavior/LayoutConnectionBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"4.0.0-beta.1\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:task id=\"Task_1\" />\n    <bpmn:task id=\"Task_2\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"Task_3\" />\n    <bpmn:task id=\"Task_4\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_1\" attachedToRef=\"Task_3\" />\n    <bpmn:task id=\"Task_5\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"Task_2\" targetRef=\"Task_5\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"100\" y=\"100\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"300\" y=\"200\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_3_di\" bpmnElement=\"Task_3\">\n        <dc:Bounds x=\"100\" y=\"400\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_4_di\" bpmnElement=\"Task_4\">\n        <dc:Bounds x=\"300\" y=\"400\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1_di\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds x=\"132\" y=\"462\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_5_di\" bpmnElement=\"Task_5\">\n        <dc:Bounds x=\"546\" y=\"270\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"456\" y=\"242\" />\n        <di:waypoint x=\"526\" y=\"242\" />\n        <di:waypoint x=\"526\" y=\"310\" />\n        <di:waypoint x=\"546\" y=\"310\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/grid-snapping/behavior/LayoutConnectionBehaviorSpec.js",
    "content": "import {\r\n  bootstrapModeler,\r\n  inject\r\n} from 'test/TestHelper';\r\n\r\nimport coreModule from 'lib/core';\r\nimport gridSnappingModule from 'lib/features/grid-snapping';\r\nimport modelingModule from 'lib/features/modeling';\r\nimport moveModule from 'diagram-js/lib/features/move';\r\nimport copyPasteModule from 'lib/features/copy-paste';\r\n\r\n\r\ndescribe('features/grid-snapping - layout connection', function() {\r\n\r\n  describe('on connection create', function() {\r\n\r\n    var diagramXML = require('./LayoutConnectionBehavior.bpmn');\r\n\r\n    beforeEach(bootstrapModeler(diagramXML, {\r\n      modules: [\r\n        coreModule,\r\n        gridSnappingModule,\r\n        modelingModule,\r\n        moveModule\r\n      ]\r\n    }));\r\n\r\n\r\n    it('should snap 3 segment connection (1 middle segment)', inject(\r\n      function(elementRegistry, modeling) {\r\n\r\n        // given\r\n        var task1 = elementRegistry.get('Task_1'),\r\n            task2 = elementRegistry.get('Task_2');\r\n\r\n        // when\r\n        var connection = modeling.connect(task1, task2);\r\n\r\n        // then\r\n        expect(connection.waypoints[1]).to.eql({ x: 250, y: 140 });\r\n        expect(connection.waypoints[2]).to.eql({ x: 250, y: 240 });\r\n      })\r\n    );\r\n\r\n\r\n    it('should snap 4 segment connection (2 middle segments)', inject(\r\n      function(elementRegistry, modeling) {\r\n\r\n        // given\r\n        var boundaryEvent1 = elementRegistry.get('BoundaryEvent_1'),\r\n            task4 = elementRegistry.get('Task_4');\r\n\r\n        // when\r\n        var connection = modeling.connect(boundaryEvent1, task4);\r\n\r\n        // then\r\n        expect(connection.waypoints[1]).to.eql({ x: 150, y: 520 });\r\n        expect(connection.waypoints[2]).to.eql({ x: 230, y: 520 });\r\n        expect(connection.waypoints[3]).to.eql({ x: 230, y: 440 });\r\n      }\r\n    ));\r\n\r\n  });\r\n\r\n\r\n  describe('on connection layout', function() {\r\n\r\n    var diagramXML = require('./LayoutConnectionBehavior.bpmn');\r\n\r\n    beforeEach(bootstrapModeler(diagramXML, {\r\n      modules: [\r\n        coreModule,\r\n        gridSnappingModule,\r\n        modelingModule,\r\n        moveModule\r\n      ]\r\n    }));\r\n\r\n    var task1, task2, connection;\r\n\r\n    beforeEach(inject(function(elementRegistry, modeling) {\r\n\r\n      // given\r\n      task1 = elementRegistry.get('Task_1'),\r\n      task2 = elementRegistry.get('Task_2');\r\n\r\n      connection = modeling.connect(task1, task2);\r\n    }));\r\n\r\n\r\n    it('should NOT snap on reconnect start', inject(function(modeling) {\r\n\r\n      // when\r\n      modeling.moveElements([ task1 ], { x: 50, y: 50 });\r\n\r\n      // then\r\n      expect(connection.waypoints[1]).to.eql({ x: 275, y: 190 });\r\n      expect(connection.waypoints[2]).to.eql({ x: 275, y: 240 });\r\n    }));\r\n\r\n\r\n    it('should NOT snap on reconnect end', inject(function(modeling) {\r\n\r\n      // when\r\n      modeling.moveElements([ task2 ], { x: -50, y: -50 });\r\n\r\n      // then\r\n      expect(connection.waypoints[1]).to.eql({ x: 225, y: 140 });\r\n      expect(connection.waypoints[2]).to.eql({ x: 225, y: 190 });\r\n    }));\r\n\r\n\r\n    it('should snap', inject(function(modeling, elementRegistry) {\r\n\r\n      // given\r\n      var flow = elementRegistry.get('SequenceFlow_1');\r\n\r\n      // when\r\n      modeling.layoutConnection(flow);\r\n\r\n      // then\r\n      expect(flow.waypoints[1]).to.eql({ x: 530, y: 242 });\r\n      expect(flow.waypoints[2]).to.eql({ x: 530, y: 310 });\r\n    }));\r\n\r\n\r\n    it('should UNDO snap', inject(function(modeling, commandStack, elementRegistry) {\r\n\r\n      // given\r\n      var flow = elementRegistry.get('SequenceFlow_1');\r\n\r\n      modeling.layoutConnection(flow);\r\n\r\n      // when\r\n      commandStack.undo();\r\n\r\n      // then\r\n      expect(flow.waypoints[1]).to.eql({ x: 526, y: 242 });\r\n      expect(flow.waypoints[2]).to.eql({ x: 526, y: 310 });\r\n    }));\r\n\r\n  });\r\n\r\n\r\n  describe('on paste multiple', function() {\r\n\r\n    var diagramXML = require('./LayoutConnectionBehavior.bpmn');\r\n\r\n    beforeEach(bootstrapModeler(diagramXML, {\r\n      modules: [\r\n        coreModule,\r\n        gridSnappingModule,\r\n        modelingModule,\r\n        moveModule,\r\n        copyPasteModule\r\n      ]\r\n    }));\r\n\r\n\r\n    it('should not update waypoints', inject(\r\n      function(canvas, eventBus, copyPaste, elementRegistry) {\r\n\r\n        // given\r\n        var layoutSpy = sinon.spy();\r\n\r\n        copyPaste.copy([\r\n          elementRegistry.get('Task_2'),\r\n          elementRegistry.get('SequenceFlow_1'),\r\n          elementRegistry.get('Task_5')\r\n        ]);\r\n\r\n        eventBus.on('commandStack.connection.updateWaypoints.execute', layoutSpy);\r\n\r\n        // when\r\n        copyPaste.paste({\r\n          element: canvas.getRootElement(),\r\n          point: {\r\n            x: 100,\r\n            y: 200\r\n          }\r\n        });\r\n\r\n        // then\r\n        expect(layoutSpy).not.to.have.been.called;\r\n      }\r\n    ));\r\n\r\n  });\r\n\r\n});"
  },
  {
    "path": "test/spec/features/interaction-events/BpmnInteractionEventsSpec.js",
    "content": "import {\n  queryAll as domQueryAll\n} from 'min-dom';\n\nimport {\n  getBpmnJS,\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\nimport interactionEventsModule from 'lib/features/interaction-events';\n\nimport createModule from 'diagram-js/lib/features/create';\nimport moveModule from 'diagram-js/lib/features/move';\n\nvar testModules = [\n  coreModule,\n  modelingModule,\n  interactionEventsModule,\n  createModule,\n  moveModule\n];\n\nvar HIT_ALL_CLS = 'djs-hit-all';\nvar HIT_CLICK_STROKE_CLS = 'djs-hit-click-stroke';\nvar HIT_NO_MOVE_CLS = 'djs-hit-no-move';\n\n\ndescribe('features/interaction-events', function() {\n\n  describe('participant hits', function() {\n\n    var diagramXML = require('test/fixtures/bpmn/collaboration.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n    beforeEach(inject(function(dragging) {\n      dragging.setOptions({ manual: true });\n    }));\n\n\n    it('should create THREE hit zones per participant', inject(function(elementRegistry) {\n\n      // given\n      var participant = elementRegistry.get('Participant_1');\n      var hitZones = getHitZones(participant);\n\n      // then\n      expectToHaveChildren(HIT_ALL_CLS, 1, participant);\n      expectToHaveChildren(HIT_CLICK_STROKE_CLS, 1, participant);\n      expectToHaveChildren(HIT_NO_MOVE_CLS, 1, participant);\n\n      expectSize(hitZones.all[0], { width: 30, height: participant.height });\n      expectSize(hitZones.click[0], { width: participant.width, height: participant.height });\n      expectSize(hitZones.noMove[0], { width: participant.width, height: participant.height });\n    }));\n\n\n    it('should create THREE hit zones per lane', inject(function(elementRegistry) {\n\n      // given\n      var lane = elementRegistry.get('Lane_1');\n      var hitZones = getHitZones(lane);\n\n      // then\n      expectToHaveChildren(HIT_ALL_CLS, 1, lane);\n      expectToHaveChildren(HIT_CLICK_STROKE_CLS, 1, lane);\n      expectToHaveChildren(HIT_NO_MOVE_CLS, 1, lane);\n\n      expectSize(hitZones.all[0], { width: 30, height: lane.height });\n      expectSize(hitZones.click[0], { width: lane.width, height: lane.height });\n      expectSize(hitZones.noMove[0], { width: lane.width, height: lane.height });\n    }));\n\n\n    it('should create one hit zone per collapsed participant',\n      inject(function(elementRegistry, bpmnReplace) {\n\n        // given\n        var participant = elementRegistry.get('Participant_1');\n\n        // when\n        var collapsedParticipant = bpmnReplace.replaceElement(participant, {\n          type: 'bpmn:Participant',\n          isExpanded: false\n        });\n        var hitZones = getHitZones(collapsedParticipant);\n\n        // then\n        expectToHaveChildren(HIT_ALL_CLS, 1, collapsedParticipant);\n        expectSize(hitZones.all[0], { width: collapsedParticipant.width, height: collapsedParticipant.height });\n      })\n    );\n\n  });\n\n\n  describe('vertical participant hits', function() {\n\n    var diagramXML = require('test/fixtures/bpmn/collaboration-vertical.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n    beforeEach(inject(function(dragging) {\n      dragging.setOptions({ manual: true });\n    }));\n\n\n    it('should create THREE hit zones per participant', inject(function(elementRegistry) {\n\n      // given\n      var participant = elementRegistry.get('V_Participant_1');\n      var hitZones = getHitZones(participant);\n\n      // then\n      expectToHaveChildren(HIT_ALL_CLS, 1, participant);\n      expectToHaveChildren(HIT_CLICK_STROKE_CLS, 1, participant);\n      expectToHaveChildren(HIT_NO_MOVE_CLS, 1, participant);\n\n      expectSize(hitZones.all[0], { width: participant.width, height: 30 });\n      expectSize(hitZones.click[0], { width: participant.width, height: participant.height });\n      expectSize(hitZones.noMove[0], { width: participant.width, height: participant.height });\n    }));\n\n\n    it('should create THREE hit zones per lane', inject(function(elementRegistry) {\n\n      // given\n      var lane = elementRegistry.get('V_Lane_1');\n      var hitZones = getHitZones(lane);\n\n      // then\n      expectToHaveChildren(HIT_ALL_CLS, 1, lane);\n      expectToHaveChildren(HIT_CLICK_STROKE_CLS, 1, lane);\n      expectToHaveChildren(HIT_NO_MOVE_CLS, 1, lane);\n\n      expectSize(hitZones.all[0], { width: lane.width, height: 30 });\n      expectSize(hitZones.click[0], { width: lane.width, height: lane.height });\n      expectSize(hitZones.noMove[0], { width: lane.width, height: lane.height });\n    }));\n\n\n    it('should create one hit zone per collapsed participant',\n      inject(function(elementRegistry, bpmnReplace) {\n\n        // given\n        var participant = elementRegistry.get('V_Participant_1');\n\n        // when\n        var collapsedParticipant = bpmnReplace.replaceElement(participant, {\n          type: 'bpmn:Participant',\n          isExpanded: false\n        });\n        var hitZones = getHitZones(collapsedParticipant);\n\n        // then\n        expectToHaveChildren(HIT_ALL_CLS, 1, collapsedParticipant);\n        expectSize(hitZones.all[0], { width: collapsedParticipant.width, height: collapsedParticipant.height });\n      })\n    );\n\n  });\n\n\n  describe('sub process hits', function() {\n\n    var diagramXML = require('test/fixtures/bpmn/containers.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n    beforeEach(inject(function(dragging) {\n      dragging.setOptions({ manual: true });\n    }));\n\n\n    it('should create THREE hit zones per sub process', inject(function(elementRegistry) {\n\n      // given\n      var subProcess = elementRegistry.get('SubProcess_1');\n\n      // then\n      expectToHaveChildren(HIT_ALL_CLS, 1, subProcess);\n      expectToHaveChildren(HIT_CLICK_STROKE_CLS, 1, subProcess);\n      expectToHaveChildren(HIT_NO_MOVE_CLS, 1, subProcess);\n    }));\n\n\n    it('should create one hit zone per collapsed sub process',\n      inject(function(elementRegistry, bpmnReplace) {\n\n        // given\n        var subProcess = elementRegistry.get('SubProcess_1');\n\n        // when\n        var collapsedSubProcess = bpmnReplace.replaceElement(subProcess, {\n          type: 'bpmn:SubProcess',\n          isExpanded: false\n        });\n\n        // then\n        expectToHaveChildren(HIT_ALL_CLS, 1, collapsedSubProcess);\n        expectToHaveChildren(HIT_CLICK_STROKE_CLS, 0, collapsedSubProcess);\n      })\n    );\n  });\n\n});\n\n\n\n// helper ///////////\n\nfunction expectToHaveChildren(className, expectedCount, element) {\n\n  var selector = '.' + className;\n\n  var elementRegistry = getBpmnJS().get('elementRegistry'),\n      gfx = elementRegistry.getGraphics(element),\n      realCount = domQueryAll(selector, gfx).length;\n\n  expect(\n    realCount,\n    'expected ' + element.id + ' to have ' + expectedCount +\n    ' children mat ' + selector + ' but got ' + realCount\n  ).to.eql(expectedCount);\n}\n\nfunction getHitZones(element) {\n  var elementRegistry = getBpmnJS().get('elementRegistry'),\n      gfx = elementRegistry.getGraphics(element);\n\n  return {\n    all: domQueryAll('.' + HIT_ALL_CLS, gfx),\n    click: domQueryAll('.' + HIT_CLICK_STROKE_CLS, gfx),\n    noMove: domQueryAll('.' + HIT_NO_MOVE_CLS, gfx)\n  };\n}\n\nfunction expectSize(element, expectedSize) {\n  var size = getSize(element);\n\n  expect(size.width).to.eql(expectedSize.width);\n  expect(size.height).to.eql(expectedSize.height);\n}\n\nfunction getSize(element) {\n  const bbox = element.getBBox();\n  return {\n    width: bbox.width,\n    height: bbox.height\n  };\n}\n"
  },
  {
    "path": "test/spec/features/keyboard/BpmnKeyboardBindingsSpec.js",
    "content": "import {\n  bootstrapViewer,\n  inject\n} from 'test/TestHelper';\n\nimport { forEach } from 'min-dash';\n\nimport copyPasteModule from 'lib/features/copy-paste';\nimport coreModule from 'lib/core';\nimport editorActionsModule from 'lib/features/editor-actions';\nimport globalConnectModule from 'diagram-js/lib/features/global-connect';\nimport handToolModule from 'diagram-js/lib/features/hand-tool';\nimport keyboardModule from 'lib/features/keyboard';\nimport labelEditingModule from 'lib/features/label-editing';\nimport lassoToolModule from 'diagram-js/lib/features/lasso-tool';\nimport modelingModule from 'lib/features/modeling';\nimport searchModule from 'lib/features/search';\nimport spaceToolModule from 'diagram-js/lib/features/space-tool';\nimport popupMenu from 'diagram-js/lib/features/popup-menu';\nimport contextPad from 'lib/features/context-pad';\n\nimport {\n  createKeyEvent\n} from 'test/util/KeyEvents';\n\n\ndescribe('features/keyboard', function() {\n\n  var diagramXML = require('../../../fixtures/bpmn/simple.bpmn');\n\n  var testModules = [\n    copyPasteModule,\n    coreModule,\n    editorActionsModule,\n    globalConnectModule,\n    handToolModule,\n    keyboardModule,\n    labelEditingModule,\n    lassoToolModule,\n    modelingModule,\n    searchModule,\n    spaceToolModule,\n    popupMenu,\n    contextPad\n  ];\n\n  beforeEach(bootstrapViewer(diagramXML, { modules: testModules }));\n\n\n  describe('bpmn keyboard bindings', function() {\n\n    it('should include triggers inside editorActions', inject(function(editorActions) {\n\n      // given\n      var expectedActions = [\n        'undo',\n        'redo',\n        'copy',\n        'duplicate',\n        'paste',\n        'cut',\n        'zoom',\n        'removeSelection',\n        'selectElements',\n        'spaceTool',\n        'lassoTool',\n        'handTool',\n        'globalConnectTool',\n        'setColor',\n        'directEditing',\n        'find',\n        'moveToOrigin',\n        'replaceElement'\n      ];\n\n      // then\n      expect(editorActions.getActions()).to.eql(expectedActions);\n    }));\n\n\n    forEach([ 'c', 'C' ], function(key) {\n\n      it('should global connect tool for key ' + key, inject(function(keyboard, globalConnect) {\n\n        sinon.spy(globalConnect, 'toggle');\n\n        // given\n        var e = createKeyEvent(key);\n\n        // when\n        keyboard._keyHandler(e);\n\n        // then\n        expect(globalConnect.toggle).to.have.been.calledOnce;\n      }));\n\n    });\n\n\n    forEach([ 'l', 'L' ], function(key) {\n\n      it('should trigger lasso tool for key ' + key, inject(function(keyboard, lassoTool) {\n\n        sinon.spy(lassoTool, 'activateSelection');\n\n        // given\n        var e = createKeyEvent(key);\n\n        // when\n        keyboard._keyHandler(e);\n\n        // then\n        expect(lassoTool.activateSelection).to.have.been.calledOnce;\n      }));\n\n    });\n\n\n    forEach([ 's', 'S' ], function(key) {\n\n      it('should trigger space tool', inject(function(keyboard, spaceTool) {\n\n        sinon.spy(spaceTool, 'activateSelection');\n\n        // given\n        var e = createKeyEvent(key);\n\n        // when\n        keyboard._keyHandler(e);\n\n        // then\n        expect(spaceTool.activateSelection).to.have.been.calledOnce;\n      }));\n\n    });\n\n\n    forEach([ 'e', 'E' ], function(key) {\n\n      it('should trigger direct editing', inject(function(keyboard, selection, elementRegistry, directEditing) {\n\n        sinon.spy(directEditing, 'activate');\n\n        // given\n        var task = elementRegistry.get('Task_1');\n\n        selection.select(task);\n\n        var e = createKeyEvent(key);\n\n        // when\n        keyboard._keyHandler(e);\n\n        // then\n        expect(directEditing.activate).to.have.been.calledOnce;\n      }));\n\n    });\n\n\n    forEach([ 'a', 'A' ], function(key) {\n\n      it('should select all elements',\n        inject(function(canvas, keyboard, selection, elementRegistry) {\n\n          // given\n          var e = createKeyEvent(key, { ctrlKey: true });\n\n          var allElements = elementRegistry.getAll(),\n              rootElement = canvas.getRootElement();\n\n          // when\n          keyboard._keyHandler(e);\n\n          // then\n          var selectedElements = selection.get();\n\n          expect(selectedElements).to.have.length(allElements.length - 1);\n          expect(selectedElements).not.to.contain(rootElement);\n        })\n      );\n\n    });\n\n\n    forEach([ 'f', 'F' ], function(key) {\n\n      it('should trigger search for labels', inject(function(keyboard, searchPad) {\n\n        sinon.spy(searchPad, 'toggle');\n\n        // given\n        var e = createKeyEvent(key, { ctrlKey: true });\n\n        // when\n        keyboard._keyHandler(e);\n\n        // then\n        expect(searchPad.toggle).to.have.been.calledOnce;\n      }));\n\n    });\n\n\n    forEach([ 'r', 'R' ], function(key) {\n\n      it('should trigger replace menu', inject(function(keyboard, popupMenu, elementRegistry, selection) {\n\n        sinon.spy(popupMenu, 'open');\n\n        // given\n        var task = elementRegistry.get('Task_1');\n\n        selection.select(task);\n\n        var e = createKeyEvent(key);\n\n        // when\n        keyboard._keyHandler(e);\n\n        // then\n        expect(popupMenu.open).to.have.been.calledOnce;\n      }));\n\n    });\n\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/keyboard-move-selection/KeyboardMoveSelectionSpec.js",
    "content": "import {\r\n  bootstrapModeler,\r\n  inject\r\n} from 'test/TestHelper';\r\n\r\nimport coreModule from 'lib/core';\r\nimport keyboardMoveSelectionModule from 'diagram-js/lib/features/keyboard-move-selection';\r\nimport modelingModule from 'lib/features/modeling';\r\nimport rulesModule from 'lib/features/rules';\r\n\r\nimport { getMid } from 'diagram-js/lib/layout/LayoutUtil';\r\n\r\n\r\ndescribe('features/keyboard-move-selection', function() {\r\n\r\n  var diagramXML = require('./keyboard-move-selection.bpmn');\r\n\r\n  var testModules = [\r\n    coreModule,\r\n    keyboardMoveSelectionModule,\r\n    modelingModule,\r\n    rulesModule\r\n  ];\r\n\r\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\r\n\r\n\r\n  it('should move task', inject(function(elementRegistry, keyboardMoveSelection, selection) {\r\n\r\n    // given\r\n    var task = elementRegistry.get('Task_1');\r\n\r\n    selection.select(task);\r\n\r\n    var mid = getMid(task);\r\n\r\n    // when\r\n    keyboardMoveSelection.moveSelection('right');\r\n\r\n    // then\r\n    expect(getMid(task)).not.to.eql(mid);\r\n  }));\r\n\r\n\r\n  it('should move participant', inject(function(elementRegistry, keyboardMoveSelection, selection) {\r\n\r\n    // given\r\n    var participant = elementRegistry.get('Participant_1');\r\n\r\n    selection.select(participant);\r\n\r\n    var mid = getMid(participant);\r\n\r\n    // when\r\n    keyboardMoveSelection.moveSelection('right');\r\n\r\n    // then\r\n    expect(getMid(participant)).not.to.eql(mid);\r\n  }));\r\n\r\n\r\n  it('should NOT move lane', inject(function(elementRegistry, keyboardMoveSelection, selection) {\r\n\r\n    // given\r\n    var lane = elementRegistry.get('Lane_1');\r\n\r\n    selection.select(lane);\r\n\r\n    var mid = getMid(lane);\r\n\r\n    // when\r\n    keyboardMoveSelection.moveSelection('right');\r\n\r\n    // then\r\n    expect(getMid(lane)).to.eql(mid);\r\n  }));\r\n\r\n\r\n  it('should NOT move boundary event without host', inject(\r\n    function(elementRegistry, keyboardMoveSelection, selection, rules) {\r\n\r\n      // given\r\n      var boundaryEvent = elementRegistry.get('BoundaryEvent_on_Task');\r\n\r\n      selection.select(boundaryEvent);\r\n\r\n      var mid = getMid(boundaryEvent);\r\n      var hostBeforeMove = boundaryEvent.host;\r\n\r\n      // when\r\n      keyboardMoveSelection.moveSelection('right');\r\n      keyboardMoveSelection.moveSelection('right');\r\n      keyboardMoveSelection.moveSelection('right');\r\n\r\n      // then\r\n\r\n      // position should not change\r\n      expect(getMid(boundaryEvent)).to.eql(mid);\r\n\r\n      // shouldn't be deattached from host\r\n      expect(boundaryEvent.host).to.equal(hostBeforeMove);\r\n    }\r\n  ));\r\n\r\n\r\n  it('should move boundary event with host', inject(\r\n    function(elementRegistry, keyboardMoveSelection, selection) {\r\n\r\n      // given\r\n      var task = elementRegistry.get('Task_1');\r\n      var boundaryEvent = elementRegistry.get('BoundaryEvent_on_Task');\r\n\r\n      selection.select([ task, boundaryEvent ]);\r\n\r\n      var taskMid = getMid(task);\r\n      var boundaryMid = getMid(boundaryEvent);\r\n\r\n      // when\r\n      keyboardMoveSelection.moveSelection('right');\r\n\r\n      // then\r\n      expect(getMid(task)).not.to.eql(taskMid);\r\n      expect(getMid(boundaryEvent)).not.to.eql(boundaryMid);\r\n    }\r\n  ));\r\n\r\n});"
  },
  {
    "path": "test/spec/features/keyboard-move-selection/keyboard-move-selection.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_03kbt0n\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.3.0\">\n  <bpmn:collaboration id=\"Collaboration_1\">\n    <bpmn:participant id=\"Participant_1\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:laneSet id=\"LaneSet_1618key\">\n      <bpmn:lane id=\"Lane_1\">\n        <bpmn:flowNodeRef>Task_1</bpmn:flowNodeRef>\n      </bpmn:lane>\n      <bpmn:lane id=\"Lane_2\" />\n    </bpmn:laneSet>\n    <bpmn:task id=\"Task_1\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_on_Task\" attachedToRef=\"Task_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_0g0r0vr_di\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"-200\" y=\"-25\" width=\"600\" height=\"370\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_10hsezb_di\" bpmnElement=\"Lane_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"-170\" y=\"-25\" width=\"570\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0mzf3d4_di\" bpmnElement=\"Lane_2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"-170\" y=\"225\" width=\"570\" height=\"120\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1y7dv59_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"50\" y=\"60\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0f3xtwc_di\" bpmnElement=\"BoundaryEvent_on_Task\">\n        <dc:Bounds x=\"82\" y=\"122\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>"
  },
  {
    "path": "test/spec/features/label-editing/LabelEditing.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.6.0\">\n  <bpmn:collaboration id=\"Collaboration_1o0amh9\">\n    <bpmn:participant id=\"Participant_1\" name=\"FOO BAR\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Participant_2\" />\n    <bpmn:participant id=\"Participant_3\" name=\"VER\" processRef=\"Process_3\" />\n    <bpmn:participant id=\"Participant_4\" name=\"CAL\" />\n    <bpmn:messageFlow id=\"MessageFlow_1\" name=\"FOO\" sourceRef=\"Task_1fo1fvh\" targetRef=\"Participant_2\" />\n    <bpmn:textAnnotation id=\"TextAnnotation_1\">    <bpmn:text>FOO</bpmn:text>\n</bpmn:textAnnotation>\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:laneSet>\n      <bpmn:lane id=\"Lane_2\">\n        <bpmn:flowNodeRef>StartEvent_1</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>SubProcess_1</bpmn:flowNodeRef>\n      </bpmn:lane>\n      <bpmn:lane id=\"Lane_1\" name=\"FOO BAR\">\n        <bpmn:flowNodeRef>StartEvent_08jn2xd</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Task_1</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Task_1fo1fvh</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>ExclusiveGateway_1</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>EndEvent_1</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>SubProcess_2</bpmn:flowNodeRef>\n      </bpmn:lane>\n    </bpmn:laneSet>\n    <bpmn:ioSpecification>\n      <bpmn:dataInput name=\"Input\" isCollection=\"false\" id=\"DataInput\"/>\n      <bpmn:dataOutput name=\"Output\" isCollection=\"false\" id=\"DataOutput\"/>\n      <bpmn:inputSet id=\"_9f9aea93-30cd-4899-bbe1-e62165c3dbc9\">\n        <bpmn:dataInputRefs>DataInput</bpmn:dataInputRefs>\n      </bpmn:inputSet>\n      <bpmn:outputSet id=\"_8154d47e-5733-41c1-8125-29ff926b3cd2\">\n        <bpmn:dataOutputRefs>DataOutput</bpmn:dataOutputRefs>\n      </bpmn:outputSet>\n      </bpmn:ioSpecification>\n    <bpmn:startEvent id=\"StartEvent_1\" name=\"FOO\">\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"StartEvent_1\" targetRef=\"SubProcess_1\" />\n    <bpmn:subProcess id=\"SubProcess_1\" name=\"FOO\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_14kuv1e</bpmn:outgoing>\n    </bpmn:subProcess>\n    <bpmn:startEvent id=\"StartEvent_08jn2xd\" name=\"FOO&#10;BAR\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Task_1\" name=\"FOO\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n      <bpmn:incoming>SequenceFlow_14kuv1e</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_13rjp44</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_0kmqqm9</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" name=\"FOO\" sourceRef=\"StartEvent_08jn2xd\" targetRef=\"Task_1\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_14kuv1e\" sourceRef=\"SubProcess_1\" targetRef=\"Task_1\" />\n    <bpmn:task id=\"Task_1fo1fvh\" name=\"FOO&#10;BAR\">\n      <bpmn:incoming>SequenceFlow_13rjp44</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_1h7vuvi</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_13rjp44\" sourceRef=\"Task_1\" targetRef=\"Task_1fo1fvh\" />\n    <bpmn:exclusiveGateway id=\"ExclusiveGateway_1\" name=\"FOO\">\n      <bpmn:incoming>SequenceFlow_1h7vuvi</bpmn:incoming>\n    </bpmn:exclusiveGateway>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1h7vuvi\" sourceRef=\"Task_1fo1fvh\" targetRef=\"ExclusiveGateway_1\" />\n    <bpmn:endEvent id=\"EndEvent_1\">\n      <bpmn:incoming>SequenceFlow_0kmqqm9</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_0kmqqm9\" sourceRef=\"Task_1\" targetRef=\"EndEvent_1\" />\n    <bpmn:dataObjectReference id=\"DataObjectReference_1\" dataObjectRef=\"DataObject_1rq8hb8\" />\n    <bpmn:dataObject id=\"DataObject_1rq8hb8\" />\n    <bpmn:dataStoreReference id=\"DataStoreReference_1\" />\n    <bpmn:subProcess id=\"SubProcess_2\" />\n    <bpmn:association id=\"Association_0ckvfj2\" sourceRef=\"SubProcess_1\" targetRef=\"TextAnnotation_1\" />\n    <bpmn:group id=\"Group_1\" categoryValueRef=\"CategoryValue_1\" />\n    <bpmn:group id=\"Group_2\" />\n  </bpmn:process>\n  <bpmn:category id=\"Category_1\">\n    <bpmn:categoryValue id=\"CategoryValue_1\" value=\"FOO\" />\n  </bpmn:category>\n  <bpmn:process id=\"Process_3\" isExecutable=\"false\">\n    <bpmn:laneSet id=\"LaneSet_0qq17vw\">\n      <bpmn:lane id=\"Vertical_Lane_2\" name=\"TI\" />\n      <bpmn:lane id=\"Vertical_Lane_1\" />\n    </bpmn:laneSet>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1o0amh9\">\n      <bpmndi:BPMNShape id=\"Participant_15tkgjw_di\" bpmnElement=\"Participant_1\">\n        <dc:Bounds x=\"160\" y=\"122\" width=\"600\" height=\"477\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_00fz5ca_di\" bpmnElement=\"Lane_2\">\n        <dc:Bounds x=\"190\" y=\"122\" width=\"570\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1qi2aws_di\" bpmnElement=\"Lane_1\">\n        <dc:Bounds x=\"190\" y=\"372\" width=\"570\" height=\"227\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_194zznr_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"311\" y=\"147\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_194zznr_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"311\" y=\"147\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_0909sti_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"223\" y=\"229\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"228\" y=\"265\" width=\"25\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_140ewlr_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"259\" y=\"247\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"311\" y=\"247\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"285\" y=\"232\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"TextAnnotation_0vwfagl_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"814\" y=\"122\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_0ckvfj2_di\" bpmnElement=\"Association_0ckvfj2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"661\" y=\"196\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"814\" y=\"152\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"StartEvent_08jn2xd_di\" bpmnElement=\"StartEvent_08jn2xd\">\n        <dc:Bounds x=\"223\" y=\"416\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"228\" y=\"452\" width=\"25\" height=\"24\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1i068gk_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"436\" y=\"394\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_088kva8_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"259\" y=\"434\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"436\" y=\"434\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"335\" y=\"409\" width=\"25\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_14kuv1e_di\" bpmnElement=\"SequenceFlow_14kuv1e\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"486\" y=\"347\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"486\" y=\"394\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"501\" y=\"360.5\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_1fo1fvh_di\" bpmnElement=\"Task_1fo1fvh\">\n        <dc:Bounds x=\"436\" y=\"500\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_13rjp44_di\" bpmnElement=\"SequenceFlow_13rjp44\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"486\" y=\"474\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"486\" y=\"500\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"501\" y=\"477\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_1dulwbf_di\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"578\" y=\"515\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"590\" y=\"565\" width=\"25\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1h7vuvi_di\" bpmnElement=\"SequenceFlow_1h7vuvi\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"536\" y=\"540\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"578\" y=\"540\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"557\" y=\"515\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EndEvent_0c4s9zs_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"585\" y=\"416\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"603\" y=\"452\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0kmqqm9_di\" bpmnElement=\"SequenceFlow_0kmqqm9\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"536\" y=\"434\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"585\" y=\"434\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"561\" y=\"409\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"DataObjectReference_024w45b_di\" bpmnElement=\"DataObjectReference_1\">\n        <dc:Bounds x=\"223\" y=\"515\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"241\" y=\"565\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_0b4jv9b_di\" bpmnElement=\"DataStoreReference_1\">\n        <dc:Bounds x=\"315.54926829268294\" y=\"515\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"341\" y=\"565\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_0pmpiw7_di\" bpmnElement=\"MessageFlow_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"486\" y=\"580\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"486\" y=\"646\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"488\" y=\"603\" width=\"25\" height=\"13\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Participant_0kzj58d_di\" bpmnElement=\"Participant_2\">\n        <dc:Bounds x=\"161\" y=\"646\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_09pdsq3_di\" bpmnElement=\"Participant_3\" isHorizontal=\"false\">\n        <dc:Bounds x=\"900\" y=\"122\" width=\"250\" height=\"600\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1ja5e3n_di\" bpmnElement=\"Vertical_Lane_2\" isHorizontal=\"false\">\n        <dc:Bounds x=\"1025\" y=\"152\" width=\"125\" height=\"570\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0u3fowr_di\" bpmnElement=\"Vertical_Lane_1\" isHorizontal=\"false\">\n        <dc:Bounds x=\"900\" y=\"152\" width=\"125\" height=\"570\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_03y1uz8_di\" bpmnElement=\"Participant_4\" isHorizontal=\"false\">\n        <dc:Bounds x=\"1178\" y=\"122\" width=\"60\" height=\"600\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataOutput_di\" bpmnElement=\"DataOutput\">\n        <dc:Bounds x=\"265\" y=\"150\" width=\"34\" height=\"40\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"265\" y=\"195\" width=\"30\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataInput_di\" bpmnElement=\"DataInput\">\n        <dc:Bounds x=\"220\" y=\"150\" width=\"34\" height=\"40\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"220\" y=\"200\" width=\"30\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_1_di\" bpmnElement=\"Group_1\">\n        <dc:Bounds x=\"195\" y=\"390\" width=\"225\" height=\"190\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"296\" y=\"397\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_2_di\" bpmnElement=\"Group_2\">\n        <dc:Bounds x=\"555\" y=\"390\" width=\"85\" height=\"200\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_17fa1v0\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1yas56k\" bpmnElement=\"SubProcess_2\" />\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/label-editing/LabelEditingPreviewSpec.js",
    "content": "import {\n  bootstrapViewer,\n  inject\n} from 'test/TestHelper';\n\nvar pick = require('min-dash').pick;\n\nimport labelEditingModule from 'lib/features/label-editing';\nimport coreModule from 'lib/core';\nimport draggingModule from 'diagram-js/lib/features/dragging';\nimport modelingModule from 'lib/features/modeling';\n\n\ndescribe('features - label-editing preview', function() {\n\n  var diagramXML = require('./LabelEditing.bpmn');\n\n  beforeEach(bootstrapViewer(diagramXML, {\n    modules: [\n      labelEditingModule,\n      coreModule,\n      draggingModule,\n      modelingModule\n    ]\n  }));\n\n\n  describe('activate', function() {\n\n    it('[external labels AND text annotations ] should add marker to hide element on activate', inject(\n      function(directEditing, elementRegistry) {\n\n        // given\n        var textAnnotation = elementRegistry.get('TextAnnotation_1');\n\n        // when\n        directEditing.activate(textAnnotation);\n\n        // then\n        var gfx = elementRegistry.getGraphics(textAnnotation);\n\n        expect(gfx.classList.contains('djs-element-hidden')).to.be.true;\n      }\n    ));\n\n\n    it('[internal labels] should add marker to hide label on activate', inject(\n      function(directEditing, elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task_1');\n\n        // when\n        directEditing.activate(task);\n\n        // then\n        var gfx = elementRegistry.getGraphics(task);\n\n        expect(gfx.classList.contains('djs-label-hidden')).to.be.true;\n      }\n    ));\n\n  });\n\n\n  describe('resize', function() {\n\n    it('[text annotations] should resize preview on resize', inject(\n      function(directEditing, elementRegistry, eventBus, labelEditingPreview) {\n\n        // given\n        var textAnnotation = elementRegistry.get('TextAnnotation_1');\n        directEditing.activate(textAnnotation);\n\n        // when\n        eventBus.fire('directEditing.resize', {\n          width: 200,\n          height: 200,\n          dx: 100,\n          dy: 100\n        });\n\n        // then\n        var bounds = bbox(labelEditingPreview.path);\n\n        expect(bounds).to.eql({ x: 0, y: 0, width: 10, height: 300 });\n      }\n    ));\n\n\n    it('[text annotations] should resize preview below 0', inject(\n      function(directEditing, elementRegistry, eventBus, labelEditingPreview) {\n\n        // given\n        var textAnnotation = elementRegistry.get('TextAnnotation_1');\n        directEditing.activate(textAnnotation);\n\n        // when\n        eventBus.fire('directEditing.resize', {\n          width: 200,\n          height: 200,\n          dx: -300,\n          dy: -300\n        });\n\n        // then\n        var bounds = bbox(labelEditingPreview.path);\n\n        expect(bounds).to.eql({ x: 0, y: 0, width: 10, height: 0 });\n      }\n    ));\n\n  });\n\n\n  describe('complete/cancel', function() {\n\n    it('[external labels AND text annotations] should remove marker to hide element on complete', inject(\n      function(directEditing, elementRegistry) {\n\n        // given\n        var textAnnotation = elementRegistry.get('TextAnnotation_1');\n        directEditing.activate(textAnnotation);\n\n        // when\n        directEditing.complete();\n\n        // then\n        var gfx = elementRegistry.getGraphics(textAnnotation);\n\n        expect(gfx.classList.contains('djs-element-hidden')).to.be.false;\n      }\n    ));\n\n\n    it('[internal labels] should remove marker to hide label on complete', inject(\n      function(directEditing, elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task_1');\n        directEditing.activate(task);\n\n        // when\n        directEditing.complete();\n\n        // then\n        var gfx = elementRegistry.getGraphics(task);\n\n        expect(gfx.classList.contains('djs-label-hidden')).to.be.false;\n      }\n    ));\n\n  });\n\n});\n\n\n\nfunction bbox(el) {\n  return pick(el.getBBox(), [ 'x', 'y', 'width', 'height' ]);\n}"
  },
  {
    "path": "test/spec/features/label-editing/LabelEditingProviderSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport labelEditingModule from 'lib/features/label-editing';\nimport coreModule from 'lib/core';\nimport draggingModule from 'diagram-js/lib/features/dragging';\nimport modelingModule from 'lib/features/modeling';\nimport autoPlaceModule from 'lib/features/auto-place';\n\nimport {\n  getLabel\n} from 'lib/util/LabelUtil';\n\nimport {\n  createCanvasEvent as canvasEvent\n} from '../../../util/MockEvents';\n\nvar MEDIUM_LINE_HEIGHT = 12 * 1.2;\n\nvar DELTA = 3;\n\n\ndescribe('features - label-editing', function() {\n\n  var diagramXML = require('./LabelEditing.bpmn');\n\n\n  describe('basics', function() {\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: [\n        labelEditingModule,\n        coreModule,\n        draggingModule,\n        modelingModule,\n        autoPlaceModule\n      ]\n    }));\n\n\n    it('should register on dblclick', inject(\n      function(elementRegistry, directEditing, eventBus) {\n\n        // given\n        var shape = elementRegistry.get('Task_1');\n\n        // when\n        eventBus.fire('element.dblclick', { element: shape });\n\n        // then\n        expect(directEditing.isActive()).to.be.true;\n\n        // clean up\n        directEditing._textbox.destroy();\n      }\n    ));\n\n\n    it('should cancel on <ESC>', inject(\n      function(elementRegistry, directEditing, eventBus) {\n\n        // given\n        var shape = elementRegistry.get('Task_1'),\n            task = shape.businessObject;\n\n        var oldName = task.name;\n\n        // activate\n        eventBus.fire('element.dblclick', { element: shape });\n\n        var textbox = directEditing._textbox.content;\n\n        // when\n        // change + ESC is pressed\n        textbox.innerText = 'new value';\n        triggerKeyEvent(textbox, 'keydown', 27);\n\n        // then\n        expect(directEditing.isActive()).to.be.false;\n        expect(task.name).to.equal(oldName);\n      }\n    ));\n\n\n    it('should complete on drag start', inject(\n      function(elementRegistry, directEditing, dragging) {\n\n        // given\n        var shape = elementRegistry.get('Task_1'),\n            task = shape.businessObject;\n\n        directEditing.activate(shape);\n\n        directEditing._textbox.content.textContent = 'FOO BAR';\n\n        // when\n        dragging.init(null, { x: 0, y: 0 }, 'foo');\n\n        // then\n        expect(task.name).to.equal('FOO BAR');\n      }\n    ));\n\n\n    it('should complete on auto place', inject(\n      function(elementRegistry, directEditing, elementFactory, autoPlace) {\n\n        // given\n        var shape = elementRegistry.get('Task_1'),\n            task = shape.businessObject;\n\n        directEditing.activate(shape);\n\n        directEditing._textbox.content.textContent = 'FOO BAR';\n\n        // when\n        autoPlace.append(shape, elementFactory.create(\n          'shape',\n          { type: 'bpmn:ServiceTask' }\n        ));\n\n        // then\n        expect(task.name).to.equal('FOO BAR');\n      }\n    ));\n\n\n    it('should complete on root element click', inject(\n      function(elementRegistry, directEditing, canvas, eventBus) {\n\n        // given\n        var shape = elementRegistry.get('Task_1'),\n            task = shape.businessObject;\n\n        // activate\n        eventBus.fire('element.dblclick', { element: shape });\n\n        var newName = 'new value';\n\n        // a <textarea /> element\n        var content = directEditing._textbox.content;\n\n        content.innerText = newName;\n\n        // when\n        // change + <element.mousedown>\n\n        eventBus.fire('element.mousedown', { element: canvas.getRootElement() });\n\n        // then\n        expect(directEditing.isActive()).to.be.false;\n        expect(task.name).to.equal(newName);\n      }\n    ));\n\n\n    it('should complete on root element changed', inject(\n      function(elementRegistry, directEditing, canvas, eventBus) {\n\n        // given\n        var shape = elementRegistry.get('Task_1'),\n            task = shape.businessObject,\n            newRoot = elementRegistry.get('SubProcess_2_plane');\n\n        // activate\n        eventBus.fire('element.dblclick', { element: shape });\n\n        var newName = 'new value';\n\n        // a <textarea /> element\n        var content = directEditing._textbox.content;\n\n        content.innerText = newName;\n\n        // when\n        canvas.setRootElement(newRoot);\n\n        // then\n        expect(directEditing.isActive()).to.be.false;\n        expect(task.name).to.equal(newName);\n      }\n    ));\n\n\n    it('should complete on selection changed', inject(\n      function(elementRegistry, directEditing, selection) {\n\n        // given\n        var shape = elementRegistry.get('Task_1'),\n            task = shape.businessObject;\n\n        directEditing.activate(shape);\n\n        directEditing._textbox.content.textContent = 'FOO BAR';\n\n        // when\n        selection.select();\n\n        // then\n        expect(task.name).to.equal('FOO BAR');\n      }\n    ));\n\n\n    it('should cancel on element deletion', inject(\n      function(elementRegistry, directEditing, modeling) {\n\n        // given\n        var shape = elementRegistry.get('Task_1'),\n            task = shape.businessObject;\n\n        directEditing.activate(shape);\n\n        directEditing._textbox.content.textContent = 'FOO BAR';\n\n        // when\n        modeling.removeElements([ shape ]);\n\n        // then\n        expect(task.name).not.to.equal('FOO BAR');\n      }\n    ));\n\n\n    it('should cancel on selected element deletion', inject(\n      function(elementRegistry, directEditing, selection, modeling) {\n\n        // given\n        var shape = elementRegistry.get('Task_1'),\n            task = shape.businessObject;\n\n        selection.select(shape);\n        directEditing.activate(shape);\n\n        directEditing._textbox.content.textContent = 'FOO BAR';\n\n        // when\n        modeling.removeElements([ shape ]);\n\n        // then\n        expect(task.name).not.to.equal('FOO BAR');\n      }\n    ));\n\n  });\n\n\n  describe('details', function() {\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: [\n        labelEditingModule,\n        coreModule,\n        modelingModule\n      ]\n    }));\n\n    var create,\n        directEditing,\n        dragging,\n        elementFactory,\n        elementRegistry,\n        eventBus;\n\n    beforeEach(inject([\n      'create', 'directEditing', 'dragging',\n      'elementFactory', 'elementRegistry', 'eventBus',\n      function(_create, _directEditing, _dragging, _elementFactory, _elementRegistry, _eventBus) {\n        create = _create;\n        directEditing = _directEditing;\n        dragging = _dragging;\n        elementFactory = _elementFactory;\n        elementRegistry = _elementRegistry;\n        eventBus = _eventBus;\n      }\n    ]));\n\n\n    function directEditActivate(element) {\n      if (element.waypoints) {\n        eventBus.fire('element.dblclick', { element: element });\n      } else {\n        eventBus.fire('element.dblclick', { element: element });\n      }\n    }\n\n    function directEditUpdate(value) {\n      directEditing._textbox.content.innerText = value;\n    }\n\n    function directEditComplete(value) {\n      directEditUpdate(value);\n      directEditing.complete();\n    }\n\n    function directEditCancel(value) {\n      directEditUpdate(value);\n      directEditing.cancel();\n    }\n\n\n    describe('command support', function() {\n\n      it('should update via command stack', function() {\n\n        // given\n        var diagramElement = elementRegistry.get('Task_1');\n\n        var listenerCalled;\n\n        eventBus.on('commandStack.changed', function(e) {\n          listenerCalled = true;\n        });\n\n        // when\n        directEditActivate(diagramElement);\n        directEditComplete('BAR');\n\n        // then\n        expect(listenerCalled).to.be.true;\n      });\n\n\n      it('should undo via command stack', inject(function(commandStack) {\n\n        // given\n        var diagramElement = elementRegistry.get('Task_1');\n\n        var oldLabel = getLabel(diagramElement);\n\n        // when\n        directEditActivate(diagramElement);\n        directEditComplete('BAR');\n\n        commandStack.undo();\n\n        // then\n        var label = getLabel(diagramElement);\n        expect(label).to.eql(oldLabel);\n      }));\n\n    });\n\n\n    describe('should unset', function() {\n\n      it('name on empty text', function() {\n\n        // given\n        var diagramElement = elementRegistry.get('SequenceFlow_1');\n\n        // when\n        directEditActivate(diagramElement);\n        directEditComplete(' ');\n\n        // then\n        expect(diagramElement.businessObject.name).not.to.exist;\n      });\n\n\n      it('text on empty text', function() {\n\n        // given\n        var diagramElement = elementRegistry.get('TextAnnotation_1');\n\n        // when\n        directEditActivate(diagramElement);\n        directEditComplete(' ');\n\n        // then\n        expect(diagramElement.businessObject.text).not.to.exist;\n      });\n\n    });\n\n\n    describe('should trigger redraw', function() {\n\n      it('on shape change', function() {\n\n        // given\n        var diagramElement = elementRegistry.get('Task_1');\n\n        var listenerCalled;\n\n        eventBus.on('element.changed', function(e) {\n          if (e.element === diagramElement) {\n            listenerCalled = true;\n          }\n        });\n\n        // when\n        directEditActivate(diagramElement);\n        directEditComplete('BAR');\n\n        // then\n        expect(listenerCalled).to.be.true;\n      });\n\n\n      it('on connection on change', function() {\n\n        // given\n        var diagramElement = elementRegistry.get('SequenceFlow_1');\n\n        var listenerCalled;\n\n        eventBus.on('element.changed', function(e) {\n          if (e.element === diagramElement.label) {\n            listenerCalled = true;\n          }\n        });\n\n        // when\n        directEditActivate(diagramElement);\n        directEditComplete('BAR');\n\n        // then\n        expect(listenerCalled).to.be.true;\n      });\n\n    });\n\n\n    describe('element support, should edit', function() {\n\n      function directEdit(elementId) {\n\n        return inject(function(elementRegistry, eventBus, directEditing) {\n\n          var diagramElement = elementRegistry.get(elementId);\n\n          var label = getLabel(diagramElement);\n\n\n          // when\n          directEditActivate(diagramElement);\n\n          // then\n          // expect editing to be active\n          expect(directEditing.getValue()).to.eql(label);\n          expect(directEditing.isActive()).to.be.true;\n\n\n          // when\n          directEditComplete('B');\n\n          // then\n          // expect update to have happened\n          label = getLabel(diagramElement);\n          expect(label).to.equal('B');\n\n\n          // when\n          directEditActivate(diagramElement);\n          directEditCancel('C');\n\n          // expect no label update to have happened\n          label = getLabel(diagramElement);\n          expect(label).to.equal('B');\n        });\n      }\n\n\n      it('task', directEdit('Task_1'));\n\n\n      describe('gateway', function() {\n\n        it('simple', directEdit('ExclusiveGateway_1'));\n\n\n        it('via label', directEdit('ExclusiveGateway_1_label'));\n\n      });\n\n\n      describe('event', function() {\n\n        it('start', directEdit('StartEvent_1'));\n\n\n        it('event via label', directEdit('StartEvent_1_label'));\n\n\n        it('event without label', directEdit('EndEvent_1'));\n\n      });\n\n\n      describe('data reference', function() {\n\n        it('data store reference', directEdit('DataStoreReference_1'));\n\n\n        it('data object reference', directEdit('DataObjectReference_1'));\n\n      });\n\n\n      describe('sequenceflow', function() {\n\n        it('simple', directEdit('SequenceFlow_1'));\n\n\n        it('via label', directEdit('SequenceFlow_1_label'));\n\n\n        it('without label', directEdit('SequenceFlow_2'));\n\n      });\n\n\n      describe('message flow', function() {\n\n        it('simple', directEdit('MessageFlow_1'));\n\n\n        it('via label', directEdit('MessageFlow_1_label'));\n\n      });\n\n\n      describe('pool', function() {\n\n        it('simple', directEdit('Participant_1'));\n\n\n        it('collapsed', directEdit('Participant_2'));\n\n\n        it('vertical', directEdit('Participant_3'));\n\n\n        it('vertical, collapsed', directEdit('Participant_4'));\n\n      });\n\n\n      describe('lane', function() {\n\n        it('lane with label', directEdit('Lane_1'));\n\n\n        it('lane without label', directEdit('Lane_2'));\n\n      });\n\n\n      describe('data IO', function() {\n\n        it('data input', directEdit('DataInput'));\n\n\n        it('data output', directEdit('DataOutput'));\n\n      });\n\n\n      describe('group', function() {\n\n        it('simple', directEdit('Group_1'));\n\n\n        it(' via label', directEdit('Group_1_label'));\n\n      });\n\n    });\n\n\n    describe('on element creation', function() {\n\n      function createTaskElement(context) {\n        var shape = elementFactory.create('shape', { type: 'bpmn:Task' }),\n            parent = elementRegistry.get('SubProcess_1'),\n            parentGfx = elementRegistry.getGraphics(parent);\n\n        create.start(canvasEvent({ x: 0, y: 0 }), [ shape ], context);\n        dragging.hover({\n          element: parent,\n          gfx: parentGfx\n        });\n        dragging.move(canvasEvent({ x: 400, y: 250 }));\n        dragging.end();\n      }\n\n      function createParticipant() {\n\n        var collaboration = elementRegistry.get('Collaboration_1o0amh9'),\n            collaborationGfx = elementRegistry.getGraphics(collaboration);\n\n        var participant = elementFactory.createParticipantShape();\n\n        // when\n        create.start(canvasEvent({ x: 400, y: 300 }), participant);\n\n        dragging.hover({ element: collaboration, gfx: collaborationGfx });\n        dragging.move(canvasEvent({ x: 400, y: 300 }));\n\n        dragging.end();\n      }\n\n\n      describe('should activate', function() {\n\n        it('on Task creation', function() {\n\n          // when\n          createTaskElement();\n\n          // then\n          expect(directEditing.isActive()).to.be.true;\n        });\n\n\n        it('on Participant creation', function() {\n\n          // when\n          createParticipant();\n\n          // then\n          expect(directEditing.isActive()).to.be.true;\n        });\n\n      });\n\n\n      it('should NOT activate with behavior hint', function() {\n\n        // when\n        createTaskElement({\n          hints: { createElementsBehavior: false }\n        });\n\n        // then\n        expect(directEditing.isActive()).to.be.false;\n\n      });\n\n\n    });\n\n  });\n\n\n  describe('group support', function() {\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: [\n        labelEditingModule,\n        coreModule,\n        modelingModule\n      ],\n      canvas: { deferUpdate: false }\n    }));\n\n\n    it('should set label on group (no category value)', inject(\n      function(elementRegistry, directEditing) {\n\n        // given\n        var shape = elementRegistry.get('Group_2');\n\n        // when\n        directEditing.activate(shape);\n        directEditing._textbox.content.innerText = 'FOO';\n        directEditing.complete();\n\n        // then\n        var label = getLabel(shape);\n\n        expect(shape.businessObject.categoryValueRef).to.exist;\n        expect(label).to.equal('FOO');\n      }\n    ));\n\n  });\n\n\n  describe('sizes', function() {\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: [\n        labelEditingModule,\n        coreModule,\n        modelingModule\n      ],\n      canvas: { deferUpdate: false }\n    }));\n\n\n    describe('bounds', function() {\n\n      describe('external labels', function() {\n\n        it('[zoom 1] should have fixed width and element height', inject(\n          function(canvas, directEditing, elementRegistry) {\n            var zoom = 1;\n\n            canvas.zoom(zoom);\n\n            var startEvent = elementRegistry.get('StartEvent_1');\n\n            var bounds = canvas.getAbsoluteBBox(startEvent.label);\n            var mid = {\n              x: bounds.x + bounds.width / 2,\n              y: bounds.y + bounds.height / 2\n            };\n\n            directEditing.activate(startEvent);\n\n            expectBounds(directEditing._textbox.parent, {\n              x: mid.x - (45 * zoom),\n              y: bounds.y - (7 * zoom),\n              width: (90 * zoom),\n              height: bounds.height + (5 * zoom) + 7\n            });\n          }\n        ));\n\n\n        it('[zoom 1.5] should have fixed width and element height', inject(\n          function(canvas, directEditing, elementRegistry) {\n            var zoom = 1.5;\n\n            canvas.zoom(zoom);\n\n            var startEvent = elementRegistry.get('StartEvent_1');\n\n            var bounds = canvas.getAbsoluteBBox(startEvent.label);\n            var mid = {\n              x: bounds.x + bounds.width / 2,\n              y: bounds.y + bounds.height / 2\n            };\n\n            directEditing.activate(startEvent);\n\n            expectBounds(directEditing._textbox.parent, {\n              x: mid.x - (45 * zoom),\n              y: bounds.y - (7 * zoom),\n              width: (90 * zoom),\n              height: bounds.height + (5 * zoom) + (7 * zoom)\n            });\n          }\n        ));\n\n      });\n\n\n      describe('internal labels', function() {\n\n        it('[zoom 1] should have element size', inject(\n          function(canvas, directEditing, elementRegistry) {\n            var zoom = 1;\n\n            canvas.zoom(zoom);\n\n            var task = elementRegistry.get('Task_1');\n\n            var bounds = canvas.getAbsoluteBBox(task);\n\n            directEditing.activate(task);\n\n            expectBounds(directEditing._textbox.parent, bounds);\n          }\n        ));\n\n\n        it('[zoom 1.5] should have element size', inject(\n          function(canvas, directEditing, elementRegistry) {\n            var zoom = 1.5;\n\n            canvas.zoom(zoom);\n\n            var task = elementRegistry.get('Task_1');\n\n            var bounds = canvas.getAbsoluteBBox(task);\n\n            directEditing.activate(task);\n\n            expectBounds(directEditing._textbox.parent, bounds);\n          }\n        ));\n\n      });\n\n\n      describe('sequence flows', function() {\n\n        it('[zoom 1] should have fixed width and element height', inject(\n          function(canvas, directEditing, elementRegistry) {\n            var zoom = 1;\n\n            canvas.zoom(zoom);\n\n            var sequenceFlow = elementRegistry.get('SequenceFlow_1');\n\n            var bounds = canvas.getAbsoluteBBox(sequenceFlow.label);\n            var mid = {\n              x: bounds.x + bounds.width / 2,\n              y: bounds.y + bounds.height / 2\n            };\n\n            directEditing.activate(sequenceFlow);\n\n            expectBounds(directEditing._textbox.parent, {\n              x: mid.x - (45 * zoom),\n              y: bounds.y - (7 * zoom),\n              width: (90 * zoom),\n              height: bounds.height + (5 * zoom) + 7\n            });\n          }\n        ));\n\n\n        it('[zoom 1.5] should have fixed width and element height', inject(\n          function(canvas, directEditing, elementRegistry) {\n            var zoom = 1.5;\n\n            canvas.zoom(zoom);\n\n            var sequenceflow = elementRegistry.get('SequenceFlow_1');\n\n            var bounds = canvas.getAbsoluteBBox(sequenceflow.label);\n            var mid = {\n              x: bounds.x + bounds.width / 2,\n              y: bounds.y + bounds.height / 2\n            };\n\n            directEditing.activate(sequenceflow);\n\n            expectBounds(directEditing._textbox.parent, {\n              x: mid.x - (45 * zoom),\n              y: bounds.y - (7 * zoom),\n              width: (90 * zoom),\n              height: bounds.height + (5 * zoom) + (7 * zoom)\n            });\n          }\n        ));\n\n      });\n\n\n      describe('text annotations', function() {\n\n        it('[zoom 1] should have element size', inject(\n          function(canvas, directEditing, elementRegistry) {\n            var zoom = 1;\n\n            canvas.zoom(zoom);\n\n            var textAnnotation = elementRegistry.get('TextAnnotation_1');\n\n            var bounds = canvas.getAbsoluteBBox(textAnnotation);\n\n            directEditing.activate(textAnnotation);\n\n            expectBounds(directEditing._textbox.parent, bounds);\n          }\n        ));\n\n\n        it('[zoom 1.5] should have element size', inject(\n          function(canvas, directEditing, elementRegistry) {\n            var zoom = 1.5;\n\n            canvas.zoom(zoom);\n\n            var textAnnotation = elementRegistry.get('TextAnnotation_1');\n\n            var bounds = canvas.getAbsoluteBBox(textAnnotation);\n\n            directEditing.activate(textAnnotation);\n\n            expectBounds(directEditing._textbox.parent, bounds);\n          }\n        ));\n\n      });\n\n\n      describe('expanded sub processes', function() {\n\n        it('[zoom 1] should have element width and height to fit text', inject(\n          function(canvas, directEditing, elementRegistry) {\n            var zoom = 1;\n\n            canvas.zoom(zoom);\n\n            var subProcess = elementRegistry.get('SubProcess_1');\n\n            var bounds = canvas.getAbsoluteBBox(subProcess);\n\n            directEditing.activate(subProcess);\n\n            expectBounds(directEditing._textbox.parent, {\n              x: bounds.x,\n              y: bounds.y,\n              width: bounds.width,\n              height: (MEDIUM_LINE_HEIGHT * zoom) + (7 * 2 * zoom)\n            });\n          }\n        ));\n\n\n        it('[zoom 1.5] should have element width and height to fit text', inject(\n          function(canvas, directEditing, elementRegistry) {\n            var zoom = 1.5;\n\n            canvas.zoom(zoom);\n\n            var subProcess = elementRegistry.get('SubProcess_1');\n\n            var bounds = canvas.getAbsoluteBBox(subProcess);\n\n            directEditing.activate(subProcess);\n\n            expectBounds(directEditing._textbox.parent, {\n              x: bounds.x,\n              y: bounds.y,\n              width: bounds.width,\n              height: (MEDIUM_LINE_HEIGHT * zoom) + (7 * 2 * zoom)\n            });\n          }\n        ));\n\n      });\n\n\n      describe('pools/lanes', function() {\n\n        it('[zoom 1] should have width of element height, height of 30', inject(\n          function(canvas, directEditing, elementRegistry) {\n            var zoom = 1;\n\n            canvas.zoom(zoom);\n\n            var pool = elementRegistry.get('Participant_1');\n\n            var bounds = canvas.getAbsoluteBBox(pool);\n            var mid = {\n              x: bounds.x + bounds.width / 2,\n              y: bounds.y + bounds.height / 2\n            };\n\n            directEditing.activate(pool);\n\n            expectBounds(directEditing._textbox.parent, {\n              x: bounds.x - (bounds.height / 2) + (15 * zoom),\n              y: mid.y - (30 * zoom) / 2,\n              width: bounds.height * zoom,\n              height: 30 * zoom\n            });\n          }\n        ));\n\n\n        it('[zoom 1.5] should have width of element height, height of 30', inject(\n          function(canvas, directEditing, elementRegistry) {\n            var zoom = 1.5;\n\n            canvas.zoom(zoom);\n\n            var pool = elementRegistry.get('Participant_1');\n\n            var bounds = canvas.getAbsoluteBBox(pool);\n            var mid = {\n              x: bounds.x + bounds.width / 2,\n              y: bounds.y + bounds.height / 2\n            };\n\n            directEditing.activate(pool);\n\n            expectBounds(directEditing._textbox.parent, {\n              x: bounds.x - (bounds.height / 2) + (15 * zoom),\n              y: mid.y - (30 * zoom) / 2,\n              width: bounds.height,\n              height: 30 * zoom\n            });\n          }\n        ));\n\n      });\n\n\n      describe('collapsed pools', function() {\n\n        it('[zoom 1] should have width/height of element', inject(\n          function(canvas, directEditing, elementRegistry) {\n\n            // given\n            var zoom = 1;\n\n            canvas.zoom(zoom);\n\n            var pool = elementRegistry.get('Participant_2');\n\n            var bounds = canvas.getAbsoluteBBox(pool);\n\n            // when\n            directEditing.activate(pool);\n\n            // then\n            expectBounds(directEditing._textbox.parent, {\n              x: bounds.x,\n              y: bounds.y,\n              width: bounds.width,\n              height: bounds.height\n            });\n          }\n        ));\n\n\n        it('[zoom 1.5] should have width/height of element', inject(\n          function(canvas, directEditing, elementRegistry) {\n\n            // given\n            var zoom = 1.5;\n\n            canvas.zoom(zoom);\n\n            var pool = elementRegistry.get('Participant_2');\n\n            var bounds = canvas.getAbsoluteBBox(pool);\n\n            // when\n            directEditing.activate(pool);\n\n            // then\n            expectBounds(directEditing._textbox.parent, {\n              x: bounds.x,\n              y: bounds.y,\n              width: bounds.width,\n              height: bounds.height\n            });\n          }\n        ));\n\n      });\n\n\n      describe('vertical pools/lanes', function() {\n\n        it('[zoom 1] should have width of element width, height of 30', inject(\n          function(canvas, directEditing, elementRegistry) {\n\n            // given\n            var zoom = 1;\n\n            canvas.zoom(zoom);\n\n            var pool = elementRegistry.get('Participant_3');\n\n            var bounds = canvas.getAbsoluteBBox(pool);\n\n            // when\n            directEditing.activate(pool);\n\n            // then\n            expectBounds(directEditing._textbox.parent, {\n              x: bounds.x,\n              y: bounds.y,\n              width: bounds.width,\n              height: 30 * zoom\n            });\n          }\n        ));\n\n\n        it('[zoom 1.5] should have width of element width, height of 30', inject(\n          function(canvas, directEditing, elementRegistry) {\n\n            // given\n            var zoom = 1.5;\n\n            canvas.zoom(zoom);\n\n            var pool = elementRegistry.get('Participant_3');\n\n            var bounds = canvas.getAbsoluteBBox(pool);\n\n            // when\n            directEditing.activate(pool);\n\n            // then\n            expectBounds(directEditing._textbox.parent, {\n              x: bounds.x,\n              y: bounds.y,\n              width: bounds.width,\n              height: 30 * zoom\n            });\n          }\n        ));\n\n      });\n\n\n      describe('vertical collapsed pools', function() {\n\n        it('[zoom 1] should have width/height of element', inject(\n          function(canvas, directEditing, elementRegistry) {\n\n            // given\n            var zoom = 1;\n\n            canvas.zoom(zoom);\n\n            var pool = elementRegistry.get('Participant_4');\n\n            var bounds = canvas.getAbsoluteBBox(pool);\n            var mid = {\n              x: bounds.x + bounds.width / 2,\n              y: bounds.y + bounds.height / 2\n            };\n\n            // when\n            directEditing.activate(pool);\n\n            // then\n            expectBounds(directEditing._textbox.parent, {\n              x: mid.x - bounds.height / 2,\n              y: mid.y - bounds.width / 2,\n              width: bounds.height,\n              height: bounds.width\n            });\n          }\n        ));\n\n\n        it('[zoom 1.5] should have width/height of element', inject(\n          function(canvas, directEditing, elementRegistry) {\n\n            // given\n            var zoom = 1.5;\n\n            canvas.zoom(zoom);\n\n            var pool = elementRegistry.get('Participant_4');\n\n            var bounds = canvas.getAbsoluteBBox(pool);\n            var mid = {\n              x: bounds.x + bounds.width / 2,\n              y: bounds.y + bounds.height / 2\n            };\n\n            // when\n            directEditing.activate(pool);\n\n            // then\n            expectBounds(directEditing._textbox.parent, {\n              x: mid.x - bounds.height / 2,\n              y: mid.y - bounds.width / 2,\n              width: bounds.height,\n              height: bounds.width\n            });\n          }\n        ));\n\n      });\n\n    });\n\n  });\n\n});\n\n\n// helpers //////////////////\n\nfunction triggerKeyEvent(element, event, code) {\n  var e = document.createEvent('Events');\n\n  if (e.initEvent) {\n    e.initEvent(event, true, true);\n  }\n\n  e.keyCode = code;\n  e.which = code;\n\n  return element.dispatchEvent(e);\n}\n\nfunction expectBounds(parent, bounds) {\n  expect(parent.offsetLeft).to.be.closeTo(bounds.x, DELTA);\n  expect(parent.offsetTop).to.be.closeTo(bounds.y, DELTA);\n  expect(parent.offsetWidth).to.be.closeTo(bounds.width, DELTA);\n  expect(parent.offsetHeight).to.be.closeTo(bounds.height, DELTA);\n}\n"
  },
  {
    "path": "test/spec/features/label-link/LabelLink.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.41.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"Start_Event\" name=\"Start Event\">\n      <bpmn:outgoing>Sequence</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:exclusiveGateway id=\"Gateway\" name=\"Gateway\">\n      <bpmn:incoming>Sequence</bpmn:incoming>\n      <bpmn:outgoing>Flow_1n4vntt</bpmn:outgoing>\n      <bpmn:outgoing>Sequence_Curved</bpmn:outgoing>\n      <bpmn:outgoing>Flow_08zlypo</bpmn:outgoing>\n    </bpmn:exclusiveGateway>\n    <bpmn:sequenceFlow id=\"Sequence\" name=\"Sequence\" sourceRef=\"Start_Event\" targetRef=\"Gateway\" />\n    <bpmn:sequenceFlow id=\"Flow_1n4vntt\" sourceRef=\"Gateway\" targetRef=\"End_Event\" />\n    <bpmn:sequenceFlow id=\"Sequence_Curved\" name=\"Sequence\" sourceRef=\"Gateway\" targetRef=\"End_Event\" />\n    <bpmn:endEvent id=\"End_Event\" name=\"End Event\">\n      <bpmn:incoming>Flow_1n4vntt</bpmn:incoming>\n      <bpmn:incoming>Sequence_Curved</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"Flow_08zlypo\" sourceRef=\"Gateway\" targetRef=\"Subprocess\" />\n    <bpmn:subProcess id=\"Subprocess\">\n      <bpmn:incoming>Flow_08zlypo</bpmn:incoming>\n      <bpmn:startEvent id=\"Subprocess_Event\" name=\"Sub Event\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Event_1qfvvdd_di\" bpmnElement=\"Start_Event\">\n        <dc:Bounds x=\"122\" y=\"192\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"113\" y=\"235\" width=\"55\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_0p419jh_di\" bpmnElement=\"Gateway\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"275\" y=\"185\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"328\" y=\"133\" width=\"44\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0blvhsu_di\" bpmnElement=\"End_Event\">\n        <dc:Bounds x=\"432\" y=\"292\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"424\" y=\"383\" width=\"51\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0oyfdfi_di\" bpmnElement=\"Subprocess\" isExpanded=\"true\">\n        <dc:Bounds x=\"450\" y=\"130\" width=\"140\" height=\"120\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0pl9qv3_di\" bpmnElement=\"Subprocess_Event\">\n        <dc:Bounds x=\"472\" y=\"172\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"504\" y=\"83\" width=\"51\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_0czsvkl_di\" bpmnElement=\"Sequence\">\n        <di:waypoint x=\"158\" y=\"210\" />\n        <di:waypoint x=\"275\" y=\"210\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"192\" y=\"192\" width=\"50\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1n4vntt_di\" bpmnElement=\"Flow_1n4vntt\">\n        <di:waypoint x=\"300\" y=\"235\" />\n        <di:waypoint x=\"300\" y=\"310\" />\n        <di:waypoint x=\"432\" y=\"310\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_15ovm9c_di\" bpmnElement=\"Sequence_Curved\">\n        <di:waypoint x=\"300\" y=\"235\" />\n        <di:waypoint x=\"300\" y=\"310\" />\n        <di:waypoint x=\"432\" y=\"310\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"345\" y=\"253\" width=\"50\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_08zlypo_di\" bpmnElement=\"Flow_08zlypo\">\n        <di:waypoint x=\"325\" y=\"210\" />\n        <di:waypoint x=\"450\" y=\"210\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"645\" y=\"183\" width=\"50\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/label-link/LabelLinkSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\nimport outlineModule from 'lib/features/outline';\nimport drilldownModule from 'lib/features/drilldown';\nimport labelLinkModule from 'lib/features/label-link';\n\nimport { queryAll as domQueryAll } from 'min-dom';\n\nimport { expectSvgPath } from '../../../util/svgHelpers';\n\n\ndescribe('features/label-link - label link', function() {\n\n  var diagramXML = require('./LabelLink.bpmn');\n\n  var testModules = [\n    coreModule,\n    modelingModule,\n    outlineModule,\n    drilldownModule,\n    labelLinkModule\n  ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  it('should not show when nothing selected', inject(function() {\n    var links = queryAllLinks();\n    expect(links).to.have.length(0);\n  }));\n\n\n  it('should show for event', inject(\n    function(selection, elementRegistry) {\n\n      // given\n      const element = elementRegistry.get('End_Event');\n\n      // when\n      selection.select(element);\n\n      // then\n      expectLinkWithPath('M450,335L450,383');\n    })\n  );\n\n\n  it('should show for sequence flow', inject(\n    function(selection, elementRegistry) {\n\n      // given\n      const element = elementRegistry.get('Sequence_Curved');\n\n      // when\n      selection.select(element);\n\n      // then\n      expectLinkWithPath('M328,310L364,267');\n    })\n  );\n\n\n  it('should show for gateway', inject(\n    function(selection, elementRegistry) {\n\n      // given\n      const element = elementRegistry.get('Gateway');\n\n      // when\n      selection.select(element);\n\n      // then\n      expectLinkWithPath('M318,185L345,147');\n    })\n  );\n\n\n  it('should not show if close to element', inject(\n    function(selection, elementRegistry) {\n\n      // given\n      const element = elementRegistry.get('Start_Event');\n\n      // when\n      selection.select(element);\n\n      // then\n      const links = queryAllLinks();\n      expect(links).to.have.length(0);\n    })\n  );\n\n\n  it('should update if element moved', inject(\n    function(selection, elementRegistry, modeling) {\n\n      // given\n      const element = elementRegistry.get('End_Event');\n\n      // when\n      selection.select(element);\n      modeling.moveShape(element, { x: 100, y: 0 });\n\n      // then\n      const links = queryAllLinks();\n      expect(links).to.have.length(1);\n\n      expectLinkWithPath('M532,325L459,383');\n    })\n  );\n\n\n  it('should update if label moved', inject(\n    function(selection, elementRegistry, modeling) {\n\n      // given\n      const element = elementRegistry.get('End_Event');\n      const label = element.labels[0];\n\n      // when\n      selection.select(label);\n      modeling.moveShape(label, { x: 100, y: 0 });\n\n      // then\n      const links = queryAllLinks();\n      expect(links).to.have.length(1);\n\n      expectLinkWithPath('M464,321L533,376');\n    })\n  );\n\n\n  it('should show when both label and target selected', inject(\n    function(selection, elementRegistry) {\n\n      // given\n      const element = elementRegistry.get('End_Event');\n      const label = element.labels[0];\n\n      // when\n      selection.select([ element, label ]);\n\n      // then\n      expectLinkWithPath('M450,335L450,376');\n    })\n  );\n\n\n  it('should show label for event in expanded subprocess', inject(\n    function(selection, elementRegistry) {\n\n      // given\n      const element = elementRegistry.get('Subprocess_Event');\n\n      // when\n      selection.select(element);\n\n      // then\n      expectLinkWithPath('M498,169L527,97');\n    })\n  );\n\n\n  it('should show label for event in collapsed subprocess plane', inject(\n    function(selection, elementRegistry, bpmnReplace, canvas) {\n\n      // given\n      const subprocess = elementRegistry.get('Subprocess');\n\n      // when\n      selection.select(subprocess);\n      bpmnReplace.replaceElement(subprocess, {\n        type: 'bpmn:SubProcess',\n        isExpanded: false\n      });\n\n      var subprocessRoot = canvas.findRoot('Subprocess_plane');\n      canvas.setRootElement(subprocessRoot);\n\n      selection.select(elementRegistry.get('Subprocess_Event'));\n\n      // then\n      expectLinkWithPath('M206,246L235,174');\n    })\n  );\n\n\n  it('should not show label after collapsing a subprocess', inject(\n    function(selection, elementRegistry, bpmnReplace) {\n\n      // given\n      const subprocess = elementRegistry.get('Subprocess');\n\n      // when\n      selection.select(subprocess);\n      bpmnReplace.replaceElement(subprocess, {\n        type: 'bpmn:SubProcess',\n        isExpanded: false\n      });\n\n      // then\n      const links = queryAllLinks();\n      expect(links).to.have.length(0);\n    })\n  );\n\n\n  it('should not show label after expanding a subprocess', inject(\n    function(selection, elementRegistry, bpmnReplace) {\n\n      // given\n      const subprocess = elementRegistry.get('Subprocess');\n\n      // when\n      selection.select(subprocess);\n\n      bpmnReplace.replaceElement(subprocess, {\n        type: 'bpmn:SubProcess',\n        isExpanded: false\n      });\n\n      bpmnReplace.replaceElement(subprocess, {\n        type: 'bpmn:SubProcess',\n        isExpanded: true\n      });\n\n      // then\n      const links = queryAllLinks();\n      expect(links).to.have.length(0);\n    })\n  );\n});\n\n// helpers\nfunction queryAllLinks() {\n  return domQueryAll('.bjs-label-link');\n}\n\nfunction expectLinkWithPath(path) {\n  const links = queryAllLinks();\n  const linePath = links[0].getAttribute('d');\n\n  expectSvgPath(linePath, path);\n}"
  },
  {
    "path": "test/spec/features/modeling/AppendShapeSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  find\n} from 'min-dash';\n\nimport {\n  getDi,\n  is,\n  getBusinessObject\n} from 'lib/util/ModelUtil';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - append shape', function() {\n\n  var diagramXML = require('../../../fixtures/bpmn/simple.bpmn');\n\n  var testModules = [ coreModule, modelingModule ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  describe('shape handling', function() {\n\n    it('should execute', inject(function(elementRegistry, modeling) {\n\n      // given\n      var startEventShape = elementRegistry.get('StartEvent_1');\n\n      // when\n      var targetShape = modeling.appendShape(startEventShape, { type: 'bpmn:Task' }),\n          target = targetShape.businessObject;\n\n      // then\n      expect(targetShape).to.exist;\n      expect(target.$instanceOf('bpmn:Task')).to.be.true;\n    }));\n\n\n    it('should create DI', inject(function(elementRegistry, modeling) {\n\n      // given\n      var startEventShape = elementRegistry.get('StartEvent_1');\n\n      var startEventDi = getDi(startEventShape);\n\n      // when\n      var targetShape = modeling.appendShape(startEventShape, { type: 'bpmn:Task' }),\n          targetDi = getDi(targetShape);\n\n      // then\n      expect(targetDi).to.exist;\n      expect(targetDi.$parent).to.eql(startEventDi.$parent);\n\n      expect(targetDi).to.have.bounds(targetShape);\n    }));\n\n\n    it('should add to parent (sub process)', inject(function(elementRegistry, modeling) {\n\n      // given\n      var startEventShape = elementRegistry.get('StartEvent_1');\n      var subProcessShape = elementRegistry.get('SubProcess_1');\n\n      var subProcess = subProcessShape.businessObject;\n\n      // when\n      var targetShape = modeling.appendShape(startEventShape, { type: 'bpmn:Task' }),\n          target = targetShape.businessObject;\n\n      // then\n      expect(subProcess.get('flowElements')).to.include(target);\n    }));\n\n\n    it('should add connection + DI', inject(function(elementRegistry, modeling) {\n\n      // given\n      var startEventShape = elementRegistry.get('StartEvent_1');\n      var subProcessShape = elementRegistry.get('SubProcess_1');\n\n      var startEventBo = startEventShape.businessObject,\n          subProcessBo = subProcessShape.businessObject;\n\n      // when\n      var targetShape = modeling.appendShape(startEventShape, { type: 'bpmn:Task' }),\n          targetBo = targetShape.businessObject;\n\n      var connection = targetShape.incoming[0],\n          connectionDi = getDi(connection),\n          connectionBo = getBusinessObject(connection);\n\n      // then\n      expect(connection).to.exist;\n      expect(is(connection, 'bpmn:SequenceFlow')).to.be.true;\n\n      expect(connectionBo.sourceRef).to.eql(startEventBo);\n      expect(connectionBo.targetRef).to.eql(targetBo);\n      expect(connectionBo.$parent).to.equal(subProcessBo);\n\n      // https://github.com/bpmn-io/bpmn-js/issues/1544\n      expect(connectionDi.waypoints).not.to.exist;\n\n      expect(connectionDi.waypoint).to.have.length(2);\n    }));\n\n  });\n\n\n  describe('undo support', function() {\n\n    it('should undo add to parent', inject(function(elementRegistry, modeling, commandStack) {\n\n      // given\n      var startEventShape = elementRegistry.get('StartEvent_1'),\n          subProcessShape = elementRegistry.get('SubProcess_1');\n\n      var subProcess = subProcessShape.businessObject,\n          subProcessDi = getDi(subProcessShape);\n\n      var targetShape = modeling.appendShape(startEventShape, { type: 'bpmn:Task' }),\n          target = targetShape.businessObject,\n          targetDi = getDi(targetShape);\n\n      // when\n      commandStack.undo();\n\n      // then\n      expect(subProcess.get('flowElements')).not.to.include(target);\n      expect(subProcessDi.$parent.get('planeElement')).not.to.include(targetDi);\n    }));\n\n\n    it('should undo add shape label', inject(function(elementRegistry, modeling, commandStack) {\n\n      // given\n      var startEventShape = elementRegistry.get('StartEvent_1'),\n          subProcessShape = elementRegistry.get('SubProcess_1');\n\n      var startEvent = startEventShape.businessObject,\n          startEventDi = getDi(startEventShape),\n          subProcess = subProcessShape.businessObject;\n\n      var targetShape = modeling.appendShape(startEventShape, { type: 'bpmn:EndEvent' }),\n          target = targetShape.businessObject;\n\n      var connection = find(subProcess.get('flowElements'), function(e) {\n            return e.sourceRef === startEvent && e.targetRef === target;\n          }),\n          connectionDi = getDi(elementRegistry.get(connection.id));\n\n      // assume\n      expect(connectionDi).to.exist;\n\n      // when\n      commandStack.undo();\n\n      // then\n      expect(connection.sourceRef).to.be.null;\n      expect(connection.targetRef).to.be.null;\n      expect(connection.$parent).to.be.null;\n      expect(startEventDi.$parent.get('planeElement')).not.to.include(connectionDi);\n\n      expect(targetShape.label).not.to.exist;\n      expect(elementRegistry.get(target.id + '_label')).not.to.exist;\n    }));\n\n\n    it('should undo add connection', inject(function(elementRegistry, modeling, commandStack) {\n\n      // given\n      var startEventShape = elementRegistry.get('StartEvent_1');\n      var subProcessShape = elementRegistry.get('SubProcess_1');\n\n      var startEvent = startEventShape.businessObject,\n          subProcess = subProcessShape.businessObject,\n          subProcessDi = getDi(subProcessShape);\n\n      var targetShape = modeling.appendShape(startEventShape, { type: 'bpmn:Task' }),\n          target = targetShape.businessObject;\n\n      var connection = find(subProcess.get('flowElements'), function(e) {\n            return e.sourceRef === startEvent && e.targetRef === target;\n          }),\n          connectionDi = getDi(elementRegistry.get(connection.id));\n\n      // assume\n      expect(connectionDi).to.exist;\n\n      // when\n      commandStack.undo();\n\n      // then\n      expect(connection.sourceRef).to.be.null;\n      expect(connection.targetRef).to.be.null;\n\n      expect(startEvent.get('outgoing')).not.to.include(connection);\n      expect(target.get('incoming')).not.to.include(connection);\n\n      expect(connection.$parent).to.be.null;\n      expect(subProcessDi.$parent.get('planeElement')).not.to.include(connectionDi);\n\n      expect(elementRegistry.get(targetShape.id)).not.to.exist;\n    }));\n\n\n    it('should undo add connection label', inject(function(elementRegistry, modeling, commandStack) {\n\n      // given\n      var startEventShape = elementRegistry.get('StartEvent_1');\n      var subProcessShape = elementRegistry.get('SubProcess_1');\n\n      var startEvent = startEventShape.businessObject,\n          subProcess = subProcessShape.businessObject,\n          subProcessDi = getDi(subProcessShape);\n\n      var targetShape = modeling.appendShape(startEventShape, { type: 'bpmn:Task' }),\n          target = targetShape.businessObject;\n\n      var connection = find(subProcess.get('flowElements'), function(e) {\n            return e.sourceRef === startEvent && e.targetRef === target;\n          }),\n          connectionDi = getDi(elementRegistry.get(connection.id));\n\n      // assume\n      expect(connectionDi).to.exist;\n\n      // when\n      commandStack.undo();\n\n      // then\n      expect(connection.sourceRef).to.be.null;\n      expect(connection.targetRef).to.be.null;\n      expect(connection.$parent).to.be.null;\n      expect(subProcessDi.$parent.get('planeElement')).not.to.include(connectionDi);\n\n      expect(elementRegistry.get(connection.id + '_label')).not.to.exist;\n    }));\n\n\n    it('should redo appending multiple shapes', inject(function(elementRegistry, modeling, commandStack) {\n\n      // given\n      var startEventShape = elementRegistry.get('StartEvent_1');\n      var subProcessShape = elementRegistry.get('SubProcess_1');\n\n      var targetShape = modeling.appendShape(startEventShape, { type: 'bpmn:Task' });\n\n      var targetShape2 = modeling.appendShape(targetShape, { type: 'bpmn:UserTask' });\n\n      // when\n      commandStack.undo();\n      commandStack.undo();\n      commandStack.redo();\n      commandStack.redo();\n\n      // then\n      // expect redo to work on original target object\n      expect(targetShape.parent).to.eql(subProcessShape);\n\n      // when\n      commandStack.undo();\n      commandStack.undo();\n\n      // then\n      expect(targetShape2.parent).to.be.null;\n      expect(elementRegistry.get(targetShape2.id)).not.to.exist;\n    }));\n\n\n    it('should redo add connection', inject(function(elementRegistry, modeling, commandStack) {\n\n      // given\n      var startEventShape = elementRegistry.get('StartEvent_1');\n      var subProcessShape = elementRegistry.get('SubProcess_1');\n\n      var startEvent = startEventShape.businessObject,\n          subProcess = subProcessShape.businessObject,\n          subProcessDi = getDi(subProcessShape);\n\n      var targetShape = modeling.appendShape(startEventShape, { type: 'bpmn:Task' }),\n          target = targetShape.businessObject;\n\n      var connection = find(subProcess.get('flowElements'), function(e) {\n            return e.sourceRef === startEvent && e.targetRef === target;\n          }),\n          connectionDi = getDi(elementRegistry.get(connection.id));\n\n      // assume\n      expect(connectionDi).to.exist;\n\n      // when\n      commandStack.undo();\n      commandStack.redo();\n      commandStack.undo();\n\n      // then\n      expect(connection.sourceRef).to.be.null;\n      expect(connection.targetRef).to.be.null;\n      expect(connection.$parent).to.be.null;\n\n      expect(subProcessDi.$parent.get('planeElement')).not.to.include(connectionDi);\n    }));\n\n  });\n\n\n  describe('bpmn element support', function() {\n\n    describe('ExclusiveGateway', function() {\n\n      it('should append', inject(function(elementRegistry, modeling) {\n\n        // given\n        var startEventShape = elementRegistry.get('StartEvent_1');\n\n        // when\n        var targetShape = modeling.appendShape(startEventShape, { type: 'bpmn:ExclusiveGateway' }),\n            target = targetShape.businessObject;\n\n        // then\n        expect(targetShape).to.exist;\n        expect(target.$instanceOf('bpmn:ExclusiveGateway')).to.be.true;\n      }));\n\n\n      it('should add to parent (sub process)', inject(function(elementRegistry, modeling) {\n\n        // given\n        var startEventShape = elementRegistry.get('StartEvent_1');\n        var subProcessShape = elementRegistry.get('SubProcess_1');\n\n        var subProcess = subProcessShape.businessObject;\n\n        // when\n        var targetShape = modeling.appendShape(startEventShape, { type: 'bpmn:ExclusiveGateway' }),\n            target = targetShape.businessObject;\n\n        // then\n        expect(subProcess.get('flowElements')).to.include(target);\n      }));\n\n\n      it('should undo append', inject(function(elementRegistry, modeling, commandStack) {\n\n        // given\n        var startEventShape = elementRegistry.get('StartEvent_1');\n        var subProcessShape = elementRegistry.get('SubProcess_1');\n\n        var subProcess = subProcessShape.businessObject,\n            subProcessDi = getDi(subProcessShape);\n\n        var targetShape = modeling.appendShape(startEventShape, { type: 'bpmn:ExclusiveGateway' }),\n            target = targetShape.businessObject,\n            targetDi = getDi(targetShape);\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(subProcess.get('flowElements')).not.to.include(target);\n        expect(subProcessDi.$parent.get('planeElement')).not.to.include(targetDi);\n      }));\n\n    });\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/BendpointsSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport bendpointsModule from 'diagram-js/lib/features/bendpoints';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/bendpoints', function() {\n\n  var diagramXML = require('../../../fixtures/bpmn/features/drop/drop.bpmn');\n\n  var testModules = [ coreModule, bendpointsModule, modelingModule ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  it('should contain bendpoints', inject(function(bendpoints) {\n    expect(bendpoints).to.exist;\n  }));\n\n});"
  },
  {
    "path": "test/spec/features/modeling/BpmnFactorySpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features - bpmn-factory', function() {\n\n  var diagramXML = require('../../../fixtures/bpmn/simple.bpmn');\n\n  var testModules = [ modelingModule, coreModule ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  describe('create element', function() {\n\n    it('should return instance', inject(function(bpmnFactory) {\n\n      var task = bpmnFactory.create('bpmn:Task');\n      expect(task).to.exist;\n      expect(task.$type).to.equal('bpmn:Task');\n    }));\n\n\n    it('should assign id (with semantic prefix)', inject(function(bpmnFactory) {\n      var plane = bpmnFactory.create('bpmndi:BPMNPlane');\n\n      expect(plane.$type).to.equal('bpmndi:BPMNPlane');\n      expect(plane.id).to.match(/^BPMNPlane_/g);\n    }));\n\n\n    it('should assign bpmn:LaneSet id', inject(function(bpmnFactory) {\n      var set = bpmnFactory.create('bpmn:LaneSet');\n\n      expect(set.id).to.exist;\n    }));\n\n\n    describe('generic id', function() {\n\n      it('should assign id with generic semantic prefix (Activity)', inject(function(bpmnFactory) {\n        var task = bpmnFactory.create('bpmn:ServiceTask');\n\n        expect(task.$type).to.equal('bpmn:ServiceTask');\n        expect(task.id).to.match(/^Activity_/g);\n      }));\n\n\n      it('should assign id with generic semantic prefix (Gateway)', inject(function(bpmnFactory) {\n        var gateway = bpmnFactory.create('bpmn:ParallelGateway');\n\n        expect(gateway.$type).to.equal('bpmn:ParallelGateway');\n        expect(gateway.id).to.match(/^Gateway_/g);\n      }));\n\n\n      it('should assign id with generic semantic prefix (Event)', inject(function(bpmnFactory) {\n        var event = bpmnFactory.create('bpmn:EndEvent');\n\n        expect(event.$type).to.equal('bpmn:EndEvent');\n        expect(event.id).to.match(/^Event_/g);\n      }));\n\n\n      it('should assign id with generic semantic prefix (SequenceFlow)', inject(\n        function(bpmnFactory) {\n          var flow = bpmnFactory.create('bpmn:SequenceFlow');\n\n          expect(flow.$type).to.equal('bpmn:SequenceFlow');\n          expect(flow.id).to.match(/^Flow_/g);\n        })\n      );\n\n\n      it('should assign id with generic semantic prefix (MessageFlow)', inject(\n        function(bpmnFactory) {\n          var flow = bpmnFactory.create('bpmn:MessageFlow');\n\n          expect(flow.$type).to.equal('bpmn:MessageFlow');\n          expect(flow.id).to.match(/^Flow_/g);\n        })\n      );\n\n\n      it('should assign id with specific semantic prefix (DataStore)', inject(\n        function(bpmnFactory) {\n          var dataStore = bpmnFactory.create('bpmn:DataStore');\n\n          expect(dataStore.$type).to.equal('bpmn:DataStore');\n          expect(dataStore.id).to.match(/^DataStore_/g);\n        })\n      );\n\n\n      it('should assign id with specific semantic prefix (DataObject)', inject(\n        function(bpmnFactory) {\n          var dataObject = bpmnFactory.create('bpmn:DataObject');\n\n          expect(dataObject.$type).to.equal('bpmn:DataObject');\n          expect(dataObject.id).to.match(/^DataObject_/g);\n        })\n      );\n\n\n      it('should assign id with specific semantic prefix (DataObjectReference)', inject(\n        function(bpmnFactory) {\n          var dataObjectReference = bpmnFactory.create('bpmn:DataObjectReference');\n\n          expect(dataObjectReference.$type).to.equal('bpmn:DataObjectReference');\n          expect(dataObjectReference.id).to.match(/^DataObjectReference_/g);\n        })\n      );\n    });\n\n\n    it('should claim provided id', inject(function(bpmnFactory, moddle) {\n      var task = bpmnFactory.create('bpmn:Task', { id: 'foo' });\n\n      expect(task).to.exist;\n      expect(task.id).to.eql('foo');\n      expect(moddle.ids.assigned('foo')).to.exist;\n    }));\n\n  });\n\n\n  describe('create di', function() {\n\n    it('should create waypoints', inject(function(bpmnFactory) {\n\n      // given\n      var waypoints = [\n        { original: { x: 0, y: 0 }, x: 0, y: 0 },\n        { original: { x: 0, y: 0 }, x: 0, y: 0 }\n      ];\n\n      // when\n      var result = bpmnFactory.createDiWaypoints(waypoints);\n\n      // then\n      expect(result).eql([\n        bpmnFactory.create('dc:Point', { x: 0, y: 0 }),\n        bpmnFactory.create('dc:Point', { x: 0, y: 0 })\n      ]);\n\n      // expect original not to have been accidently serialized\n      expect(result[0].$attrs).to.eql({});\n    }));\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/BpmnUpdater.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.12.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n    <bpmn:endEvent id=\"EndEvent_1\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:task id=\"Task_1\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"Task_1\" targetRef=\"EndEvent_1\" />\n    <bpmn:startEvent id=\"StartEvent_2\">\n      <bpmn:outgoing>SequenceFlow_3</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:endEvent id=\"EndEvent_2\">\n      <bpmn:incoming>SequenceFlow_3</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_3\" sourceRef=\"StartEvent_2\" targetRef=\"EndEvent_2\" />\n    <bpmn:startEvent id=\"StartEvent_3\">\n      <bpmn:outgoing>SequenceFlow_4</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:endEvent id=\"EndEvent_3\">\n      <bpmn:incoming>SequenceFlow_4</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_4\" sourceRef=\"StartEvent_3\" targetRef=\"EndEvent_3\" />\n    <bpmn:task id=\"Task_2\">\n      <bpmn:incoming>SequenceFlow_5</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_5</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_5\" sourceRef=\"Task_2\" targetRef=\"Task_2\" />\n    <bpmn:task id=\"Task_3\" name=\"Foo\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0giidzv_di\" bpmnElement=\"SequenceFlow_5\">\n        <di:waypoint x=\"308\" y=\"530\" />\n        <di:waypoint x=\"308\" y=\"550\" />\n        <di:waypoint x=\"238\" y=\"550\" />\n        <di:waypoint x=\"238\" y=\"490\" />\n        <di:waypoint x=\"258\" y=\"490\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1o287si_di\" bpmnElement=\"SequenceFlow_4\">\n        <di:waypoint x=\"209\" y=\"389\" />\n        <di:waypoint x=\"418\" y=\"389\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"314\" y=\"364\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_3_di\" bpmnElement=\"SequenceFlow_3\" sourceElement=\"StartEvent_2_di\" targetElement=\"EndEvent_2_di\">\n        <di:waypoint x=\"209\" y=\"260\" />\n        <di:waypoint x=\"418\" y=\"260\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"314\" y=\"245\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_2_di\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"Task_1_di\" targetElement=\"EndEvent_1_di\">\n        <di:waypoint x=\"358\" y=\"120\" />\n        <di:waypoint x=\"418\" y=\"120\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"388\" y=\"95\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"StartEvent_1_di\" targetElement=\"Task_1_di\">\n        <di:waypoint x=\"209\" y=\"120\" />\n        <di:waypoint x=\"258\" y=\"120\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"234\" y=\"105\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"StartEvent_1_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_1_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"418\" y=\"102\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"436\" y=\"138\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"258\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_2_di\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds x=\"173\" y=\"242\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"191\" y=\"278\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_2_di\" bpmnElement=\"EndEvent_2\">\n        <dc:Bounds x=\"418\" y=\"242\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"436\" y=\"278\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1ua609k_di\" bpmnElement=\"StartEvent_3\">\n        <dc:Bounds x=\"173\" y=\"371\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"191\" y=\"407\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_10rrti7_di\" bpmnElement=\"EndEvent_3\">\n        <dc:Bounds x=\"418\" y=\"371\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"436\" y=\"407\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_15aeig4_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"258\" y=\"450\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1hgfykz_di\" bpmnElement=\"Task_3\">\n        <dc:Bounds x=\"258\" y=\"600\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"268\" y=\"610\" width=\"80\" height=\"60\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/BpmnUpdater.incompleteDi.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<semantic:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:semantic=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" id=\"Definitions\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <semantic:process id=\"Process\">\n    <semantic:startEvent id=\"StartEvent\" name=\"Start 0\" />\n    <semantic:startEvent id=\"StartEvent_2\" name=\"Start\" />\n  </semantic:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane bpmnElement=\"Process\">\n      <bpmndi:BPMNShape id=\"StartEvent_di\" bpmnElement=\"StartEvent\">\n        <dc:Bounds x=\"192\" y=\"123\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_2_di\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds x=\"306\" y=\"123\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</semantic:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/BpmnUpdaterSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport { getDi } from 'lib/util/ModelUtil';\n\nimport { pick } from 'min-dash';\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\n\nvar testModules = [ coreModule, modelingModule ];\n\n\ndescribe('features - bpmn-updater', function() {\n\n  describe('connection di', function() {\n\n    var diagramXML = require('./BpmnUpdater.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    it('should update after deleting intermediate element', inject(\n      function(modeling, elementRegistry) {\n\n        // given\n        // sequence flow with existing sourceElement and targetElement di information\n        var task = elementRegistry.get('Task_1'),\n            sequenceFlowDi = getDi(elementRegistry.get('SequenceFlow_1')),\n            startEventDi = getDi(elementRegistry.get('StartEvent_1')),\n            endEventDi = getDi(elementRegistry.get('EndEvent_1'));\n\n        // when\n        modeling.removeElements([ task ]);\n\n        // then\n        expect(sequenceFlowDi.sourceElement).to.equal(startEventDi);\n        expect(sequenceFlowDi.targetElement).to.equal(endEventDi);\n      }\n    ));\n\n\n    it('should update on drop on flow', inject(\n      function(modeling, elementRegistry, elementFactory) {\n\n        // given\n        // sequence flow with existing sourceElement and targetElement di information\n        var sequenceFlow = elementRegistry.get('SequenceFlow_3'),\n            startEventDi = getDi(elementRegistry.get('StartEvent_2')),\n            sequenceFlowDi = getDi(sequenceFlow);\n\n        var intermediateThrowEvent = elementFactory.createShape({\n          type: 'bpmn:IntermediateThrowEvent'\n        });\n\n        var dropPosition = { x: 320, y: 260 };\n\n        // when\n        var event = modeling.createShape(intermediateThrowEvent, dropPosition, sequenceFlow);\n\n        // then\n        expect(sequenceFlowDi.sourceElement).to.equal(startEventDi);\n        expect(sequenceFlowDi.targetElement).to.equal(getDi(event));\n      }\n    ));\n\n\n    it('should not create new di refs', inject(\n      function(modeling, elementRegistry, elementFactory) {\n\n        // given\n        // sequence flow without any sourceElement and targetElement di information\n        var sequenceFlow = elementRegistry.get('SequenceFlow_4'),\n            sequenceFlowDi = getDi(sequenceFlow);\n\n        var intermediateThrowEvent = elementFactory.createShape({\n          type: 'bpmn:IntermediateThrowEvent'\n        });\n\n        var dropPosition = { x: 320, y: 260 };\n\n        // when\n        modeling.createShape(intermediateThrowEvent, dropPosition, sequenceFlow);\n\n        // then\n        expect(sequenceFlowDi.sourceElement).not.to.exist;\n        expect(sequenceFlowDi.targetElement).not.to.exist;\n      }\n    ));\n\n  });\n\n\n  describe('connection cropping', function() {\n\n    var diagramXML = require('./BpmnUpdater.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n    afterEach(sinon.restore);\n\n\n    it('should crop connection only once per reconnect', inject(\n      function(modeling, elementRegistry, connectionDocking) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n            target = elementRegistry.get('EndEvent_2'),\n            cropSpy = sinon.spy(connectionDocking, 'getCroppedWaypoints');\n\n        // when\n        modeling.reconnectEnd(sequenceFlow, target, { x: 418, y: 260 });\n\n        // then\n        expect(cropSpy).to.have.been.calledOnce;\n        expect(cropSpy).to.have.been.calledWith(sequenceFlow);\n      }\n    ));\n\n\n    it('should not crop connection after pasting', inject(\n      function(canvas, copyPaste, elementRegistry, connectionDocking) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_5'),\n            target = elementRegistry.get('Task_2'),\n            cropSpy = sinon.spy(connectionDocking, 'getCroppedWaypoints');\n\n        copyPaste.copy([\n          target,\n          sequenceFlow\n        ]);\n\n        // when\n        copyPaste.paste({\n          element: canvas.getRootElement(),\n          point: {\n            x: 500,\n            y: 500\n          }\n        });\n\n        // then\n        expect(cropSpy).not.to.have.been.calledOnce;\n      }\n    ));\n\n  });\n\n\n  describe('incomplete DI', function() {\n\n    var diagramXML = require('./BpmnUpdater.incompleteDi.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    it('should add missing label bpmndi:Bounds', inject(\n      function(modeling, elementRegistry) {\n\n        // given\n        var event = elementRegistry.get('StartEvent'),\n            label = event.label,\n            di = getDi(event);\n\n        // when\n        modeling.moveElements([ label ], { x: 20, y: 20 });\n\n        var labelBounds = di.label.bounds;\n\n        // then\n        expect(labelBounds).to.exist;\n\n        expect(labelBounds).to.include.keys(\n          'x', 'y',\n          'width', 'height'\n        );\n      }\n    ));\n\n\n    it('should add missing bpmndi:BPMNLabel', inject(\n      function(modeling, elementRegistry) {\n\n        // given\n        var event = elementRegistry.get('StartEvent_2'),\n            label = event.label,\n            di = getDi(event);\n\n        // when\n        modeling.moveElements([ label ], { x: 20, y: 20 });\n\n        var diLabel = di.label;\n\n        // then\n        expect(diLabel).to.exist;\n\n        expect(diLabel.bounds).to.exist;\n      }\n    ));\n\n  });\n\n\n  describe('update embedded label bounds', function() {\n\n    var diagramXML = require('./BpmnUpdater.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n    var bounds,\n        di;\n\n    beforeEach(inject(function(elementRegistry, modeling) {\n\n      // given\n      var task = elementRegistry.get('Task_3');\n\n      di = getDi(task);\n\n      bounds = pick(di.get('label').get('bounds'), [ 'x', 'y', 'width', 'height' ]);\n\n      // when\n      modeling.moveShape(task, {\n        x: 100,\n        y: 100\n      });\n    }));\n\n\n    it('<do>', function() {\n\n      // then\n      expect(di.get('label').get('bounds')).to.include({\n        x: bounds.x + 100,\n        y: bounds.y + 100,\n        width: bounds.width,\n        height: bounds.height\n      });\n    });\n\n\n    it('<undo>', inject(function(commandStack) {\n\n      // when\n      commandStack.undo();\n\n      // then\n      expect(di.get('label').get('bounds')).to.include({\n        x: bounds.x,\n        y: bounds.y,\n        width: bounds.width,\n        height: bounds.height\n      });\n    }));\n\n\n    it('<redo>', inject(function(commandStack) {\n\n      // when\n      commandStack.undo();\n      commandStack.redo();\n\n      // then\n      expect(di.get('label').get('bounds')).to.include({\n        x: bounds.x + 100,\n        y: bounds.y + 100,\n        width: bounds.width,\n        height: bounds.height\n      });\n    }));\n\n  });\n\n\n  describe('BPMNLabel', function() {\n\n    describe('embedded', function() {\n\n      it('should set BPMNLabel on task', inject(function(modeling, elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task_1');\n\n        // when\n        modeling.updateLabel(task, 'foo');\n\n        // then\n        expect(task.businessObject.name).to.equal('foo');\n        expect(getDi(task).label).to.exist;\n      }));\n\n\n      it('should unset BPMNLabel on task', inject(function(modeling, elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task_3');\n\n        // when\n        modeling.updateLabel(task, '');\n\n        // then\n        expect(task.businessObject.name).to.equal('');\n        expect(getDi(task)).not.to.have.property('label');\n      }));\n    });\n\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/CreateConnectionSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  getDi\n} from 'lib/util/ModelUtil';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - create connection', function() {\n\n  var diagramXML = require('../../../fixtures/bpmn/sequence-flows.bpmn');\n\n  var testModules = [ coreModule, modelingModule ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  it('should connect', inject(function(elementRegistry, modeling, bpmnFactory) {\n\n    // given\n    var taskShape = elementRegistry.get('Task_1'),\n        task = taskShape.businessObject,\n        taskDi = getDi(taskShape),\n        gatewayShape = elementRegistry.get('Gateway_1'),\n        gateway = gatewayShape.businessObject;\n\n    // when\n    var sequenceFlowConnection = modeling.createConnection(taskShape, gatewayShape, {\n      type: 'bpmn:SequenceFlow'\n    }, taskShape.parent);\n\n    var sequenceFlow = sequenceFlowConnection.businessObject,\n        sequenceFlowDi = getDi(sequenceFlowConnection);\n\n    // then\n    expect(sequenceFlowConnection).to.exist;\n    expect(sequenceFlow).to.exist;\n\n    expect(sequenceFlow.sourceRef).to.eql(task);\n    expect(sequenceFlow.targetRef).to.eql(gateway);\n\n    expect(task.outgoing).to.include(sequenceFlow);\n    expect(gateway.incoming).to.include(sequenceFlow);\n\n    expect(sequenceFlowDi.$parent).to.eql(taskDi.$parent);\n    expect(sequenceFlowDi.$parent.planeElement).to.include(sequenceFlowDi);\n\n    // expect cropped connection\n    expect(sequenceFlowConnection.waypoints).eql([\n      { original: { x: 242, y: 376 }, x: 292, y: 376 },\n      { x: 410, y: 376 },\n      { x: 410, y: 341 },\n      { original: { x: 553, y: 341 }, x: 528, y: 341 }\n    ]);\n\n    var diWaypoints = bpmnFactory.createDiWaypoints([\n      { x: 292, y: 376 },\n      { x: 410, y: 376 },\n      { x: 410, y: 341 },\n      { x: 528, y: 341 }\n    ]);\n\n    // expect cropped waypoints in di\n    expect(sequenceFlowDi.waypoint).eql(diWaypoints);\n  }));\n\n\n  it('should connect with custom start / end', inject(function(elementRegistry, modeling) {\n\n    // given\n    var sourceShape = elementRegistry.get('Task_2'),\n        sourcePosition = {\n          x: 740,\n          y: 400\n        },\n        targetShape = elementRegistry.get('Task_3'),\n        targetPosition = {\n          x: 420,\n          y: 130\n        };\n\n    // when\n    var newConnection = modeling.connect(\n      sourceShape, targetShape,\n      null,\n      {\n        connectionStart: sourcePosition,\n        connectionEnd: targetPosition\n      }\n    );\n\n    // then\n    // expect cropped connection with custom start/end\n    expect(newConnection).to.have.waypoints([\n      { x: 734, y: 400 },\n      { x: 590, y: 400 },\n      { x: 590, y: 130 },\n      { x: 447, y: 130 }\n    ]);\n  }));\n\n\n  it('should undo', inject(function(elementRegistry, commandStack, modeling) {\n\n    // given\n    var taskShape = elementRegistry.get('Task_1'),\n        task = taskShape.businessObject,\n        gatewayShape = elementRegistry.get('Gateway_1'),\n        gateway = gatewayShape.businessObject;\n\n\n    var sequenceFlowConnection = modeling.createConnection(taskShape, gatewayShape, {\n      type: 'bpmn:SequenceFlow'\n    }, taskShape.parent);\n\n    var sequenceFlow = sequenceFlowConnection.businessObject;\n\n    // when\n    commandStack.undo();\n\n    // then\n    expect(sequenceFlow.$parent).to.be.null;\n    expect(sequenceFlow.sourceRef).to.be.null;\n    expect(sequenceFlow.targetRef).to.be.null;\n\n    expect(task.outgoing).not.to.include(sequenceFlow);\n    expect(gateway.incoming).not.to.include(sequenceFlow);\n  }));\n\n\n  it('should redo', inject(function(elementRegistry, commandStack, modeling) {\n\n    // given\n    var taskShape = elementRegistry.get('Task_1'),\n        task = taskShape.businessObject,\n        taskDi = getDi(taskShape),\n        gatewayShape = elementRegistry.get('Gateway_1'),\n        gateway = gatewayShape.businessObject;\n\n\n    var sequenceFlowConnection = modeling.createConnection(taskShape, gatewayShape, {\n      type: 'bpmn:SequenceFlow'\n    }, taskShape.parent);\n\n    var sequenceFlow = sequenceFlowConnection.businessObject,\n        sequenceFlowDi = getDi(sequenceFlowConnection);\n\n    var newWaypoints = sequenceFlowConnection.waypoints,\n        newDiWaypoints = sequenceFlowDi.waypoint;\n\n    // when\n    commandStack.undo();\n    commandStack.redo();\n\n    // then\n    expect(sequenceFlow.sourceRef).to.eql(task);\n    expect(sequenceFlow.targetRef).to.eql(gateway);\n\n    expect(task.outgoing).to.include(sequenceFlow);\n    expect(gateway.incoming).to.include(sequenceFlow);\n\n    expect(sequenceFlowDi.$parent).to.eql(taskDi.$parent);\n    expect(sequenceFlowDi.$parent.planeElement).to.include(sequenceFlowDi);\n\n    // expect cropped connection\n    expect(sequenceFlowConnection.waypoints).eql(newWaypoints);\n\n    // expect cropped waypoints in di\n    expect(sequenceFlowDi.waypoint).eql(newDiWaypoints);\n  }));\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/DeleteConnectionSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - #removeConnection', function() {\n\n  var diagramXML = require('../../../fixtures/bpmn/sequence-flows.bpmn');\n\n  var testModules = [ coreModule, modelingModule ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  describe('shape handling', function() {\n\n    it('should execute', inject(function(elementRegistry, modeling) {\n\n      // given\n      var sequenceFlowShape = elementRegistry.get('SequenceFlow_2'),\n          sequenceFlow = sequenceFlowShape.businessObject;\n\n      // when\n      modeling.removeConnection(sequenceFlowShape);\n\n      // then\n      expect(sequenceFlow.$parent).to.be.null;\n    }));\n  });\n\n\n  describe('undo support', function() {\n\n    it('should undo', inject(function(elementRegistry, modeling, commandStack) {\n\n      // given\n      var sequenceFlowShape = elementRegistry.get('SequenceFlow_2'),\n          sequenceFlow = sequenceFlowShape.businessObject,\n          parent = sequenceFlow.$parent;\n\n      // when\n      modeling.removeConnection(sequenceFlowShape);\n      commandStack.undo();\n\n      // then\n      expect(sequenceFlow.$parent).to.eql(parent);\n    }));\n  });\n\n\n  describe('redo support', function() {\n\n    it('redo', inject(function(elementRegistry, modeling, commandStack) {\n\n      // given\n      var sequenceFlowShape = elementRegistry.get('SequenceFlow_2'),\n          sequenceFlow = sequenceFlowShape.businessObject;\n\n      // when\n      modeling.removeConnection(sequenceFlowShape);\n      commandStack.undo();\n      commandStack.redo();\n\n      // then\n      expect(sequenceFlow.$parent).to.be.null;\n    }));\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/DeleteParticipantSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport { getDi } from 'lib/util/ModelUtil';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - delete participant', function() {\n\n  var testModules = [ coreModule, modelingModule ];\n\n\n  describe('last remaining', function() {\n\n    describe('should transform diagram into process diagram', function() {\n\n      var processDiagramXML = require('../../../fixtures/bpmn/collaboration/collaboration-empty-participant.bpmn');\n\n      beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n\n      it('execute', inject(function(modeling, elementRegistry, canvas) {\n\n        // given\n        var participantShape = elementRegistry.get('_Participant_2'),\n            participant = participantShape.businessObject,\n            participantDi = getDi(participantShape),\n            process = participant.processRef,\n            collaborationElement = participantShape.parent,\n            collaboration = collaborationElement.businessObject,\n            diPlane = getDi(collaborationElement),\n            bpmnDefinitions = collaboration.$parent;\n\n        // when\n        modeling.removeShape(participantShape);\n\n        // then\n        expect(participant.$parent).not.to.be.ok;\n\n        var newRootShape = canvas.getRootElement(),\n            newRootBusinessObject = newRootShape.businessObject;\n\n        expect(newRootBusinessObject.$instanceOf('bpmn:Process')).to.be.true;\n\n        // collaboration DI is unwired\n        expect(participantDi.$parent).not.to.be.ok;\n        expect(collaborationElement.di).not.to.be.ok;\n\n        expect(bpmnDefinitions.rootElements).not.to.include(process);\n        expect(bpmnDefinitions.rootElements).not.to.include(collaboration);\n\n        // process DI is wired\n        expect(diPlane.bpmnElement).to.eql(newRootBusinessObject);\n        expect(newRootShape.di).to.eql(diPlane);\n\n        expect(bpmnDefinitions.rootElements).to.include(newRootBusinessObject);\n      }));\n\n\n      it('undo', inject(function(modeling, elementRegistry, canvas, commandStack) {\n\n        // given\n        var participantShape = elementRegistry.get('_Participant_2'),\n            participant = participantShape.businessObject,\n            originalRootElement = participantShape.parent,\n            originalRootElementBo = originalRootElement.businessObject,\n            bpmnDefinitions = originalRootElementBo.$parent,\n            participantDi = getDi(participantShape),\n            diPlane = participantDi.$parent;\n\n        modeling.removeShape(participantShape);\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(participant.$parent).to.eql(originalRootElementBo);\n        expect(originalRootElementBo.$parent).to.eql(bpmnDefinitions);\n\n        expect(canvas.getRootElement()).to.eql(originalRootElement);\n\n        // di is unwired\n        expect(participantDi.$parent).to.eql(getDi(originalRootElement));\n\n        // new di is wired\n        expect(diPlane.bpmnElement).to.eql(originalRootElementBo);\n      }));\n\n    });\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/DeleteShape.cropping.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_0ab2xkc\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"3.2.1\">\n  <bpmn:process id=\"Process_0e2pbo0\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_010w5he\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Task_0wdyv45\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_010w5he\" targetRef=\"Task_A\" />\n    <bpmn:task id=\"Task_A\" name=\"A\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"Task_A\" targetRef=\"Task_0wdyv45\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_0e2pbo0\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_010w5he\">\n        <dc:Bounds x=\"156\" y=\"81\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0wdyv45_di\" bpmnElement=\"Task_0wdyv45\">\n        <dc:Bounds x=\"392\" y=\"59\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"192\" y=\"99\" />\n        <di:waypoint x=\"242\" y=\"99\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_A_di\" bpmnElement=\"Task_A\">\n        <dc:Bounds x=\"242\" y=\"59\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_2_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint x=\"342\" y=\"99\" />\n        <di:waypoint x=\"392\" y=\"99\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/DeleteShapeSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\nvar testModules = [ coreModule, modelingModule ];\n\n\ndescribe('features/modeling - #removeShape', function() {\n\n  var diagramXML = require('../../../fixtures/bpmn/sequence-flows.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  describe('shape handling', function() {\n\n    it('should execute', inject(function(elementRegistry, modeling) {\n\n      // given\n      var taskShape = elementRegistry.get('Task_1'),\n          task = taskShape.businessObject;\n\n      // when\n      modeling.removeShape(taskShape);\n\n      // then\n      expect(task.$parent).to.be.null;\n    }));\n  });\n\n\n  describe('undo support', function() {\n\n    it('should undo', inject(function(elementRegistry, modeling, commandStack) {\n\n      // given\n      var taskShape = elementRegistry.get('Task_1'),\n          task = taskShape.businessObject,\n          parent = task.$parent;\n\n      // when\n      modeling.removeShape(taskShape);\n      commandStack.undo();\n\n      // then\n      expect(task.$parent).to.eql(parent);\n    }));\n  });\n\n\n  describe('redo support', function() {\n\n    it('redo', inject(function(elementRegistry, modeling, commandStack) {\n\n      // given\n      var taskShape = elementRegistry.get('Task_1'),\n          task = taskShape.businessObject;\n\n      // when\n      modeling.removeShape(taskShape);\n      commandStack.undo();\n      commandStack.redo();\n\n      // then\n      expect(task.$parent).to.be.null;\n    }));\n  });\n\n});\n\n\ndescribe('features/modeling - #removeShape - cropping', function() {\n\n  var diagramXML = require('./DeleteShape.cropping.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  it('should crop waypoints on undo/redo', inject(\n    function(elementRegistry, commandStack, modeling) {\n\n      // given\n      var taskShape = elementRegistry.get('Task_A'),\n          sequenceFlowConnection = elementRegistry.get('SequenceFlow_1'),\n          incomingFlow = taskShape.incoming[0],\n          outgoingFlow = taskShape.outgoing[0],\n          expectedStart = incomingFlow.waypoints[0],\n          expectedEnd = outgoingFlow.waypoints[1];\n\n      // when\n      modeling.removeShape(taskShape);\n      commandStack.undo();\n      commandStack.redo();\n\n      // then\n      expect(sequenceFlowConnection).to.have.waypoints([ expectedStart, expectedEnd ]);\n    }\n  ));\n\n});"
  },
  {
    "path": "test/spec/features/modeling/DropSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/move - drop', function() {\n\n  var diagramXML = require('../../../fixtures/bpmn/features/drop/drop.bpmn');\n  var diagramXML2 = require('../../../fixtures/bpmn/features/drop/recursive-task.bpmn');\n\n  var testModules = [ coreModule, modelingModule ];\n\n\n  describe('elements', function() {\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n    it('should update parent', inject(function(elementRegistry, modeling) {\n\n      // given\n      var task_1 = elementRegistry.get('ID_Task_1'),\n          parent = elementRegistry.get('ID_SubProcess_1');\n\n      // when\n      modeling.moveShape(task_1, { x: 0, y: 200 }, parent);\n\n      // then\n      expect(task_1.parent).to.eql(parent);\n      expect(task_1.businessObject.$parent).to.eql(parent.businessObject);\n    }));\n\n\n    it('should update parents', inject(function(elementRegistry, modeling) {\n\n      // given\n      var task_1 = elementRegistry.get('ID_Task_1'),\n          task_2 = elementRegistry.get('ID_Task_2'),\n          parent = elementRegistry.get('ID_SubProcess_1');\n\n      // when\n      modeling.moveElements([ task_1, task_2 ], { x: 0, y: 200 }, parent);\n\n      // then\n      expect(task_1.parent).to.eql(parent);\n      expect(task_1.businessObject.$parent).to.eql(parent.businessObject);\n      expect(task_2.parent).to.eql(parent);\n      expect(task_2.businessObject.$parent).to.eql(parent.businessObject);\n    }));\n\n  });\n\n\n  describe('connection handling', function() {\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    it('should remove flow if target and source have different parents', inject(\n      function(elementRegistry, modeling) {\n\n        // given\n        var task_1 = elementRegistry.get('ID_Task_1'),\n            parent = elementRegistry.get('ID_SubProcess_1'),\n            flow = elementRegistry.get('ID_Sequenceflow_1');\n\n        // when\n        modeling.moveElements([ task_1 ], { x: 0, y: 200 }, parent);\n\n        // then\n        expect(flow.parent).to.be.null;\n        expect(flow.businessObject.$parent).to.be.null;\n      }\n    ));\n\n\n    it('should update flow parent if target and source have same parents', inject(\n      function(elementRegistry, modeling) {\n\n        // given\n        var task_1 = elementRegistry.get('ID_Task_1'),\n            task_2 = elementRegistry.get('ID_Task_2'),\n            parent = elementRegistry.get('ID_SubProcess_1'),\n            flow = elementRegistry.get('ID_Sequenceflow_1');\n\n        // when\n        modeling.moveElements([ task_1, task_2 ], { x: 0, y: 250 }, parent);\n\n        // then\n        expect(flow.parent).to.eql(parent);\n        expect(flow.businessObject.$parent).to.eql(parent.businessObject);\n      }\n    ));\n\n  });\n\n\n  describe('recursion', function() {\n\n    beforeEach(bootstrapModeler(diagramXML2, { modules: testModules }));\n\n    it('should update parent', inject(function(elementRegistry, modeling) {\n\n      // given\n      var task_1 = elementRegistry.get('ID_task_1'),\n          parent = elementRegistry.get('ID_subprocess_1'),\n          sequenceFlow = elementRegistry.get('ID_sequenceflow_1');\n\n      // when\n      modeling.moveElements([ task_1 ], { x: 0, y: 200 }, parent);\n\n      // then\n      expect(task_1.parent).to.eql(parent);\n      expect(task_1.businessObject.$parent).to.eql(parent.businessObject);\n\n      expect(sequenceFlow.parent).to.eql(parent);\n      expect(sequenceFlow.businessObject.$parent).to.eql(parent.businessObject);\n    }));\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/ElementFactory.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\r\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\" />\r\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\r\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\" />\r\n  </bpmndi:BPMNDiagram>\r\n</bpmn:definitions>"
  },
  {
    "path": "test/spec/features/modeling/ElementFactorySpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\n\nimport {\n  getBusinessObject,\n  is\n} from '../../../../lib/util/ModelUtil';\n\nimport {\n  assign\n} from 'min-dash';\n\n\ndescribe('features - element factory', function() {\n\n  var diagramXML = require('./ElementFactory.bpmn');\n\n  var testModules = [ modelingModule, coreModule ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  describe('basics', function() {\n\n    it('should not mutate attrs', inject(function(elementFactory) {\n\n      // given\n      var attrs = {\n        type: 'bpmn:SubProcess',\n        isExpanded: false\n      };\n\n      // when\n      var createAttrs = assign({}, attrs);\n\n      elementFactory.createShape(createAttrs);\n\n      // then\n      expect(createAttrs).to.eql(attrs);\n    }));\n\n\n    it('should not mutate <di> attr', inject(function(elementFactory) {\n\n      // given\n      var attrs = {\n        type: 'bpmn:SubProcess',\n        isExpanded: false,\n        di: {\n          'bioc:stroke': 'red'\n        }\n      };\n\n      // when\n      var createAttrs = assign({}, attrs);\n\n      elementFactory.createShape(createAttrs);\n\n      // then\n      expect(createAttrs).to.eql(attrs);\n    }));\n\n  });\n\n\n  describe('create', function() {\n\n    it('should create with message event definition', inject(function(elementFactory) {\n\n      // when\n      var intermediateThrowEvent = elementFactory.createShape({\n        type: 'bpmn:IntermediateThrowEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition'\n      });\n\n      // then\n      expect(intermediateThrowEvent).to.exist;\n      expect(is(intermediateThrowEvent, 'bpmn:IntermediateThrowEvent')).to.be.true;\n\n      var intermediateThrowEventBo = getBusinessObject(intermediateThrowEvent),\n          eventDefinitions = intermediateThrowEventBo.eventDefinitions;\n\n      expect(eventDefinitions).to.exist;\n      expect(eventDefinitions).to.have.length(1);\n\n      var messageEventDefinition = eventDefinitions[ 0 ];\n\n      expect(is(messageEventDefinition, 'bpmn:MessageEventDefinition')).to.be.true;\n    }));\n\n\n    it('should create event with conditional event definition', inject(function(elementFactory) {\n\n      // when\n      var intermediateCatchEvent = elementFactory.createShape({\n        type: 'bpmn:IntermediateCatchEvent',\n        eventDefinitionType: 'bpmn:ConditionalEventDefinition'\n      });\n\n      // then\n      expect(intermediateCatchEvent).to.exist;\n      expect(is(intermediateCatchEvent, 'bpmn:IntermediateCatchEvent')).to.be.true;\n\n      var intermediateThrowEventBo = getBusinessObject(intermediateCatchEvent),\n          eventDefinitions = intermediateThrowEventBo.eventDefinitions;\n\n      expect(eventDefinitions).to.exist;\n      expect(eventDefinitions).to.have.length(1);\n\n      var conditionalEventDefinition = eventDefinitions[ 0 ];\n\n      expect(is(conditionalEventDefinition, 'bpmn:ConditionalEventDefinition')).to.be.true;\n      expect(conditionalEventDefinition.condition).to.exist;\n      expect(is(conditionalEventDefinition.condition, 'bpmn:FormalExpression')).to.be.true;\n    }));\n\n\n    it('should create with link event definition', inject(function(elementFactory) {\n\n      // when\n      var intermediateThrowEvent = elementFactory.createShape({\n        type: 'bpmn:IntermediateThrowEvent',\n        eventDefinitionType: 'bpmn:LinkEventDefinition',\n        eventDefinitionAttrs: {\n          name: ''\n        }\n      });\n\n      // then\n      expect(intermediateThrowEvent).to.exist;\n      expect(is(intermediateThrowEvent, 'bpmn:IntermediateThrowEvent')).to.be.true;\n\n      var intermediateThrowEventBo = getBusinessObject(intermediateThrowEvent),\n          eventDefinitions = intermediateThrowEventBo.eventDefinitions;\n\n      expect(eventDefinitions).to.exist;\n      expect(eventDefinitions).to.have.length(1);\n\n      var eventDefinition = eventDefinitions[ 0 ];\n\n      expect(is(eventDefinition, 'bpmn:LinkEventDefinition')).to.be.true;\n      expect(eventDefinition.name).to.eql('');\n    }));\n\n\n    it('should error when accessing <di> via businessObject', inject(function(elementFactory) {\n\n      // given\n      var shape = elementFactory.createShape({\n        type: 'bpmn:Task',\n      });\n\n      // then\n      expect(shape.di).to.exist;\n      expect(function() {\n        shape.businessObject.di;\n      }).to.throw(/The di is available through the diagram element only./);\n    }));\n\n\n    it('should add collapsed attribute to subprocess', inject(function(elementFactory) {\n\n      // when\n      var subprocess = elementFactory.createShape({\n        type: 'bpmn:SubProcess',\n        isExpanded: false\n      });\n\n      // then\n      expect(subprocess.collapsed).to.be.true;\n    }));\n\n\n    it('should create subprocess as event subprocess', inject(function(elementFactory) {\n\n      // when\n      var subprocess = elementFactory.createShape({\n        type: 'bpmn:SubProcess',\n        triggeredByEvent: true\n      });\n\n      var businessObject = getBusinessObject(subprocess);\n\n      // then\n      expect(businessObject.triggeredByEvent).to.be.true;\n    }));\n\n\n    it('should create boundary event as non-interrupting', inject(function(elementFactory) {\n\n      // when\n      var event = elementFactory.createShape({\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition',\n        cancelActivity: false\n      });\n\n      var businessObject = getBusinessObject(event);\n\n      // then\n      expect(businessObject.cancelActivity).to.be.false;\n    }));\n\n\n    it('should create exclusive gateway with x marker', inject(function(elementFactory) {\n\n      // when\n      var shape = elementFactory.createShape({\n        type: 'bpmn:ExclusiveGateway',\n        di: { isMarkerVisible: true }\n      });\n\n      // then\n      expect(shape.di.isMarkerVisible).to.be.true;\n    }));\n\n\n    it('should create exclusive gateway without x marker', inject(function(elementFactory) {\n\n      // when\n      var shape = elementFactory.createShape({\n        type: 'bpmn:ExclusiveGateway',\n        di: { isMarkerVisible: false }\n      });\n\n      // then\n      expect(shape.di.isMarkerVisible).to.be.false;\n    }));\n\n\n    it('should create exclusive gateway with x marker by default', inject(function(elementFactory) {\n\n      // when\n      var shape = elementFactory.createShape({\n        type: 'bpmn:ExclusiveGateway'\n      });\n\n      // then\n      expect(shape.di.isMarkerVisible).to.be.true;\n    }));\n\n\n    it('should create horizontal participant', inject(function(elementFactory) {\n\n      // when\n      var shape = elementFactory.createParticipantShape({\n        isHorizontal: true\n      });\n\n      // then\n      expect(shape.di.isHorizontal).to.be.true;\n    }));\n\n\n    it('should create vertical participant', inject(function(elementFactory) {\n\n      // when\n      var shape = elementFactory.createParticipantShape({\n        isHorizontal: false\n      });\n\n      // then\n      expect(shape.di.isHorizontal).to.be.false;\n    }));\n\n\n    it('should create horizontal lane', inject(function(elementFactory) {\n\n      // when\n      var shape = elementFactory.createShape({\n        type: 'bpmn:Lane',\n        isHorizontal: true\n      });\n\n      // then\n      expect(shape.di.isHorizontal).to.be.true;\n    }));\n\n\n    it('should create vertical lane', inject(function(elementFactory) {\n\n      // when\n      var shape = elementFactory.createShape({\n        type: 'bpmn:Lane',\n        isHorizontal: false\n      });\n\n      // then\n      expect(shape.di.isHorizontal).to.be.false;\n    }));\n\n\n    describe('integration', function() {\n\n      it('should create event definition with ID', inject(function(elementFactory) {\n\n        // when\n        var intermediateThrowEvent = elementFactory.createShape({\n          type: 'bpmn:IntermediateThrowEvent',\n          eventDefinitionType: 'bpmn:MessageEventDefinition'\n        });\n\n        // then\n        var intermediateThrowEventBo = getBusinessObject(intermediateThrowEvent),\n            eventDefinitions = intermediateThrowEventBo.eventDefinitions,\n            messageEventDefinition = eventDefinitions[ 0 ];\n\n        expect(messageEventDefinition.id).to.exist;\n      }));\n\n\n      it('should NOT create formal expression with ID', inject(function(elementFactory) {\n\n        // when\n        var intermediateCatchEvent = elementFactory.createShape({\n          type: 'bpmn:IntermediateCatchEvent',\n          eventDefinitionType: 'bpmn:ConditionalEventDefinition'\n        });\n\n        // then\n        var intermediateThrowEventBo = getBusinessObject(intermediateCatchEvent),\n            eventDefinitions = intermediateThrowEventBo.eventDefinitions,\n            conditionalEventDefinition = eventDefinitions[ 0 ];\n\n        expect(conditionalEventDefinition.condition.id).not.to.exist;\n      }));\n\n    });\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/IdClaim.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_2\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/IdClaimSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - id claim management', function() {\n\n  var testModules = [ coreModule, modelingModule ];\n\n  var processDiagramXML = require('./IdClaim.bpmn');\n\n  beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n  var element, moddleElement, id;\n\n  beforeEach(inject(function(elementRegistry, moddle) {\n    id = 'StartEvent_2';\n    element = elementRegistry.get(id);\n    moddleElement = element.businessObject;\n  }));\n\n\n  describe('unclaim', function() {\n\n    it('should unclaim id when removing element', inject(function(modeling, moddle) {\n\n      // when\n      modeling.removeElements([ element ]);\n\n      // then\n      expect(moddle.ids.assigned(id)).to.be.false;\n    }));\n\n\n    it('should revert unclaim action on restoring element', inject(function(modeling, moddle, commandStack) {\n\n      // given\n      modeling.removeElements([ element ]);\n\n      // when\n      commandStack.undo();\n\n      // then\n      expect(moddle.ids.assigned(id)).to.eql(moddleElement);\n    }));\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/LabelBoundsSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport Modeler from 'lib/Modeler';\n\nimport TestContainer from 'mocha-test-container-support';\n\nvar DELTA = 2;\n\n\ndescribe('label bounds', function() {\n\n  function createModeler(xml) {\n    var modeler = new Modeler({ container: container });\n\n    return modeler.importXML(xml).then(function(result) {\n      return { error: null, warnings: result.warnings, modeler: modeler };\n    }).catch(function(err) {\n      return { error: err, warnings: err.warnings, modeler: modeler };\n    });\n  }\n\n  var container;\n\n  beforeEach(function() {\n    container = TestContainer.get(this);\n  });\n\n  describe('on import', function() {\n\n    it('should import simple label process', function() {\n      var xml = require('./LabelBoundsSpec.simple.bpmn');\n      return createModeler(xml).then(function(result) {\n\n        expect(result.error).not.to.exist;\n      });\n    });\n\n  });\n\n\n  describe('on label change', function() {\n\n    var diagramXML = require('./LabelBoundsSpec.simple.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML));\n\n    var updateLabel;\n\n    beforeEach(inject(function(directEditing) {\n\n      updateLabel = function(shape, text) {\n        directEditing.activate(shape);\n        directEditing._textbox.content.innerText = text;\n        directEditing.complete();\n      };\n\n    }));\n\n    describe('label dimensions', function() {\n\n      it('should expand width', inject(function(elementRegistry) {\n\n        // given\n        var shape = elementRegistry.get('StartEvent_1'),\n            oldLabelWidth = shape.label.width;\n\n        // when\n        updateLabel(shape, 'Foooooooooobar');\n\n        // then\n        expect(shape.label.width).to.be.above(oldLabelWidth);\n      }));\n\n\n      it('should expand height', inject(function(elementRegistry) {\n\n        // given\n        var shape = elementRegistry.get('StartEvent_1'),\n            oldLabelHeight = shape.label.height;\n\n        // when\n        updateLabel(shape, 'Foo\\nbar\\nbaz');\n\n        // then\n        expect(shape.label.height).to.be.above(oldLabelHeight);\n      }));\n\n\n      it('should reduce width', inject(function(elementRegistry) {\n\n        // given\n        var shape = elementRegistry.get('StartEvent_1'),\n            oldLabelWidth = shape.label.width;\n\n        // when\n        updateLabel(shape, 'i');\n\n        // then\n        expect(shape.label.width).to.be.below(oldLabelWidth);\n      }));\n\n\n      it('should reduce height', inject(function(elementRegistry) {\n\n        // given\n        var shape = elementRegistry.get('StartEvent_3'),\n            oldLabelHeight = shape.label.height;\n\n        // when\n        updateLabel(shape, 'One line');\n\n        // then\n        expect(shape.label.height).to.be.below(oldLabelHeight);\n      }));\n\n    });\n\n\n    describe('label position', function() {\n\n      var getExpectedX = function(shape) {\n        return Math.round(shape.x + shape.width / 2 - shape.label.width / 2);\n      };\n\n      it('should shift to left', inject(function(elementRegistry) {\n\n        // given\n        var shape = elementRegistry.get('StartEvent_1');\n\n        // when\n        updateLabel(shape, 'Foooooooooobar');\n\n        // then\n        var expectedX = getExpectedX(shape);\n\n        expect(shape.label.x).to.be.closeTo(expectedX, DELTA);\n      }));\n\n\n      it('should shift to right', inject(function(elementRegistry) {\n\n        // given\n        var shape = elementRegistry.get('StartEvent_1');\n\n        // when\n        updateLabel(shape, 'F');\n\n        // then\n        var expectedX = getExpectedX(shape);\n\n        expect(shape.label.x).to.equal(expectedX);\n      }));\n\n\n      it('should remain the same', inject(function(elementRegistry) {\n\n        // given\n        var shape = elementRegistry.get('StartEvent_1');\n\n        // when\n        updateLabel(shape, 'FOOBAR');\n\n        // copy old horizontal label position\n        var oldX = shape.label.x + 0;\n\n        updateLabel(shape, 'FOOBAR\\n1');\n\n        // then\n        expect(shape.label.x).to.equal(oldX);\n      }));\n\n    });\n\n\n    describe('label outlines', function() {\n\n      it('should update after element bounds have been updated',\n        inject(function(outline, elementRegistry, bpmnRenderer) {\n\n          // given\n          var shape = elementRegistry.get('StartEvent_1');\n\n          var outlineSpy = sinon.spy(outline, 'updateShapeOutline');\n          var rendererSpy = sinon.spy(bpmnRenderer, 'drawShape');\n\n          // when\n          updateLabel(shape, 'Fooooobar');\n\n          // then\n          // expect the outline updating to happen after the renderer\n          // updated the elements bounds dimensions and position\n          sinon.assert.callOrder(\n            rendererSpy.withArgs(sinon.match.any, shape.label),\n            outlineSpy.withArgs(sinon.match.any, shape.label)\n          );\n        })\n\n      );\n\n    });\n\n\n    describe('interaction events', function() {\n\n      it('should update bounds after element bounds have been updated',\n        inject(function(interactionEvents, elementRegistry, bpmnRenderer, graphicsFactory) {\n\n          // given\n          var shape = elementRegistry.get('StartEvent_1');\n\n          var graphicsFactorySpy = sinon.spy(graphicsFactory, 'update'),\n              rendererSpy = sinon.spy(bpmnRenderer, 'drawShape');\n\n          // when\n          updateLabel(shape, 'Fooooobar');\n\n          // then\n          // expect the interaction event bounds updating to happen after the renderer\n          // updated the elements bounds dimensions and position\n          sinon.assert.callOrder(\n            rendererSpy.withArgs(sinon.match.any, shape.label),\n            graphicsFactorySpy\n          );\n        })\n      );\n\n    });\n\n  });\n\n\n  describe('on export', function() {\n\n    it('should create DI when label has changed', function() {\n\n      var xml = require('./LabelBoundsSpec.simple.bpmn');\n\n      var shape;\n\n      return createModeler(xml).then(function(result) {\n\n        var err = result.error;\n        var modeler = result.modeler;\n\n        if (err) {\n          throw err;\n        }\n\n        var elementRegistry = modeler.get('elementRegistry'),\n            directEditing = modeler.get('directEditing');\n\n        shape = elementRegistry.get('StartEvent_1');\n\n        directEditing.activate(shape);\n        directEditing._textbox.content.innerText = 'BARBAZ';\n        directEditing.complete();\n\n        return modeler.saveXML({ format: true });\n      }).then(function(result) {\n\n        var xml = result.xml;\n\n        // strip spaces and line breaks after '>'\n        xml = xml.replace(/>\\s+/g,'>');\n\n        // get label width and height from XML\n        var matches = xml.match(/StartEvent_1_di.*?BPMNLabel.*?width=\"(\\d*).*?height=\"(\\d*)/);\n\n        var width = parseInt(matches[1]),\n            height = parseInt(matches[2]);\n\n        expect(width).to.equal(shape.label.width);\n        expect(height).to.equal(shape.label.height);\n      });\n    });\n\n\n    it('should update existing DI when label has changed', function() {\n\n      var xml = require('./LabelBoundsSpec.simple.bpmn');\n\n      var shape;\n\n      return createModeler(xml).then(function(result) {\n\n        var err = result.error;\n        var modeler = result.modeler;\n\n        if (err) {\n          throw err;\n        }\n\n        var elementRegistry = modeler.get('elementRegistry'),\n            directEditing = modeler.get('directEditing');\n\n        shape = elementRegistry.get('StartEvent_3');\n\n        directEditing.activate(shape);\n        directEditing._textbox.content.innerText = 'BARBAZ';\n        directEditing.complete();\n\n        return modeler.saveXML({ format: true });\n      }).then(function(result) {\n\n        var xml = result.xml;\n\n        // strip spaces and line breaks after '>'\n        xml = xml.replace(/>\\s+/g,'>');\n\n        // get label width and height from XML\n        var matches = xml.match(/StartEvent_3_di.*?BPMNLabel.*?width=\"(\\d*).*?height=\"(\\d*)/);\n\n        var width = parseInt(matches[1]),\n            height = parseInt(matches[2]);\n\n        expect(width).to.equal(shape.label.width);\n        expect(height).to.equal(shape.label.height);\n      });\n    });\n\n\n    it('should not update DI of unchanged labels', function() {\n\n      var xml = require('./LabelBoundsSpec.simple.bpmn');\n\n      // strip windows line breaks (if any)\n      xml = xml.replace(/\\r/g, '');\n\n      return createModeler(xml).then(function(result) {\n\n        var err = result.error;\n        var modeler = result.modeler;\n\n        if (err) {\n          throw err;\n        }\n\n        return modeler.saveXML({ format: true });\n      }).then(function(result) {\n\n        var savedXML = result.xml;\n\n        expect(savedXML).to.equal(xml);\n      });\n    });\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/LabelBoundsSpec.simple.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.3.0-dev\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\" name=\"foo\" />\n    <bpmn:startEvent id=\"StartEvent_2\" name=\"bar\" />\n    <bpmn:startEvent id=\"StartEvent_3\" name=\"foo&#10;bar&#10;baz\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"StartEvent_1_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_2_di\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds x=\"293\" y=\"102\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"303\" y=\"141\" width=\"16\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_3_di\" bpmnElement=\"StartEvent_3\">\n        <dc:Bounds x=\"417\" y=\"102\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"335\" y=\"138\" width=\"200\" height=\"200\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/LabelLayouting.initial.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.14.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\" />\n    <bpmn:exclusiveGateway id=\"ExclusiveGateway_2\" />\n    <bpmn:exclusiveGateway id=\"ExclusiveGateway_1\" />\n    <bpmn:exclusiveGateway id=\"ExclusiveGateway_3\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"304\" y=\"339\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"277\" y=\"375\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_1pe81pr_di\" bpmnElement=\"ExclusiveGateway_2\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"604\" y=\"332\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"584\" y=\"382\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_0risjnj_di\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"297\" y=\"70\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"277\" y=\"120\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_0wbu2t7_di\" bpmnElement=\"ExclusiveGateway_3\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"604\" y=\"70\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"584\" y=\"120\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/LabelLayouting.integration.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:signavio=\"http://www.signavio.com\" id=\"sid-d5a68e61-ca67-438f-971d-6843c39b383e\" targetNamespace=\"http://www.signavio.com/bpmn20\" exporter=\"Camunda Modeler\" exporterVersion=\"4.5.0-rc.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n  <dataStore id=\"sid-1f3b3b35-28a1-4fff-8835-ae271ef486d5\" name=\"HR-Tool\" capacity=\"0\" isUnlimited=\"false\" />\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <startEvent id=\"Event_1\">\n      <outgoing>Flow_1</outgoing>\n    </startEvent>\n    <endEvent id=\"Event_2\">\n      <incoming>Flow_1</incoming>\n    </endEvent>\n    <sequenceFlow id=\"Flow_1\" name=\"foo\" sourceRef=\"Event_1\" targetRef=\"Event_2\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"sid-780f0a66-41b5-4f10-a81d-35e00c8c284d\">\n    <bpmndi:BPMNPlane id=\"sid-1780a274-6bf1-44a0-9a08-01bd7c9ad080\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNEdge id=\"Flow_1r6amrg_di\" bpmnElement=\"Flow_1\">\n        <di:waypoint x=\"118\" y=\"100\" />\n        <di:waypoint x=\"382\" y=\"101.5\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"242\" y=\"83\" width=\"16\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Event_1j8xw70_di\" bpmnElement=\"Event_1\">\n        <omgdc:Bounds x=\"82\" y=\"82\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_080mc73_di\" bpmnElement=\"Event_2\">\n        <omgdc:Bounds x=\"382\" y=\"82.5\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/LabelLayouting.move.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>SequenceFlow_A</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Task_1\" name=\"1\">\n      <bpmn:incoming>SequenceFlow_A</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_B</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_A\" name=\"A\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n    <bpmn:task id=\"Task_3\" name=\"3\">\n      <bpmn:incoming>SequenceFlow_B</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_C</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_D</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_B\" name=\"B\" sourceRef=\"Task_1\" targetRef=\"Task_3\" />\n    <bpmn:task id=\"Task_2\" name=\"2\">\n      <bpmn:incoming>SequenceFlow_C</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_C\" name=\"C\" sourceRef=\"Task_3\" targetRef=\"Task_2\" />\n    <bpmn:task id=\"Task_4\" name=\"4\">\n      <bpmn:incoming>SequenceFlow_D</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_E</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_D\" name=\"D\" sourceRef=\"Task_3\" targetRef=\"Task_4\" />\n    <bpmn:endEvent id=\"EndEvent_1\">\n      <bpmn:incoming>SequenceFlow_E</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_E\" name=\"E\" sourceRef=\"Task_4\" targetRef=\"EndEvent_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"307\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_A_di\" bpmnElement=\"SequenceFlow_A\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"209\" y=\"120\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"307\" y=\"120\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"213\" y=\"95\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_3_di\" bpmnElement=\"Task_3\">\n        <dc:Bounds x=\"504\" y=\"235\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_B_di\" bpmnElement=\"SequenceFlow_B\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"407\" y=\"120\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"455\" y=\"120\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"455\" y=\"275\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"504\" y=\"275\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"425\" y=\"175\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"294\" y=\"260\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_C_di\" bpmnElement=\"SequenceFlow_C\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"554\" y=\"315\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"554\" y=\"385\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"344\" y=\"385\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"344\" y=\"340\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"486\" y=\"392\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_4_di\" bpmnElement=\"Task_4\">\n        <dc:Bounds x=\"717\" y=\"353\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_D_di\" bpmnElement=\"SequenceFlow_D\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"602\" y=\"243\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"716\" y=\"166\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"661\" y=\"393\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"717\" y=\"393\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"626.5\" y=\"201.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EndEvent_0za5rat_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"886\" y=\"175\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"859\" y=\"211\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1ni843l_di\" bpmnElement=\"SequenceFlow_E\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"817\" y=\"393\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"904\" y=\"393\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"904\" y=\"211\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"794\" y=\"372.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/LabelLayoutingSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport bendpointsModule from 'diagram-js/lib/features/bendpoints';\nimport modelingModule from 'lib/features/modeling';\nimport labelEditingModule from 'lib/features/label-editing';\nimport spaceTool from 'diagram-js/lib/features/space-tool';\n\nimport {\n  createCanvasEvent as canvasEvent\n} from '../../../util/MockEvents';\n\nvar testModules = [\n  coreModule,\n  modelingModule,\n  labelEditingModule,\n  bendpointsModule,\n  spaceTool\n];\n\n\ndescribe('modeling - label layouting', function() {\n\n  describe('should position created label', function() {\n\n    var diagramXML = require('./LabelLayouting.initial.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    it('horizontal', inject(function(modeling, elementRegistry) {\n\n      // given\n      var element1 = elementRegistry.get('StartEvent_1'),\n          element2 = elementRegistry.get('ExclusiveGateway_2');\n\n      // when\n      var connection = modeling.connect(element1, element2);\n\n      modeling.updateLabel(connection, 'foo');\n\n      // then\n      expect(connection.label.x).to.be.within(463, 465);\n      expect(connection.label.y).to.be.within(335, 340);\n    }));\n\n\n    it('vertical', inject(function(modeling, elementRegistry) {\n\n      // given\n      var element1 = elementRegistry.get('StartEvent_1'),\n          element2 = elementRegistry.get('ExclusiveGateway_1');\n\n      // when\n      var connection = modeling.connect(element1, element2);\n\n      modeling.updateLabel(connection, 'foo');\n\n      // then\n      expect(connection.label.x).to.be.within(328, 330);\n      expect(connection.label.y).to.be.within(225, 230);\n    }));\n\n  });\n\n\n  describe('should move label', function() {\n\n    var diagramXML = require('./LabelLayouting.move.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n    describe('on segment move', function() {\n\n      it('left - no relayout', inject(function(elementRegistry, connectionSegmentMove, dragging) {\n\n        // given\n        var connection = elementRegistry.get('SequenceFlow_B'),\n            labelPosition = getLabelPosition(connection);\n\n        // when\n        connectionSegmentMove.start(canvasEvent({ x: 0, y: 0 }), connection, 2);\n\n        dragging.move(canvasEvent({ x: -30, y: 0 }));\n\n        dragging.end();\n\n        // then\n        expectLabelMoved(connection, labelPosition, { x: -30, y: 0 });\n      }));\n\n\n      it('left - remove bendpoint', inject(\n        function(elementRegistry, connectionSegmentMove, dragging) {\n\n          // given\n          var connection = elementRegistry.get('SequenceFlow_B'),\n              labelPosition = getLabelPosition(connection);\n\n          // when\n          connectionSegmentMove.start(canvasEvent({ x: 0, y: 0 }), connection, 2);\n\n          dragging.move(canvasEvent({ x: -70, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expectLabelMoved(connection, labelPosition, { x: -70, y: 24 });\n        }\n      ));\n\n\n      it('right - no relayout', inject(\n        function(elementRegistry, connectionSegmentMove, dragging) {\n\n          // given\n          var connection = elementRegistry.get('SequenceFlow_B'),\n              labelPosition = getLabelPosition(connection);\n\n          // when\n          connectionSegmentMove.start(canvasEvent({ x: 0, y: 0 }), connection, 2);\n\n          dragging.move(canvasEvent({ x: 30, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expectLabelMoved(connection, labelPosition, { x: 30, y: 0 });\n        }\n      ));\n\n\n      it('right - remove bendpoint', inject(\n        function(elementRegistry, connectionSegmentMove, dragging) {\n\n          // given\n          var connection = elementRegistry.get('SequenceFlow_B'),\n              labelPosition = getLabelPosition(connection);\n\n          // when\n          connectionSegmentMove.start(canvasEvent({ x: 0, y: 0 }), connection, 2);\n\n          dragging.move(canvasEvent({ x: 70, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expectLabelMoved(connection, labelPosition, { x: 70, y: -16 });\n        }\n      ));\n\n\n      it('down', inject(function(elementRegistry, connectionSegmentMove, dragging) {\n\n        // given\n        var connection = elementRegistry.get('SequenceFlow_C'),\n            labelPosition = getLabelPosition(connection);\n\n        // when\n        connectionSegmentMove.start(canvasEvent({ x: 0, y: 0 }), connection, 2);\n\n        dragging.move(canvasEvent({ x: 0, y: 70 }));\n\n        dragging.end();\n\n        // then\n        expectLabelMoved(connection, labelPosition, { x: 0, y: 70 });\n\n      }));\n\n\n      it('up - remove two bendpoints', inject(\n        function(elementRegistry, connectionSegmentMove, dragging) {\n\n          // given\n          var connection = elementRegistry.get('SequenceFlow_C'),\n              labelPosition = getLabelPosition(connection);\n\n          // when\n          connectionSegmentMove.start(canvasEvent({ x: 0, y: 0 }), connection, 2);\n\n          dragging.move(canvasEvent({ x: 0, y: -90 }));\n\n          dragging.end();\n\n          // then\n          expectLabelMoved(connection, labelPosition, { x: -39, y: -85 });\n\n        }\n      ));\n\n\n      it('up - remove two bendpoints - redundant waypoints', inject(\n        function(elementRegistry, connectionSegmentMove, dragging, bendpointMove) {\n\n          // given\n          var connection = elementRegistry.get('SequenceFlow_C');\n\n          bendpointMove.start(canvasEvent({ x: 0, y: 0 }), connection, 1);\n          dragging.move(canvasEvent({ x: 620, y: 435 }));\n          dragging.end();\n\n          bendpointMove.start(canvasEvent({ x: 0, y: 0 }), connection, 2);\n          dragging.move(canvasEvent({ x: 300, y: 435 }));\n          dragging.end();\n\n          var labelPosition = getLabelPosition(connection);\n\n          // when\n          connectionSegmentMove.start(canvasEvent({ x: 0, y: 0 }), connection, 2);\n          dragging.move(canvasEvent({ x: 0, y: -160 }));\n          dragging.end();\n\n          // then\n          expect(getLabelPosition(connection)).not.to.eql(labelPosition);\n\n        }\n      ));\n\n    });\n\n\n    describe('on reconnect', function() {\n\n      it('start', inject(function(elementRegistry, modeling) {\n\n        // given\n        var connection = elementRegistry.get('SequenceFlow_D'),\n            shape = elementRegistry.get('Task_1');\n\n        // when\n        modeling.reconnectStart(connection, shape, { x: 0, y: 0 });\n\n        // then\n        expect(Math.round(connection.label.x)).to.be.within(570, 575);\n        expect(Math.round(connection.label.y)).to.be.within(136, 138);\n\n      }));\n\n\n      it('end', inject(function(elementRegistry, modeling) {\n\n        // given\n        var connection = elementRegistry.get('SequenceFlow_A'),\n            shape = elementRegistry.get('Task_2');\n\n        // when\n        modeling.reconnectEnd(connection, shape, { x: 294, y: 270 });\n\n        // then\n        expect(Math.round(connection.label.x)).to.be.within(257, 270);\n        expect(Math.round(connection.label.y)).to.be.within(240, 250);\n\n      }));\n\n    });\n\n\n    describe('on shape move', function() {\n\n      it('down', inject(function(elementRegistry, modeling) {\n\n        // given\n        var connection = elementRegistry.get('SequenceFlow_E'),\n            shape = elementRegistry.get('Task_4'),\n            labelPosition = getLabelPosition(connection);\n\n        // when\n        modeling.moveShape(shape, { x: 0, y: 100 });\n\n        // then\n        expectLabelMoved(connection, labelPosition, { x: 0, y: 100 });\n\n      }));\n\n    });\n\n\n    describe('on bendpoint add/delete/moving', function() {\n\n      it('move, label on segment', inject(function(elementRegistry, bendpointMove, dragging) {\n\n        // given\n        var connection = elementRegistry.get('SequenceFlow_B');\n\n        // when\n        bendpointMove.start(canvasEvent({ x: 0, y: 0 }), connection, 1);\n\n        dragging.move(canvasEvent({ x: 455 + 50, y: 120 }));\n\n        dragging.end();\n\n        // then\n        expect(Math.round(connection.label.x)).to.be.within(466, 468);\n        expect(Math.round(connection.label.y)).to.be.within(170, 171);\n\n      }));\n\n\n      it('move, label on bendpoint', inject(\n        function(elementRegistry, bendpointMove, dragging, modeling) {\n\n          // given\n          var connection = elementRegistry.get('SequenceFlow_C');\n\n          // label out of segments, on a bendpoint (idx=1)\n          modeling.moveShape(connection.label, { x: 40, y: 0 });\n\n          // when\n          bendpointMove.start(canvasEvent({ x: 0, y: 0 }), connection, 1);\n\n          dragging.move(canvasEvent({ x: 455 + 50, y: 500 }));\n\n          dragging.end();\n\n          // then\n          expect(Math.round(connection.label.x)).to.be.within(517, 519);\n          expect(Math.round(connection.label.y)).to.be.equal(507);\n\n        }\n      ));\n\n\n      it('remove bendpoint when label on segment', inject(\n        function(elementRegistry, bendpointMove, dragging) {\n\n          // given\n          var connection = elementRegistry.get('SequenceFlow_B');\n\n          // when\n          bendpointMove.start(canvasEvent({ x: 0, y: 0 }), connection, 1);\n\n          dragging.move(canvasEvent({ x: 455, y: 120 + 160 }));\n\n          dragging.end();\n\n          // then\n          expect(Math.round(connection.label.x)).to.be.within(418, 421);\n          expect(Math.round(connection.label.y)).to.be.equal(191);\n\n        }\n      ));\n\n\n      it('add bendpoint, label on right segment', inject(\n        function(elementRegistry, bendpointMove, dragging, canvas) {\n\n          // given\n          var connection = elementRegistry.get('SequenceFlow_A');\n\n          // when\n          bendpointMove.start(canvasEvent({ x: 0, y: 0 }), connection, 1, true);\n\n          dragging.hover({\n            element: connection,\n            gfx: canvas.getGraphics(connection)\n          });\n\n          dragging.move(canvasEvent({ x: 220, y: 200 }));\n\n          dragging.end();\n\n          // then\n          expect(Math.round(connection.label.x)).to.be.within(248, 251);\n          expect(Math.round(connection.label.y)).to.be.within(151, 152);\n\n        }\n      ));\n\n\n      it('add bendpoint, label on left segment', inject(\n        function(elementRegistry, bendpointMove, dragging, canvas) {\n\n          // given\n          var connection = elementRegistry.get('SequenceFlow_A');\n\n          // when\n          bendpointMove.start(canvasEvent({ x: 0, y: 0 }), connection, 1, true);\n\n          dragging.hover({\n            element: connection,\n            gfx: canvas.getGraphics(connection)\n          });\n\n          dragging.move(canvasEvent({ x: 260, y: 200 }));\n\n          dragging.end();\n\n          // then\n          expect(connection.label.x).to.be.within(240, 242);\n          expect(connection.label.y).to.be.within(148, 149);\n\n        }\n      ));\n\n\n      it('remove bendpoint when label on bendpoint', inject(\n        function(elementRegistry, bendpointMove, dragging, modeling) {\n\n          // given\n          var connection = elementRegistry.get('SequenceFlow_C');\n\n          // label out of segments, on a bendpoint\n          modeling.moveShape(connection.label, { x: 40, y: 0 });\n\n          // when\n          bendpointMove.start(canvasEvent({ x: 0, y: 0 }), connection, 1);\n\n          dragging.move(canvasEvent({ x: 455, y: 320 }));\n\n          dragging.end();\n\n          // then\n          expect(Math.round(connection.label.x)).to.be.within(462, 465);\n          expect(Math.round(connection.label.y)).to.be.within(290, 293);\n\n        }\n      ));\n\n\n      it('add benpoint, label on segment, should not move', inject(\n        function(elementRegistry, bendpointMove, canvas, dragging, modeling) {\n\n          // given\n          var connection = elementRegistry.get('SequenceFlow_C');\n\n          // label out of segments, on a bendpoint\n          modeling.moveShape(connection.label, { x: 40, y: -60 });\n          var position = getLabelPosition(connection);\n\n          // when\n          bendpointMove.start(canvasEvent({ x: 0, y: 0 }), connection, 2, true);\n\n          dragging.hover({\n            element: connection,\n            gfx: canvas.getGraphics(connection)\n          });\n\n          dragging.move(canvasEvent({ x: 400, y: 350 }));\n\n          dragging.end();\n\n          // then\n          expectLabelMoved(connection, position, { x: 0, y: 0 });\n\n        }\n      ));\n\n    });\n\n\n    describe('special cases', function() {\n\n      it('should behave properly, right after importing', inject(\n        function(elementRegistry, connectionSegmentMove, dragging, modeling) {\n\n          // given\n          var connection = elementRegistry.get('SequenceFlow_C'),\n              labelPosition = getLabelPosition(connection),\n              label = connection.label;\n\n          // when\n          connectionSegmentMove.start(canvasEvent({ x: 0, y: 0 }), connection, 2);\n\n          dragging.move(canvasEvent({ x: 0, y: 70 }));\n\n          dragging.end();\n\n          // move label\n          modeling.moveShape(label, { x: 40, y: -30 });\n\n          // drag again\n          connectionSegmentMove.start(canvasEvent({ x: 0, y: 0 }), connection, 1);\n\n          dragging.move(canvasEvent({ x: -20, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expectLabelMoved(connection, labelPosition, { x: 20, y: 40 });\n\n        }\n      ));\n\n\n      it('should reposition on right segment', inject(\n        function(elementRegistry, connectionSegmentMove, dragging) {\n\n          // given\n          var connection = elementRegistry.get('SequenceFlow_E'),\n              labelPosition = getLabelPosition(connection);\n\n          // when\n          connectionSegmentMove.start(canvasEvent({ x: 0, y: 0 }), connection, 2);\n\n          dragging.move(canvasEvent({ x: -100, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expect(connection.label.y - labelPosition.y).to.be.within(-77, -73);\n          expect(connection.label.x - labelPosition.x).to.be.within(-54, -51);\n\n        }\n      ));\n\n    });\n\n  });\n\n\n  describe('integration', function() {\n\n    describe('space tool', function() {\n\n      var diagramXML = require('./LabelLayouting.integration.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, {\n        modules: testModules\n      }));\n\n      beforeEach(inject(function(dragging) {\n        dragging.setOptions({ manual: true });\n      }));\n\n\n      it('should not throw on waypoints including float', inject(function(spaceTool, dragging) {\n\n        // given\n        // when\n        // then\n        expect(function() {\n          spaceTool.activateMakeSpace(canvasEvent({ x: 200, y: 0 }));\n\n          dragging.move(canvasEvent({ x: 300, y: 0 }));\n          dragging.end();\n        }).not.to.throw();\n      }));\n\n    });\n\n  });\n\n});\n\n\n\nfunction getLabelPosition(connection) {\n\n  var label = connection.label;\n\n  var mid = {\n    x: label.x + (label.width / 2),\n    y: label.y + (label.height / 2)\n  };\n\n  return mid;\n}\n\n\nfunction expectLabelMoved(connection, oldPosition, expectedDelta) {\n\n  var newPosition = getLabelPosition(connection);\n\n  var delta = {\n    x: Math.round(newPosition.x - oldPosition.x),\n    y: Math.round(newPosition.y - oldPosition.y)\n  };\n\n  expect(delta).to.eql(expectedDelta);\n}\n"
  },
  {
    "path": "test/spec/features/modeling/LoggingCroppingConnectionDocking.js",
    "content": "import CroppingConnectionDocking from 'diagram-js/lib/layout/CroppingConnectionDocking';\n\nimport {\n  getOrientation\n} from 'diagram-js/lib/layout/LayoutUtil';\n\nimport inherits from 'inherits-browser';\n\n\nexport default function LoggingCroppingConnectionDocking(injector) {\n  injector.invoke(CroppingConnectionDocking, this);\n}\n\nLoggingCroppingConnectionDocking.$inject = [\n  'injector'\n];\n\ninherits(LoggingCroppingConnectionDocking, CroppingConnectionDocking);\n\nwindow.noIntersectCount = 0;\n\nwindow.noIntersect = [];\n\nLoggingCroppingConnectionDocking.prototype._getIntersection = function(shape, connection, takeFirst) {\n\n  var intersection = CroppingConnectionDocking.prototype._getIntersection.call(this, shape, connection, takeFirst);\n\n  if (!intersection) {\n\n    if (getOrientation(connection.source, connection.target) !== 'intersect') {\n      window.noIntersectCount++;\n\n      window.noIntersect.push([\n        connection,\n        this._getShapePath(shape),\n        this._getConnectionPath(connection)\n      ]);\n    }\n  }\n\n  return intersection;\n};"
  },
  {
    "path": "test/spec/features/modeling/MoveConnectionSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\nimport { getDi } from 'lib/util/ModelUtil';\n\n\ndescribe('features/modeling - move connection', function() {\n\n  describe('should move connection', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/sequence-flows.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: [\n        coreModule,\n        modelingModule\n      ]\n    }));\n\n\n    it('execute', inject(function(elementRegistry, modeling, bpmnFactory) {\n\n      // given\n      var sequenceFlowConnection = elementRegistry.get('SequenceFlow_1'),\n          sequenceFlowDi = getDi(sequenceFlowConnection);\n\n      // when\n      modeling.moveConnection(sequenceFlowConnection, { x: 20, y: 10 });\n\n      var expectedWaypoints = [\n        { x: 598, y: 351 },\n        { x: 954, y: 351 },\n        { x: 954, y: 446 },\n        { x: 852, y: 446 }\n      ];\n\n      // then\n\n      // expect cropped connection\n      expect(sequenceFlowConnection).to.have.waypoints(expectedWaypoints);\n\n      // expect cropped waypoints in di\n      var diWaypoints = bpmnFactory.createDiWaypoints(expectedWaypoints);\n\n      expect(sequenceFlowDi.waypoint).eql(diWaypoints);\n    }));\n\n\n    it('undo', inject(function(elementRegistry, commandStack, modeling) {\n\n      // given\n      var sequenceFlowConnection = elementRegistry.get('SequenceFlow_1'),\n          sequenceFlowDi = getDi(sequenceFlowConnection);\n\n      var oldWaypoints = sequenceFlowConnection.waypoints,\n          oldDiWaypoints = sequenceFlowDi.waypoint;\n\n      modeling.moveConnection(sequenceFlowConnection, { x: 20, y: 10 });\n\n      // when\n      commandStack.undo();\n\n      // then\n      expect(sequenceFlowConnection.waypoints).eql(oldWaypoints);\n      expect(sequenceFlowDi.waypoint).eql(oldDiWaypoints);\n    }));\n\n\n    it('redo', inject(function(elementRegistry, commandStack, modeling) {\n\n      // given\n      var sequenceFlowConnection = elementRegistry.get('SequenceFlow_1'),\n          sequenceFlowDi = getDi(sequenceFlowConnection);\n\n      modeling.moveConnection(sequenceFlowConnection, { x: 20, y: 10 });\n\n      var newWaypoints = sequenceFlowConnection.waypoints,\n          newDiWaypoints = sequenceFlowDi.waypoint;\n\n      // when\n      commandStack.undo();\n      commandStack.redo();\n\n      // then\n      expect(sequenceFlowConnection.waypoints).eql(newWaypoints);\n      expect(sequenceFlowDi.waypoint).eql(newDiWaypoints);\n    }));\n\n  });\n});\n"
  },
  {
    "path": "test/spec/features/modeling/MoveElements.boundary-connection.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_1\">\n      <bpmn:outgoing>Task_Flow</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"Task_2\">\n      <bpmn:incoming>Task_Flow</bpmn:incoming>\n      <bpmn:incoming>Boundary_Flow</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"Task_Flow\" sourceRef=\"Task_1\" targetRef=\"Task_2\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent\" attachedToRef=\"Task_1\">\n      <bpmn:outgoing>Boundary_Flow</bpmn:outgoing>\n    </bpmn:boundaryEvent>\n    <bpmn:sequenceFlow id=\"Boundary_Flow\" sourceRef=\"BoundaryEvent\" targetRef=\"Task_2\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"324\" y=\"219\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"590\" y=\"219\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Task_Flow_di\" bpmnElement=\"Task_Flow\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"424\" y=\"259\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"590\" y=\"259\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"462\" y=\"249\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_di\" bpmnElement=\"BoundaryEvent\">\n        <dc:Bounds x=\"363\" y=\"281\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"336\" y=\"317\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Boundary_Flow_di\" bpmnElement=\"Boundary_Flow\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"381\" y=\"317\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"381\" y=\"456\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"640\" y=\"456\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"640\" y=\"299\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"451\" y=\"319\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>"
  },
  {
    "path": "test/spec/features/modeling/MoveElements.centered-connection.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_1\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"Task_2\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"Task_1\" targetRef=\"Task_2\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"150\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"300\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"250\" y=\"120\" />\n        <di:waypoint x=\"300\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/MoveElements.collaboration-association.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:camunda=\"http://camunda.org/schema/1.0/bpmn\" xmlns:signavio=\"http://www.signavio.com\" id=\"sid-0b0aaa25-3baf-4875-9d7a-0907d599a9ef\" targetNamespace=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"6.1.1\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <dataStore id=\"FinancialAccountingSystem\" name=\"Financial Accounting System\" isUnlimited=\"false\">\n    <dataState id=\"DataState_1\" />\n  </dataStore>\n  <message id=\"foxMessage_en\" name=\"foxMessage_en\" />\n  <collaboration id=\"collaboration_3\">\n    <participant id=\"Process_Engine_1\" name=\"Invoice Receipt\" processRef=\"invoice\" />\n  </collaboration>\n  <process id=\"invoice\" name=\"Invoice Receipt\" isExecutable=\"true\" camunda:versionTag=\"V1.0\" camunda:historyTimeToLive=\"30\">\n    <laneSet id=\"laneSet_5\">\n      <lane id=\"Accountant\" name=\"Accountant\">\n        <flowNodeRef>prepareBankTransfer</flowNodeRef>\n      </lane>\n      <lane id=\"teamAssistant\" name=\"Team Assistant\" />\n      <lane id=\"Approver\" name=\"Approver\" />\n    </laneSet>\n    <dataStoreReference id=\"DataStoreReference_1\" name=\"Financial Accounting System\" dataStoreRef=\"FinancialAccountingSystem\" />\n    <userTask id=\"prepareBankTransfer\" name=\"Prepare&#10;Bank&#10;Transfer\" camunda:formKey=\"embedded:app:forms/prepare-bank-transfer.html\" camunda:candidateGroups=\"accounting\" camunda:dueDate=\"${dateTime().plusWeeks(1).toDate()}\">\n      <documentation>Prepare the bank transfer.</documentation>\n    </userTask>\n    <association id=\"Association_1\" sourceRef=\"DataStoreReference_1\" targetRef=\"prepareBankTransfer\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_73\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_73\" bpmnElement=\"collaboration_3\">\n      <bpmndi:BPMNShape id=\"Process_Engine_1_gui\" bpmnElement=\"Process_Engine_1\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"160\" y=\"80\" width=\"1118\" height=\"496\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Freigebender_105_gui\" bpmnElement=\"Approver\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"190\" y=\"272\" width=\"1088\" height=\"161\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Team-Assistenz_110_gui\" bpmnElement=\"teamAssistant\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"190\" y=\"80\" width=\"1088\" height=\"193\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Buchhaltung_119_gui\" bpmnElement=\"Accountant\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"190\" y=\"432\" width=\"1088\" height=\"144\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"zberweisung_vorbereiten_169_gui\" bpmnElement=\"prepareBankTransfer\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"907\" y=\"473\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_1_gui\" bpmnElement=\"DataStoreReference_1\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"804\" y=\"606\" width=\"63\" height=\"61\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"808\" y=\"672\" width=\"54\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_1_gui\" bpmnElement=\"Association_1\" sourceElement=\"DataStoreReference_1_gui\" targetElement=\"zberweisung_vorbereiten_169_gui\">\n        <omgdi:waypoint x=\"835\" y=\"606\" />\n        <omgdi:waypoint x=\"905\" y=\"543\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/MoveElements.data-input-output.bpmn",
    "content": "<semantic:definitions xmlns:semantic=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:color=\"http://www.omg.org/spec/BPMN/non-normative/color/1.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"_af3cbf6a-9c69-460b-9a1d-276711d30213\" targetNamespace=\"http://www.trisotech.com/definitions/_af3cbf6a-9c69-460b-9a1d-276711d30213\" expressionLanguage=\"http://www.w3.org/1999/XPath\" exporter=\"BPMN Modeler\" exporterVersion=\"6.1.22\" name=\"Travel Booking with Event Subprocess\">\n    <semantic:process id=\"_898aa942-9a96-4405-ae71-22b5e2e3d235\" name=\"Simple Travel Booking\" isClosed=\"false\">\n        <semantic:ioSpecification>\n            <semantic:dataInput name=\"Input\" isCollection=\"false\" id=\"DataInput\"/>\n            <semantic:dataOutput name=\"Output\" isCollection=\"false\" id=\"DataOutput\"/>\n            <semantic:inputSet id=\"_9f9aea93-30cd-4899-bbe1-e62165c3dbc9\">\n                <semantic:dataInputRefs>DataInput</semantic:dataInputRefs>\n            </semantic:inputSet>\n            <semantic:outputSet id=\"_8154d47e-5733-41c1-8125-29ff926b3cd2\">\n                <semantic:dataOutputRefs>DataOutput</semantic:dataOutputRefs>\n            </semantic:outputSet>\n        </semantic:ioSpecification>\n        <semantic:sendTask id=\"Task\" name=\"Process Data\" implementation=\"##WebService\">\n            <semantic:ioSpecification>\n                <semantic:dataInput id=\"_9628422b-85a6-4857-8c14-7289b9fd9a8a\"/>\n                <semantic:dataOutput id=\"_29b8c649-e2a0-4dd3-804b-567e8cc71718\"/>\n                <semantic:inputSet id=\"_1957232b-478c-49d4-b3a7-86da323a1629\">\n                    <semantic:dataInputRefs>_9628422b-85a6-4857-8c14-7289b9fd9a8a</semantic:dataInputRefs>\n                </semantic:inputSet>\n                <semantic:outputSet id=\"_eb462f09-2a8c-43fb-b398-09da73357dde\">\n                    <semantic:dataOutputRefs>_29b8c649-e2a0-4dd3-804b-567e8cc71718</semantic:dataOutputRefs>\n                </semantic:outputSet>\n            </semantic:ioSpecification>\n            <semantic:dataInputAssociation id=\"_82006a49-2cc8-4814-83e2-28c5a85a4c4a\">\n                <semantic:sourceRef>DataInput</semantic:sourceRef>\n                <semantic:targetRef>_9628422b-85a6-4857-8c14-7289b9fd9a8a</semantic:targetRef>\n            </semantic:dataInputAssociation>\n            <semantic:dataOutputAssociation id=\"_ef945053-2c76-4796-8d8b-afc6be8bbfec\">\n                <semantic:sourceRef>_29b8c649-e2a0-4dd3-804b-567e8cc71718</semantic:sourceRef>\n                <semantic:targetRef>DataOutput</semantic:targetRef>\n            </semantic:dataOutputAssociation>\n        </semantic:sendTask>\n    </semantic:process>\n    <bpmndi:BPMNDiagram id=\"_f1aecfc3-a3da-4bde-bece-87786e25273d\" name=\"Simple Travel Booking\">\n        <bpmndi:BPMNPlane bpmnElement=\"_898aa942-9a96-4405-ae71-22b5e2e3d235\" id=\"_f1aecfc3-a3da-4bde-bece-87786e25273d_plane\">\n            <bpmndi:BPMNShape id=\"DataOutput_di\" bpmnElement=\"DataOutput\">\n                <dc:Bounds x=\"285\" y=\"150\" width=\"34\" height=\"40\"/>\n                <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n                    <dc:Bounds height=\"12\" width=\"30\" x=\"285\" y=\"195\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape id=\"DataInput_di\" bpmnElement=\"DataInput\">\n                <dc:Bounds x=\"100\" y=\"100\" width=\"34\" height=\"40\"/>\n                <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n                    <dc:Bounds height=\"12\" width=\"30\" x=\"100\" y=\"150\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape id=\"_8eb52f6a-0fd6-4fad-8ade-14bca1b066bf\" bpmnElement=\"Task\">\n                <dc:Bounds x=\"167\" y=\"200\" width=\"96\" height=\"76\"/>\n                <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n                    <dc:Bounds height=\"26\" width=\"89\" x=\"170.5\" y=\"261.9739767206677\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNEdge id=\"_fa1439cb-56e1-4399-bfe8-638b37a16866\" bpmnElement=\"_82006a49-2cc8-4814-83e2-28c5a85a4c4a\" targetElement=\"_8eb52f6a-0fd6-4fad-8ade-14bca1b066bf\">\n                <di:waypoint x=\"135\" y=\"113.99809778522484\"/>\n                <di:waypoint x=\"215\" y=\"113.99809778522484\"/>\n                <di:waypoint x=\"215\" y=\"200\"/>\n                <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\"/>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNEdge id=\"_9f83d262-8e6a-47f5-84b3-86f560fbfcec\" bpmnElement=\"_ef945053-2c76-4796-8d8b-afc6be8bbfec\" sourceElement=\"Task\">\n                <di:waypoint x=\"230\" y=\"200\"/>\n                <di:waypoint x=\"230\" y=\"170\"/>\n                <di:waypoint x=\"285\" y=\"170\"/>\n                <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\"/>\n            </bpmndi:BPMNEdge>\n        </bpmndi:BPMNPlane>\n        <bpmndi:BPMNLabelStyle id=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_0\">\n            <dc:Font name=\"Arial\" size=\"11\" isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\"/>\n        </bpmndi:BPMNLabelStyle>\n        <bpmndi:BPMNLabelStyle id=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n            <dc:Font name=\"arial,helvetica,sans-serif\" size=\"11\" isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\"/>\n        </bpmndi:BPMNLabelStyle>\n    </bpmndi:BPMNDiagram>\n</semantic:definitions>"
  },
  {
    "path": "test/spec/features/modeling/MoveElements.eventBasedTargets.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.1.0-dev\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:receiveTask id=\"ReceiveTask\">\n      <bpmn:incoming>SequenceFlow_A</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_05bjkc2</bpmn:outgoing>\n    </bpmn:receiveTask>\n    <bpmn:intermediateCatchEvent id=\"IntermediateCatchEvent_Message\">\n      <bpmn:incoming>SequenceFlow_B</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_1l6c300</bpmn:outgoing>\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_1xz8330\" />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:intermediateCatchEvent id=\"IntermediateCatchEvent_Timer\">\n      <bpmn:incoming>SequenceFlow_C</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_0ku3hwq</bpmn:outgoing>\n      <bpmn:timerEventDefinition id=\"TimerEventDefinition_0h6dedo\" />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:intermediateCatchEvent id=\"IntermediateCatchEvent_Conditional\">\n      <bpmn:incoming>SequenceFlow_D</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_0yjtrc2</bpmn:outgoing>\n      <bpmn:conditionalEventDefinition id=\"ConditionalEventDefinition_1eyek11\">\n        <bpmn:condition xsi:type=\"bpmn:tFormalExpression\" />\n      </bpmn:conditionalEventDefinition>\n    </bpmn:intermediateCatchEvent>\n    <bpmn:intermediateCatchEvent id=\"IntermediateCatchEvent_Signal\">\n      <bpmn:incoming>SequenceFlow_E</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_12xris6</bpmn:outgoing>\n      <bpmn:signalEventDefinition id=\"SignalEventDefinition_0bmjdpv\" />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:endEvent id=\"EndEvent_1gytbom\">\n      <bpmn:incoming>SequenceFlow_05bjkc2</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:endEvent id=\"EndEvent_1s10cm7\">\n      <bpmn:incoming>SequenceFlow_1l6c300</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:endEvent id=\"EndEvent_1cjf8ky\">\n      <bpmn:incoming>SequenceFlow_0ku3hwq</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:endEvent id=\"EndEvent_0t9wzor\">\n      <bpmn:incoming>SequenceFlow_0yjtrc2</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:endEvent id=\"EndEvent_0k4zebg\">\n      <bpmn:incoming>SequenceFlow_12xris6</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:task id=\"Task_A\">\n      <bpmn:outgoing>SequenceFlow_A</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"Task_B\">\n      <bpmn:outgoing>SequenceFlow_B</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"Task_C\">\n      <bpmn:outgoing>SequenceFlow_C</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"Task_D\">\n      <bpmn:outgoing>SequenceFlow_D</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"Task_E\">\n      <bpmn:outgoing>SequenceFlow_E</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_05bjkc2\" sourceRef=\"ReceiveTask\" targetRef=\"EndEvent_1gytbom\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_1l6c300\" sourceRef=\"IntermediateCatchEvent_Message\" targetRef=\"EndEvent_1s10cm7\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_0ku3hwq\" sourceRef=\"IntermediateCatchEvent_Timer\" targetRef=\"EndEvent_1cjf8ky\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_0yjtrc2\" sourceRef=\"IntermediateCatchEvent_Conditional\" targetRef=\"EndEvent_0t9wzor\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_12xris6\" sourceRef=\"IntermediateCatchEvent_Signal\" targetRef=\"EndEvent_0k4zebg\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_A\" sourceRef=\"Task_A\" targetRef=\"ReceiveTask\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_B\" sourceRef=\"Task_B\" targetRef=\"IntermediateCatchEvent_Message\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_C\" sourceRef=\"Task_C\" targetRef=\"IntermediateCatchEvent_Timer\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_D\" sourceRef=\"Task_D\" targetRef=\"IntermediateCatchEvent_Conditional\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_E\" sourceRef=\"Task_E\" targetRef=\"IntermediateCatchEvent_Signal\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"ReceiveTask_1v6bvh5_di\" bpmnElement=\"ReceiveTask\">\n        <dc:Bounds x=\"336\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_0xrbhjg_di\" bpmnElement=\"IntermediateCatchEvent_Message\">\n        <dc:Bounds x=\"368\" y=\"213\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_1wndrxs_di\" bpmnElement=\"IntermediateCatchEvent_Timer\">\n        <dc:Bounds x=\"368\" y=\"313\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_0k2sk19_di\" bpmnElement=\"IntermediateCatchEvent_Conditional\">\n        <dc:Bounds x=\"368\" y=\"423\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_1ihnoj3_di\" bpmnElement=\"IntermediateCatchEvent_Signal\">\n        <dc:Bounds x=\"368\" y=\"533\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_1gytbom_di\" bpmnElement=\"EndEvent_1gytbom\">\n        <dc:Bounds x=\"486\" y=\"103\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_1s10cm7_di\" bpmnElement=\"EndEvent_1s10cm7\">\n        <dc:Bounds x=\"486\" y=\"213\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_1cjf8ky_di\" bpmnElement=\"EndEvent_1cjf8ky\">\n        <dc:Bounds x=\"486\" y=\"313\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_0t9wzor_di\" bpmnElement=\"EndEvent_0t9wzor\">\n        <dc:Bounds x=\"486\" y=\"423\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_0k4zebg_di\" bpmnElement=\"EndEvent_0k4zebg\">\n        <dc:Bounds x=\"486\" y=\"533\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1831vfx_di\" bpmnElement=\"Task_A\">\n        <dc:Bounds x=\"156\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0zhy9co_di\" bpmnElement=\"Task_B\">\n        <dc:Bounds x=\"156\" y=\"191\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1i41gxo_di\" bpmnElement=\"Task_C\">\n        <dc:Bounds x=\"156\" y=\"291\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1qthskw_di\" bpmnElement=\"Task_D\">\n        <dc:Bounds x=\"156\" y=\"401\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1f0jmew_di\" bpmnElement=\"Task_E\">\n        <dc:Bounds x=\"156\" y=\"511\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_05bjkc2_di\" bpmnElement=\"SequenceFlow_05bjkc2\">\n        <di:waypoint x=\"436\" y=\"121\" />\n        <di:waypoint x=\"486\" y=\"121\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1l6c300_di\" bpmnElement=\"SequenceFlow_1l6c300\">\n        <di:waypoint x=\"404\" y=\"231\" />\n        <di:waypoint x=\"486\" y=\"231\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0ku3hwq_di\" bpmnElement=\"SequenceFlow_0ku3hwq\">\n        <di:waypoint x=\"404\" y=\"331\" />\n        <di:waypoint x=\"486\" y=\"331\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0yjtrc2_di\" bpmnElement=\"SequenceFlow_0yjtrc2\">\n        <di:waypoint x=\"404\" y=\"441\" />\n        <di:waypoint x=\"486\" y=\"441\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_12xris6_di\" bpmnElement=\"SequenceFlow_12xris6\">\n        <di:waypoint x=\"404\" y=\"551\" />\n        <di:waypoint x=\"486\" y=\"551\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1nqkc2f_di\" bpmnElement=\"SequenceFlow_A\">\n        <di:waypoint x=\"256\" y=\"121\" />\n        <di:waypoint x=\"336\" y=\"121\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_13d84ey_di\" bpmnElement=\"SequenceFlow_B\">\n        <di:waypoint x=\"256\" y=\"231\" />\n        <di:waypoint x=\"368\" y=\"231\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_17wwzat_di\" bpmnElement=\"SequenceFlow_C\">\n        <di:waypoint x=\"256\" y=\"331\" />\n        <di:waypoint x=\"368\" y=\"331\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1r2eh3g_di\" bpmnElement=\"SequenceFlow_D\">\n        <di:waypoint x=\"256\" y=\"441\" />\n        <di:waypoint x=\"368\" y=\"441\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_197dyvg_di\" bpmnElement=\"SequenceFlow_E\">\n        <di:waypoint x=\"256\" y=\"551\" />\n        <di:waypoint x=\"368\" y=\"551\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/MoveElements.flow-collaboration.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:collaboration id=\"Collaboration\">\n    <bpmn:participant id=\"Pool_A\" name=\"Pool A\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Pool_B\" name=\"Pool B\" processRef=\"Process_2\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:sequenceFlow id=\"SequenceFlow\" sourceRef=\"Task_B\" targetRef=\"Task_A\" />\n    <bpmn:task id=\"Task_A\" name=\"Task A\">\n      <bpmn:incoming>SequenceFlow</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:task id=\"Task_B\" name=\"Task_B\">\n      <bpmn:outgoing>SequenceFlow</bpmn:outgoing>\n    </bpmn:task>\n  </bpmn:process>\n  <bpmn:process id=\"Process_2\">\n    <bpmn:task id=\"Task_C\" name=\"Task C\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"Pool_A_di\" bpmnElement=\"Pool_A\">\n        <dc:Bounds x=\"193\" y=\"76\" width=\"536\" height=\"173\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_B_di\" bpmnElement=\"Task_B\">\n        <dc:Bounds x=\"353\" y=\"117\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_A_di\" bpmnElement=\"Task_A\">\n        <dc:Bounds x=\"537\" y=\"117\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_di\" bpmnElement=\"SequenceFlow\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"453\" y=\"157\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"537\" y=\"157\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"450\" y=\"132\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Pool_B_di\" bpmnElement=\"Pool_B\">\n        <dc:Bounds x=\"193\" y=\"311\" width=\"534\" height=\"178\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_C_di\" bpmnElement=\"Task_C\">\n        <dc:Bounds x=\"341\" y=\"365\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/MoveElementsSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - move elements', function() {\n\n  describe('flow parent', function() {\n\n    var diagramXML = require('./MoveElements.flow-collaboration.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: [\n        coreModule,\n        modelingModule\n      ]\n    }));\n\n\n    it('should keep when moving shapes', inject(function(elementRegistry, modeling, bpmnFactory) {\n\n      // given\n      var connectionSequenceFlow = elementRegistry.get('SequenceFlow'),\n          shapeTask_A = elementRegistry.get('Task_A'),\n          shapeTask_B = elementRegistry.get('Task_B'),\n          shapeTask_C = elementRegistry.get('Task_C'),\n          shapePool_A = elementRegistry.get('Pool_A'),\n          shapePool_B = elementRegistry.get('Pool_B');\n\n      // when\n      modeling.moveElements(\n        [ shapeTask_A, shapeTask_B, shapeTask_C ],\n        { x: 0, y: -50 },\n        shapePool_B,\n        { primaryShape: shapeTask_C }\n      );\n\n      // then\n      expect(connectionSequenceFlow.parent).to.eql(shapePool_A);\n    }));\n\n\n    it('should keep when moving shapes with flow', inject(function(elementRegistry, modeling, bpmnFactory) {\n\n      // given\n      var connectionSequenceFlow = elementRegistry.get('SequenceFlow'),\n          shapeTask_A = elementRegistry.get('Task_A'),\n          shapeTask_B = elementRegistry.get('Task_B'),\n          shapeTask_C = elementRegistry.get('Task_C'),\n          shapePool_A = elementRegistry.get('Pool_A'),\n          shapePool_B = elementRegistry.get('Pool_B');\n\n      // when\n      modeling.moveElements(\n        [ shapeTask_A, shapeTask_B, shapeTask_C, connectionSequenceFlow ],\n        { x: 0, y: -50 },\n        shapePool_B,\n        { primaryShape: shapeTask_C }\n      );\n\n      // then\n      expect(connectionSequenceFlow.parent).to.eql(shapePool_A);\n    }));\n\n  });\n\n\n  describe('boundary connection with tasks', function() {\n\n    var diagramXML = require('./MoveElements.boundary-connection.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: [\n        coreModule,\n        modelingModule\n      ]\n    }));\n\n\n    it('should properly adjust connection', inject(function(elementRegistry, modeling) {\n\n      // given\n      var elements = [\n        elementRegistry.get('Task_1'),\n        elementRegistry.get('Task_2'),\n        elementRegistry.get('BoundaryEvent')\n      ];\n\n      var boundaryFlow = elementRegistry.get('Boundary_Flow');\n\n      var delta = { x: 0, y: 20 };\n\n      var expectedWaypoints = moveWaypoints(boundaryFlow.waypoints, delta);\n\n      // when\n      modeling.moveElements(elements, delta);\n\n      // then\n      expect(boundaryFlow).to.have.waypoints(expectedWaypoints);\n    }));\n\n  });\n\n\n  describe('data input / data output', function() {\n\n    var diagramXML = require('./MoveElements.data-input-output.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: [\n        coreModule,\n        modelingModule\n      ]\n    }));\n\n\n    it('should move', inject(function(elementRegistry, modeling) {\n\n      // given\n      var dataInput = elementRegistry.get('DataInput');\n      var dataOutput = elementRegistry.get('DataOutput');\n\n      var elements = [\n        dataInput,\n        dataOutput,\n        elementRegistry.get('Task')\n      ];\n\n      // when\n      modeling.moveElements(\n        elements,\n        { x: -10, y: -10 }\n      );\n\n      // then\n      expect(dataOutput).to.have.bounds({\n        x: 275,\n        y: 140,\n        width: 34,\n        height: 40\n      });\n\n      expect(dataInput).to.have.bounds({\n        x: 90,\n        y: 90,\n        width: 34,\n        height: 40\n      });\n    }));\n\n\n    it('should wrap in participant', inject(\n      function(elementRegistry, elementFactory, modeling, canvas) {\n\n        // given\n        var dataInput = elementRegistry.get('DataInput');\n        var dataOutput = elementRegistry.get('DataOutput');\n\n        var processShape = canvas.getRootElement(),\n            processBo = processShape.businessObject,\n            participantShape = elementFactory.createParticipantShape(true);\n\n        // when\n        modeling.createShape(participantShape, { x: 350, y: 200 }, processShape);\n\n        // then\n        expect(dataInput.businessObject.$parent).to.eql(processBo.ioSpecification);\n        expect(dataOutput.businessObject.$parent).to.eql(processBo.ioSpecification);\n      }\n    ));\n\n  });\n\n\n  describe('association', function() {\n\n    var testXML = require('./MoveElements.collaboration-association.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, {\n      modules: [\n        coreModule,\n        modelingModule\n      ]\n    }));\n\n\n    it('move association', inject(function(elementRegistry, modeling) {\n\n      // given\n      var association = elementRegistry.get('Association_1'),\n          participant = elementRegistry.get('Process_Engine_1');\n\n      var elements = [\n        elementRegistry.get('DataStoreReference_1'),\n        association,\n        elementRegistry.get('prepareBankTransfer')\n      ];\n\n      // when\n      modeling.moveElements(elements, { x: 10, y: 10 }, participant);\n\n      // then\n      expect(association.parent).to.exist;\n    }));\n\n  });\n\n\n  describe('incoming sequence flows of event based targets', function() {\n\n    var diagramXML = require('./MoveElements.eventBasedTargets.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: [\n        coreModule,\n        modelingModule\n      ]\n    }));\n\n    it('should keep when moving source flow object', inject(function(elementRegistry, modeling) {\n\n      // given\n      var shapeTask_A = elementRegistry.get('Task_A'),\n          shapeTask_B = elementRegistry.get('Task_B'),\n          shapeTask_C = elementRegistry.get('Task_C'),\n          shapeTask_D = elementRegistry.get('Task_D'),\n          shapeTask_E = elementRegistry.get('Task_E'),\n          connectionSequenceFlow_A = elementRegistry.get('SequenceFlow_A'),\n          connectionSequenceFlow_B = elementRegistry.get('SequenceFlow_B'),\n          connectionSequenceFlow_C = elementRegistry.get('SequenceFlow_C'),\n          connectionSequenceFlow_D = elementRegistry.get('SequenceFlow_D'),\n          connectionSequenceFlow_E = elementRegistry.get('SequenceFlow_E');\n\n      // when\n      modeling.moveElements([\n        shapeTask_A,\n        shapeTask_B,\n        shapeTask_C,\n        shapeTask_D,\n        shapeTask_E\n      ], {\n        x: 0, y: -50\n      });\n\n      // then\n      expect(elementRegistry.get(connectionSequenceFlow_A.id)).to.exist;\n      expect(elementRegistry.get(connectionSequenceFlow_B.id)).to.exist;\n      expect(elementRegistry.get(connectionSequenceFlow_C.id)).to.exist;\n      expect(elementRegistry.get(connectionSequenceFlow_D.id)).to.exist;\n      expect(elementRegistry.get(connectionSequenceFlow_E.id)).to.exist;\n    }));\n  });\n\n\n  describe('center-to-center connection', function() {\n\n    var diagramXML = require('./MoveElements.centered-connection.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: [\n        coreModule,\n        modelingModule\n      ]\n    }));\n\n    it('should properly adjust connection', inject(function(elementRegistry, modeling) {\n\n      // given\n      var targetElement = elementRegistry.get('Task_2');\n\n      var sequenceFlow = elementRegistry.get('SequenceFlow_1');\n\n      // move from centric-left to centric-below\n      var delta = { x: -150, y: 150 };\n\n      var expectedWaypoints = [\n        { x: 200, y: 160 },\n        { x: 200, y: 230 }\n      ];\n\n      // when\n      modeling.moveElements([ targetElement ], delta);\n\n      // then\n      expect(sequenceFlow).to.have.waypoints(expectedWaypoints);\n    }));\n  });\n\n});\n\n\n// helpers //////////////////////\n\nfunction moveWaypoint(p, delta) {\n  return {\n    x: p.x + delta.x || 0,\n    y: p.y + delta.y || 0\n  };\n}\n\nfunction moveWaypoints(waypoints, delta) {\n\n  return waypoints.map(function(p) {\n\n    var original = p.original;\n\n    var moved = moveWaypoint(p, delta);\n\n    if (original) {\n      moved.original = moveWaypoint(original, delta);\n    }\n\n    return moved;\n  });\n}\n"
  },
  {
    "path": "test/spec/features/modeling/MoveRulesSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\nimport moveModule from 'diagram-js/lib/features/move';\nimport snappingModule from 'lib/features/snapping';\n\nimport {\n  createCanvasEvent as canvasEvent\n} from '../../../util/MockEvents';\n\n\ndescribe('features/modeling - move', function() {\n\n  var testModules = [ coreModule, modelingModule, moveModule, snappingModule ];\n\n  var testXML = require('../../../fixtures/bpmn/boundary-events.bpmn');\n\n  beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n  beforeEach(inject(function(dragging, canvas) {\n    dragging.setOptions({ manual: true });\n  }));\n\n  afterEach(inject(function(dragging) {\n    dragging.setOptions({ manual: false });\n  }));\n\n\n  it('should not attach label when moving BoundaryEvent',\n    inject(function(elementRegistry, move, dragging) {\n\n      // given\n      var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n          subProcess = elementRegistry.get('SubProcess_1'),\n          label = boundaryEvent.label;\n\n      // when\n      move.start(canvasEvent({ x: 190, y: 355 }), boundaryEvent);\n\n      dragging.hover({\n        element: subProcess,\n        gfx: elementRegistry.getGraphics(subProcess)\n      });\n\n      dragging.move(canvasEvent({ x: 220, y: 240 }));\n      dragging.end();\n\n      // then\n      expect(subProcess.attachers).not.to.include(label);\n      expect(label.host).not.to.exist;\n    })\n  );\n\n\n  it('should move BoundaryEvent and Label with parent', inject(function(canvas, elementRegistry, move, dragging) {\n\n    // given\n    var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n        subProcess = elementRegistry.get('SubProcess_1'),\n        label = boundaryEvent.label,\n        root = canvas.getRootElement();\n\n    // when\n    move.start(canvasEvent({ x: 190, y: 355 }), subProcess);\n\n    dragging.hover({\n      element: root,\n      gfx: elementRegistry.getGraphics(root)\n    });\n    dragging.move(canvasEvent({ x: 290, y: 455 }));\n    dragging.end();\n\n    // then\n    expect(subProcess.x).to.eql(304);\n    expect(subProcess.y).to.eql(178);\n\n    expect(subProcess.attachers).not.to.include(label);\n    expect(subProcess.attachers).to.include(boundaryEvent);\n\n    expect(boundaryEvent.host).to.eql(subProcess);\n    expect(label.host).not.to.exist;\n  }));\n\n\n  it('should move BoundaryEvent, Label and parent',\n    inject(function(canvas, elementRegistry, move, dragging, selection) {\n\n      // given\n      var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n          subProcess = elementRegistry.get('SubProcess_1'),\n          label = boundaryEvent.label,\n          root = canvas.getRootElement();\n\n      // when\n      selection.select([ boundaryEvent, label, subProcess ]);\n\n      move.start(canvasEvent({ x: 190, y: 355 }), subProcess);\n\n      dragging.hover({\n        element: root,\n        gfx: elementRegistry.getGraphics(root)\n      });\n      dragging.move(canvasEvent({ x: 290, y: 455 }));\n      dragging.end();\n\n      // then\n      expect(subProcess.x).to.eql(304);\n      expect(subProcess.y).to.eql(178);\n\n      expect(subProcess.attachers).not.to.include(label);\n      expect(subProcess.attachers).to.include(boundaryEvent);\n\n      expect(boundaryEvent.host).to.eql(subProcess);\n      expect(label.host).not.to.exist;\n    })\n  );\n\n});"
  },
  {
    "path": "test/spec/features/modeling/MoveShapeSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\nimport { getDi } from 'lib/util/ModelUtil';\n\n\ndescribe('features/modeling - move shape', function() {\n\n  var diagramXML = require('../../../fixtures/bpmn/simple.bpmn');\n\n  var testModules = [ coreModule, modelingModule ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  describe('shape', function() {\n\n    it('should move', inject(function(elementRegistry, modeling, bpmnFactory) {\n\n      // given\n      var startEventElement = elementRegistry.get('StartEvent_1'),\n          startEventDi = getDi(startEventElement);\n\n      var sequenceFlowElement = elementRegistry.get('SequenceFlow_1'),\n          sequenceFlowDi = getDi(sequenceFlowElement);\n\n      var oldPosition = {\n        x: startEventElement.x,\n        y: startEventElement.y\n      };\n\n      // when\n      modeling.moveShape(startEventElement, { x: 0, y: 50 });\n\n      // then\n      expect(startEventDi).to.have.position({\n        x: oldPosition.x,\n        y: oldPosition.y + 50\n      });\n\n      var newWaypoints = sequenceFlowElement.waypoints;\n\n      var expectedDiWaypoints = bpmnFactory.createDiWaypoints(newWaypoints.map(function(p) {\n        return { x: p.x, y: p.y };\n      }));\n\n      // see LayoutSpec for actual connection layouting tests\n\n      // expect di waypoints update\n      expect(sequenceFlowDi.waypoint).to.eql(expectedDiWaypoints);\n    }));\n\n\n    it('should move label', inject(function(elementRegistry, modeling) {\n\n      // given\n      var labelElement = elementRegistry.get('StartEvent_1_label'),\n          startEventDi = getDi(elementRegistry.get('StartEvent_1'));\n\n      var oldPosition = {\n        x: labelElement.x,\n        y: labelElement.y\n      };\n\n      // when\n      modeling.moveShape(labelElement, { x: 0, y: 50 });\n\n      // then\n      expect(startEventDi.label).to.have.position({\n        x: oldPosition.x,\n        y: oldPosition.y + 50\n      });\n    }));\n\n\n    it('should move label to new parent', inject(function(elementRegistry, modeling) {\n\n      // given\n      var startEventElement = elementRegistry.get('StartEvent_1'),\n          labelElement = elementRegistry.get('StartEvent_1_label'),\n          processElement = elementRegistry.get('Process_1'),\n          subProcessElement = elementRegistry.get('SubProcess_1'),\n          startEvent = labelElement.businessObject,\n          subProcess = subProcessElement.businessObject;\n\n      // when\n      modeling.moveShape(labelElement, { x: 0, y: 50 }, processElement);\n\n      // then\n      expect(labelElement.parent).to.eql(processElement);\n\n      // expect actual element + businessObject to be unchanged\n      expect(startEventElement.parent).to.eql(subProcessElement);\n      expect(startEvent.$parent).to.eql(subProcess);\n    }));\n\n\n    describe('undo support', function() {\n\n      it('should undo', inject(function(elementRegistry, commandStack, modeling) {\n\n        // given\n        var startEvent = elementRegistry.get('StartEvent_1'),\n            startEventDi = getDi(startEvent);\n\n        var oldPosition = {\n          x: startEvent.x,\n          y: startEvent.y\n        };\n\n        modeling.moveShape(startEvent, { x: 0, y: 50 });\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(startEventDi).to.have.position(oldPosition);\n      }));\n\n\n      it('should undo on label', inject(function(elementRegistry, commandStack, modeling) {\n\n        // given\n        var labelElement = elementRegistry.get('StartEvent_1_label'),\n            startEvent = elementRegistry.get('StartEvent_1'),\n            startEventDi = getDi(startEvent);\n\n        var oldPosition = {\n          x: labelElement.x,\n          y: labelElement.y\n        };\n\n        modeling.moveShape(labelElement, { x: 0, y: 50 });\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(startEventDi.label).to.have.position(oldPosition);\n      }));\n\n    });\n\n\n    describe('redo support', function() {\n\n      it('should redo', inject(function(elementRegistry, commandStack, modeling) {\n\n        // given\n        var startEventElement = elementRegistry.get('StartEvent_1'),\n            startEventDi = getDi(startEventElement);\n\n\n        modeling.moveShape(startEventElement, { x: 0, y: 50 });\n\n        var newPosition = {\n          x: startEventElement.x,\n          y: startEventElement.y\n        };\n\n        // when\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expect(startEventDi).to.have.position(newPosition);\n      }));\n\n\n      it('should redo on label', inject(function(elementRegistry, commandStack, modeling) {\n\n        // given\n        var labelElement = elementRegistry.get('StartEvent_1_label'),\n            startEvent = elementRegistry.get('StartEvent_1'),\n            startEventDi = getDi(startEvent);\n\n        modeling.moveShape(labelElement, { x: 0, y: 50 });\n\n        var newPosition = {\n          x: labelElement.x,\n          y: labelElement.y\n        };\n\n        // when\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expect(startEventDi.label).to.have.position(newPosition);\n      }));\n\n    });\n\n  });\n\n\n  describe('label support', function() {\n\n    it('should move label with shape', inject(function(elementRegistry, modeling) {\n\n      // given\n      var startEventElement = elementRegistry.get('StartEvent_1');\n\n      var label = startEventElement.label;\n\n      var labelPosition = {\n        x: label.x,\n        y: label.y\n      };\n\n      // when\n      modeling.moveElements([ startEventElement ], { x: 40, y: 80 });\n\n      // then\n      expect(label).to.have.position({\n        x: labelPosition.x + 40,\n        y: labelPosition.y + 80\n      });\n    }));\n\n\n    it('should move label with connection', inject(function(elementRegistry, modeling) {\n\n      // given\n      var startEventElement = elementRegistry.get('StartEvent_2'),\n          subProcessElement = elementRegistry.get('SubProcess_1'),\n          flowLabel = elementRegistry.get('SequenceFlow_3_label');\n\n      var labelPosition = {\n        x: flowLabel.x,\n        y: flowLabel.y\n      };\n\n      // when\n      modeling.moveElements([ startEventElement, subProcessElement ], { x: 40, y: -80 });\n\n      // then\n      expect(flowLabel).to.have.position({\n        x: labelPosition.x + 40,\n        y: labelPosition.y - 80\n      });\n    }));\n\n\n    describe('undo', function() {\n\n      it('should undo label with shape', inject(function(elementRegistry, modeling, commandStack) {\n\n        // given\n        var startEventElement = elementRegistry.get('StartEvent_1');\n\n        var label = startEventElement.label;\n\n        var labelPosition = {\n          x: label.x,\n          y: label.y\n        };\n\n        modeling.moveElements([ startEventElement ], { x: 40, y: -80 });\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(label).to.have.position(labelPosition);\n      }));\n\n\n      it('should move label with connection', inject(function(elementRegistry, modeling, commandStack) {\n\n        // given\n        var startEventElement = elementRegistry.get('StartEvent_2'),\n            subProcessElement = elementRegistry.get('SubProcess_1'),\n            flowLabel = elementRegistry.get('SequenceFlow_3_label');\n\n        var labelPosition = {\n          x: flowLabel.x,\n          y: flowLabel.y\n        };\n\n        modeling.moveElements([ startEventElement, subProcessElement ], { x: 40, y: -80 });\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(flowLabel).to.have.position(labelPosition);\n      }));\n\n    });\n\n\n    describe('redo', function() {\n\n      it('should redo move label with shape', inject(function(elementRegistry, modeling, commandStack) {\n\n        // given\n        var startEventElement = elementRegistry.get('StartEvent_1');\n\n        var label = startEventElement.label;\n\n        var labelPosition = {\n          x: label.x,\n          y: label.y\n        };\n\n        modeling.moveElements([ startEventElement ], { x: 40, y: 80 });\n        commandStack.undo();\n\n        // when\n        commandStack.redo();\n\n        // then\n        expect(label).to.have.position({\n          x: labelPosition.x + 40,\n          y: labelPosition.y + 80\n        });\n      }));\n\n\n      it('should redo move label with connection', inject(function(elementRegistry, modeling, commandStack) {\n\n        // given\n        var startEventElement = elementRegistry.get('StartEvent_2'),\n            subProcessElement = elementRegistry.get('SubProcess_1'),\n            flowLabel = elementRegistry.get('SequenceFlow_3_label');\n\n        var labelPosition = {\n          x: flowLabel.x,\n          y: flowLabel.y\n        };\n\n        modeling.moveElements([ startEventElement, subProcessElement ], { x: 40, y: -80 });\n        commandStack.undo();\n\n        // when\n        commandStack.redo();\n\n        // then\n        expect(flowLabel).to.have.position({\n          x: labelPosition.x + 40,\n          y: labelPosition.y - 80\n        });\n      }));\n\n    });\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/MoveStress.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"http://bpmn.io\" exporterVersion=\"0.10.1\">\n  <process id=\"Process_03futig\">\n    <task id=\"TASK\" name=\"TASK\">\n      <incoming>SequenceFlow_015llny</incoming>\n      <incoming>SequenceFlow_1s8i2ri</incoming>\n      <incoming>SequenceFlow_1ww284e</incoming>\n      <incoming>SequenceFlow_13hnkxl</incoming>\n      <incoming>SequenceFlow_01uq989</incoming>\n      <incoming>SequenceFlow_1of0m15</incoming>\n      <incoming>SequenceFlow_031yqex</incoming>\n      <incoming>SequenceFlow_1wkc2h4</incoming>\n      <outgoing>SequenceFlow_0exsujd</outgoing>\n      <outgoing>SequenceFlow_1ox345k</outgoing>\n      <property id=\"Property_06qxa7x\" name=\"__targetRef_placeholder\" />\n      <dataInputAssociation id=\"DataInputAssociation_1kftbye\">\n        <sourceRef>DataStoreReference_0lujw1y</sourceRef>\n        <targetRef>Property_06qxa7x</targetRef>\n      </dataInputAssociation>\n      <dataInputAssociation id=\"DataInputAssociation_18isiml\">\n        <sourceRef>DataObjectReference_06vq2e1</sourceRef>\n        <targetRef>Property_06qxa7x</targetRef>\n      </dataInputAssociation>\n      <dataInputAssociation id=\"DataInputAssociation_1xqsqpu\">\n        <sourceRef>DataObjectReference_1mksk9i</sourceRef>\n        <targetRef>Property_06qxa7x</targetRef>\n      </dataInputAssociation>\n    </task>\n    <dataStoreReference id=\"DataStoreReference_0lujw1y\" />\n    <exclusiveGateway id=\"ExclusiveGateway_18m8idl\">\n      <outgoing>SequenceFlow_1ww284e</outgoing>\n    </exclusiveGateway>\n    <intermediateThrowEvent id=\"IntermediateThrowEvent_06c4rb9\">\n      <outgoing>SequenceFlow_1s8i2ri</outgoing>\n    </intermediateThrowEvent>\n    <intermediateThrowEvent id=\"IntermediateThrowEvent_17qeaas\">\n      <incoming>SequenceFlow_0exsujd</incoming>\n    </intermediateThrowEvent>\n    <endEvent id=\"EndEvent_0q32456\">\n      <incoming>SequenceFlow_1ox345k</incoming>\n    </endEvent>\n    <exclusiveGateway id=\"ExclusiveGateway_142pw10\">\n      <outgoing>SequenceFlow_015llny</outgoing>\n    </exclusiveGateway>\n    <sequenceFlow id=\"SequenceFlow_015llny\" sourceRef=\"ExclusiveGateway_142pw10\" targetRef=\"TASK\" />\n    <sequenceFlow id=\"SequenceFlow_1s8i2ri\" sourceRef=\"IntermediateThrowEvent_06c4rb9\" targetRef=\"TASK\" />\n    <sequenceFlow id=\"SequenceFlow_1ww284e\" sourceRef=\"ExclusiveGateway_18m8idl\" targetRef=\"TASK\" />\n    <sequenceFlow id=\"SequenceFlow_0exsujd\" sourceRef=\"TASK\" targetRef=\"IntermediateThrowEvent_17qeaas\" />\n    <sequenceFlow id=\"SequenceFlow_1ox345k\" sourceRef=\"TASK\" targetRef=\"EndEvent_0q32456\" />\n    <dataObjectReference id=\"DataObjectReference_06vq2e1\" dataObjectRef=\"DataObject_1ms0858\" />\n    <dataObject id=\"DataObject_1ms0858\" />\n    <dataObjectReference id=\"DataObjectReference_1mksk9i\" dataObjectRef=\"DataObject_01lo3w1\" />\n    <dataObject id=\"DataObject_01lo3w1\" />\n    <exclusiveGateway id=\"ExclusiveGateway_03sdgfi\">\n      <outgoing>SequenceFlow_1wkc2h4</outgoing>\n    </exclusiveGateway>\n    <exclusiveGateway id=\"ExclusiveGateway_0yzzfty\">\n      <outgoing>SequenceFlow_1of0m15</outgoing>\n    </exclusiveGateway>\n    <exclusiveGateway id=\"ExclusiveGateway_0sjeyu2\">\n      <outgoing>SequenceFlow_031yqex</outgoing>\n    </exclusiveGateway>\n    <intermediateThrowEvent id=\"IntermediateThrowEvent_0xli14v\">\n      <outgoing>SequenceFlow_01uq989</outgoing>\n    </intermediateThrowEvent>\n    <intermediateThrowEvent id=\"IntermediateThrowEvent_0i39qnt\">\n      <outgoing>SequenceFlow_13hnkxl</outgoing>\n    </intermediateThrowEvent>\n    <sequenceFlow id=\"SequenceFlow_13hnkxl\" sourceRef=\"IntermediateThrowEvent_0i39qnt\" targetRef=\"TASK\" />\n    <sequenceFlow id=\"SequenceFlow_01uq989\" sourceRef=\"IntermediateThrowEvent_0xli14v\" targetRef=\"TASK\" />\n    <sequenceFlow id=\"SequenceFlow_1of0m15\" sourceRef=\"ExclusiveGateway_0yzzfty\" targetRef=\"TASK\" />\n    <sequenceFlow id=\"SequenceFlow_031yqex\" sourceRef=\"ExclusiveGateway_0sjeyu2\" targetRef=\"TASK\" />\n    <sequenceFlow id=\"SequenceFlow_1wkc2h4\" sourceRef=\"ExclusiveGateway_03sdgfi\" targetRef=\"TASK\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Process_03futig\">\n      <bpmndi:BPMNShape id=\"TASK_di\" bpmnElement=\"TASK\">\n        <omgdc:Bounds x=\"237.30880230880229\" y=\"186.69264069264068\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_0lujw1y_di\" bpmnElement=\"DataStoreReference_0lujw1y\">\n        <omgdc:Bounds x=\"129.1616161616161\" y=\"117.61760461760457\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"154.1616161616161\" y=\"171.61760461760457\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_18m8idl_di\" bpmnElement=\"ExclusiveGateway_18m8idl\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"302.1616161616161\" y=\"36.61760461760457\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"327.1616161616161\" y=\"90.61760461760457\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_06c4rb9_di\" bpmnElement=\"IntermediateThrowEvent_06c4rb9\">\n        <omgdc:Bounds x=\"203.1616161616161\" y=\"44\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"221.1616161616161\" y=\"84\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_17qeaas_di\" bpmnElement=\"IntermediateThrowEvent_17qeaas\">\n        <omgdc:Bounds x=\"423.1616161616161\" y=\"117.61760461760457\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"441.1616161616161\" y=\"157.61760461760457\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_0q32456_di\" bpmnElement=\"EndEvent_0q32456\">\n        <omgdc:Bounds x=\"423\" y=\"208.61760461760457\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"441\" y=\"248.61760461760457\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_142pw10_di\" bpmnElement=\"ExclusiveGateway_142pw10\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"84.16161616161611\" y=\"202\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"109.16161616161611\" y=\"256\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_015llny_di\" bpmnElement=\"SequenceFlow_015llny\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"134\" y=\"227\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"237\" y=\"227\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"185.5\" y=\"206\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_1kftbye_di\" bpmnElement=\"DataInputAssociation_1kftbye\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"179\" y=\"159\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"237\" y=\"197\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1s8i2ri_di\" bpmnElement=\"SequenceFlow_1s8i2ri\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"221\" y=\"80\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"221\" y=\"133\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"287\" y=\"133\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"287\" y=\"187\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"254\" y=\"112\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1ww284e_di\" bpmnElement=\"SequenceFlow_1ww284e\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"327\" y=\"86\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"327\" y=\"137\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"287\" y=\"137\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"287\" y=\"187\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"307\" y=\"116\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0exsujd_di\" bpmnElement=\"SequenceFlow_0exsujd\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"337\" y=\"227\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"380\" y=\"227\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"380\" y=\"136\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"423\" y=\"136\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"395\" y=\"175.5\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1ox345k_di\" bpmnElement=\"SequenceFlow_1ox345k\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"337\" y=\"227\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"423\" y=\"227\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"380\" y=\"206\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"DataObjectReference_06vq2e1_di\" bpmnElement=\"DataObjectReference_06vq2e1\">\n        <omgdc:Bounds x=\"106.57919621749409\" y=\"297.0614657210402\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"124.57919621749409\" y=\"351.0614657210402\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_1mksk9i_di\" bpmnElement=\"DataObjectReference_1mksk9i\">\n        <omgdc:Bounds x=\"210.5791962174941\" y=\"349.0614657210402\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"228.5791962174941\" y=\"403.0614657210402\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_18isiml_di\" bpmnElement=\"DataInputAssociation_18isiml\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"143\" y=\"311\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"237\" y=\"253\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_1xqsqpu_di\" bpmnElement=\"DataInputAssociation_1xqsqpu\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"235\" y=\"349\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"253\" y=\"267\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_03sdgfi_di\" bpmnElement=\"ExclusiveGateway_03sdgfi\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"376.5791962174941\" y=\"329.0614657210402\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"401.5791962174941\" y=\"383.0614657210402\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_0yzzfty_di\" bpmnElement=\"ExclusiveGateway_0yzzfty\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"250.78486997635935\" y=\"472.4657210401891\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"275.78486997635935\" y=\"526.4657210401891\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_0sjeyu2_di\" bpmnElement=\"ExclusiveGateway_0sjeyu2\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"397.78486997635935\" y=\"472\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"422.78486997635935\" y=\"526\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_0xli14v_di\" bpmnElement=\"IntermediateThrowEvent_0xli14v\">\n        <omgdc:Bounds x=\"136\" y=\"593.4657210401891\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"154\" y=\"633.4657210401891\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_0i39qnt_di\" bpmnElement=\"IntermediateThrowEvent_0i39qnt\">\n        <omgdc:Bounds x=\"13.784869976359346\" y=\"370.4657210401891\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"31.784869976359346\" y=\"410.4657210401891\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_13hnkxl_di\" bpmnElement=\"SequenceFlow_13hnkxl\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"50\" y=\"388\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"144\" y=\"388\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"144\" y=\"227\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"237\" y=\"227\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"159\" y=\"301.5\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_01uq989_di\" bpmnElement=\"SequenceFlow_01uq989\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"172\" y=\"611\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"205\" y=\"611\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"205\" y=\"227\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"237\" y=\"227\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"220\" y=\"413\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1of0m15_di\" bpmnElement=\"SequenceFlow_1of0m15\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"276\" y=\"473\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"276\" y=\"370\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"287\" y=\"370\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"287\" y=\"267\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"281.5\" y=\"349\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_031yqex_di\" bpmnElement=\"SequenceFlow_031yqex\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"423\" y=\"472\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"423\" y=\"227\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"337\" y=\"227\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"438\" y=\"343.5\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1wkc2h4_di\" bpmnElement=\"SequenceFlow_1wkc2h4\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"402\" y=\"329\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"402\" y=\"227\" />\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"337\" y=\"227\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"417\" y=\"272\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/MoveStressSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\nimport LoggingCroppingConnectionDocking from './LoggingCroppingConnectionDocking';\n\n\ndescribe.skip('modeling / MoveShape - connection cropping', function() {\n\n  var diagramXML = require('./MoveStress.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: [\n      coreModule,\n      modelingModule,\n      {\n        connectionDocking: [ 'type', LoggingCroppingConnectionDocking ]\n      }\n    ]\n  }));\n\n\n  var count = 0;\n\n  it('stress stress', inject(function(elementRegistry, modeling, graphicsFactory) {\n\n    var task = elementRegistry.get('TASK');\n\n    var connections = [].concat(task.incoming, task.outgoing);\n\n    function reconnect(c) {\n\n      /*\n      if (Math.random() > 0.9) {\n        console.log(\n          graphicsFactory.getConnectionPath(c),\n          graphicsFactory.getShapePath(c.source),\n          graphicsFactory.getShapePath(c.target)\n        );\n      };\n      */\n\n      modeling[(\n        c.target === task\n          ? 'reconnectEnd'\n          : 'reconnectStart'\n      )](c, task, randomDocking());\n    }\n\n    function randomDocking() {\n\n      return {\n        x: task.x + Math.round(Math.random() * (task.width)),\n        y: task.y + Math.round(Math.random() * (task.height))\n      };\n    }\n\n    function tick() {\n      setTimeout(function() {\n        console.log('#%s rate=%s, no-intersections=%s', count, window.noIntersectCount / count, window.noIntersectCount);\n\n        if (!window.__STOPTEST) {\n          tick();\n        }\n      }, 2000);\n    }\n\n\n    function next() {\n\n      setTimeout(function() {\n        count++;\n\n        modeling.moveElements([ task ], {\n          x: Math.round(Math.random() * 10 - 5),\n          y: Math.round(Math.random() * 10 - 5)\n        });\n\n        connections.forEach(function(c) {\n          if (Math.random() < 0.1) {\n            reconnect(c);\n          }\n        });\n\n        if (window.noIntersect && window.noIntersect.length) {\n\n          // reconnect all non-intersection connections\n          window.noIntersect.forEach(function(entry) {\n            reconnect(entry[0]);\n          });\n\n          window.noIntersect.length = 0;\n        }\n\n        if (!window.__STOPTEST) {\n          next();\n        }\n      }, 1);\n    }\n\n    next();\n    tick();\n  }));\n\n});"
  },
  {
    "path": "test/spec/features/modeling/ResizeShapeSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport { pick } from 'min-dash';\n\nimport {\n  getDi\n} from 'lib/util/ModelUtil';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - resize shape', function() {\n\n  var diagramXML = require('../../../fixtures/bpmn/simple-resizable.bpmn');\n\n  var testModules = [ coreModule, modelingModule ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  describe('shape', function() {\n\n    it('should resize', inject(function(elementRegistry, modeling) {\n\n      // given\n      var subProcessElement = elementRegistry.get('SubProcess_1'),\n          originalWidth = subProcessElement.width;\n\n      // when\n      modeling.resizeShape(subProcessElement, { x: 339, y: 142, width: 250, height: 200 });\n\n      // then\n      expect(subProcessElement.width).to.equal(250);\n      expect(subProcessElement.width).to.not.equal(originalWidth);\n\n    }));\n\n\n    describe('businessObject', function() {\n\n      it('should update bounds', inject(function(elementRegistry, modeling) {\n\n        // given\n        var subProcessElement = elementRegistry.get('SubProcess_1');\n\n        // when\n        modeling.resizeShape(subProcessElement, { x: 339, y: 142, width: 250, height: 200 });\n\n        // then\n        var di = getDi(subProcessElement);\n        expect(di.bounds.width).to.equal(250);\n      }));\n\n\n      it('should update group bounds', inject(function(elementRegistry, modeling) {\n\n        // given\n        var subProcessElement = elementRegistry.get('Group_1');\n\n        // when\n        modeling.resizeShape(subProcessElement, { x: 250, y: 250, width: 550, height: 400 });\n\n        // then\n        var di = getDi(subProcessElement);\n        expect(di.bounds.width).to.equal(550);\n      }));\n\n    });\n\n\n    describe('connected flow', function() {\n\n      it('should resize', inject(function(elementRegistry, modeling, bpmnFactory) {\n\n        // given\n        var subProcessElement = elementRegistry.get('SubProcess_1');\n\n        var sequenceFlowElement = elementRegistry.get('SequenceFlow_2'),\n            sequenceFlowDi = getDi(sequenceFlowElement);\n\n        // when\n\n        // Decreasing width by 100px\n        modeling.resizeShape(subProcessElement, { x: 339, y: 142, width: 250, height: 200 });\n\n        // then\n\n        // expect flow layout\n        var diWaypoints = bpmnFactory.createDiWaypoints([\n          { x: 589, y: 242 },\n          { x: 821, y: 242 }\n        ]);\n\n        expect(sequenceFlowDi.waypoint).eql(diWaypoints);\n      }));\n\n\n      it('should move', inject(function(elementRegistry, modeling, bpmnFactory) {\n\n        // given\n        var subProcessElement = elementRegistry.get('SubProcess_1');\n\n        var sequenceFlowElement = elementRegistry.get('SequenceFlow_2'),\n            sequenceFlowDi = getDi(sequenceFlowElement);\n\n        // when\n        modeling.moveShape(subProcessElement, { x: -50, y: 0 });\n\n        // then\n\n        // expect flow layout\n        var diWaypoints = bpmnFactory.createDiWaypoints([\n          { x: 639, y: 242 },\n          { x: 821, y: 242 }\n        ]);\n\n        expect(sequenceFlowDi.waypoint).eql(diWaypoints);\n      }));\n\n    });\n\n  });\n\n\n  describe('integration', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/boundary-events.bpmn');\n\n    var testModules = [ coreModule, modelingModule ];\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    it('should not move Boundary Event if unnecessary', inject(function(elementRegistry, modeling) {\n\n      // given\n      var boundaryEvent = elementRegistry.get('BoundaryEvent_3'),\n          originalPosition = getPosition(boundaryEvent),\n          subProcessElement = elementRegistry.get('SubProcess_1');\n\n      // when\n      modeling.resizeShape(subProcessElement, { x: 204, y: 28, width: 400, height: 339 });\n\n      // then\n      expect(getPosition(boundaryEvent)).to.jsonEqual(originalPosition);\n    }));\n\n  });\n\n});\n\n// helper /////\nfunction getPosition(shape) {\n  return pick(shape, [ 'x', 'y' ]);\n}\n"
  },
  {
    "path": "test/spec/features/modeling/SetColor.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"simple\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.2.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:subProcess id=\"SubProcess_1\" name=\"Sub Process 1\">\n      <bpmn2:incoming>SequenceFlow_3</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n      <bpmn2:startEvent id=\"StartEvent_1\" name=\"Start Event 1\">\n        <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n      </bpmn2:startEvent>\n      <bpmn2:task id=\"Task_1\" name=\"Task\">\n        <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n      </bpmn2:task>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n    </bpmn2:subProcess>\n    <bpmn2:endEvent id=\"EndEvent_1\" name=\"End Event\">\n      <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_2\" name=\"\" sourceRef=\"SubProcess_1\" targetRef=\"EndEvent_1\" />\n    <bpmn2:startEvent id=\"StartEvent_2\" name=\"Start\">\n      <bpmn2:outgoing>SequenceFlow_3</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_3\" name=\"Flow\" sourceRef=\"StartEvent_2\" targetRef=\"SubProcess_1\" />\n    <bpmn2:subProcess id=\"Collapsed\" name=\"Collapsed\">\n      <bpmn2:startEvent id=\"Event_0ql2pb3\" />\n    </bpmn2:subProcess>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_3\" bpmnElement=\"SequenceFlow_3\" sourceElement=\"_BPMNShape_StartEvent_11\" targetElement=\"_BPMNShape_SubProcess_2\">\n        <di:waypoint x=\"194\" y=\"230\" />\n        <di:waypoint x=\"350\" y=\"230\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"247\" y=\"204\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"_BPMNShape_SubProcess_2\" targetElement=\"_BPMNShape_EndEvent_2\">\n        <di:waypoint x=\"650\" y=\"230\" />\n        <di:waypoint x=\"700\" y=\"230\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_2\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"350\" y=\"80\" width=\"300\" height=\"300\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_StartEvent_2\" targetElement=\"_BPMNShape_Task_2\">\n        <di:waypoint x=\"438\" y=\"260\" />\n        <di:waypoint x=\"470\" y=\"260\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"402\" y=\"242\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"388\" y=\"278\" width=\"64\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"470\" y=\"220\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"700\" y=\"212\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"693\" y=\"248\" width=\"51\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_11\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds x=\"158\" y=\"212\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"164\" y=\"253\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0uievla_di\" bpmnElement=\"Collapsed\" isExpanded=\"false\">\n        <dc:Bounds x=\"475\" y=\"540\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_0dfg6ho\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_SubProcess\" bpmnElement=\"Collapsed\">\n      <bpmndi:BPMNShape id=\"Event_0ql2pb3_di\" bpmnElement=\"Event_0ql2pb3\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/SetColorSpec.js",
    "content": "import {\r\n  bootstrapModeler,\r\n  inject\r\n} from 'test/TestHelper';\r\n\r\nimport { getDi } from 'lib/util/ModelUtil';\r\n\r\nimport modelingModule from 'lib/features/modeling';\r\nimport coreModule from 'lib/core';\r\n\r\nvar FUCHSIA_HEX = '#ff00ff',\r\n    YELLOW_HEX = '#ffff00';\r\n\r\ndescribe('features/modeling - set color', function() {\r\n\r\n  var diagramXML = require('./SetColor.bpmn');\r\n\r\n  beforeEach(bootstrapModeler(diagramXML, {\r\n    modules: [\r\n      coreModule,\r\n      modelingModule\r\n    ]\r\n  }));\r\n\r\n\r\n  describe('execute', function() {\r\n\r\n    it('setting fill color', inject(function(elementRegistry, modeling) {\r\n\r\n      // given\r\n      var taskShape = elementRegistry.get('Task_1'),\r\n          taskDi = getDi(taskShape);\r\n\r\n      // when\r\n      modeling.setColor(taskShape, { fill: 'FUCHSIA' });\r\n\r\n      // then\r\n      expect(taskDi.get('background-color')).to.equal(FUCHSIA_HEX);\r\n    }));\r\n\r\n\r\n    it('unsetting fill color', inject(function(elementRegistry, modeling) {\r\n\r\n      // given\r\n      var taskShape = elementRegistry.get('Task_1'),\r\n          taskDi = getDi(taskShape);\r\n\r\n      modeling.setColor(taskShape, { fill: 'FUCHSIA' });\r\n\r\n      // when\r\n      modeling.setColor(taskShape);\r\n\r\n      // then\r\n      expect(taskDi.get('background-color')).not.to.exist;\r\n    }));\r\n\r\n\r\n    it('setting fill color without changing stroke color', inject(\r\n      function(elementRegistry, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape);\r\n\r\n        modeling.setColor(taskShape, { fill: 'FUCHSIA', stroke: 'YELLOW' });\r\n\r\n        // when\r\n        modeling.setColor(taskShape, { fill: 'YELLOW' });\r\n\r\n        // then\r\n        expect(taskDi.get('background-color')).to.equal(YELLOW_HEX);\r\n        expect(taskDi.get('border-color')).to.equal(YELLOW_HEX);\r\n      }\r\n    ));\r\n\r\n\r\n    it('unsetting fill color without changing stroke color', inject(\r\n      function(elementRegistry, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape);\r\n\r\n        modeling.setColor(taskShape, { fill: 'FUCHSIA', stroke: 'YELLOW' });\r\n\r\n        // when\r\n        modeling.setColor(taskShape, { fill: undefined });\r\n\r\n        // then\r\n        expect(taskDi.get('background-color')).not.to.exist;\r\n        expect(taskDi.get('border-color')).to.equal(YELLOW_HEX);\r\n      }\r\n    ));\r\n\r\n\r\n    it('unsetting both fill and stroke color', inject(\r\n      function(elementRegistry, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape);\r\n\r\n        modeling.setColor(taskShape, { fill: 'FUCHSIA' });\r\n\r\n        // when\r\n        modeling.setColor(taskShape);\r\n\r\n        // then\r\n        expect(taskDi.get('background-color')).not.to.exist;\r\n        expect(taskDi.get('border-color')).not.to.exist;\r\n      }\r\n    ));\r\n\r\n\r\n    it('setting stroke color', inject(function(elementRegistry, modeling) {\r\n\r\n      // given\r\n      var taskShape = elementRegistry.get('Task_1'),\r\n          taskDi = getDi(taskShape);\r\n\r\n      // when\r\n      modeling.setColor(taskShape, { stroke: 'FUCHSIA' });\r\n\r\n      // then\r\n      expect(taskDi.get('border-color')).to.equal(FUCHSIA_HEX);\r\n      expect(taskDi.get('background-color')).not.to.exist;\r\n    }));\r\n\r\n\r\n    it('unsetting stroke color', inject(function(elementRegistry, modeling) {\r\n\r\n      // given\r\n      var taskShape = elementRegistry.get('Task_1'),\r\n          taskDi = getDi(taskShape);\r\n\r\n      modeling.setColor(taskShape, { stroke: 'FUCHSIA' });\r\n\r\n      // when\r\n      modeling.setColor(taskShape);\r\n\r\n      // then\r\n      expect(taskDi.get('border-color')).not.to.exist;\r\n      expect(taskDi.get('background-color')).not.to.exist;\r\n    }));\r\n\r\n\r\n    it('setting stroke + fill color on external label', inject(function(elementRegistry, modeling) {\r\n\r\n      // given\r\n      var flowShape = elementRegistry.get('SequenceFlow_3'),\r\n          flowLabel = flowShape.label,\r\n          flowDi = getDi(flowShape);\r\n\r\n      // when\r\n      modeling.setColor(flowLabel, { stroke: 'YELLOW', fill: 'FUCHSIA' });\r\n\r\n      // then\r\n      expect(flowDi.get('border-color')).not.to.exist;\r\n      expect(flowDi.get('background-color')).not.to.exist;\r\n\r\n      expect(flowDi.label.get('color')).to.eql(YELLOW_HEX);\r\n    }));\r\n\r\n\r\n    it('unsetting stroke + fill color on external label', inject(function(elementRegistry, modeling) {\r\n\r\n      // given\r\n      var flowShape = elementRegistry.get('SequenceFlow_3'),\r\n          flowLabel = flowShape.label,\r\n          flowDi = getDi(flowShape);\r\n\r\n      // assume\r\n      modeling.setColor(flowLabel, { stroke: 'FUCHSIA', fill: 'FUCHSIA' });\r\n\r\n      // when\r\n      modeling.setColor(flowLabel, { stroke: undefined, fill: undefined });\r\n\r\n      // then\r\n      expect(flowDi.get('border-color')).not.to.exist;\r\n      expect(flowDi.get('background-color')).not.to.exist;\r\n\r\n      expect(flowDi.label.get('color')).not.to.exist;\r\n    }));\r\n\r\n\r\n    it('setting fill color (multiple elements)', inject(\r\n      function(elementRegistry, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape),\r\n            startEventShape = elementRegistry.get('StartEvent_1'),\r\n            startEventDi = getDi(startEventShape);\r\n\r\n        // when\r\n        modeling.setColor([ taskShape, startEventShape ], { fill: 'FUCHSIA' });\r\n\r\n        // then\r\n        expect(taskDi.get('background-color')).to.equal(FUCHSIA_HEX);\r\n        expect(startEventDi.get('background-color')).to.equal(FUCHSIA_HEX);\r\n        expect(taskDi.get('border-color')).not.to.exist;\r\n        expect(startEventDi.get('border-color')).not.to.exist;\r\n      }\r\n    ));\r\n\r\n\r\n    it('unsetting fill color (multiple elements)', inject(\r\n      function(elementRegistry, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape),\r\n            startEventShape = elementRegistry.get('StartEvent_1'),\r\n            startEventDi = getDi(startEventShape);\r\n\r\n        modeling.setColor([ taskShape, startEventShape ], { fill: 'FUCHSIA' });\r\n\r\n        // when\r\n        modeling.setColor([ taskShape, startEventShape ]);\r\n\r\n        // then\r\n        expect(taskDi.get('background-color')).not.to.exist;\r\n        expect(startEventDi.get('background-color')).not.to.exist;\r\n      }\r\n    ));\r\n\r\n\r\n    it('setting stroke color (multiple elements)', inject(\r\n      function(elementRegistry, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape),\r\n            startEventShape = elementRegistry.get('StartEvent_1'),\r\n            startEventDi = getDi(startEventShape);\r\n\r\n        // when\r\n        modeling.setColor([\r\n          taskShape,\r\n          startEventShape\r\n        ], { stroke: 'FUCHSIA' });\r\n\r\n        // then\r\n        expect(taskDi.get('border-color')).to.equal(FUCHSIA_HEX);\r\n        expect(startEventDi.get('border-color')).to.equal(FUCHSIA_HEX);\r\n        expect(taskDi.get('background-color')).not.to.exist;\r\n        expect(startEventDi.get('background-color')).not.to.exist;\r\n      }\r\n    ));\r\n\r\n\r\n    it('unsetting stroke color (multiple elements)', inject(\r\n      function(elementRegistry, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape),\r\n            startEventShape = elementRegistry.get('StartEvent_1'),\r\n            startEventDi = getDi(startEventShape);\r\n\r\n        modeling.setColor([\r\n          taskShape,\r\n          startEventShape\r\n        ], { stroke: 'FUCHSIA' });\r\n\r\n        // when\r\n        modeling.setColor([ taskShape, startEventShape ]);\r\n\r\n        // then\r\n        expect(taskDi.get('border-color')).not.to.exist;\r\n        expect(startEventDi.get('border-color')).not.to.exist;\r\n      }\r\n    ));\r\n\r\n\r\n    it('should not set background-color on BPMNEdge', inject(function(elementRegistry, modeling) {\r\n\r\n      // given\r\n      var sequenceFlow = elementRegistry.get('SequenceFlow_1'),\r\n          sequenceFlowDi = getDi(sequenceFlow);\r\n\r\n      // when\r\n      modeling.setColor(sequenceFlow, { fill: 'FUCHSIA' });\r\n\r\n      // then\r\n      expect(sequenceFlowDi.get('background-color')).not.to.exist;\r\n    }));\r\n\r\n\r\n    it('should throw for an invalid color', inject(function(elementRegistry, modeling) {\r\n\r\n      // given\r\n      var sequenceFlow = elementRegistry.get('SequenceFlow_1');\r\n\r\n      // when\r\n      function setColor() {\r\n        modeling.setColor(sequenceFlow, { fill: 'INVALID_COLOR' });\r\n      }\r\n\r\n      // then\r\n      expect(setColor).to.throw(/^invalid color value/);\r\n    }));\r\n\r\n\r\n    it('should throw for a color with alpha', inject(function(elementRegistry, modeling) {\r\n\r\n      // given\r\n      var sequenceFlow = elementRegistry.get('SequenceFlow_1');\r\n\r\n      // when\r\n      function setColor() {\r\n        modeling.setColor(sequenceFlow, { fill: 'rgba(0, 255, 0, 0.5)' });\r\n      }\r\n\r\n      // then\r\n      expect(setColor).to.throw(/^invalid color value/);\r\n    }));\r\n\r\n\r\n    it('should ignore BPMNPlane (Process)', inject(function(elementRegistry, modeling) {\r\n\r\n      // given\r\n      var processElement = elementRegistry.get('Process_1'),\r\n          processDi = getDi(processElement);\r\n\r\n      // when\r\n      modeling.setColor(processElement, { fill: '#abcdef' });\r\n\r\n      // then\r\n      expect(processDi.get('background-color')).not.to.exist;\r\n    }));\r\n\r\n\r\n    it('should ignore BPMNPlane (SubProcess)', inject(function(canvas, elementRegistry, modeling) {\r\n\r\n      // given\r\n      canvas.setRootElement(canvas.findRoot('Collapsed_plane'));\r\n      var subprocess = canvas.getRootElement(),\r\n          subprocessDi = getDi(subprocess);\r\n\r\n      // when\r\n      modeling.setColor(subprocess, { fill: '#abcdef' });\r\n\r\n      // then\r\n      expect(subprocessDi.get('background-color')).not.to.exist;\r\n    }));\r\n  });\r\n\r\n\r\n  describe('undo', function() {\r\n\r\n    it('setting fill color', inject(\r\n      function(elementRegistry, commandStack, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape);\r\n\r\n        // when\r\n        modeling.setColor(taskShape, { fill: 'FUCHSIA' });\r\n        commandStack.undo();\r\n\r\n        // then\r\n        expect(taskDi.get('background-color')).not.to.exist;\r\n      }\r\n    ));\r\n\r\n\r\n    it('unsetting fill color', inject(\r\n      function(elementRegistry, commandStack, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape);\r\n\r\n        modeling.setColor(taskShape, { fill: 'FUCHSIA' });\r\n\r\n        // when\r\n        modeling.setColor(taskShape);\r\n        commandStack.undo();\r\n\r\n        // then\r\n        expect(taskDi.get('background-color')).to.equal(FUCHSIA_HEX);\r\n      }\r\n    ));\r\n\r\n\r\n    it('setting stroke color', inject(\r\n      function(elementRegistry, commandStack, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape);\r\n\r\n        // when\r\n        modeling.setColor(taskShape, { stroke: 'FUCHSIA' });\r\n        commandStack.undo();\r\n\r\n        // then\r\n        expect(taskDi.get('border-color')).not.to.exist;\r\n      }\r\n    ));\r\n\r\n\r\n    it('unsetting stroke color', inject(\r\n      function(elementRegistry, commandStack, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape);\r\n\r\n        modeling.setColor(taskShape, { stroke: 'FUCHSIA' });\r\n\r\n        // when\r\n        modeling.setColor(taskShape);\r\n        commandStack.undo();\r\n\r\n        // then\r\n        expect(taskDi.get('border-color')).to.equal(FUCHSIA_HEX);\r\n      }\r\n    ));\r\n\r\n\r\n    it('setting fill color (multiple elements)', inject(\r\n      function(elementRegistry, commandStack, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape),\r\n            startEventShape = elementRegistry.get('StartEvent_1'),\r\n            startEventDi = getDi(taskShape);\r\n\r\n        // when\r\n        modeling.setColor([ taskShape, startEventShape ], { fill: 'FUCHSIA' });\r\n        commandStack.undo();\r\n\r\n        // then\r\n        expect(taskDi.get('background-color')).not.to.exist;\r\n        expect(startEventDi.get('background-color')).not.to.exist;\r\n      }\r\n    ));\r\n\r\n\r\n    it('unsetting fill color (multiple elements)', inject(\r\n      function(elementRegistry, commandStack, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape),\r\n            startEventShape = elementRegistry.get('StartEvent_1'),\r\n            startEventDi = getDi(taskShape);\r\n\r\n        modeling.setColor([ taskShape, startEventShape ], { fill: 'FUCHSIA' });\r\n\r\n        // when\r\n        modeling.setColor([ taskShape, startEventShape ]);\r\n        commandStack.undo();\r\n\r\n        // then\r\n        expect(taskDi.get('background-color')).to.equal(FUCHSIA_HEX);\r\n        expect(startEventDi.get('background-color')).to.equal(FUCHSIA_HEX);\r\n      }\r\n    ));\r\n\r\n\r\n    it('setting stroke color (multiple elements)', inject(\r\n      function(elementRegistry, commandStack, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape),\r\n            startEventShape = elementRegistry.get('StartEvent_1'),\r\n            startEventDi = getDi(taskShape);\r\n\r\n        // when\r\n        modeling.setColor([\r\n          taskShape,\r\n          startEventShape\r\n        ], { stroke: 'FUCHSIA' });\r\n        commandStack.undo();\r\n\r\n        // then\r\n        expect(taskDi.get('border-color')).not.to.exist;\r\n        expect(startEventDi.get('border-color')).not.to.exist;\r\n      }\r\n    ));\r\n\r\n\r\n    it('unsetting stroke color (multiple elements)', inject(\r\n      function(elementRegistry, commandStack, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape),\r\n            startEventShape = elementRegistry.get('StartEvent_1'),\r\n            startEventDi = getDi(taskShape);\r\n\r\n        modeling.setColor([ taskShape, startEventShape ], { stroke: 'FUCHSIA' });\r\n\r\n        // when\r\n        modeling.setColor([ taskShape, startEventShape ]);\r\n        commandStack.undo();\r\n\r\n        // then\r\n        expect(taskDi.get('border-color')).to.equal(FUCHSIA_HEX);\r\n        expect(startEventDi.get('border-color')).to.equal(FUCHSIA_HEX);\r\n      }\r\n    ));\r\n\r\n  });\r\n\r\n\r\n  describe('redo', function() {\r\n\r\n    it('setting fill color', inject(\r\n      function(elementRegistry, commandStack, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape);\r\n\r\n        // when\r\n        modeling.setColor(taskShape, { fill: 'FUCHSIA' });\r\n        commandStack.undo();\r\n        commandStack.redo();\r\n\r\n        // then\r\n        expect(taskDi.get('background-color')).to.equal(FUCHSIA_HEX);\r\n      }\r\n    ));\r\n\r\n\r\n    it('unsetting fill color', inject(\r\n      function(elementRegistry, commandStack, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape);\r\n\r\n        modeling.setColor(taskShape, { fill: 'FUCHSIA' });\r\n\r\n        // when\r\n        modeling.setColor(taskShape);\r\n        commandStack.undo();\r\n        commandStack.redo();\r\n\r\n        // then\r\n        expect(taskDi.get('background-color')).not.to.exist;\r\n      }\r\n    ));\r\n\r\n\r\n    it('setting stroke color', inject(\r\n      function(elementRegistry, commandStack, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape);\r\n\r\n        // when\r\n        modeling.setColor(taskShape, { stroke: 'FUCHSIA' });\r\n        commandStack.undo();\r\n        commandStack.redo();\r\n\r\n        // then\r\n        expect(taskDi.get('border-color')).to.equal(FUCHSIA_HEX);\r\n      }\r\n    ));\r\n\r\n\r\n    it('unsetting stroke color', inject(\r\n      function(elementRegistry, commandStack, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape);\r\n\r\n        modeling.setColor(taskShape, { stroke: 'FUCHSIA' });\r\n\r\n        // when\r\n        modeling.setColor(taskShape);\r\n        commandStack.undo();\r\n        commandStack.redo();\r\n\r\n        // then\r\n        expect(taskDi.get('border-color')).not.to.exist;\r\n      }\r\n    ));\r\n\r\n\r\n    it('setting fill color (multiple elements)', inject(\r\n      function(elementRegistry, commandStack, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape),\r\n            startEventShape = elementRegistry.get('StartEvent_1'),\r\n            startEventDi = getDi(taskShape);\r\n\r\n        // when\r\n        modeling.setColor([ taskShape, startEventShape ], { fill: 'FUCHSIA' });\r\n        commandStack.undo();\r\n        commandStack.redo();\r\n\r\n        // then\r\n        expect(taskDi.get('background-color')).to.equal(FUCHSIA_HEX);\r\n        expect(startEventDi.get('background-color')).to.equal(FUCHSIA_HEX);\r\n      }\r\n    ));\r\n\r\n\r\n    it('unsetting fill color (multiple elements)', inject(\r\n      function(elementRegistry, commandStack, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape),\r\n            startEventShape = elementRegistry.get('StartEvent_1'),\r\n            startEventDi = getDi(taskShape);\r\n\r\n        modeling.setColor([ taskShape, startEventShape ], { fill: 'FUCHSIA' });\r\n\r\n        // when\r\n        modeling.setColor([ taskShape, startEventShape ]);\r\n        commandStack.undo();\r\n        commandStack.redo();\r\n\r\n        // then\r\n        expect(taskDi.get('background-color')).not.to.exist;\r\n        expect(startEventDi.get('background-color')).not.to.exist;\r\n      }\r\n    ));\r\n\r\n\r\n    it('setting stroke color (multiple elements)', inject(\r\n      function(elementRegistry, commandStack, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape),\r\n            startEventShape = elementRegistry.get('StartEvent_1'),\r\n            startEventDi = getDi(taskShape);\r\n\r\n        // when\r\n        modeling.setColor([ taskShape, startEventShape ], { stroke: 'FUCHSIA' });\r\n        commandStack.undo();\r\n        commandStack.redo();\r\n\r\n        // then\r\n        expect(taskDi.get('border-color')).to.equal(FUCHSIA_HEX);\r\n        expect(startEventDi.get('border-color')).to.equal(FUCHSIA_HEX);\r\n      }\r\n    ));\r\n\r\n\r\n    it('unsetting stroke color (multiple elements)', inject(\r\n      function(elementRegistry, commandStack, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape),\r\n            startEventShape = elementRegistry.get('StartEvent_1'),\r\n            startEventDi = getDi(taskShape);\r\n\r\n        modeling.setColor([\r\n          taskShape,\r\n          startEventShape\r\n        ], { stroke: 'FUCHSIA' });\r\n\r\n        // when\r\n        modeling.setColor([ taskShape, startEventShape ]);\r\n        commandStack.undo();\r\n        commandStack.redo();\r\n\r\n        // then\r\n        expect(taskDi.get('border-color')).not.to.exist;\r\n        expect(startEventDi.get('border-color')).not.to.exist;\r\n      }\r\n    ));\r\n\r\n  });\r\n\r\n\r\n  // TODO @barmac: remove once we drop bpmn.io properties\r\n  describe('legacy', function() {\r\n\r\n    it('should set both BPMN in Color and bpmn.io properties on BPMNShape', inject(\r\n      function(elementRegistry, modeling) {\r\n\r\n        // given\r\n        var taskShape = elementRegistry.get('Task_1'),\r\n            taskDi = getDi(taskShape);\r\n\r\n        // when\r\n        modeling.setColor(taskShape, { stroke: '#abcdef', fill: '#fedcba' });\r\n\r\n        // then\r\n        expect(taskDi.get('border-color')).to.eql('#abcdef');\r\n        expect(taskDi.get('stroke')).to.eql('#abcdef');\r\n        expect(taskDi.get('background-color')).to.eql('#fedcba');\r\n        expect(taskDi.get('fill')).to.eql('#fedcba');\r\n      }\r\n    ));\r\n\r\n\r\n    it('should set both BPMN in Color and bpmn.io properties on BPMNEdge', inject(\r\n      function(elementRegistry, modeling) {\r\n\r\n        // given\r\n        var sequenceFlow = elementRegistry.get('SequenceFlow_1'),\r\n            sequenceFlowDi = getDi(sequenceFlow);\r\n\r\n        // when\r\n        modeling.setColor(sequenceFlow, { stroke: '#abcdef' });\r\n\r\n        // then\r\n        expect(sequenceFlowDi.get('border-color')).to.eql('#abcdef');\r\n        expect(sequenceFlowDi.get('stroke')).to.eql('#abcdef');\r\n      }\r\n    ));\r\n\r\n  });\r\n\r\n});"
  },
  {
    "path": "test/spec/features/modeling/UpdateAttachmentSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - update attachment', function() {\n\n  var diagramXML = require('../../../fixtures/bpmn/boundary-events.bpmn');\n\n  var testModules = [ coreModule, modelingModule ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  var subProcessElement, subProcess, task, boundaryEventElement, boundaryEvent;\n\n  beforeEach(inject(function(elementFactory, elementRegistry, canvas, modeling) {\n    task = elementRegistry.get('Task_1');\n\n    subProcessElement = elementRegistry.get('SubProcess_1');\n\n    subProcess = subProcessElement.businessObject;\n\n    boundaryEventElement = elementFactory.createShape({\n      type: 'bpmn:BoundaryEvent',\n      host: task,\n      x: 513, y: 254\n    });\n\n    boundaryEvent = boundaryEventElement.businessObject;\n\n    canvas.addShape(boundaryEventElement, subProcessElement);\n  }));\n\n\n  describe('should reattach BoundaryEvent', function() {\n\n    it('execute', inject(function(modeling, elementRegistry) {\n\n      // when\n      modeling.updateAttachment(boundaryEventElement, subProcessElement);\n\n      // then\n      expect(boundaryEvent.attachedToRef).to.equal(subProcess);\n\n      expect(boundaryEvent.cancelActivity).to.equal(true);\n\n      expect(subProcessElement.attachers).to.include(boundaryEventElement);\n      expect(task.attachers).not.to.include(boundaryEventElement);\n    }));\n\n\n    it('undo', inject(function(elementRegistry, commandStack, modeling) {\n\n      // given\n      modeling.updateAttachment(boundaryEventElement, subProcessElement);\n\n      // when\n      commandStack.undo();\n\n      // then\n      expect(boundaryEvent.attachedToRef).to.equal(task.businessObject);\n      expect(boundaryEvent.cancelActivity).to.equal(true);\n\n      expect(subProcessElement.attachers).not.to.include(boundaryEventElement);\n      expect(task.attachers).to.include(boundaryEventElement);\n    }));\n\n\n    it('redo', inject(function(elementRegistry, commandStack, modeling) {\n\n      // given\n      modeling.updateAttachment(boundaryEventElement, subProcessElement);\n\n      // when\n      commandStack.undo();\n\n      commandStack.redo();\n\n      // then\n      expect(boundaryEvent.attachedToRef).to.equal(subProcess);\n      expect(boundaryEvent.cancelActivity).to.equal(true);\n\n      expect(subProcessElement.attachers).to.include(boundaryEventElement);\n      expect(task.attachers).not.to.include(boundaryEventElement);\n    }));\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/UpdateLabel.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.25.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\" name=\"Foo\" />\n    <bpmn:startEvent id=\"StartEvent_2\" />\n    <bpmn:task id=\"Task_1\" />\n    <bpmn:task id=\"Task_2\" name=\"Task 2\" />\n    <bpmn:subProcess id=\"Subprocess_1\" />\n    <bpmn:textAnnotation id=\"TextAnnotation_1\">\n      <bpmn:text></bpmn:text>\n    </bpmn:textAnnotation>\n    <bpmn:group id=\"Group_1\" categoryValueRef=\"CategoryValue_1\" />\n    <bpmn:group id=\"Group_2\" />\n  </bpmn:process>\n  <bpmn:category id=\"Category_1\">\n    <bpmn:categoryValue id=\"CategoryValue_1\" value=\"Group 1\" />\n  </bpmn:category>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1peicoz_di\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds x=\"255\" y=\"102\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"228\" y=\"138\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_16agoun_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"339\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0rxkqbk_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"460\" y=\"80\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_13podyk_di\" bpmnElement=\"Subprocess_1\">\n        <dc:Bounds x=\"600\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_1_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"426\" y=\"220\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_1_di\" bpmnElement=\"Group_1\">\n        <dc:Bounds x=\"165\" y=\"190\" width=\"150\" height=\"120\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_1txvenf_di\" bpmnElement=\"Group_2\">\n        <dc:Bounds x=\"490\" y=\"190\" width=\"150\" height=\"115\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_0zyhy6y\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1w8xjvg\" bpmnElement=\"Subprocess_1\" />\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/UpdateLabelSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - update label', function() {\n\n  var diagramXML = require('./UpdateLabel.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: [\n      coreModule,\n      modelingModule\n    ]\n  }));\n\n\n  it('should change name of start event', inject(\n    function(modeling, elementRegistry) {\n\n      // given\n      var startEvent_1 = elementRegistry.get('StartEvent_1');\n      var businessObject = startEvent_1.businessObject;\n\n      // when\n      modeling.updateLabel(startEvent_1, 'bar');\n\n      // then\n      expect(businessObject.name).to.equal('bar');\n    }\n  ));\n\n\n  it('should create label name of start event', inject(\n    function(modeling, elementRegistry) {\n\n      // given\n      var startEvent_2 = elementRegistry.get('StartEvent_2');\n      var businessObject = startEvent_2.businessObject;\n\n      // when\n      modeling.updateLabel(startEvent_2, 'bar');\n\n      // then\n      var label = startEvent_2.label;\n      var di = startEvent_2.di;\n\n      expect(businessObject.name).to.equal('bar');\n\n      expect(label).to.exist;\n      expect(label.businessObject).to.equal(businessObject);\n      expect(label.di).to.equal(di);\n    }\n  ));\n\n\n  it('should not create label on empty text', inject(\n    function(modeling, elementRegistry) {\n\n      // given\n      var startEvent_2 = elementRegistry.get('StartEvent_2');\n\n      // when\n      modeling.updateLabel(startEvent_2, '');\n\n      // then\n      expect(startEvent_2.businessObject.name).to.equal('');\n      expect(startEvent_2.label).not.to.exist;\n\n      expect(startEvent_2).to.have.dimensions({\n        width: 36,\n        height: 36\n      });\n    }\n  ));\n\n\n  it('should not create label on (sub)process plane', inject(\n    function(modeling, elementRegistry) {\n\n      // given\n      var SubProcess_1 = elementRegistry.get('Subprocess_1_plane');\n\n      // when\n      modeling.updateLabel(SubProcess_1, 'Cool new label');\n\n      // then\n      expect(SubProcess_1.businessObject.name).to.equal('Cool new label');\n      expect(SubProcess_1.di.get('label')).not.to.exist;\n    }\n  ));\n\n\n  describe('should delete label', function() {\n\n    it('when setting null', inject(\n      function(modeling, elementRegistry) {\n\n        // given\n        var startEvent_1 = elementRegistry.get('StartEvent_1');\n\n        // when\n        modeling.updateLabel(startEvent_1, null);\n\n        // then\n        expect(startEvent_1.businessObject.name).not.to.exist;\n        expect(startEvent_1.label).not.to.exist;\n      }\n    ));\n\n\n    it('when setting empty string', inject(\n      function(modeling, elementRegistry) {\n\n        // given\n        var startEvent_1 = elementRegistry.get('StartEvent_1');\n\n        // when\n        modeling.updateLabel(startEvent_1, '');\n\n        // then\n        expect(startEvent_1.businessObject.name).to.equal('');\n        expect(startEvent_1.label).not.to.exist;\n      }\n    ));\n\n  });\n\n\n  it('should change name of start event when editing label', inject(\n    function(modeling, elementRegistry) {\n\n      // given\n      var startEvent_1 = elementRegistry.get('StartEvent_1');\n      var startEvent_1_label = elementRegistry.get('StartEvent_1_label');\n\n      // when\n      modeling.updateLabel(startEvent_1_label, 'bar');\n\n      // then\n      expect(startEvent_1.businessObject.name).to.equal('bar');\n    }\n  ));\n\n\n  it('should change text annotation text and bounds', inject(\n    function(modeling, elementRegistry) {\n\n      // given\n      var element = elementRegistry.get('TextAnnotation_1');\n\n      var newBounds = { x: 100, y: 100, width: 100, height: 30 };\n\n      // when\n      modeling.updateLabel(element, 'bar', newBounds);\n\n      // then\n      expect(element.businessObject.text).to.equal('bar');\n      expect(element).to.have.bounds(newBounds);\n    }\n  ));\n\n\n  it('should update group label', inject(function(modeling, elementRegistry) {\n\n    // given\n    var group = elementRegistry.get('Group_1');\n\n    // when\n    modeling.updateLabel(group, 'bar');\n\n    // then\n    expect(group.businessObject.categoryValueRef.value).to.equal('bar');\n    expect(group.label).to.exist;\n  }));\n\n\n  it('should create group label', inject(function(modeling, elementRegistry) {\n\n    // given\n    var group = elementRegistry.get('Group_2');\n\n    // when\n    modeling.updateLabel(group, 'foo');\n\n    // then\n    expect(group.businessObject.categoryValueRef.value).to.equal('foo');\n    expect(group.label).to.exist;\n  }));\n\n\n  it('should not create group label on empty text', inject(function(modeling, elementRegistry) {\n\n    // given\n    var group = elementRegistry.get('Group_2');\n\n    // when\n    modeling.updateLabel(group, null);\n\n    // then\n    expect(group.businessObject.categoryValueRef).to.not.exist;\n    expect(group.label).to.not.exist;\n  }));\n\n\n  it('should properly fire events.changed after event name change', inject(\n    function(modeling, elementRegistry, eventBus) {\n\n      // given\n      var startEvent_1 = elementRegistry.get('StartEvent_1');\n\n      var changedEvent;\n\n      eventBus.on('elements.changed', function(event) {\n        changedEvent = event;\n      });\n\n      // when\n      modeling.updateLabel(startEvent_1, 'foo');\n\n      // then\n      expect(changedEvent.elements).to.include(startEvent_1);\n    }\n  ));\n\n\n  it('should propertly fire events.changed after event label change', inject(\n    function(modeling, elementRegistry, eventBus) {\n\n      // given\n      var startEvent_1 = elementRegistry.get('StartEvent_1');\n      var startEvent_1_label = elementRegistry.get('StartEvent_1_label');\n\n      var changedEvent;\n\n      eventBus.on('elements.changed', function(event) {\n        changedEvent = event;\n      });\n\n      // when\n      modeling.updateLabel(startEvent_1_label, 'foo');\n\n      // then\n      expect(changedEvent.elements).to.include(startEvent_1);\n    }\n  ));\n\n\n  it('should resize empty text annotation', inject(function(modeling, elementRegistry) {\n\n    // given\n    var element = elementRegistry.get('TextAnnotation_1');\n\n    var newBounds = { x: 100, y: 100, width: 100, height: 30 };\n\n    // when\n    modeling.updateLabel(element, null, newBounds);\n\n    // then\n    expect(element).to.have.bounds(newBounds);\n  }));\n\n\n  describe('embedded labels', function() {\n\n    it('should change name of task', inject(function(modeling, elementRegistry) {\n\n      // given\n      var task_1 = elementRegistry.get('Task_1');\n\n      // when\n      modeling.updateLabel(task_1, 'foo');\n\n      // then\n      expect(task_1.businessObject.name).to.equal('foo');\n      expect(task_1.di.label).to.exist;\n    }));\n\n\n    it('should delete label of task', inject(function(modeling, elementRegistry) {\n\n      // given\n      var task_2 = elementRegistry.get('Task_2');\n\n      // when\n      modeling.updateLabel(task_2, '');\n\n      // then\n      expect(task_2.businessObject.name).to.equal('');\n      expect(task_2.di).not.to.have.property('label');\n    }));\n\n  });\n\n});"
  },
  {
    "path": "test/spec/features/modeling/UpdateModdleProperties.dataObject.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process\" isExecutable=\"false\">\n    <bpmn:dataObjectReference id=\"DataObjectReference_1\" dataObjectRef=\"DataObject\" />\n    <bpmn:dataObject id=\"DataObject\" />\n    <bpmn:dataObjectReference id=\"DataObjectReference_2\" dataObjectRef=\"DataObject\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process\">\n      <bpmndi:BPMNShape id=\"DataObjectReference_1_di\" bpmnElement=\"DataObjectReference_1\">\n        <dc:Bounds x=\"201\" y=\"184\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"174\" y=\"234\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_2_di\" bpmnElement=\"DataObjectReference_2\">\n        <dc:Bounds x=\"301\" y=\"184\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"274\" y=\"234\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/UpdateModdleProperties.error.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:camunda=\"http://camunda.org/schema/1.0/bpmn\" id=\"Definitions_11dt57b\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.4.0\">\n  <bpmn:process id=\"Process_1fvt1ph\" isExecutable=\"true\">\n    <bpmn:endEvent id=\"StartEvent_1\">\n      <bpmn:errorEventDefinition id=\"ErrorEventDefinition_1vw3oo9\" errorRef=\"Error_02f7uxc\" />\n    </bpmn:endEvent>\n  </bpmn:process>\n  <bpmn:error id=\"Error_02f7uxc\" name=\"Special Error\" errorCode=\"12\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1fvt1ph\">\n      <bpmndi:BPMNShape id=\"Event_0iksq6q_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"152\" y=\"79\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/UpdateModdlePropertiesSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\nvar testModules = [ coreModule, modelingModule ];\n\n\ndescribe('features/modeling - update moddle properties', function() {\n\n  describe('updating bpmn:Error', function() {\n\n    var diagramXML = require('./UpdateModdleProperties.error.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    it('should update', inject(function(elementRegistry, modeling, eventBus) {\n\n      // given\n      var eventShape = elementRegistry.get('StartEvent_1');\n\n      var error = eventShape.businessObject.eventDefinitions[0].errorRef;\n\n      var changedElements;\n\n      var elementsChangedListener = sinon.spy(function(event) {\n        changedElements = event.elements;\n      });\n\n      eventBus.on('elements.changed', elementsChangedListener);\n\n      // assume\n      expect(error.name).to.eql('Special Error');\n\n      // when\n      modeling.updateModdleProperties(eventShape, error, { name: 'Other Error' });\n\n      // then\n      // updated data object\n      expect(error.name).to.eql('Other Error');\n\n      // changed affected elements\n      expect(changedElements).to.eql([\n        eventShape\n      ]);\n\n    }));\n\n  });\n\n\n  describe('updating bpmn:DataObject', function() {\n\n    var diagramXML = require('./UpdateModdleProperties.dataObject.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    it('should update', inject(function(elementRegistry, modeling, eventBus) {\n\n      // given\n      var dataObjectReference1 = elementRegistry.get('DataObjectReference_1');\n      var dataObjectReference2 = elementRegistry.get('DataObjectReference_2');\n      var dataObject = dataObjectReference1.businessObject.dataObjectRef;\n      var changedElements;\n\n      var elementsChangedListener = sinon.spy(function(event) {\n        changedElements = event.elements;\n      });\n\n      eventBus.on('elements.changed', elementsChangedListener);\n\n      // assume\n      expect(dataObject).to.eql(dataObjectReference2.businessObject.dataObjectRef);\n\n      // when\n      modeling.updateModdleProperties(dataObjectReference1, dataObject, { isCollection: true });\n\n      // then\n      // updated data object\n      expect(dataObject.isCollection).to.be.true;\n\n      // changed affected elements\n      expect(changedElements).to.eql([\n        dataObjectReference1,\n        dataObjectReference2\n      ]);\n    }));\n\n\n    it('should undo', inject(function(commandStack, elementRegistry, eventBus, modeling) {\n\n      // given\n      var dataObjectReference1 = elementRegistry.get('DataObjectReference_1');\n      var dataObjectReference2 = elementRegistry.get('DataObjectReference_2');\n      var dataObject = dataObjectReference1.businessObject.dataObjectRef;\n      var changedElements;\n\n      var elementsChangedListener = sinon.spy(function(event) {\n        changedElements = event.elements;\n      });\n\n      modeling.updateModdleProperties(dataObjectReference1, dataObject, { isCollection: true });\n\n      eventBus.on('elements.changed', elementsChangedListener);\n\n      // when\n      commandStack.undo();\n\n      // then\n      // updated data object\n      expect(dataObject.isCollection).to.be.false;\n\n      // changed affected elements\n      expect(changedElements).to.eql([\n        dataObjectReference1,\n        dataObjectReference2\n      ]);\n    }));\n\n\n    it('should redo', inject(function(commandStack, elementRegistry, eventBus, modeling) {\n\n      // given\n      var dataObjectReference1 = elementRegistry.get('DataObjectReference_1');\n      var dataObjectReference2 = elementRegistry.get('DataObjectReference_2');\n      var dataObject = dataObjectReference1.businessObject.dataObjectRef;\n      var changedElements;\n\n      var elementsChangedListener = sinon.spy(function(event) {\n        changedElements = event.elements;\n      });\n\n      modeling.updateModdleProperties(dataObjectReference1, dataObject, { isCollection: true });\n\n      commandStack.undo();\n\n      eventBus.on('elements.changed', elementsChangedListener);\n\n      // when\n      commandStack.redo();\n\n      // then\n      // updated data object\n      expect(dataObject.isCollection).to.be.true;\n\n      // changed affected elements\n      expect(changedElements).to.eql([\n        dataObjectReference1,\n        dataObjectReference2\n      ]);\n\n    }));\n\n  });\n\n});"
  },
  {
    "path": "test/spec/features/modeling/UpdatePropertiesSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport { getDi } from 'lib/util/ModelUtil';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - update properties', function() {\n\n  var diagramXML = require('../../../fixtures/bpmn/conditions.bpmn');\n\n  var testModules = [ coreModule, modelingModule ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  var updatedElements;\n\n  beforeEach(inject(function(eventBus) {\n\n    eventBus.on([ 'commandStack.execute', 'commandStack.revert' ], function() {\n      updatedElements = [];\n    });\n\n    eventBus.on('element.changed', function(event) {\n      updatedElements.push(event.element);\n    });\n\n  }));\n\n\n  describe('should execute', function() {\n\n    it('setting loop characteristics', inject(\n      function(elementRegistry, modeling, moddle) {\n\n        // given\n        var loopCharacteristics = moddle.create(\n          'bpmn:MultiInstanceLoopCharacteristics'\n        );\n\n        var taskShape = elementRegistry.get('ServiceTask_1');\n\n        // when\n        modeling.updateProperties(taskShape, {\n          loopCharacteristics: loopCharacteristics\n        });\n\n        // then\n        expect(\n          taskShape.businessObject.loopCharacteristics\n        ).to.eql(loopCharacteristics);\n\n\n        // task shape got updated\n        expect(updatedElements).to.include(taskShape);\n      }\n    ));\n\n\n    it('unsetting default flow', inject(function(elementRegistry, modeling) {\n\n      // given\n      var gatewayShape = elementRegistry.get('ExclusiveGateway_1');\n\n      // when\n      modeling.updateProperties(gatewayShape, { 'default': undefined });\n\n      // then\n      expect(gatewayShape.businessObject['default']).not.to.exist;\n\n      // flow got updated, too\n      expect(updatedElements).to.include(elementRegistry.get('SequenceFlow_1'));\n    }));\n\n\n    it('updating default flow', inject(function(elementRegistry, modeling) {\n\n      // given\n      var gatewayShape = elementRegistry.get('ExclusiveGateway_1'),\n          newDefaultFlowConnection = elementRegistry.get('SequenceFlow_2'),\n          newDefaultFlow = newDefaultFlowConnection.businessObject;\n\n      // when\n      modeling.updateProperties(gatewayShape, { 'default': newDefaultFlow });\n\n      // then\n      expect(gatewayShape.businessObject['default']).to.eql(newDefaultFlow);\n\n      // flow got updated, too\n      expect(updatedElements).to.include(newDefaultFlowConnection);\n    }));\n\n\n    it('should keep unchanged default flow intact', inject(\n      function(elementRegistry, modeling) {\n\n        // given\n        var gatewayShape = elementRegistry.get('ExclusiveGateway_1'),\n            sequenceFlow = elementRegistry.get('SequenceFlow_2'),\n            taskShape = elementRegistry.get('Task_1');\n\n        // when\n        modeling.reconnectStart(\n          sequenceFlow,\n          taskShape,\n          {\n            x: taskShape.x + taskShape.width,\n            y: taskShape.y + taskShape.height / 2\n          }\n        );\n\n        // then\n        expect(gatewayShape.businessObject.default).to.exist;\n      }\n    ));\n\n\n    it('updating conditional flow on source replace', inject(\n      function(bpmnReplace, elementRegistry) {\n\n        // given\n        var conditionalFlow = elementRegistry.get('SequenceFlow_3'),\n            conditionalBo = conditionalFlow.businessObject,\n            serviceTask = elementRegistry.get('ServiceTask_1');\n\n        var conditionExpression = conditionalBo.conditionExpression;\n\n        var userTaskData = {\n          type: 'bpmn:UserTask'\n        };\n\n        // when\n        bpmnReplace.replaceElement(serviceTask, userTaskData);\n\n        // then\n        expect(conditionalBo.conditionExpression).to.eql(conditionExpression);\n      }\n    ));\n\n\n    it('updating conditional flow on target replace', inject(\n      function(bpmnReplace, elementRegistry) {\n\n        // given\n        var conditionalFlow = elementRegistry.get('SequenceFlow_3'),\n            conditionalBo = conditionalFlow.businessObject,\n            endEvent = elementRegistry.get('EndEvent_1');\n\n        var conditionExpression = conditionalBo.conditionExpression;\n\n        var messageEndEventData = {\n          type: 'bpmn:EndEvent',\n          eventDefinitionType: 'bpmn:MessageEventDefinition'\n        };\n\n        // when\n        bpmnReplace.replaceElement(endEvent, messageEndEventData);\n\n        // then\n        expect(conditionalBo.conditionExpression).to.eql(conditionExpression);\n      }\n    ));\n\n\n    it('updating name', inject(function(elementRegistry, modeling) {\n\n      // given\n      var flowConnection = elementRegistry.get('SequenceFlow_1');\n\n      // when\n      modeling.updateProperties(flowConnection, { name: 'FOO BAR' });\n\n      // then\n      expect(flowConnection.businessObject.name).to.equal('FOO BAR');\n\n      // flow label got updated, too\n      expect(updatedElements).to.include(flowConnection.label);\n    }));\n\n\n    it('unsetting name', inject(function(elementRegistry, modeling) {\n\n      // given\n      var flowConnection = elementRegistry.get('SequenceFlow_3');\n\n      // when\n      modeling.updateProperties(flowConnection, { name: undefined });\n\n      // then\n      expect(flowConnection.businessObject.name).not.to.exist;\n    }));\n\n\n    it('updating id', inject(function(elementRegistry, modeling) {\n\n      // given\n      var flowConnection = elementRegistry.get('SequenceFlow_1'),\n          flowBo = flowConnection.businessObject;\n\n      var ids = flowBo.$model.ids;\n\n      // when\n      modeling.updateProperties(flowConnection, { id: 'FOO_BAR' });\n\n      // then\n      expect(ids.assigned('FOO_BAR')).to.eql(flowBo);\n      expect(ids.assigned('SequenceFlow_1')).to.be.false;\n\n      expect(flowBo.id).to.equal('FOO_BAR');\n      expect(flowConnection.id).to.equal('FOO_BAR');\n    }));\n\n\n    it('updating extension elements', inject(\n      function(elementRegistry, modeling) {\n\n        // given\n        var flowConnection = elementRegistry.get('SequenceFlow_1'),\n            flowBo = flowConnection.businessObject;\n\n        // when\n        modeling.updateProperties(flowConnection, {\n          'xmlns:foo': 'http://foo',\n          'foo:customAttr': 'FOO'\n        });\n\n        // then\n        expect(flowBo.get('xmlns:foo')).to.equal('http://foo');\n        expect(flowBo.get('foo:customAttr')).to.equal('FOO');\n      }\n    ));\n\n\n    it('setting di properties', inject(function(elementRegistry, modeling) {\n\n      // given\n      var flowConnection = elementRegistry.get('SequenceFlow_1'),\n          flowBo = flowConnection.businessObject,\n          flowDi = getDi(flowConnection);\n\n      // when\n      modeling.updateProperties(flowConnection, {\n        di: {\n          fill: 'FUCHSIA'\n        }\n      });\n\n      // then\n      expect(flowDi.fill).to.equal('FUCHSIA');\n\n      expect(flowBo.get('di')).not.to.exist;\n    }));\n\n\n    it('unsetting di properties', inject(function(elementRegistry, modeling) {\n\n      // given\n      var flowConnection = elementRegistry.get('SequenceFlow_1'),\n          flowDi = getDi(flowConnection);\n\n      modeling.updateProperties(flowConnection, { di: { fill: 'FUCHSIA' } });\n\n      // when\n      modeling.updateProperties(flowConnection, { di: { fill: undefined } });\n\n      // then\n      expect(flowDi.fill).not.to.exist;\n    }));\n\n  });\n\n\n  describe('should undo', function() {\n\n    it('setting loop characteristics', inject(\n      function(elementRegistry, modeling, commandStack, moddle) {\n\n        // given\n        var loopCharactersistics = moddle.create('bpmn:MultiInstanceLoopCharacteristics');\n\n        var taskShape = elementRegistry.get('ServiceTask_1');\n\n        // when\n        modeling.updateProperties(taskShape, { loopCharacteristics: loopCharactersistics });\n        commandStack.undo();\n\n        // then\n        expect(taskShape.businessObject.loopCharactersistics).not.to.exist;\n      }\n    ));\n\n\n    it('unsetting default flow', inject(\n      function(elementRegistry, commandStack, modeling) {\n\n        // given\n        var gatewayShape = elementRegistry.get('ExclusiveGateway_1'),\n            gatewayBo = gatewayShape.businessObject,\n            oldDefaultBo = gatewayShape.businessObject['default'],\n            oldDefaultConnection = elementRegistry.get(oldDefaultBo.id);\n\n        // when\n        modeling.updateProperties(gatewayShape, {\n          'default': undefined\n        });\n\n        commandStack.undo();\n\n        // then\n        expect(gatewayBo['default']).to.eql(oldDefaultBo);\n\n        // flow got updated, too\n        expect(updatedElements).to.include(oldDefaultConnection);\n      }\n    ));\n\n\n    it('updating default flow', inject(\n      function(elementRegistry, commandStack, modeling) {\n\n        // given\n        var gatewayShape = elementRegistry.get('ExclusiveGateway_1'),\n            gatewayBo = gatewayShape.businessObject,\n            newDefaultFlowConnection = elementRegistry.get('SequenceFlow_2'),\n            newDefaultFlow = newDefaultFlowConnection.businessObject,\n            oldDefaultFlowConnection = elementRegistry.get('SequenceFlow_1'),\n            oldDefaultFlow = oldDefaultFlowConnection.businessObject;\n\n        // when\n        modeling.updateProperties(gatewayShape, {\n          'default': newDefaultFlow\n        });\n        commandStack.undo();\n\n        // then\n        expect(gatewayBo['default']).to.eql(oldDefaultFlow);\n\n        // flow got updated, too\n        expect(updatedElements).to.include(newDefaultFlowConnection);\n        expect(updatedElements).to.include(oldDefaultFlowConnection);\n      }\n    ));\n\n\n    it('updating name', inject(\n      function(elementRegistry, commandStack, modeling) {\n\n        // given\n        var flowConnection = elementRegistry.get('SequenceFlow_1');\n\n        // when\n        modeling.updateProperties(flowConnection, { name: 'FOO BAR' });\n        commandStack.undo();\n\n        // then\n        expect(flowConnection.businessObject.name).to.equal('default');\n\n        // flow got updated, too\n        expect(updatedElements).to.include(flowConnection.label);\n      }\n    ));\n\n\n    it('unsetting name', inject(\n      function(elementRegistry, commandStack, modeling) {\n\n        // given\n        var flowConnection = elementRegistry.get('SequenceFlow_3');\n\n        modeling.updateProperties(flowConnection, { name: undefined });\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(flowConnection.businessObject.name).to.equal('conditional');\n      }\n    ));\n\n\n    it('updating id', inject(function(elementRegistry, commandStack, modeling) {\n\n      // given\n      var flowConnection = elementRegistry.get('SequenceFlow_1'),\n          flowBo = flowConnection.businessObject;\n\n      var ids = flowBo.$model.ids;\n\n      // when\n      modeling.updateProperties(flowConnection, { id: 'FOO_BAR' });\n      commandStack.undo();\n\n      // then\n      expect(ids.assigned('FOO_BAR')).to.be.false;\n      expect(ids.assigned('SequenceFlow_1')).to.eql(flowBo);\n\n      expect(flowConnection.id).to.equal('SequenceFlow_1');\n      expect(flowBo.id).to.equal('SequenceFlow_1');\n    }));\n\n\n    it('updating extension elements', inject(\n      function(elementRegistry, commandStack, modeling) {\n\n        // given\n        var flowConnection = elementRegistry.get('SequenceFlow_1'),\n            flowBo = flowConnection.businessObject;\n\n        modeling.updateProperties(flowConnection, {\n          'xmlns:foo': 'http://foo',\n          'foo:customAttr': 'FOO'\n        });\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(flowBo.get('xmlns:foo')).not.to.exist;\n        expect(flowBo.get('foo:customAttr')).not.to.exist;\n      }\n    ));\n\n  });\n\n\n  describe('should redo', function() {\n\n    it('setting loop characteristics', inject(\n      function(elementRegistry, modeling, commandStack, moddle) {\n\n        // given\n        var loopCharacteristics = moddle.create(\n          'bpmn:MultiInstanceLoopCharacteristics'\n        );\n\n        var taskShape = elementRegistry.get('ServiceTask_1'),\n            taskBo = taskShape.businessObject;\n\n        // when\n        modeling.updateProperties(taskShape, {\n          loopCharacteristics: loopCharacteristics\n        });\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expect(taskBo.loopCharacteristics).to.eql(loopCharacteristics);\n      }\n    ));\n\n\n    it('updating default flow', inject(\n      function(elementRegistry, commandStack, modeling) {\n\n        // given\n        var gatewayShape = elementRegistry.get('ExclusiveGateway_1');\n\n        // when\n        modeling.updateProperties(gatewayShape, { 'default': undefined });\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expect(gatewayShape.businessObject['default']).not.to.exist;\n\n        // flow got updated, too\n        expect(updatedElements).to.include(\n          elementRegistry.get('SequenceFlow_1')\n        );\n      }\n    ));\n\n\n    it('updating name', inject(\n      function(elementRegistry, commandStack, modeling) {\n\n        // given\n        var flowConnection = elementRegistry.get('SequenceFlow_1');\n\n        // when\n        modeling.updateProperties(flowConnection, { name: 'FOO BAR' });\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expect(flowConnection.businessObject.name).to.equal('FOO BAR');\n\n        // flow got updated, too\n        expect(updatedElements).to.include(flowConnection.label);\n      }\n    ));\n\n\n    it('unsetting name', inject(\n      function(elementRegistry, commandStack, modeling) {\n\n        // given\n        var flowConnection = elementRegistry.get('SequenceFlow_3');\n\n        modeling.updateProperties(flowConnection, { name: undefined });\n\n        // when\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expect(flowConnection.businessObject.name).not.to.exist;\n      }\n    ));\n\n  });\n\n\n  describe('unwrap diagram elements', function() {\n\n    it('updating default flow with connection', inject(\n      function(elementRegistry, modeling) {\n\n        // given\n        var gatewayShape = elementRegistry.get('ExclusiveGateway_1'),\n            newDefaultFlowConnection = elementRegistry.get('SequenceFlow_2');\n\n        // when\n        modeling.updateProperties(gatewayShape, {\n          'default': newDefaultFlowConnection\n        });\n\n        // then\n        expect(gatewayShape.businessObject['default']).to.eql(\n          newDefaultFlowConnection.businessObject\n        );\n\n        // flow got updated, too\n        expect(updatedElements).to.include(newDefaultFlowConnection);\n      }\n    ));\n\n  });\n\n\n  describe('error handling', function() {\n\n    it('should ignore unchanged id', inject(\n      function(elementRegistry, modeling) {\n\n        // given\n        var flowConnection = elementRegistry.get('SequenceFlow_1'),\n            flowBo = flowConnection.businessObject;\n\n        var ids = flowBo.$model.ids;\n\n        // when\n        modeling.updateProperties(flowConnection, { id: 'SequenceFlow_1' });\n\n        // then\n        expect(ids.assigned('SequenceFlow_1')).to.eql(flowBo);\n\n        expect(flowBo.id).to.equal('SequenceFlow_1');\n      }\n    ));\n\n\n    it('should ignore setting color on elements without di', inject(\n      function(modeling, bpmnFactory) {\n\n        // given\n        var rootElement = bpmnFactory.create('bpmn:RootElement');\n\n        // when\n        modeling.updateProperties(rootElement, {\n          di: {\n            fill: 'fuchsia'\n          }\n        });\n\n        // then\n        expect(getDi(rootElement)).not.to.exist;\n      }\n    ));\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/UpdateSemanticParent.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_0oawaw3\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.14.0\">\n  <bpmn:collaboration id=\"Collaboration_1ymmlly\">\n    <bpmn:participant id=\"Participant_1\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Participant_2\" processRef=\"Process_2\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:dataStoreReference id=\"DataStoreReference\" />\n  </bpmn:process>\n  <bpmn:process id=\"Process_2\" isExecutable=\"false\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1ymmlly\">\n      <bpmndi:BPMNShape id=\"Participant_0xpjksb_di\" bpmnElement=\"Participant_1\">\n        <dc:Bounds x=\"0\" y=\"0\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_18lkqyt_di\" bpmnElement=\"Participant_2\">\n        <dc:Bounds x=\"0\" y=\"300\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_17mkq6m_di\" bpmnElement=\"DataStoreReference\">\n        <dc:Bounds x=\"200\" y=\"100\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"240\" y=\"120\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/UpdateSemanticParentSpec.js",
    "content": "import {\r\n  bootstrapModeler,\r\n  inject\r\n} from 'test/TestHelper';\r\n\r\nimport { getDi } from 'lib/util/ModelUtil';\r\n\r\nimport modelingModule from 'lib/features/modeling';\r\nimport coreModule from 'lib/core';\r\n\r\n\r\ndescribe('features/modeling/behavior - update semantic parent', function() {\r\n\r\n  var diagramXML = require('./UpdateSemanticParent.bpmn');\r\n\r\n  var participant1Bo, participant1Di, participant2Bo, participant2Di, dataStoreBo, dataStoreDi;\r\n\r\n  beforeEach(bootstrapModeler(diagramXML, {\r\n    modules: [\r\n      coreModule,\r\n      modelingModule\r\n    ]\r\n  }));\r\n\r\n  beforeEach(inject(function(commandStack, elementRegistry) {\r\n    var participant1 = elementRegistry.get('Participant_1'),\r\n        participant2 = elementRegistry.get('Participant_2'),\r\n        dataStore = elementRegistry.get('DataStoreReference');\r\n\r\n    participant1Bo = participant1.businessObject;\r\n    participant1Di = getDi(participant1);\r\n    participant2Bo = participant2.businessObject;\r\n    participant2Di = getDi(participant2);\r\n    dataStoreBo = dataStore.businessObject;\r\n    dataStoreDi = getDi(dataStore);\r\n\r\n    // when\r\n    commandStack.execute('dataStore.updateContainment', {\r\n      dataStoreBo: dataStoreBo,\r\n      dataStoreDi: dataStoreDi,\r\n      newSemanticParent: participant2Bo.processRef,\r\n      newDiParent: participant2Di\r\n    });\r\n  }));\r\n\r\n\r\n  it('should do', function() {\r\n\r\n    // then\r\n    expect(dataStoreBo.$parent).to.eql(participant2Bo.processRef);\r\n    expect(dataStoreDi.$parent).to.eql(participant2Di.$parent);\r\n  });\r\n\r\n\r\n  it('should undo', inject(function(commandStack) {\r\n\r\n    // when\r\n    commandStack.undo();\r\n\r\n    // then\r\n    expect(dataStoreBo.$parent).to.eql(participant1Bo.processRef);\r\n    expect(dataStoreDi.$parent).to.eql(participant1Di.$parent);\r\n  }));\r\n\r\n\r\n  it('should redo', inject(function(commandStack) {\r\n\r\n    // when\r\n    commandStack.undo();\r\n    commandStack.redo();\r\n\r\n    // then\r\n    expect(dataStoreBo.$parent).to.eql(participant2Bo.processRef);\r\n    expect(dataStoreDi.$parent).to.eql(participant2Di.$parent);\r\n  }));\r\n\r\n});"
  },
  {
    "path": "test/spec/features/modeling/append/TextAnnotationSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  find\n} from 'min-dash';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - append text-annotation', function() {\n\n  var diagramXML = require('../../../../fixtures/bpmn/containers.bpmn');\n\n  var testModules = [ coreModule, modelingModule ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  describe('should append', function() {\n\n    it('in lane');\n\n\n    it('in participant', inject(function(elementRegistry, modeling, canvas) {\n\n      // given\n      var eventShape = elementRegistry.get('IntermediateCatchEvent_1'),\n          collaboration = elementRegistry.get('_Collaboration_2').businessObject;\n\n      // when\n      var annotationShape = modeling.appendShape(eventShape, { type: 'bpmn:TextAnnotation' }),\n          annotation = annotationShape.businessObject;\n\n      var connectingConnection = find(annotationShape.incoming, function(c) {\n        return c.target === annotationShape;\n      });\n\n      var connecting = connectingConnection.businessObject;\n\n      // then\n      expect(annotationShape).to.exist;\n      expect(annotation.$instanceOf('bpmn:TextAnnotation')).to.be.true;\n\n      expect(connecting.$instanceOf('bpmn:Association')).to.be.true;\n      expect(connecting.sourceRef).to.eql(eventShape.businessObject);\n      expect(connecting.targetRef).to.eql(annotation);\n\n      // correctly assign artifact parent\n      expect(annotation.$parent).to.eql(collaboration);\n      expect(connecting.$parent).to.eql(collaboration);\n\n      expect(collaboration.artifacts).to.include(annotation);\n      expect(collaboration.artifacts).to.include(connecting);\n    }));\n\n\n    it('in sub process', inject(function(elementRegistry, modeling) {\n\n      // given\n      var eventShape = elementRegistry.get('IntermediateThrowEvent_1');\n\n      // when\n      var annotationShape = modeling.appendShape(eventShape, { type: 'bpmn:TextAnnotation' }),\n          annotation = annotationShape.businessObject;\n\n      var connectingConnection = find(annotationShape.incoming, function(c) {\n        return c.target === annotationShape;\n      });\n\n      var connecting = connectingConnection.businessObject;\n\n      // then\n      expect(annotationShape).to.exist;\n      expect(annotation.$instanceOf('bpmn:TextAnnotation')).to.be.true;\n\n      expect(connecting.$instanceOf('bpmn:Association')).to.be.true;\n      expect(connecting.sourceRef).to.eql(eventShape.businessObject);\n      expect(connecting.targetRef).to.eql(annotation);\n\n      // correctly assign artifact parent\n      expect(annotation.$parent.id).to.equal('_Collaboration_2');\n      expect(connecting.$parent.id).to.equal('_Collaboration_2');\n    }));\n\n\n    it('with right size', inject(function(elementRegistry, elementFactory, modeling) {\n\n      // given\n      var eventShape = elementRegistry.get('IntermediateCatchEvent_1');\n\n      // when\n      var annotationShape = modeling.appendShape(eventShape, { type: 'bpmn:TextAnnotation' });\n\n      // then\n      expect(annotationShape.width).to.eql(100);\n      expect(annotationShape.height).to.eql(30);\n    }));\n  });\n\n\n  describe('undo', function() {\n\n    it('should undo wire connection source + target', inject(function(elementRegistry, modeling, commandStack) {\n\n      // given\n      var eventShape = elementRegistry.get('IntermediateCatchEvent_1'),\n          collaboration = elementRegistry.get('_Collaboration_2').businessObject;\n\n      var annotationShape = modeling.appendShape(eventShape, { type: 'bpmn:TextAnnotation' }),\n          annotation = annotationShape.businessObject;\n\n      var connectingConnection = find(annotationShape.incoming, function(c) {\n        return c.target === annotationShape;\n      });\n\n      var connecting = connectingConnection.businessObject;\n\n      // when\n      commandStack.undo();\n\n      // then\n      expect(connecting.sourceRef).to.be.null;\n      expect(connecting.targetRef).to.be.null;\n      expect(connecting.$parent).to.be.null;\n      expect(collaboration.artifacts).not.to.include(connecting);\n\n      expect(annotation.$parent).to.be.null;\n      expect(collaboration.artifacts).not.to.include(annotation);\n    }));\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/AdaptiveLabelPositioningBehavior.basics.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.25.0\">\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <exclusiveGateway id=\"LabelBottom\" name=\"BOTTOM\" />\n    <exclusiveGateway id=\"LabelLeft\" name=\"LEFT\" />\n    <exclusiveGateway id=\"LabelTop\" name=\"TOP\">\n      <outgoing>SequenceFlow_1</outgoing>\n    </exclusiveGateway>\n    <exclusiveGateway id=\"LabelRight\" name=\"RIGHT\">\n      <outgoing>SequenceFlow_2</outgoing>\n    </exclusiveGateway>\n    <exclusiveGateway id=\"LabelBottomLeft\" name=\"BOTTOM_LEFT\" />\n    <exclusiveGateway id=\"LabelBottom_2\" name=\"BOTTOM_2\">\n      <incoming>SequenceFlow_2</incoming>\n    </exclusiveGateway>\n    <exclusiveGateway id=\"LabelBottom_3\" name=\"BOTTOM_3\">\n      <incoming>SequenceFlow_1</incoming>\n    </exclusiveGateway>\n    <sequenceFlow id=\"SequenceFlow_1\" name=\"1\" sourceRef=\"LabelTop\" targetRef=\"LabelBottom_3\" />\n    <sequenceFlow id=\"SequenceFlow_2\" name=\"2\" sourceRef=\"LabelRight\" targetRef=\"LabelBottom_2\" />\n    <exclusiveGateway id=\"LabelImpossible\" name=\"IMPOSSIBLE\">\n      <incoming>SequenceFlow_1qmllcx</incoming>\n      <incoming>SequenceFlow_0s993e4</incoming>\n      <incoming>SequenceFlow_022at7e</incoming>\n    </exclusiveGateway>\n    <task id=\"Task\">\n      <outgoing>SequenceFlow_1qmllcx</outgoing>\n      <outgoing>SequenceFlow_0s993e4</outgoing>\n      <outgoing>SequenceFlow_022at7e</outgoing>\n    </task>\n    <sequenceFlow id=\"SequenceFlow_1qmllcx\" sourceRef=\"Task\" targetRef=\"LabelImpossible\" />\n    <sequenceFlow id=\"SequenceFlow_0s993e4\" sourceRef=\"Task\" targetRef=\"LabelImpossible\" />\n    <sequenceFlow id=\"SequenceFlow_022at7e\" sourceRef=\"Task\" targetRef=\"LabelImpossible\" />\n    <exclusiveGateway id=\"NoLabel\">\n      <outgoing>SequenceFlow_0isa70k</outgoing>\n    </exclusiveGateway>\n    <exclusiveGateway id=\"ExclusiveGateway_02fomt2\">\n      <incoming>SequenceFlow_0isa70k</incoming>\n    </exclusiveGateway>\n    <sequenceFlow id=\"SequenceFlow_0isa70k\" sourceRef=\"NoLabel\" targetRef=\"ExclusiveGateway_02fomt2\" />\n    <exclusiveGateway id=\"ExclusiveGateway_1\" name=\"Foo\">\n      <outgoing>SequenceFlow_3</outgoing>\n    </exclusiveGateway>\n    <endEvent id=\"EndEvent_1\">\n      <incoming>SequenceFlow_3</incoming>\n    </endEvent>\n    <sequenceFlow id=\"SequenceFlow_3\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"EndEvent_1\" />\n    <startEvent id=\"Event_01mx9s0\" name=\"START\">\n      <outgoing>Flow_167deqo</outgoing>\n    </startEvent>\n    <endEvent id=\"Event_11bow2d\" name=\"END\">\n      <incoming>Flow_167deqo</incoming>\n    </endEvent>\n    <sequenceFlow id=\"Flow_167deqo\" name=\"label\" sourceRef=\"Event_01mx9s0\" targetRef=\"Event_11bow2d\" />\n    <textAnnotation id=\"TextAnnotation_1vnawwd\">\n      <text>foo</text>\n    </textAnnotation>\n    <association id=\"Association_1yuzjgg\" associationDirection=\"None\" sourceRef=\"Flow_167deqo\" targetRef=\"TextAnnotation_1vnawwd\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"LabelBottom_di\" bpmnElement=\"LabelBottom\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"163\" y=\"89\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"158\" y=\"129\" width=\"48\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"LabelLeft_di\" bpmnElement=\"LabelLeft\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"359\" y=\"82\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"315\" y=\"101\" width=\"27\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"LabelTop_di\" bpmnElement=\"LabelTop\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"359\" y=\"225\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"373\" y=\"198\" width=\"23\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"LabelRight_di\" bpmnElement=\"LabelRight\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"156\" y=\"225\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"219\" y=\"244\" width=\"35\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"LabelBottomLeft_di\" bpmnElement=\"LabelBottomLeft\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"582\" y=\"82\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"538\" y=\"146\" width=\"81\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"LabelBottom_2_di\" bpmnElement=\"LabelBottom_2\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"156\" y=\"370\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"152\" y=\"424\" width=\"60\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"LabelBottom_3_di\" bpmnElement=\"LabelBottom_3\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"359\" y=\"370\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"355\" y=\"424\" width=\"60\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"LabelImpossible_di\" bpmnElement=\"LabelImpossible\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"683\" y=\"308\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"745\" y=\"327\" width=\"67\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_di\" bpmnElement=\"Task\">\n        <omgdc:Bounds x=\"826\" y=\"293\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"NoLabel_di\" bpmnElement=\"NoLabel\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"683\" y=\"82\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"120\" y=\"570\" width=\"22\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_02fomt2_di\" bpmnElement=\"ExclusiveGateway_02fomt2\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"886\" y=\"82\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_0i2uvba_di\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"1035\" y=\"82\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"1050\" y=\"152\" width=\"20\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_0l1udor_di\" bpmnElement=\"EndEvent_1\">\n        <omgdc:Bounds x=\"1042\" y=\"315\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_01mx9s0_di\" bpmnElement=\"Event_01mx9s0\">\n        <omgdc:Bounds x=\"152\" y=\"542\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"152\" y=\"585\" width=\"36\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_11bow2d_di\" bpmnElement=\"Event_11bow2d\">\n        <omgdc:Bounds x=\"402\" y=\"542\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"408\" y=\"585\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_1yuzjgg_di\" bpmnElement=\"Association_1yuzjgg\">\n        <omgdi:waypoint x=\"295\" y=\"560\" />\n        <omgdi:waypoint x=\"371\" y=\"520\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <omgdi:waypoint x=\"384\" y=\"275\" />\n        <omgdi:waypoint x=\"384\" y=\"370\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"396\" y=\"317\" width=\"7\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_2_di\" bpmnElement=\"SequenceFlow_2\">\n        <omgdi:waypoint x=\"181\" y=\"275\" />\n        <omgdi:waypoint x=\"181\" y=\"370\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"193\" y=\"317\" width=\"7\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1qmllcx_di\" bpmnElement=\"SequenceFlow_1qmllcx\">\n        <omgdi:waypoint x=\"876\" y=\"293\" />\n        <omgdi:waypoint x=\"876\" y=\"202\" />\n        <omgdi:waypoint x=\"708\" y=\"202\" />\n        <omgdi:waypoint x=\"708\" y=\"308\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"742\" y=\"181\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0s993e4_di\" bpmnElement=\"SequenceFlow_0s993e4\">\n        <omgdi:waypoint x=\"876\" y=\"373\" />\n        <omgdi:waypoint x=\"876\" y=\"424\" />\n        <omgdi:waypoint x=\"708\" y=\"424\" />\n        <omgdi:waypoint x=\"708\" y=\"358\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"742\" y=\"403\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_022at7e_di\" bpmnElement=\"SequenceFlow_022at7e\">\n        <omgdi:waypoint x=\"895\" y=\"373\" />\n        <omgdi:waypoint x=\"895\" y=\"453\" />\n        <omgdi:waypoint x=\"644\" y=\"453\" />\n        <omgdi:waypoint x=\"644\" y=\"333\" />\n        <omgdi:waypoint x=\"683\" y=\"333\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"719.5\" y=\"432\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0isa70k_di\" bpmnElement=\"SequenceFlow_0isa70k\">\n        <omgdi:waypoint x=\"708\" y=\"132\" />\n        <omgdi:waypoint x=\"708\" y=\"159\" />\n        <omgdi:waypoint x=\"911\" y=\"159\" />\n        <omgdi:waypoint x=\"911\" y=\"132\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1hp7ppg_di\" bpmnElement=\"SequenceFlow_3\">\n        <omgdi:waypoint x=\"1060\" y=\"132\" />\n        <omgdi:waypoint x=\"1060\" y=\"315\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_167deqo_di\" bpmnElement=\"Flow_167deqo\">\n        <omgdi:waypoint x=\"188\" y=\"560\" />\n        <omgdi:waypoint x=\"402\" y=\"560\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"283\" y=\"542\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"TextAnnotation_1vnawwd_di\" bpmnElement=\"TextAnnotation_1vnawwd\">\n        <omgdc:Bounds x=\"350\" y=\"490\" width=\"100\" height=\"30\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/AdaptiveLabelPositioningBehavior.boundary-events.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.1.0\">\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <task id=\"Task_1\" />\n    <boundaryEvent id=\"BoundaryEvent_1\" attachedToRef=\"Task_1\">\n      <outgoing>SequenceFlow_1</outgoing>\n    </boundaryEvent>\n    <endEvent id=\"EndEvent_1\">\n      <incoming>SequenceFlow_1</incoming>\n    </endEvent>\n    <sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"BoundaryEvent_1\" targetRef=\"EndEvent_1\" />\n    <task id=\"Task_2\" />\n    <boundaryEvent id=\"BoundaryEvent_2\" name=\"foo\" attachedToRef=\"Task_2\" />\n    <endEvent id=\"EndEvent_2\" />\n    <task id=\"Task_3\" />\n    <boundaryEvent id=\"BoundaryEvent_3\" name=\"foo\" attachedToRef=\"Task_3\">\n      <outgoing>SequenceFlow_2</outgoing>\n    </boundaryEvent>\n    <endEvent id=\"EndEvent_3\">\n      <incoming>SequenceFlow_2</incoming>\n    </endEvent>\n    <sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"BoundaryEvent_3\" targetRef=\"EndEvent_3\" />\n    <task id=\"Task_4\" />\n    <boundaryEvent id=\"BoundaryEvent_4\" name=\"\" attachedToRef=\"Task_4\">\n      <outgoing>SequenceFlow_3</outgoing>\n    </boundaryEvent>\n    <endEvent id=\"EndEvent_4\">\n      <incoming>SequenceFlow_3</incoming>\n    </endEvent>\n    <sequenceFlow id=\"SequenceFlow_3\" name=\"\" sourceRef=\"BoundaryEvent_4\" targetRef=\"EndEvent_4\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <omgdc:Bounds x=\"156\" y=\"110\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1_di\" bpmnElement=\"BoundaryEvent_1\">\n        <omgdc:Bounds x=\"168\" y=\"172\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_1_di\" bpmnElement=\"EndEvent_1\">\n        <omgdc:Bounds x=\"318\" y=\"232\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <omgdi:waypoint x=\"186\" y=\"208\" />\n        <omgdi:waypoint x=\"186\" y=\"250\" />\n        <omgdi:waypoint x=\"318\" y=\"250\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <omgdc:Bounds x=\"156\" y=\"300\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_2_di\" bpmnElement=\"BoundaryEvent_2\">\n        <omgdc:Bounds x=\"238\" y=\"322\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"279\" y=\"332\" width=\"16\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_2_di\" bpmnElement=\"EndEvent_2\">\n        <omgdc:Bounds x=\"318\" y=\"422\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_3_di\" bpmnElement=\"Task_3\">\n        <omgdc:Bounds x=\"484\" y=\"110\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_3_di\" bpmnElement=\"BoundaryEvent_3\">\n        <omgdc:Bounds x=\"516\" y=\"172\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"526\" y=\"216\" width=\"16\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_3_di\" bpmnElement=\"EndEvent_3\">\n        <omgdc:Bounds x=\"602\" y=\"252\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_2_di\" bpmnElement=\"SequenceFlow_2\">\n        <omgdi:waypoint x=\"534\" y=\"208\" />\n        <omgdi:waypoint x=\"534\" y=\"270\" />\n        <omgdi:waypoint x=\"602\" y=\"270\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_4_di\" bpmnElement=\"Task_4\">\n        <omgdc:Bounds x=\"484\" y=\"300\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_4_di\" bpmnElement=\"BoundaryEvent_4\">\n        <omgdc:Bounds x=\"466\" y=\"362\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"472\" y=\"332\" width=\"25\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_4_di\" bpmnElement=\"EndEvent_4\">\n        <omgdc:Bounds x=\"552\" y=\"442\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_3_di\" bpmnElement=\"SequenceFlow_3\">\n        <omgdi:waypoint x=\"484\" y=\"398\" />\n        <omgdi:waypoint x=\"484\" y=\"460\" />\n        <omgdi:waypoint x=\"552\" y=\"460\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"490\" y=\"426\" width=\"19\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/AdaptiveLabelPositioningBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport { getOrientation } from 'diagram-js/lib/layout/LayoutUtil';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\nvar testModules = [\n  modelingModule,\n  coreModule\n];\n\nvar ATTACH = { attach: true };\n\n\ndescribe('modeling/behavior - AdaptiveLabelPositioningBehavior', function() {\n\n  function expectLabelOrientation(element, expectedOrientation) {\n\n    var label = element.label;\n\n    // assume\n    expect(label).to.exist;\n\n    // when\n    var orientation = getOrientation(label, element);\n\n    // then\n    expect(orientation).to.eql(expectedOrientation);\n  }\n\n  describe('basics', function() {\n\n    var diagramXML = require('./AdaptiveLabelPositioningBehavior.basics.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    describe('on connect', function() {\n\n      it('should move label from LEFT to TOP', inject(function(elementRegistry, modeling) {\n\n        // given\n        var source = elementRegistry.get('LabelBottom'),\n            target = elementRegistry.get('LabelLeft');\n\n        // when\n        modeling.connect(source, target);\n\n        // then\n        expectLabelOrientation(source, 'bottom');\n        expectLabelOrientation(target, 'top');\n      }));\n\n\n      it('should move label from BOTTOM to TOP', inject(function(elementRegistry, modeling) {\n\n        // given\n        var source = elementRegistry.get('LabelBottom'),\n            target = elementRegistry.get('LabelRight');\n\n        // when\n        modeling.connect(source, target);\n\n        // then\n        expectLabelOrientation(source, 'top');\n        expectLabelOrientation(target, 'right');\n      }));\n\n\n      it('should move label from RIGHT to TOP', inject(function(elementRegistry, modeling) {\n\n        // given\n        var source = elementRegistry.get('LabelRight'),\n            target = elementRegistry.get('LabelTop');\n\n        // when\n        modeling.connect(source, target);\n\n        // then\n        expectLabelOrientation(source, 'top');\n        expectLabelOrientation(target, 'top');\n      }));\n\n\n      it('should move label from TOP to LEFT', inject(function(elementRegistry, modeling) {\n\n        // given\n        var source = elementRegistry.get('LabelTop'),\n            target = elementRegistry.get('LabelLeft');\n\n        // when\n        modeling.connect(source, target);\n\n        // then\n        expectLabelOrientation(source, 'left');\n        expectLabelOrientation(target, 'left');\n      }));\n\n\n      it('should move label from TOP to LEFT (inverse)', inject(function(elementRegistry, modeling) {\n\n        // given\n        var source = elementRegistry.get('LabelLeft'),\n            target = elementRegistry.get('LabelTop');\n\n        // when\n        modeling.connect(source, target);\n\n        // then\n        expectLabelOrientation(target, 'left');\n        expectLabelOrientation(source, 'left');\n      }));\n\n\n      it('should keep unaligned labels AS IS', inject(function(elementRegistry, modeling) {\n\n        // given\n        var source = elementRegistry.get('LabelBottomLeft'),\n            target = elementRegistry.get('LabelTop');\n\n        // when\n        modeling.connect(source, target);\n\n        // then\n        expectLabelOrientation(source, 'bottom');\n        expectLabelOrientation(target, 'top');\n      }));\n\n\n      it('should keep label where it is, if no options', inject(function(elementRegistry, modeling) {\n\n        // given\n        var source = elementRegistry.get('LabelImpossible'),\n            target = elementRegistry.get('Task');\n\n        // when\n        modeling.connect(source, target);\n\n        // then\n        expectLabelOrientation(source, 'right');\n      }));\n\n    });\n\n\n    describe('on reconnect', function() {\n\n      it('should move label from TOP to BOTTOM', inject(function(elementRegistry, modeling) {\n\n        // given\n        var connection = elementRegistry.get('SequenceFlow_1'),\n            source = elementRegistry.get('LabelTop'),\n            target = elementRegistry.get('LabelLeft');\n\n        // when\n        modeling.reconnectEnd(connection, target, { x: target.x + target.width / 2, y: target.y });\n\n        // then\n        expectLabelOrientation(source, 'bottom');\n        expectLabelOrientation(target, 'left');\n      }));\n\n    });\n\n\n    describe('on target move / layout', function() {\n\n      it('should move label from TOP to BOTTOM', inject(function(elementRegistry, modeling) {\n\n        // given\n        var source = elementRegistry.get('LabelTop'),\n            target = elementRegistry.get('LabelBottom_3');\n\n        // when\n        modeling.moveElements([ source ], { x: 0, y: 300 });\n\n        // then\n        expectLabelOrientation(source, 'bottom');\n        expectLabelOrientation(target, 'top');\n      }));\n\n    });\n\n\n    describe('on source move / layout', function() {\n\n      it('should move label from BOTTOM to TOP', inject(\n        function(elementRegistry, modeling) {\n\n          // given\n          var source = elementRegistry.get('LabelTop'),\n              target = elementRegistry.get('LabelBottom_3');\n\n          // when\n          modeling.moveElements([ target ], { x: 20, y: -300 });\n\n          // then\n          expectLabelOrientation(source, 'bottom');\n          expectLabelOrientation(target, 'top');\n        }\n      ));\n\n    });\n\n\n    describe('on annotation move / layout', function() {\n\n      it('should not move label', inject(function(elementRegistry, modeling) {\n\n        // given\n        var source = elementRegistry.get('Flow_167deqo'),\n            target = elementRegistry.get('TextAnnotation_1vnawwd');\n\n        const prevCoordinates = { x: source.x, y: source.y };\n\n        modeling.moveElements([ target ], { x: -110, y: 20 });\n\n        const newCoordinates = { x: source.x, y: source.y };\n\n        // then\n        expect(prevCoordinates).to.eql(newCoordinates);\n      }));\n\n    });\n\n\n    describe('on waypoints update', function() {\n\n      it('should move label from RIGHT to TOP', inject(function(elementRegistry, modeling) {\n\n        // given\n        var connection = elementRegistry.get('SequenceFlow_2'),\n            source = elementRegistry.get('LabelRight'),\n            target = elementRegistry.get('LabelBottom');\n\n        // when\n        modeling.updateWaypoints(connection, [\n          {\n            original: { x: 131, y: 248 },\n            x: 131,\n            y: 248\n          },\n          {\n            x: 250,\n            y: 248\n          },\n          {\n            x: 250,\n            y: 394\n          },\n          {\n            original: { x: 131, y: 394 },\n            x: 131,\n            y: 394\n          },\n        ]);\n\n        // then\n        expectLabelOrientation(source, 'top');\n        expectLabelOrientation(target, 'bottom');\n      }));\n\n    });\n\n\n    describe('on label creation', function() {\n\n      describe('through <element.updateProperties>', function() {\n\n        it('should create label at TOP', inject(\n          function(elementRegistry, modeling) {\n\n            // given\n            var element = elementRegistry.get('NoLabel');\n\n            // when\n            modeling.updateProperties(element, { name: 'FOO BAR' });\n\n            // then\n            expectLabelOrientation(element, 'top');\n          }\n        ));\n\n      });\n\n    });\n\n  });\n\n\n  describe('boundary-events', function() {\n\n    var diagramXML = require('./AdaptiveLabelPositioningBehavior.boundary-events.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n    describe('on boundary label creation', function() {\n\n      it('should NOT create label onto host', inject(\n        function(elementRegistry, modeling) {\n\n          // given\n          var element = elementRegistry.get('BoundaryEvent_1');\n\n          // when\n          modeling.updateProperties(element, { name: 'FOO BAR' });\n\n          // then\n          expectLabelOrientation(element, 'bottom');\n        }\n      ));\n\n\n      it('should create label to the left', inject(\n        function(elementRegistry, modeling) {\n\n          // given\n          var element = elementRegistry.get('BoundaryEvent_4');\n\n          // when\n          modeling.updateProperties(element, { name: 'FOO BAR' });\n\n          // then\n          expectLabelOrientation(element, 'left');\n        }\n      ));\n\n    });\n\n\n    describe('on connect', function() {\n\n      it('should keep label where it is if no better position', inject(\n        function(elementRegistry, modeling) {\n\n          // given\n          var source = elementRegistry.get('BoundaryEvent_2'),\n              target = elementRegistry.get('EndEvent_2');\n\n          // when\n          modeling.connect(source, target);\n\n          // then\n          expectLabelOrientation(source, 'right');\n        }\n      ));\n\n    });\n\n\n    describe('on reconnect', function() {\n\n      it('should keep label where it is if no better position', inject(\n        function(elementRegistry, modeling) {\n\n          // given\n          var source = elementRegistry.get('BoundaryEvent_3'),\n              target = elementRegistry.get('EndEvent_1'),\n              connection = elementRegistry.get('SequenceFlow_2');\n\n          // when\n          modeling.reconnectEnd(connection, target, { x: target.x + target.width / 2, y: target.y });\n\n          // then\n          expectLabelOrientation(source, 'bottom');\n        }\n      ));\n\n    });\n\n\n    describe('on boundary move', function() {\n\n      it('should move label to the left', inject(\n        function(elementRegistry, modeling) {\n\n          // given\n          var element = elementRegistry.get('BoundaryEvent_3'),\n              host = elementRegistry.get('Task_3');\n\n          // when\n          modeling.moveElements([ element ], { x: -50, y: -50 }, host, ATTACH);\n\n          // then\n          expectLabelOrientation(element, 'left');\n        }\n      ));\n\n\n      it('should move label to the top', inject(\n        function(elementRegistry, modeling) {\n\n          // given\n          var element = elementRegistry.get('BoundaryEvent_3'),\n              host = elementRegistry.get('Task_3');\n\n          // when\n          modeling.moveElements([ element ], { x: 50, y: -80 }, host, ATTACH); // top-right corner\n\n          // then\n          expectLabelOrientation(element, 'top');\n        }\n      ));\n\n    });\n\n  });\n\n\n  describe('integration', function() {\n\n    describe('copy and paste', function() {\n\n      var diagramXML = require('./AdaptiveLabelPositioningBehavior.basics.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, {\n        modules: testModules\n      }));\n\n\n      it('should NOT adjust on paste', inject(\n        function(canvas, copyPaste, elementRegistry, modeling) {\n\n          // given\n          var exclusiveGateway = elementRegistry.get('ExclusiveGateway_1'),\n              endEvent = elementRegistry.get('EndEvent_1');\n\n          var moveShapeSpy = sinon.spy(modeling, 'moveShape');\n\n          // when\n          copyPaste.copy([ exclusiveGateway, endEvent ]);\n\n          copyPaste.paste({\n            element: canvas.getRootElement(),\n            point: {\n              x: 1000,\n              y: 1000\n            }\n          });\n\n          // then\n          expect(moveShapeSpy).not.to.have.been.called;\n        })\n      );\n\n    });\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/AssociationBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_0jqn0aw\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.3.5\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <bpmn:startEvent id=\"StartEvent_1\" />\n      <bpmn:textAnnotation id=\"TextAnnotation_1\" />\n      <bpmn:association id=\"Association_1\" sourceRef=\"StartEvent_1\" targetRef=\"TextAnnotation_1\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_1mgowm5_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"-15\" y=\"130\" width=\"230\" height=\"120\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1k5d2l6_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"7\" y=\"172\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_0o5s7yu_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"85\" y=\"175\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_0chc4mv_di\" bpmnElement=\"Association_1\">\n        <di:waypoint x=\"43\" y=\"190\" />\n        <di:waypoint x=\"85\" y=\"190\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/AssociationBehaviorSpec.js",
    "content": "import {\r\n  bootstrapModeler,\r\n  inject\r\n} from 'test/TestHelper';\r\n\r\nimport modelingModule from 'lib/features/modeling';\r\n\r\n\r\ndescribe('modeling/behavior - AssociationBehavior', function() {\r\n\r\n  var diagramXML = require('./AssociationBehavior.bpmn');\r\n\r\n  beforeEach(bootstrapModeler(diagramXML, { modules: modelingModule }));\r\n\r\n\r\n  it('should move to new parent on source move', inject(function(modeling, elementRegistry) {\r\n\r\n    // given\r\n    var association = elementRegistry.get('Association_1'),\r\n        process = elementRegistry.get('Process_1'),\r\n        startEvent = elementRegistry.get('StartEvent_1');\r\n\r\n    // when\r\n    modeling.moveElements([ startEvent ], { x: 100, y: 100 }, process);\r\n\r\n    // then\r\n    expect(association.parent).to.equal(process);\r\n  }));\r\n\r\n\r\n  it('should move to new parent on target move', inject(function(modeling, elementRegistry) {\r\n\r\n    // given\r\n    var association = elementRegistry.get('Association_1'),\r\n        process = elementRegistry.get('Process_1'),\r\n        textAnnotation = elementRegistry.get('TextAnnotation_1');\r\n\r\n    // when\r\n    modeling.moveElements([ textAnnotation ], { x: 100, y: 100 }, process);\r\n\r\n    // then\r\n    expect(association.parent).to.equal(process);\r\n  }));\r\n\r\n});"
  },
  {
    "path": "test/spec/features/modeling/behavior/AttachEventBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_0mwxlvp\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.3.5\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:intermediateThrowEvent id=\"IntermediateThrowEvent_1\" name=\"foo\">\n      <bpmn:documentation>bar</bpmn:documentation>\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n    </bpmn:intermediateThrowEvent>\n    <bpmn:task id=\"Task_1\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"IntermediateThrowEvent_1\" targetRef=\"Task_1\" />\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"IntermediateThrowEvent_1\" />\n    <bpmn:intermediateCatchEvent id=\"ConditionalCatchEvent\">\n      <bpmn:conditionalEventDefinition>\n        <bpmn:condition xsi:type=\"bpmn:tFormalExpression\" />\n      </bpmn:conditionalEventDefinition>\n    </bpmn:intermediateCatchEvent>\n    <bpmn:intermediateCatchEvent id=\"MessageCatchEvent\">\n      <bpmn:messageEventDefinition />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:intermediateCatchEvent id=\"SignalCatchEvent\">\n      <bpmn:signalEventDefinition />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:intermediateCatchEvent id=\"TimerCatchEvent\">\n      <bpmn:timerEventDefinition />\n    </bpmn:intermediateCatchEvent>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_0zpvfc7_di\" bpmnElement=\"IntermediateThrowEvent_1\">\n        <dc:Bounds x=\"182\" y=\"82\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"192\" y=\"125\" width=\"16\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_06yfm3r_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"250\" y=\"60\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1tkizp1_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint x=\"218\" y=\"100\" />\n        <di:waypoint x=\"250\" y=\"100\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"StartEvent_1s1jnio_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"82\" y=\"82\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_139qjys_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"118\" y=\"100\" />\n        <di:waypoint x=\"182\" y=\"100\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_0bwzxs9_di\" bpmnElement=\"ConditionalCatchEvent\">\n        <dc:Bounds x=\"82\" y=\"182\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_1rlh3w8_di\" bpmnElement=\"MessageCatchEvent\">\n        <dc:Bounds x=\"132\" y=\"182\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_0o6ghdv_di\" bpmnElement=\"SignalCatchEvent\">\n        <dc:Bounds x=\"82\" y=\"232\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_054kymd_di\" bpmnElement=\"TimerCatchEvent\">\n        <dc:Bounds x=\"132\" y=\"232\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/AttachEventBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\n\nimport { getBusinessObject } from '../../../../../lib/util/ModelUtil';\n\n\ndescribe('features/modeling/behavior - attach events', function() {\n\n  var testModules = [\n    coreModule,\n    modelingModule\n  ];\n\n  var attachEventBehaviorXML = require('./AttachEventBehavior.bpmn');\n\n  beforeEach(bootstrapModeler(attachEventBehaviorXML, { modules: testModules }));\n\n\n  describe('basics', function() {\n\n    describe('create', function() {\n\n      it('should replace', inject(function(elementFactory, elementRegistry, modeling) {\n\n        // given\n        var task = elementRegistry.get('Task_1'),\n            taskBo = getBusinessObject(task),\n            intermediateEvent = elementFactory.createShape({ type: 'bpmn:IntermediateThrowEvent' });\n\n        // when\n        var boundaryEvent = modeling.createElements(\n          [ intermediateEvent ], { x: 300, y: 140 }, task, { attach: true }\n        )[0];\n\n        // then\n        var boundaryEventBo = getBusinessObject(boundaryEvent);\n\n        expect(boundaryEventBo.$type).to.equal('bpmn:BoundaryEvent');\n        expect(boundaryEventBo.attachedToRef).to.equal(taskBo);\n      }));\n\n\n      it('should NOT replace', inject(function(elementFactory, elementRegistry, modeling) {\n\n        // given\n        var process = elementRegistry.get('Process_1'),\n            intermediateEvent = elementFactory.createShape({ type: 'bpmn:IntermediateThrowEvent' });\n\n        // when\n        intermediateEvent = modeling.createElements([ intermediateEvent ], { x: 300, y: 240 }, process)[0];\n\n        // then\n        var intermediateEventBo = getBusinessObject(intermediateEvent);\n\n        expect(intermediateEventBo.$type).to.equal('bpmn:IntermediateThrowEvent');\n        expect(intermediateEventBo.attachedToRef).not.to.exist;\n      }));\n\n\n      it('should copy properties', inject(\n        function(bpmnFactory, elementFactory, elementRegistry, modeling) {\n\n          // given\n          var task = elementRegistry.get('Task_1');\n\n          var intermediateThrowEventBo = bpmnFactory.create('bpmn:IntermediateThrowEvent', {\n            name: 'foo'\n          });\n\n          var documentation = bpmnFactory.create('bpmn:Documentation', {\n            text: 'bar'\n          });\n\n          intermediateThrowEventBo.documentation = [ documentation ];\n\n          documentation.$parent = intermediateThrowEventBo;\n\n          var intermediateThrowEvent = elementFactory.createShape({\n            type: 'bpmn:IntermediateThrowEvent',\n            businessObject: intermediateThrowEventBo\n          });\n\n          // when\n          var boundaryEvent = modeling.createElements(\n            [ intermediateThrowEvent ], { x: 300, y: 140 }, task, { attach: true }\n          )[0];\n\n          // then\n          var boundaryEventBo = getBusinessObject(boundaryEvent);\n\n          expect(boundaryEventBo.name).to.equal('foo');\n          expect(boundaryEventBo.documentation).to.have.lengthOf(1);\n          expect(boundaryEventBo.documentation[0].text).to.equal('bar');\n        }\n      ));\n\n    });\n\n\n    describe('move', function() {\n\n      it('should replace', inject(function(elementRegistry, modeling) {\n\n        // given\n        var task = elementRegistry.get('Task_1'),\n            taskBo = getBusinessObject(task),\n            intermediateThrowEvent = elementRegistry.get('IntermediateThrowEvent_1');\n\n        // when\n        modeling.moveElements([ intermediateThrowEvent ], { x: 100, y: 40 }, task, { attach: true });\n\n        // then\n        var boundaryEvent = elementRegistry.get('IntermediateThrowEvent_1'),\n            boundaryEventBo = getBusinessObject(boundaryEvent);\n\n        expect(boundaryEvent).to.exist;\n        expect(boundaryEventBo.$type).to.equal('bpmn:BoundaryEvent');\n        expect(boundaryEventBo.attachedToRef).to.equal(taskBo);\n      }));\n\n\n      it('should NOT replace', inject(function(elementRegistry, modeling) {\n\n        // given\n        var process = elementRegistry.get('Process_1'),\n            intermediateThrowEvent = elementRegistry.get('IntermediateThrowEvent_1'),\n            intermediateThrowEventBo = getBusinessObject(intermediateThrowEvent);\n\n        // when\n        modeling.moveElements([ intermediateThrowEvent ], { x: 100, y: 100 }, process);\n\n        // then\n        expect(intermediateThrowEvent).to.exist;\n        expect(intermediateThrowEventBo.$type).to.equal('bpmn:IntermediateThrowEvent');\n        expect(intermediateThrowEventBo.attachedToRef).not.to.exist;\n      }));\n\n\n      describe('properties', function() {\n\n        it('should copy properties', inject(function(elementRegistry, modeling) {\n\n          // given\n          var task = elementRegistry.get('Task_1'),\n              intermediateThrowEvent = elementRegistry.get('IntermediateThrowEvent_1');\n\n          // when\n          modeling.moveElements([ intermediateThrowEvent ], { x: 100, y: 40 }, task, { attach: true });\n\n          // then\n          var boundaryEvent = elementRegistry.get('IntermediateThrowEvent_1'),\n              boundaryEventBo = getBusinessObject(boundaryEvent);\n\n          expect(boundaryEventBo.name).to.equal('foo');\n          expect(boundaryEventBo.documentation).to.have.lengthOf(1);\n          expect(boundaryEventBo.documentation[0].text).to.equal('bar');\n        }));\n\n\n        describe('event definitions', function() {\n\n          var ids = [\n            'ConditionalCatchEvent',\n            'IntermediateThrowEvent_1',\n            'MessageCatchEvent',\n            'SignalCatchEvent',\n            'TimerCatchEvent',\n          ];\n\n          function getDelta(element, task) {\n            return {\n              x: task.x + task.width / 2 - element.x - element.width / 2,\n              y: task.y + task.height - element.y - element.height / 2\n            };\n          }\n\n          ids.forEach(function(id) {\n\n            it('should copy event definition ' + id, inject(function(elementRegistry, modeling) {\n\n              // given\n              var element = elementRegistry.get(id),\n                  elementBo = getBusinessObject(element),\n                  eventDefinitions = elementBo.get('eventDefinitions'),\n                  task = elementRegistry.get('Task_1');\n\n              // when\n              modeling.moveElements([ element ], getDelta(element, task), task, { attach: true });\n\n              // then\n              var boundaryEvent = elementRegistry.get(id),\n                  boundaryEventBo = getBusinessObject(boundaryEvent);\n\n              expect(boundaryEventBo.$type).to.equal('bpmn:BoundaryEvent');\n              expect(boundaryEventBo.eventDefinitions).to.jsonEqual(eventDefinitions, skipId);\n            }));\n\n          });\n\n        });\n\n      });\n\n    });\n\n  });\n\n\n  describe('connections', function() {\n\n    it('should remove incoming connection', inject(function(elementRegistry, modeling) {\n\n      // given\n      var intermediateThrowEvent = elementRegistry.get('IntermediateThrowEvent_1'),\n          startEvent = elementRegistry.get('StartEvent_1'),\n          task = elementRegistry.get('Task_1');\n\n      // when\n      modeling.moveElements([ intermediateThrowEvent ], { x: 100, y: 40 }, task, { attach: true });\n\n      // then\n      var boundaryEvent = elementRegistry.get('IntermediateThrowEvent_1');\n\n      expect(boundaryEvent.incoming).to.have.lengthOf(0);\n      expect(startEvent.outgoing).to.have.lengthOf(0);\n    }));\n\n\n    it('should NOT remove outgoing connection', inject(function(elementRegistry, modeling) {\n\n      // given\n      var intermediateThrowEvent = elementRegistry.get('IntermediateThrowEvent_1'),\n          task = elementRegistry.get('Task_1');\n\n      // when\n      modeling.moveElements([ intermediateThrowEvent ], { x: 100, y: 40 }, task, { attach: true });\n\n      // then\n      var boundaryEvent = elementRegistry.get('IntermediateThrowEvent_1');\n\n      expect(boundaryEvent.outgoing).to.have.lengthOf(1);\n      expect(task.incoming).to.have.lengthOf(1);\n    }));\n\n\n    it('should lay out connection once', inject(function(elementRegistry, eventBus, modeling) {\n\n      // given\n      var intermediateThrowEvent = elementRegistry.get('IntermediateThrowEvent_1'),\n          task = elementRegistry.get('Task_1');\n\n      var layoutSpy = sinon.spy();\n\n      eventBus.on('commandStack.connection.layout.execute', layoutSpy);\n\n      // when\n      modeling.moveElements([ intermediateThrowEvent ], { x: 100, y: 40 }, task, { attach: true });\n\n      // then\n      expect(layoutSpy).to.be.calledOnce;\n    }));\n\n  });\n\n});\n\n\n\n// helpers //////////\nfunction skipId(key, value) {\n  if (key === 'id') {\n    return;\n  }\n\n  return value;\n}\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/BoundaryEvent.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1ipuizk\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.7.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:eventBasedGateway id=\"EventBasedGateway_1\" />\n    <bpmn:receiveTask id=\"ReceiveTask_1\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_1\" attachedToRef=\"ReceiveTask_1\" />\n    <bpmn:exclusiveGateway id=\"ExclusiveGateway_1\" />\n    <bpmn:task id=\"Task_2\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_2\" attachedToRef=\"Task_2\">\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_1\" messageRef=\"Message_1\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundaryEvent_3\" attachedToRef=\"Task_2\">\n      <bpmn:escalationEventDefinition id=\"EscalationEventDefinition_1\" escalationRef=\"Escalation_1\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundaryEvent_4\" attachedToRef=\"Task_2\">\n      <bpmn:errorEventDefinition id=\"ErrorEventDefinition_1\" errorRef=\"Error_1\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundaryEvent_5\" attachedToRef=\"Task_2\">\n      <bpmn:signalEventDefinition id=\"SignalEventDefinition_1\" signalRef=\"Signal_1\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundaryEvent_6\" cancelActivity=\"false\" attachedToRef=\"Task_2\">\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_05x99ob\" messageRef=\"Message_1\" />\n    </bpmn:boundaryEvent>\n  </bpmn:process>\n  <bpmn:message id=\"Message_1\" name=\"Message_1\" />\n  <bpmn:escalation id=\"Escalation_1\" name=\"Escalation_1\" />\n  <bpmn:error id=\"Error_1\" name=\"Error_1\" />\n  <bpmn:signal id=\"Signal_1\" name=\"Signal_1\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"EventBasedGateway_1cu8t9h_di\" bpmnElement=\"EventBasedGateway_1\">\n        <dc:Bounds x=\"172\" y=\"118\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ReceiveTask_1vk05s6_di\" bpmnElement=\"ReceiveTask_1\">\n        <dc:Bounds x=\"300\" y=\"103\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_1qf26hs_di\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"172\" y=\"221\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_083btya_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"450\" y=\"103\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0ti3ldv_di\" bpmnElement=\"BoundaryEvent_5\">\n        <dc:Bounds x=\"532\" y=\"85\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0yced78_di\" bpmnElement=\"BoundaryEvent_4\">\n        <dc:Bounds x=\"532\" y=\"165\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1v79yci_di\" bpmnElement=\"BoundaryEvent_3\">\n        <dc:Bounds x=\"482\" y=\"165\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0dw2m3x_di\" bpmnElement=\"BoundaryEvent_2\">\n        <dc:Bounds x=\"432\" y=\"165\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_0xg8xmx_di\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds x=\"331\" y=\"165\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0gfnflr_di\" bpmnElement=\"BoundaryEvent_6\">\n        <dc:Bounds x=\"432\" y=\"85\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/BoundaryEventBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\nimport { is } from 'lib/util/ModelUtil';\n\n\ndescribe('features/modeling/behavior - boundary event', function() {\n\n  var testModules = [ coreModule, modelingModule ];\n\n  var diagramXML = require('./BoundaryEvent.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  describe('should implicitly remove boundary events', function() {\n\n    it('after connecting to event-based gateway',\n      inject(function(modeling, elementRegistry) {\n\n        // given\n        var eventBasedGateway = elementRegistry.get('EventBasedGateway_1'),\n            receiveTask = elementRegistry.get('ReceiveTask_1'),\n            boundaryEvent = elementRegistry.get('BoundaryEvent_1');\n\n        // when\n        modeling.connect(eventBasedGateway, receiveTask, {\n          type: 'bpmn:SequenceFlow'\n        });\n\n        // then\n        expect(elementRegistry.get(boundaryEvent.id)).not.to.exist;\n      })\n    );\n\n\n    it('after replacing connected gateway with event-based gateway',\n      inject(function(modeling, elementRegistry, bpmnReplace) {\n\n        // given\n        var gateway = elementRegistry.get('ExclusiveGateway_1'),\n            receiveTask = elementRegistry.get('ReceiveTask_1'),\n            boundaryEvent = elementRegistry.get('BoundaryEvent_1');\n\n        modeling.connect(gateway, receiveTask, {\n          type: 'bpmn:SequenceFlow'\n        });\n\n        // when\n        bpmnReplace.replaceElement(gateway, {\n          type: 'bpmn:EventBasedGateway'\n        });\n\n        // then\n        expect(elementRegistry.get(boundaryEvent.id)).not.to.exist;\n      })\n    );\n\n  });\n\n\n  describe('should keep root element reference on replace', function() {\n\n    describe('interrupting to non-interrupting', function() {\n\n      it('message reference', inject(function(bpmnReplace, elementRegistry) {\n\n        // given\n        var interruptingBoundaryEvent = elementRegistry.get('BoundaryEvent_2'),\n            message = getReferencedRootElement(interruptingBoundaryEvent, 'messageRef');\n\n        // assume\n        expect(is(message, 'bpmn:Message')).to.be.true;\n\n        // when\n        var nonInterruptingBoundaryEvent = bpmnReplace.replaceElement(interruptingBoundaryEvent, {\n          type: 'bpmn:BoundaryEvent',\n          eventDefinitionType: 'bpmn:MessageEventDefinition',\n          cancelActivity: false\n        });\n\n        // then\n        expect(getReferencedRootElement(nonInterruptingBoundaryEvent, 'messageRef')).to.equal(message);\n      }));\n\n\n      it('escalation reference', inject(function(bpmnReplace, elementRegistry) {\n\n        // given\n        var interruptingBoundaryEvent = elementRegistry.get('BoundaryEvent_3'),\n            escalation = getReferencedRootElement(interruptingBoundaryEvent, 'escalationRef');\n\n        // assume\n        expect(is(escalation, 'bpmn:Escalation')).to.be.true;\n\n        // when\n        var nonInterruptingBoundaryEvent = bpmnReplace.replaceElement(interruptingBoundaryEvent, {\n          type: 'bpmn:BoundaryEvent',\n          eventDefinitionType: 'bpmn:EscalationEventDefinition',\n          cancelActivity: false\n        });\n\n        // then\n        expect(getReferencedRootElement(nonInterruptingBoundaryEvent, 'escalationRef')).to.equal(escalation);\n      }));\n\n\n      it('error reference', inject(function(bpmnReplace, elementRegistry) {\n\n        // given\n        var interruptingBoundaryEvent = elementRegistry.get('BoundaryEvent_4'),\n            error = getReferencedRootElement(interruptingBoundaryEvent, 'errorRef');\n\n        // assume\n        expect(is(error, 'bpmn:Error')).to.be.true;\n\n        // when\n        var nonInterruptingBoundaryEvent = bpmnReplace.replaceElement(interruptingBoundaryEvent, {\n          type: 'bpmn:BoundaryEvent',\n          eventDefinitionType: 'bpmn:ErrorEventDefinition',\n          cancelActivity: false\n        });\n\n        // then\n        expect(getReferencedRootElement(nonInterruptingBoundaryEvent, 'errorRef')).to.equal(error);\n      }));\n\n\n      it('signal reference', inject(function(bpmnReplace, elementRegistry) {\n\n        // given\n        var interruptingBoundaryEvent = elementRegistry.get('BoundaryEvent_5'),\n            signal = getReferencedRootElement(interruptingBoundaryEvent, 'signalRef');\n\n        // assume\n        expect(is(signal, 'bpmn:Signal')).to.be.true;\n\n        // when\n        var nonInterruptingBoundaryEvent = bpmnReplace.replaceElement(interruptingBoundaryEvent, {\n          type: 'bpmn:BoundaryEvent',\n          eventDefinitionType: 'bpmn:SignalEventDefinition',\n          cancelActivity: false\n        });\n\n        // then\n        expect(getReferencedRootElement(nonInterruptingBoundaryEvent, 'signalRef')).to.equal(signal);\n      }));\n\n    });\n\n\n    describe('non-interrupting to interrupting', function() {\n\n      it('message reference', inject(function(bpmnReplace, elementRegistry) {\n\n        // given\n        var interruptingBoundaryEvent = elementRegistry.get('BoundaryEvent_6'),\n            message = getReferencedRootElement(interruptingBoundaryEvent, 'messageRef');\n\n        // assume\n        expect(is(message, 'bpmn:Message')).to.be.true;\n\n        // when\n        var nonInterruptingBoundaryEvent = bpmnReplace.replaceElement(interruptingBoundaryEvent, {\n          type: 'bpmn:BoundaryEvent',\n          eventDefinitionType: 'bpmn:MessageEventDefinition',\n          cancelActivity: true\n        });\n\n        // then\n        expect(getReferencedRootElement(nonInterruptingBoundaryEvent, 'messageRef')).to.equal(message);\n      }));\n\n    });\n\n  });\n\n});\n\n\n// helpers //////////\n\nfunction getReferencedRootElement(element, propertyName) {\n  var businessObject = element.businessObject,\n      eventDefinition = businessObject.eventDefinitions[ 0 ];\n\n  return eventDefinition.get(propertyName);\n}"
  },
  {
    "path": "test/spec/features/modeling/behavior/CompensateBoundaryEventBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.16.0\">\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <task id=\"Task_BoundaryEvent\" />\n    <boundaryEvent id=\"Attached_Event\" attachedToRef=\"Task_BoundaryEvent\">\n      <compensateEventDefinition id=\"CompensateEventDefinition_1v5ffnt\" />\n    </boundaryEvent>\n    <task id=\"Task\" />\n    <task id=\"Task_BoundaryEvent2\" />\n    <boundaryEvent id=\"Attached_Event2\" attachedToRef=\"Task_BoundaryEvent2\">\n      <compensateEventDefinition id=\"CompensateEventDefinition_0o69h2g\" />\n    </boundaryEvent>\n    <task id=\"Task_Compensation\" isForCompensation=\"true\" />\n    <boundaryEvent id=\"NoneEvent\" attachedToRef=\"Task\">\n      <outgoing>NoneFlow</outgoing>\n    </boundaryEvent>\n    <task id=\"NoneActivity\">\n      <incoming>NoneFlow</incoming>\n    </task>\n    <sequenceFlow id=\"NoneFlow\" sourceRef=\"NoneEvent\" targetRef=\"NoneActivity\" />\n    <task id=\"Task_DisallowedConnections\">\n      <incoming>Flow_1czca1o</incoming>\n      <outgoing>Flow_0ma72c1</outgoing>\n    </task>\n    <task id=\"Activity_1rlhhtg\">\n      <incoming>Flow_0ma72c1</incoming>\n    </task>\n    <sequenceFlow id=\"Flow_0ma72c1\" sourceRef=\"Task_DisallowedConnections\" targetRef=\"Activity_1rlhhtg\" />\n    <task id=\"AnotherTask\">\n      <outgoing>Flow_1czca1o</outgoing>\n    </task>\n    <sequenceFlow id=\"Flow_1czca1o\" sourceRef=\"AnotherTask\" targetRef=\"Task_DisallowedConnections\" />\n    <task id=\"Activity_0ibho72\" />\n    <boundaryEvent id=\"MultiOutgoing\" attachedToRef=\"Activity_0ibho72\">\n      <outgoing>Flow_1t3tgme</outgoing>\n      <outgoing>Flow_19nk7s2</outgoing>\n    </boundaryEvent>\n    <task id=\"Activity_1sjlobf\">\n      <incoming>Flow_1t3tgme</incoming>\n    </task>\n    <sequenceFlow id=\"Flow_1t3tgme\" sourceRef=\"MultiOutgoing\" targetRef=\"Activity_1sjlobf\" />\n    <task id=\"Activity_149asug\">\n      <incoming>Flow_19nk7s2</incoming>\n    </task>\n    <sequenceFlow id=\"Flow_19nk7s2\" sourceRef=\"MultiOutgoing\" targetRef=\"Activity_149asug\" />\n    <task id=\"Activity_0dkj3us\">\n      <incoming>Flow_0d1dx68</incoming>\n    </task>\n    <task id=\"Activity_1q2gv8y\">\n      <incoming>Flow_158hpoy</incoming>\n    </task>\n    <boundaryEvent id=\"NoneBoundary\" attachedToRef=\"Activity_0dkj3us\" />\n    <boundaryEvent id=\"Event_1m90p7s\" attachedToRef=\"Activity_1q2gv8y\" />\n    <task id=\"Activity_1fbtvut\" />\n    <boundaryEvent id=\"MultiBoundary\" attachedToRef=\"Activity_1fbtvut\">\n      <outgoing>Flow_0d1dx68</outgoing>\n      <outgoing>Flow_158hpoy</outgoing>\n    </boundaryEvent>\n    <sequenceFlow id=\"Flow_0d1dx68\" sourceRef=\"MultiBoundary\" targetRef=\"Activity_0dkj3us\" />\n    <sequenceFlow id=\"Flow_158hpoy\" sourceRef=\"MultiBoundary\" targetRef=\"Activity_1q2gv8y\" />\n    <task id=\"Activity_0sbck8k\">\n      <outgoing>Flow_1s3u9a0</outgoing>\n    </task>\n    <task id=\"Activity_1f3e3e6\">\n      <incoming>Flow_1s3u9a0</incoming>\n    </task>\n    <sequenceFlow id=\"Flow_1s3u9a0\" sourceRef=\"Activity_0sbck8k\" targetRef=\"Activity_1f3e3e6\" />\n    <task id=\"Activity_071lyub\" isForCompensation=\"true\" />\n    <boundaryEvent id=\"ReplacedEvent\" attachedToRef=\"Activity_0sbck8k\">\n      <compensateEventDefinition id=\"CompensateEventDefinition_11hjmro\" />\n    </boundaryEvent>\n    <boundaryEvent id=\"Event_1ubalz4\" attachedToRef=\"Activity_1f3e3e6\">\n      <compensateEventDefinition id=\"CompensateEventDefinition_0ghxz8p\" />\n    </boundaryEvent>\n    <association id=\"Association\" associationDirection=\"One\" sourceRef=\"Attached_Event2\" targetRef=\"Task_Compensation\" />\n    <association id=\"Association_13lquwg\" associationDirection=\"One\" sourceRef=\"ReplacedEvent\" targetRef=\"Activity_071lyub\" />\n    <association id=\"Association_0czy2jf\" associationDirection=\"One\" sourceRef=\"Event_1ubalz4\" targetRef=\"Activity_071lyub\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Activity_0ne36hy_di\" bpmnElement=\"Task_BoundaryEvent\">\n        <omgdc:Bounds x=\"200\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0l16eqc_di\" bpmnElement=\"Task\">\n        <omgdc:Bounds x=\"360\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_14r8htx\" bpmnElement=\"Task_BoundaryEvent2\">\n        <omgdc:Bounds x=\"210\" y=\"270\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0asoxmo_di\" bpmnElement=\"Task_Compensation\">\n        <omgdc:Bounds x=\"320\" y=\"390\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0g6v5lh_di\" bpmnElement=\"NoneActivity\">\n        <omgdc:Bounds x=\"470\" y=\"200\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1h9z7j0_di\" bpmnElement=\"Task_DisallowedConnections\">\n        <omgdc:Bounds x=\"360\" y=\"510\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1rlhhtg_di\" bpmnElement=\"Activity_1rlhhtg\">\n        <omgdc:Bounds x=\"510\" y=\"510\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0kxxkvc_di\" bpmnElement=\"AnotherTask\">\n        <omgdc:Bounds x=\"220\" y=\"510\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0ibho72_di\" bpmnElement=\"Activity_0ibho72\">\n        <omgdc:Bounds x=\"210\" y=\"650\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1sjlobf_di\" bpmnElement=\"Activity_1sjlobf\">\n        <omgdc:Bounds x=\"340\" y=\"770\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_149asug_di\" bpmnElement=\"Activity_149asug\">\n        <omgdc:Bounds x=\"340\" y=\"880\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0dkj3us_di\" bpmnElement=\"Activity_0dkj3us\">\n        <omgdc:Bounds x=\"750\" y=\"390\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1q2gv8y_di\" bpmnElement=\"Activity_1q2gv8y\">\n        <omgdc:Bounds x=\"750\" y=\"270\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1fbtvut_di\" bpmnElement=\"Activity_1fbtvut\">\n        <omgdc:Bounds x=\"680\" y=\"120\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0sbck8k_di\" bpmnElement=\"Activity_0sbck8k\">\n        <omgdc:Bounds x=\"580\" y=\"650\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1f3e3e6_di\" bpmnElement=\"Activity_1f3e3e6\">\n        <omgdc:Bounds x=\"730\" y=\"650\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_071lyub_di\" bpmnElement=\"Activity_071lyub\">\n        <omgdc:Bounds x=\"650\" y=\"820\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_0czy2jf_di\" bpmnElement=\"Association_0czy2jf\">\n        <di:waypoint x=\"780\" y=\"748\" />\n        <di:waypoint x=\"780\" y=\"860\" />\n        <di:waypoint x=\"750\" y=\"860\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Association_13lquwg_di\" bpmnElement=\"Association_13lquwg\">\n        <di:waypoint x=\"630\" y=\"748\" />\n        <di:waypoint x=\"630\" y=\"860\" />\n        <di:waypoint x=\"650\" y=\"860\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Event_14tuun3_di\" bpmnElement=\"MultiBoundary\">\n        <omgdc:Bounds x=\"712\" y=\"182\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0rya4gs_di\" bpmnElement=\"Event_1m90p7s\">\n        <omgdc:Bounds x=\"782\" y=\"332\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1be5877_di\" bpmnElement=\"NoneBoundary\">\n        <omgdc:Bounds x=\"782\" y=\"452\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0t975p5_di\" bpmnElement=\"MultiOutgoing\">\n        <omgdc:Bounds x=\"252\" y=\"712\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1vbtjp9_di\" bpmnElement=\"NoneEvent\">\n        <omgdc:Bounds x=\"382\" y=\"142\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0lrjsju\" bpmnElement=\"Attached_Event2\">\n        <omgdc:Bounds x=\"232\" y=\"332\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_12wgrmv_di\" bpmnElement=\"Attached_Event\">\n        <omgdc:Bounds x=\"222\" y=\"142\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0ft2vy5_di\" bpmnElement=\"Event_1ubalz4\">\n        <omgdc:Bounds x=\"762\" y=\"712\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0m2fqbk_di\" bpmnElement=\"ReplacedEvent\">\n        <omgdc:Bounds x=\"612\" y=\"712\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_0aguggf_di\" bpmnElement=\"NoneFlow\">\n        <di:waypoint x=\"400\" y=\"178\" />\n        <di:waypoint x=\"400\" y=\"240\" />\n        <di:waypoint x=\"470\" y=\"240\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0ma72c1_di\" bpmnElement=\"Flow_0ma72c1\">\n        <di:waypoint x=\"460\" y=\"550\" />\n        <di:waypoint x=\"510\" y=\"550\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1czca1o_di\" bpmnElement=\"Flow_1czca1o\">\n        <di:waypoint x=\"320\" y=\"550\" />\n        <di:waypoint x=\"360\" y=\"550\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1t3tgme_di\" bpmnElement=\"Flow_1t3tgme\">\n        <di:waypoint x=\"270\" y=\"748\" />\n        <di:waypoint x=\"270\" y=\"810\" />\n        <di:waypoint x=\"340\" y=\"810\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_19nk7s2_di\" bpmnElement=\"Flow_19nk7s2\">\n        <di:waypoint x=\"270\" y=\"748\" />\n        <di:waypoint x=\"270\" y=\"920\" />\n        <di:waypoint x=\"340\" y=\"920\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0d1dx68_di\" bpmnElement=\"Flow_0d1dx68\">\n        <di:waypoint x=\"730\" y=\"218\" />\n        <di:waypoint x=\"730\" y=\"430\" />\n        <di:waypoint x=\"750\" y=\"430\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_158hpoy_di\" bpmnElement=\"Flow_158hpoy\">\n        <di:waypoint x=\"730\" y=\"218\" />\n        <di:waypoint x=\"730\" y=\"310\" />\n        <di:waypoint x=\"750\" y=\"310\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Association_di\" bpmnElement=\"Association\">\n        <di:waypoint x=\"250\" y=\"368\" />\n        <di:waypoint x=\"250\" y=\"430\" />\n        <di:waypoint x=\"320\" y=\"430\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1s3u9a0_di\" bpmnElement=\"Flow_1s3u9a0\">\n        <di:waypoint x=\"680\" y=\"690\" />\n        <di:waypoint x=\"730\" y=\"690\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/CompensateBoundaryEventBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport { is } from 'lib/util/ModelUtil';\n\nimport copyPasteModule from 'lib/features/copy-paste';\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\n\nimport diagramXML from './CompensateBoundaryEventBehavior.bpmn';\n\n\ndescribe('features/modeling/behavior - compensation boundary event', function() {\n\n  const testModules = [\n    copyPasteModule,\n    coreModule,\n    modelingModule\n  ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  describe('should add `isForCompensation`', function() {\n\n    it('on append', inject(function(elementFactory, modeling, elementRegistry) {\n\n      // given\n      const boundaryEventShape = elementRegistry.get('Attached_Event');\n      const taskShape = elementFactory.createShape({ type: 'bpmn:Task' });\n\n      // when\n      const task = modeling.appendShape(boundaryEventShape, taskShape, { x: 100, y: 100 });\n\n      // then\n      expect(task.businessObject.isForCompensation).to.be.true;\n    }));\n\n\n    it('on connect', inject(function(modeling, elementRegistry) {\n\n      // given\n      const boundaryEventShape = elementRegistry.get('Attached_Event');\n      const taskShape = elementRegistry.get('AnotherTask');\n\n      // when\n      modeling.connect(boundaryEventShape, taskShape);\n\n      // then\n      expect(taskShape.businessObject.isForCompensation).to.be.true;\n    }));\n\n\n    it('on reconnect start', inject(function(modeling, elementRegistry) {\n\n      // given\n      const compensateBoundaryEvent = elementRegistry.get('Attached_Event');\n      const sequenceFlow = elementRegistry.get('NoneFlow');\n      const task = sequenceFlow.target;\n\n      // when\n      modeling.reconnectStart(sequenceFlow, compensateBoundaryEvent, {\n        x: compensateBoundaryEvent.x,\n        y: compensateBoundaryEvent.y\n      });\n\n      // then\n      expect(task.businessObject.isForCompensation).to.be.true;\n\n      expect(task.incoming).to.have.length(1);\n      const incomingConnection = task.incoming[0];\n\n      expect(is(incomingConnection, 'bpmn:Association')).to.be.true;\n      expect(incomingConnection.businessObject).to.be.have.property('associationDirection', 'One');\n    }));\n\n\n    it('on reconnect end', inject(function(modeling, elementRegistry) {\n\n      // given\n      const taskShape = elementRegistry.get('AnotherTask');\n      const connection = elementRegistry.get('Association');\n\n      // when\n      modeling.reconnectEnd(connection, taskShape, { x: 100, y: 100 });\n\n      // then\n      expect(taskShape.businessObject.isForCompensation).to.be.true;\n    }));\n\n\n    it('on replace', inject(function(bpmnReplace, elementRegistry) {\n\n      // given\n      const event = elementRegistry.get('NoneEvent');\n      const task = elementRegistry.get('NoneActivity');\n\n      // when\n      bpmnReplace.replaceElement(event, {\n        type: 'bpmn:BoundaryEvent' ,\n        eventDefinitionType: 'bpmn:CompensateEventDefinition'\n      });\n\n      // then\n      expect(task.businessObject.isForCompensation).to.be.true;\n      expect(is(task.incoming[0], 'bpmn:Association')).to.be.true;\n    }));\n\n  });\n\n\n  describe('should remove `isForCompensation`', function() {\n\n    it('on remove element', inject(function(elementRegistry, modeling) {\n\n      // given\n      const taskShape = elementRegistry.get('Task_Compensation');\n      const boundaryEventShape = elementRegistry.get('Attached_Event2');\n\n      // then\n      expect(taskShape.businessObject.isForCompensation).to.be.true;\n\n      // when\n      modeling.removeElements([ boundaryEventShape ]);\n\n      // then\n      expect(taskShape.businessObject.isForCompensation).to.be.false;\n    }));\n\n\n    it('on remove connection', inject(function(elementRegistry, modeling) {\n\n      // given\n      const taskShape = elementRegistry.get('Task_Compensation');\n      const connection = elementRegistry.get('Association');\n\n      // then\n      expect(taskShape.businessObject.isForCompensation).to.be.true;\n\n      // when\n      modeling.removeConnection(connection);\n\n      // then\n      expect(taskShape.businessObject.isForCompensation).to.be.false;\n    }));\n\n\n    // TODO(@barmac): implement together with allowing the interaction in the rules\n    it.skip('on reconnect start', inject(function(modeling, elementRegistry) {\n\n      // given\n      const taskShape = elementRegistry.get('Task');\n      const compensationAssociation = elementRegistry.get('Association');\n      const compensationActivity = compensationAssociation.target;\n\n      // when\n      modeling.reconnectStart(compensationAssociation, taskShape, { x: taskShape.x, y: taskShape.y });\n\n      // then\n      expect(compensationActivity.businessObject.isForCompensation).to.be.false;\n\n      expect(compensationActivity.incoming).to.have.length(1);\n      const incomingConnection = compensationActivity.incoming[0];\n\n      expect(is(incomingConnection, 'bpmn:SequenceFlow')).to.be.true;\n    }));\n\n\n    it('on reconnect end', inject(function(modeling, elementRegistry) {\n\n      // given\n      const oldShape = elementRegistry.get('Task_Compensation');\n      const taskShape = elementRegistry.get('Task');\n      const connection = elementRegistry.get('Association');\n\n      // when\n      modeling.reconnectEnd(connection, taskShape, { x: taskShape.x, y: taskShape.y });\n\n      // then\n      expect(oldShape.businessObject.isForCompensation).to.be.false;\n    }));\n\n\n    it('on replace', inject(function(bpmnReplace, elementRegistry) {\n\n      // given\n      const event = elementRegistry.get('Attached_Event2');\n      const task = elementRegistry.get('Task_Compensation');\n\n      // when\n      bpmnReplace.replaceElement(event, { type: 'bpmn:BoundaryEvent', eventDefinitionType: 'bpmn:MessageEventDefinition' });\n\n      // then\n      expect(task.businessObject.isForCompensation).to.be.false;\n      expect(is(task.incoming[0], 'bpmn:SequenceFlow')).to.be.true;\n    }));\n\n  });\n\n\n  describe('remove connections', function() {\n\n    it('should remove disallowed connections on connect', inject(function(modeling, elementRegistry) {\n\n      // given\n      const task = elementRegistry.get('Task_DisallowedConnections');\n      const event = elementRegistry.get('Attached_Event');\n\n      expect(task.incoming).to.have.length(1);\n      expect(task.outgoing).to.have.length(1);\n\n      // when\n      modeling.connect(event, task);\n\n      // then\n      expect(task.incoming).to.have.length(1);\n      expect(task.outgoing).to.have.length(0);\n    }));\n\n\n    it('should remove disallowed connections on reconnect', inject(function(modeling, elementRegistry) {\n\n      // given\n      const task = elementRegistry.get('Task_DisallowedConnections');\n      const connection = elementRegistry.get('Association');\n\n      // when\n      modeling.reconnectEnd(connection, task, { x: 100, y: 100 });\n\n      // then\n      expect(task.incoming).to.have.length(1);\n      expect(task.outgoing).to.have.length(0);\n    }));\n\n\n    it('should remove existing compensation association when new one is created', inject(\n      function(modeling, elementRegistry) {\n\n        // given\n        const task = elementRegistry.get('AnotherTask');\n        const event = elementRegistry.get('Attached_Event2');\n\n        // when\n        modeling.connect(event, task);\n\n        // then\n        expect(task.incoming).to.have.length(1);\n        expect(event.outgoing).to.have.length(1);\n\n        expect(task.incoming[0]).to.eql(event.outgoing[0]);\n      }\n    ));\n\n\n    it('should remove association when no longer for compensation', inject(\n      function(bpmnReplace, elementRegistry) {\n\n        // given\n        let event = elementRegistry.get('ReplacedEvent'),\n            compensationActivity = event.outgoing[0].target;\n\n        // when\n        event = bpmnReplace.replaceElement(event, {\n          type: 'bpmn:BoundaryEvent' ,\n          eventDefinitionType: 'bpmn:MessageEventDefinition'\n        });\n\n        // then\n        expect(compensationActivity.incoming).to.have.lengthOf(1);\n        expect(compensationActivity.incoming[0].source).to.eql(event);\n      }\n    ));\n\n  });\n\n\n  describe('remove attachers', function() {\n\n    it('should remove attachers of compensation activity', inject(function(elementRegistry, modeling) {\n\n      // given\n      const event = elementRegistry.get('Attached_Event'),\n            task = elementRegistry.get('Task');\n\n      // when\n      modeling.connect(event, task);\n\n      // then\n      expect(task.attachers).to.be.empty;\n      expect(task.businessObject.isForCompensation).to.be.true;\n    }));\n\n\n    it('should NOT remove attachers of non-compensation activity', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      let event = elementRegistry.get('MultiBoundary'),\n          tasks = event.outgoing.map(({ target }) => target);\n\n\n      // when\n      event = bpmnReplace.replaceElement(event, {\n        type: 'bpmn:BoundaryEvent' ,\n        eventDefinitionType: 'bpmn:CompensateEventDefinition'\n      });\n\n      // then\n      expect(event.outgoing).to.have.lengthOf(1);\n\n      const compensationAcivity = event.outgoing[0].target;\n      expect(compensationAcivity.businessObject.isForCompensation).to.be.true;\n\n      for (const task of tasks.filter(task => task !== compensationAcivity)) {\n        expect(task.attachers).to.have.lengthOf(1);\n        expect(task.businessObject.isForCompensation).to.be.false;\n      }\n    }));\n\n  });\n\n\n  it('should add `isForCompensation` to exactly 1 candidate activity on replace', inject(\n    function(bpmnReplace, elementRegistry) {\n\n      // given\n      let event = elementRegistry.get('MultiOutgoing');\n      const tasks = event.outgoing.map(flow => flow.target);\n\n      // when\n      event = bpmnReplace.replaceElement(event, {\n        type: 'bpmn:BoundaryEvent' ,\n        eventDefinitionType: 'bpmn:CompensateEventDefinition'\n      });\n\n      // then\n      expect(event.outgoing).to.have.lengthOf(1);\n\n      const target = event.outgoing[0].target;\n      expect(target.businessObject.isForCompensation).to.be.true;\n\n      const otherTasks = tasks.filter(task => task !== target);\n\n      for (const task of otherTasks) {\n        expect(task.businessObject.isForCompensation).to.be.false;\n      }\n    })\n  );\n\n\n  it('should NOT break when there are no outgoing connections (to compensation)', inject(\n    function(elementRegistry, bpmnReplace) {\n\n      // given\n      const event = elementRegistry.get('NoneBoundary');\n\n      // when\n      const action = () => {\n        bpmnReplace.replaceElement(event, {\n          type: 'bpmn:BoundaryEvent' ,\n          eventDefinitionType: 'bpmn:CompensateEventDefinition'\n        });\n      };\n\n      // then\n      expect(action).not.to.throw();\n    }\n  ));\n\n\n  it('should NOT break when there are no outgoing connections (from compensation)', inject(\n    function(elementRegistry, bpmnReplace) {\n\n      // given\n      const event = elementRegistry.get('Attached_Event');\n\n      // when\n      const action = () => {\n        bpmnReplace.replaceElement(event, {\n          type: 'bpmn:BoundaryEvent' ,\n          eventDefinitionType: 'bpmn:MessageEventDefinition'\n        });\n      };\n\n      // then\n      expect(action).not.to.throw();\n    }\n  ));\n\n\n  it('should NOT crash when core `replace` component is used', inject(\n    function(elementRegistry, replace) {\n\n      // given\n      const task = elementRegistry.get('Task_Compensation');\n\n      // when\n      const action = () => {\n        replace.replaceElement(task,\n          {\n            type: 'bpmn:ManualTask'\n          }\n        );\n      };\n\n      // then\n      expect(action).not.to.throw();\n    }\n  ));\n\n\n  describe('copy and paste', function() {\n\n    it('should NOT break on copy and paste', inject(function(canvas, copyPaste, elementRegistry) {\n\n      // given\n      copyPaste.copy([\n        elementRegistry.get('Task_BoundaryEvent2'),\n        elementRegistry.get('Task_Compensation')\n      ]);\n\n      // when\n      var copiedElements = copyPaste.paste({\n        element: canvas.getRootElement(),\n        point: {\n          x: 100,\n          y: 100\n        }\n      });\n\n      // then\n      expect(copiedElements).to.have.lengthOf(4);\n      expect(copiedElements.filter(element => is(element, 'bpmn:Association'))).to.have.length(1);\n      expect(copiedElements.filter(element => is(element, 'bpmn:BoundaryEvent'))).to.have.length(1);\n      expect(copiedElements.filter(element => is(element, 'bpmn:Task'))).to.have.length(2);\n    }));\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/CompensationAssociationBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_09clsti\" />\n    <bpmn:boundaryEvent id=\"CompensationBoundary\" attachedToRef=\"Task_09clsti\">\n      <bpmn:compensateEventDefinition />\n    </bpmn:boundaryEvent>\n    <bpmn:task id=\"CompensationActivity\" isForCompensation=\"true\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_09clsti_di\" bpmnElement=\"Task_09clsti\">\n        <dc:Bounds x=\"45\" y=\"44\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"CompensationBoundary_di\" bpmnElement=\"CompensationBoundary\">\n        <dc:Bounds x=\"89\" y=\"106\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"62\" y=\"142\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"CompensationActivity_di\" bpmnElement=\"CompensationActivity\">\n        <dc:Bounds x=\"206\" y=\"214\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/CompensationAssociationBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  getBusinessObject,\n  is\n} from 'lib/util/ModelUtil';\n\nimport modelingModule from 'lib/features/modeling';\n\n\ndescribe('modeling/behavior - CompensationAssociation', function() {\n\n  var diagramXML = require('./CompensationAssociationBehavior.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: modelingModule }));\n\n\n  it('should use manhattan layout', inject(function(modeling, elementRegistry) {\n\n    // given\n    var boundaryShape = elementRegistry.get('CompensationBoundary'),\n        activityShape = elementRegistry.get('CompensationActivity');\n\n\n    // when\n    var newConnection = modeling.connect(boundaryShape, activityShape);\n\n    // then\n    expect(waypoints(newConnection)).to.eql([\n      { x: 107, y: 142 },\n      { x: 107, y: 254 },\n      { x: 206, y: 254 }\n    ]);\n  }));\n\n\n  it('should create directed association', inject(function(modeling, elementRegistry) {\n\n    // given\n    var boundaryShape = elementRegistry.get('CompensationBoundary'),\n        activityShape = elementRegistry.get('CompensationActivity');\n\n\n    // when\n    var newConnection = modeling.connect(boundaryShape, activityShape);\n\n    // then\n    expect(is(newConnection, 'bpmn:Association')).to.be.true;\n    expect(getBusinessObject(newConnection)).to.have.property('associationDirection', 'One');\n  }));\n\n});\n\n\nfunction waypoints(connection) {\n  return connection.waypoints.map(function(wp) {\n    return { x: wp.x, y: wp.y };\n  });\n}"
  },
  {
    "path": "test/spec/features/modeling/behavior/CreateBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1bizrl3\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.1.2\">\n  <bpmn:collaboration id=\"Collaboration_1\">\n    <bpmn:participant id=\"Participant_1\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:laneSet id=\"LaneSet_04h5t15\">\n      <bpmn:lane id=\"Lane_2\" />\n      <bpmn:lane id=\"Lane_1\" />\n    </bpmn:laneSet>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_1amm1zc_di\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"100\" y=\"100\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0govxlt_di\" bpmnElement=\"Lane_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"130\" y=\"100\" width=\"570\" height=\"125\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0f7d1ts_di\" bpmnElement=\"Lane_2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"130\" y=\"225\" width=\"570\" height=\"125\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/CreateBehaviorSpec.js",
    "content": "import {\r\n  bootstrapModeler,\r\n  inject\r\n} from 'test/TestHelper';\r\n\r\nimport coreModule from 'lib/core';\r\nimport modelingModule from 'lib/features/modeling';\r\nimport { getMid } from 'diagram-js/lib/layout/LayoutUtil';\r\n\r\n\r\ndescribe('features/modeling - CreateBehavior', function() {\r\n\r\n  var processDiagramXML = require('./CreateBehavior.bpmn');\r\n\r\n  beforeEach(bootstrapModeler(processDiagramXML, {\r\n    modules: [\r\n      coreModule,\r\n      modelingModule\r\n    ]\r\n  }));\r\n\r\n\r\n  it('should ensure parent is participant', inject(\r\n    function(elementFactory, elementRegistry, modeling) {\r\n\r\n      // given\r\n      var lane = elementRegistry.get('Lane_1'),\r\n          participant = elementRegistry.get('Participant_1');\r\n\r\n      var task = elementFactory.createShape({\r\n        type: 'bpmn:Task'\r\n      });\r\n\r\n      // when\r\n      modeling.createShape(task, getMid(lane), lane);\r\n\r\n      // then\r\n      expect(task.parent).to.equal(participant);\r\n    }\r\n  ));\r\n\r\n});"
  },
  {
    "path": "test/spec/features/modeling/behavior/CreateParticipantBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport createModule from 'diagram-js/lib/features/create';\nimport modelingModule from 'lib/features/modeling';\n\nimport {\n  getBBox\n} from 'diagram-js/lib/util/Elements';\n\nimport { asTRBL } from 'diagram-js/lib/layout/LayoutUtil';\nimport { getDi } from 'lib/util/ModelUtil';\n\nimport {\n  createCanvasEvent as canvasEvent\n} from '../../../../util/MockEvents';\n\n\ndescribe('features/modeling - create participant', function() {\n\n  var testModules = [\n    coreModule,\n    createModule,\n    modelingModule\n  ];\n\n  describe('process', function() {\n\n    describe('turning process into collaboration', function() {\n\n      var processDiagramXML = require('../../../../fixtures/bpmn/collaboration/process-empty.bpmn');\n\n      beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n      var collaboration,\n          collaborationBo,\n          collaborationDi,\n          diRoot,\n          participant,\n          participant2,\n          participants,\n          participantBo,\n          participant2Bo,\n          participantDi,\n          participant2Di,\n          process,\n          processBo,\n          processDi;\n\n      beforeEach(inject(function(canvas, elementFactory) {\n\n        // given\n        process = canvas.getRootElement();\n        processBo = process.businessObject;\n        processDi = getDi(process);\n\n        diRoot = processDi.$parent;\n\n        participant = elementFactory.createParticipantShape({ x: 100, y: 100 });\n        participantBo = participant.businessObject;\n        participantDi = getDi(participant);\n\n        participant2 = elementFactory.createParticipantShape({ x: 100, y: 400 });\n        participant2Bo = participant2.businessObject;\n        participant2Di = getDi(participant2);\n\n        participants = [ participant, participant2 ];\n      }));\n\n\n      describe('creating one participant', function() {\n\n        beforeEach(inject(function(canvas, modeling) {\n\n          // when\n          modeling.createShape(participant, { x: 400, y: 225 }, process);\n\n          collaboration = canvas.getRootElement();\n          collaborationBo = collaboration.businessObject;\n          collaborationDi = getDi(collaboration);\n        }));\n\n\n        it('execute', function() {\n\n          // then\n          expect(participantBo.$parent).to.equal(collaborationBo);\n          expect(participantBo.processRef).to.equal(processBo);\n          expect(participantBo.processRef.id).to.equal(processBo.id);\n\n          expect(collaborationBo.$instanceOf('bpmn:Collaboration')).to.be.true;\n          expect(collaborationBo.$parent).to.equal(processBo.$parent);\n          expect(collaborationBo.participants).to.include(participantBo);\n\n          expect(participantDi.$parent).to.equal(collaborationDi);\n          expect(collaborationDi.$parent).to.equal(diRoot);\n        });\n\n\n        it('undo', inject(function(commandStack) {\n\n          // when\n          commandStack.undo();\n\n          // then\n          expect(participantBo.$parent).not.to.exist;\n          expect(participantBo.processRef).not.to.equal(processBo);\n\n          expect(collaborationBo.$parent).not.to.exist;\n          expect(collaborationBo.participants).not.to.include(participantBo);\n\n          expect(processDi.$parent).to.equal(diRoot);\n        }));\n\n\n        it('redo', inject(function(commandStack) {\n\n          // when\n          commandStack.undo();\n          commandStack.redo();\n\n          // then\n          expect(participantBo.$parent).to.equal(collaborationBo);\n          expect(participantBo.processRef).to.equal(processBo);\n          expect(participantBo.processRef.id).to.equal(processBo.id);\n\n          expect(collaborationBo.$instanceOf('bpmn:Collaboration')).to.be.true;\n          expect(collaborationBo.$parent).to.equal(processBo.$parent);\n          expect(collaborationBo.participants).to.include(participantBo);\n\n          expect(participantDi.$parent).to.equal(collaborationDi);\n          expect(collaborationDi.$parent).to.equal(diRoot);\n        }));\n\n      });\n\n\n      describe('creating two participants', function() {\n\n        beforeEach(inject(function(canvas, modeling) {\n\n          // when\n          modeling.createElements(participants, { x: 400, y: 375 }, process);\n\n          collaboration = canvas.getRootElement();\n          collaborationBo = collaboration.businessObject;\n          collaborationDi = getDi(collaboration);\n        }));\n\n\n        it('execute', function() {\n\n          // then\n          expect(participantBo.$parent).to.equal(collaborationBo);\n          expect(participantBo.processRef).to.equal(processBo);\n\n          expect(participant2Bo.$parent).to.equal(collaborationBo);\n          expect(participant2Bo.processRef).not.to.equal(processBo);\n\n          expect(collaborationBo.$instanceOf('bpmn:Collaboration')).to.be.true;\n          expect(collaborationBo.$parent).to.equal(processBo.$parent);\n          expect(collaborationBo.participants).to.include(participantBo);\n\n          expect(participantDi.$parent).to.equal(collaborationDi);\n          expect(participant2Di.$parent).to.equal(collaborationDi);\n          expect(collaborationDi.$parent).to.equal(diRoot);\n        });\n\n\n        it('undo', inject(function(commandStack) {\n\n          // when\n          commandStack.undo();\n\n          // then\n          expect(participantBo.$parent).not.to.exist;\n          expect(participantBo.processRef).not.to.equal(processBo);\n\n          expect(participant2Bo.$parent).not.to.exist;\n          expect(participant2Bo.processRef).not.to.equal(processBo);\n\n          expect(collaborationBo.$parent).not.to.exist;\n          expect(collaborationBo.participants).not.to.include(participantBo);\n          expect(collaborationBo.participants).not.to.include(participant2Bo);\n\n          expect(processDi.$parent).to.equal(diRoot);\n        }));\n\n\n        it('redo', inject(function(commandStack) {\n\n          // when\n          commandStack.undo();\n          commandStack.redo();\n\n          // then\n          expect(participantBo.$parent).to.equal(collaborationBo);\n          expect(participantBo.processRef).to.equal(processBo);\n\n          expect(participant2Bo.$parent).to.equal(collaborationBo);\n          expect(participant2Bo.processRef).not.to.equal(processBo);\n\n          expect(collaborationBo.$instanceOf('bpmn:Collaboration')).to.be.true;\n          expect(collaborationBo.$parent).to.equal(processBo.$parent);\n          expect(collaborationBo.participants).to.include(participantBo);\n\n          expect(participantDi.$parent).to.equal(collaborationDi);\n          expect(participant2Di.$parent).to.equal(collaborationDi);\n          expect(collaborationDi.$parent).to.equal(diRoot);\n        }));\n\n      });\n\n    });\n\n\n    describe('moving process children', function() {\n\n      var processDiagramXML = require('../../../../fixtures/bpmn/collaboration/process.bpmn');\n\n      beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n      var collaboration,\n          collaborationDi,\n          participant,\n          process,\n          processDi;\n\n      beforeEach(inject(function(canvas, elementFactory, modeling) {\n\n        // given\n        process = canvas.getRootElement();\n        processDi = getDi(process);\n\n        participant = elementFactory.createParticipantShape();\n\n        // when\n        modeling.createShape(participant, { x: 350, y: 200 }, process);\n\n        collaboration = canvas.getRootElement();\n        collaborationDi = getDi(collaboration);\n      }));\n\n\n      it('execute', function() {\n\n        // then\n        expect(collaboration.children).to.have.length(4);\n\n        collaboration.children.forEach(function(child) {\n          var childDi = getDi(child);\n\n          expect(childDi.$parent).to.eql(collaborationDi);\n          expect(collaborationDi.planeElement).to.include(childDi);\n        });\n\n        expect(participant.children).to.have.length(5);\n\n        participant.children.forEach(function(child) {\n          var childDi = getDi(child);\n\n          expect(childDi.$parent).to.eql(collaborationDi);\n          expect(collaborationDi.planeElement).to.include(childDi);\n        });\n      });\n\n\n      it('undo', inject(function(commandStack) {\n\n        // when\n        commandStack.undo();\n\n        expect(process.children).to.have.length(8);\n\n        process.children.forEach(function(child) {\n          var childDi = getDi(child);\n\n\n          expect(childDi.$parent).to.eql(processDi);\n          expect(processDi.planeElement).to.include(childDi);\n        });\n\n        expect(participant.children.length).to.equal(0);\n      }));\n\n\n      it('should detach DI when turning process into collaboration', inject(function(modeling) {\n\n        // when\n        modeling.makeCollaboration();\n\n        // then\n        process.children.forEach(function(child) {\n          var childDi = getDi(child);\n\n\n          expect(childDi.$parent).not.to.exist;\n          expect(processDi.planeElement).not.to.include(childDi);\n        });\n      }));\n\n    });\n\n\n    describe('hovering process when creating first participant', function() {\n\n      var processDiagramXML = require('../../../../fixtures/bpmn/collaboration/process.bpmn');\n\n      beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n      var participant,\n          process,\n          processGfx,\n          subProcess,\n          subProcessGfx;\n\n      beforeEach(inject(function(canvas, elementFactory, elementRegistry) {\n\n        // given\n        process = canvas.getRootElement();\n        processGfx = canvas.getGraphics(process);\n\n        participant = elementFactory.createParticipantShape();\n\n        subProcess = elementRegistry.get('SubProcess_1');\n        subProcessGfx = canvas.getGraphics(subProcess);\n      }));\n\n\n      it('should ensure hovering process', inject(function(create, dragging, eventBus) {\n\n        // given\n        create.start(canvasEvent({ x: 100, y: 100 }), participant);\n\n        var event = eventBus.createEvent({\n          element: subProcess,\n          gfx: subProcessGfx\n        });\n\n        // when\n        eventBus.fire('element.hover', event);\n\n        // then\n        expect(event.element).to.equal(process);\n        expect(event.gfx).to.equal(processGfx);\n      }));\n\n\n      it('should clean up', inject(function(create, dragging, eventBus) {\n\n        // given\n        create.start(canvasEvent({ x: 100, y: 100 }), participant);\n\n        // when\n        dragging.end();\n\n        // then\n        var event = eventBus.createEvent({\n          element: subProcess,\n          gfx: subProcessGfx\n        });\n\n        eventBus.fire('element.hover', event);\n\n        expect(event.element).to.equal(subProcess);\n        expect(event.gfx).to.equal(subProcessGfx);\n      }));\n\n    });\n\n\n    describe('fitting participant (default size)', function() {\n\n      var processDiagramXML = require('../../../../fixtures/bpmn/collaboration/process.bpmn');\n\n      beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n      var participant,\n          process,\n          processGfx;\n\n      beforeEach(inject(function(canvas, create, dragging, elementFactory) {\n\n        // given\n        process = canvas.getRootElement();\n        processGfx = canvas.getGraphics(process);\n\n        participant = elementFactory.createParticipantShape();\n\n        create.start(canvasEvent({ x: 100, y: 100 }), participant);\n\n        dragging.hover({ element: process, gfx: processGfx });\n      }));\n\n\n      it('should fit participant', inject(function(elementFactory) {\n\n        // then\n        var defaultSize = elementFactory.getDefaultSize(participant);\n\n        expect(participant.width).to.equal(defaultSize.width);\n        expect(participant.height).to.equal(defaultSize.height);\n      }));\n\n\n      describe('create constraints', function() {\n\n        function expectBoundsWithin(inner, outer, padding) {\n          expect(inner.top >= outer.top + padding.top).to.be.true;\n          expect(inner.right <= outer.right - padding.right).to.be.true;\n          expect(inner.bottom <= outer.bottom - padding.bottom).to.be.true;\n          expect(inner.left >= outer.left + padding.left).to.be.true;\n        }\n\n        var padding = {\n          top: 20,\n          right: 20,\n          bottom: 20,\n          left: 50\n        };\n\n\n        [\n          { x: 0, y: 0 },\n          { x: 1000, y: 0 },\n          { x: 0, y: 1000 },\n          { x: 1000, y: 1000 }\n        ].forEach(function(position) {\n\n          it('should constrain ' + JSON.stringify(position), inject(function(dragging) {\n\n            // when\n            dragging.move(canvasEvent(position));\n\n            dragging.end();\n\n            // then\n            expectBoundsWithin(\n              asTRBL(getBBox(participant.children)),\n              asTRBL(getBBox(participant)),\n              padding\n            );\n          }));\n\n        });\n\n      });\n\n    });\n\n\n    describe('fitting participant (only groups)', function() {\n\n      var processDiagramXML = require('../../../../fixtures/bpmn/collaboration/process-empty.bpmn');\n\n      beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n      it('should fit participant', inject(\n        function(canvas, create, dragging, elementFactory, modeling) {\n\n          // given\n          var process = canvas.getRootElement(),\n              processGfx = canvas.getGraphics(process),\n              participant = elementFactory.createParticipantShape(),\n              groupElement = elementFactory.createShape({ type: 'bpmn:Group' });\n\n          modeling.createShape(groupElement, { x: 100, y: 100 }, process);\n\n          // when\n          create.start(canvasEvent({ x: 100, y: 100 }), participant);\n          dragging.hover({ element: process, gfx: processGfx });\n\n          // then\n          var defaultSize = elementFactory.getDefaultSize(participant);\n\n          expect(participant.width).to.equal(defaultSize.width);\n          expect(participant.height).to.equal(defaultSize.height);\n        }\n      ));\n\n    });\n\n  });\n\n\n  describe('collaboration', function() {\n\n    var collaborationDiagramXML =\n      require('../../../../fixtures/bpmn/collaboration/collaboration-participant.bpmn');\n\n    beforeEach(bootstrapModeler(collaborationDiagramXML, { modules: testModules }));\n\n    var collaborationBo,\n        participant,\n        participantBo,\n        rootElement;\n\n    beforeEach(inject(function(canvas, elementFactory, modeling) {\n\n      // given\n      rootElement = canvas.getRootElement();\n      collaborationBo = rootElement.businessObject;\n\n      participant = elementFactory.createParticipantShape();\n      participantBo = participant.businessObject;\n\n      // when\n      modeling.createShape(participant, { x: 350, y: 500 }, rootElement);\n    }));\n\n\n    it('execute', function() {\n\n      // then\n      expect(rootElement.children).to.include(participant);\n\n      expect(participantBo.$parent).to.equal(collaborationBo);\n      expect(collaborationBo.participants).to.include(participantBo);\n    });\n\n\n    it('undo', inject(function(commandStack) {\n\n      // when\n      commandStack.undo();\n\n      // then\n      expect(rootElement.children).not.to.include(participant);\n\n      expect(participantBo.$parent).not.to.exist;\n      expect(collaborationBo.participants).not.to.include(participantBo);\n    }));\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/DataInputAssociationBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process\" isExecutable=\"false\">\n    <bpmn:Task id=\"Task_A\" name=\"Task_A\">\n      <bpmn:dataInputAssociation id=\"DataInputAssociation\">\n        <bpmn:sourceRef>DataObjectReference</bpmn:sourceRef>\n      </bpmn:dataInputAssociation>\n    </bpmn:Task>\n    <bpmn:dataObjectReference id=\"DataObjectReference\" name=\"DataObjectReference\" dataObjectRef=\"DataObject\" />\n    <bpmn:dataObject id=\"DataObject\" />\n    <bpmn:Task id=\"Task_B\" name=\"Task_B\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process\">\n      <bpmndi:BPMNShape id=\"Task_A_di\" bpmnElement=\"Task_A\">\n        <dc:Bounds x=\"249\" y=\"22\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_di\" bpmnElement=\"DataObjectReference\">\n        <dc:Bounds x=\"100\" y=\"201\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"73\" y=\"251\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_B_di\" bpmnElement=\"Task_B\">\n        <dc:Bounds x=\"249\" y=\"186\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_di\" bpmnElement=\"DataInputAssociation\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"136\" y=\"210\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"257\" y=\"100\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/DataInputAssociationBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  find\n} from 'min-dash';\n\nimport modelingModule from 'lib/features/modeling';\n\n\ndescribe('modeling/behavior - fix DataInputAssociation#targetRef', function() {\n\n  var diagramXML = require('./DataInputAssociationBehavior.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: modelingModule }));\n\n\n  it('should add on connect', inject(function(modeling, elementRegistry) {\n\n    // given\n    var dataObjectShape = elementRegistry.get('DataObjectReference'),\n        taskShape = elementRegistry.get('Task_B');\n\n\n    // when\n    var newConnection = modeling.connect(dataObjectShape, taskShape, {\n      type: 'bpmn:DataInputAssociation'\n    });\n\n    var dataInputAssociation = newConnection.businessObject;\n\n    // then\n    expect(dataInputAssociation.targetRef).to.exist;\n    expect(dataInputAssociation.targetRef).to.eql(getTargetRefProp(taskShape));\n  }));\n\n\n  it('should remove on connect / undo', inject(function(modeling, elementRegistry, commandStack) {\n\n    // given\n    var dataObjectShape = elementRegistry.get('DataObjectReference'),\n        taskShape = elementRegistry.get('Task_B');\n\n    var newConnection = modeling.connect(dataObjectShape, taskShape, {\n      type: 'bpmn:DataInputAssociation'\n    });\n\n    var dataInputAssociation = newConnection.businessObject;\n\n    // when\n    commandStack.undo();\n\n    // then\n    expect(dataInputAssociation.targetRef).not.to.exist;\n    expect(getTargetRefProp(taskShape)).not.to.exist;\n  }));\n\n\n  it('should update on reconnectEnd', inject(function(modeling, elementRegistry) {\n\n    // given\n    var oldTarget = elementRegistry.get('Task_A'),\n        connection = elementRegistry.get('DataInputAssociation'),\n        dataInputAssociation = connection.businessObject,\n        newTarget = elementRegistry.get('Task_B');\n\n    // when\n    modeling.reconnectEnd(connection, newTarget, { x: newTarget.x, y: newTarget.y });\n\n    // then\n    expect(getTargetRefProp(oldTarget)).not.to.exist;\n\n    expect(dataInputAssociation.targetRef).to.exist;\n    expect(dataInputAssociation.targetRef).to.eql(getTargetRefProp(newTarget));\n  }));\n\n\n  it('should update on reconnectEnd / undo', inject(function(modeling, elementRegistry, commandStack) {\n\n    // given\n    var oldTarget = elementRegistry.get('Task_A'),\n        connection = elementRegistry.get('DataInputAssociation'),\n        dataInputAssociation = connection.businessObject,\n        newTarget = elementRegistry.get('Task_B');\n\n    modeling.reconnectEnd(connection, newTarget, { x: newTarget.x, y: newTarget.y });\n\n    // when\n    commandStack.undo();\n\n    // then\n    expect(getTargetRefProp(newTarget)).not.to.exist;\n\n    expect(dataInputAssociation.targetRef).to.exist;\n    expect(dataInputAssociation.targetRef).to.eql(getTargetRefProp(oldTarget));\n  }));\n\n\n  it('should unset on remove', inject(function(modeling, elementRegistry) {\n\n    // given\n    var oldTarget = elementRegistry.get('Task_A'),\n        connection = elementRegistry.get('DataInputAssociation'),\n        dataInputAssociation = connection.businessObject;\n\n    // when\n    modeling.removeElements([ connection ]);\n\n    // then\n    expect(getTargetRefProp(oldTarget)).not.to.exist;\n\n    expect(dataInputAssociation.targetRef).not.to.exist;\n  }));\n\n\n  it('should unset on remove / undo', inject(function(modeling, elementRegistry, commandStack) {\n\n    // given\n    var oldTarget = elementRegistry.get('Task_A'),\n        connection = elementRegistry.get('DataInputAssociation'),\n        dataInputAssociation = connection.businessObject;\n\n    modeling.removeElements([ connection ]);\n\n    // when\n    commandStack.undo();\n\n    // then\n    expect(dataInputAssociation.targetRef).to.exist;\n    expect(dataInputAssociation.targetRef).to.eql(getTargetRefProp(oldTarget));\n  }));\n\n});\n\n\n\nfunction getTargetRefProp(element) {\n\n  expect(element).to.exist;\n\n  var properties = element.businessObject.get('properties');\n\n  return find(properties, function(p) {\n    return p.name === '__targetRef_placeholder';\n  });\n}"
  },
  {
    "path": "test/spec/features/modeling/behavior/DataObjectBehavior.create-data-association.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_1\" />\n    <bpmn:dataObjectReference id=\"DataObjectReference_1\" dataObjectRef=\"DataObject_1\" />\n    <bpmn:dataObject id=\"DataObject_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"173\" y=\"75\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_1_di\" bpmnElement=\"DataObjectReference_1\">\n        <dc:Bounds x=\"205\" y=\"226\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"178\" y=\"276\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/DataObjectBehavior.data-object-reference.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"297\" y=\"58\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/DataObjectBehavior.remove-data-association.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_1\">\n      <bpmn:dataOutputAssociation id=\"DataOutputAssociation_1\">\n        <bpmn:targetRef>DataObjectReference_1</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n    </bpmn:task>\n    <bpmn:dataObjectReference id=\"DataObjectReference_1\" dataObjectRef=\"DataObject_1\" />\n    <bpmn:dataObject id=\"DataObject_1\" />\n    <bpmn:task id=\"Task_2\">\n      <bpmn:dataInputAssociation id=\"DataInputAssociation_1\">\n        <bpmn:sourceRef>DataObjectReference_1</bpmn:sourceRef>\n      </bpmn:dataInputAssociation>\n    </bpmn:task>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"149\" y=\"76\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_1_di\" bpmnElement=\"DataObjectReference_1\">\n        <dc:Bounds x=\"337\" y=\"91\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"310\" y=\"141\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"466\" y=\"76\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_1_di\" bpmnElement=\"DataOutputAssociation_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"249\" y=\"116\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"337\" y=\"116\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_1_di\" bpmnElement=\"DataInputAssociation_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"373\" y=\"116\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"466\" y=\"116\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/DataObjectBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport { is } from 'lib/util/ModelUtil';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling/behavior - data object', function() {\n\n  var testModules = [ coreModule, modelingModule ];\n\n  var rootShape;\n\n\n  describe('DataObjectReference', function() {\n\n    var processDiagramXML = require('./DataObjectBehavior.data-object-reference.bpmn');\n\n    beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n    var subProcess1;\n\n    beforeEach(inject(function(canvas, elementRegistry) {\n      subProcess1 = elementRegistry.get('SubProcess_1');\n      rootShape = canvas.getRootElement();\n    }));\n\n\n    it('should create the corresponding DataObject', inject(function(modeling) {\n\n      // when\n      var dataObjectRefShape = modeling.createShape({ type: 'bpmn:DataObjectReference' },\n        { x: 220, y: 220 }, rootShape);\n\n      var dataObject = dataObjectRefShape.businessObject.dataObjectRef;\n\n      // then\n      expect(dataObject).to.exist;\n      expect(is(dataObject, 'bpmn:DataObject')).to.be.true;\n      expect(dataObject.id).to.exist;\n    }));\n\n\n    it('should copy the isCollection property in DataObject if present', inject(function(modeling, copyPaste) {\n\n      // when\n      var dataObjectRefShape = modeling.createShape({ type: 'bpmn:DataObjectReference' },\n        { x: 220, y: 220 }, rootShape);\n      dataObjectRefShape.businessObject.dataObjectRef.isCollection = true;\n\n      copyPaste.copy(dataObjectRefShape);\n      var pastedElements = copyPaste.paste({\n        element: rootShape,\n        point: {\n          x: 350,\n          y: 150\n        }\n      });\n\n      var dataObject = pastedElements[0].businessObject.dataObjectRef;\n\n      // then\n      expect(dataObject).to.exist;\n      expect(is(dataObject, 'bpmn:DataObject')).to.be.true;\n      expect(dataObject.id).to.exist;\n      expect(dataObject.isCollection).to.be.true;\n    }));\n\n\n    it('should create the corresponding DataObject / undo');\n\n\n    it('should have the right parents', inject(function(modeling) {\n\n      // when\n      var dataObjectRefShape1 = modeling.createShape({ type: 'bpmn:DataObjectReference' },\n        { x: 220, y: 220 }, rootShape);\n      var dataObjectRefShape2 = modeling.createShape({ type: 'bpmn:DataObjectReference' },\n        { x: 380, y: 220 }, subProcess1);\n\n      var dataObject1 = dataObjectRefShape1.businessObject.dataObjectRef;\n      var dataObject2 = dataObjectRefShape2.businessObject.dataObjectRef;\n\n      // then\n      expect(dataObject1.$parent.id).to.equal(rootShape.id);\n      expect(dataObjectRefShape1.parent.id).to.equal(rootShape.id);\n\n      expect(dataObject2.$parent.id).to.equal(subProcess1.id);\n      expect(dataObjectRefShape2.parent.id).to.equal(subProcess1.id);\n    }));\n\n  });\n\n\n  describe('create', function() {\n\n    var processDiagramXML = require('./DataObjectBehavior.create-data-association.bpmn');\n\n    beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n    var dataObjectRefShape1,\n        taskShape;\n\n    beforeEach(inject(function(canvas, elementRegistry) {\n      rootShape = canvas.getRootElement();\n      dataObjectRefShape1 = elementRegistry.get('DataObjectReference_1');\n      taskShape = elementRegistry.get('Task_1');\n    }));\n\n\n    describe('dataOutputAssociation', function() {\n\n      it('should execute', inject(function(modeling) {\n\n        // when\n        var outputAssociation = modeling.connect(taskShape, dataObjectRefShape1);\n\n        var dataOutputAssociations = taskShape.businessObject.get('dataOutputAssociations');\n\n        // then\n        expect(dataOutputAssociations[0].$parent).to.equal(taskShape.businessObject);\n        expect(dataOutputAssociations).to.include(outputAssociation.businessObject);\n        expect(taskShape.businessObject.get('dataInputAssociations')).to.be.empty;\n      }));\n\n\n      it('should undo', inject(function(modeling, commandStack) {\n\n        // when\n        modeling.connect(taskShape, dataObjectRefShape1);\n        commandStack.undo();\n\n        // then\n        expect(taskShape.businessObject.get('dataOutputAssociations')).to.be.empty;\n        expect(taskShape.businessObject.get('dataInputAssociations')).to.be.empty;\n      }));\n\n\n      it('should redo', inject(function(modeling, commandStack) {\n\n        // when\n        var outputAssociation = modeling.connect(taskShape, dataObjectRefShape1);\n        commandStack.undo();\n        commandStack.redo();\n\n        var dataOutputAssociations = taskShape.businessObject.get('dataOutputAssociations');\n\n        // then\n        expect(dataOutputAssociations[0].$parent).to.equal(taskShape.businessObject);\n        expect(dataOutputAssociations).to.include(outputAssociation.businessObject);\n        expect(taskShape.businessObject.get('dataInputAssociations')).to.be.empty;\n      }));\n\n    });\n\n\n    describe('dataInputAssociation', function() {\n\n      it('should execute', inject(function(modeling) {\n\n        // when\n        var inputAssociation = modeling.connect(dataObjectRefShape1, taskShape);\n\n        var dataInputAssociations = taskShape.businessObject.get('dataInputAssociations');\n\n        // then\n        expect(dataInputAssociations[0].$parent).to.equal(taskShape.businessObject);\n        expect(dataInputAssociations).to.include(inputAssociation.businessObject);\n        expect(taskShape.businessObject.get('dataOutputAssociations')).to.be.empty;\n      }));\n\n\n      it('should undo', inject(function(modeling, commandStack) {\n\n        // when\n        modeling.connect(dataObjectRefShape1, taskShape);\n        commandStack.undo();\n\n        // then\n        expect(taskShape.businessObject.get('dataOutputAssociations')).to.be.empty;\n        expect(taskShape.businessObject.get('dataInputAssociations')).to.be.empty;\n      }));\n\n\n      it('should redo', inject(function(modeling, commandStack) {\n\n        // when\n        var inputAssociation = modeling.connect(dataObjectRefShape1, taskShape);\n        commandStack.undo();\n        commandStack.redo();\n\n        var dataInputAssociations = taskShape.businessObject.get('dataInputAssociations');\n\n        // then\n        expect(dataInputAssociations[0].$parent).to.equal(taskShape.businessObject);\n        expect(dataInputAssociations).to.include(inputAssociation.businessObject);\n        expect(taskShape.businessObject.get('dataOutputAssociations')).to.be.empty;\n      }));\n\n    });\n\n  });\n\n\n  describe('remove', function() {\n\n    var processDiagramXML = require('./DataObjectBehavior.remove-data-association.bpmn');\n\n    beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n    var task1Shape,\n        task2Shape,\n        outputAssociation,\n        inputAssociation;\n\n    beforeEach(inject(function(canvas, elementRegistry) {\n      rootShape = canvas.getRootElement();\n\n      task1Shape = elementRegistry.get('Task_1');\n      task2Shape = elementRegistry.get('Task_2');\n\n      outputAssociation = elementRegistry.get('DataOutputAssociation_1');\n      inputAssociation = elementRegistry.get('DataInputAssociation_1');\n    }));\n\n\n    describe('DataOutputAssociation', function() {\n\n      it('should execute', inject(function(modeling) {\n\n        // when\n        modeling.removeConnection(outputAssociation);\n\n        // then\n        expect(task1Shape.businessObject.get('dataOutputAssociations')).to.be.empty;\n        expect(task1Shape.businessObject.get('dataInputAssociations')).to.be.empty;\n      }));\n\n\n      it('should undo', inject(function(modeling, commandStack) {\n\n        // when\n        modeling.removeConnection(outputAssociation);\n\n        commandStack.undo();\n\n        var dataOutputAssociations = task1Shape.businessObject.get('dataOutputAssociations');\n\n        // then\n        expect(dataOutputAssociations[0].$parent).to.equal(task1Shape.businessObject);\n        expect(dataOutputAssociations).to.be.include(outputAssociation.businessObject);\n        expect(task1Shape.businessObject.get('dataInputAssociations')).to.be.empty;\n      }));\n\n\n      it('should redo', inject(function(modeling, commandStack) {\n\n        // when\n        modeling.removeConnection(outputAssociation);\n\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expect(task1Shape.businessObject.get('dataOutputAssociations')).to.be.empty;\n        expect(task1Shape.businessObject.get('dataInputAssociations')).to.be.empty;\n      }));\n\n    });\n\n\n    describe('dataInputAssociation', function() {\n\n      it('should execute', inject(function(modeling) {\n\n        // when\n        modeling.removeConnection(inputAssociation);\n\n        // then\n        expect(task2Shape.businessObject.get('dataInputAssociations')).to.be.empty;\n        expect(task2Shape.businessObject.get('dataOutputAssociations')).to.be.empty;\n      }));\n\n\n      it('should undo', inject(function(modeling, commandStack) {\n\n        // when\n        modeling.removeConnection(inputAssociation);\n\n        commandStack.undo();\n\n        var dataInputAssociations = task2Shape.businessObject.get('dataInputAssociations');\n\n        // then\n        expect(dataInputAssociations[0].$parent).to.equal(task2Shape.businessObject);\n        expect(dataInputAssociations).to.include(inputAssociation.businessObject);\n        expect(task2Shape.businessObject.get('dataOutputAssociations')).to.be.empty;\n      }));\n\n\n      it('should redo', inject(function(modeling, commandStack) {\n\n        // when\n        modeling.removeConnection(inputAssociation);\n\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expect(task2Shape.businessObject.get('dataInputAssociations')).to.be.empty;\n        expect(task2Shape.businessObject.get('dataOutputAssociations')).to.be.empty;\n      }));\n\n    });\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/DataStoreBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.15.0-dev\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn:collaboration id=\"Collaboration\">\n    <bpmn:participant id=\"Participant\" processRef=\"Process\" />\n    <bpmn:participant id=\"Participant_2\" processRef=\"Process_2\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess\">\n      <bpmn:dataStoreReference id=\"DataStoreReference\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmn:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn:dataStoreReference id=\"DataStoreReference_2\" />\n    <bpmn:dataStoreReference id=\"DataStoreReference_3\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"Participant_di\" bpmnElement=\"Participant\" isHorizontal=\"false\">\n        <dc:Bounds x=\"42\" y=\"46\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_di\" bpmnElement=\"SubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"260\" y=\"73\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_di\" bpmnElement=\"DataStoreReference\">\n        <dc:Bounds x=\"400\" y=\"200\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"375\" y=\"245\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_066vvzt_di\" bpmnElement=\"Participant_2\">\n        <dc:Bounds x=\"42\" y=\"514\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_01wsbcu_di\" bpmnElement=\"DataStoreReference_2\">\n        <dc:Bounds x=\"150\" y=\"600\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"180.5438596491228\" y=\"685.7462887989204\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_135tyw7_di\" bpmnElement=\"DataStoreReference_3\">\n        <dc:Bounds x=\"500\" y=\"400\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"617\" y=\"478\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/DataStoreBehavior.collaboration.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.15.0-dev\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn:collaboration id=\"Collaboration\">\n    <bpmn:participant id=\"Participant\" processRef=\"Process\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process\" isExecutable=\"false\">\n    <bpmn:dataStoreReference id=\"DataStoreReference\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"Participant_di\" bpmnElement=\"Participant\" isHorizontal=\"false\">\n        <dc:Bounds x=\"42\" y=\"46\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_0acedkc_di\" bpmnElement=\"DataStoreReference\">\n        <dc:Bounds x=\"42\" y=\"350\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"67\" y=\"402\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/DataStoreBehavior.connect.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"Definitions_1\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:collaboration id=\"Collaboration\">\n    <bpmn:participant id=\"Participant\" processRef=\"Process\"/>\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process\" isExecutable=\"false\">\n    <bpmn:task id=\"Task\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:startEvent id=\"StartEvent\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:endEvent id=\"EndEvent\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:dataStoreReference id=\"DataStoreReference\" name=\"Data Store\" dataStoreRef=\"DataStore_1\"/>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"StartEvent\" targetRef=\"Task\"/>\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" name=\"\" sourceRef=\"Task\" targetRef=\"EndEvent\"/>\n  </bpmn:process>\n  <bpmn:dataStore id=\"DataStore_1\" name=\"Data Store 1\"/>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"Participant_di\" bpmnElement=\"Participant\" isHorizontal=\"false\">\n        <dc:Bounds height=\"250.0\" width=\"600.0\" x=\"84.0\" y=\"48.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_8\" bpmnElement=\"Task\">\n        <dc:Bounds height=\"76.0\" width=\"97.0\" x=\"264.0\" y=\"98.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_3\" bpmnElement=\"StartEvent\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"144.0\" y=\"118.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"162.0\" y=\"159.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"468.0\" y=\"118.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"486.0\" y=\"159.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_DataStoreReference_3\" bpmnElement=\"DataStoreReference\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"311.0\" y=\"204.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"21.0\" width=\"79.0\" x=\"297.0\" y=\"259.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_StartEvent_3\" targetElement=\"_BPMNShape_Task_8\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"180.0\" y=\"136.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"264.0\" y=\"136.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"_BPMNShape_Task_8\" targetElement=\"_BPMNShape_EndEvent_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"360.0\" y=\"136.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"468.0\" y=\"136.0\"/>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>"
  },
  {
    "path": "test/spec/features/modeling/behavior/DataStoreBehavior.empty-pool.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.15.0-dev\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn:collaboration id=\"Collaboration\">\n    <bpmn:participant id=\"Participant\" />\n    <bpmn:participant id=\"Participant_2\" processRef=\"Process_2\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_2\" isExecutable=\"false\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"Participant_di\" bpmnElement=\"Participant\" isHorizontal=\"false\">\n        <dc:Bounds x=\"42\" y=\"46\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_066vvzt_di\" bpmnElement=\"Participant_2\">\n        <dc:Bounds x=\"42\" y=\"514\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/DataStoreBehavior.process.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1pdhhel\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.15.1\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:dataStoreReference id=\"DataStoreReference\" />\n    <bpmn:subProcess id=\"SubProcess\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"DataStoreReference_0sw86lk_di\" bpmnElement=\"DataStoreReference\">\n        <dc:Bounds x=\"0\" y=\"0\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"25\" y=\"54\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_18wikk9_di\" bpmnElement=\"SubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"0\" y=\"100\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/DataStoreBehavior.remove-participant.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.17.0-dev\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn:collaboration id=\"Collaboration\">\n    <bpmn:participant id=\"Participant\" processRef=\"Process\" />\n    <bpmn:participant id=\"Participant_2\" processRef=\"Process_2\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process\" isExecutable=\"false\">\n    <bpmn:dataStoreReference id=\"DataStoreReference\" />\n    <bpmn:dataStoreReference id=\"DataStoreReference_2\" />\n  </bpmn:process>\n  <bpmn:process id=\"Process_2\" isExecutable=\"false\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"Participant_di\" bpmnElement=\"Participant\" isHorizontal=\"false\">\n        <dc:Bounds x=\"42\" y=\"46\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_di\" bpmnElement=\"DataStoreReference\">\n        <dc:Bounds x=\"42\" y=\"375\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"22\" y=\"425\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_066vvzt_di\" bpmnElement=\"Participant_2\">\n        <dc:Bounds x=\"50\" y=\"500\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_2_di\" bpmnElement=\"DataStoreReference_2\">\n        <dc:Bounds x=\"128\" y=\"375\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/DataStoreBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling/behavior - data store', function() {\n\n  var testModules = [ coreModule, modelingModule ];\n\n\n  describe('create', function() {\n\n    var processDiagramXML = require('./DataStoreBehavior.bpmn');\n\n    beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n\n    it('should create DataStoreReference on participant', inject(function(elementRegistry, modeling) {\n\n      // give\n      var participantElement = elementRegistry.get('Participant'),\n          participantBo = participantElement.businessObject,\n          processBo = participantBo.processRef;\n\n      // when\n      var dataStoreShape = modeling.createShape(\n        { type: 'bpmn:DataStoreReference' },\n        { x: 220, y: 220 },\n        participantElement\n      );\n\n      var dataStoreReference = dataStoreShape.businessObject;\n\n      // then\n      // reference correctly wired\n      expect(dataStoreReference.$parent).to.eql(processBo);\n      expect(processBo.flowElements).to.contain(dataStoreReference);\n\n      // no actual data store created\n      expect(dataStoreReference.dataStoreRef).not.to.exist;\n    }));\n\n\n    it('should create DataStoreReference on sub process', inject(function(elementRegistry, modeling) {\n\n      // give\n      var subProcessElement = elementRegistry.get('SubProcess'),\n          subProcessBo = subProcessElement.businessObject;\n\n      // when\n      var dataStoreShape = modeling.createShape(\n        { type: 'bpmn:DataStoreReference' },\n        { x: 420, y: 220 },\n        subProcessElement\n      );\n\n      var dataStoreReference = dataStoreShape.businessObject;\n\n      // then\n      // reference correctly wired\n      expect(dataStoreReference.$parent).to.eql(subProcessBo);\n      expect(subProcessBo.flowElements).to.contain(dataStoreReference);\n\n      // no actual data store created\n      expect(dataStoreReference.dataStoreRef).not.to.exist;\n    }));\n\n\n    it('should create DataStoreReference on collaboration', inject(function(elementRegistry, modeling) {\n\n      // give\n      var collaborationElement = elementRegistry.get('Collaboration'),\n          participantElement = elementRegistry.get('Participant'),\n          participantBo = participantElement.businessObject;\n\n      // when\n      var dataStoreShape = modeling.createShape(\n        { type: 'bpmn:DataStoreReference' },\n        { x: 420, y: 370 },\n        collaborationElement\n      );\n\n      var dataStoreReference = dataStoreShape.businessObject;\n\n      // then\n      // reference correctly wired\n      expect(dataStoreReference.$parent).to.eql(participantBo.processRef);\n      expect(participantBo.processRef.flowElements).to.contain(dataStoreReference);\n\n      // no actual data store created\n      expect(dataStoreReference.dataStoreRef).not.to.exist;\n    }));\n\n\n    describe('empty pool', function() {\n\n      var processDiagramXML = require('./DataStoreBehavior.empty-pool.bpmn');\n\n      beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n      it('should create DataStoreReference on collaboration if first participant is an empty pool',\n        inject(function(elementRegistry, modeling) {\n\n          // give\n          var collaboration = elementRegistry.get('Collaboration'),\n              participantWithProcess = elementRegistry.get('Participant_2').businessObject;\n\n          // when\n          var dataStoreShape = modeling.createShape(\n            { type: 'bpmn:DataStoreReference' },\n            { x: 420, y: 370 },\n            collaboration\n          );\n\n          var dataStoreReference = dataStoreShape.businessObject;\n\n          // then\n          // reference correctly wired\n          expect(dataStoreReference.$parent).to.exist;\n          expect(dataStoreReference.$parent).to.eql(participantWithProcess.processRef);\n          expect(participantWithProcess.processRef.flowElements).to.contain(dataStoreReference);\n\n          // no actual data store created\n          expect(dataStoreReference.dataStoreRef).not.to.exist;\n        })\n      );\n    });\n\n  });\n\n\n  describe('move', function() {\n\n    var processDiagramXML = require('./DataStoreBehavior.bpmn');\n\n    beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n\n    it('should move DataStoreReference to Participant', inject(function(elementRegistry, modeling) {\n\n      // give\n      var participantElement = elementRegistry.get('Participant'),\n          participantBo = participantElement.businessObject,\n          dataStoreReference = elementRegistry.get('DataStoreReference'),\n          dataStoreReferenceBo = dataStoreReference.businessObject;\n\n      // when\n      modeling.moveElements([ dataStoreReference ], { x: -200, y: 0 }, participantElement);\n\n      // then\n      expect(dataStoreReference.parent).to.eql(participantElement);\n      expect(dataStoreReferenceBo.$parent).to.eql(participantBo.processRef);\n    }));\n\n\n    it('should move DataStoreReference from partipant to Collaboration keeping parent participant', inject(\n      function(elementRegistry, modeling) {\n\n        // give\n        var collaborationElement = elementRegistry.get('Collaboration'),\n            participant2Element = elementRegistry.get('Participant_2'),\n            participant2Bo = participant2Element.businessObject,\n            dataStoreReference2 = elementRegistry.get('DataStoreReference_2'),\n            dataStoreReference2Bo = dataStoreReference2.businessObject;\n\n        // when\n        modeling.moveElements([ dataStoreReference2 ], { x: 0, y: 250 }, collaborationElement);\n\n        // then\n        expect(dataStoreReference2.parent).to.eql(collaborationElement);\n        expect(dataStoreReference2Bo.$parent).to.eql(participant2Bo.processRef);\n      })\n    );\n\n\n    it('should move DataStoreReference from subprocess to Collaboration keeping parent participant', inject(\n      function(elementRegistry, modeling) {\n\n        // give\n        var collaborationElement = elementRegistry.get('Collaboration'),\n            participantElement = elementRegistry.get('Participant'),\n            participantBo = participantElement.businessObject,\n            dataStoreReference = elementRegistry.get('DataStoreReference'),\n            dataStoreReferenceBo = dataStoreReference.businessObject;\n\n        // when\n        modeling.moveElements([ dataStoreReference ], { x: 0, y: 250 }, collaborationElement);\n\n        // then\n        expect(dataStoreReference.parent).to.eql(collaborationElement);\n        expect(dataStoreReferenceBo.$parent).to.eql(participantBo.processRef);\n      })\n    );\n\n\n    it('should move without changing parent', inject(\n      function(elementRegistry, modeling) {\n\n        // give\n        var collaborationElement = elementRegistry.get('Collaboration'),\n            participant2Element = elementRegistry.get('Participant_2'),\n            participant2Bo = participant2Element.businessObject,\n            dataStoreReference3 = elementRegistry.get('DataStoreReference_3'),\n            dataStoreReference3Bo = dataStoreReference3.businessObject;\n\n        // when\n        modeling.moveElements([ dataStoreReference3 ], { x: 50, y: 0 }, collaborationElement);\n\n        // then\n        expect(dataStoreReference3.parent).to.eql(collaborationElement);\n        expect(dataStoreReference3Bo.$parent).to.eql(participant2Bo.processRef);\n      })\n    );\n\n  });\n\n\n  describe('connect', function() {\n\n    var processDiagramXML = require('./DataStoreBehavior.connect.bpmn');\n\n    beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n\n    describe('dataOutputAssociation', function() {\n\n      it('should execute', inject(function(elementRegistry, modeling) {\n\n        // given\n        var taskShape = elementRegistry.get('Task'),\n            dataStoreRefShape = elementRegistry.get('DataStoreReference');\n\n        // when\n        var outputAssociation = modeling.connect(taskShape, dataStoreRefShape);\n\n        var dataOutputAssociations = taskShape.businessObject.get('dataOutputAssociations');\n\n        // then\n        expect(dataOutputAssociations).to.eql([ outputAssociation.businessObject ]);\n        expect(outputAssociation.businessObject.$parent).to.eql(taskShape.businessObject);\n\n        expect(taskShape.businessObject.get('dataInputAssociations')).to.be.empty;\n      }));\n\n\n      it('should undo', inject(function(elementRegistry, modeling, commandStack) {\n\n        // given\n        var taskShape = elementRegistry.get('Task'),\n            dataStoreRefShape = elementRegistry.get('DataStoreReference');\n\n        // when\n        modeling.connect(taskShape, dataStoreRefShape);\n        commandStack.undo();\n\n        // then\n        expect(taskShape.businessObject.get('dataOutputAssociations')).to.be.empty;\n        expect(taskShape.businessObject.get('dataInputAssociations')).to.be.empty;\n      }));\n\n\n      it('should redo', inject(function(elementRegistry, modeling, commandStack) {\n\n        // given\n        var taskShape = elementRegistry.get('Task'),\n            dataStoreRefShape = elementRegistry.get('DataStoreReference');\n\n        // when\n        var outputAssociation = modeling.connect(taskShape, dataStoreRefShape);\n        commandStack.undo();\n        commandStack.redo();\n\n        var dataOutputAssociations = taskShape.businessObject.get('dataOutputAssociations');\n\n        // then\n        expect(dataOutputAssociations).to.eql([ outputAssociation.businessObject ]);\n        expect(outputAssociation.businessObject.$parent).to.eql(taskShape.businessObject);\n\n        expect(taskShape.businessObject.get('dataInputAssociations')).to.be.empty;\n      }));\n\n    });\n\n\n    describe('dataInputAssociation', function() {\n\n      it('should execute', inject(function(elementRegistry, modeling) {\n\n        // given\n        var taskShape = elementRegistry.get('Task'),\n            dataStoreRefShape = elementRegistry.get('DataStoreReference');\n\n        // when\n        var inputAssociation = modeling.connect(dataStoreRefShape, taskShape);\n\n        var dataInputAssociations = taskShape.businessObject.get('dataInputAssociations');\n\n        // then\n        expect(dataInputAssociations).to.eql([ inputAssociation.businessObject ]);\n        expect(inputAssociation.businessObject.$parent).to.eql(taskShape.businessObject);\n\n        expect(taskShape.businessObject.get('dataOutputAssociations')).to.be.empty;\n      }));\n\n\n      it('should undo', inject(function(elementRegistry, modeling, commandStack) {\n\n        // given\n        var taskShape = elementRegistry.get('Task'),\n            dataStoreRefShape = elementRegistry.get('DataStoreReference');\n\n        // when\n        modeling.connect(dataStoreRefShape, taskShape);\n        commandStack.undo();\n\n        // then\n        expect(taskShape.businessObject.get('dataOutputAssociations')).to.be.empty;\n        expect(taskShape.businessObject.get('dataInputAssociations')).to.be.empty;\n      }));\n\n\n      it('should redo', inject(function(elementRegistry, modeling, commandStack) {\n\n        // given\n        var taskShape = elementRegistry.get('Task'),\n            dataStoreRefShape = elementRegistry.get('DataStoreReference');\n\n        // when\n        var inputAssociation = modeling.connect(dataStoreRefShape, taskShape);\n        commandStack.undo();\n        commandStack.redo();\n\n        var dataInputAssociations = taskShape.businessObject.get('dataInputAssociations');\n\n        // then\n        expect(dataInputAssociations[0].$parent).to.equal(taskShape.businessObject);\n        expect(dataInputAssociations).to.include(inputAssociation.businessObject);\n        expect(taskShape.businessObject.get('dataOutputAssociations')).to.be.empty;\n      }));\n\n    });\n\n  });\n\n\n  describe('process', function() {\n    var processDiagramXML = require('./DataStoreBehavior.process.bpmn');\n\n    beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n    it('should not update parent on subprocess delete', inject(\n      function(elementRegistry, eventBus, modeling) {\n\n        // given\n        var spy = sinon.spy();\n\n        eventBus.on('commandStack.dataStore.updateContainment.execute', spy);\n\n        var subProcessElement = elementRegistry.get('SubProcess');\n\n        // when\n        modeling.removeShape(subProcessElement);\n\n        // then\n        expect(spy).to.not.have.been.called;\n      }\n    ));\n\n  });\n\n\n  describe('collaboration', function() {\n\n    describe('update parent on participant removed', function() {\n      var processDiagramXML = require('./DataStoreBehavior.remove-participant.bpmn');\n\n      var dataStoreReferenceBo,\n          participantBo,\n          participant2Bo;\n\n      beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n      beforeEach(inject(function(elementRegistry, modeling) {\n\n        // given\n        var participantElement = elementRegistry.get('Participant'),\n            participant2Element = elementRegistry.get('Participant_2'),\n            dataStoreReference = elementRegistry.get('DataStoreReference');\n\n        dataStoreReferenceBo = dataStoreReference.businessObject;\n        participantBo = participantElement.businessObject;\n        participant2Bo = participant2Element.businessObject;\n\n        // when\n        modeling.removeShape(participantElement);\n      }));\n\n\n      it('should do', function() {\n\n        // then\n        expect(dataStoreReferenceBo.$parent).to.eql(participant2Bo.processRef);\n      });\n\n\n      it('should undo', inject(function(commandStack) {\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(dataStoreReferenceBo.$parent).to.eql(participantBo.processRef);\n      }));\n\n\n      it('should redo', inject(function(commandStack) {\n\n        // when\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expect(dataStoreReferenceBo.$parent).to.eql(participant2Bo.processRef);\n      }));\n\n    });\n\n\n    describe('collaboration -> process', function() {\n\n      var processDiagramXML = require('./DataStoreBehavior.collaboration.bpmn');\n\n      var dataStoreShape,\n          participant;\n\n      beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n      beforeEach(inject(function(elementRegistry, modeling) {\n        dataStoreShape = elementRegistry.get('DataStoreReference');\n\n        participant = elementRegistry.get('Participant');\n\n        // when\n        modeling.removeShape(participant);\n      }));\n\n\n      it('should do', inject(function(canvas) {\n        var rootElement = canvas.getRootElement();\n\n        // then\n        expect(dataStoreShape.businessObject.$parent).to.eql(rootElement.businessObject);\n      }));\n\n\n      it('should undo', inject(function(canvas, commandStack) {\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(dataStoreShape.businessObject.$parent).to.eql(participant.businessObject.processRef);\n      }));\n\n\n      it('should redo', inject(function(canvas, commandStack) {\n        var rootElement = canvas.getRootElement();\n\n        // when\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expect(dataStoreShape.businessObject.$parent).to.eql(rootElement.businessObject);\n      }));\n\n    });\n\n\n    describe('process -> collaboration', function() {\n\n      var processDiagramXML = require('./DataStoreBehavior.process.bpmn');\n\n      var dataStoreShape,\n          participant,\n          process;\n\n      beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n      beforeEach(inject(function(canvas, elementRegistry, modeling) {\n        process = canvas.getRootElement();\n\n        dataStoreShape = elementRegistry.get('DataStoreReference');\n\n        // when\n        participant = modeling.createShape(\n          { type: 'bpmn:Participant' },\n          { x: 200, y: 200 },\n          process\n        );\n      }));\n\n\n      it('should do', function() {\n\n        // then\n        expect(dataStoreShape.businessObject.$parent).to.eql(participant.businessObject.processRef);\n      });\n\n\n      it('should undo', inject(function(commandStack) {\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(dataStoreShape.businessObject.$parent).to.eql(process.businessObject);\n      }));\n\n\n      it('should redo', inject(function(commandStack) {\n\n        // when\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expect(dataStoreShape.businessObject.$parent).to.eql(participant.businessObject.processRef);\n      }));\n    });\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/DetachEventBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_0mwxlvp\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.3.5\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:task id=\"Task_1\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"BoundaryEvent_1\" targetRef=\"EndEvent_1\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_1\" name=\"foo\" attachedToRef=\"Task_1\">\n      <bpmn:documentation>bar</bpmn:documentation>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n    </bpmn:boundaryEvent>\n    <bpmn:endEvent id=\"EndEvent_1\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:boundaryEvent id=\"BoundaryConditionalEvent\" attachedToRef=\"Task_1\">\n      <bpmn:conditionalEventDefinition id=\"ConditionalEventDefinition_0gz47ju\">\n        <bpmn:condition xsi:type=\"bpmn:tFormalExpression\" />\n      </bpmn:conditionalEventDefinition>\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundaryMessageEvent\" attachedToRef=\"Task_1\">\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_1yr9oic\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundarySignalEvent\" attachedToRef=\"Task_1\">\n      <bpmn:signalEventDefinition id=\"SignalEventDefinition_1c2akhc\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundaryTimerEvent\" attachedToRef=\"Task_1\">\n      <bpmn:timerEventDefinition id=\"TimerEventDefinition_1dp1bzw\" />\n    </bpmn:boundaryEvent>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_06yfm3r_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"50\" y=\"60\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1tkizp1_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint x=\"100\" y=\"158\" />\n        <di:waypoint x=\"100\" y=\"182\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_171mrac_di\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds x=\"82\" y=\"122\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"92\" y=\"165\" width=\"16\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_0n5etz4_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"82\" y=\"182\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_0cj6ht4_di\" bpmnElement=\"BoundaryConditionalEvent\">\n        <dc:Bounds x=\"32\" y=\"42\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_0epopzx_di\" bpmnElement=\"BoundaryMessageEvent\">\n        <dc:Bounds x=\"132\" y=\"42\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1ocm5xo_di\" bpmnElement=\"BoundarySignalEvent\">\n        <dc:Bounds x=\"32\" y=\"122\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_041ew22_di\" bpmnElement=\"BoundaryTimerEvent\">\n        <dc:Bounds x=\"132\" y=\"122\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/DetachEventBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\n\nimport { getBusinessObject } from '../../../../../lib/util/ModelUtil';\n\n\ndescribe('features/modeling/behavior - detach events', function() {\n\n  var testModules = [\n    coreModule,\n    modelingModule\n  ];\n\n  var detachEventBehaviorXML = require('./DetachEventBehavior.bpmn');\n\n  beforeEach(bootstrapModeler(detachEventBehaviorXML, { modules: testModules }));\n\n\n  describe('basics', function() {\n\n    describe('create', function() {\n\n      it('should replace', inject(function(elementFactory, elementRegistry, modeling) {\n\n        // given\n        var process = elementRegistry.get('Process_1');\n\n        var boundaryEvent = elementFactory.createShape({ type: 'bpmn:BoundaryEvent' });\n\n        // when\n        var intermediateThrowEvent = modeling.createElements(\n          boundaryEvent, { x: 200, y: 100 }, process\n        )[0];\n\n        // then\n        var intermediateThrowEventBo = getBusinessObject(intermediateThrowEvent);\n\n        expect(intermediateThrowEventBo.$type).to.equal('bpmn:IntermediateThrowEvent');\n      }));\n\n\n      it('should NOT replace', inject(function(elementFactory, elementRegistry, modeling) {\n\n        // given\n        var task = elementRegistry.get('Task_1'),\n            taskBo = getBusinessObject(task);\n\n        var boundaryEvent = elementFactory.createShape({ type: 'bpmn:BoundaryEvent' }),\n            boundaryEventBo = getBusinessObject(boundaryEvent);\n\n        // when\n        boundaryEvent = modeling.createElements(\n          boundaryEvent, { x: 100, y: 60 }, task, { attach: true }\n        )[0];\n\n        // then\n        expect(boundaryEventBo.$type).to.equal('bpmn:BoundaryEvent');\n        expect(boundaryEventBo.attachedToRef).to.equal(taskBo);\n      }));\n\n\n      it('should copy properties', inject(\n        function(bpmnFactory, elementFactory, elementRegistry, modeling) {\n\n          // given\n          var process = elementRegistry.get('Process_1');\n\n          var boundaryEventBo = bpmnFactory.create('bpmn:BoundaryEvent', {\n            name: 'foo'\n          });\n\n          var documentation = bpmnFactory.create('bpmn:Documentation', {\n            text: 'bar'\n          });\n\n          boundaryEventBo.documentation = [ documentation ];\n\n          documentation.$parent = boundaryEventBo;\n\n          var boundaryEvent = elementFactory.createShape({\n            type: 'bpmn:BoundaryEvent',\n            businessObject: boundaryEventBo\n          });\n\n          // when\n          var intermediateThrowEvent = modeling.createElements(\n            boundaryEvent, { x: 200, y: 100 }, process\n          )[0];\n\n          // then\n          var intermediateThrowEventBo = getBusinessObject(intermediateThrowEvent);\n\n          expect(intermediateThrowEventBo.name).to.equal('foo');\n          expect(intermediateThrowEventBo.documentation).to.have.lengthOf(1);\n          expect(intermediateThrowEventBo.documentation[0].text).to.equal('bar');\n        }\n      ));\n\n    });\n\n\n    describe('move', function() {\n\n      it('should replace', inject(function(elementRegistry, modeling) {\n\n        // given\n        var process = elementRegistry.get('Process_1'),\n            boundaryEvent = elementRegistry.get('BoundaryEvent_1');\n\n        // when\n        modeling.moveElements([ boundaryEvent ], { x: 0, y: 100 }, process);\n\n        // then\n        var intermediateThrowEvent = elementRegistry.get('BoundaryEvent_1'),\n            intermediateThrowEventBo = getBusinessObject(intermediateThrowEvent);\n\n        expect(intermediateThrowEvent).to.exist;\n        expect(intermediateThrowEventBo.$type).to.equal('bpmn:IntermediateThrowEvent');\n        expect(intermediateThrowEventBo.attachedToRef).not.to.exist;\n      }));\n\n\n      it('should NOT replace', inject(function(elementRegistry, modeling) {\n\n        // given\n        var task = elementRegistry.get('Task_1'),\n            taskBo = getBusinessObject(task),\n            boundaryEvent = elementRegistry.get('BoundaryEvent_1');\n\n        // when\n        modeling.moveElements([ boundaryEvent ], { x: 0, y: -80 }, task, { attach: true });\n\n        // then\n        boundaryEvent = elementRegistry.get('BoundaryEvent_1');\n\n        var boundaryEventBo = getBusinessObject(boundaryEvent);\n\n        expect(boundaryEventBo.$type).to.equal('bpmn:BoundaryEvent');\n        expect(boundaryEventBo.attachedToRef).to.equal(taskBo);\n      }));\n\n\n      it('should replace multiple', inject(function(canvas, elementRegistry, modeling) {\n\n        // given\n        var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n            boundaryConditionalEvent = elementRegistry.get('BoundaryConditionalEvent'),\n            root = canvas.getRootElement();\n\n        // when\n        modeling.moveElements([ boundaryEvent, boundaryConditionalEvent ], { x: 0, y: 200 }, root);\n\n        // then\n        var intermediateThrowEvent = elementRegistry.get('BoundaryEvent_1'),\n            intermediateCatchEvent = elementRegistry.get('BoundaryConditionalEvent'),\n            intermediateThrowEventBo = getBusinessObject(intermediateThrowEvent),\n            intermediateCatchEventBo = getBusinessObject(intermediateCatchEvent);\n\n        expect(intermediateCatchEventBo.$type).to.equal('bpmn:IntermediateCatchEvent');\n        expect(intermediateCatchEventBo.attachedToRef).not.to.exist;\n\n        expect(intermediateThrowEventBo.$type).to.equal('bpmn:IntermediateThrowEvent');\n        expect(intermediateThrowEventBo.attachedToRef).not.to.exist;\n      }));\n\n\n      describe('properties', function() {\n\n        it('should copy properties', inject(function(elementRegistry, modeling) {\n\n          // given\n          var process = elementRegistry.get('Process_1'),\n              boundaryEvent = elementRegistry.get('BoundaryEvent_1');\n\n          // when\n          modeling.moveElements([ boundaryEvent ], { x: 0, y: 100 }, process);\n\n          // then\n          var intermediateThrowEvent = elementRegistry.get('BoundaryEvent_1'),\n              intermediateThrowEventBo = getBusinessObject(intermediateThrowEvent);\n\n          expect(intermediateThrowEventBo.name).to.equal('foo');\n          expect(intermediateThrowEventBo.documentation).to.have.lengthOf(1);\n          expect(intermediateThrowEventBo.documentation[0].text).to.equal('bar');\n        }));\n\n\n        describe('event definitions', function() {\n\n          var ids = [\n            'BoundaryConditionalEvent',\n            'BoundaryMessageEvent',\n            'BoundarySignalEvent',\n            'BoundaryTimerEvent'\n          ];\n\n          ids.forEach(function(id) {\n\n            it('should copy event definition', inject(function(elementRegistry, modeling) {\n\n              // given\n              var process = elementRegistry.get('Process_1'),\n                  boundaryEvent = elementRegistry.get(id),\n                  boundaryEventBo = getBusinessObject(boundaryEvent),\n                  eventDefinitions = boundaryEventBo.eventDefinitions;\n\n              // when\n              modeling.moveElements([ boundaryEvent ], { x: 0, y: 100 }, process);\n\n              // then\n              var intermediateCatchEvent = elementRegistry.get(id),\n                  intermediateCatchEventBo = getBusinessObject(intermediateCatchEvent);\n\n              expect(intermediateCatchEventBo.$type).to.equal('bpmn:IntermediateCatchEvent');\n              expect(intermediateCatchEventBo.eventDefinitions).to.jsonEqual(eventDefinitions, skipId);\n            }));\n\n          });\n\n\n          it('should NOT create event definition', inject(function(elementRegistry, modeling) {\n\n            // given\n            var process = elementRegistry.get('Process_1'),\n                boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n                boundaryEventBo = getBusinessObject(boundaryEvent),\n                eventDefinitions = boundaryEventBo.eventDefinitions;\n\n            // when\n            modeling.moveElements([ boundaryEvent ], { x: 0, y: 100 }, process);\n\n            // then\n            var intermediateThrowEvent = elementRegistry.get('BoundaryEvent_1'),\n                intermediateThrowEventBo = getBusinessObject(intermediateThrowEvent);\n\n            expect(intermediateThrowEventBo.$type).to.equal('bpmn:IntermediateThrowEvent');\n            expect(intermediateThrowEventBo.eventDefinitions).to.jsonEqual(eventDefinitions, skipId);\n          }));\n\n        });\n\n      });\n\n    });\n\n  });\n\n\n  describe('connections', function() {\n\n    it('should NOT remove outgoing connection', inject(function(elementRegistry, modeling) {\n\n      // given\n      var process = elementRegistry.get('Process_1'),\n          endEvent = elementRegistry.get('EndEvent_1'),\n          boundaryEvent = elementRegistry.get('BoundaryEvent_1');\n\n      // when\n      modeling.moveElements([ boundaryEvent ], { x: 0, y: 100 }, process);\n\n      // then\n      var intermediateThrowEvent = elementRegistry.get('BoundaryEvent_1');\n\n      expect(intermediateThrowEvent.outgoing).to.have.lengthOf(1);\n      expect(endEvent.incoming).to.have.lengthOf(1);\n    }));\n\n\n    it('should lay out connection once', inject(function(eventBus, elementRegistry, modeling) {\n\n      // given\n      var process = elementRegistry.get('Process_1'),\n          boundaryEvent = elementRegistry.get('BoundaryEvent_1');\n\n      var layoutSpy = sinon.spy();\n\n      eventBus.on('commandStack.connection.layout.execute', layoutSpy);\n\n      // when\n      modeling.moveElements([ boundaryEvent ], { x: 0, y: 100 }, process);\n\n      // then\n      expect(layoutSpy).to.be.calledOnce;\n    }));\n\n  });\n\n\n  describe('labels', function() {\n\n    it('should NOT replace', inject(function(elementRegistry, modeling) {\n\n      var process = elementRegistry.get('Process_1'),\n          boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n          label = boundaryEvent.label;\n\n      // when\n      modeling.moveElements([ label ], { x: 0, y: 100 }, process);\n\n      // then\n      expect(elementRegistry.get('BoundaryEvent_1')).to.equal(boundaryEvent);\n    }));\n\n  });\n\n});\n\n\n\n// helpers //////////\nfunction skipId(key, value) {\n  if (key === 'id') {\n    return;\n  }\n\n  return value;\n}\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/DropOnFlowBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.5.0\">\n  <bpmn:process id=\"Process\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_3</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Task_1\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n      <bpmn:incoming>SequenceFlow_4</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent\" targetRef=\"Task_1\" />\n    <bpmn:intermediateThrowEvent id=\"IntermediateThrowEvent_foo\" />\n    <bpmn:endEvent id=\"EndEvent_foo\" />\n    <bpmn:startEvent id=\"StartEvent_foo\" />\n    <bpmn:task id=\"Task_2\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" name=\"FOO BAR\" sourceRef=\"Task_1\" targetRef=\"Task_2\" />\n    <bpmn:task id=\"Task_3\" />\n    <bpmn:task id=\"Task_4\">\n      <bpmn:incoming>SequenceFlow_3</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_4</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_3\" sourceRef=\"StartEvent\" targetRef=\"Task_4\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_4\" sourceRef=\"Task_4\" targetRef=\"Task_1\" />\n    <bpmn:task id=\"Task_A\" name=\"A\">\n      <bpmn:outgoing>SequenceFlow_D</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:endEvent id=\"EndEvent_E\" name=\"E\">\n      <bpmn:incoming>SequenceFlow_D</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_D\" name=\"D\" sourceRef=\"Task_A\" targetRef=\"EndEvent_E\" />\n    <bpmn:task id=\"Task_B\" name=\"B\">\n      <bpmn:incoming>SequenceFlow_F</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:exclusiveGateway id=\"Gateway_C\" name=\"C\">\n      <bpmn:outgoing>SequenceFlow_F</bpmn:outgoing>\n    </bpmn:exclusiveGateway>\n    <bpmn:sequenceFlow id=\"SequenceFlow_F\" name=\"F\" sourceRef=\"Gateway_C\" targetRef=\"Task_B\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"502\" y=\"259\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"209\" y=\"120\" />\n        <di:waypoint x=\"340\" y=\"120\" />\n        <di:waypoint x=\"340\" y=\"299\" />\n        <di:waypoint x=\"502\" y=\"299\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"297.5\" y=\"110\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_foo_di\" bpmnElement=\"IntermediateThrowEvent_foo\">\n        <dc:Bounds x=\"173\" y=\"192\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"191\" y=\"228\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_foo_di\" bpmnElement=\"EndEvent_foo\">\n        <dc:Bounds x=\"173\" y=\"281\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"191\" y=\"317\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_foo_di\" bpmnElement=\"StartEvent_foo\">\n        <dc:Bounds x=\"534\" y=\"192\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"552\" y=\"228\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"797\" y=\"259\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_2_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint x=\"602\" y=\"299\" />\n        <di:waypoint x=\"797\" y=\"299\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"675\" y=\"274\" width=\"50\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_3_di\" bpmnElement=\"Task_3\">\n        <dc:Bounds x=\"141\" y=\"371\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_4_di\" bpmnElement=\"Task_4\">\n        <dc:Bounds x=\"407\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_3_di\" bpmnElement=\"SequenceFlow_3\">\n        <di:waypoint x=\"209\" y=\"120\" />\n        <di:waypoint x=\"407\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_4_di\" bpmnElement=\"SequenceFlow_4\">\n        <di:waypoint x=\"457\" y=\"160\" />\n        <di:waypoint x=\"457\" y=\"281\" />\n        <di:waypoint x=\"502\" y=\"281\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_1xw6gq5_di\" bpmnElement=\"Task_A\">\n        <dc:Bounds x=\"407\" y=\"371\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_00zofun_di\" bpmnElement=\"EndEvent_E\">\n        <dc:Bounds x=\"829\" y=\"393\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"843\" y=\"436\" width=\"8\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1ffa0ic_di\" bpmnElement=\"SequenceFlow_D\">\n        <di:waypoint x=\"507\" y=\"411\" />\n        <di:waypoint x=\"829\" y=\"411\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"755\" y=\"393\" width=\"9\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_0ozobww_di\" bpmnElement=\"Task_B\">\n        <dc:Bounds x=\"640\" y=\"500\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_0e1smh5_di\" bpmnElement=\"Gateway_C\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"432\" y=\"515\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"453\" y=\"572\" width=\"9\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1xz9674_di\" bpmnElement=\"SequenceFlow_F\">\n        <di:waypoint x=\"482\" y=\"540\" />\n        <di:waypoint x=\"640\" y=\"540\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"558\" y=\"522\" width=\"7\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/DropOnFlowBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  flatten\n} from 'min-dash';\n\nimport coreModule from 'lib/core';\nimport moveModule from 'diagram-js/lib/features/move';\nimport modelingModule from 'lib/features/modeling';\n\nimport {\n  createCanvasEvent as canvasEvent\n} from '../../../../util/MockEvents';\n\nimport { getMid } from 'diagram-js/lib/layout/LayoutUtil';\n\n\ndescribe('modeling/behavior - drop on connection', function() {\n\n  var diagramXML = require('./DropOnFlowBehavior.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: [\n      moveModule,\n      modelingModule,\n      coreModule\n    ]\n  }));\n\n\n  describe('execution', function() {\n\n    describe('create', function() {\n\n      describe('should connect start -> target -> end', function() {\n\n        it('connection middle', inject(\n          function(modeling, elementRegistry, elementFactory) {\n\n            // given\n            var intermediateThrowEvent = elementFactory.createShape({\n              type: 'bpmn:IntermediateThrowEvent'\n            });\n\n            var startEvent = elementRegistry.get('StartEvent'),\n                sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n                task = elementRegistry.get('Task_1');\n\n            var originalWaypoints = sequenceFlow.waypoints;\n\n            var dropPosition = { x: 340, y: 120 }; // first bendpoint\n\n            // when\n            var newShape = modeling.createShape(\n              intermediateThrowEvent,\n              dropPosition,\n              sequenceFlow\n            );\n\n            // then\n            var targetConnection = newShape.outgoing[0];\n\n            // new incoming connection\n            expect(newShape.incoming).to.have.length(1);\n            expect(newShape.incoming[0]).to.eql(sequenceFlow);\n\n            // new outgoing connection\n            expect(newShape.outgoing).to.have.length(1);\n            expect(targetConnection).to.exist;\n            expect(targetConnection.type).to.equal('bpmn:SequenceFlow');\n\n            expect(startEvent.outgoing[0]).to.equal(newShape.incoming[0]);\n            expect(task.incoming[1]).to.equal(newShape.outgoing[0]);\n\n            // split target at insertion point\n            expect(sequenceFlow).to.have.waypoints(flatten([\n              originalWaypoints.slice(0, 1),\n              { x: 322, y: 120 }\n            ]));\n\n            expect(sequenceFlow).to.have.endDocking(dropPosition);\n\n            expect(targetConnection).to.have.waypoints(flatten([\n              { x: 340, y: 138 },\n              originalWaypoints.slice(2)\n            ]));\n\n            expect(targetConnection).to.have.startDocking(dropPosition);\n          }\n        ));\n\n\n        it('close to source', inject(\n          function(modeling, elementRegistry, elementFactory) {\n\n            // given\n            var dropElement = elementFactory.createShape({\n              type: 'bpmn:IntermediateThrowEvent'\n            });\n\n            var start = elementRegistry.get('Gateway_C'),\n                flow = elementRegistry.get('SequenceFlow_F'),\n                end = elementRegistry.get('Task_B');\n\n            var originalWaypoints = flow.waypoints.slice();\n\n            var dropPosition = { x: 495, y: 540 }; // overlapping source\n\n            // when\n            var newShape = modeling.createShape(\n              dropElement,\n              dropPosition,\n              flow\n            );\n\n            // then\n            var targetConnection = newShape.outgoing[0];\n\n            // new incoming connection\n            expect(newShape.incoming).to.have.length(1);\n            expect(newShape.incoming[0]).to.equal(flow);\n\n            // new outgoing connection\n            expect(newShape.outgoing).to.have.length(1);\n            expect(targetConnection).to.exist;\n            expect(targetConnection.type).to.equal('bpmn:SequenceFlow');\n\n            expect(start.outgoing[0]).to.equal(newShape.incoming[0]);\n            expect(end.incoming[0]).to.equal(newShape.outgoing[0]);\n\n            // split target at insertion point\n            expect(flow).to.have.waypoints(flatten([\n              originalWaypoints.slice(0, 1),\n              [\n                { x: 477, y: 540 }\n              ]\n            ]));\n\n            expect(flow).to.have.endDocking(dropPosition);\n\n            expect(targetConnection).to.have.waypoints(flatten([\n              { x: 513, y: 540 },\n              originalWaypoints.slice(1)\n            ]));\n\n            expect(targetConnection).to.have.startDocking(dropPosition);\n          }\n        ));\n\n\n        it('close to target', inject(\n          function(modeling, elementRegistry, elementFactory) {\n\n            // given\n            var dropElement = elementFactory.createShape({\n              type: 'bpmn:IntermediateThrowEvent'\n            });\n\n            var start = elementRegistry.get('Gateway_C'),\n                flow = elementRegistry.get('SequenceFlow_F'),\n                end = elementRegistry.get('Task_B');\n\n            var originalWaypoints = flow.waypoints.slice();\n\n            var dropPosition = { x: 625, y: 540 }; // overlapping target\n\n            // when\n            var newShape = modeling.createShape(\n              dropElement,\n              dropPosition,\n              flow\n            );\n\n            // then\n            var targetConnection = newShape.outgoing[0];\n\n            // new incoming connection\n            expect(newShape.incoming).to.have.length(1);\n            expect(newShape.incoming[0]).to.equal(flow);\n\n            // new outgoing connection\n            expect(newShape.outgoing).to.have.length(1);\n            expect(targetConnection).to.exist;\n            expect(targetConnection.type).to.equal('bpmn:SequenceFlow');\n\n            expect(start.outgoing[0]).to.equal(newShape.incoming[0]);\n            expect(end.incoming[0]).to.equal(newShape.outgoing[0]);\n\n            // split target at insertion point\n            expect(flow).to.have.waypoints(flatten([\n              originalWaypoints.slice(0, 1),\n              [\n                { x: 607, y: 540 }\n              ]\n            ]));\n\n            expect(flow).to.have.endDocking(dropPosition);\n\n            expect(targetConnection).to.have.waypoints(flatten([\n              { x: 643, y: 540 },\n              originalWaypoints.slice(1)\n            ]));\n\n            expect(targetConnection).to.have.startDocking(dropPosition);\n          }\n        ));\n\n      });\n\n\n\n\n      it('should connect start -> target', inject(\n        function(modeling, elementRegistry, elementFactory) {\n\n          // given\n          var endEventShape = elementFactory.createShape({ type: 'bpmn:EndEvent' });\n\n          var sequenceFlow = elementRegistry.get('SequenceFlow_1');\n          var originalWaypoints = sequenceFlow.waypoints;\n\n          var dropPosition = { x: 340, y: 120 }; // first bendpoint\n\n          // when\n          var newShape = modeling.createShape(\n            endEventShape,\n            dropPosition,\n            sequenceFlow\n          );\n\n          // then\n\n          // new incoming connection\n          expect(newShape.incoming).to.have.length(1);\n          expect(newShape.incoming[0]).to.eql(sequenceFlow);\n\n          // no outgoing edges\n          expect(newShape.outgoing).to.have.length(0);\n\n          // split target at insertion point\n          expect(sequenceFlow).to.have.waypoints(flatten([\n            originalWaypoints.slice(0, 1),\n            { x: 322, y: 120 }\n          ]));\n        }\n      ));\n\n\n      it('should connect target -> end', inject(\n        function(modeling, elementRegistry, elementFactory) {\n\n          // given\n          var startEventShape = elementFactory.createShape({\n            type: 'bpmn:StartEvent'\n          });\n\n          var sequenceFlow = elementRegistry.get('SequenceFlow_1');\n          var originalWaypoints = sequenceFlow.waypoints;\n\n          var dropPosition = { x: 340, y: 120 }; // first bendpoint\n\n          // when\n          var newShape = modeling.createShape(\n            startEventShape,\n            dropPosition,\n            sequenceFlow\n          );\n\n          // then\n\n          // no incoming connection\n          expect(newShape.incoming).to.have.length(0);\n\n          // no outgoing edges\n          expect(newShape.outgoing).to.have.length(1);\n          expect(newShape.outgoing[0]).to.eql(sequenceFlow);\n\n          // split target at insertion point\n          expect(sequenceFlow).to.have.waypoints(flatten([\n            { x: 340, y: 138 },\n            originalWaypoints.slice(2)\n          ]));\n        }\n      ));\n\n\n      it('should connect start -> target -> end (with bendpointBefore inside bbox)', inject(\n        function(modeling, elementRegistry, elementFactory) {\n\n          // given\n          var taskShape = elementFactory.createShape({ type: 'bpmn:Task' }),\n              sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n              originalWaypoints = sequenceFlow.waypoints,\n              dropPosition = { x: 340, y: 145 }; // 25 pixels below bendpoint\n\n          // when\n          modeling.createShape(taskShape, dropPosition, sequenceFlow);\n\n          // then\n          // split target but don't keep insertion point\n          expect(sequenceFlow).to.have.waypoints(flatten([\n            originalWaypoints.slice(0, 1),\n            { x: 290, y: 120 }\n          ]));\n\n          expect(sequenceFlow).to.have.endDocking({ x: 340, y: 120 });\n        }\n      ));\n\n\n      it('should connect start -> target -> end (with bendpointAfter inside bbox)', inject(\n        function(modeling, elementRegistry, elementFactory) {\n\n          // given\n          var taskShape = elementFactory.createShape({ type: 'bpmn:Task' }),\n              sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n              originalWaypoints = sequenceFlow.waypoints,\n              dropPosition = { x: 340, y: 280 }; // 25 pixels above bendpoint\n\n          // when\n          var newShape = modeling.createShape(taskShape, dropPosition, sequenceFlow),\n              targetConnection = newShape.outgoing[0];\n\n          // then\n          // split target but don't keep insertion point\n          expect(targetConnection).to.have.waypoints(flatten([\n            { x: 390, y: 299 },\n            originalWaypoints.slice(3)\n          ]));\n\n          expect(targetConnection).to.have.startDocking({ x: 340, y: 299 });\n        }\n      ));\n\n\n      it('should handle shape created with bounds', inject(\n        function(elementFactory, elementRegistry, modeling) {\n\n          // given\n          var intermediateThrowEvent = elementFactory.createShape({\n            type: 'bpmn:IntermediateThrowEvent'\n          });\n\n          var startEvent = elementRegistry.get('StartEvent'),\n              sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n              task = elementRegistry.get('Task_1');\n\n          var originalWaypoints = sequenceFlow.waypoints;\n\n          var dropBounds = { x: 322, y: 102, width: 36, height: 36 }; // first bendpoint\n\n          // when\n          var newShape = modeling.createShape(\n            intermediateThrowEvent,\n            dropBounds,\n            sequenceFlow\n          );\n\n          // then\n          var targetConnection = newShape.outgoing[0];\n\n          // new incoming connection\n          expect(newShape.incoming).to.have.length(1);\n          expect(newShape.incoming[0]).to.eql(sequenceFlow);\n\n          // new outgoing connection\n          expect(newShape.outgoing).to.have.length(1);\n          expect(targetConnection).to.exist;\n          expect(targetConnection.type).to.equal('bpmn:SequenceFlow');\n\n          expect(startEvent.outgoing[0]).to.equal(newShape.incoming[0]);\n          expect(task.incoming[1]).to.equal(newShape.outgoing[0]);\n\n          // split target at insertion point\n          expect(sequenceFlow).to.have.waypoints(flatten([\n            originalWaypoints.slice(0, 1),\n            { x: 322, y: 120 }\n          ]));\n\n          expect(sequenceFlow).to.have.endDocking(getMid(dropBounds));\n\n          expect(targetConnection).to.have.waypoints(flatten([\n            { x: 340, y: 138 },\n            originalWaypoints.slice(2)\n          ]));\n\n          expect(targetConnection).to.have.startDocking(getMid(dropBounds));\n        }\n      ));\n\n    });\n\n\n    describe('move', function() {\n\n      beforeEach(inject(function(dragging) {\n        dragging.setOptions({ manual: true });\n      }));\n\n\n      it('should connect start -> target -> end', inject(\n        function(dragging, move, elementRegistry, selection) {\n\n          // given\n          var intermediateThrowEvent = elementRegistry.get('IntermediateThrowEvent_foo');\n\n          var startEvent = elementRegistry.get('StartEvent'),\n              sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n              sequenceFlowGfx = elementRegistry.getGraphics(sequenceFlow),\n              task = elementRegistry.get('Task_1');\n\n          var originalWaypoints = sequenceFlow.waypoints;\n\n          // when\n          selection.select(intermediateThrowEvent);\n\n          move.start(canvasEvent({ x: 0, y: 0 }), intermediateThrowEvent);\n\n          dragging.hover({\n            element: sequenceFlow,\n            gfx: sequenceFlowGfx\n          });\n\n          dragging.move(canvasEvent({ x: 149, y: 0 }));\n\n          dragging.end();\n\n          // then\n          var targetConnection = intermediateThrowEvent.outgoing[0];\n\n          // new incoming connection\n          expect(intermediateThrowEvent.incoming).to.have.length(1);\n          expect(intermediateThrowEvent.incoming[0]).to.eql(sequenceFlow);\n\n          // new outgoing connection\n          expect(intermediateThrowEvent.outgoing).to.have.length(1);\n          expect(targetConnection).to.exist;\n          expect(targetConnection.type).to.equal('bpmn:SequenceFlow');\n\n          expect(startEvent.outgoing[0]).to.equal(intermediateThrowEvent.incoming[0]);\n          expect(task.incoming[1]).to.equal(intermediateThrowEvent.outgoing[0]);\n\n          // split target at insertion point\n          expect(sequenceFlow).to.have.waypoints(flatten([\n            originalWaypoints.slice(0, 2),\n            { x: 340, y: 192 }\n          ]));\n\n          expect(sequenceFlow).to.have.endDocking({ x: 340, y: 210 });\n\n          expect(targetConnection).to.have.waypoints(flatten([\n            { x: 340, y: 228 },\n            originalWaypoints.slice(2)\n          ]));\n\n          expect(targetConnection).to.have.startDocking({ x: 340, y: 210 });\n        }\n      ));\n\n\n      it('should connect start -> target -> end (hovering parent)', inject(\n        function(dragging, move, elementRegistry, selection, canvas) {\n\n          // given\n          var intermediateThrowEvent = elementRegistry.get('IntermediateThrowEvent_foo');\n\n          var startEvent = elementRegistry.get('StartEvent'),\n              sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n              task = elementRegistry.get('Task_1'),\n              rootElement = canvas.getRootElement(),\n              rootElementGfx = elementRegistry.getGraphics(rootElement);\n\n          var originalWaypoints = sequenceFlow.waypoints;\n\n          // when\n          selection.select(intermediateThrowEvent);\n\n          move.start(canvasEvent({ x: 0, y: 0 }), intermediateThrowEvent);\n\n          dragging.hover({\n            element: rootElement,\n            gfx: rootElementGfx\n          });\n\n          dragging.move(canvasEvent({ x: 149, y: 0 }));\n          dragging.end();\n\n          // then\n          var targetConnection = intermediateThrowEvent.outgoing[0];\n\n          // new incoming connection\n          expect(intermediateThrowEvent.incoming).to.have.length(1);\n          expect(intermediateThrowEvent.incoming[0]).to.eql(sequenceFlow);\n\n          // new outgoing connection\n          expect(intermediateThrowEvent.outgoing).to.have.length(1);\n          expect(targetConnection).to.exist;\n          expect(targetConnection.type).to.equal('bpmn:SequenceFlow');\n\n          expect(startEvent.outgoing[0]).to.equal(intermediateThrowEvent.incoming[0]);\n          expect(task.incoming[1]).to.equal(intermediateThrowEvent.outgoing[0]);\n\n          // split target at insertion point\n          expect(sequenceFlow).to.have.waypoints(flatten([\n            originalWaypoints.slice(0, 2),\n            { x: 340, y: 192 }\n          ]));\n\n          expect(sequenceFlow).to.have.endDocking({ x: 340, y: 210 });\n\n          expect(targetConnection).to.have.waypoints(flatten([\n            { x: 340, y: 228 },\n            originalWaypoints.slice(2)\n          ]));\n\n          expect(targetConnection).to.have.startDocking({ x: 340, y: 210 });\n        }\n      ));\n\n\n      it('should connect start -> target -> end (with bendpointBefore inside bbox)', inject(\n        function(elementRegistry, selection, move, dragging) {\n\n          // given\n          var task3 = elementRegistry.get('Task_3'),\n              sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n              sequenceFlowGfx = elementRegistry.getGraphics(sequenceFlow),\n              originalWaypoints = sequenceFlow.waypoints;\n\n          // when\n          selection.select(task3);\n\n          move.start(canvasEvent({ x: 0, y: 0 }), task3);\n\n          dragging.hover({\n            element: sequenceFlow,\n            gfx: sequenceFlowGfx\n          });\n\n          dragging.move(canvasEvent({ x: 149, y: -130 }));\n          dragging.end();\n\n          // then\n          // split target but don't keep insertion point\n          expect(sequenceFlow).to.have.waypoints(flatten([\n            originalWaypoints.slice(0, 2),\n            { x: 340, y: 241 }\n          ]));\n\n          expect(sequenceFlow).to.have.endDocking({ x: 340, y: 281 });\n        }\n      ));\n\n\n      it('should connect start -> target -> end (with bendpointAfter inside bbox)', inject(\n        function(elementRegistry, selection, move, dragging) {\n\n          // given\n          var task3 = elementRegistry.get('Task_3'),\n              sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n              sequenceFlowGfx = elementRegistry.getGraphics(sequenceFlow),\n              originalWaypoints = sequenceFlow.waypoints;\n\n          // when\n          selection.select(task3);\n\n          move.start(canvasEvent({ x: 0, y: 0 }), task3);\n\n          dragging.hover({\n            element: sequenceFlow,\n            gfx: sequenceFlowGfx\n          });\n\n          dragging.move(canvasEvent({ x: 170, y: -110 }));\n          dragging.end();\n\n          // then\n          // split target but don't keep insertion point\n          expect(sequenceFlow).to.have.waypoints(flatten([\n            originalWaypoints.slice(0, 2),\n            { x: 340, y: 261 }\n          ]));\n\n          expect(sequenceFlow).to.have.endDocking({ x: 340, y: 299 });\n        }\n      ));\n\n\n      it('should connect start -> target -> end (keeping target outgoing flows)', inject(\n        function(elementRegistry, selection, move, dragging) {\n\n          // given\n          var gateway_C = elementRegistry.get('Gateway_C'),\n              task_B = elementRegistry.get('task_B'),\n              sequenceFlow = elementRegistry.get('SequenceFlow_D'),\n              sequenceFlowGfx = elementRegistry.getGraphics(sequenceFlow);\n\n          // when\n          selection.select(gateway_C);\n\n          move.start(canvasEvent({ x: 0, y: 0 }), gateway_C);\n\n          dragging.hover({\n            element: sequenceFlow,\n            gfx: sequenceFlowGfx\n          });\n\n          dragging.move(canvasEvent({ x: 160, y: -130 }));\n          dragging.end();\n\n          // then\n          expect(gateway_C.outgoing).to.have.length(2);\n\n          expect(gateway_C.outgoing[0].gateway_C).to.eql(task_B);\n        }\n      ));\n\n\n      it('should connect start -> target', inject(\n        function(modeling, elementRegistry, selection, move, dragging) {\n\n          // given\n          var endEventShape = elementRegistry.get('EndEvent_foo');\n\n          var sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n              sequenceFlowGfx = elementRegistry.getGraphics(sequenceFlow),\n              originalWaypoints = sequenceFlow.waypoints;\n\n          // when\n          selection.select(endEventShape);\n\n          move.start(canvasEvent({ x: 0, y: 0 }), endEventShape);\n\n          dragging.hover({\n            element: sequenceFlow,\n            gfx: sequenceFlowGfx\n          });\n\n          dragging.move(canvasEvent({ x: 150, y: 0 }));\n\n          dragging.end();\n\n          // then\n\n          // new incoming connection\n          expect(endEventShape.incoming).to.have.length(1);\n          expect(endEventShape.incoming[0]).to.eql(sequenceFlow);\n\n          // no outgoing edges\n          expect(endEventShape.outgoing).to.have.length(0);\n\n          // split target at insertion point\n          expect(sequenceFlow).to.have.waypoints(flatten([\n            originalWaypoints.slice(0, 2),\n            { x: 340, y: 281 }\n          ]));\n        }\n      ));\n\n\n      it('should connect target -> end', inject(\n        function(modeling, elementRegistry, dragging, selection, move) {\n\n          var startEventShape = elementRegistry.get('StartEvent_foo');\n\n          var sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n              sequenceFlowGfx = elementRegistry.getGraphics(sequenceFlow),\n              originalWaypoints = sequenceFlow.waypoints;\n\n          // when\n          selection.select(startEventShape);\n\n          move.start(canvasEvent({ x: 0, y: 0 }), startEventShape);\n\n          dragging.hover({\n            element: sequenceFlow,\n            gfx: sequenceFlowGfx\n          });\n\n          dragging.move(canvasEvent({ x: -215, y: 0 }));\n\n          dragging.end();\n\n          // then\n\n          // no incoming connection\n          expect(startEventShape.incoming).to.have.length(0);\n\n          // 1 outgoing connection\n          expect(startEventShape.outgoing).to.have.length(1);\n          expect(startEventShape.outgoing[0]).to.eql(sequenceFlow);\n\n          // split target at insertion point\n          expect(sequenceFlow).to.have.waypoints(flatten([\n            { x: 338, y: 228 },\n            originalWaypoints.slice(2)\n          ]));\n        }\n      ));\n\n\n      it('should undo', inject(\n        function(modeling, elementRegistry, dragging, selection, move, commandStack) {\n\n          // given\n          var startEventShape = elementRegistry.get('StartEvent_foo');\n\n          var sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n              sequenceFlowGfx = elementRegistry.getGraphics(sequenceFlow),\n              originalWaypoints = sequenceFlow.waypoints;\n\n          selection.select(startEventShape);\n\n          move.start(canvasEvent({ x: 0, y: 0 }), startEventShape);\n\n          dragging.hover({\n            element: sequenceFlow,\n            gfx: sequenceFlowGfx\n          });\n\n          dragging.move(canvasEvent({ x: -215, y: 0 }));\n\n          dragging.end();\n\n          // when\n          commandStack.undo();\n\n          // then\n\n          // no incoming connection\n          expect(startEventShape.incoming).to.have.length(0);\n\n          // no outgoing edges\n          expect(startEventShape.outgoing).to.have.length(0);\n\n          // split target at insertion point\n          expect(sequenceFlow).to.have.waypoints(flatten([ originalWaypoints ]));\n        }\n      ));\n\n\n      it('should not insert on inaccuratly found intersection', inject(\n        function(dragging, move, elementRegistry, selection) {\n\n          // given\n          var intermediateThrowEvent = elementRegistry.get('IntermediateThrowEvent_foo');\n\n          var sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n              sequenceFlowGfx = elementRegistry.getGraphics(sequenceFlow);\n\n          // when\n          selection.select(intermediateThrowEvent);\n\n          move.start(canvasEvent({ x: 0, y: 0 }), intermediateThrowEvent);\n\n          dragging.hover({\n            element: sequenceFlow,\n            gfx: sequenceFlowGfx\n          });\n\n          dragging.move(canvasEvent({ x: 20, y: -90 }));\n\n          dragging.end();\n\n          // then\n          expect(intermediateThrowEvent.incoming).to.have.lengthOf(0);\n          expect(intermediateThrowEvent.outgoing).to.have.lengthOf(0);\n        }\n      ));\n\n\n      it('should remove redundant flows', inject(\n        function(elementRegistry, selection, move, dragging) {\n\n          var existingIncoming = elementRegistry.get('SequenceFlow_3'),\n              existingOutgoing = elementRegistry.get('SequenceFlow_4');\n\n          // given\n          var element = elementRegistry.get('Task_4');\n\n          var targetFlow = elementRegistry.get('SequenceFlow_1'),\n              targetFlowGfx = elementRegistry.getGraphics(targetFlow);\n\n          // when\n          selection.select(element);\n\n          move.start(canvasEvent({ x: 0, y: 0 }), element);\n\n          dragging.hover({\n            element: targetFlow,\n            gfx: targetFlowGfx\n          });\n\n          dragging.move(canvasEvent({ x: -40, y: 179 }));\n\n          dragging.end();\n\n          // then\n          // existing connections are removed, as they are duplicates\n          expect(element.incoming).not.to.contain(existingIncoming);\n          expect(element.outgoing).not.to.contain(existingOutgoing);\n        }\n      ));\n\n    });\n\n  });\n\n\n  describe('rules', function() {\n\n    it('should be allowed for an IntermediateThrowEvent', inject(\n      function(elementRegistry, bpmnRules, elementFactory) {\n\n        // when\n        var sequenceFlow = elementRegistry.get('SequenceFlow_1');\n        var intermediateThrowEvent = elementFactory.createShape({\n          type: 'bpmn:IntermediateThrowEvent'\n        });\n\n        // then\n        expect(bpmnRules.canCreate(intermediateThrowEvent, sequenceFlow)).to.be.true;\n      }\n    ));\n\n\n    it('should not insert participant', inject(\n      function(rules, elementRegistry, elementFactory) {\n\n        // given\n        var participantShape = elementFactory.createShape({\n          type: 'bpmn:Participant'\n        });\n\n        var sequenceFlow = elementRegistry.get('SequenceFlow_1');\n\n        var dropPosition = { x: 340, y: 120 }; // first bendpoint\n\n        // when\n        var canDrop = rules.allowed('shape.create', {\n          shape: participantShape,\n          parent: sequenceFlow,\n          dropPosition: dropPosition\n        });\n\n        // then\n        expect(canDrop).to.be.false;\n      }\n    ));\n\n\n    it('should not insert multiple with \"move\"', inject(\n      function(elementRegistry, selection, move, dragging) {\n\n        // given\n        var intermediateThrowEvent = elementRegistry.get('IntermediateThrowEvent_foo'),\n            endEventShape = elementRegistry.get('EndEvent_foo');\n\n        var sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n            sequenceFlowGfx = elementRegistry.getGraphics(sequenceFlow);\n\n        var intInitPosition = {\n              x: intermediateThrowEvent.x,\n              y: intermediateThrowEvent.y\n            },\n            endInitPosition = {\n              x: endEventShape.x,\n              y: endEventShape.y\n            };\n\n        selection.select([ intermediateThrowEvent, endEventShape ]);\n\n        // when\n        move.start(canvasEvent({ x: 0, y: 0 }), intermediateThrowEvent);\n\n        dragging.hover({\n          element: sequenceFlow,\n          gfx: sequenceFlowGfx\n        });\n\n        dragging.move(canvasEvent({ x: -215, y: 0 }));\n\n        dragging.end();\n\n        // then\n        expect(intermediateThrowEvent).to.have.position(intInitPosition);\n        expect(endEventShape).to.have.position(endInitPosition);\n      }\n    ));\n\n\n    it('should not insert on sequence flow label', inject(\n      function(bpmnRules, elementRegistry) {\n\n        // given\n        var eventShape = elementRegistry.get('IntermediateThrowEvent_foo'),\n            sequenceFlowLabel = elementRegistry.get('SequenceFlow_2').label;\n\n        var dropPosition = { x: 675, y: 275 }; // sequence flow label\n\n        // when\n        var canInsert = bpmnRules.canInsert(eventShape, sequenceFlowLabel, dropPosition);\n\n        // then\n        expect(canInsert).to.be.false;\n      }\n    ));\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/EventBasedGatewayBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"simple\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.3.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:exclusiveGateway id=\"ExclusiveGateway_1\" name=\"ExclusiveGateway_1\">\n      <bpmn2:outgoing>Flow_1</bpmn2:outgoing>\n    </bpmn2:exclusiveGateway>\n    <bpmn2:sequenceFlow id=\"Flow_1\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"ReceiveTask_1\" />\n    <bpmn2:eventBasedGateway id=\"EventBasedGateway_1\" name=\"EventBasedGateway_1\">\n      <bpmn2:outgoing>Flow_2</bpmn2:outgoing>\n    </bpmn2:eventBasedGateway>\n    <bpmn2:receiveTask id=\"ReceiveTask_1\" name=\"ReceiveTask_1\">\n      <bpmn2:incoming>Flow_1</bpmn2:incoming>\n    </bpmn2:receiveTask>\n    <bpmn2:receiveTask id=\"ReceiveTask_2\" name=\"ReceiveTask_2\">\n      <bpmn2:incoming>Flow_2</bpmn2:incoming>\n    </bpmn2:receiveTask>\n    <bpmn2:sequenceFlow id=\"Flow_2\" sourceRef=\"EventBasedGateway_1\" targetRef=\"ReceiveTask_2\" />\n    <bpmn2:exclusiveGateway id=\"ExclusiveGateway_2\" name=\"ExclusiveGateway_2\">\n      <bpmn2:outgoing>Flow_3</bpmn2:outgoing>\n    </bpmn2:exclusiveGateway>\n    <bpmn2:sequenceFlow id=\"Flow_3\" sourceRef=\"ExclusiveGateway_2\" targetRef=\"ReceiveTask_3\" />\n    <bpmn2:exclusiveGateway id=\"ExclusiveGateway_3\" name=\"ExclusiveGateway_3\">\n      <bpmn2:outgoing>Flow_4</bpmn2:outgoing>\n      <bpmn2:outgoing>Flow_5</bpmn2:outgoing>\n    </bpmn2:exclusiveGateway>\n    <bpmn2:sequenceFlow id=\"Flow_4\" sourceRef=\"ExclusiveGateway_3\" targetRef=\"ReceiveTask_3\" />\n    <bpmn2:sequenceFlow id=\"Flow_5\" sourceRef=\"ExclusiveGateway_3\" targetRef=\"ReceiveTask_3\" />\n    <bpmn2:receiveTask id=\"ReceiveTask_3\" name=\"ReceiveTask_3\">\n      <bpmn2:incoming>Flow_3</bpmn2:incoming>\n      <bpmn2:incoming>Flow_4</bpmn2:incoming>\n      <bpmn2:incoming>Flow_5</bpmn2:incoming>\n    </bpmn2:receiveTask>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Gateway_1wefl7j_di\" bpmnElement=\"EventBasedGateway_1\">\n        <dc:Bounds x=\"265\" y=\"185\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"158\" y=\"196.5\" width=\"84\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_0s8ifis_di\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"265\" y=\"75\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"157\" y=\"86\" width=\"85\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0k6a6pv_di\" bpmnElement=\"ReceiveTask_1\">\n        <dc:Bounds x=\"370\" y=\"60\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0l7czq3_di\" bpmnElement=\"ReceiveTask_2\">\n        <dc:Bounds x=\"370\" y=\"170\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_1kkha1e_di\" bpmnElement=\"ExclusiveGateway_2\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"265\" y=\"295\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"157\" y=\"306\" width=\"85\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_057376f_di\" bpmnElement=\"ExclusiveGateway_3\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"265\" y=\"515\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"157\" y=\"526\" width=\"85\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0qf0p4m_di\" bpmnElement=\"ReceiveTask_3\">\n        <dc:Bounds x=\"370\" y=\"390\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_0k5xi5w_di\" bpmnElement=\"Flow_2\">\n        <di:waypoint x=\"315\" y=\"210\" />\n        <di:waypoint x=\"370\" y=\"210\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1f09lb6_di\" bpmnElement=\"Flow_1\">\n        <di:waypoint x=\"315\" y=\"100\" />\n        <di:waypoint x=\"370\" y=\"100\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0ojkt0j_di\" bpmnElement=\"Flow_3\">\n        <di:waypoint x=\"315\" y=\"320\" />\n        <di:waypoint x=\"420\" y=\"320\" />\n        <di:waypoint x=\"420\" y=\"390\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1imp0g6_di\" bpmnElement=\"Flow_4\">\n        <di:waypoint x=\"290\" y=\"515\" />\n        <di:waypoint x=\"290\" y=\"430\" />\n        <di:waypoint x=\"370\" y=\"430\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1xglf9s_di\" bpmnElement=\"Flow_5\">\n        <di:waypoint x=\"315\" y=\"540\" />\n        <di:waypoint x=\"420\" y=\"540\" />\n        <di:waypoint x=\"420\" y=\"470\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/EventBasedGatewayBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport createModule from 'diagram-js/lib/features/create';\nimport modelingModule from 'lib/features/modeling';\nimport replaceModule from 'lib/features/replace';\n\nimport { createCanvasEvent as canvasEvent } from '../../../../util/MockEvents';\n\n\ndescribe('features/modeling/behavior - event-based gateway', function() {\n\n  var diagramXML = require('./EventBasedGatewayBehavior.bpmn');\n\n  var testModules = [\n    coreModule,\n    modelingModule,\n    replaceModule\n  ];\n\n\n  describe('create connection', function() {\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    it('event-based gateway to receive task', inject(\n      function(elementRegistry, modeling) {\n\n        // given\n        var eventBasedGateway = elementRegistry.get('EventBasedGateway_1'),\n            receiveTask = elementRegistry.get('ReceiveTask_1');\n\n        // assume\n        expect(receiveTask.incoming).to.have.length(1);\n\n        // when\n        var connection = modeling.connect(eventBasedGateway, receiveTask, {\n          type: 'bpmn:SequenceFlow'\n        });\n\n        // then\n        expect(receiveTask.incoming).to.have.length(1);\n        expect(receiveTask.incoming[ 0 ]).to.equal(connection);\n      }\n    ));\n\n\n    it('event-based gateway to receive task (duplicate connection)', inject(\n      function(elementRegistry, modeling) {\n\n        // given\n        var eventBasedGateway = elementRegistry.get('EventBasedGateway_1'),\n            receiveTask = elementRegistry.get('ReceiveTask_2');\n\n        // assume\n        expect(receiveTask.incoming).to.have.length(1);\n\n        // when\n        var connection = modeling.connect(eventBasedGateway, receiveTask, {\n          type: 'bpmn:SequenceFlow'\n        });\n\n        // then\n        expect(receiveTask.incoming).to.have.length(1);\n        expect(receiveTask.incoming[ 0 ]).to.equal(connection);\n      }\n    ));\n\n\n    it('exclusive gateway to receive task', inject(\n      function(elementRegistry, modeling) {\n\n        // given\n        var eventBasedGateway = elementRegistry.get('ExclusiveGateway_1'),\n            receiveTask = elementRegistry.get('ReceiveTask_2');\n\n        // assume\n        expect(receiveTask.incoming).to.have.length(1);\n\n        // when\n        var connection = modeling.connect(eventBasedGateway, receiveTask, {\n          type: 'bpmn:SequenceFlow'\n        });\n\n        // then\n        expect(receiveTask.incoming).to.have.length(1);\n        expect(receiveTask.incoming[ 0 ]).to.equal(connection);\n      }\n    ));\n\n  });\n\n\n  describe('replace shape', function() {\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    it('exclusive gateway with event-based gateway', inject(\n      function(bpmnReplace, elementRegistry) {\n\n        // given\n        var exclusiveGateway = elementRegistry.get('ExclusiveGateway_3'),\n            receiveTask = elementRegistry.get('ReceiveTask_3');\n\n        // assume\n        expect(exclusiveGateway.outgoing).to.have.length(2);\n        expect(receiveTask.incoming).to.have.length(3);\n\n        // when\n        var eventBasedGateway = bpmnReplace.replaceElement(exclusiveGateway, {\n          type: 'bpmn:EventBasedGateway'\n        });\n\n        // then\n        expect(eventBasedGateway.outgoing).to.have.length(1);\n        expect(receiveTask.incoming).to.have.length(1);\n      }\n    ));\n\n\n    it('event-based gateway with exclusive gateway', inject(\n      function(bpmnReplace, elementRegistry) {\n\n        // given\n        var eventBasedGateway = elementRegistry.get('EventBasedGateway_1');\n\n        // assume\n        expect(eventBasedGateway.outgoing).to.have.length(1);\n\n        // when\n        var exclusiveGateway = bpmnReplace.replaceElement(eventBasedGateway, {\n          type: 'bpmn:ExclusiveGateway'\n        });\n\n        // then\n        expect(exclusiveGateway.outgoing).to.have.length(1);\n      }\n    ));\n\n  });\n\n});\n\n\ndescribe('features/modeling/behavior - event-based gateway - integration', function() {\n\n  var diagramXML = require('./EventBasedGatewayBehavior.bpmn');\n\n  var testModules = [\n    coreModule,\n    createModule,\n    modelingModule,\n    replaceModule\n  ];\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: testModules\n  }));\n\n\n  it('should create with target', inject(\n    function(create, elementRegistry, elementFactory, dragging) {\n\n      // given\n      const gateway = elementFactory.createShape({\n        type: 'bpmn:EventBasedGateway',\n        x: 0,\n        y: 0\n      });\n\n      const event = elementFactory.createShape({\n        type: 'bpmn:IntermediateCatchEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition',\n        x: 120,\n        y: 120\n      });\n\n      const waypoints = [\n        { x: gateway.x, y: gateway.y },\n        { x: event.x, y: event.y }\n      ];\n\n      const connection = elementFactory.createConnection({\n        type: 'bpmn:SequenceFlow',\n        source: gateway,\n        target: event,\n        waypoints\n      });\n\n      const rootElement = elementRegistry.get('Process_1');\n      const rootGfx = elementRegistry.getGraphics('Process_1');\n\n      // when\n      create.start(canvasEvent({ x: 0, y: 0 }), [ gateway, event, connection ]);\n      dragging.hover({ element: rootElement, gfx: rootGfx });\n      dragging.move(canvasEvent({ x: 100, y: 200 }));\n      dragging.end();\n\n      // then\n      expect(elementRegistry.get(connection.id)).to.exist;\n    }\n  ));\n\n});"
  },
  {
    "path": "test/spec/features/modeling/behavior/FixHoverBehavior.annotation.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.19.0\">\n  <process id=\"Process\" isExecutable=\"false\">\n    <task id=\"Task\" />\n    <textAnnotation id=\"TextAnnotation_1\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Process\">\n      <bpmndi:BPMNShape id=\"TextAnnotation_0fmduw3_di\" bpmnElement=\"TextAnnotation_1\">\n        <omgdc:Bounds x=\"154\" y=\"80\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_di\" bpmnElement=\"Task\">\n        <omgdc:Bounds x=\"154\" y=\"131\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/FixHoverBehavior.group.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"4.0.0-beta.1\">\n  <process id=\"Process\">\n    <task id=\"Task\" />\n    <group id=\"Group\" categoryValueRef=\"CategoryValue_1heb3m9\" />\n  </process>\n  <category id=\"Category_1g60m2v\">\n    <categoryValue id=\"CategoryValue_1heb3m9\" />\n  </category>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Process\">\n      <bpmndi:BPMNShape id=\"Task_di\" bpmnElement=\"Task\">\n        <omgdc:Bounds x=\"264\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_di\" bpmnElement=\"Group\">\n        <omgdc:Bounds x=\"185\" y=\"200\" width=\"150\" height=\"120\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/FixHoverBehavior.label.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"4.0.0-beta.1\">\n  <process id=\"Process\">\n    <startEvent id=\"StartEvent\" name=\"A\" />\n    <task id=\"Task\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Process\">\n      <bpmndi:BPMNShape id=\"StartEvent_di\" bpmnElement=\"StartEvent\">\n        <omgdc:Bounds x=\"156\" y=\"103\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"171\" y=\"146\" width=\"7\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_di\" bpmnElement=\"Task\">\n        <omgdc:Bounds x=\"264\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/FixHoverBehavior.lane-connect.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"4.0.0-beta.1\">\n  <collaboration id=\"Collaboration_07d1e5q\">\n    <participant id=\"Participant_No_Lanes\" processRef=\"Process_1\" />\n    <participant id=\"Participant_Lanes\" processRef=\"Process_2\" />\n    <messageFlow id=\"MessageFlow_1\" sourceRef=\"Participant_No_Lanes\" targetRef=\"Participant_Lanes\" />\n    <messageFlow id=\"MessageFlow_2\" sourceRef=\"Participant_Lanes\" targetRef=\"Participant_No_Lanes\" />\n  </collaboration>\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <task id=\"Task\" />\n  </process>\n  <process id=\"Process_2\">\n    <laneSet id=\"LaneSet_1hz9u1w\">\n      <lane id=\"Lane_1\" />\n      <lane id=\"Lane_2\" />\n    </laneSet>\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Collaboration_07d1e5q\">\n      <bpmndi:BPMNShape id=\"Participant_No_Lanes_di\" bpmnElement=\"Participant_No_Lanes\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"180\" y=\"90\" width=\"460\" height=\"140\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_di\" bpmnElement=\"Task\">\n        <omgdc:Bounds x=\"330\" y=\"120\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_Lanes_di\" bpmnElement=\"Participant_Lanes\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"180\" y=\"280\" width=\"460\" height=\"240\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1_di\" bpmnElement=\"Lane_1\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"210\" y=\"280\" width=\"430\" height=\"120\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_2_di\" bpmnElement=\"Lane_2\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"210\" y=\"400\" width=\"430\" height=\"120\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_1_di\" bpmnElement=\"MessageFlow_1\">\n        <di:waypoint x=\"510\" y=\"230\" />\n        <di:waypoint x=\"510\" y=\"280\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"MessageFlow_2_di\" bpmnElement=\"MessageFlow_2\">\n        <di:waypoint x=\"540\" y=\"280\" />\n        <di:waypoint x=\"540\" y=\"230\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/FixHoverBehavior.participant.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_033nbwh\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.1.0\">\n  <bpmn:collaboration id=\"Collaboration_1hb173f\">\n    <bpmn:participant id=\"Participant_1\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:laneSet id=\"LaneSet_01fnrsu\">\n      <bpmn:lane id=\"Lane_1\">\n        <bpmn:flowNodeRef>Task_1</bpmn:flowNodeRef>\n      </bpmn:lane>\n      <bpmn:lane id=\"Lane_2\" />\n    </bpmn:laneSet>\n    <bpmn:task id=\"Task_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1hb173f\">\n      <bpmndi:BPMNShape id=\"Participant_00m5vpq_di\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"100\" y=\"100\" width=\"600\" height=\"370\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0wx2ruq_di\" bpmnElement=\"Lane_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"130\" y=\"100\" width=\"570\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1guzz8c_di\" bpmnElement=\"Lane_2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"130\" y=\"350\" width=\"570\" height=\"120\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1dr11gk_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"400\" y=\"200\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/FixHoverBehaviorSpec.js",
    "content": "import {\r\n  bootstrapModeler,\r\n  inject\r\n} from 'test/TestHelper';\r\n\r\nimport coreModule from 'lib/core';\r\nimport createModule from 'diagram-js/lib/features/create';\r\nimport modelingModule from 'lib/features/modeling';\r\nimport moveModule from 'diagram-js/lib/features/move';\r\nimport globalConnectModule from 'diagram-js/lib/features/global-connect';\r\nimport connectionPreview from 'diagram-js/lib/features/connection-preview';\r\nimport bendpointsModule from 'diagram-js/lib/features/bendpoints';\r\n\r\nimport { createCanvasEvent as canvasEvent } from '../../../../util/MockEvents';\r\n\r\nvar testModules = [\r\n  coreModule,\r\n  createModule,\r\n  moveModule,\r\n  modelingModule\r\n];\r\n\r\n\r\ndescribe('features/modeling/behavior - fix hover', function() {\r\n\r\n  describe('drop on lane', function() {\r\n\r\n    var diagramXML = require('./FixHoverBehavior.participant.bpmn');\r\n\r\n    beforeEach(bootstrapModeler(diagramXML, {\r\n      modules: testModules\r\n    }));\r\n\r\n    beforeEach(inject(function(dragging) {\r\n      dragging.setOptions({ manual: true });\r\n    }));\r\n\r\n    var lane,\r\n        laneGfx,\r\n        participant,\r\n        participantGfx;\r\n\r\n    beforeEach(inject(function(elementRegistry) {\r\n      participant = elementRegistry.get('Participant_1');\r\n      participantGfx = elementRegistry.getGraphics(participant);\r\n\r\n      lane = elementRegistry.get('Lane_1');\r\n      laneGfx = elementRegistry.getGraphics(lane);\r\n    }));\r\n\r\n\r\n    describe('create', function() {\r\n\r\n      it('should <create.hover> participant', inject(\r\n        function(create, dragging, elementFactory) {\r\n\r\n          // given\r\n          var task = elementFactory.createShape({ type: 'bpmn:Task' });\r\n\r\n          create.start(canvasEvent({ x: 0, y: 0 }), task, true);\r\n\r\n          // when\r\n          dragging.hover({ element: lane, gfx: laneGfx });\r\n\r\n          dragging.move(canvasEvent({ x: 200, y: 200 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          expect(task.parent).to.equal(participant);\r\n        }\r\n      ));\r\n\r\n\r\n      it('should <create.out> participant', inject(\r\n        function(create, dragging, elementFactory, eventBus) {\r\n\r\n          // given\r\n          var task = elementFactory.createShape({ type: 'bpmn:Task' });\r\n\r\n          var outSpy = sinon.spy(function(event) {\r\n            expect(event.hover).to.eql(participant);\r\n            expect(event.hoverGfx).to.eql(participantGfx);\r\n          });\r\n\r\n          eventBus.on('create.out', outSpy);\r\n\r\n          create.start(canvasEvent({ x: 0, y: 0 }), task, true);\r\n\r\n          dragging.hover({ element: lane, gfx: laneGfx });\r\n\r\n          dragging.move(canvasEvent({ x: 200, y: 200 }));\r\n\r\n          // when\r\n          dragging.out({ element: lane, gfx: laneGfx });\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          expect(outSpy).to.have.been.calledOnce;\r\n        }\r\n      ));\r\n\r\n    });\r\n\r\n\r\n    describe('move', function() {\r\n\r\n      it('should <shape.move.hover> participant', inject(\r\n        function(dragging, elementRegistry, move) {\r\n\r\n          // given\r\n          var task = elementRegistry.get('Task_1');\r\n\r\n          move.start(canvasEvent({ x: 440, y: 220 }), task, true);\r\n\r\n          // when\r\n          dragging.hover({ element: lane, gfx: laneGfx });\r\n\r\n          dragging.move(canvasEvent({ x: 240, y: 220 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          expect(task.parent).to.equal(participant);\r\n        }\r\n      ));\r\n\r\n\r\n      it('should <shape.move.out> participant', inject(\r\n        function(dragging, elementRegistry, move, eventBus) {\r\n\r\n          // given\r\n          var task = elementRegistry.get('Task_1');\r\n\r\n          var outSpy = sinon.spy(function(event) {\r\n            expect(event.hover).to.eql(participant);\r\n            expect(event.hoverGfx).to.eql(participantGfx);\r\n          });\r\n\r\n          eventBus.on('shape.move.out', outSpy);\r\n\r\n          move.start(canvasEvent({ x: 440, y: 220 }), task, true);\r\n\r\n          dragging.hover({ element: lane, gfx: laneGfx });\r\n\r\n          dragging.move(canvasEvent({ x: 240, y: 220 }));\r\n\r\n          // when\r\n          dragging.out({ element: lane, gfx: laneGfx });\r\n\r\n          // then\r\n          expect(outSpy).to.have.been.calledOnce;\r\n        }\r\n      ));\r\n\r\n    });\r\n\r\n  });\r\n\r\n\r\n  describe('label', function() {\r\n\r\n    var diagramXML = require('./FixHoverBehavior.label.bpmn');\r\n\r\n    beforeEach(bootstrapModeler(diagramXML, {\r\n      modules: testModules\r\n    }));\r\n\r\n    beforeEach(inject(function(dragging) {\r\n      dragging.setOptions({ manual: true });\r\n    }));\r\n\r\n\r\n    describe('move', function() {\r\n\r\n      it('should <shape.move.hover> root', inject(\r\n        function(dragging, elementRegistry, move, canvas) {\r\n\r\n          // given\r\n          var startEvent = elementRegistry.get('StartEvent');\r\n\r\n          var label = startEvent.label;\r\n\r\n          move.start(canvasEvent({ x: 175, y: 150 }), label, true);\r\n\r\n          // when\r\n          dragging.hover({ element: startEvent, gfx: elementRegistry.getGraphics(startEvent) });\r\n\r\n          dragging.move(canvasEvent({ x: 240, y: 220 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          expect(label.parent).to.equal(canvas.getRootElement());\r\n        }\r\n      ));\r\n\r\n    });\r\n\r\n  });\r\n\r\n\r\n  describe('group', function() {\r\n\r\n    var diagramXML = require('./FixHoverBehavior.group.bpmn');\r\n\r\n    beforeEach(bootstrapModeler(diagramXML, {\r\n      modules: testModules\r\n    }));\r\n\r\n    beforeEach(inject(function(dragging) {\r\n      dragging.setOptions({ manual: true });\r\n    }));\r\n\r\n\r\n    describe('create', function() {\r\n\r\n      it('should <create.hover> root', inject(\r\n        function(dragging, elementFactory, elementRegistry, create, canvas) {\r\n\r\n          // given\r\n          var task = elementRegistry.get('Task');\r\n\r\n          var group = elementFactory.createShape({ type: 'bpmn:Group' });\r\n\r\n          create.start(canvasEvent({ x: 0, y: 0 }), group, true);\r\n\r\n          // when\r\n          dragging.hover({ element: task, gfx: elementRegistry.getGraphics(task) });\r\n\r\n          dragging.move(canvasEvent({ x: 240, y: 220 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          expect(group.parent).to.equal(canvas.getRootElement());\r\n        }\r\n      ));\r\n\r\n    });\r\n\r\n\r\n    describe('move', function() {\r\n\r\n      it('should <shape.move.hover> root', inject(\r\n        function(dragging, elementRegistry, move, canvas) {\r\n\r\n          // given\r\n          var task = elementRegistry.get('Task');\r\n          var group = elementRegistry.get('Group');\r\n\r\n          move.start(canvasEvent({ x: 175, y: 150 }), group, true);\r\n\r\n          // when\r\n          dragging.hover({ element: task, gfx: elementRegistry.getGraphics(task) });\r\n\r\n          dragging.move(canvasEvent({ x: 240, y: 220 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          expect(group.parent).to.equal(canvas.getRootElement());\r\n        }\r\n      ));\r\n\r\n    });\r\n\r\n  });\r\n\r\n\r\n  describe('Annotation', function() {\r\n\r\n    var diagramXML = require('./FixHoverBehavior.annotation.bpmn');\r\n\r\n    beforeEach(bootstrapModeler(diagramXML, {\r\n      modules: testModules\r\n    }));\r\n\r\n    beforeEach(inject(function(dragging) {\r\n      dragging.setOptions({ manual: true });\r\n    }));\r\n\r\n\r\n    describe('create', function() {\r\n\r\n      it('should <create.hover> root', inject(\r\n        function(dragging, elementFactory, elementRegistry, create, canvas) {\r\n\r\n          // given\r\n          var task = elementRegistry.get('Task');\r\n\r\n          var annotation = elementFactory.createShape({ type: 'bpmn:TextAnnotation' });\r\n\r\n          create.start(canvasEvent({ x: 0, y: 0 }), annotation, true);\r\n\r\n          // when\r\n          dragging.hover({ element: task, gfx: elementRegistry.getGraphics(task) });\r\n\r\n          dragging.move(canvasEvent({ x: 240, y: 220 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          expect(annotation.parent).to.equal(canvas.getRootElement());\r\n        }\r\n      ));\r\n\r\n    });\r\n\r\n\r\n    describe('move', function() {\r\n\r\n      it('should <shape.move.hover> root', inject(\r\n        function(dragging, elementRegistry, move, canvas) {\r\n\r\n          // given\r\n          var task = elementRegistry.get('Task');\r\n          var annotation = elementRegistry.get('TextAnnotation_1');\r\n\r\n          move.start(canvasEvent({ x: 175, y: 150 }), annotation, true);\r\n\r\n          // when\r\n          dragging.hover({ element: task, gfx: elementRegistry.getGraphics(task) });\r\n\r\n          dragging.move(canvasEvent({ x: 240, y: 220 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          expect(annotation.parent).to.equal(canvas.getRootElement());\r\n        }\r\n      ));\r\n\r\n    });\r\n\r\n  });\r\n\r\n\r\n  describe('connect lane', function() {\r\n\r\n    var diagramXML = require('./FixHoverBehavior.lane-connect.bpmn');\r\n\r\n    beforeEach(bootstrapModeler(diagramXML, {\r\n      modules: testModules.concat([\r\n        globalConnectModule,\r\n        bendpointsModule,\r\n        connectionPreview\r\n      ])\r\n    }));\r\n\r\n    beforeEach(inject(function(dragging) {\r\n      dragging.setOptions({ manual: true });\r\n    }));\r\n\r\n\r\n    describe('global-connect', function() {\r\n\r\n      it('should set global connect source to participant', inject(\r\n        function(globalConnect, elementRegistry, eventBus, dragging) {\r\n\r\n          // given\r\n          var participant_lanes = elementRegistry.get('Participant_Lanes');\r\n          var lane_1 = elementRegistry.get('Lane_1');\r\n\r\n          var connectSpy = sinon.spy(function(event) {\r\n            expect(event.context.startTarget).to.eql(participant_lanes);\r\n          });\r\n\r\n          eventBus.once('global-connect.end', connectSpy);\r\n\r\n          // when\r\n          globalConnect.start(canvasEvent({ x: 0, y: 0 }));\r\n\r\n          dragging.move(canvasEvent({ x: 150, y: 130 }));\r\n          dragging.hover(canvasEvent({ x: 150, y: 130 }, { element: lane_1 }));\r\n          dragging.end(canvasEvent({ x: 0, y: 0 }));\r\n\r\n          // then\r\n          expect(connectSpy).to.have.been.called;\r\n        }\r\n      ));\r\n\r\n\r\n      describe('fix hover', function() {\r\n\r\n        it('on out', inject(\r\n          function(globalConnect, dragging, elementRegistry, eventBus) {\r\n\r\n            // given\r\n            var participant_lanes = elementRegistry.get('Participant_Lanes');\r\n            var lane_1 = elementRegistry.get('Lane_1');\r\n\r\n            var connectSpy = sinon.spy(function(event) {\r\n              expect(event.hover).to.eql(participant_lanes);\r\n            });\r\n\r\n            // when\r\n            globalConnect.start(canvasEvent({ x: 240, y: 0 }));\r\n\r\n            dragging.move(canvasEvent({ x: 240, y: 300 }));\r\n            dragging.hover(canvasEvent({ x: 240, y: 300 }, { element: lane_1 }));\r\n\r\n            eventBus.once('global-connect.out', connectSpy);\r\n\r\n            dragging.out();\r\n\r\n            // then\r\n            expect(connectSpy).to.have.been.calledOnce;\r\n          }\r\n        ));\r\n\r\n\r\n        it('on end/cleanup', inject(\r\n          function(globalConnect, dragging, elementRegistry, eventBus) {\r\n\r\n            // given\r\n            var participant_lanes = elementRegistry.get('Participant_Lanes');\r\n            var lane_1 = elementRegistry.get('Lane_1');\r\n\r\n            var connectSpy = sinon.spy(function(event) {\r\n              expect(event.hover).to.eql(participant_lanes);\r\n            });\r\n\r\n            eventBus.on('global-connect.end', connectSpy);\r\n            eventBus.on('global-connect.cleanup', connectSpy);\r\n\r\n            // when\r\n            globalConnect.start(canvasEvent({ x: 240, y: 0 }));\r\n\r\n            dragging.move(canvasEvent({ x: 240, y: 300 }));\r\n\r\n            dragging.hover(canvasEvent({ x: 240, y: 300 }, { element: lane_1 }));\r\n            dragging.end();\r\n\r\n            // then\r\n            expect(connectSpy).to.have.been.calledTwice;\r\n          }\r\n        ));\r\n\r\n      });\r\n    });\r\n\r\n\r\n    describe('reconnect', function() {\r\n\r\n      it('should set hover to participant', inject(\r\n        function(bendpointMove, elementRegistry, eventBus, dragging) {\r\n\r\n          // given\r\n          var participant_lanes = elementRegistry.get('Participant_Lanes');\r\n          var lane_1 = elementRegistry.get('Lane_1');\r\n\r\n          var messageFlow = elementRegistry.get('MessageFlow_2');\r\n\r\n          var connectSpy = sinon.spy(function(event) {\r\n            expect(event.context.hover).to.equal(participant_lanes);\r\n          });\r\n\r\n          eventBus.once('bendpoint.move.end', connectSpy);\r\n\r\n          // when\r\n          bendpointMove.start(canvasEvent({ x: 240, y: 200 }), messageFlow, 0);\r\n          dragging.move(canvasEvent({ x: 240, y: 280 }));\r\n\r\n          dragging.hover({ element: lane_1, gfx: elementRegistry.getGraphics(lane_1) });\r\n          dragging.end();\r\n\r\n          // then\r\n          expect(connectSpy).to.have.been.called;\r\n        }\r\n      ));\r\n\r\n\r\n      it('should set end to participant', inject(\r\n        function(bendpointMove, elementRegistry, eventBus, dragging) {\r\n\r\n          // given\r\n          var participant_lanes = elementRegistry.get('Participant_Lanes');\r\n          var lane_1 = elementRegistry.get('Lane_1');\r\n\r\n          var messageFlow = elementRegistry.get('MessageFlow_1');\r\n\r\n          var connectSpy = sinon.spy(function(event) {\r\n            expect(event.context.target).to.eql(participant_lanes);\r\n          });\r\n\r\n          eventBus.once('bendpoint.move.end', connectSpy);\r\n\r\n          // when\r\n          bendpointMove.start(canvasEvent({ x: 240, y: 200 }), messageFlow, 1);\r\n          dragging.move(canvasEvent({ x: 240, y: 280 }));\r\n\r\n          dragging.hover({ element: lane_1, gfx: elementRegistry.getGraphics(lane_1) });\r\n          dragging.end();\r\n\r\n          // then\r\n          expect(connectSpy).to.have.been.called;\r\n        }\r\n      ));\r\n\r\n    });\r\n\r\n\r\n    describe('connect', function() {\r\n\r\n      it('should set start to participant', inject(\r\n        function(connect, dragging, elementRegistry, eventBus) {\r\n\r\n          // given\r\n          var participant_lanes = elementRegistry.get('Participant_Lanes');\r\n          var participant_no_lanes = elementRegistry.get('Participant_No_Lanes');\r\n          var lane_1 = elementRegistry.get('Lane_1');\r\n\r\n          var connectSpy = sinon.spy(function(event) {\r\n            expect(event.context.source).to.eql(participant_lanes);\r\n          });\r\n\r\n          eventBus.once('connect.end', connectSpy);\r\n\r\n          // when\r\n          connect.start(canvasEvent({ x: 240, y: 300 }), lane_1);\r\n\r\n          dragging.move(canvasEvent({ x: 240, y: 0 }));\r\n\r\n          dragging.hover(canvasEvent({ x: 240, y: 0 }, { element: participant_no_lanes }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          expect(connectSpy).to.have.been.called;\r\n        }\r\n      ));\r\n\r\n\r\n      it('should set end to participant', inject(\r\n        function(connect, dragging, elementRegistry, eventBus) {\r\n\r\n          // given\r\n          var participant_lanes = elementRegistry.get('Participant_Lanes');\r\n          var participant_no_lanes = elementRegistry.get('Participant_No_Lanes');\r\n          var lane_1 = elementRegistry.get('Lane_1');\r\n\r\n          var connectSpy = sinon.spy(function(event) {\r\n\r\n            var context = event.context,\r\n                target = context.target;\r\n\r\n            expect(target).to.eql(participant_lanes);\r\n          });\r\n\r\n          eventBus.once('connect.end', connectSpy);\r\n\r\n          // when\r\n          connect.start(canvasEvent({ x: 240, y: 0 }), participant_no_lanes);\r\n\r\n          dragging.move(canvasEvent({ x: 240, y: 300 }));\r\n\r\n          dragging.hover(canvasEvent({ x: 240, y: 300 }, { element: lane_1 }));\r\n          dragging.end();\r\n\r\n          // then\r\n          expect(connectSpy).to.have.been.calledOnce;\r\n        }\r\n      ));\r\n\r\n\r\n      describe('fix hover', function() {\r\n\r\n        it('on out', inject(\r\n          function(connect, dragging, elementRegistry, eventBus) {\r\n\r\n            // given\r\n            var participant_lanes = elementRegistry.get('Participant_Lanes');\r\n            var participant_no_lanes = elementRegistry.get('Participant_No_Lanes');\r\n            var lane_1 = elementRegistry.get('Lane_1');\r\n\r\n            var connectSpy = sinon.spy(function(event) {\r\n              expect(event.hover).to.eql(participant_lanes);\r\n            });\r\n\r\n            // when\r\n            connect.start(canvasEvent({ x: 240, y: 0 }), participant_no_lanes);\r\n\r\n            dragging.move(canvasEvent({ x: 240, y: 300 }));\r\n            dragging.hover(canvasEvent({ x: 240, y: 300 }, { element: lane_1 }));\r\n\r\n            eventBus.once('connect.out', connectSpy);\r\n\r\n            dragging.out();\r\n\r\n            // then\r\n            expect(connectSpy).to.have.been.calledOnce;\r\n          }\r\n        ));\r\n\r\n\r\n        it('on end/cleanup', inject(\r\n          function(connect, dragging, elementRegistry, eventBus) {\r\n\r\n            // given\r\n            var participant_lanes = elementRegistry.get('Participant_Lanes');\r\n            var participant_no_lanes = elementRegistry.get('Participant_No_Lanes');\r\n            var lane_1 = elementRegistry.get('Lane_1');\r\n\r\n            var connectSpy = sinon.spy(function(event) {\r\n              expect(event.hover).to.eql(participant_lanes);\r\n            });\r\n\r\n            eventBus.on('connect.end', connectSpy);\r\n            eventBus.on('connect.cleanup', connectSpy);\r\n\r\n            // when\r\n            connect.start(canvasEvent({ x: 240, y: 0 }), participant_no_lanes);\r\n\r\n            dragging.move(canvasEvent({ x: 240, y: 300 }));\r\n\r\n            dragging.hover(canvasEvent({ x: 240, y: 300 }, { element: lane_1 }));\r\n            dragging.end();\r\n\r\n            // then\r\n            expect(connectSpy).to.have.been.calledTwice;\r\n          }\r\n        ));\r\n\r\n      });\r\n\r\n    });\r\n\r\n  });\r\n\r\n\r\n  describe('participant with lane', function() {\r\n\r\n    var diagramXML = require('./FixHoverBehavior.lane-connect.bpmn');\r\n\r\n    beforeEach(bootstrapModeler(diagramXML, {\r\n      modules: testModules.concat([\r\n        globalConnectModule,\r\n        bendpointsModule\r\n      ])\r\n    }));\r\n\r\n    beforeEach(inject(function(dragging) {\r\n      dragging.setOptions({ manual: true });\r\n    }));\r\n\r\n\r\n    it('should move the participant when lane is dragged', inject(\r\n      function(canvas, eventBus, elementRegistry, move, dragging) {\r\n\r\n        // given\r\n        var lane = elementRegistry.get('Lane_1'),\r\n            participant = elementRegistry.get('Participant_Lanes');\r\n\r\n        var rootElement = canvas.getRootElement(),\r\n            rootElementGfx = canvas.getGraphics(rootElement);\r\n\r\n        var moveEndSpy = sinon.spy(function(event) {\r\n          expect(event.context.shape).to.equal(participant);\r\n        });\r\n\r\n        eventBus.on('shape.move.end', moveEndSpy);\r\n\r\n        // when\r\n        move.start(canvasEvent({ x: 100, y: 100 }), lane);\r\n\r\n        dragging.move(canvasEvent({ x: 140, y: 120 }));\r\n\r\n        dragging.hover({\r\n          element: rootElement,\r\n          gfx: rootElementGfx\r\n        });\r\n\r\n        dragging.end();\r\n\r\n        // then\r\n        expect(moveEndSpy).to.have.been.calledOnce;\r\n      }\r\n    ));\r\n\r\n  });\r\n\r\n\r\n  describe('space tool', function() {\r\n\r\n    var diagramXML = require('./FixHoverBehavior.participant.bpmn');\r\n\r\n    beforeEach(bootstrapModeler(diagramXML, {\r\n      modules: testModules\r\n    }));\r\n\r\n    beforeEach(inject(function(dragging) {\r\n      dragging.setOptions({ manual: true });\r\n    }));\r\n\r\n\r\n    it('should <spaceTool.move> participant', inject(\r\n      function(dragging, elementRegistry, spaceTool) {\r\n\r\n        // given\r\n        var lane = elementRegistry.get('Lane_1'),\r\n            participant = elementRegistry.get('Participant_1');\r\n\r\n        spaceTool.activateMakeSpace(canvasEvent({ x: 150, y: 0 }));\r\n\r\n        expect(participant.width).to.equal(600);\r\n\r\n        // when\r\n        dragging.hover({ element: lane });\r\n\r\n        dragging.move(canvasEvent({ x: 250, y: 0 }, {\r\n          button: 0,\r\n          shiftKey: true\r\n        }));\r\n\r\n        dragging.end();\r\n\r\n        // then\r\n        expect(participant.width).to.equal(700);\r\n      }\r\n    ));\r\n\r\n  });\r\n\r\n});"
  },
  {
    "path": "test/spec/features/modeling/behavior/GroupBehaviorSpec.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:tns=\"http://www.signavio.com/bpmn20\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" id=\"Definition_1\" name=\"\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.2.0-dev\">\n  <category id=\"Category_1\">\n    <categoryValue id=\"CategoryValue_1\" value=\"Value 1\" />\n    <categoryValue id=\"CategoryValue_2\" value=\"Value 2\" />\n  </category>\n  <category id=\"Category_2\">\n    <categoryValue id=\"CategoryValue_3\" value=\"Value 3\" />\n  </category>\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <subProcess id=\"Subprocess_1\" />\n    <group id=\"Group_1\" categoryValueRef=\"CategoryValue_1\" />\n    <group id=\"Group_2\" categoryValueRef=\"CategoryValue_1\" />\n    <group id=\"Group_3\" categoryValueRef=\"CategoryValue_2\" />\n    <group id=\"Group_4\" categoryValueRef=\"CategoryValue_3\" />\n    <group id=\"Group_NO_CATEGORY_VALUE\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Activity_0zvwgk9_di\" bpmnElement=\"Subprocess_1\">\n        <omgdc:Bounds x=\"160\" y=\"360\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_1_di\" bpmnElement=\"Group_1\">\n        <omgdc:Bounds x=\"162\" y=\"75\" width=\"200\" height=\"200\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"276\" y=\"98\" width=\"58\" height=\"18.96\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_2_di\" bpmnElement=\"Group_2\">\n        <omgdc:Bounds x=\"387\" y=\"75\" width=\"200\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_3_di\" bpmnElement=\"Group_3\">\n        <omgdc:Bounds x=\"609\" y=\"75\" width=\"200\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_4_di\" bpmnElement=\"Group_4\">\n        <omgdc:Bounds x=\"836\" y=\"75\" width=\"200\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_NO_CATEGORY_VALUE_di\" bpmnElement=\"Group_NO_CATEGORY_VALUE\">\n        <omgdc:Bounds x=\"610\" y=\"320\" width=\"199\" height=\"200\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1g3s90h\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1ezo7xu\" bpmnElement=\"Subprocess_1\" />\n  </bpmndi:BPMNDiagram>\n</definitions>"
  },
  {
    "path": "test/spec/features/modeling/behavior/GroupBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  getBusinessObject,\n  is\n} from 'lib/util/ModelUtil';\n\nimport bpmnCopyPasteModule from 'lib/features/copy-paste';\nimport copyPasteModule from 'diagram-js/lib/features/copy-paste';\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\nimport { find } from 'min-dash';\n\n\ndescribe('features/modeling/behavior - groups', function() {\n\n  var testModules = [\n    coreModule,\n    copyPasteModule,\n    bpmnCopyPasteModule,\n    modelingModule\n  ];\n\n  var processDiagramXML = require('./GroupBehaviorSpec.bpmn');\n\n  beforeEach(bootstrapModeler(processDiagramXML, {\n    modules: testModules.concat(modelingModule)\n  }));\n\n\n  describe('creation', function() {\n\n    it('should NOT create new CategoryValue if one exists', inject(\n      function(canvas, elementFactory, elementRegistry, modeling) {\n\n        // given\n        var group1 = elementRegistry.get('Group_1'),\n            categoryValue = getBusinessObject(group1).categoryValueRef,\n            root = canvas.getRootElement(),\n            definitions = getBusinessObject(root).$parent,\n            originalSize = definitions.get('rootElements').length;\n\n        var group = elementFactory.createShape({ type: 'bpmn:Group' });\n\n        getBusinessObject(group).categoryValueRef = categoryValue;\n\n        // when\n        var groupShape = modeling.createShape(group, { x: 100, y: 100 }, root),\n            categoryValueRef = getBusinessObject(groupShape).categoryValueRef;\n\n        // then\n        expect(categoryValueRef).to.eql(categoryValue);\n\n        expect(definitions.get('rootElements')).to.have.length(originalSize);\n      }\n    ));\n\n\n    describe('should NOT create Category for new Group', function() {\n\n      it('execute', inject(function(canvas, elementFactory, modeling) {\n\n        // given\n        var root = canvas.getRootElement();\n\n        // when\n        var group = modeling.createShape({ type: 'bpmn:Group' }, { x: 100, y: 100 }, root),\n            groupBo = getBusinessObject(group),\n            categoryValue = groupBo.categoryValueRef;\n\n        // then\n        expect(categoryValue).not.to.exist;\n      }));\n\n\n      it('undo', inject(function(canvas, elementFactory, modeling, commandStack) {\n\n        // given\n        var root = canvas.getRootElement();\n\n        // when\n        var group = modeling.createShape({ type: 'bpmn:Group' }, { x: 100, y: 100 }, root),\n            groupBo = getBusinessObject(group);\n\n        commandStack.undo();\n\n        var categoryValue = groupBo.categoryValueRef;\n\n        // then\n        expect(categoryValue).not.to.exist;\n      }));\n\n\n      it('redo', inject(function(canvas, elementFactory, modeling, commandStack) {\n\n        // given\n        var root = canvas.getRootElement();\n\n        // when\n        var group = modeling.createShape({ type: 'bpmn:Group' }, { x: 100, y: 100 }, root),\n            groupBo = getBusinessObject(group);\n\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expect(groupBo.categoryValueRef).not.to.exist;\n      }));\n\n    });\n\n\n    describe('should paste with Category', function() {\n\n      var groupBo, rootElements;\n\n      beforeEach(inject(function(canvas, copyPaste, elementRegistry) {\n\n        // given\n        var group = elementRegistry.get('Group_1'),\n            rootElement = canvas.getRootElement();\n\n        copyPaste.copy(group);\n\n        // when\n        var elements = copyPaste.paste({\n          element: rootElement,\n          point: {\n            x: 500,\n            y: 500\n          }\n        });\n\n        group = find(elements, function(element) {\n          return is(element, 'bpmn:Group');\n        });\n\n        groupBo = getBusinessObject(group);\n\n        rootElements = getBusinessObject(canvas.getRootElement()).$parent.rootElements;\n      }));\n\n\n      it('<do>', function() {\n\n        // then\n        expect(groupBo.categoryValueRef).to.exist;\n        expect(groupBo.categoryValueRef.$parent).to.exist;\n        expect(groupBo.categoryValueRef.value).to.equal('Value 1');\n\n        expect(rootElements).to.have.length(4);\n      });\n\n\n      it('<undo>', inject(function(commandStack) {\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(rootElements).to.have.length(3);\n      }));\n\n\n      it('<redo>', inject(function(commandStack) {\n\n        // given\n        var categoryValue = groupBo.categoryValueRef,\n            category = categoryValue.$parent;\n\n        // when\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expect(groupBo.categoryValueRef).to.equal(categoryValue);\n        expect(groupBo.categoryValueRef.$parent).to.equal(category);\n\n        expect(rootElements).to.have.length(4);\n      }));\n\n    });\n\n\n    it('should create new Category in definitions', inject(\n      function(canvas, elementFactory, modeling, bpmnjs) {\n\n        // given\n        var root = canvas.findRoot('Subprocess_1_plane'),\n            definitions = bpmnjs.getDefinitions();\n\n        // operate on sub-process plane\n        canvas.setRootElement(root);\n\n        // when\n        var group = modeling.createShape({ type: 'bpmn:Group' }, { x: 100, y: 100 }, root),\n            groupBo = getBusinessObject(group);\n\n        // create label\n        modeling.updateLabel(group, 'FOO BAR');\n\n        var categoryValue = groupBo.categoryValueRef,\n            category = categoryValue.$parent;\n\n        // then\n        expect(categoryValue).to.exist;\n        expect(category).to.exist;\n\n        expect(category.get('categoryValue')).to.include(categoryValue);\n        expect(definitions.get('rootElements')).to.include(category);\n      }\n    ));\n\n  });\n\n\n  describe('deletion', function() {\n\n    it('should NOT remove CategoryValue if still referenced', inject(\n      function(elementRegistry, modeling) {\n\n        // given\n        var groupShape = elementRegistry.get('Group_1'),\n            groupBo = getBusinessObject(groupShape);\n\n        var categoryValue = groupBo.categoryValueRef,\n            category = categoryValue.$parent;\n\n        // when\n        modeling.removeShape(groupShape);\n\n        // then\n        expect(groupBo.categoryValueRef).not.to.exist;\n\n        expect(category.get('categoryValue')).to.contain(categoryValue);\n      }\n    ));\n\n\n    it('should NOT remove Category if still referenced', inject(\n      function(canvas, elementRegistry, modeling) {\n\n        // given\n        var groupShape = elementRegistry.get('Group_3'),\n            groupBo = getBusinessObject(groupShape),\n            root = canvas.getRootElement(),\n            definitions = getBusinessObject(root).$parent;\n\n        var categoryValue = groupBo.categoryValueRef,\n            category = categoryValue.$parent;\n\n        // when\n        modeling.removeShape(groupShape);\n\n        // then\n        expect(groupBo.categoryValueRef).not.to.exist;\n\n        expect(definitions.get('rootElements')).to.contain(category);\n      }\n    ));\n\n\n    describe('should remove Category + CategoryValue on deletion', function() {\n\n      it('execute', inject(function(canvas, elementRegistry, modeling) {\n\n        // given\n        var groupShape = elementRegistry.get('Group_4'),\n            groupBo = getBusinessObject(groupShape),\n            root = canvas.getRootElement(),\n            definitions = getBusinessObject(root).$parent;\n\n        var categoryValue = groupBo.categoryValueRef,\n            category = categoryValue.$parent;\n\n        // when\n        modeling.removeShape(groupShape);\n\n        // then\n        expect(category.get('categoryValue')).not.to.contain(categoryValue);\n\n        expect(definitions.get('rootElements')).not.to.contain(category);\n      }));\n\n\n      it('undo', inject(function(canvas, elementRegistry, modeling, commandStack) {\n\n        // given\n        var groupShape = elementRegistry.get('Group_4'),\n            groupBo = getBusinessObject(groupShape),\n            root = canvas.getRootElement(),\n            definitions = getBusinessObject(root).$parent;\n\n        var categoryValue = groupBo.categoryValueRef,\n            category = categoryValue.$parent;\n\n        // when\n        modeling.removeShape(groupShape);\n\n        commandStack.undo();\n\n        // then\n        expect(category.get('categoryValue')).to.include(categoryValue);\n        expect(definitions.get('rootElements')).to.include(category);\n      }));\n\n\n      it('redo', inject(function(canvas, elementRegistry, modeling, commandStack) {\n\n        // given\n        var groupShape = elementRegistry.get('Group_4'),\n            groupBo = getBusinessObject(groupShape),\n            root = canvas.getRootElement(),\n            definitions = getBusinessObject(root).$parent;\n\n        var categoryValue = groupBo.categoryValueRef,\n            category = categoryValue.$parent;\n\n        // when\n        modeling.removeShape(groupShape);\n\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expect(category.get('categoryValue')).not.to.include(categoryValue);\n        expect(definitions.get('rootElements')).not.to.include(category);\n      }));\n\n    });\n\n\n    describe('should handle non-existing CategoryValue gracefully', function() {\n\n      it('execute', inject(function(elementRegistry, modeling) {\n\n        // given\n        var groupShape = elementRegistry.get('Group_NO_CATEGORY_VALUE'),\n            groupBo = getBusinessObject(groupShape);\n\n        // assume\n        expect(groupBo.categoryValueRef).not.to.exist;\n\n        // then\n        modeling.removeShape(groupShape);\n      }));\n\n\n      it('undo', inject(function(elementRegistry, modeling, commandStack) {\n\n        // given\n        var groupShape = elementRegistry.get('Group_NO_CATEGORY_VALUE'),\n            groupBo = getBusinessObject(groupShape);\n\n        // when\n        modeling.removeShape(groupShape);\n\n        commandStack.undo();\n\n        // then\n        expect(groupBo.categoryValueRef).not.to.exist;\n      }));\n\n\n      it('redo', inject(function(elementRegistry, modeling, commandStack) {\n\n        // given\n        var groupShape = elementRegistry.get('Group_NO_CATEGORY_VALUE'),\n            groupBo = getBusinessObject(groupShape);\n\n        // when\n        modeling.removeShape(groupShape);\n\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expect(groupBo.categoryValueRef).not.to.exist;\n      }));\n\n    });\n\n  });\n\n\n  describe('label editing', function() {\n\n    describe('should create Category before setting label', function() {\n\n      it('execute', inject(function(elementRegistry, modeling) {\n\n        // given\n        var group = elementRegistry.get('Group_NO_CATEGORY_VALUE'),\n            groupBo = getBusinessObject(group);\n\n        // assume\n        expect(groupBo.categoryValueRef).not.to.exist;\n\n        // when\n        modeling.updateLabel(group, 'Foo bar');\n\n        // then\n        expect(groupBo.categoryValueRef).to.exist;\n        expect(groupBo.categoryValueRef.value).to.eql('Foo bar');\n\n        expect(groupBo.categoryValueRef.$parent).to.exist;\n      }));\n\n\n      it('undo', inject(function(elementRegistry, modeling, commandStack) {\n\n        // given\n        var group = elementRegistry.get('Group_NO_CATEGORY_VALUE'),\n            groupBo = getBusinessObject(group);\n\n        // assume\n        expect(groupBo.categoryValueRef).not.to.exist;\n\n        // when\n        modeling.updateLabel(group, 'Foo bar');\n\n        commandStack.undo();\n\n        // then\n        expect(groupBo.categoryValueRef).not.to.exist;\n      }));\n\n\n      it('redo', inject(function(elementRegistry, modeling, commandStack) {\n\n        // given\n        var group = elementRegistry.get('Group_NO_CATEGORY_VALUE'),\n            groupBo = getBusinessObject(group);\n\n        // assume\n        expect(groupBo.categoryValueRef).not.to.exist;\n\n        // when\n        modeling.updateLabel(group, 'Foo bar');\n\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expect(groupBo.categoryValueRef).to.exist;\n        expect(groupBo.categoryValueRef.value).to.eql('Foo bar');\n\n        expect(groupBo.categoryValueRef.$parent).to.exist;\n      }));\n\n    });\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/ImportDockingFix.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>SequenceFlow</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Task_A\" name=\"A\">\n      <bpmn:incoming>SequenceFlow</bpmn:incoming>\n      <bpmn:property id=\"Property_09ddda9\" name=\"__targetRef_placeholder\" />\n      <bpmn:dataInputAssociation id=\"DataAssociation_1\">\n        <bpmn:sourceRef>DataStoreReference</bpmn:sourceRef>\n        <bpmn:targetRef>Property_09ddda9</bpmn:targetRef>\n      </bpmn:dataInputAssociation>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow\" sourceRef=\"StartEvent_1\" targetRef=\"Task_A\" />\n    <bpmn:dataStoreReference id=\"DataStoreReference\" />\n    <bpmn:task id=\"Task_B\">\n      <bpmn:property id=\"Property_0vybrii\" name=\"__targetRef_placeholder\" />\n      <bpmn:dataInputAssociation id=\"DataAssociation_2\">\n        <bpmn:sourceRef>DataStoreReference</bpmn:sourceRef>\n        <bpmn:targetRef>Property_0vybrii</bpmn:targetRef>\n      </bpmn:dataInputAssociation>\n    </bpmn:task>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_A_di\" bpmnElement=\"Task_A\">\n        <dc:Bounds x=\"278\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <!-- off by 10px (x) -->\n      <bpmndi:BPMNEdge id=\"SequenceFlow_di\" bpmnElement=\"SequenceFlow\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"209\" y=\"120\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"268\" y=\"120\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"198.5\" y=\"95\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"DataStoreReference_di\" bpmnElement=\"DataStoreReference\">\n        <dc:Bounds x=\"412\" y=\"344\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"392\" y=\"394\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataAssociation_1_di\" bpmnElement=\"DataAssociation_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"426\" y=\"344\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"346\" y=\"160\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_B_di\" bpmnElement=\"Task_B\">\n        <dc:Bounds x=\"584\" y=\"329\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <!-- off by 10px (x) -->\n      <bpmndi:BPMNEdge id=\"DataAssociation_2_di\" bpmnElement=\"DataAssociation_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"462\" y=\"369\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"574\" y=\"369\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/ImportDockingFixSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling/behavior - ImportDockingFix', function() {\n\n  var diagramXML = require('./ImportDockingFix.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: [\n      coreModule,\n      modelingModule\n    ]\n  }));\n\n\n  it('should correct dockings on import', inject(function(elementRegistry, modeling) {\n\n    // when\n    var sequenceFlowConnection = elementRegistry.get('SequenceFlow'),\n        associationConnection = elementRegistry.get('DataAssociation_1');\n\n    // then\n    expect(sequenceFlowConnection).to.have.startDocking({ x: 191, y: 120 });\n    expect(sequenceFlowConnection).to.have.endDocking({ x: 328, y: 120 });\n\n    expect(associationConnection).to.have.startDocking({ x: 437, y: 369 });\n    expect(associationConnection).to.have.endDocking({ x: 328, y: 119 });\n  }));\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/IsHorizontalFix.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:camunda=\"http://camunda.org/schema/1.0/bpmn\" id=\"Definitions_0f2kqle\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"2.2.4\">\n  <bpmn:collaboration id=\"Collaboration_08digmd\">\n    <bpmn:participant id=\"Participant\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Horizontal_Participant\" processRef=\"Process_2\" />\n    <bpmn:participant id=\"Vertical_Participant\" processRef=\"Process_3\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:laneSet id=\"LaneSet_13y425u\">\n      <bpmn:lane id=\"Lane\">\n        <bpmn:flowNodeRef>StartEvent_1</bpmn:flowNodeRef>\n      </bpmn:lane>\n      <bpmn:lane id=\"Lane_2\" />\n    </bpmn:laneSet>\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:extensionElements>\n        <camunda:executionListener event=\"start\">\n          <camunda:script scriptFormat=\"groovy\">println execution.eventName</camunda:script>\n        </camunda:executionListener>\n        <camunda:executionListener event=\"end\">\n          <camunda:script scriptFormat=\"groovy\">println end</camunda:script>\n        </camunda:executionListener>\n      </bpmn:extensionElements>\n    </bpmn:startEvent>\n  </bpmn:process>\n  <bpmn:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn:laneSet id=\"LaneSet_0s4fms0\">\n      <bpmn:lane id=\"Horizontal_Lane_2\" />\n      <bpmn:lane id=\"Horizontal_Lane\">\n        <bpmn:flowNodeRef>Event_01335ir</bpmn:flowNodeRef>\n      </bpmn:lane>\n    </bpmn:laneSet>\n    <bpmn:startEvent id=\"Event_01335ir\" />\n  </bpmn:process>\n  <bpmn:process id=\"Process_3\" isExecutable=\"false\">\n    <bpmn:laneSet id=\"LaneSet_1ub8mw3\">\n      <bpmn:lane id=\"Vertical_Lane\">\n        <bpmn:flowNodeRef>Event_02alkvt</bpmn:flowNodeRef>\n      </bpmn:lane>\n      <bpmn:lane id=\"Vertical_Lane_2\" />\n    </bpmn:laneSet>\n    <bpmn:startEvent id=\"Event_02alkvt\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_08digmd\">\n      <bpmndi:BPMNShape id=\"Participant_di\" bpmnElement=\"Participant\">\n        <dc:Bounds x=\"123\" y=\"82\" width=\"600\" height=\"370\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_2_di\" bpmnElement=\"Lane_2\">\n        <dc:Bounds x=\"153\" y=\"332\" width=\"570\" height=\"120\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_di\" bpmnElement=\"Lane\">\n        <dc:Bounds x=\"153\" y=\"82\" width=\"570\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Horizontal_Participant_di\" bpmnElement=\"Horizontal_Participant\" isHorizontal=\"true\">\n        <dc:Bounds x=\"770\" y=\"82\" width=\"600\" height=\"370\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Horizontal_Lane_2_di\" bpmnElement=\"Horizontal_Lane_2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"800\" y=\"332\" width=\"570\" height=\"120\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Horizontal_Lane_di\" bpmnElement=\"Horizontal_Lane\" isHorizontal=\"true\">\n        <dc:Bounds x=\"800\" y=\"82\" width=\"570\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1muvki3\" bpmnElement=\"Event_01335ir\">\n        <dc:Bounds x=\"820\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Vertical_Participant_di\" bpmnElement=\"Vertical_Participant\" isHorizontal=\"false\">\n        <dc:Bounds x=\"123\" y=\"500\" width=\"370\" height=\"600\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Vertical_Lane_2_di\" bpmnElement=\"Vertical_Lane_2\" isHorizontal=\"false\">\n        <dc:Bounds x=\"373\" y=\"530\" width=\"120\" height=\"570\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Vertical_Lane_di\" bpmnElement=\"Vertical_Lane\" isHorizontal=\"false\">\n        <dc:Bounds x=\"123\" y=\"530\" width=\"250\" height=\"570\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1eta6o5\" bpmnElement=\"Event_02alkvt\">\n        <dc:Bounds x=\"143\" y=\"550\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/IsHorizontalFixSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\nimport { getDi } from 'lib/util/ModelUtil';\n\n\ndescribe('features/modeling/behavior - IsHorizontalFix', function() {\n\n  var diagramXML;\n\n\n  describe('set on create', function() {\n\n    diagramXML = require('test/fixtures/bpmn/simple.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: [\n        coreModule,\n        modelingModule\n      ]\n    }));\n\n\n    it('should set isHorizontal=true when participant is created',\n      inject(function(canvas, elementFactory, modeling) {\n\n        // given\n        var processShape = canvas.getRootElement(),\n            participantShape = elementFactory.createParticipantShape(true);\n\n        // when\n        var participant = modeling.createShape(participantShape, { x: 350, y: 200 }, processShape);\n\n        // then\n        var isHorizontal = getDi(participant).get('isHorizontal');\n\n        expect(isHorizontal).to.be.true;\n      })\n    );\n\n\n    it('should set isHorizontal=true when lane is created',\n      inject(function(canvas, elementFactory, modeling) {\n\n        // given\n        var processShape = canvas.getRootElement(),\n            participantShape = elementFactory.createParticipantShape(true),\n            participant = modeling.createShape(participantShape, { x: 350, y: 200 }, processShape);\n\n        // when\n        var lane = modeling.addLane(participant, 'bottom');\n\n        // then\n        var isHorizontal = getDi(lane).get('isHorizontal');\n\n        expect(isHorizontal).to.be.true;\n      })\n    );\n\n  });\n\n\n  describe('set on change', function() {\n\n    diagramXML = require('./IsHorizontalFix.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: [\n        coreModule,\n        modelingModule\n      ]\n    }));\n\n\n    it('should set isHorizontal=true when participant is moved',\n      inject(function(elementRegistry, modeling) {\n\n        // given\n        var participant = elementRegistry.get('Participant');\n\n        // when\n        modeling.moveElements([ participant ], { x: 0, y: 0 });\n\n        // then\n        var isHorizontal = getDi(participant).get('isHorizontal');\n\n        expect(isHorizontal).to.be.true;\n      })\n    );\n\n\n    it('should keep isHorizontal=true when participant is moved',\n      inject(function(elementRegistry, modeling) {\n\n        // given\n        var participant = elementRegistry.get('Horizontal_Participant');\n\n        // when\n        modeling.moveElements([ participant ], { x: 0, y: 0 });\n\n        // then\n        var isHorizontal = getDi(participant).get('isHorizontal');\n\n        expect(isHorizontal).to.be.true;\n      })\n    );\n\n\n    it('should keep isHorizontal=false when participant is moved',\n      inject(function(elementRegistry, modeling) {\n\n        // given\n        var participant = elementRegistry.get('Vertical_Participant');\n\n        // when\n        modeling.moveElements([ participant ], { x: 0, y: 0 });\n\n        // then\n        var isHorizontal = getDi(participant).get('isHorizontal');\n\n        expect(isHorizontal).to.be.false;\n      })\n    );\n\n\n    it('should set isHorizontal=true when lane is moved',\n      inject(function(elementRegistry, modeling) {\n\n        // given\n        var lane = elementRegistry.get('Lane');\n\n        // when\n        modeling.moveElements([ lane ], { x: 0, y: 0 });\n\n        // then\n        var isHorizontal = getDi(lane).get('isHorizontal');\n\n        expect(isHorizontal).to.be.true;\n      })\n    );\n\n\n    it('should keep isHorizontal=true when lane is moved',\n      inject(function(elementRegistry, modeling) {\n\n        // given\n        var lane = elementRegistry.get('Horizontal_Lane');\n\n        // when\n        modeling.moveElements([ lane ], { x: 0, y: 0 });\n\n        // then\n        var isHorizontal = getDi(lane).get('isHorizontal');\n\n        expect(isHorizontal).to.be.true;\n      })\n    );\n\n\n    it('should keep isHorizontal=false when lane is moved',\n      inject(function(elementRegistry, modeling) {\n\n        // given\n        var lane = elementRegistry.get('Vertical_Lane');\n\n        // when\n        modeling.moveElements([ lane ], { x: 0, y: 0 });\n\n        // then\n        var isHorizontal = getDi(lane).get('isHorizontal');\n\n        expect(isHorizontal).to.be.false;\n      })\n    );\n\n\n    it('should set isHorizontal=true when participant is resized',\n      inject(function(elementRegistry, modeling) {\n\n        // given\n        var participant = elementRegistry.get('Participant');\n\n        // when\n        modeling.resizeShape(participant, { x: 0, y: 0, width: 10, height: 10 });\n\n        // then\n        var isHorizontal = getDi(participant).get('isHorizontal');\n\n        expect(isHorizontal).to.be.true;\n      })\n    );\n\n\n    it('should set isHorizontal=true when lane is resized',\n      inject(function(elementRegistry, modeling) {\n\n        // given\n        var lane = elementRegistry.get('Lane');\n\n        // when\n        modeling.resizeLane(lane, { x: 0, y: 0, width: 10, height: 10 });\n\n        // then\n        var isHorizontal = getDi(lane).get('isHorizontal');\n\n        expect(isHorizontal).to.be.true;\n      })\n    );\n\n  });\n\n\n  describe('never unset on revert', function() {\n\n    diagramXML = require('./IsHorizontalFix.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: [\n        coreModule,\n        modelingModule\n      ]\n    }));\n\n\n    it('should not unset isHorizontal=true when participant move action is reverted',\n      inject(function(commandStack, elementRegistry, modeling) {\n\n        // given\n        var participant = elementRegistry.get('Participant');\n\n        modeling.moveElements([ participant ], { x: 0, y: 0 });\n\n        // when\n        commandStack.undo();\n\n        // then\n        var isHorizontal = getDi(participant).get('isHorizontal');\n\n        expect(isHorizontal).to.be.true;\n      })\n    );\n\n\n    it('should not unset isHorizontal=true when lane move action is reverted',\n      inject(function(commandStack, elementRegistry, modeling) {\n\n        // given\n        var lane = elementRegistry.get('Lane');\n\n        modeling.moveElements([ lane ], { x: 0, y: 0 });\n\n        // when\n        commandStack.undo();\n\n        // then\n        var isHorizontal = getDi(lane).get('isHorizontal');\n\n        expect(isHorizontal).to.be.true;\n      })\n    );\n\n\n    it('should not unset isHorizontal=true when participant resize action is reverted',\n      inject(function(commandStack, elementRegistry, modeling) {\n\n        // given\n        var participant = elementRegistry.get('Participant');\n\n        modeling.resizeShape(participant, { x: 0, y: 0, width: 10, height: 10 });\n\n        // when\n        commandStack.undo();\n\n        // then\n        var isHorizontal = getDi(participant).get('isHorizontal');\n\n        expect(isHorizontal).to.be.true;\n      })\n    );\n\n\n    it('should not unset isHorizontal=true when lane resize action is reverted',\n      inject(function(commandStack, elementRegistry, modeling) {\n\n        // given\n        var lane = elementRegistry.get('Lane');\n\n        modeling.resizeLane(lane, { x: 0, y: 0, width: 10, height: 10 });\n\n        // when\n        commandStack.undo();\n\n        // then\n        var isHorizontal = getDi(lane).get('isHorizontal');\n\n        expect(isHorizontal).to.be.true;\n      })\n    );\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/LabelBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.5.0\">\n  <bpmn:category id=\"Category_1\">\n    <bpmn:categoryValue id=\"CategoryValue_1\" value=\"Value\" />\n  </bpmn:category>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\" name=\"foo\" />\n    <bpmn:task id=\"Task_1\" />\n    <bpmn:exclusiveGateway id=\"ExclusiveGateway_1\" />\n    <bpmn:startEvent id=\"StartEvent_2\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:endEvent id=\"EndEvent_1\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" name=\"SequenceFlow_1\" sourceRef=\"StartEvent_2\" targetRef=\"EndEvent_1\" />\n    <bpmn:intermediateCatchEvent id=\"IntermediateCatchEvent_1\">\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_1kowj0h\" messageRef=\"Message_1\" />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:intermediateCatchEvent id=\"IntermediateCatchEvent_2\" name=\"name\">\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_1kowj0\" messageRef=\"Message_2\" />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:textAnnotation id=\"TextAnnotation_1\">\n      <bpmn:text>foo</bpmn:text>\n    </bpmn:textAnnotation>\n    <bpmn:association id=\"Association_1w715hc\" sourceRef=\"Task_1\" targetRef=\"TextAnnotation_1\" />\n    <bpmn:group id=\"Group_1\" categoryValueRef=\"CategoryValue_1\" />\n    <bpmn:group id=\"Group_2\" categoryValueRef=\"CategoryValue_1\" />\n    <bpmn:group id=\"Group_3\" categoryValueRef=\"CategoryValue_1\" />\n    <bpmn:group id=\"Group_4\" categoryValueRef=\"CategoryValue_1\" />\n    <bpmn:group id=\"Group_5\" categoryValueRef=\"CategoryValue_1\" />\n  </bpmn:process>\n  <bpmn:message id=\"Message_1\" />\n  <bpmn:message id=\"Message_2\" name=\"message\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"183\" y=\"138\" width=\"17\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"353\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_1gzwevj_di\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"256\" y=\"95\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_0c95td1_di\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds x=\"564\" y=\"582\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_0r7j2ed_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"700\" y=\"582\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0rpxpya_di\" bpmnElement=\"IntermediateCatchEvent_1\">\n        <dc:Bounds x=\"173\" y=\"202\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0rpxpy_di\" bpmnElement=\"IntermediateCatchEvent_2\">\n        <dc:Bounds x=\"213\" y=\"202\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"217\" y=\"245\" width=\"28\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_1qulyll_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"453\" y=\"0\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_1_di\" bpmnElement=\"Group_1\">\n        <dc:Bounds x=\"162\" y=\"296\" width=\"128\" height=\"110\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"300\" y=\"303\" width=\"28\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_2_di\" bpmnElement=\"Group_2\">\n        <dc:Bounds x=\"376\" y=\"296\" width=\"127\" height=\"110\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"426\" y=\"423\" width=\"28\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_3_di\" bpmnElement=\"Group_3\">\n        <dc:Bounds x=\"565\" y=\"296\" width=\"130\" height=\"110\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"526\" y=\"303\" width=\"28\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_4_di\" bpmnElement=\"Group_4\">\n        <dc:Bounds x=\"161\" y=\"496\" width=\"130\" height=\"110\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"212\" y=\"513\" width=\"28\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_5_di\" bpmnElement=\"Group_5\">\n        <dc:Bounds x=\"352\" y=\"496\" width=\"130\" height=\"110\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"403\" y=\"583\" width=\"28\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0pgg94c_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"600\" y=\"600\" />\n        <di:waypoint x=\"700\" y=\"600\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"608\" y=\"582\" width=\"85\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Association_1w715hc_di\" bpmnElement=\"Association_1w715hc\">\n        <di:waypoint x=\"441\" y=\"80\" />\n        <di:waypoint x=\"489\" y=\"30\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/LabelBehavior.copyPaste.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_0cu5n0d\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.4.0\">\n  <bpmn:process id=\"Process_1cirp64\" isExecutable=\"true\">\n    <bpmn:startEvent id=\"Source\">\n      <bpmn:outgoing>SequenceFlow</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Target\">\n      <bpmn:incoming>SequenceFlow</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow\" name=\"A\" sourceRef=\"Source\" targetRef=\"Target\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1cirp64\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"Source\">\n        <dc:Bounds x=\"179\" y=\"79\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1m56bsl_di\" bpmnElement=\"Target\">\n        <dc:Bounds x=\"300\" y=\"250\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_di\" bpmnElement=\"SequenceFlow\">\n        <di:waypoint x=\"215\" y=\"97\" />\n        <di:waypoint x=\"258\" y=\"97\" />\n        <di:waypoint x=\"258\" y=\"290\" />\n        <di:waypoint x=\"300\" y=\"290\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"270\" y=\"191\" width=\"7\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/LabelBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  resizeBounds\n} from 'diagram-js/lib/features/resize/ResizeUtil';\n\nimport {\n  DEFAULT_LABEL_SIZE,\n  getExternalLabelMid\n} from 'lib/util/LabelUtil';\n\nimport {\n  getBusinessObject,\n  getDi\n} from 'lib/util/ModelUtil';\n\nimport {\n  assign,\n  map,\n  pick\n} from 'min-dash';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\nimport gridSnappingModule from 'lib/features/grid-snapping';\n\n\ndescribe('features/modeling/behavior - LabelBehavior', function() {\n\n  var diagramXML = require('./LabelBehavior.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: [\n      modelingModule,\n      coreModule\n    ]\n  }));\n\n\n  describe('updating name property', function() {\n\n    it('should update label', inject(function(elementRegistry, eventBus, modeling) {\n\n      // given\n      var startEvent = elementRegistry.get('StartEvent_1'),\n          spy = sinon.spy();\n\n      eventBus.once('commandStack.element.updateLabel.execute', spy);\n\n      // when\n      modeling.updateProperties(startEvent, {\n        name: 'bar'\n      });\n\n      // then\n      expect(startEvent.businessObject.name).to.equal('bar');\n      expect(spy).to.have.been.called;\n    }));\n\n\n    it('should create label', inject(function(elementRegistry, eventBus, modeling) {\n\n      // given\n      var startEvent = elementRegistry.get('ExclusiveGateway_1'),\n          spy = sinon.spy();\n\n      eventBus.once('commandStack.element.updateLabel.execute', spy);\n\n      // when\n      modeling.updateProperties(startEvent, {\n        name: 'foo'\n      });\n\n      // then\n      var labelShape = startEvent.label;\n\n      expect(labelShape).to.exist;\n      expect(startEvent.businessObject.name).to.equal('foo');\n      expect(spy).to.have.been.called;\n    }));\n\n\n    it('should remove label', inject(function(elementRegistry, modeling) {\n\n      // given\n      var event = elementRegistry.get('StartEvent_1');\n\n      // when\n      modeling.updateProperties(event, {\n        name: undefined\n      });\n\n      // then\n      var labelShape = event.label;\n\n      expect(labelShape).not.to.exist;\n      expect(getBusinessObject(event).get('name')).not.to.exist;\n    }));\n\n\n  });\n\n\n  describe('updating name property via `modeling.updateModdleProperties`', function() {\n\n    it('should create label', inject(function(elementRegistry, modeling) {\n\n      // given\n      var gateway = elementRegistry.get('ExclusiveGateway_1'),\n          bo = getBusinessObject(gateway);\n\n      // when\n      modeling.updateModdleProperties(gateway, bo, {\n        name: 'foo'\n      });\n\n      // then\n      var labelShape = gateway.label;\n\n      expect(labelShape).to.exist;\n      expect(gateway.businessObject.name).to.equal('foo');\n    }));\n\n\n    it('should remove label', inject(function(elementRegistry, modeling) {\n\n      // given\n      var event = elementRegistry.get('StartEvent_1'),\n          bo = getBusinessObject(event);\n\n      // when\n      modeling.updateModdleProperties(event, bo, {\n        name: undefined\n      });\n\n      // then\n      var labelShape = event.label;\n\n      expect(labelShape).not.to.exist;\n      expect(getBusinessObject(event).get('name')).not.to.exist;\n    }));\n\n\n    it('should NOT create label when message name is added', inject(\n      function(elementRegistry, modeling) {\n\n        // given\n        var messageEvent = elementRegistry.get('IntermediateCatchEvent_1'),\n            bo = getBusinessObject(messageEvent);\n\n        // when\n        modeling.updateModdleProperties(messageEvent, bo.eventDefinitions[0].messageRef, {\n          name: 'foo'\n        });\n\n        // then\n        var labelShape = messageEvent.label;\n\n        expect(labelShape).not.to.exist;\n      })\n    );\n\n\n    it('should NOT remove label when message name is removed', inject(\n      function(elementRegistry, modeling) {\n\n        // given\n        var messageEvent = elementRegistry.get('IntermediateCatchEvent_2'),\n            bo = getBusinessObject(messageEvent);\n\n        // when\n        modeling.updateModdleProperties(messageEvent, bo.eventDefinitions[0].messageRef, {\n          name: undefined\n        });\n\n        // then\n        var labelShape = messageEvent.label;\n\n        expect(labelShape).to.exist;\n      })\n    );\n\n  });\n\n\n  describe('add label', function() {\n\n    it('should add to sequence flow with name', inject(\n      function(bpmnFactory, elementRegistry, modeling) {\n\n        // given\n        var startEvent = elementRegistry.get('StartEvent_1'),\n            task = elementRegistry.get('Task_1'),\n            businessObject = bpmnFactory.create('bpmn:SequenceFlow', {\n              name: 'foo'\n            });\n\n        // when\n        var connection = modeling.createConnection(startEvent, task, {\n          type: 'bpmn:SequenceFlow',\n          businessObject: businessObject\n        }, startEvent.parent);\n\n        // then\n        expect(connection.label).to.exist;\n      }\n    ));\n\n\n    it('should NOT add to sequence flow without name', inject(\n      function(elementRegistry, modeling) {\n\n        // given\n        var startEvent = elementRegistry.get('StartEvent_1'),\n            task = elementRegistry.get('Task_1');\n\n        // when\n        var connection = modeling.connect(startEvent, task);\n\n        // then\n        expect(connection.label).not.to.exist;\n      }\n    ));\n\n\n    it('should add to exclusive gateway with name', inject(\n      function(bpmnFactory, elementFactory, elementRegistry, modeling) {\n\n        // given\n        var parentShape = elementRegistry.get('Process_1'),\n            businessObject = bpmnFactory.create('bpmn:ExclusiveGateway', {\n              name: 'foo'\n            }),\n            newShapeAttrs = {\n              type: 'bpmn:ExclusiveGateway',\n              businessObject: businessObject\n            };\n\n        // when\n        var newShape = modeling.createShape(newShapeAttrs, { x: 50, y: 50 }, parentShape);\n\n        // then\n        expect(newShape.label).to.exist;\n      }\n    ));\n\n\n    it('should NOT add to exclusive gateway without name', inject(\n      function(elementFactory, elementRegistry, modeling) {\n\n        // given\n        var parentShape = elementRegistry.get('Process_1'),\n            newShapeAttrs = {\n              type: 'bpmn:ExclusiveGateway'\n            };\n\n        // when\n        var newShape = modeling.createShape(newShapeAttrs, { x: 50, y: 50 }, parentShape);\n\n        // then\n        expect(newShape.label).not.to.exist;\n      }\n    ));\n\n\n    it('should add to group', inject(\n      function(bpmnFactory, elementRegistry, modeling) {\n\n        // given\n        var parentShape = elementRegistry.get('Process_1'),\n            categoryValue = bpmnFactory.create('bpmn:CategoryValue', {\n              value: 'foo'\n            }),\n            businessObject = bpmnFactory.create('bpmn:Group', {\n              categoryValueRef: categoryValue\n            }),\n            newShapeAttrs = {\n              type: 'bpmn:Group',\n              businessObject: businessObject\n            };\n\n        // when\n        var newShape = modeling.createShape(newShapeAttrs, { x: 50, y: 50 }, parentShape);\n\n        // then\n        expect(newShape.label).to.exist;\n      }\n    ));\n\n\n    it('should not add to task', inject(\n      function(elementFactory, elementRegistry, modeling) {\n\n        // given\n        var parentShape = elementRegistry.get('Process_1'),\n            newShapeAttrs = { type: 'bpmn:Task' };\n\n        // when\n        var newShape = modeling.createShape(newShapeAttrs, { x: 50, y: 50 }, parentShape);\n\n        // then\n        expect(newShape.label).not.to.exist;\n      }\n    ));\n\n\n    it('should not add label if created shape is label', inject(\n      function(bpmnFactory, elementFactory, elementRegistry, modeling, textRenderer) {\n\n        // given\n        var parentShape = elementRegistry.get('Process_1');\n\n        var createLabelSpy = sinon.spy(modeling, 'createLabel');\n\n        var exclusiveGatewayBo = bpmnFactory.create('bpmn:ExclusiveGateway', {\n          name: 'Foo'\n        });\n\n        var exclusiveGateway = elementFactory.createShape({\n          type: 'bpmn:ExclusiveGateway',\n          businessObject: exclusiveGatewayBo\n        });\n\n        modeling.createElements([ exclusiveGateway ], { x: 50, y: 50 }, parentShape, {\n          createElementsBehavior: false\n        });\n\n        var externalLabelMid = getExternalLabelMid(exclusiveGateway);\n\n        var externalLabelBounds = textRenderer.getExternalLabelBounds(DEFAULT_LABEL_SIZE, 'Foo');\n\n        var label = elementFactory.createLabel({\n          businessObject: exclusiveGatewayBo,\n          labelTarget: exclusiveGateway,\n          width: externalLabelBounds.width,\n          height: externalLabelBounds.height\n        });\n\n        // when\n        modeling.createElements([ label ], externalLabelMid, parentShape);\n\n        // then\n        expect(createLabelSpy).not.to.have.been.called;\n      })\n    );\n\n\n    describe('on append', function() {\n\n      it('correctly wired and positioned', inject(\n        function(bpmnFactory, elementRegistry, modeling, commandStack) {\n\n          // given\n          var startEventShape = elementRegistry.get('StartEvent_1'),\n              businessObject = bpmnFactory.create('bpmn:EndEvent', {\n                name: 'foo'\n              });\n\n          // when\n          var targetShape = modeling.appendShape(startEventShape, {\n            type: 'bpmn:EndEvent',\n            businessObject: businessObject\n          });\n\n          var label = targetShape.label;\n\n          // then\n          expect(label).to.exist;\n          expect(elementRegistry.get(label.id)).to.exist;\n\n          expect(label.x).to.closeTo(299, 1);\n          expect(label.y).to.be.closeTo(145, 1);\n          expect(label.width).to.be.within(15, 18);\n          expect(label.height).to.be.within(13, 15);\n        }\n      ));\n\n\n      it('with di', inject(\n        function(bpmnFactory, elementRegistry, modeling, commandStack) {\n\n          // given\n          var startEventShape = elementRegistry.get('StartEvent_1'),\n              businessObject = bpmnFactory.create('bpmn:EndEvent', {\n                name: 'foo'\n              });\n\n          // when\n          var targetShape = modeling.appendShape(startEventShape, {\n                type: 'bpmn:EndEvent',\n                businessObject: businessObject\n              }),\n              targetDi = getDi(targetShape);\n\n          // then\n          expect(targetDi.label).to.exist;\n\n          expect(targetDi.label).to.have.bounds(targetShape.label);\n        }\n      ));\n\n    });\n\n\n    it('should add with di', inject(\n      function(bpmnFactory, elementFactory, elementRegistry, modeling) {\n\n        // given\n        var startEventShape = elementRegistry.get('StartEvent_1'),\n            businessObject = bpmnFactory.create('bpmn:SequenceFlow', {\n              name: 'foo'\n            });\n\n        // when\n        var targetShape = modeling.appendShape(startEventShape, {\n              type: 'bpmn:EndEvent',\n              businessObject: businessObject\n            }),\n            targetDi = getDi(targetShape);\n\n        // then\n        expect(targetDi.label).to.exist;\n\n        expect(targetDi.label).to.have.bounds(targetShape.label);\n      }\n    ));\n\n\n    it('should NOT add label if hint createElementsBehavior=false', inject(\n      function(bpmnFactory, elementFactory, elementRegistry, modeling) {\n\n        // given\n        var parentShape = elementRegistry.get('Process_1'),\n            newShape = elementFactory.createShape({\n              type: 'bpmn:ExclusiveGateway',\n              businessObject: bpmnFactory.create('bpmn:ExclusiveGateway', {\n                name: 'foo'\n              })\n            });\n\n        // when\n        newShape = modeling.createShape(newShape, { x: 50, y: 50 }, parentShape, {\n          createElementsBehavior: false\n        });\n\n        // then\n        expect(newShape.label).not.to.exist;\n      }\n    ));\n\n  });\n\n\n  describe('move label', function() {\n\n    it('should move start event label', inject(function(elementRegistry, modeling) {\n\n      // given\n      var startEventShape = elementRegistry.get('StartEvent_1'),\n          startEventDi = getDi(startEventShape),\n          labelShape = startEventShape.label;\n\n      // when\n      modeling.moveElements([ labelShape ], { x: 10, y: -10 });\n\n      // then\n      expect(labelShape.x).to.be.within(193, 194);\n      expect(labelShape.y).to.equal(128);\n      expect(startEventDi.label.bounds.x).to.be.within(193, 194);\n      expect(startEventDi.label.bounds.y).to.equal(128);\n    }));\n\n\n    describe('connection labels', function() {\n\n      it('should center position visible', inject(\n        function(bpmnFactory, elementRegistry, modeling) {\n\n          // given\n          var startEventShape = elementRegistry.get('StartEvent_1'),\n              taskShape = elementRegistry.get('Task_1'),\n              businessObject = bpmnFactory.create('bpmn:SequenceFlow', {\n                name: 'foo'\n              });\n\n          var sequenceFlowConnection = modeling.createConnection(startEventShape, taskShape, {\n            type: 'bpmn:SequenceFlow',\n            businessObject: businessObject\n          }, startEventShape.parent);\n\n\n          // when\n          sequenceFlowConnection.label.hidden = false;\n\n          modeling.updateWaypoints(sequenceFlowConnection, [\n            sequenceFlowConnection.waypoints[0],\n            {\n              x: sequenceFlowConnection.waypoints[0].x,\n              y: 200\n            },\n            {\n              x: sequenceFlowConnection.waypoints[1].x,\n              y: 200\n            },\n            sequenceFlowConnection.waypoints[1]\n          ]);\n\n          // then\n          expect(sequenceFlowConnection.label.x).to.be.closeTo(273, 1);\n          expect(sequenceFlowConnection.label.y).to.be.closeTo(182, 1);\n        }\n      ));\n\n\n      it('should NOT move label if labelBehavior=false', inject(function(elementRegistry, modeling) {\n\n        // given\n        var connection = elementRegistry.get('SequenceFlow_1'),\n            waypoints = copyWaypoints(connection),\n            label = connection.label,\n            oldLabelPosition = pick(label, [ 'x', 'y' ]);\n\n        var newWaypoints = [\n          waypoints[ 0 ],\n          { x: 0, y: 0 },\n          waypoints[ 1 ]\n        ];\n\n        // when\n        modeling.updateWaypoints(connection, newWaypoints, { labelBehavior: false });\n\n        // then\n        expect(pick(label, [ 'x', 'y' ])).to.eql(oldLabelPosition);\n      }));\n\n    });\n\n  });\n\n\n  describe('delete label', function() {\n\n    it('should remove name', inject(function(elementRegistry, modeling) {\n\n      // given\n      var startEventShape = elementRegistry.get('StartEvent_1'),\n          startEvent = startEventShape.businessObject,\n          labelShape = startEventShape.label;\n\n      // when\n      modeling.removeShape(labelShape);\n\n      // then\n      expect(startEventShape.label).not.to.exist;\n      expect(startEvent.name).not.to.exist;\n    }));\n\n  });\n\n\n  describe('update properties', function() {\n\n    it('should resize after updating name property', inject(\n      function(elementRegistry, modeling) {\n\n        // given\n        var spy = sinon.spy(modeling, 'resizeShape');\n\n        var startEventShape = elementRegistry.get('StartEvent_1');\n\n        // when\n        modeling.updateProperties(startEventShape, { name: 'bar' });\n\n        // then\n        expect(spy).to.have.been.called;\n      }\n    ));\n\n\n    it('should resize after updating text property', inject(\n      function(elementRegistry, modeling) {\n\n        // given\n        var spy = sinon.spy(modeling, 'resizeShape');\n\n        var textAnnotationShape = elementRegistry.get('TextAnnotation_1');\n\n        // when\n        modeling.updateProperties(textAnnotationShape, { text: 'bar' });\n\n        // then\n        expect(spy).to.have.been.called;\n      }\n    ));\n\n  });\n\n\n  describe('resize label target', function() {\n\n    describe('should move label (outside)', function() {\n\n      it('to the top', inject(function(elementRegistry, modeling) {\n\n        // given\n        var groupShape = elementRegistry.get('Group_2'),\n            label = groupShape.label,\n            labelBounds = getBounds(label);\n\n        // when\n        modeling.resizeShape(\n          groupShape,\n          resizeBounds(groupShape, 'se', {\n            x: 0,\n            y: -50\n          })\n        );\n\n        // then\n        expect(label.x).to.equal(labelBounds.x);\n        expect(label.y).to.be.below(labelBounds.y);\n\n      }));\n\n\n      it('to the right', inject(function(elementRegistry, modeling) {\n\n        // given\n        var groupShape = elementRegistry.get('Group_1'),\n            label = groupShape.label,\n            labelBounds = getBounds(label);\n\n        // when\n        modeling.resizeShape(\n          groupShape,\n          resizeBounds(groupShape, 'se', {\n            x: 50,\n            y: 0\n          })\n        );\n\n        // then\n        expect(label.x).to.be.above(labelBounds.x);\n        expect(label.y).to.equal(labelBounds.y);\n\n      }));\n\n\n      it('to the bottom', inject(function(elementRegistry, modeling) {\n\n        // given\n        var groupShape = elementRegistry.get('Group_2'),\n            label = groupShape.label,\n            labelBounds = getBounds(label);\n\n        // when\n        modeling.resizeShape(\n          groupShape,\n          resizeBounds(groupShape, 'se', {\n            x: 0,\n            y: 50\n          })\n        );\n\n        // then\n        expect(label.x).to.equal(labelBounds.x);\n        expect(label.y).to.be.above(labelBounds.y);\n\n      }));\n\n\n      it('to the left', inject(function(elementRegistry, modeling) {\n\n        // given\n        var groupShape = elementRegistry.get('Group_3'),\n            label = groupShape.label,\n            labelBounds = getBounds(label);\n\n        // when\n        modeling.resizeShape(\n          groupShape,\n          resizeBounds(groupShape, 'sw', {\n            x: -50,\n            y: 0\n          })\n        );\n\n        // then\n        expect(label.x).to.be.below(labelBounds.x);\n        expect(label.y).to.equal(labelBounds.y);\n\n      }));\n\n\n      it('NOT if reference point not affected', inject(function(elementRegistry, modeling) {\n\n        // given\n        var groupShape = elementRegistry.get('Group_2'),\n            label = groupShape.label,\n            labelBounds = getBounds(label);\n\n        // when\n        modeling.resizeShape(\n          groupShape,\n          resizeBounds(groupShape, 'ne', {\n            x: 0,\n            y: -50\n          })\n        );\n\n        // then\n        expect(getBounds(label)).to.eql(labelBounds);\n\n      }));\n\n    });\n\n\n    describe('should move label (inside)', function() {\n\n      it('to the top', inject(function(elementRegistry, modeling) {\n\n        // given\n        var groupShape = elementRegistry.get('Group_4'),\n            label = groupShape.label,\n            labelBounds = getBounds(label);\n\n        // when\n        modeling.resizeShape(\n          groupShape,\n          resizeBounds(groupShape, 'nw', {\n            x: 0,\n            y: -50\n          })\n        );\n\n        // then\n        expect(label.x).to.equal(labelBounds.x);\n        expect(label.y).to.be.below(labelBounds.y);\n\n      }));\n\n\n      it('to the right', inject(function(elementRegistry, modeling) {\n\n        // given\n        var groupShape = elementRegistry.get('Group_4'),\n            label = groupShape.label,\n            labelBounds = getBounds(label);\n\n        // when\n        modeling.resizeShape(\n          groupShape,\n          resizeBounds(groupShape, 'ne', {\n            x: 50,\n            y: 0\n          })\n        );\n\n        // then\n        expect(label.x).to.be.above(labelBounds.x);\n        expect(label.y).to.equal(labelBounds.y);\n\n      }));\n\n\n      it('to the bottom', inject(function(elementRegistry, modeling) {\n\n        // given\n        var groupShape = elementRegistry.get('Group_5'),\n            label = groupShape.label,\n            labelBounds = getBounds(label);\n\n        // when\n        modeling.resizeShape(\n          groupShape,\n          resizeBounds(groupShape, 'sw', {\n            x: 0,\n            y: 50\n          })\n        );\n\n        // then\n        expect(label.x).to.equal(labelBounds.x);\n        expect(label.y).to.be.above(labelBounds.y);\n\n      }));\n\n\n      it('to the left', inject(function(elementRegistry, modeling) {\n\n        // given\n        var groupShape = elementRegistry.get('Group_4'),\n            label = groupShape.label,\n            labelBounds = getBounds(label);\n\n        // when\n        modeling.resizeShape(\n          groupShape,\n          resizeBounds(groupShape, 'sw', {\n            x: -50,\n            y: 0\n          })\n        );\n\n        // then\n        expect(label.x).to.be.below(labelBounds.x);\n        expect(label.y).to.equal(labelBounds.y);\n\n      }));\n\n\n      it('NOT if reference point not affected', inject(function(elementRegistry, modeling) {\n\n        // given\n        var groupShape = elementRegistry.get('Group_4'),\n            label = groupShape.label,\n            labelBounds = getBounds(label);\n\n        // when\n        modeling.resizeShape(\n          groupShape,\n          resizeBounds(groupShape, 'se', {\n            x: 0,\n            y: 50\n          })\n        );\n\n        // then\n        expect(getBounds(label)).to.eql(labelBounds);\n\n      }));\n\n    });\n\n  });\n\n});\n\n\ndescribe('features/modeling/behavior - LabelBehavior - copy/paste integration', function() {\n\n  var diagramXML = require('./LabelBehavior.copyPaste.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: [\n      modelingModule,\n      coreModule,\n      gridSnappingModule\n    ]\n  }));\n\n\n  it('should skip adjustment during creation', inject(\n    function(elementRegistry, copyPaste, canvas, dragging) {\n\n      // given\n      var elements = [\n        elementRegistry.get('Source'),\n        elementRegistry.get('Target'),\n        elementRegistry.get('SequenceFlow'),\n        elementRegistry.get('SequenceFlow').label\n      ];\n\n      var rootElement = canvas.getRootElement();\n\n      copyPaste.copy(elements);\n\n      // when\n      var pastedElements = copyPaste.paste({\n        element: rootElement,\n        point: {\n          x: 700,\n          y: 300\n        }\n      });\n\n      var label = pastedElements[3];\n\n      // then\n      expect(label).to.exist;\n\n      expect(label).to.have.position({ x: 681, y: 287 });\n    }\n  ));\n\n});\n\n\n// helpers //////////\n\nfunction copyWaypoint(waypoint) {\n  return assign({}, waypoint);\n}\n\nfunction copyWaypoints(connection) {\n  return map(connection.waypoints, function(waypoint) {\n\n    waypoint = copyWaypoint(waypoint);\n\n    if (waypoint.original) {\n      waypoint.original = copyWaypoint(waypoint.original);\n    }\n\n    return waypoint;\n  });\n}\n\nfunction getBounds(element) {\n  return pick(element, [ 'x', 'y', 'width', 'height' ]);\n}\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/LayoutConnectionBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"simple\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"18.3.1\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"Collaboration_1wcsthq\">\n    <bpmn2:participant id=\"Participant_1\" processRef=\"Process_1\" />\n    <bpmn2:participant id=\"Participant_2\" processRef=\"Process_2\" />\n    <bpmn2:messageFlow id=\"MessageFlow_1\" sourceRef=\"Participant_2\" targetRef=\"Participant_1\" />\n    <bpmn2:textAnnotation id=\"TextAnnotation_1\" />\n    <bpmn2:association id=\"Association_2\" sourceRef=\"SequenceFlow_1\" targetRef=\"TextAnnotation_1\" />\n    <bpmn2:association id=\"Association_1\" sourceRef=\"TextAnnotation_1\" targetRef=\"SequenceFlow_1\" />\n    <bpmn2:textAnnotation id=\"TextAnnotation_2\" />\n    <bpmn2:association id=\"Association_3\" associationDirection=\"None\" sourceRef=\"MessageFlow_1\" targetRef=\"TextAnnotation_2\" />\n    <bpmn2:association id=\"Association_4\" associationDirection=\"None\" sourceRef=\"TextAnnotation_2\" targetRef=\"MessageFlow_1\" />\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:endEvent id=\"EndEvent_1\" name=\"End Event\">\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:startEvent id=\"StartEvent_1\" name=\"Start\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"Flow\" sourceRef=\"StartEvent_1\" targetRef=\"EndEvent_1\" />\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_2\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1wcsthq\">\n      <bpmndi:BPMNShape id=\"Participant_1_di\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"107\" y=\"60\" width=\"650\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_3\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_StartEvent_11\" targetElement=\"_BPMNShape_EndEvent_2\">\n        <di:waypoint x=\"194\" y=\"150\" />\n        <di:waypoint x=\"700\" y=\"150\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"259\" y=\"124\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"700\" y=\"132\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"693\" y=\"168\" width=\"51\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_11\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"158\" y=\"132\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"164\" y=\"173\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_1yj4jk8_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"500\" y=\"80\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_1_di\" bpmnElement=\"Association_1\">\n        <di:waypoint x=\"525\" y=\"110\" />\n        <di:waypoint x=\"460\" y=\"150\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Association_2_di\" bpmnElement=\"Association_2\">\n        <di:waypoint x=\"460\" y=\"150\" />\n        <di:waypoint x=\"525\" y=\"110\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Participant_2_di\" bpmnElement=\"Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"160\" y=\"690\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_1_di\" bpmnElement=\"MessageFlow_1\">\n        <di:waypoint x=\"280\" y=\"690\" />\n        <di:waypoint x=\"280\" y=\"310\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"TextAnnotation_2_di\" bpmnElement=\"TextAnnotation_2\">\n        <dc:Bounds x=\"330\" y=\"540\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_3_di\" bpmnElement=\"Association_3\">\n        <di:waypoint x=\"280\" y=\"500\" />\n        <di:waypoint x=\"353\" y=\"540\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Association_4_di\" bpmnElement=\"Association_4\">\n        <di:waypoint x=\"353\" y=\"540\" />\n        <di:waypoint x=\"280\" y=\"500\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/LayoutConnectionBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\n\nimport {\n  assign,\n  map,\n} from 'min-dash';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\ndescribe('behavior - LayoutConnectionBehavior', function() {\n\n  var diagramXML = require('./LayoutConnectionBehavior.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: [\n      modelingModule,\n      coreModule\n    ]\n  }));\n\n\n  describe('incomming association', function() {\n\n    it('should reconnect on sequence flow bendpoint move', inject(function(elementRegistry, modeling) {\n\n      // given\n      var sequenceFlow = elementRegistry.get('SequenceFlow_1');\n      var association = elementRegistry.get('Association_1');\n\n      // when\n      var newWaypoints = copyWaypoints(sequenceFlow);\n      newWaypoints.splice(1, 0,\n        { x: 500, y: 300 }\n      );\n\n      var hints = {\n        bendpointMove: {\n          bendpointIndex: 1,\n          insert: true\n        }\n      };\n\n      modeling.updateWaypoints(sequenceFlow, newWaypoints, hints);\n\n      // then\n      expectApproximateWaypoints(association, [\n        { x: 525, y: 110 },\n        { x: 355, y: 229 },\n      ]);\n    }));\n\n\n    it('should reconnect on sequence flow connection move', inject(function(elementRegistry, modeling) {\n\n      // given\n      var startEvent = elementRegistry.get('StartEvent_1');\n      var endEvent = elementRegistry.get('EndEvent_1');\n      var association = elementRegistry.get('Association_1');\n\n      // when\n      modeling.moveElements([ startEvent, endEvent ], { x: 0, y: 200 });\n\n      // then\n      expectApproximateWaypoints(association, [\n        { x: 525, y: 110 },\n        { x: 460, y: 350 },\n      ]);\n\n    }));\n\n\n    it('should reconnect on sequence flow waypoint update', inject(function(elementRegistry, modeling) {\n\n      // given\n      var sequenceFlow = elementRegistry.get('SequenceFlow_1');\n      var association = elementRegistry.get('Association_1');\n\n      // when\n      var newWaypoints = [\n        sequenceFlow.waypoints[0],\n        { x: sequenceFlow.waypoints[0].x, y: 300 },\n        { x: sequenceFlow.waypoints[1].x, y: 300 },\n        sequenceFlow.waypoints[1],\n      ];\n\n      modeling.updateWaypoints(sequenceFlow, newWaypoints);\n\n      // then\n      expectApproximateWaypoints(association, [\n        { x: 525, y: 110 },\n        { x: 460, y: 300 }\n      ]);\n    }));\n\n\n    it('should reconnect on message flow bendpoint move', inject(function(elementRegistry, modeling) {\n\n      // given\n      var messageFlow = elementRegistry.get('MessageFlow_1');\n      var association = elementRegistry.get('Association_4');\n\n      // when\n      var newWaypoints = copyWaypoints(messageFlow);\n      newWaypoints.splice(1, 0,\n        { x: 200, y: 500 }\n      );\n\n      var hints = {\n        bendpointMove: {\n          bendpointIndex: 1,\n          insert: true\n        }\n      };\n\n      modeling.updateWaypoints(messageFlow, newWaypoints, hints);\n\n      // then\n      expectApproximateWaypoints(association, [\n        { x: 353, y: 540 },\n        { x: 240, y: 595 },\n      ]);\n    }));\n\n\n    it('should reconnect on message flow connection move', inject(function(elementRegistry, modeling) {\n\n      // given\n      var startParticipant = elementRegistry.get('Participant_1');\n      var endParticipant = elementRegistry.get('Participant_2');\n      var association = elementRegistry.get('Association_4');\n\n      // when\n      modeling.moveElements([ startParticipant, endParticipant ], { x: 0, y: 200 });\n\n      // then\n      expectApproximateWaypoints(association, [\n        { x: 353, y: 540 },\n        { x: 280, y: 700 },\n      ]);\n\n    }));\n\n\n    it('should reconnect on message flow waypoint update', inject(function(elementRegistry, modeling) {\n\n      // given\n      var messageFlow = elementRegistry.get('MessageFlow_1');\n      var association = elementRegistry.get('Association_4');\n\n      // when\n      var newWaypoints = [\n        messageFlow.waypoints[0],\n        { x: 230, y: 670 },\n        { x: 230, y: 330 },\n        messageFlow.waypoints[1],\n      ];\n\n      modeling.updateWaypoints(messageFlow, newWaypoints);\n\n      // then\n      expectApproximateWaypoints(association, [\n        { x: 353, y: 540 },\n        { x: 230, y: 500 }\n      ]);\n    }));\n\n  });\n\n\n  describe('outgoing association', function() {\n\n    it('should reconnect on sequence flow bendpoint move', inject(function(elementRegistry, modeling) {\n\n      // given\n      var sequenceFlow = elementRegistry.get('SequenceFlow_1');\n      var association = elementRegistry.get('Association_2');\n\n      // when\n      var newWaypoints = copyWaypoints(sequenceFlow);\n      newWaypoints.splice(1, 0,\n        { x: 500, y: 300 }\n      );\n\n      var hints = {\n        bendpointMove: {\n          bendpointIndex: 1,\n          insert: true\n        }\n      };\n\n      modeling.updateWaypoints(sequenceFlow, newWaypoints, hints);\n\n      // then\n      expectApproximateWaypoints(association, [\n        { x: 355, y: 229 },\n        { x: 525, y: 110 }\n      ]);\n    }));\n\n\n    it('should reconnect on sequence flow connection move', inject(function(elementRegistry, modeling) {\n\n      // given\n      var startEvent = elementRegistry.get('StartEvent_1');\n      var endEvent = elementRegistry.get('EndEvent_1');\n      var association = elementRegistry.get('Association_2');\n\n      // when\n      modeling.moveElements([ startEvent, endEvent ], { x: 0, y: 200 });\n\n      // then\n      expectApproximateWaypoints(association, [\n        { x: 460, y: 350 },\n        { x: 525, y: 110 }\n      ]);\n\n    }));\n\n\n    it('should reconnect on sequence flow waypoint update', inject(function(elementRegistry, modeling) {\n\n      // given\n      var sequenceFlow = elementRegistry.get('SequenceFlow_1');\n      var association = elementRegistry.get('Association_2');\n\n      // when\n      var newWaypoints = [\n        sequenceFlow.waypoints[0],\n        { x: sequenceFlow.waypoints[0].x, y: 300 },\n        { x: sequenceFlow.waypoints[1].x, y: 300 },\n        sequenceFlow.waypoints[1],\n      ];\n\n      modeling.updateWaypoints(sequenceFlow, newWaypoints);\n\n      // then\n      expectApproximateWaypoints(association, [\n        { x: 460, y: 300 },\n        { x: 525, y: 110 }\n      ]);\n    }));\n\n\n    it('should reconnect on message flow bendpoint move', inject(function(elementRegistry, modeling) {\n\n      // given\n      var messageFlow = elementRegistry.get('MessageFlow_1');\n      var association = elementRegistry.get('Association_3');\n\n      // when\n      var newWaypoints = copyWaypoints(messageFlow);\n      newWaypoints.splice(1, 0,\n        { x: 200, y: 500 }\n      );\n\n      var hints = {\n        bendpointMove: {\n          bendpointIndex: 1,\n          insert: true\n        }\n      };\n\n      modeling.updateWaypoints(messageFlow, newWaypoints, hints);\n\n      // then\n      expectApproximateWaypoints(association, [\n        { x: 240, y: 595 },\n        { x: 353, y: 540 }\n      ]);\n    }));\n\n\n    it('should reconnect on message flow connection move', inject(function(elementRegistry, modeling) {\n\n      // given\n      var startParticipant = elementRegistry.get('Participant_1');\n      var endParticipant = elementRegistry.get('Participant_2');\n      var association = elementRegistry.get('Association_3');\n\n      // when\n      modeling.moveElements([ startParticipant, endParticipant ], { x: 0, y: 200 });\n\n      // then\n      expectApproximateWaypoints(association, [\n        { x: 280, y: 700 },\n        { x: 353, y: 540 }\n      ]);\n\n    }));\n\n\n    it('should reconnect on message flow waypoint update', inject(function(elementRegistry, modeling) {\n\n      // given\n      var messageFlow = elementRegistry.get('MessageFlow_1');\n      var association = elementRegistry.get('Association_3');\n\n      // when\n      var newWaypoints = [\n        messageFlow.waypoints[0],\n        { x: 230, y: 670 },\n        { x: 230, y: 330 },\n        messageFlow.waypoints[1],\n      ];\n\n      modeling.updateWaypoints(messageFlow, newWaypoints);\n\n      // then\n      expectApproximateWaypoints(association, [\n        { x: 230, y: 500 },\n        { x: 353, y: 540 }\n      ]);\n    }));\n\n  });\n\n});\n\n\n// helpers //////////\n\nfunction copyWaypoint(waypoint) {\n  return assign({}, waypoint);\n}\n\nfunction copyWaypoints(connection) {\n  return map(connection.waypoints, function(waypoint) {\n\n    waypoint = copyWaypoint(waypoint);\n\n    if (waypoint.original) {\n      waypoint.original = copyWaypoint(waypoint.original);\n    }\n\n    return waypoint;\n  });\n}\n\nfunction expectApproximateWaypoints(connection, expectedWaypoints) {\n\n  var actualWaypoints = connection.waypoints;\n\n  expect(actualWaypoints).to.exist;\n  expect(expectedWaypoints).to.exist;\n\n  expect(connection.waypoints.length).to.eql(expectedWaypoints.length);\n\n  for (var i in actualWaypoints) {\n    expect(actualWaypoints[i].x).to.be.closeTo(expectedWaypoints[i].x, 1);\n    expect(actualWaypoints[i].y).to.be.closeTo(expectedWaypoints[i].y, 1);\n  }\n}"
  },
  {
    "path": "test/spec/features/modeling/behavior/MessageFlowBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:bioc=\"http://bpmn.io/schema/bpmn/biocolor/1.0\" id=\"simple\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.7.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"Collaboration_1\">\n    <bpmn2:participant id=\"Participant_1\" name=\"Participant_1\" processRef=\"Process_1\" />\n    <bpmn2:participant id=\"Participant_2\" name=\"Participant_2\" processRef=\"Process_2\" />\n    <bpmn2:participant id=\"Participant_3\" name=\"Participant_3\" processRef=\"Process_3\" />\n    <bpmn2:participant id=\"Participant_4\" name=\"Participant_4\" processRef=\"Process_4\" />\n    <bpmn2:messageFlow id=\"Flow_2\" name=\"Flow_2\" sourceRef=\"Activity_3\" targetRef=\"Activity_1\" />\n    <bpmn2:messageFlow id=\"Flow_4\" name=\"Flow_4\" sourceRef=\"Activity_4\" targetRef=\"Activity_3\" />\n    <bpmn2:messageFlow id=\"Flow_3\" name=\"Flow_3\" sourceRef=\"Activity_4\" targetRef=\"Activity_2\" />\n    <bpmn2:messageFlow id=\"Flow_1\" name=\"Flow_1\" sourceRef=\"Activity_2\" targetRef=\"Activity_1\" />\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:task id=\"Activity_1\" name=\"Activity_1\" />\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn2:task id=\"Activity_2\" name=\"Activity_2\" />\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_3\" isExecutable=\"false\">\n    <bpmn2:task id=\"Activity_3\" name=\"Activity_3\" />\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_4\" isExecutable=\"false\">\n    <bpmn2:task id=\"Activity_4\" name=\"Activity_4\" />\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_1xi2u59_di\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"180\" y=\"80\" width=\"330\" height=\"240\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1ajk3x2_di\" bpmnElement=\"Activity_1\">\n        <dc:Bounds x=\"310\" y=\"160\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_1bs1k5p_di\" bpmnElement=\"Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"180\" y=\"400\" width=\"330\" height=\"240\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_19rbcko_di\" bpmnElement=\"Activity_2\">\n        <dc:Bounds x=\"310\" y=\"480\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_1gev1ss_di\" bpmnElement=\"Participant_3\" isHorizontal=\"true\">\n        <dc:Bounds x=\"610\" y=\"400\" width=\"330\" height=\"240\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0tq9cy6_di\" bpmnElement=\"Activity_3\">\n        <dc:Bounds x=\"740\" y=\"480\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_1r1lj0k_di\" bpmnElement=\"Participant_4\" isHorizontal=\"true\">\n        <dc:Bounds x=\"610\" y=\"720\" width=\"330\" height=\"240\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_18zqri6_di\" bpmnElement=\"Activity_4\">\n        <dc:Bounds x=\"740\" y=\"800\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_10f8p6o_di\" bpmnElement=\"Flow_2\" bioc:stroke=\"#000\" bioc:fill=\"#fff\">\n        <di:waypoint x=\"790\" y=\"480\" />\n        <di:waypoint x=\"790\" y=\"360\" />\n        <di:waypoint x=\"370\" y=\"360\" />\n        <di:waypoint x=\"370\" y=\"240\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"562\" y=\"342\" width=\"36\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1hgc2dc_di\" bpmnElement=\"Flow_4\" bioc:stroke=\"#000\" bioc:fill=\"#fff\">\n        <di:waypoint x=\"800\" y=\"800\" />\n        <di:waypoint x=\"800\" y=\"560\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"797\" y=\"677\" width=\"37\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0hj61b5_di\" bpmnElement=\"Flow_3\" bioc:stroke=\"#000\" bioc:fill=\"#fff\">\n        <di:waypoint x=\"780\" y=\"800\" />\n        <di:waypoint x=\"780\" y=\"680\" />\n        <di:waypoint x=\"360\" y=\"680\" />\n        <di:waypoint x=\"360\" y=\"560\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"552\" y=\"662\" width=\"36\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1oa1qkv_di\" bpmnElement=\"Flow_1\">\n        <di:waypoint x=\"350\" y=\"480\" />\n        <di:waypoint x=\"350\" y=\"240\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"347\" y=\"357\" width=\"36\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/MessageFlowBehaviorSpec.js",
    "content": "import {\r\n  bootstrapModeler,\r\n  inject\r\n} from 'test/TestHelper';\r\n\r\nimport coreModule from 'lib/core';\r\nimport modelingModule from 'lib/features/modeling';\r\n\r\n\r\ndescribe('features/modeling - message flow behavior', function() {\r\n\r\n  var testModules = [ coreModule, modelingModule ];\r\n\r\n\r\n  describe('when collapsing participant', function() {\r\n\r\n    var processDiagramXML = require('./MessageFlowBehavior.bpmn');\r\n\r\n    beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\r\n\r\n\r\n    it('should reconnect message flows to collapsed participant (incoming)', inject(\r\n      function(bpmnReplace, elementRegistry) {\r\n\r\n        // given\r\n        var participant = elementRegistry.get('Participant_1');\r\n\r\n        // when\r\n        participant = bpmnReplace.replaceElement(participant, {\r\n          type: 'bpmn:Participant',\r\n          isExpanded: false\r\n        });\r\n\r\n        // then\r\n        expect(participant.incoming).to.have.length(2);\r\n\r\n        expect(elementRegistry.get('Flow_1').waypoints).to.eql([\r\n          {\r\n            original: {\r\n              x: 350,\r\n              y: 520\r\n            },\r\n            x: 350,\r\n            y: 480\r\n          },\r\n          {\r\n            original: {\r\n              x: 350,\r\n              y: 110\r\n            },\r\n            x: 350,\r\n            y: 140\r\n          }\r\n        ]);\r\n\r\n        expect(elementRegistry.get('Flow_2').waypoints).to.eql([\r\n          {\r\n            original: {\r\n              x: 790,\r\n              y: 520\r\n            },\r\n            x: 790,\r\n            y: 480\r\n          },\r\n          {\r\n            x: 790,\r\n            y: 360\r\n          },\r\n          {\r\n            x: 370,\r\n            y: 360\r\n          },\r\n          {\r\n            original: {\r\n              x: 370,\r\n              y: 110\r\n            },\r\n            x: 370,\r\n            y: 140\r\n          }\r\n        ]);\r\n      }\r\n    ));\r\n\r\n\r\n    it('should reconnect message flows to collapsed participant (outgoing)', inject(\r\n      function(bpmnReplace, elementRegistry) {\r\n\r\n        // given\r\n        var participant = elementRegistry.get('Participant_4');\r\n\r\n        // when\r\n        participant = bpmnReplace.replaceElement(participant, {\r\n          type: 'bpmn:Participant',\r\n          isExpanded: false\r\n        });\r\n\r\n        // then\r\n        expect(participant.outgoing).to.have.length(2);\r\n\r\n        expect(elementRegistry.get('Flow_3').waypoints).to.eql([\r\n          {\r\n            original: {\r\n              x: 780,\r\n              y: 750\r\n            },\r\n            x: 780,\r\n            y: 720\r\n          },\r\n          {\r\n            x: 780,\r\n            y: 680\r\n          },\r\n          {\r\n            x: 360,\r\n            y: 680\r\n          },\r\n          {\r\n            original: {\r\n              x: 360,\r\n              y: 520\r\n            },\r\n            x: 360,\r\n            y: 560\r\n          }\r\n        ]);\r\n\r\n        expect(elementRegistry.get('Flow_4').waypoints).to.eql([\r\n          {\r\n            original: {\r\n              x: 800,\r\n              y: 750\r\n            },\r\n            x: 800,\r\n            y: 720\r\n          },\r\n          {\r\n            original: {\r\n              x: 800,\r\n              y: 520\r\n            },\r\n            x: 800,\r\n            y: 560\r\n          }\r\n        ]);\r\n      }\r\n    ));\r\n\r\n  });\r\n\r\n});"
  },
  {
    "path": "test/spec/features/modeling/behavior/NonInterruptingBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_0y57lde\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.16.0\" modeler:executionPlatform=\"Camunda Cloud\" modeler:executionPlatformVersion=\"8.3.0\">\n  <bpmn:process id=\"Process_0jdll32\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"Activity_1szoedm\" triggeredByEvent=\"true\">\n      <bpmn:startEvent id=\"StartEvent_interrupting\">\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_1hnz3qy\" />\n      </bpmn:startEvent>\n      <bpmn:startEvent id=\"StartEvent_nonInterrupting\" isInterrupting=\"false\">\n        <bpmn:messageEventDefinition id=\"MessageEventDefinition_0ba7a8k\" />\n      </bpmn:startEvent>\n    </bpmn:subProcess>\n    <bpmn:task id=\"Task_1\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_interrupting\" attachedToRef=\"Task_1\">\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_0fe1m2n\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundaryEvent_nonInterrupting\" cancelActivity=\"false\" attachedToRef=\"Task_1\">\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_1f5jywk\" />\n    </bpmn:boundaryEvent>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_0jdll32\">\n      <bpmndi:BPMNShape id=\"Activity_1nblmk5_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"160\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1ptz4rb_di\" bpmnElement=\"Activity_1szoedm\" isExpanded=\"true\">\n        <dc:Bounds x=\"160\" y=\"200\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_19plmrz_di\" bpmnElement=\"StartEvent_interrupting\">\n        <dc:Bounds x=\"200\" y=\"282\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0tnq080_di\" bpmnElement=\"StartEvent_nonInterrupting\">\n        <dc:Bounds x=\"262\" y=\"282\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_18h0ja5_di\" bpmnElement=\"BoundaryEvent_interrupting\">\n        <dc:Bounds x=\"172\" y=\"142\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0xogxo6_di\" bpmnElement=\"BoundaryEvent_nonInterrupting\">\n        <dc:Bounds x=\"212\" y=\"142\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/NonInterruptingBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\n\n\ndescribe('features/modeling - non interrupting behavior', function() {\n\n  const testModules = [ coreModule, modelingModule ];\n\n  const processDiagramXML = require('./NonInterruptingBehavior.bpmn');\n\n  beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n  let event;\n\n  describe('start events', function() {\n\n    describe('interrupting', function() {\n\n      beforeEach(inject(function(elementRegistry) {\n        event = elementRegistry.get('StartEvent_interrupting');\n      }));\n\n\n      it('should stay interrupting when replacing',\n        inject(function(bpmnReplace) {\n\n          // when\n          const newEvent = bpmnReplace.replaceElement(event, {\n            type: 'bpmn:StartEvent',\n            eventDefinitionType: 'bpmn:TimerEventDefinition'\n          });\n\n          // then\n          expect(newEvent.businessObject.isInterrupting).to.be.true;\n        })\n      );\n\n\n      it('should become non-interrupting when explicitly replacing with non-interrupting event',\n        inject(function(bpmnReplace) {\n\n          // when\n          const newEvent = bpmnReplace.replaceElement(event, {\n            type: 'bpmn:StartEvent',\n            eventDefinitionType: 'bpmn:TimerEventDefinition',\n            isInterrupting: false\n          });\n\n          // then\n          expect(newEvent.businessObject.isInterrupting).to.be.false;\n        })\n      );\n\n    });\n\n\n    describe('non-interrupting', function() {\n\n      beforeEach(inject(function(elementRegistry) {\n        event = elementRegistry.get('StartEvent_nonInterrupting');\n      }));\n\n\n      it('should stay non-interrupting when replacing',\n        inject(function(bpmnReplace) {\n\n          // when\n          const newEvent = bpmnReplace.replaceElement(event, {\n            type: 'bpmn:StartEvent',\n            eventDefinitionType: 'bpmn:TimerEventDefinition'\n          });\n\n          // then\n          expect(newEvent.businessObject.isInterrupting).to.be.false;\n        })\n      );\n\n\n      it('should become interrupting when explicitly replacing with interrupting event',\n        inject(function(bpmnReplace) {\n\n          // when\n          const newEvent = bpmnReplace.replaceElement(event, {\n            type: 'bpmn:StartEvent',\n            eventDefinitionType: 'bpmn:TimerEventDefinition',\n            isInterrupting: true\n          });\n\n          // then\n          expect(newEvent.businessObject.isInterrupting).to.be.true;\n        })\n      );\n\n\n      it('should become interrupting when replacing with interrupting event type',\n        inject(function(bpmnReplace) {\n\n          // when\n          const newEvent = bpmnReplace.replaceElement(event, {\n            type: 'bpmn:StartEvent',\n            eventDefinitionType: 'bpmn:ErrorEventDefinition'\n          });\n\n          // then\n          expect(newEvent.businessObject.isInterrupting).to.be.true;\n        })\n      );\n\n    });\n\n  });\n\n\n  describe('boundary events', function() {\n\n    describe('interrupting', function() {\n\n      beforeEach(inject(function(elementRegistry) {\n        event = elementRegistry.get('BoundaryEvent_interrupting');\n      }));\n\n\n      it('should stay interrupting when replacing',\n        inject(function(bpmnReplace) {\n\n          // when\n          const newEvent = bpmnReplace.replaceElement(event, {\n            type: 'bpmn:BoundaryEvent',\n            eventDefinitionType: 'bpmn:TimerEventDefinition'\n          });\n\n          // then\n          expect(newEvent.businessObject.cancelActivity).to.be.true;\n        })\n      );\n\n\n      it('should become non-interrupting when explicitly replacing with non-interrupting event',\n        inject(function(bpmnReplace) {\n\n          // when\n          const newEvent = bpmnReplace.replaceElement(event, {\n            type: 'bpmn:BoundaryEvent',\n            eventDefinitionType: 'bpmn:TimerEventDefinition',\n            cancelActivity: false\n          });\n\n          // then\n          expect(newEvent.businessObject.cancelActivity).to.be.false;\n        })\n      );\n\n    });\n\n\n    describe('non-interrupting', function() {\n\n      beforeEach(inject(function(elementRegistry) {\n        event = elementRegistry.get('BoundaryEvent_nonInterrupting');\n      }));\n\n\n      it('should stay non-interrupting when replacing',\n        inject(function(bpmnReplace) {\n\n          // when\n          const newEvent = bpmnReplace.replaceElement(event, {\n            type: 'bpmn:BoundaryEvent',\n            eventDefinitionType: 'bpmn:TimerEventDefinition'\n          });\n\n          // then\n          expect(newEvent.businessObject.cancelActivity).to.be.false;\n        })\n      );\n\n\n      it('should become interrupting when explicitly replacing with interrupting event',\n        inject(function(bpmnReplace) {\n\n          // when\n          const newEvent = bpmnReplace.replaceElement(event, {\n            type: 'bpmn:BoundaryEvent',\n            eventDefinitionType: 'bpmn:TimerEventDefinition',\n            cancelActivity: true\n          });\n\n          // then\n          expect(newEvent.businessObject.cancelActivity).to.be.true;\n        })\n      );\n\n\n      it('should become interrupting when replacing with interrupting event type',\n        inject(function(bpmnReplace) {\n\n          // when\n          const newEvent = bpmnReplace.replaceElement(event, {\n            type: 'bpmn:BoundaryEvent',\n            eventDefinitionType: 'bpmn:ErrorEventDefinition'\n          });\n\n          // then\n          expect(newEvent.businessObject.cancelActivity).to.be.true;\n        })\n      );\n\n    });\n\n  });\n\n});"
  },
  {
    "path": "test/spec/features/modeling/behavior/ReconnectConnection.data-association.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_1\" name=\"Task 1\">\n      <bpmn:dataOutputAssociation id=\"DataOutputAssociation_1\">\n        <bpmn:targetRef>DataObjectReference_1</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n    </bpmn:task>\n    <bpmn:task id=\"Task_2\" name=\"Task 2\">\n      <bpmn:dataInputAssociation id=\"DataInputAssociation_1\">\n        <bpmn:sourceRef>DataObjectReference_1</bpmn:sourceRef>\n      </bpmn:dataInputAssociation>\n    </bpmn:task>\n    <bpmn:dataObjectReference id=\"DataObjectReference_1\" dataObjectRef=\"DataObject_1\" />\n    <bpmn:dataObject id=\"DataObject_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"141\" y=\"62\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"382\" y=\"62\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_1_di\" bpmnElement=\"DataObjectReference_1\">\n        <dc:Bounds x=\"291\" y=\"200\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"264\" y=\"250\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_1_di\" bpmnElement=\"DataInputAssociation_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"327\" y=\"207\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"392\" y=\"142\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_1_di\" bpmnElement=\"DataOutputAssociation_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"229\" y=\"142\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"291\" y=\"206\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/ReconnectConnectionSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - reconnect connection', function() {\n\n  var testModules = [ coreModule, modelingModule ];\n\n  var processDiagramXML = require('./ReconnectConnection.data-association.bpmn');\n\n  beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n  var task1Shape,\n      task2Shape,\n      dataInputAssociation,\n      dataOutputAssociation,\n      newWaypoints;\n\n  beforeEach(inject(function(elementRegistry) {\n    task1Shape = elementRegistry.get('Task_1');\n    task2Shape = elementRegistry.get('Task_2');\n    dataInputAssociation = elementRegistry.get('DataInputAssociation_1');\n    dataOutputAssociation = elementRegistry.get('DataOutputAssociation_1');\n  }));\n\n\n  describe('reconnect DataOutputAssociations', function() {\n\n    beforeEach(function() {\n      newWaypoints = [ { x: task2Shape.x, y: task2Shape.y + 30 }, dataOutputAssociation.waypoints[1] ];\n    });\n\n    it('should execute', inject(function(modeling) {\n\n      // when\n      modeling.reconnectStart(dataOutputAssociation, task2Shape, newWaypoints);\n\n      // then\n      expect(task1Shape.businessObject.dataOutputAssociations).to.be.empty;\n      expect(task2Shape.businessObject.dataOutputAssociations).to.include(dataOutputAssociation.businessObject);\n\n    }));\n\n\n    it('should undo', inject(function(modeling, commandStack) {\n\n      // when\n      modeling.reconnectStart(dataOutputAssociation, task2Shape, newWaypoints);\n      commandStack.undo();\n\n      // then\n      expect(task1Shape.businessObject.dataOutputAssociations).to.include(dataOutputAssociation.businessObject);\n      expect(task2Shape.businessObject.dataOutputAssociations).to.be.empty;\n\n    }));\n\n\n    it('should redo', inject(function(modeling, commandStack) {\n\n      // when\n      modeling.reconnectStart(dataOutputAssociation, task2Shape, newWaypoints);\n      commandStack.undo();\n      commandStack.redo();\n\n      // then\n      expect(task1Shape.businessObject.dataOutputAssociations).to.be.empty;\n      expect(task2Shape.businessObject.dataOutputAssociations).to.include(dataOutputAssociation.businessObject);\n\n    }));\n  });\n\n\n  describe('reconnect DataInputAssociations', function() {\n\n    beforeEach(function() {\n      newWaypoints = [ dataInputAssociation.waypoints[0], { x: task1Shape.x, y: task1Shape.y - 30 } ];\n    });\n\n    it('should execute', inject(function(modeling) {\n\n      // when\n      modeling.reconnectEnd(dataInputAssociation, task1Shape, newWaypoints);\n\n      // then\n      expect(task1Shape.businessObject.dataInputAssociations).to.include(dataInputAssociation.businessObject);\n      expect(task2Shape.businessObject.dataInputAssociations).to.be.empty;\n    }));\n\n\n    it('should undo', inject(function(modeling, commandStack) {\n\n      // when\n      modeling.reconnectEnd(dataInputAssociation, task1Shape, newWaypoints);\n      commandStack.undo();\n\n      // then\n      expect(task1Shape.businessObject.dataInputAssociations).to.be.empty;\n      expect(task2Shape.businessObject.dataInputAssociations).to.include(dataInputAssociation.businessObject);\n    }));\n\n\n    it('should redo', inject(function(modeling, commandStack) {\n\n      // when\n      modeling.reconnectEnd(dataInputAssociation, task1Shape, newWaypoints);\n      commandStack.undo();\n      commandStack.redo();\n\n      // then\n      expect(task1Shape.businessObject.dataInputAssociations).to.include(dataInputAssociation.businessObject);\n      expect(task2Shape.businessObject.dataInputAssociations).to.be.empty;\n    }));\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/RemoveElementBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"0.7.0-dev\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent1\">\n      <bpmn:outgoing>SequenceFlow1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Task1\">\n      <bpmn:incoming>SequenceFlow1</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow2</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow1\" sourceRef=\"StartEvent1\" targetRef=\"Task1\" />\n    <bpmn:endEvent id=\"EndEvent1\">\n      <bpmn:incoming>SequenceFlow2</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow2\" sourceRef=\"Task1\" targetRef=\"EndEvent1\" />\n    <bpmn:dataStoreReference id=\"DataStoreReference1\" />\n    <bpmn:task id=\"Task2\">\n      <bpmn:incoming>SequenceFlow3</bpmn:incoming>\n      <bpmn:dataOutputAssociation id=\"DataOutputAssociation1\">\n        <bpmn:targetRef>DataStoreReference1</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n    </bpmn:task>\n    <bpmn:intermediateThrowEvent id=\"IntermediateThrowEvent1\">\n      <bpmn:outgoing>SequenceFlow3</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow4</bpmn:outgoing>\n    </bpmn:intermediateThrowEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow3\" sourceRef=\"IntermediateThrowEvent1\" targetRef=\"Task2\" />\n    <bpmn:task id=\"Task3\">\n      <bpmn:incoming>SequenceFlow4</bpmn:incoming>\n      <bpmn:incoming>SequenceFlow6</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow5</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow4\" sourceRef=\"IntermediateThrowEvent1\" targetRef=\"Task3\" />\n    <bpmn:startEvent id=\"StartEvent2\">\n      <bpmn:outgoing>SequenceFlow6</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow6\" sourceRef=\"StartEvent2\" targetRef=\"Task3\" />\n    <bpmn:intermediateThrowEvent id=\"IntermediateThrowEvent2\">\n      <bpmn:incoming>SequenceFlow5</bpmn:incoming>\n    </bpmn:intermediateThrowEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow5\" sourceRef=\"Task3\" targetRef=\"IntermediateThrowEvent2\" />\n    <bpmn:startEvent id=\"StartEvent3\">\n      <bpmn:outgoing>SequenceFlow7</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Task4\">\n      <bpmn:incoming>SequenceFlow7</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow8</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow7\" sourceRef=\"StartEvent3\" targetRef=\"Task4\" />\n    <bpmn:endEvent id=\"EndEvent2\">\n      <bpmn:incoming>SequenceFlow8</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow8\" sourceRef=\"Task4\" targetRef=\"EndEvent2\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"StartEvent1_di\" bpmnElement=\"StartEvent1\">\n        <dc:Bounds x=\"204\" y=\"36\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"177\" y=\"72\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task1_di\" bpmnElement=\"Task1\">\n        <dc:Bounds x=\"407\" y=\"14\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow1_di\" bpmnElement=\"SequenceFlow1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"240\" y=\"54\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"407\" y=\"54\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"278.5\" y=\"44\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EndEvent1_di\" bpmnElement=\"EndEvent1\">\n        <dc:Bounds x=\"649\" y=\"36\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"622\" y=\"72\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow2_di\" bpmnElement=\"SequenceFlow2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"507\" y=\"54\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"649\" y=\"54\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"533\" y=\"44\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"DataStoreReference1_di\" bpmnElement=\"DataStoreReference1\">\n        <dc:Bounds x=\"642\" y=\"173\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"622\" y=\"223\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task2_di\" bpmnElement=\"Task2\">\n        <dc:Bounds x=\"407\" y=\"158\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent1_di\" bpmnElement=\"IntermediateThrowEvent1\">\n        <dc:Bounds x=\"204\" y=\"180\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"177\" y=\"216\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow3_di\" bpmnElement=\"SequenceFlow3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"240\" y=\"198\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"407\" y=\"198\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"279\" y=\"188\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task3_di\" bpmnElement=\"Task3\">\n        <dc:Bounds x=\"407\" y=\"313\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow4_di\" bpmnElement=\"SequenceFlow4\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"240\" y=\"198\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"324\" y=\"198\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"324\" y=\"353\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"407\" y=\"353\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"279\" y=\"266\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"StartEvent2_di\" bpmnElement=\"StartEvent2\">\n        <dc:Bounds x=\"439\" y=\"501\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"412\" y=\"537\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow6_di\" bpmnElement=\"SequenceFlow6\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"457\" y=\"501\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"457\" y=\"393\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"412\" y=\"437\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent2_di\" bpmnElement=\"IntermediateThrowEvent2\">\n        <dc:Bounds x=\"649\" y=\"335\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"622\" y=\"371\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow5_di\" bpmnElement=\"SequenceFlow5\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"507\" y=\"353\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"649\" y=\"353\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"533\" y=\"343\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation1_di\" bpmnElement=\"DataOutputAssociation1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"507\" y=\"198\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"642\" y=\"198\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"StartEvent3_di\" bpmnElement=\"StartEvent3\">\n        <dc:Bounds x=\"813\" y=\"11\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"786\" y=\"47\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task4_di\" bpmnElement=\"Task4\">\n        <dc:Bounds x=\"781\" y=\"169\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow7_di\" bpmnElement=\"SequenceFlow7\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"831\" y=\"47\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"831\" y=\"169\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"801\" y=\"98\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EndEvent2_di\" bpmnElement=\"EndEvent2\">\n        <dc:Bounds x=\"813\" y=\"370\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"786\" y=\"406\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow8_di\" bpmnElement=\"SequenceFlow8\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"831\" y=\"249\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"831\" y=\"370\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"801\" y=\"299.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/RemoveElementBehavior.diagonal.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.0.1\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent1\">\n      <bpmn:outgoing>SequenceFlow1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Task1\">\n      <bpmn:incoming>SequenceFlow1</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow2</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow1\" sourceRef=\"StartEvent1\" targetRef=\"Task1\" />\n    <bpmn:endEvent id=\"EndEvent1\">\n      <bpmn:incoming>SequenceFlow2</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow2\" sourceRef=\"Task1\" targetRef=\"EndEvent1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"StartEvent1_di\" bpmnElement=\"StartEvent1\">\n        <dc:Bounds x=\"204\" y=\"36\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"177\" y=\"72\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task1_di\" bpmnElement=\"Task1\">\n        <dc:Bounds x=\"407\" y=\"73\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow1_di\" bpmnElement=\"SequenceFlow1\">\n        <di:waypoint x=\"240\" y=\"54\" />\n        <di:waypoint x=\"324\" y=\"54\" />\n        <di:waypoint x=\"324\" y=\"113\" />\n        <di:waypoint x=\"407\" y=\"113\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"278.5\" y=\"44\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EndEvent1_di\" bpmnElement=\"EndEvent1\">\n        <dc:Bounds x=\"650\" y=\"199\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"622\" y=\"72\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow2_di\" bpmnElement=\"SequenceFlow2\">\n        <di:waypoint x=\"507\" y=\"113\" />\n        <di:waypoint x=\"579\" y=\"113\" />\n        <di:waypoint x=\"579\" y=\"217\" />\n        <di:waypoint x=\"650\" y=\"217\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"533\" y=\"44\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/RemoveElementBehavior.perpendicular.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"0.7.0-dev\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_1\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"Task_1\" targetRef=\"Task_2\" />\n    <bpmn:task id=\"Task_2\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"Task_10\">\n      <bpmn:outgoing>SequenceFlow_7</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"Task_11\">\n      <bpmn:incoming>SequenceFlow_7</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_8</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"Task_12\">\n      <bpmn:incoming>SequenceFlow_8</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_8\" sourceRef=\"Task_11\" targetRef=\"Task_12\" />\n    <bpmn:task id=\"Task_4\">\n      <bpmn:incoming>SequenceFlow_Diagonal</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_3</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"Task_5\">\n      <bpmn:incoming>SequenceFlow_3</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_4</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_3\" sourceRef=\"Task_4\" targetRef=\"Task_5\" />\n    <bpmn:task id=\"Task_6\">\n      <bpmn:incoming>SequenceFlow_4</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_4\" sourceRef=\"Task_5\" targetRef=\"Task_6\" />\n    <bpmn:task id=\"Task_7\">\n      <bpmn:outgoing>SequenceFlow_5</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"Task_8\">\n      <bpmn:incoming>SequenceFlow_5</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_6</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_5\" sourceRef=\"Task_7\" targetRef=\"Task_8\" />\n    <bpmn:task id=\"Task_3\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_Diagonal</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"Task_2\" targetRef=\"Task_3\" />\n    <bpmn:task id=\"Task_9\">\n      <bpmn:incoming>SequenceFlow_6</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_6\" sourceRef=\"Task_8\" targetRef=\"Task_9\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_7\" sourceRef=\"Task_10\" targetRef=\"Task_11\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_Diagonal\" sourceRef=\"Task_3\" targetRef=\"Task_4\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_0z8xi1c_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"29.704295704295674\" y=\"43.7112887112887\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1u9fztm_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"130\" y=\"84\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"185\" y=\"84\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"112.5\" y=\"59\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_0hnbe82_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"184.70429570429565\" y=\"44\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_099efka_di\" bpmnElement=\"Task_10\">\n        <dc:Bounds x=\"442\" y=\"290\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_002sy2a_di\" bpmnElement=\"Task_11\">\n        <dc:Bounds x=\"589\" y=\"290\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_01u3tfu_di\" bpmnElement=\"Task_12\">\n        <dc:Bounds x=\"589\" y=\"167\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0t8ndvz_di\" bpmnElement=\"SequenceFlow_8\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"639\" y=\"290\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"639\" y=\"247\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"609\" y=\"259\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_0vbnxvm_di\" bpmnElement=\"Task_4\">\n        <dc:Bounds x=\"31\" y=\"180.5840707964602\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1fuoxk1_di\" bpmnElement=\"Task_5\">\n        <dc:Bounds x=\"31\" y=\"297.5840707964602\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1vwmwqi_di\" bpmnElement=\"SequenceFlow_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"81\" y=\"261\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"81\" y=\"298\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"51\" y=\"269.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_09cntqi_di\" bpmnElement=\"Task_6\">\n        <dc:Bounds x=\"170.0480404551201\" y=\"298\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1tyq2xs_di\" bpmnElement=\"SequenceFlow_4\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"131\" y=\"338\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"170\" y=\"338\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"105.5\" y=\"313\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_1jxiw7a_di\" bpmnElement=\"Task_7\">\n        <dc:Bounds x=\"449\" y=\"165\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0pr4fwc_di\" bpmnElement=\"Task_8\">\n        <dc:Bounds x=\"449\" y=\"47\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_13zcj99_di\" bpmnElement=\"SequenceFlow_5\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"499\" y=\"165\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"499\" y=\"127\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"469\" y=\"136\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_0lhi5mw_di\" bpmnElement=\"Task_3\">\n        <dc:Bounds x=\"185\" y=\"162.44707740916272\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1y03bir_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"235\" y=\"124\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"235\" y=\"162\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"205\" y=\"133\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_0bq0d9m_di\" bpmnElement=\"Task_9\">\n        <dc:Bounds x=\"588.8672985781991\" y=\"47\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0k5d9gz_di\" bpmnElement=\"SequenceFlow_6\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"549\" y=\"87\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"589\" y=\"87\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"524\" y=\"62\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1473jag_di\" bpmnElement=\"SequenceFlow_7\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"542\" y=\"330\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"589\" y=\"330\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"520.5\" y=\"305\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_Diagonal_di\" bpmnElement=\"SequenceFlow_Diagonal\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"185\" y=\"184\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"131\" y=\"198\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"113\" y=\"166\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/RemoveElementBehavior.vertical.diagonal.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.20.0\">\n  <bpmn:collaboration id=\"Collaboration_18lcs93\">\n    <bpmn:participant id=\"Participant_0vm2g58\" name=\"Vertical Container\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent1\">\n      <bpmn:outgoing>SequenceFlow1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Task1\">\n      <bpmn:incoming>SequenceFlow1</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow2</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:endEvent id=\"EndEvent1\">\n      <bpmn:incoming>SequenceFlow2</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow1\" sourceRef=\"StartEvent1\" targetRef=\"Task1\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow2\" sourceRef=\"Task1\" targetRef=\"EndEvent1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_18lcs93\">\n      <bpmndi:BPMNShape id=\"Participant_0vm2g58_di\" bpmnElement=\"Participant_0vm2g58\" isHorizontal=\"false\">\n        <dc:Bounds x=\"80\" y=\"130\" width=\"250\" height=\"600\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent1_di\" bpmnElement=\"StartEvent1\">\n        <dc:Bounds x=\"106\" y=\"204\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"72\" y=\"177\" width=\"20\" height=\"90\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task1_di\" bpmnElement=\"Task1\">\n        <dc:Bounds x=\"143\" y=\"407\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent1_di\" bpmnElement=\"EndEvent1\">\n        <dc:Bounds x=\"269\" y=\"650\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"72\" y=\"622\" width=\"20\" height=\"90\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow1_di\" bpmnElement=\"SequenceFlow1\">\n        <di:waypoint x=\"124\" y=\"240\" />\n        <di:waypoint x=\"124\" y=\"324\" />\n        <di:waypoint x=\"183\" y=\"324\" />\n        <di:waypoint x=\"183\" y=\"407\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"44\" y=\"278.5\" width=\"20\" height=\"90\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow2_di\" bpmnElement=\"SequenceFlow2\">\n        <di:waypoint x=\"183\" y=\"487\" />\n        <di:waypoint x=\"183\" y=\"579\" />\n        <di:waypoint x=\"287\" y=\"579\" />\n        <di:waypoint x=\"287\" y=\"650\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"44\" y=\"533\" width=\"20\" height=\"90\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/RemoveElementBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - remove element behavior', function() {\n\n  var testModules = [ coreModule, modelingModule ];\n\n\n  describe('combine sequence flow when deleting element', function() {\n\n\n    describe('parallel connections', function() {\n\n      var processDiagramXML = require('./RemoveElementBehavior.bpmn');\n\n      beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n\n      it('horizontal', inject(function(modeling, elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task1');\n\n        // when\n        modeling.removeShape(task);\n\n        // then\n        var sequenceFlow1 = elementRegistry.get('SequenceFlow1');\n        var waypoints = sequenceFlow1.waypoints;\n\n        // SequenceFlow2 should be deleted\n        expect(elementRegistry.get(task.id)).to.be.undefined;\n        expect(sequenceFlow1).not.to.be.undefined;\n        expect(elementRegistry.get('SequenceFlow2')).to.be.undefined;\n\n        // source and target have one connection each\n        expect(elementRegistry.get('StartEvent1').outgoing.length).to.be.equal(1);\n        expect(elementRegistry.get('EndEvent1').incoming.length).to.be.equal(1);\n\n        // connection has two horizontally equal waypoints\n        expect(waypoints).to.have.length(2);\n        expect(waypoints[0].y).to.eql(waypoints[1].y);\n\n      }));\n\n\n      it('vertical', inject(function(modeling, elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task4');\n\n        // when\n        modeling.removeShape(task);\n\n        // then\n        var waypoints = elementRegistry.get('SequenceFlow7').waypoints;\n\n        // connection has two vertically equal waypoints\n        expect(waypoints).to.have.length(2);\n        expect(waypoints[0].x).to.eql(waypoints[1].x);\n\n      }));\n\n    });\n\n\n    describe('perpendicular connections', function() {\n\n      var gatewayDiagramXML = require('./RemoveElementBehavior.perpendicular.bpmn');\n\n      beforeEach(bootstrapModeler(gatewayDiagramXML, { modules: testModules }));\n\n\n      it('right-down', inject(function(modeling, elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task_2');\n        var mid = {\n          x : task.x + task.width / 2,\n          y : task.y + task.height / 2\n        };\n\n        // when\n        modeling.removeShape(task);\n\n        // then\n        var waypoints = elementRegistry.get('SequenceFlow_1').waypoints;\n        expect(waypoints).to.have.length(3);\n\n        var intersec = waypoints[1];\n        expect(intersec).to.eql(point(mid));\n\n      }));\n\n\n      it('right-up', inject(function(modeling, elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task_11');\n        var mid = {\n          x : task.x + task.width / 2,\n          y : task.y + task.height / 2\n        };\n\n        // when\n        modeling.removeShape(task);\n\n        // then\n        var waypoints = elementRegistry.get('SequenceFlow_7').waypoints;\n        expect(waypoints).to.have.length(3);\n\n        var intersec = waypoints[1];\n        expect(intersec).to.eql(point(mid));\n\n      }));\n\n\n      it('down-right', inject(function(modeling, elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task_5');\n        var mid = {\n          x : task.x + task.width / 2,\n          y : task.y + task.height / 2\n        };\n\n        // when\n        modeling.removeShape(task);\n\n        // then\n        var waypoints = elementRegistry.get('SequenceFlow_3').waypoints;\n        expect(waypoints).to.have.length(3);\n\n        var intersec = waypoints[1];\n        expect(intersec).to.eql(point(mid));\n\n      }));\n\n\n      it('up-right', inject(function(modeling, elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task_8');\n        var mid = {\n          x : task.x + task.width / 2,\n          y : task.y + task.height / 2\n        };\n\n        // when\n        modeling.removeShape(task);\n\n        // then\n        var waypoints = elementRegistry.get('SequenceFlow_5').waypoints;\n        expect(waypoints).to.have.length(3);\n\n        var intersec = waypoints[1];\n        expect(intersec).to.eql(point(mid));\n\n      }));\n\n\n      it('diagonal', inject(function(modeling, elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task_4');\n        var mid = {\n          x: task.x + task.width / 2,\n          y: 211\n        };\n\n        // when\n        modeling.removeShape(task);\n\n        // then\n        var waypoints = elementRegistry.get('SequenceFlow_Diagonal').waypoints;\n        expect(waypoints).to.have.length(3);\n\n        var intersec = waypoints[1];\n        expect(intersec).to.eql(point(mid));\n\n      }));\n\n    });\n\n\n    describe('connection layouting', function() {\n\n      var processDiagramXML = require('./RemoveElementBehavior.diagonal.bpmn');\n\n      beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n\n      it('should execute', inject(function(modeling, elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task1');\n        var sequenceFlow1 = elementRegistry.get('SequenceFlow1');\n\n        // when\n        modeling.removeShape(task);\n\n        // then\n        var waypoints = sequenceFlow1.waypoints;\n\n        // SequenceFlow2 should be deleted\n        expect(elementRegistry.get('SequenceFlow2')).to.be.undefined;\n        expect(elementRegistry.get(task.id)).to.be.undefined;\n\n        // source and target have one connection each\n        expect(elementRegistry.get('StartEvent1').outgoing.length).to.be.equal(1);\n        expect(elementRegistry.get('EndEvent1').incoming.length).to.be.equal(1);\n\n        // connection has Manhattan layout\n        expect(waypoints).to.have.length(4);\n        expect(waypoints[0].y).to.eql(waypoints[1].y);\n        expect(waypoints[1].x).to.eql(waypoints[2].x);\n        expect(waypoints[2].y).to.eql(waypoints[3].y);\n\n      }));\n\n\n      it('should redo', inject(function(commandStack, modeling, elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task1'),\n            connection = elementRegistry.get('SequenceFlow1'),\n            newWaypoints;\n\n        // when\n        modeling.removeShape(task);\n\n        newWaypoints = connection.waypoints.slice();\n\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expect(connection).to.have.waypoints(newWaypoints);\n      }));\n\n    });\n\n\n    describe('vertical connection layouting', function() {\n\n      var processDiagramXML = require('./RemoveElementBehavior.vertical.diagonal.bpmn');\n\n      beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n\n      it('should execute', inject(function(modeling, elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task1');\n        var sequenceFlow1 = elementRegistry.get('SequenceFlow1');\n\n        // when\n        modeling.removeShape(task);\n\n        // then\n        var waypoints = sequenceFlow1.waypoints;\n\n        // SequenceFlow2 should be deleted\n        expect(elementRegistry.get('SequenceFlow2')).to.be.undefined;\n        expect(elementRegistry.get(task.id)).to.be.undefined;\n\n        // source and target have one connection each\n        expect(elementRegistry.get('StartEvent1').outgoing.length).to.be.equal(1);\n        expect(elementRegistry.get('EndEvent1').incoming.length).to.be.equal(1);\n\n        // connection has Manhattan layout\n        expect(waypoints).to.have.length(4);\n        expect(waypoints[0].x).to.eql(waypoints[1].x);\n        expect(waypoints[1].y).to.eql(waypoints[2].y);\n        expect(waypoints[2].x).to.eql(waypoints[3].x);\n\n      }));\n\n    });\n\n  });\n\n\n  describe('do not combine sequence flows ', function() {\n\n    var processDiagramXML = require('./RemoveElementBehavior.bpmn');\n\n    beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n\n    it('remove all if there are more than one incoming or outgoing', inject(function(modeling, elementRegistry) {\n\n      // given\n      var task = elementRegistry.get('Task3');\n\n      // when\n      modeling.removeShape(task);\n\n      // then\n      expect(elementRegistry.get(task.id)).to.be.undefined;\n      expect(elementRegistry.get('SequenceFlow4')).to.be.undefined;\n      expect(elementRegistry.get('SequenceFlow5')).to.be.undefined;\n      expect(elementRegistry.get('SequenceFlow6')).to.be.undefined;\n\n      expect(elementRegistry.get('StartEvent2').outgoing).to.be.empty;\n      expect(elementRegistry.get('StartEvent2').incoming).to.be.empty;\n\n    }));\n\n\n    it('when connection is not allowed', inject(function(modeling, elementRegistry) {\n\n      // given\n      var task = elementRegistry.get('Task2');\n\n      // when\n      modeling.removeShape(task);\n\n      // then\n      expect(elementRegistry.get(task.id)).to.be.undefined;\n      expect(elementRegistry.get('SequenceFlow3')).to.be.undefined;\n      expect(elementRegistry.get('DataOutputAssociation1')).to.be.undefined;\n\n      expect(elementRegistry.get('DataStoreReference1').incoming).to.be.empty;\n      expect(elementRegistry.get('IntermediateThrowEvent1').outgoing.length).to.be.eql(1);\n\n    }));\n\n  });\n\n});\n\n\n\n\n// helper //////////////////////\n\nfunction point(p) {\n  return {\n    x: p.x,\n    y: p.y\n  };\n}\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/RemoveEmbeddedLabelBoundsBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:color=\"http://www.omg.org/spec/BPMN/non-normative/color/1.0\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_1784xmh\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.7.0\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.16.0\">\n  <bpmn:process id=\"Process_0\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"Activity_1\" name=\"SUBPROCESS EXAMPLE\"/>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_0\">\n      <bpmndi:BPMNShape id=\"Activity_1_di\" bpmnElement=\"Activity_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"0\" y=\"50\" width=\"400\" height=\"200\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"10\" y=\"60\" width=\"380\" height=\"180\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/RemoveEmbeddedLabelBoundsBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\n\nimport { getDi } from 'lib/util/ModelUtil';\n\n\ndescribe('features/modeling - RemoveEmbeddedLabelBoundsBehavior', function() {\n\n  var processDiagramXML = require('./RemoveEmbeddedLabelBoundsBehavior.bpmn');\n\n  beforeEach(bootstrapModeler(processDiagramXML, {\n    modules: [\n      coreModule,\n      modelingModule\n    ]\n  }));\n\n  var bounds,\n      di;\n\n  beforeEach(inject(function(elementRegistry, modeling) {\n\n    // given\n    var subProcess = elementRegistry.get('Activity_1');\n\n    di = getDi(subProcess);\n\n    bounds = di.get('label').get('bounds');\n\n    // when\n    modeling.resizeShape(subProcess, {\n      x: 0,\n      y: 0,\n      width: 100,\n      height: 100\n    });\n  }));\n\n\n  it('<do>', function() {\n\n    // then\n    expect(di.get('label').get('bounds')).not.to.exist;\n  });\n\n\n  it('<undo>', inject(function(commandStack) {\n\n    // when\n    commandStack.undo();\n\n    // then\n    expect(di.get('label').get('bounds')).to.equal(bounds);\n  }));\n\n\n  it('<redo>', inject(function(commandStack) {\n\n    // when\n    commandStack.undo();\n    commandStack.redo();\n\n    // then\n    expect(di.get('label').get('bounds')).not.to.exist;\n  }));\n\n});"
  },
  {
    "path": "test/spec/features/modeling/behavior/RemoveParticipantBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  getDi,\n  is\n} from 'lib/util/ModelUtil';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - remove participant behavior', function() {\n\n  var testModules = [ coreModule, modelingModule ];\n\n\n  describe('when removing participant in collaboration', function() {\n\n    var processDiagramXML = require('../../../../fixtures/bpmn/collaboration/collaboration-message-flows.bpmn');\n\n    beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n\n    describe('retain collaboration', function() {\n\n      it('execute', inject(function(modeling, elementRegistry, canvas) {\n\n        // given\n        var participantShape = elementRegistry.get('Participant_2');\n\n        // when\n        modeling.removeShape(participantShape);\n\n        // then\n        var rootElement = canvas.getRootElement();\n\n        expect(is(rootElement, 'bpmn:Collaboration')).to.be.ok;\n      }));\n\n    });\n\n  });\n\n\n  describe('when removing last remaining participant', function() {\n\n    var processDiagramXML = require('../../../../fixtures/bpmn/collaboration/collaboration-data-store.bpmn');\n\n    beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n\n    describe('should transform diagram into process diagram', function() {\n\n      it('execute', inject(function(modeling, elementRegistry, canvas) {\n\n        // given\n        var participantShape = elementRegistry.get('_Participant_2'),\n            participant = participantShape.businessObject,\n            participantDi = getDi(participantShape),\n            process = participant.processRef,\n            collaborationElement = participantShape.parent,\n            collaboration = collaborationElement.businessObject,\n            diPlane = getDi(collaborationElement),\n            bpmnDefinitions = collaboration.$parent;\n\n        // when\n        modeling.removeShape(participantShape);\n\n        // then\n        expect(participant.$parent).not.to.be.ok;\n\n        var newRootShape = canvas.getRootElement(),\n            newRootBusinessObject = newRootShape.businessObject;\n\n        expect(newRootBusinessObject.$instanceOf('bpmn:Process')).to.be.true;\n\n        // collaboration DI is unwired\n        expect(participantDi.$parent).not.to.be.ok;\n        expect(getDi(collaborationElement)).not.to.be.ok;\n\n        expect(bpmnDefinitions.rootElements).not.to.include(process);\n        expect(bpmnDefinitions.rootElements).not.to.include(collaboration);\n\n        // process DI is wired\n        expect(diPlane.bpmnElement).to.eql(newRootBusinessObject);\n        expect(getDi(newRootShape)).to.eql(diPlane);\n\n        expect(bpmnDefinitions.rootElements).to.include(newRootBusinessObject);\n\n        // data store is preserved\n        expect(newRootShape.children).to.have.length(1);\n      }));\n\n\n      it('undo', inject(function(modeling, elementRegistry, canvas, commandStack) {\n\n        // given\n        var participantShape = elementRegistry.get('_Participant_2'),\n            participant = participantShape.businessObject,\n            originalRootElement = participantShape.parent,\n            originalRootElementBo = originalRootElement.businessObject,\n            originalRootElementDi = getDi(originalRootElement),\n            bpmnDefinitions = originalRootElementBo.$parent,\n            participantDi = getDi(participantShape),\n            diPlane = participantDi.$parent;\n\n        modeling.removeShape(participantShape);\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(participant.$parent).to.eql(originalRootElementBo);\n        expect(originalRootElementBo.$parent).to.eql(bpmnDefinitions);\n\n        expect(canvas.getRootElement()).to.eql(originalRootElement);\n\n        // di is unwired\n        expect(participantDi.$parent).to.eql(originalRootElementDi);\n\n        // new di is wired\n        expect(diPlane.bpmnElement).to.eql(originalRootElementBo);\n      }));\n\n    });\n\n  });\n\n\n  describe('when removing all diagram content', function() {\n\n    var processDiagramXML = require('../../../../fixtures/bpmn/collaboration/collaboration-data-store.bpmn');\n\n    beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n    describe('should transform diagram into process diagram', function() {\n\n      it('execute', inject(function(modeling, elementRegistry, canvas) {\n\n        // given\n        var participantShape = elementRegistry.get('_Participant_2'),\n            participant = participantShape.businessObject,\n            participantDi = getDi(participantShape),\n            process = participant.processRef,\n            collaborationElement = participantShape.parent,\n            collaboration = collaborationElement.businessObject,\n            diPlane = getDi(collaborationElement),\n            bpmnDefinitions = collaboration.$parent;\n\n        // when\n        var rootElement = canvas.getRootElement();\n\n        var elements = elementRegistry.filter(function(element) {\n          return element !== rootElement;\n        });\n\n        modeling.removeElements(elements);\n\n        // then\n        expect(participant.$parent).not.to.be.ok;\n\n        var newRootShape = canvas.getRootElement(),\n            newRootBusinessObject = newRootShape.businessObject;\n\n        expect(newRootBusinessObject.$instanceOf('bpmn:Process')).to.be.true;\n\n        // collaboration DI is unwired\n        expect(participantDi.$parent).not.to.be.ok;\n        expect(getDi(collaborationElement)).not.to.be.ok;\n\n        expect(bpmnDefinitions.rootElements).not.to.include(process);\n        expect(bpmnDefinitions.rootElements).not.to.include(collaboration);\n\n        // process DI is wired\n        expect(diPlane.bpmnElement).to.eql(newRootBusinessObject);\n        expect(getDi(newRootShape)).to.eql(diPlane);\n\n        expect(bpmnDefinitions.rootElements).to.include(newRootBusinessObject);\n      }));\n\n\n      it('undo', inject(function(modeling, elementRegistry, canvas, commandStack) {\n\n        // given\n        var participantShape = elementRegistry.get('_Participant_2'),\n            participant = participantShape.businessObject,\n            originalRootElement = participantShape.parent,\n            originalRootElementBo = originalRootElement.businessObject,\n            originalRootElementDi = getDi(originalRootElement),\n            bpmnDefinitions = originalRootElementBo.$parent,\n            participantDi = getDi(participantShape),\n            diPlane = participantDi.$parent;\n\n        var rootElement = canvas.getRootElement();\n\n        var elements = elementRegistry.filter(function(element) {\n          return element !== rootElement;\n        });\n\n        modeling.removeElements(elements);\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(participant.$parent).to.eql(originalRootElementBo);\n        expect(originalRootElementBo.$parent).to.eql(bpmnDefinitions);\n\n        expect(canvas.getRootElement()).to.eql(originalRootElement);\n\n        // di is unwired\n        expect(participantDi.$parent).to.eql(originalRootElementDi);\n\n        // new di is wired\n        expect(diPlane.bpmnElement).to.eql(originalRootElementBo);\n      }));\n\n    });\n\n  });\n\n});"
  },
  {
    "path": "test/spec/features/modeling/behavior/ReplaceConnectionBehavior.association.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_biH3sOTeEeS2YerRfpjPrw\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_3\">\n    <bpmn2:participant id=\"Participant_1\" name=\"Pool\" processRef=\"Process_1\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:task id=\"Task\">\n      <bpmn2:dataOutputAssociation id=\"DataOutputAssociation\">\n        <bpmn2:targetRef>DataObjectReference</bpmn2:targetRef>\n      </bpmn2:dataOutputAssociation>\n    </bpmn2:task>\n    <bpmn2:dataObjectReference id=\"DataObjectReference\" dataObjectRef=\"DataObject_12volar\" />\n    <bpmn2:dataObject id=\"DataObject_12volar\" />\n    <bpmn2:textAnnotation id=\"TextAnnotation_1\" />\n    <bpmn2:association id=\"Association_1\" sourceRef=\"TextAnnotation_1\" targetRef=\"Participant_1\" />\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_3\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_3\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds height=\"241.0\" width=\"445.0\" x=\"168.0\" y=\"72.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_TextAnnotation_2\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds height=\"105.0\" width=\"133.0\" x=\"708.0\" y=\"72.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_Association_1\" bpmnElement=\"Association_1\" sourceElement=\"_BPMNShape_TextAnnotation_2\" targetElement=\"_BPMNShape_Participant_3\">\n        <di:waypoint x=\"708\" y=\"136\" />\n        <di:waypoint x=\"612\" y=\"153\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_di\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"302\" y=\"162\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_di\" bpmnElement=\"DataObjectReference\">\n        <dc:Bounds x=\"449\" y=\"177\" width=\"36\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_di\" bpmnElement=\"DataOutputAssociation\">\n        <di:waypoint x=\"402\" y=\"202\" />\n        <di:waypoint x=\"449\" y=\"202\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_2\" name=\"Unnamed Process\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_2\" bpmnElement=\"Process_1\"/>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/spec/features/modeling/behavior/ReplaceConnectionBehavior.boundary-events.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_1\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_1\" attachedToRef=\"Task_1\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:boundaryEvent>\n    <bpmn:subProcess id=\"SubProcess_1\" />\n    <bpmn:task id=\"Task_2\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"BoundaryEvent_1\" targetRef=\"Task_2\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"161\" y=\"83\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1_di\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds x=\"243\" y=\"105\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"653\" y=\"205\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"158\" y=\"211\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"403\" y=\"83\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"279\" y=\"123\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"403\" y=\"123\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"459\" y=\"149\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/ReplaceConnectionBehavior.message-sequence-flow.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"_biH3sOTeEeS2YerRfpjPrw\" targetNamespace=\"http://activiti.org/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.1.1\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"_Collaboration_3\">\n    <bpmn2:participant id=\"Participant_1\" name=\"Pool\" processRef=\"Process_1\" />\n    <bpmn2:participant id=\"Participant_2\" name=\"Pool\" processRef=\"Process_2\" />\n    <bpmn2:messageFlow id=\"MessageFlow_1\" name=\"\" sourceRef=\"Task_3\" targetRef=\"Participant_1\" />\n    <bpmn2:messageFlow id=\"MessageFlow_4\" name=\"\" sourceRef=\"Participant_2\" targetRef=\"StartEvent_1\" />\n    <bpmn2:messageFlow id=\"MessageFlow_5\" name=\"\" sourceRef=\"Task_2\" targetRef=\"Task_4\" />\n    <bpmn2:messageFlow id=\"MessageFlow_3\" name=\"\" sourceRef=\"Task_1\" targetRef=\"Participant_2\" />\n    <bpmn2:messageFlow id=\"MessageFlow_6\" sourceRef=\"Participant_1\" targetRef=\"Task_3\" />\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:subProcess id=\"SubProcess_1\">\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n      <bpmn2:task id=\"Task_1\">\n        <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n      </bpmn2:task>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_2\" name=\"\" sourceRef=\"Task_1\" targetRef=\"EndEvent_1\" />\n      <bpmn2:endEvent id=\"EndEvent_1\">\n        <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n      </bpmn2:endEvent>\n    </bpmn2:subProcess>\n    <bpmn2:task id=\"Task_2\">\n      <bpmn2:incoming>SequenceFlow_3</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:task>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"Task_2\" targetRef=\"SubProcess_1\" />\n    <bpmn2:startEvent id=\"StartEvent_1\">\n      <bpmn2:outgoing>SequenceFlow_3</bpmn2:outgoing>\n      <bpmn2:messageEventDefinition id=\"_MessageEventDefinition_2\" />\n    </bpmn2:startEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_3\" name=\"\" sourceRef=\"StartEvent_1\" targetRef=\"Task_2\" />\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn2:task id=\"Task_3\" />\n    <bpmn2:task id=\"Task_4\" />\n    <bpmn2:boundaryEvent id=\"BoundaryEvent\" attachedToRef=\"Task_4\">\n      <bpmn2:outgoing>Flow_0ypde12</bpmn2:outgoing>\n    </bpmn2:boundaryEvent>\n    <bpmn2:task id=\"Task_5\">\n      <bpmn2:incoming>Flow_0ypde12</bpmn2:incoming>\n    </bpmn2:task>\n    <bpmn2:sequenceFlow id=\"Flow_0ypde12\" sourceRef=\"BoundaryEvent\" targetRef=\"Task_5\" />\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_3\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_3\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"168\" y=\"72\" width=\"697\" height=\"265\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_3\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"576\" y=\"96\" width=\"248\" height=\"205\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"601\" y=\"119\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_3\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"768\" y=\"141\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"786\" y=\"182\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"_BPMNShape_Task_3\" targetElement=\"_BPMNShape_EndEvent_3\">\n        <di:waypoint x=\"701\" y=\"159\" />\n        <di:waypoint x=\"768\" y=\"159\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"723\" y=\"159\" width=\"6\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_4\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"360\" y=\"159\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_3\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"240\" y=\"181\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"258\" y=\"222\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_Task_4\" targetElement=\"_BPMNShape_SubProcess_3\">\n        <di:waypoint x=\"460\" y=\"198\" />\n        <di:waypoint x=\"576\" y=\"198\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"534\" y=\"198\" width=\"6\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_3\" bpmnElement=\"SequenceFlow_3\" sourceElement=\"_BPMNShape_StartEvent_3\" targetElement=\"_BPMNShape_Task_4\">\n        <di:waypoint x=\"276\" y=\"199\" />\n        <di:waypoint x=\"360\" y=\"199\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"318\" y=\"199\" width=\"6\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_4\" bpmnElement=\"Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"168\" y=\"456\" width=\"697\" height=\"345\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_5\" bpmnElement=\"Task_3\">\n        <dc:Bounds x=\"708\" y=\"489\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_7\" bpmnElement=\"Task_4\">\n        <dc:Bounds x=\"504\" y=\"489\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1syxytx_di\" bpmnElement=\"Task_5\">\n        <dc:Bounds x=\"600\" y=\"610\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0fn6bvp_di\" bpmnElement=\"BoundaryEvent\">\n        <dc:Bounds x=\"512\" y=\"551\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_0ypde12_di\" bpmnElement=\"Flow_0ypde12\">\n        <di:waypoint x=\"530\" y=\"587\" />\n        <di:waypoint x=\"530\" y=\"650\" />\n        <di:waypoint x=\"600\" y=\"650\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_1\" bpmnElement=\"MessageFlow_1\" sourceElement=\"_BPMNShape_Task_5\" targetElement=\"_BPMNShape_Participant_3\">\n        <di:waypoint x=\"758\" y=\"489\" />\n        <di:waypoint x=\"758\" y=\"413\" />\n        <di:waypoint x=\"758\" y=\"413\" />\n        <di:waypoint x=\"758\" y=\"336\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_4\" bpmnElement=\"MessageFlow_4\" sourceElement=\"_BPMNShape_Participant_4\" targetElement=\"_BPMNShape_StartEvent_3\">\n        <di:waypoint x=\"258\" y=\"456\" />\n        <di:waypoint x=\"258\" y=\"337\" />\n        <di:waypoint x=\"258\" y=\"337\" />\n        <di:waypoint x=\"258\" y=\"217\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_5\" bpmnElement=\"MessageFlow_5\" sourceElement=\"_BPMNShape_Task_4\" targetElement=\"_BPMNShape_Task_7\">\n        <di:waypoint x=\"410\" y=\"239\" />\n        <di:waypoint x=\"410\" y=\"390\" />\n        <di:waypoint x=\"554\" y=\"390\" />\n        <di:waypoint x=\"554\" y=\"489\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"407\" y=\"348\" width=\"6\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_3\" bpmnElement=\"MessageFlow_3\" sourceElement=\"_BPMNShape_Task_3\" targetElement=\"_BPMNShape_Participant_4\">\n        <di:waypoint x=\"651\" y=\"199\" />\n        <di:waypoint x=\"651\" y=\"327\" />\n        <di:waypoint x=\"651\" y=\"327\" />\n        <di:waypoint x=\"651\" y=\"456\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"MessageFlow_0xafli8_di\" bpmnElement=\"MessageFlow_6\">\n        <di:waypoint x=\"729\" y=\"337\" />\n        <di:waypoint x=\"729\" y=\"489\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/ReplaceConnectionBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  is\n} from 'lib/util/ModelUtil';\n\nimport {\n  find\n} from 'min-dash';\n\nimport {\n  getMid\n} from 'diagram-js/lib/layout/LayoutUtil';\n\nimport modelingModule from 'lib/features/modeling';\nimport moveModule from 'diagram-js/lib/features/move';\nimport coreModule from 'lib/core';\nimport bendpointsModule from 'diagram-js/lib/features/bendpoints';\n\nimport {\n  createCanvasEvent as canvasEvent\n} from '../../../../util/MockEvents';\n\n\nfunction getConnection(source, target, connectionOrType) {\n  return find(source.outgoing, function(c) {\n    return c.target === target &&\n      (typeof connectionOrType === 'string' ? is(c, connectionOrType) : c === connectionOrType);\n  });\n}\n\nfunction expectConnected(source, target, connectionOrType, attrs) {\n  var connection = getConnection(source, target, connectionOrType);\n  expect(connection).to.exist;\n\n  if (attrs) {\n    Object.keys(attrs).forEach(function(key) {\n      expect(connection.businessObject[key]).to.eql(attrs[key]);\n    });\n  }\n}\n\nfunction expectNotConnected(source, target, connectionOrType) {\n  expect(getConnection(source, target, connectionOrType)).not.to.exist;\n}\n\n\ndescribe('features/modeling - replace connection', function() {\n\n  var testModules = [\n    coreModule,\n    moveModule,\n    modelingModule\n  ];\n\n\n  describe('should replace SequenceFlow <> MessageFlow', function() {\n\n    var processDiagramXML = require('./ReplaceConnectionBehavior.message-sequence-flow.bpmn');\n\n    beforeEach(bootstrapModeler(processDiagramXML, {\n      modules: testModules\n    }));\n\n    var element;\n\n    beforeEach(inject(function(elementRegistry) {\n      element = function(id) {\n        return elementRegistry.get(id);\n      };\n    }));\n\n\n    describe('after reconnecting', function() {\n\n      it('sequence flow from a participant', inject(function(modeling) {\n\n        // given\n        var participant2 = element('Participant_2'),\n            subProcess1 = element('SubProcess_1'),\n            connection = element('SequenceFlow_1');\n\n        var newWaypoints = [\n          { x: participant2.x + 200, y: participant2.y },\n          { x: subProcess1.x, y: subProcess1.y + 50 }\n        ];\n\n        // when\n        modeling.reconnect(connection, participant2, connection.target, newWaypoints);\n\n        // then\n        expectConnected(participant2, subProcess1, 'bpmn:MessageFlow');\n      }));\n\n    });\n\n\n    describe('after reconnecting start', function() {\n\n      it('sequence flow from a participant', inject(function(modeling) {\n\n        // given\n        var participant2 = element('Participant_2'),\n            subProcess1 = element('SubProcess_1'),\n            connection = element('SequenceFlow_1');\n\n        var newWaypoints = [\n          { x: participant2.x + 200, y: participant2.y },\n          { x: subProcess1.x, y: subProcess1.y + 50 }\n        ];\n\n        // when\n        modeling.reconnectStart(connection, participant2, newWaypoints);\n\n        // then\n        expectConnected(participant2, subProcess1, 'bpmn:MessageFlow');\n      }));\n\n    });\n\n\n    describe('after reconnecting end', function() {\n\n      it('sequence flow to another task', inject(function(modeling) {\n\n        // given\n        var task4Shape = element('Task_4');\n        var connection = element('SequenceFlow_1');\n\n        var newWaypoints = [ connection.waypoints[0], { x: task4Shape.x + 30, y: task4Shape.y } ];\n\n        // when\n        modeling.reconnectEnd(connection, task4Shape, newWaypoints);\n\n        // then\n        expectConnected(element('Task_2'), task4Shape, 'bpmn:MessageFlow');\n      }));\n\n\n      it('message flow to another task', inject(function(elementRegistry, modeling) {\n\n        // given\n        var task4Shape = element('Task_4');\n        var connection = element('MessageFlow_1');\n\n        var newWaypoints = [ connection.waypoints[0], { x: task4Shape.x, y: task4Shape.y + 20 } ];\n\n        // when\n        modeling.reconnectEnd(connection, task4Shape, newWaypoints);\n\n        // then\n        expectConnected(element('Task_3'), task4Shape, 'bpmn:SequenceFlow');\n      }));\n\n\n      it('sequence flow to a participant', inject(function(elementRegistry, modeling) {\n\n        // given\n        var participant2 = element('Participant_2');\n        var connection = element('SequenceFlow_1');\n\n        var newWaypoints = [ connection.waypoints[0], { x: participant2.x, y: participant2.y } ];\n\n        // when\n        modeling.reconnectEnd(connection, participant2, newWaypoints);\n\n        // then\n        expectConnected(element('Task_2'), participant2, 'bpmn:MessageFlow');\n      }));\n\n    });\n\n\n    describe('moving single shape', function() {\n\n      it('execute', inject(function(modeling, elementRegistry) {\n\n        // given\n        var taskShape = element('Task_2'),\n            targetShape = element('Participant_2');\n\n        // when\n        modeling.moveElements([ taskShape ], { x: 0, y: 330 }, targetShape);\n\n        // then\n        expect(taskShape.parent).to.eql(targetShape);\n\n        expectNotConnected(element('StartEvent_1'), taskShape, 'bpmn:SequenceFlow');\n\n        expectConnected(taskShape, element('Task_4'), 'bpmn:SequenceFlow');\n        expectConnected(taskShape, element('SubProcess_1'), 'bpmn:MessageFlow');\n      }));\n\n\n      it('undo', inject(function(modeling, elementRegistry, commandStack) {\n\n        // given\n        var taskShape = element('Task_2'),\n            targetShape = element('Participant_2'),\n            oldParent = taskShape.parent;\n\n        modeling.moveElements([ taskShape ], { x: 0, y: 300 }, targetShape);\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(taskShape.parent).to.eql(oldParent);\n\n        expectConnected(element('StartEvent_1'), taskShape, element('SequenceFlow_3'));\n\n        expectConnected(taskShape, element('Task_4'), element('MessageFlow_5'));\n        expectConnected(taskShape, element('SubProcess_1'), element('SequenceFlow_1'));\n      }));\n\n    });\n\n\n    describe('moving multiple shapes', function() {\n\n      it('execute', inject(function(modeling, elementRegistry) {\n\n        // given\n        var startEventShape = element('StartEvent_1'),\n            taskShape = element('Task_2'),\n            targetShape = element('Participant_2');\n\n        // when\n        modeling.moveElements([ startEventShape, taskShape ], { x: 0, y: 330 }, targetShape);\n\n        // then\n        expect(taskShape.parent).to.eql(targetShape);\n        expect(startEventShape.parent).to.eql(targetShape);\n\n        expectConnected(startEventShape, taskShape, element('SequenceFlow_3'));\n\n        expectNotConnected(element('Participant_2'), startEventShape, 'bpmn:MessageFlow');\n        expectConnected(taskShape, element('SubProcess_1'), 'bpmn:MessageFlow');\n      }));\n\n\n      it('undo', inject(function(modeling, elementRegistry, commandStack) {\n\n        // given\n        var taskShape = element('Task_2'),\n            targetShape = element('Participant_2'),\n            oldParent = taskShape.parent;\n\n        modeling.moveElements([ taskShape ], { x: 0, y: 300 }, targetShape);\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(taskShape.parent).to.eql(oldParent);\n\n        expectConnected(element('StartEvent_1'), taskShape, element('SequenceFlow_3'));\n\n        expectConnected(taskShape, element('Task_4'), element('MessageFlow_5'));\n        expectConnected(taskShape, element('SubProcess_1'), element('SequenceFlow_1'));\n\n        expectConnected(element('Participant_2'), element('StartEvent_1'), element('MessageFlow_4'));\n      }));\n\n    });\n\n\n    describe('moving nested shapes', function() {\n\n      it('execute', inject(function(modeling, elementRegistry) {\n\n        // given\n        var subProcessShape = element('SubProcess_1'),\n            targetShape = element('Participant_2');\n\n        // when\n        modeling.moveElements([ subProcessShape ], { x: 0, y: 530 }, targetShape);\n\n        // then\n        expect(subProcessShape.parent).to.eql(targetShape);\n\n        expectConnected(element('Task_2'), subProcessShape, 'bpmn:MessageFlow');\n\n        expectNotConnected(element('Task_1'), element('Participant_2'), 'bpmn:MessageFlow');\n      }));\n\n\n      it('undo', inject(function(modeling, elementRegistry, commandStack) {\n\n        // given\n        var subProcessShape = element('SubProcess_1'),\n            targetShape = element('Participant_2');\n\n        modeling.moveElements([ subProcessShape ], { x: 0, y: 530 }, targetShape);\n\n        // when\n        commandStack.undo();\n\n        // then\n        expectConnected(element('Task_2'), subProcessShape, element('SequenceFlow_1'));\n\n        expectConnected(element('Task_1'), element('Participant_2'), element('MessageFlow_3'));\n      }));\n\n    });\n\n  });\n\n\n  describe('should replace SequenceFlow <> Association', function() {\n\n    var processDiagramXML = require('./ReplaceConnectionBehavior.message-sequence-flow.bpmn');\n\n    beforeEach(bootstrapModeler(processDiagramXML, {\n      modules: testModules\n    }));\n\n    var element;\n\n    beforeEach(inject(function(elementRegistry) {\n      element = function(id) {\n        return elementRegistry.get(id);\n      };\n    }));\n\n\n    it('after replacing', inject(function(bpmnReplace) {\n\n      // given\n      var boundary = element('BoundaryEvent');\n\n      // when\n      bpmnReplace.replaceElement(boundary, { type: 'bpmn:BoundaryEvent', eventDefinitionType: 'bpmn:CompensateEventDefinition' });\n\n      // then\n      expectConnected(element('BoundaryEvent'), element('Task_5'), 'bpmn:Association', { associationDirection: 'One' });\n    }));\n\n  });\n\n\n  describe('text/data association', function() {\n\n    var processDiagramXML = require('./ReplaceConnectionBehavior.association.bpmn');\n\n    beforeEach(bootstrapModeler(processDiagramXML, {\n      modules: testModules\n    }));\n\n\n    var element;\n\n    beforeEach(inject(function(elementRegistry) {\n      element = function(id) {\n        return elementRegistry.get(id);\n      };\n    }));\n\n\n    describe('reconnecting data output association to text annotation', function() {\n\n      it('execute', inject(function(modeling) {\n\n        // given\n        var textAnnotation = element('TextAnnotation_1'),\n            dataObjectReference = element('DataObjectReference'),\n            dataOutputAssociation = element('DataOutputAssociation');\n\n        // when\n        modeling.reconnectStart(dataOutputAssociation, textAnnotation, { x: 708, y: 100 });\n\n        // then\n        expectConnected(textAnnotation, dataObjectReference, 'bpmn:Association');\n      }));\n\n\n      it('undo', inject(function(modeling, commandStack) {\n\n        // given\n        var task = element('Task'),\n            dataObjectReference = element('DataObjectReference'),\n            textAnnotation = element('TextAnnotation_1'),\n            dataOutputAssociation = element('DataOutputAssociation');\n\n        modeling.reconnectStart(dataOutputAssociation, textAnnotation, { x: 708, y: 100 });\n\n        // when\n        commandStack.undo();\n\n        // then\n        expectConnected(task, dataObjectReference, dataOutputAssociation);\n      }));\n\n    });\n\n  });\n\n\n  describe('boundary events', function() {\n\n    describe('moving host', function() {\n\n      var processDiagramXML = require('./ReplaceConnectionBehavior.boundary-events.bpmn');\n\n      beforeEach(bootstrapModeler(processDiagramXML, {\n        modules: testModules\n      }));\n\n      var element;\n\n      beforeEach(inject(function(elementRegistry) {\n        element = function(id) {\n          return elementRegistry.get(id);\n        };\n      }));\n\n      it('should remove invalid connections', inject(function(modeling) {\n\n        // given\n        var taskShape = element('Task_1'),\n            taskShape2 = element('Task_2'),\n            targetShape = element('SubProcess_1'),\n            boundaryEvent = element('BoundaryEvent_1'),\n            sequenceFlow = element('SequenceFlow_1');\n\n        // when\n        modeling.moveElements([ taskShape ], { x: 30, y: 200 }, targetShape);\n\n        // then\n        expectNotConnected(boundaryEvent, taskShape2 ,sequenceFlow);\n      }));\n\n\n      it('should remove invalid connections (undo)', inject(function(modeling, commandStack) {\n\n        // given\n        var taskShape = element('Task_1'),\n            taskShape2 = element('Task_2'),\n            boundaryEvent = element('BoundaryEvent_1'),\n            targetShape = element('SubProcess_1'),\n            sequenceFlow = element('SequenceFlow_1');\n\n        // when\n        modeling.moveElements([ taskShape ], { x: 30, y: 200 }, targetShape);\n        commandStack.undo();\n\n        // then\n        expectConnected(boundaryEvent, taskShape2, sequenceFlow);\n      }));\n\n\n      it('should remove invalid connections (redo)', inject(function(modeling, commandStack) {\n\n        // given\n        var taskShape = element('Task_1'),\n            targetShape = element('SubProcess_1'),\n            sequenceFlow = element('SequenceFlow_1');\n\n        // when\n        modeling.moveElements([ taskShape ], { x: 30, y: 200 }, targetShape);\n        commandStack.undo();\n        commandStack.redo();\n\n        // then\n        expectNotConnected(taskShape, targetShape, sequenceFlow);\n      }));\n\n    });\n\n\n    describe('moving along host with outgoing', function() {\n\n      var processDiagramXML = require('../../../../fixtures/bpmn/features/replace/connection.bpmn');\n\n      beforeEach(bootstrapModeler(processDiagramXML, {\n        modules: testModules\n      }));\n\n\n      it('should move connections outgoing from an attacher',\n        inject(function(canvas, elementFactory, move, dragging, elementRegistry, selection) {\n\n          // given\n          var rootShape = canvas.getRootElement(),\n              rootGfx = elementRegistry.getGraphics(rootShape),\n              host = elementRegistry.get('Task_1'),\n              task = elementRegistry.get('Task_2'),\n              boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n              connection = elementRegistry.get('SequenceFlow_1');\n\n          selection.select([ host, boundaryEvent, task ]);\n\n          // when\n          move.start(canvasEvent({ x: 0, y: 0 }), host);\n\n          dragging.hover({\n            element: rootShape,\n            gfx: rootGfx\n          });\n\n          dragging.move(canvasEvent({ x: 0, y: 300 }));\n          dragging.end();\n\n          // then\n          expect(connection.waypoints[0].x).to.equal(165);\n          expect(connection.waypoints[0].y).to.equal(477);\n\n          expect(connection.waypoints[1].x).to.equal(165);\n          expect(connection.waypoints[1].y).to.equal(544);\n\n          expect(connection.waypoints[2].x).to.equal(234);\n          expect(connection.waypoints[2].y).to.equal(544);\n\n          expect(connection.source).to.eql(boundaryEvent);\n          expect(connection.target).to.eql(task);\n        })\n      );\n\n    });\n\n\n    describe('dragging selection cleanup', function() {\n\n      var processDiagramXML = require('./ReplaceConnectionBehavior.message-sequence-flow.bpmn');\n\n      beforeEach(bootstrapModeler(processDiagramXML, {\n        modules: testModules.concat(bendpointsModule)\n      }));\n\n\n      it('should select the new connection if replaced one was selected before',\n        inject(function(bendpointMove, dragging, elementRegistry, selection) {\n\n          // given\n          var participant2 = elementRegistry.get('Participant_2'),\n              connection = elementRegistry.get('SequenceFlow_1');\n\n\n          selection.select([ connection ]);\n\n          // when\n          bendpointMove.start(canvasEvent(connection.waypoints[0]), connection, 0);\n\n          dragging.hover({\n            element: participant2\n          });\n\n          dragging.move(canvasEvent({ x: participant2.x + 200, y: participant2.y }));\n          dragging.end();\n\n\n          // then\n          expect(selection.get()).to.deep.eql(participant2.outgoing.slice(-1));\n        })\n      );\n\n\n      it('should not interfere with connection to other element',\n        inject(function(bendpointMove, dragging, elementRegistry, selection) {\n\n          // given\n          var participant2 = elementRegistry.get('Participant_2'),\n              connection = elementRegistry.get('SequenceFlow_1');\n\n\n          selection.select([ participant2 ]);\n\n          // when\n          bendpointMove.start(canvasEvent(connection.waypoints[0]), connection, 0);\n\n          dragging.hover({\n            element: participant2\n          });\n\n          dragging.move(canvasEvent({ x: participant2.x + 200, y: participant2.y }));\n          dragging.end();\n\n\n          // then\n          expect(selection.get()).to.deep.eql([ participant2 ]);\n        })\n      );\n\n    });\n\n  });\n\n\n  describe('reconnecting to create loops', function() {\n\n    var processDiagramXML = require('./ReplaceConnectionBehavior.message-sequence-flow.bpmn');\n\n    beforeEach(bootstrapModeler(processDiagramXML, {\n      modules: testModules\n    }));\n\n\n    it('should set correct parents when reconnecting message flow start to task',\n      inject(function(elementRegistry, modeling) {\n\n        // given\n        var task = elementRegistry.get('Task_4'),\n            connection = elementRegistry.get('MessageFlow_5');\n\n        // when\n        modeling.reconnectStart(connection, task, getMid(task));\n\n        // then\n        expect(connection.parent).to.not.exist;\n        expect(task.outgoing[0]).to.exist;\n        expect(task.outgoing[0]).to.have.property('parent', task.parent);\n      })\n    );\n\n\n    it('should set correct parents when reconnecting message flow end to task',\n      inject(function(elementRegistry, modeling) {\n\n        // given\n        var task = elementRegistry.get('Task_3'),\n            connection = elementRegistry.get('MessageFlow_1');\n\n        // when\n        modeling.reconnectEnd(connection, task, getMid(task));\n\n        // then\n        expect(connection.parent).to.not.exist;\n        expect(task.outgoing[0]).to.exist;\n        expect(task.outgoing[0]).to.have.property('parent', task.parent);\n      })\n    );\n\n\n    it('should set correct parents when reconnecting message flow from participant to task',\n      inject(function(elementRegistry, modeling) {\n\n        // given\n        var task = elementRegistry.get('Task_3'),\n            connection = elementRegistry.get('MessageFlow_6');\n\n        // when\n        modeling.reconnectStart(connection, task, getMid(task));\n\n        // then\n        expect(connection.parent).to.not.exist;\n        expect(task.outgoing[1]).to.exist;\n        expect(task.outgoing[1]).to.have.property('parent', task.parent);\n      })\n    );\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/ReplaceElementBehaviourSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport replacePreviewModule from 'lib/features/replace-preview';\nimport modelingModule from 'lib/features/modeling';\nimport moveModule from 'diagram-js/lib/features/move';\nimport coreModule from 'lib/core';\nimport copyPasteModule from 'lib/features/copy-paste';\n\nimport {\n  getBusinessObject,\n  is\n} from 'lib/util/ModelUtil';\n\nimport {\n  createCanvasEvent as canvasEvent\n} from '../../../../util/MockEvents';\n\nimport {\n  query as domQuery\n} from 'min-dom';\n\nvar ATTACH = { attach: true };\n\n\ndescribe('features/modeling - replace element behavior', function() {\n\n  describe('<shape.move>', function() {\n\n    var testModules = [\n      replacePreviewModule,\n      modelingModule,\n      coreModule,\n      moveModule,\n      copyPasteModule\n    ];\n\n\n    describe('Start Events', function() {\n\n      var diagramXML = require('../../../../fixtures/bpmn/event-sub-processes.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, {\n        modules: testModules\n      }));\n\n      var moveShape;\n\n      beforeEach(inject(function(move, dragging, elementRegistry) {\n\n        moveShape = function(shape, target, position) {\n          var startPosition = { x: shape.x + 10 + shape.width / 2, y: shape.y + 30 + shape.height / 2 };\n\n          move.start(canvasEvent(startPosition), shape);\n\n          dragging.hover({\n            element: target,\n            gfx: elementRegistry.getGraphics(target)\n          });\n\n          dragging.move(canvasEvent(position));\n        };\n      }));\n\n\n      it('should select the replacement after replacing the start event',\n        inject(function(elementRegistry, canvas, dragging, move, selection) {\n\n          // given\n          var startEvent = elementRegistry.get('StartEvent_1'),\n              rootElement = canvas.getRootElement();\n\n          // when\n          moveShape(startEvent, rootElement, { x: 140, y: 250 });\n\n          dragging.end();\n\n          var replacement = elementRegistry.get('StartEvent_1');\n\n          // then\n          expect(selection.get()).to.include(replacement);\n          expect(selection.get()).not.to.include(startEvent);\n        })\n      );\n\n\n      it('should select all moved shapes after some of them got replaced',\n        inject(function(elementRegistry, canvas, dragging, move, selection) {\n\n          // given\n          var startEvent1 = elementRegistry.get('StartEvent_1'),\n              startEvent2 = elementRegistry.get('StartEvent_2'),\n              startEvent3 = elementRegistry.get('StartEvent_3'),\n              rootElement = canvas.getRootElement();\n\n          // when\n          selection.select([ startEvent1, startEvent2, startEvent3 ]);\n          moveShape(startEvent1, rootElement, { x: 140, y: 250 });\n\n          dragging.end();\n\n          var replacements = elementRegistry.filter(function(element) {\n            if (is(element, 'bpmn:StartEvent') && element.type !== 'label') {\n              return true;\n            }\n          });\n\n          // then\n          expect(selection.get()).to.include(replacements[0]);\n          expect(selection.get()).to.include(replacements[1]);\n          expect(selection.get()).to.include(replacements[2]);\n\n        })\n      );\n\n\n      it('should not replace non-interrupting start event after copy paste',\n        inject(function(canvas, copyPaste, elementRegistry) {\n\n          // given\n          var subProcess = elementRegistry.get('SubProcess_1'),\n              rootElement = canvas.getRootElement();\n\n          // when\n          copyPaste.copy(subProcess);\n\n          var elements = copyPaste.paste({\n            element: rootElement,\n            point: {\n              x: 100,\n              y: 100\n            }\n          });\n\n          // then\n          var startEvents = elements.filter(function(element) {\n            if (is(element, 'bpmn:StartEvent') && getBusinessObject(element).get('eventDefinitions').length) {\n              return true;\n            }\n          });\n\n          startEvents.forEach(function(startEvent) {\n            expect(getBusinessObject(startEvent).get('isInterrupting')).to.be.false;\n          });\n        })\n      );\n\n    });\n\n\n    describe('Cancel Events', function() {\n\n      var diagramXML = require('../../../../fixtures/bpmn/features/replace/cancel-events.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      describe('normal', function() {\n\n\n        it('should unclaim ID and claim same ID with new element',\n          inject(function(elementRegistry, bpmnReplace) {\n\n            // given\n            var transaction = elementRegistry.get('Transaction_1');\n\n            var ids = transaction.businessObject.$model.ids;\n\n            // when\n            var subProcess = bpmnReplace.replaceElement(transaction, { type: 'bpmn:SubProcess' });\n\n            // then\n            expect(ids.assigned(transaction.id)).to.eql(subProcess.businessObject);\n            expect(ids.assigned(subProcess.id)).to.eql(subProcess.businessObject);\n            expect(subProcess.id).to.eql(transaction.id);\n          })\n        );\n\n\n        it('should REVERT unclaim ID and claim same ID with new element on UNDO',\n          inject(function(elementRegistry, bpmnReplace, commandStack) {\n\n            // given\n            var transaction = elementRegistry.get('Transaction_1');\n\n            var ids = transaction.businessObject.$model.ids;\n\n            var subProcess = bpmnReplace.replaceElement(transaction, { type: 'bpmn:SubProcess' });\n\n            // when\n            commandStack.undo();\n\n            // then\n            expect(ids.assigned(transaction.id)).to.eql(transaction.businessObject);\n            expect(subProcess.id).not.to.equal(transaction.id);\n          })\n        );\n\n\n        it('should replace CancelEvent when morphing transaction',\n          inject(function(elementRegistry, bpmnReplace) {\n\n            // given\n            var transaction = elementRegistry.get('Transaction_1'),\n                endEvent = elementRegistry.get('EndEvent_1');\n\n            // when\n            bpmnReplace.replaceElement(endEvent, {\n              type: 'bpmn:EndEvent',\n              eventDefinitionType: 'bpmn:CancelEventDefinition'\n            });\n\n            var subProcess = bpmnReplace.replaceElement(transaction, { type: 'bpmn:SubProcess' });\n\n            var newEndEvent = subProcess.children[0].businessObject;\n\n            // then\n            expect(subProcess.children).to.have.length(1);\n            expect(newEndEvent.eventDefinitionTypes).not.to.exist;\n          })\n        );\n\n\n        it('should replace CancelEvent when morphing transaction -> undo',\n          inject(function(elementRegistry, bpmnReplace, commandStack) {\n\n            // given\n            var transaction = elementRegistry.get('Transaction_1'),\n                endEvent = elementRegistry.get('EndEvent_1');\n\n            // when\n            bpmnReplace.replaceElement(endEvent, {\n              type: 'bpmn:EndEvent',\n              eventDefinitionType: 'bpmn:CancelEventDefinition'\n            });\n\n            bpmnReplace.replaceElement(transaction, { type: 'bpmn:SubProcess' });\n\n            commandStack.undo();\n\n            var endEventAfter = elementRegistry.filter(function(element) {\n              return (element.id !== 'EndEvent_2' && element.type === 'bpmn:EndEvent');\n            })[0];\n\n            // then\n            expect(transaction.children).to.have.length(1);\n            expect(endEventAfter.businessObject.get('eventDefinitions')).not.to.be.empty;\n          })\n        );\n\n\n        it('should replace a CancelEvent when moving outside of a transaction',\n          inject(function(elementRegistry, bpmnReplace, modeling) {\n\n            // given\n            var process = elementRegistry.get('Process_1'),\n                transaction = elementRegistry.get('Transaction_1'),\n                endEvent = elementRegistry.get('EndEvent_1');\n\n            // when\n            var cancelEvent = bpmnReplace.replaceElement(endEvent, {\n              type: 'bpmn:EndEvent',\n              eventDefinitionType: 'bpmn:CancelEventDefinition'\n            });\n\n            modeling.moveElements([ cancelEvent ], { x: 0, y: 150 }, process);\n\n            var endEventAfter = elementRegistry.filter(function(element) {\n              return (element.parent === process && element.type === 'bpmn:EndEvent');\n            })[0];\n\n            // then\n            expect(transaction.children).to.have.length(0);\n            expect(endEventAfter.businessObject.get('eventDefinitions')).to.be.empty;\n          })\n        );\n\n\n        it('should replace a CancelEvent when moving outside of a transaction -> undo',\n          inject(function(elementRegistry, bpmnReplace, modeling, commandStack) {\n\n            // given\n            var process = elementRegistry.get('Process_1'),\n                transaction = elementRegistry.get('Transaction_1'),\n                endEvent = elementRegistry.get('EndEvent_1');\n\n            // when\n            var cancelEvent = bpmnReplace.replaceElement(endEvent, {\n              type: 'bpmn:EndEvent',\n              eventDefinitionType: 'bpmn:CancelEventDefinition'\n            });\n\n            modeling.moveElements([ cancelEvent ], { x: 0, y: 150 }, process);\n\n            commandStack.undo();\n\n            var endEventAfter = elementRegistry.filter(function(element) {\n              return (element.id !== 'EndEvent_2' && element.type === 'bpmn:EndEvent');\n            })[0];\n\n            // then\n            expect(transaction.children).to.have.length(1);\n            expect(endEventAfter.businessObject.get('eventDefinitions')).not.to.be.empty;\n          })\n        );\n\n      });\n\n\n      describe('boundary events', function() {\n\n        it('should replace CancelBoundaryEvent when morphing from a transaction',\n          inject(function(elementRegistry, bpmnReplace) {\n\n            // given\n            var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n                transaction = elementRegistry.get('Transaction_1');\n\n            // when\n            bpmnReplace.replaceElement(boundaryEvent, {\n              type: 'bpmn:BoundaryEvent',\n              eventDefinitionType: 'bpmn:CancelEventDefinition'\n            });\n\n            var subProcess = bpmnReplace.replaceElement(transaction, { type: 'bpmn:SubProcess' });\n\n            var newBoundaryEvent = subProcess.attachers[0].businessObject;\n\n            // then\n            expect(newBoundaryEvent.eventDefinitionTypes).not.to.exist;\n            expect(newBoundaryEvent.attachedToRef).to.equal(subProcess.businessObject);\n            expect(elementRegistry.get('Transaction_1')).to.eql(subProcess);\n          })\n        );\n\n\n        it('should replace CancelBoundaryEvent when morphing from a transaction -> undo',\n          inject(function(elementRegistry, bpmnReplace, commandStack) {\n\n            // given\n            var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n                transaction = elementRegistry.get('Transaction_1');\n\n            // when\n            bpmnReplace.replaceElement(boundaryEvent, {\n              type: 'bpmn:BoundaryEvent',\n              eventDefinitionType: 'bpmn:CancelEventDefinition'\n            });\n\n            bpmnReplace.replaceElement(transaction, { type: 'bpmn:SubProcess' });\n\n            commandStack.undo();\n\n            var afterBoundaryEvent = elementRegistry.filter(function(element) {\n              return (element.type === 'bpmn:BoundaryEvent' && element.id === 'BoundaryEvent_1');\n            })[0];\n\n            // then\n            expect(afterBoundaryEvent.businessObject.get('eventDefinitions')).not.to.be.empty;\n            expect(afterBoundaryEvent.businessObject.attachedToRef).to.equal(transaction.businessObject);\n            expect(transaction.attachers).to.have.length(1);\n          })\n        );\n\n\n        it('should replace CancelBoundaryEvent when attaching to a NON-transaction',\n          inject(function(elementRegistry, bpmnReplace, modeling) {\n\n            // given\n            var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n                subProcess = elementRegistry.get('SubProcess_1'),\n                process = elementRegistry.get('Process_1'),\n                transaction = elementRegistry.get('Transaction_1');\n\n            // when\n            var newBoundaryEvent = bpmnReplace.replaceElement(boundaryEvent, {\n              type: 'bpmn:BoundaryEvent',\n              eventDefinitionType: 'bpmn:CancelEventDefinition'\n            });\n\n            modeling.moveElements([ newBoundaryEvent ], { x: 500, y: 0 }, subProcess, ATTACH);\n\n            var movedBoundaryEvent = elementRegistry.filter(function(element) {\n              return (element.type === 'bpmn:BoundaryEvent' && element.id === 'BoundaryEvent_1');\n            })[0];\n\n            // then\n            expect(movedBoundaryEvent.businessObject.get('eventDefinitions')).to.be.empty;\n            expect(movedBoundaryEvent.businessObject.attachedToRef).to.equal(subProcess.businessObject);\n            expect(movedBoundaryEvent.parent).to.equal(process);\n\n            expect(movedBoundaryEvent.host).to.equal(subProcess);\n            expect(subProcess.attachers).to.contain(movedBoundaryEvent);\n            expect(transaction.attachers).to.be.empty;\n          })\n        );\n\n\n        it('should replace CancelBoundaryEvent when attaching to a NON-transaction -> undo',\n          inject(function(elementRegistry, bpmnReplace, modeling, commandStack) {\n\n            // given\n            var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n                transaction = elementRegistry.get('Transaction_1'),\n                subProcess = elementRegistry.get('SubProcess_1');\n\n            // when\n            var newBoundaryEvent = bpmnReplace.replaceElement(boundaryEvent, {\n              type: 'bpmn:BoundaryEvent',\n              eventDefinitionType: 'bpmn:CancelEventDefinition'\n            });\n\n            modeling.moveElements([ newBoundaryEvent ], { x: 500, y: 0 }, subProcess, ATTACH);\n\n            commandStack.undo();\n\n            var movedBoundaryEvent = elementRegistry.filter(function(element) {\n              return (element.type === 'bpmn:BoundaryEvent' && element.id === 'BoundaryEvent_1');\n            })[0];\n\n            // then\n            expect(movedBoundaryEvent.businessObject.get('eventDefinitions')).not.to.be.empty;\n            expect(movedBoundaryEvent.businessObject.attachedToRef).to.equal(transaction.businessObject);\n\n            expect(movedBoundaryEvent.host).to.equal(transaction);\n            expect(transaction.attachers).to.contain(movedBoundaryEvent);\n            expect(subProcess.attachers).to.have.length(1);\n          })\n        );\n\n\n        it('should NOT allow morphing into an IntermediateEvent',\n          inject(function(elementRegistry, bpmnReplace, commandStack, move, dragging) {\n\n            // given\n            var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n                subProcess = elementRegistry.get('SubProcess_1');\n\n            // when\n            var newBoundaryEvent = bpmnReplace.replaceElement(boundaryEvent, {\n              type: 'bpmn:BoundaryEvent',\n              eventDefinitionType: 'bpmn:CancelEventDefinition'\n            });\n\n            move.start(canvasEvent({ x: 0, y: 0 }), newBoundaryEvent);\n\n            dragging.hover({\n              gfx: elementRegistry.getGraphics(subProcess),\n              element: subProcess\n            });\n            dragging.move(canvasEvent({ x: 450, y: -50 }));\n\n            var canExecute = dragging.context().data.context.canExecute;\n\n            // then\n            expect(canExecute).to.be.false;\n          })\n        );\n\n      });\n\n    });\n\n\n    describe('outline', function() {\n\n      var diagramXML = require('../../../../fixtures/bpmn/features/replace/connection.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      it('should update size of outline on replace', inject(function(bpmnReplace, elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task_2');\n\n        // when\n        var subProcess = bpmnReplace.replaceElement(task, {\n          type: 'bpmn:SubProcess',\n          isExpanded: true\n        });\n\n        // then\n        var gfx = elementRegistry.getGraphics(subProcess);\n        var outline = domQuery('.djs-outline', gfx);\n\n        expect(outline.getBBox().width).to.equal(gfx.getBBox().width);\n        expect(outline.getBBox().height).to.equal(gfx.getBBox().height);\n      }));\n\n    });\n  });\n\n\n  describe('shape.create', function() {\n\n    var diagramXML = require('../../../../fixtures/bpmn/event-sub-processes.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: [\n        replacePreviewModule,\n        modelingModule,\n        coreModule\n      ]\n    }));\n\n\n    it('should replace Timer Start Event with None Start Event when created in SubProcess',\n      inject(function(elementRegistry, modeling, elementFactory) {\n\n        // given\n        var subProcess = elementRegistry.get('SubProcess_3'),\n            startEvent = elementFactory.createShape(\n              { type: 'bpmn:StartEvent', eventDefinitionType: 'bpmn:TimerEventDefinition' }),\n            id = startEvent.businessObject.id;\n\n        // when\n        modeling.createElements(\n          startEvent, { x: subProcess.x + 30, y: subProcess.y + 30 }, subProcess);\n\n        // then\n        var createdEvent = elementRegistry.get(id);\n\n        expect(createdEvent).to.exist;\n        expect(createdEvent.businessObject.get('eventDefinitions')).to.be.empty;\n      })\n    );\n\n\n    it('should NOT replace Timer Start Event when created in EventSubProcess',\n      inject(function(elementRegistry, modeling, elementFactory) {\n\n        // given\n        var subProcess = elementRegistry.get('SubProcess_2'),\n            startEvent = elementFactory.createShape(\n              { type: 'bpmn:StartEvent', eventDefinitionType: 'bpmn:TimerEventDefinition' }),\n            id = startEvent.businessObject.id;\n\n        // when\n        modeling.createElements(\n          startEvent, { x: subProcess.x + 30, y: subProcess.y + 30 }, subProcess);\n\n        // then\n        var createdEvent = elementRegistry.get(id);\n\n        expect(createdEvent).to.eql(startEvent);\n        expect(createdEvent.businessObject.get('eventDefinitions')).to.have.lengthOf(1);\n        expect(\n          is(createdEvent.businessObject.get('eventDefinitions')[0], 'bpmn:TimerEventDefinition')\n        ).to.be.true;\n      })\n    );\n\n\n    it('should replace Non-Interrupting Start Event when created in Process',\n      inject(function(elementRegistry, modeling, elementFactory) {\n\n        // given\n        var processElement = elementRegistry.get('Process_1'),\n            startEvent = elementFactory.createShape({\n              type: 'bpmn:StartEvent', eventDefinitionType: 'bpmn:TimerEventDefinition',\n              isInterrupting: false\n            }),\n            id = startEvent.businessObject.id;\n\n        // when\n        modeling.createElements(\n          startEvent, { x: 30, y: 30 }, processElement);\n\n        // then\n        var createdEvent = elementRegistry.get(id);\n\n        expect(createdEvent).to.exist;\n        expect(createdEvent.businessObject.get('eventDefinitions')).to.be.empty;\n        expect(createdEvent.businessObject.get('isInterrupting')).to.be.true;\n      })\n    );\n  });\n});\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/ResizeBehavior.lanes.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:collaboration id=\"Collaboration\">\n    <bpmn:participant id=\"Participant\" name=\"Participant\" processRef=\"Process\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process\" isExecutable=\"false\">\n    <bpmn:laneSet>\n      <bpmn:lane id=\"Lane_A\" name=\"Lane_A\" />\n      <bpmn:lane id=\"Lane_B_0\" name=\"Lane_B_0\">\n        <bpmn:childLaneSet xsi:type=\"bpmn:tLaneSet\">\n          <bpmn:lane id=\"Lane_B_1\" name=\"Lane_B_1\" />\n        </bpmn:childLaneSet>\n      </bpmn:lane>\n    </bpmn:laneSet>\n    <bpmn:startEvent id=\"StartEvent\" />\n    <bpmn:task id=\"Task\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"Participant_di\" bpmnElement=\"Participant\">\n        <dc:Bounds x=\"123\" y=\"49\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_di\" bpmnElement=\"StartEvent\">\n        <dc:Bounds x=\"210\" y=\"96\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"183\" y=\"132\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_A_di\" bpmnElement=\"Lane_A\">\n        <dc:Bounds x=\"153\" y=\"49\" width=\"570\" height=\"132\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_B_0_di\" bpmnElement=\"Lane_B_0\">\n        <dc:Bounds x=\"153\" y=\"181\" width=\"570\" height=\"118\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_di\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"345.84507042253523\" y=\"203.42637644046096\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_B_1_di\" bpmnElement=\"Lane_B_1\">\n        <dc:Bounds x=\"183\" y=\"181\" width=\"540\" height=\"118\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/ResizeBehavior.lanes.vertical.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:collaboration id=\"Collaboration\">\n    <bpmn:participant id=\"Vertical_Participant\" name=\"Vertical_Participant\" processRef=\"Process\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process\" isExecutable=\"false\">\n    <bpmn:laneSet>\n      <bpmn:lane id=\"Vertical_Lane_A\" name=\"Vertical_Lane_A\" />\n      <bpmn:lane id=\"Vertical_Lane_B_0\" name=\"Vertical_Lane_B_0\">\n        <bpmn:childLaneSet xsi:type=\"bpmn:tLaneSet\">\n          <bpmn:lane id=\"Vertical_Lane_B_1\" name=\"Vertical_Lane_B_1\" />\n        </bpmn:childLaneSet>\n      </bpmn:lane>\n    </bpmn:laneSet>\n    <bpmn:startEvent id=\"StartEvent\" />\n    <bpmn:task id=\"Task\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"Participant_di\" bpmnElement=\"Vertical_Participant\" isHorizontal=\"false\">\n        <dc:Bounds x=\"49\" y=\"123\" width=\"310\" height=\"600\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_di\" bpmnElement=\"StartEvent\">\n        <dc:Bounds x=\"96\" y=\"210\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"132\" y=\"183\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_A_di\" bpmnElement=\"Vertical_Lane_A\" isHorizontal=\"false\">\n        <dc:Bounds x=\"49\" y=\"153\" width=\"132\" height=\"570\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_B_0_di\" bpmnElement=\"Vertical_Lane_B_0\" isHorizontal=\"false\">\n        <dc:Bounds x=\"181\" y=\"153\" width=\"178\" height=\"570\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_di\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"203.42637644046096\" y=\"345.84507042253523\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_B_1_di\" bpmnElement=\"Vertical_Lane_B_1\" isHorizontal=\"false\">\n        <dc:Bounds x=\"181\" y=\"183\" width=\"178\" height=\"540\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/ResizeBehavior.participant.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:collaboration id=\"Collaboration_1\">\n    <bpmn:participant id=\"Participant_1\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Participant_2\" processRef=\"Process_2\" />\n    <bpmn:participant id=\"Participant_3\" processRef=\"Process_3\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\" />\n  <bpmn:process id=\"Process_2\">\n    <bpmn:subProcess id=\"SubProcess_1\" />\n    <bpmn:association id=\"Association_1\" sourceRef=\"SubProcess_1\" targetRef=\"TextAnnotation_1\" />\n    <bpmn:textAnnotation id=\"TextAnnotation_1\" />\n  </bpmn:process>\n  <bpmn:process id=\"Process_3\">\n    <bpmn:startEvent id=\"StartEvent_1\" />\n    <bpmn:task id=\"Task_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_1_di\" bpmnElement=\"Participant_1\">\n        <dc:Bounds x=\"624\" y=\"30\" width=\"442\" height=\"234\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_2_di\" bpmnElement=\"Participant_2\">\n        <dc:Bounds x=\"47\" y=\"30\" width=\"506\" height=\"299\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"136\" y=\"113\" width=\"213\" height=\"149\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_1_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"409\" y=\"62\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_1_di\" bpmnElement=\"Association_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"349\" y=\"154\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"409\" y=\"119\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Participant_3_di\" bpmnElement=\"Participant_3\">\n        <dc:Bounds x=\"624\" y=\"290\" width=\"400\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"721\" y=\"355\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"694\" y=\"391\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"809\" y=\"333\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/ResizeBehavior.participant.vertical.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:collaboration id=\"Collaboration_1\">\n    <bpmn:participant id=\"Vertical_Participant_1\" name=\"Vertical_Participant_1\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Vertical_Participant_2\" name=\"Vertical_Participant_2\" processRef=\"Process_2\" />\n    <bpmn:participant id=\"Vertical_Participant_3\" name=\"Vertical_Participant_3\" processRef=\"Process_3\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\" />\n  <bpmn:process id=\"Process_2\">\n    <bpmn:subProcess id=\"SubProcess_1\" />\n    <bpmn:association id=\"Association_1\" sourceRef=\"SubProcess_1\" targetRef=\"TextAnnotation_1\" />\n    <bpmn:textAnnotation id=\"TextAnnotation_1\" />\n  </bpmn:process>\n  <bpmn:process id=\"Process_3\">\n    <bpmn:startEvent id=\"StartEvent_1\" />\n    <bpmn:task id=\"Task_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_1_di\" bpmnElement=\"Vertical_Participant_1\" isHorizontal=\"false\">\n        <dc:Bounds x=\"30\" y=\"624\" width=\"234\" height=\"442\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_2_di\" bpmnElement=\"Vertical_Participant_2\" isHorizontal=\"false\">\n        <dc:Bounds x=\"30\" y=\"47\" width=\"299\" height=\"506\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"90\" y=\"136\" width=\"213\" height=\"149\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_1_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"70\" y=\"380\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_1_di\" bpmnElement=\"Association_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"154\" y=\"349\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"119\" y=\"409\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Participant_3_di\" bpmnElement=\"Vertical_Participant_3\" isHorizontal=\"false\">\n        <dc:Bounds x=\"290\" y=\"624\" width=\"200\" height=\"400\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"355\" y=\"721\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"391\" y=\"694\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"333\" y=\"869\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/ResizeBehavior.subProcess.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess\">\n      <bpmn:startEvent id=\"StartEvent\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent\">\n        <dc:Bounds x=\"199\" y=\"99\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"172\" y=\"135\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_di\" bpmnElement=\"SubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"133\" y=\"58\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/ResizeBehavior.textAnnotation.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process\">\n    <bpmn:task id=\"Task\" />\n    <bpmn:textAnnotation id=\"TextAnnotation\" />\n    <bpmn:association id=\"Association\" sourceRef=\"Task\" targetRef=\"TextAnnotation\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process\">\n      <bpmndi:BPMNShape id=\"Task_di\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"101\" y=\"191\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_di\" bpmnElement=\"TextAnnotation\">\n        <dc:Bounds x=\"322\" y=\"126\" width=\"121\" height=\"112\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_di\" bpmnElement=\"Association\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"201\" y=\"220\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"322\" y=\"195\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/ResizeBehavior.utility.lanes-flowNodes.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_4bAZoD9WEeWLcNBL4nCk1A\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"Participant_Lane\" name=\"Participant_Lane\" processRef=\"Process_Lane\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_Lane\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Lane_A\" name=\"Lane_A\">\n        <bpmn2:childLaneSet xsi:type=\"bpmn2:tLaneSet\" id=\"LaneSet_2\">\n          <bpmn2:lane id=\"Nested_Lane_A\" name=\"Nested_Lane_A\">\n            <bpmn2:flowNodeRef>Boundary</bpmn2:flowNodeRef>\n            <bpmn2:flowNodeRef>Task_Boundary</bpmn2:flowNodeRef>\n          </bpmn2:lane>\n          <bpmn2:lane id=\"Nested_Lane_B\" name=\"Nested_Lane_B\"/>\n        </bpmn2:childLaneSet>\n      </bpmn2:lane>\n      <bpmn2:lane id=\"Lane_B\" name=\"Lane_B\">\n        <bpmn2:flowNodeRef>Task</bpmn2:flowNodeRef>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:boundaryEvent id=\"Boundary\" name=\"Boundary\" attachedToRef=\"Task_Boundary\">\n      <bpmn2:outgoing>SequenceFlow_From_Boundary</bpmn2:outgoing>\n    </bpmn2:boundaryEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_From_Boundary\" name=\"\" sourceRef=\"Boundary\" targetRef=\"Task\"/>\n    <bpmn2:task id=\"Task_Boundary\" name=\"Task_Boundary\">\n      <bpmn2:outgoing>SequenceFlow</bpmn2:outgoing>\n    </bpmn2:task>\n    <bpmn2:sequenceFlow id=\"SequenceFlow\" name=\"\" sourceRef=\"Task_Boundary\" targetRef=\"Task\"/>\n    <bpmn2:task id=\"Task\" name=\"Task\">\n      <bpmn2:incoming>SequenceFlow_From_Boundary</bpmn2:incoming>\n      <bpmn2:incoming>SequenceFlow</bpmn2:incoming>\n    </bpmn2:task>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"Participant_Lane\" isHorizontal=\"true\">\n        <dc:Bounds height=\"532.0\" width=\"540.0\" x=\"156.0\" y=\"0.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_Boundary\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"348.0\" y=\"30.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_BoundaryEvent_2\" bpmnElement=\"Boundary\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"395.0\" y=\"92.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"21.0\" width=\"61.0\" x=\"336.0\" y=\"127.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"516.0\" y=\"384.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_From_Boundary\" sourceElement=\"_BPMNShape_BoundaryEvent_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"413.0\" y=\"128.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"413.0\" y=\"156.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"413.0\" y=\"423.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"516.0\" y=\"424.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"410.0\" y=\"206.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow\" sourceElement=\"_BPMNShape_Task_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"448.0\" y=\"70.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"482.0\" y=\"70.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"566.0\" y=\"70.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"566.0\" y=\"384.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"487.0\" y=\"70.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_3\" bpmnElement=\"Lane_A\" isHorizontal=\"true\">\n        <dc:Bounds height=\"361.0\" width=\"510.0\" x=\"186.0\" y=\"0.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_4\" bpmnElement=\"Nested_Lane_A\" isHorizontal=\"true\">\n        <dc:Bounds height=\"181.0\" width=\"480.0\" x=\"216.0\" y=\"0.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_5\" bpmnElement=\"Nested_Lane_B\" isHorizontal=\"true\">\n        <dc:Bounds height=\"181.0\" width=\"480.0\" x=\"216.0\" y=\"180.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_6\" bpmnElement=\"Lane_B\" isHorizontal=\"true\">\n        <dc:Bounds height=\"172.0\" width=\"510.0\" x=\"186.0\" y=\"360.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/spec/features/modeling/behavior/ResizeBehavior.utility.lanes.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_4bAZoD9WEeWLcNBL4nCk1A\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"Participant_Lane\" name=\"Participant_Lane\" processRef=\"Process_Lane\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_Lane\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Lane_A\" name=\"Lane_A\">\n        <bpmn2:childLaneSet xsi:type=\"bpmn2:tLaneSet\" id=\"LaneSet_2\">\n          <bpmn2:lane id=\"Nested_Lane_A\" name=\"Nested_Lane_A\"/>\n          <bpmn2:lane id=\"Nested_Lane_B\" name=\"Nested_Lane_B\"/>\n        </bpmn2:childLaneSet>\n      </bpmn2:lane>\n      <bpmn2:lane id=\"Lane_B\" name=\"Lane_B\"/>\n    </bpmn2:laneSet>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"Participant_Lane\" isHorizontal=\"true\">\n        <dc:Bounds height=\"532.0\" width=\"540.0\" x=\"156.0\" y=\"0.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_3\" bpmnElement=\"Lane_A\" isHorizontal=\"true\">\n        <dc:Bounds height=\"361.0\" width=\"510.0\" x=\"186.0\" y=\"0.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_4\" bpmnElement=\"Nested_Lane_A\" isHorizontal=\"true\">\n        <dc:Bounds height=\"181.0\" width=\"480.0\" x=\"216.0\" y=\"0.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_5\" bpmnElement=\"Nested_Lane_B\" isHorizontal=\"true\">\n        <dc:Bounds height=\"181.0\" width=\"480.0\" x=\"216.0\" y=\"180.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_6\" bpmnElement=\"Lane_B\" isHorizontal=\"true\">\n        <dc:Bounds height=\"172.0\" width=\"510.0\" x=\"186.0\" y=\"360.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/spec/features/modeling/behavior/ResizeBehavior.utility.lanes.vertical-flowNodes.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_4bAZoD9WEeWLcNBL4nCk1A\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"Vertical_Participant_Lane\" name=\"Vertical_Participant_Lane\" processRef=\"Process_Lane\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_Lane\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Vertical_Lane_A\" name=\"Vertical_Lane_A\">\n        <bpmn2:childLaneSet xsi:type=\"bpmn2:tLaneSet\" id=\"LaneSet_2\">\n          <bpmn2:lane id=\"Nested_Vertical_Lane_A\" name=\"Nested_Vertical_Lane_A\">\n            <bpmn2:flowNodeRef>Boundary</bpmn2:flowNodeRef>\n            <bpmn2:flowNodeRef>Task_Boundary</bpmn2:flowNodeRef>\n          </bpmn2:lane>\n          <bpmn2:lane id=\"Nested_Vertical_Lane_B\" name=\"Nested_Vertical_Lane_B\"/>\n        </bpmn2:childLaneSet>\n      </bpmn2:lane>\n      <bpmn2:lane id=\"Vertical_Lane_B\" name=\"Vertical_Lane_B\">\n        <bpmn2:flowNodeRef>Task</bpmn2:flowNodeRef>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:boundaryEvent id=\"Boundary\" name=\"Boundary\" attachedToRef=\"Task_Boundary\">\n      <bpmn2:outgoing>SequenceFlow_From_Boundary</bpmn2:outgoing>\n    </bpmn2:boundaryEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_From_Boundary\" name=\"\" sourceRef=\"Boundary\" targetRef=\"Task\"/>\n    <bpmn2:task id=\"Task_Boundary\" name=\"Task_Boundary\">\n      <bpmn2:outgoing>SequenceFlow</bpmn2:outgoing>\n    </bpmn2:task>\n    <bpmn2:sequenceFlow id=\"SequenceFlow\" name=\"\" sourceRef=\"Task_Boundary\" targetRef=\"Task\"/>\n    <bpmn2:task id=\"Task\" name=\"Task\">\n      <bpmn2:incoming>SequenceFlow_From_Boundary</bpmn2:incoming>\n      <bpmn2:incoming>SequenceFlow</bpmn2:incoming>\n    </bpmn2:task>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"Vertical_Participant_Lane\" isHorizontal=\"false\">\n        <dc:Bounds x=\"0.0\" y=\"156.0\" width=\"532.0\" height=\"540.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_Boundary\">\n        <dc:Bounds x=\"30.0\" y=\"348.0\" width=\"100.0\" height=\"80.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_BoundaryEvent_2\" bpmnElement=\"Boundary\">\n        <dc:Bounds x=\"112.0\" y=\"355.0\" width=\"36.0\" height=\"36.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"127.0\" y=\"326.0\" width=\"21.0\" height=\"61.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"384.0\" y=\"516.0\" width=\"100.0\" height=\"80.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_From_Boundary\" sourceElement=\"_BPMNShape_BoundaryEvent_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"150.0\" y=\"373.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"423.0\" y=\"373.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"424.0\" y=\"516.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"206.0\" y=\"410.0\" width=\"6.0\" height=\"6.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow\" sourceElement=\"_BPMNShape_Task_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"70.0\" y=\"428.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"70.0\" y=\"566.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"384.0\" y=\"566.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"70.0\" y=\"487.0\" width=\"6.0\" height=\"6.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_3\" bpmnElement=\"Vertical_Lane_A\" isHorizontal=\"false\">\n        <dc:Bounds x=\"0.0\" y=\"186.0\" width=\"361.0\" height=\"510.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_4\" bpmnElement=\"Nested_Vertical_Lane_A\" isHorizontal=\"false\">\n        <dc:Bounds x=\"0.0\" y=\"216.0\" width=\"181.0\" height=\"480.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_5\" bpmnElement=\"Nested_Vertical_Lane_B\" isHorizontal=\"false\">\n        <dc:Bounds x=\"180.0\" y=\"216.0\" width=\"181.0\" height=\"480.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_6\" bpmnElement=\"Vertical_Lane_B\" isHorizontal=\"false\">\n        <dc:Bounds x=\"360.0\" y=\"186.0\" width=\"172.0\" height=\"510.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/spec/features/modeling/behavior/ResizeBehavior.utility.lanes.vertical.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_4bAZoD9WEeWLcNBL4nCk1A\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"Vertical_Participant_Lane\" name=\"Vertical_Participant_Lane\" processRef=\"Process_Lane\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_Lane\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Vertical_Lane_A\" name=\"Vertical_Lane_A\">\n        <bpmn2:childLaneSet xsi:type=\"bpmn2:tLaneSet\" id=\"LaneSet_2\">\n          <bpmn2:lane id=\"Nested_Vertical_Lane_A\" name=\"Nested_Vertical_Lane_A\"/>\n          <bpmn2:lane id=\"Nested_Vertical_Lane_B\" name=\"Nested_Vertical_Lane_B\"/>\n        </bpmn2:childLaneSet>\n      </bpmn2:lane>\n      <bpmn2:lane id=\"Vertical_Lane_B\" name=\"Vertical_Lane_B\"/>\n    </bpmn2:laneSet>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"Vertical_Participant_Lane\" isHorizontal=\"false\">\n        <dc:Bounds x=\"0.0\" y=\"156.0\" width=\"532.0\" height=\"540.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_3\" bpmnElement=\"Vertical_Lane_A\" isHorizontal=\"false\">\n        <dc:Bounds x=\"0.0\" y=\"186.0\" width=\"361.0\" height=\"510.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_4\" bpmnElement=\"Nested_Vertical_Lane_A\" isHorizontal=\"false\">\n        <dc:Bounds x=\"0.0\" y=\"216.0\" width=\"181.0\" height=\"480.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_5\" bpmnElement=\"Nested_Vertical_Lane_B\" isHorizontal=\"false\">\n        <dc:Bounds x=\"180.0\" y=\"216.0\" width=\"181.0\" height=\"480.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_6\" bpmnElement=\"Vertical_Lane_B\" isHorizontal=\"false\">\n        <dc:Bounds x=\"360.0\" y=\"186.0\" width=\"172.0\" height=\"510.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/ResizeBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\nimport resizeModule from 'diagram-js/lib/features/resize';\nimport rulesModule from 'lib/features/rules';\nimport snappingModule from 'lib/features/snapping';\n\nimport {\n  createCanvasEvent as canvasEvent\n} from '../../../../util/MockEvents';\n\nimport {\n  getParticipantResizeConstraints\n} from 'lib/features/modeling/behavior/ResizeBehavior';\n\nvar testModules = [\n  coreModule,\n  modelingModule,\n  resizeModule,\n  rulesModule,\n  snappingModule\n];\n\n\ndescribe('features/modeling - resize behavior', function() {\n\n  describe('participant', function() {\n\n    describe('minimum dimensions', function() {\n\n      var diagramXML = require('./ResizeBehavior.participant.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      it('should snap to children from <se>', inject(function(dragging, elementRegistry, resize) {\n\n        // given\n        var participant = elementRegistry.get('Participant_2');\n\n        // when\n        resize.activate(canvasEvent({ x: 500, y: 500 }), participant, 'se');\n\n        dragging.move(canvasEvent({ x: 0, y: 0 }));\n\n        dragging.end();\n\n        // then\n        expect(participant.width).to.equal(482);\n        expect(participant.height).to.equal(252);\n      }));\n\n\n      it('should snap to children from <nw>', inject(function(dragging, elementRegistry, resize) {\n\n        // given\n        var participant = elementRegistry.get('Participant_2');\n\n        // when\n        resize.activate(canvasEvent({ x: 0, y: 0 }), participant, 'nw');\n\n        dragging.move(canvasEvent({ x: 500, y: 500 }));\n\n        dragging.end();\n\n        // then\n        expect(participant.width).to.equal(467);\n        expect(participant.height).to.equal(287);\n      }));\n\n\n      it('should snap to min dimensions from <se>', inject(\n        function(dragging, elementRegistry, resize) {\n\n          // given\n          var participant = elementRegistry.get('Participant_1');\n\n          // when\n          resize.activate(canvasEvent({ x: 500, y: 500 }), participant, 'se');\n\n          dragging.move(canvasEvent({ x: 0, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expect(participant.width).to.equal(300);\n          expect(participant.height).to.equal(60);\n        })\n      );\n\n\n      it('should snap to min dimensions from <nw>', inject(\n        function(dragging, elementRegistry, resize) {\n\n          // given\n          var participant = elementRegistry.get('Participant_1');\n\n          // when\n          resize.activate(canvasEvent({ x: 0, y: 0 }), participant, 'nw');\n\n          dragging.move(canvasEvent({ x: 500, y: 500 }));\n\n          dragging.end();\n\n          // then\n          expect(participant.width).to.equal(300);\n          expect(participant.height).to.equal(60);\n        })\n      );\n\n\n      it('should snap to min dimensions + children from <se>', inject(\n        function(dragging, elementRegistry, resize) {\n\n          // given\n          var participant = elementRegistry.get('Participant_3');\n\n          // when\n          resize.activate(canvasEvent({ x: 500, y: 500 }), participant, 'se');\n\n          dragging.move(canvasEvent({ x: 0, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expect(participant.width).to.equal(305);\n          expect(participant.height).to.equal(143);\n        })\n      );\n\n\n      it('should snap to min dimensions + children from <nw>', inject(\n        function(dragging, elementRegistry, resize) {\n\n          // given\n          var participant = elementRegistry.get('Participant_3');\n\n          // when\n          resize.activate(canvasEvent({ x: 0, y: 0 }), participant, 'nw');\n\n          dragging.move(canvasEvent({ x: 500, y: 500 }));\n\n          dragging.end();\n\n          // then\n          expect(participant.width).to.equal(353);\n          expect(participant.height).to.equal(177);\n        })\n      );\n\n    });\n\n\n    describe('vertical minimum dimensions', function() {\n\n      var diagramXML = require('./ResizeBehavior.participant.vertical.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      it('should snap to min dimensions from <se>', inject(\n        function(dragging, elementRegistry, resize) {\n\n          // given\n          var participant = elementRegistry.get('Vertical_Participant_1');\n\n          // when\n          resize.activate(canvasEvent({ x: 500, y: 500 }), participant, 'se');\n\n          dragging.move(canvasEvent({ x: 0, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expect(participant.width).to.equal(60);\n          expect(participant.height).to.equal(300);\n        })\n      );\n\n\n      it('should snap to min dimensions from <nw>', inject(\n        function(dragging, elementRegistry, resize) {\n\n          // given\n          var participant = elementRegistry.get('Vertical_Participant_1');\n\n          // when\n          resize.activate(canvasEvent({ x: 0, y: 0 }), participant, 'nw');\n\n          dragging.move(canvasEvent({ x: 500, y: 500 }));\n\n          dragging.end();\n\n          // then\n          expect(participant.width).to.equal(60);\n          expect(participant.height).to.equal(300);\n        })\n      );\n\n\n      it('should snap to children from <se>', inject(function(dragging, elementRegistry, resize) {\n\n        // given\n        var participant = elementRegistry.get('Vertical_Participant_2');\n\n        // when\n        resize.activate(canvasEvent({ x: 500, y: 500 }), participant, 'se');\n\n        dragging.move(canvasEvent({ x: 0, y: 0 }));\n\n        dragging.end();\n\n        // then\n        expect(participant.width).to.equal(293);\n        expect(participant.height).to.equal(433);\n      }));\n\n\n      it('should snap to children from <nw>', inject(function(dragging, elementRegistry, resize) {\n\n        // given\n        var participant = elementRegistry.get('Vertical_Participant_2');\n\n        // when\n        resize.activate(canvasEvent({ x: 0, y: 0 }), participant, 'nw');\n\n        dragging.move(canvasEvent({ x: 500, y: 500 }));\n\n        dragging.end();\n\n        // then\n        expect(participant.width).to.equal(279);\n        expect(participant.height).to.equal(467);\n      }));\n\n\n      it('should snap to min dimensions + children from <se>', inject(\n        function(dragging, elementRegistry, resize) {\n\n          // given\n          var participant = elementRegistry.get('Vertical_Participant_3');\n\n          // when\n          resize.activate(canvasEvent({ x: 500, y: 500 }), participant, 'se');\n\n          dragging.move(canvasEvent({ x: 0, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expect(participant.width).to.equal(163);\n          expect(participant.height).to.equal(345);\n        })\n      );\n\n\n      it('should snap to min dimensions + children from <nw>', inject(\n        function(dragging, elementRegistry, resize) {\n\n          // given\n          var participant = elementRegistry.get('Vertical_Participant_3');\n\n          // when\n          resize.activate(canvasEvent({ x: 0, y: 0 }), participant, 'nw');\n\n          dragging.move(canvasEvent({ x: 500, y: 500 }));\n\n          dragging.end();\n\n          // then\n          expect(participant.width).to.equal(177);\n          expect(participant.height).to.equal(353);\n        })\n      );\n\n    });\n\n\n    describe('resize constraints', function() {\n\n      var diagramXML = require('./ResizeBehavior.lanes.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      it('should snap to child lanes from <nw>', inject(\n        function(dragging, elementRegistry, resize) {\n\n          // given\n          var participant = elementRegistry.get('Participant');\n\n          // when\n          resize.activate(canvasEvent({ x: 0, y: 0 }), participant, 'nw');\n\n          dragging.move(canvasEvent({ x: 500, y: 500 }));\n\n          dragging.end();\n\n          // then\n          expect(participant.width).to.equal(563);\n          expect(participant.height).to.equal(223);\n        })\n      );\n\n\n      it('should snap to nested child lanes from <se>', inject(\n        function(dragging, elementRegistry, resize) {\n\n          // given\n          var lane = elementRegistry.get('Lane_B_0');\n\n          // when\n          resize.activate(canvasEvent({ x: 0, y: 0 }), lane, 'se');\n\n          dragging.move(canvasEvent({ x: -500, y: -500 }));\n\n          dragging.end();\n\n          // then\n          expect(lane.width).to.equal(330);\n          expect(lane.height).to.equal(122);\n        })\n      );\n\n\n      it('should snap to nested child lanes from <ne>', inject(\n        function(dragging, elementRegistry, resize) {\n\n          // given\n          var lane = elementRegistry.get('Lane_A');\n\n          // when\n          resize.activate(canvasEvent({ x: 0, y: 0 }), lane, 'ne');\n\n          dragging.move(canvasEvent({ x: -500, y: 500 }));\n\n          dragging.end();\n\n          // then\n          expect(lane.width).to.equal(330);\n          expect(lane.height).to.equal(105);\n        })\n      );\n\n\n      it('should snap to nested child lanes from <sw>', inject(\n        function(dragging, elementRegistry, resize) {\n\n          // given\n          var lane = elementRegistry.get('Lane_A');\n\n          // when\n          resize.activate(canvasEvent({ x: 0, y: 0 }), lane, 'sw');\n\n          dragging.move(canvasEvent({ x: 500, y: -500 }));\n\n          dragging.end();\n\n          // then\n          expect(lane.width).to.equal(563);\n          expect(lane.height).to.equal(60);\n        })\n      );\n\n\n      it('should snap to other sibling lanes child participants from <nw>', inject(\n        function(dragging, elementRegistry, resize) {\n\n          // given\n          var lane = elementRegistry.get('Lane_B_0');\n\n          // when\n          resize.activate(canvasEvent({ x: 0, y: 0 }), lane, 'nw');\n\n          dragging.move(canvasEvent({ x: 500, y: 500 }));\n\n          dragging.end();\n\n          // then\n          expect(lane.width).to.equal(563);\n          expect(lane.height).to.equal(60);\n        })\n      );\n\n    });\n\n\n    describe('vertical resize constraints', function() {\n\n      var diagramXML = require('./ResizeBehavior.lanes.vertical.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      it('should snap to child lanes from <nw>', inject(\n        function(dragging, elementRegistry, resize) {\n\n          // given\n          var participant = elementRegistry.get('Vertical_Participant');\n\n          // when\n          resize.activate(canvasEvent({ x: 0, y: 0 }), participant, 'nw');\n\n          dragging.move(canvasEvent({ x: 500, y: 500 }));\n\n          dragging.end();\n\n          // then\n          expect(participant.width).to.equal(283);\n          expect(participant.height).to.equal(563);\n        })\n      );\n\n\n      it('should snap to nested child lanes from <se>', inject(\n        function(dragging, elementRegistry, resize) {\n\n          // given\n          var lane = elementRegistry.get('Vertical_Lane_B_0');\n\n          // when\n          resize.activate(canvasEvent({ x: 0, y: 0 }), lane, 'se');\n\n          dragging.move(canvasEvent({ x: -500, y: -500 }));\n\n          dragging.end();\n\n          // then\n          expect(lane.width).to.equal(142);\n          expect(lane.height).to.equal(330);\n        })\n      );\n\n    });\n\n  });\n\n\n  describe('sub process', function() {\n\n    var diagramXML = require('./ResizeBehavior.subProcess.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    it('should set minimum dimensions', inject(function(dragging, elementRegistry, resize) {\n\n      // given\n      var subProcess = elementRegistry.get('SubProcess');\n\n      // when\n      resize.activate(canvasEvent({ x: 0, y: 0 }), subProcess, 'se');\n\n      dragging.move(canvasEvent({ x: -400, y: -400 }));\n\n      dragging.end();\n\n      // then\n      expect(subProcess.width).to.equal(140);\n      expect(subProcess.height).to.equal(120);\n    }));\n\n  });\n\n\n  describe('text annotation', function() {\n\n    var diagramXML = require('./ResizeBehavior.textAnnotation.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    it('should set minimum dimensions', inject(function(dragging, elementRegistry, resize) {\n\n      // given\n      var textAnnotation = elementRegistry.get('TextAnnotation');\n\n      // when\n      resize.activate(canvasEvent({ x: 0, y: 0 }), textAnnotation, 'se');\n\n      dragging.move(canvasEvent({ x: -400, y: -400 }));\n\n      dragging.end();\n\n      // then\n      expect(textAnnotation.width).to.equal(50);\n      expect(textAnnotation.height).to.equal(30);\n    }));\n\n  });\n\n});\n\n\nvar LANE_MIN_HEIGHT = 60,\n    LANE_RIGHT_PADDING = 20,\n    LANE_LEFT_PADDING = 50,\n    LANE_TOP_PADDING = 20,\n    LANE_BOTTOM_PADDING = 20,\n    VERTICAL_LANE_MIN_WIDTH = 60,\n    VERTICAL_LANE_TOP_PADDING = 50,\n    VERTICAL_LANE_LEFT_PADDING = 20;\n\ndescribe('modeling/behavior - resize behavior - utilities', function() {\n\n  describe('#getParticipantResizeConstraints', function() {\n\n    describe('lanes', function() {\n\n      var diagramXML = require('./ResizeBehavior.utility.lanes.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: [ coreModule ] }));\n\n\n      it('resize participant (S)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Participant_Lane'),\n            otherLaneShape = elementRegistry.get('Lane_B');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 's');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            bottom: otherLaneShape.y + LANE_MIN_HEIGHT\n          },\n          max: {}\n        });\n\n      }));\n\n\n      it('bottom lane (S)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Lane_B'),\n            otherLaneShape = elementRegistry.get('Lane_B');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 's');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            bottom: otherLaneShape.y + LANE_MIN_HEIGHT\n          },\n          max: {}\n        });\n\n      }));\n\n\n      it('resize participant (N)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Participant_Lane'),\n            otherLaneShape = elementRegistry.get('Nested_Lane_A');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'n');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            top: otherLaneShape.y + otherLaneShape.height - LANE_MIN_HEIGHT\n          },\n          max: {}\n        });\n\n      }));\n\n\n      it('resize top lane (N)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Lane_A'),\n            otherLaneShape = elementRegistry.get('Nested_Lane_A');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'n');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            top: otherLaneShape.y + otherLaneShape.height - LANE_MIN_HEIGHT\n          },\n          max: {}\n        });\n\n      }));\n\n\n      it('resize middle lane (N)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Nested_Lane_B'),\n            aboveLaneShape = elementRegistry.get('Nested_Lane_A');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'n', true);\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            top: resizeShape.y + resizeShape.height - LANE_MIN_HEIGHT\n          },\n          max: {\n            top: aboveLaneShape.y + LANE_MIN_HEIGHT\n          }\n        });\n\n      }));\n\n\n      it('resize middle lane (S)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Nested_Lane_B'),\n            otherLaneShape = elementRegistry.get('Lane_B');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 's', true);\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            bottom: resizeShape.y + LANE_MIN_HEIGHT\n          },\n          max: {\n            bottom: otherLaneShape.y + otherLaneShape.height - LANE_MIN_HEIGHT\n          }\n        });\n\n      }));\n\n    });\n\n\n    describe('flowNodes', function() {\n\n      var diagramXML = require('./ResizeBehavior.utility.lanes-flowNodes.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: [ coreModule ] }));\n\n\n      it('resize participant (S)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Participant_Lane'),\n            taskShape = elementRegistry.get('Task');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 's');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            bottom: taskShape.y + taskShape.height + LANE_BOTTOM_PADDING\n          },\n          max: {}\n        });\n\n      }));\n\n\n      it('bottom lane (S)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Lane_B'),\n            taskShape = elementRegistry.get('Task');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 's');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            bottom: taskShape.y + taskShape.height + LANE_BOTTOM_PADDING\n          },\n          max: {}\n        });\n\n      }));\n\n\n      it('resize participant (N)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Participant_Lane'),\n            taskShape = elementRegistry.get('Task_Boundary');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'n');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            top: taskShape.y - LANE_TOP_PADDING\n          },\n          max: {}\n        });\n\n      }));\n\n\n      it('resize top lane (N)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Lane_A'),\n            taskShape = elementRegistry.get('Task_Boundary');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'n');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            top: taskShape.y - LANE_TOP_PADDING\n          },\n          max: {}\n        });\n\n      }));\n\n\n      it('resize lane (W)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Nested_Lane_B'),\n            otherShape = elementRegistry.get('Boundary_label');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'w');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            left: otherShape.x - LANE_LEFT_PADDING\n          },\n          max: { }\n        });\n\n      }));\n\n\n      it('resize lane (E)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Lane_B'),\n            otherShape = elementRegistry.get('Task');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'e');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            right: otherShape.x + otherShape.width + LANE_RIGHT_PADDING\n          },\n          max: { }\n        });\n\n      }));\n\n    });\n\n  });\n\n\n  describe('vertical #getParticipantResizeConstraints', function() {\n\n    describe('lanes', function() {\n\n      var diagramXML = require('./ResizeBehavior.utility.lanes.vertical.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: [ coreModule ] }));\n\n\n      it('resize participant (E)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Vertical_Participant_Lane'),\n            otherLaneShape = elementRegistry.get('Vertical_Lane_B');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'e');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            right: otherLaneShape.x + VERTICAL_LANE_MIN_WIDTH\n          },\n          max: {}\n        });\n\n      }));\n\n\n      it('right lane (E)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Vertical_Lane_B'),\n            otherLaneShape = elementRegistry.get('Vertical_Lane_B');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'e');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            right: otherLaneShape.x + VERTICAL_LANE_MIN_WIDTH\n          },\n          max: {}\n        });\n\n      }));\n\n\n      it('resize participant (W)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Vertical_Participant_Lane'),\n            otherLaneShape = elementRegistry.get('Nested_Vertical_Lane_A');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'w');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            left: otherLaneShape.x + otherLaneShape.width - VERTICAL_LANE_MIN_WIDTH\n          },\n          max: {}\n        });\n\n      }));\n\n\n      it('resize left lane (L)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Vertical_Lane_A'),\n            otherLaneShape = elementRegistry.get('Nested_Vertical_Lane_A');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'w');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            left: otherLaneShape.x + otherLaneShape.width - VERTICAL_LANE_MIN_WIDTH\n          },\n          max: {}\n        });\n\n      }));\n\n\n      it('resize middle lane (W)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Nested_Vertical_Lane_B'),\n            aboveLaneShape = elementRegistry.get('Nested_Vertical_Lane_A');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'w', true);\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            left: resizeShape.x + resizeShape.width - VERTICAL_LANE_MIN_WIDTH\n          },\n          max: {\n            left: aboveLaneShape.x + VERTICAL_LANE_MIN_WIDTH\n          }\n        });\n\n      }));\n\n\n      it('resize middle lane (E)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Nested_Vertical_Lane_B'),\n            otherLaneShape = elementRegistry.get('Vertical_Lane_B');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'e', true);\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            right: resizeShape.x + VERTICAL_LANE_MIN_WIDTH\n          },\n          max: {\n            right: otherLaneShape.x + otherLaneShape.width - VERTICAL_LANE_MIN_WIDTH\n          }\n        });\n\n      }));\n\n    });\n\n\n    describe('flowNodes', function() {\n\n      var diagramXML = require('./ResizeBehavior.utility.lanes.vertical-flowNodes.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: [ coreModule ] }));\n\n\n      it('resize participant (E)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Vertical_Participant_Lane'),\n            taskShape = elementRegistry.get('Task');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'e');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            right: taskShape.x + taskShape.width + LANE_RIGHT_PADDING\n          },\n          max: {}\n        });\n\n      }));\n\n\n      it('right lane (E)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Vertical_Lane_B'),\n            taskShape = elementRegistry.get('Task');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'e');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            right: taskShape.x + taskShape.width + LANE_RIGHT_PADDING\n          },\n          max: {}\n        });\n\n      }));\n\n\n      it('left lane (E)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Vertical_Lane_A'),\n            nestedLaneShape = elementRegistry.get('Nested_Vertical_Lane_B');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'e');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            right: nestedLaneShape.x + VERTICAL_LANE_MIN_WIDTH\n          },\n          max: {}\n        });\n\n      }));\n\n\n      it('nested left lane (E)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Nested_Vertical_Lane_A');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'e');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            right: resizeShape.x + VERTICAL_LANE_MIN_WIDTH\n          },\n          max: {}\n        });\n\n      }));\n\n\n      it('resize participant (W)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Vertical_Participant_Lane'),\n            taskShape = elementRegistry.get('Task_Boundary');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'w');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            left: taskShape.x - VERTICAL_LANE_LEFT_PADDING\n          },\n          max: {}\n        });\n\n      }));\n\n\n      it('resize left lane (W)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Vertical_Lane_A'),\n            taskShape = elementRegistry.get('Task_Boundary');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'w');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            left: taskShape.x - VERTICAL_LANE_LEFT_PADDING\n          },\n          max: {}\n        });\n\n      }));\n\n\n      it('resize lane (N)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Nested_Vertical_Lane_B'),\n            otherShape = elementRegistry.get('Boundary_label');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 'n');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            top: otherShape.y - VERTICAL_LANE_TOP_PADDING\n          },\n          max: { }\n        });\n\n      }));\n\n\n      it('resize lane (S)', inject(function(elementRegistry) {\n\n        // given\n        var resizeShape = elementRegistry.get('Vertical_Lane_B'),\n            otherShape = elementRegistry.get('Task');\n\n        // when\n        var sizeConstraints = getParticipantResizeConstraints(resizeShape, 's');\n\n        // then\n        expect(sizeConstraints).to.eql({\n          min: {\n            bottom: otherShape.y + otherShape.height + LANE_BOTTOM_PADDING\n          },\n          max: { }\n        });\n\n      }));\n\n    });\n\n  });\n\n\n  describe('LaneUtil', function() {\n\n    describe('lane minimum dimensions', function() {\n\n      var diagramXML = require('./ResizeBehavior.utility.lanes.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      it('should hold for top sibling lane', inject(\n        function(dragging, elementRegistry, resize) {\n\n          // given\n          var lane = elementRegistry.get('Nested_Lane_B');\n          var topSiblingLane = elementRegistry.get('Nested_Lane_A');\n\n          // when\n          resize.activate(canvasEvent({ x: 0, y: 0 }), lane, 'n');\n\n          dragging.move(canvasEvent({ x: 0, y: -500 }));\n\n          dragging.end();\n\n          // then\n          expect(lane.height).to.equal(301);\n          expect(topSiblingLane.height).to.equal(60);\n        })\n      );\n\n\n      it('should hold for bottom sibling lane', inject(\n        function(dragging, elementRegistry, resize) {\n\n          // given\n          var lane = elementRegistry.get('Nested_Lane_B');\n          var bottomSiblingLane = elementRegistry.get('Lane_B');\n\n          // when\n          resize.activate(canvasEvent({ x: 0, y: 0 }), lane, 's');\n\n          dragging.move(canvasEvent({ x: 0, y: 500 }));\n\n          dragging.end();\n\n          // then\n          expect(lane.height).to.equal(292);\n          expect(bottomSiblingLane.height).to.equal(60);\n        })\n      );\n\n    });\n\n\n    describe('vertical lane minimum dimensions', function() {\n\n      var diagramXML = require('./ResizeBehavior.utility.lanes.vertical.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      it('should hold for left sibling lane', inject(\n        function(dragging, elementRegistry, resize) {\n\n          // given\n          var lane = elementRegistry.get('Nested_Vertical_Lane_B');\n          var leftSiblingLane = elementRegistry.get('Nested_Vertical_Lane_A');\n\n          // when\n          resize.activate(canvasEvent({ x: 0, y: 0 }), lane, 'w');\n\n          dragging.move(canvasEvent({ x: -500, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expect(lane.width).to.equal(301);\n          expect(leftSiblingLane.width).to.equal(60);\n        })\n      );\n\n\n      it('should hold for right sibling lane', inject(\n        function(dragging, elementRegistry, resize) {\n\n          // given\n          var lane = elementRegistry.get('Nested_Vertical_Lane_B');\n          var rightSiblingLane = elementRegistry.get('Vertical_Lane_B');\n\n          // when\n          resize.activate(canvasEvent({ x: 0, y: 0 }), lane, 'e');\n\n          dragging.move(canvasEvent({ x: 500, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expect(lane.width).to.equal(292);\n          expect(rightSiblingLane.width).to.equal(60);\n        })\n      );\n\n    });\n\n  });\n\n});"
  },
  {
    "path": "test/spec/features/modeling/behavior/RootElementReferenceBehavior.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:camunda=\"http://camunda.org/schema/1.0/bpmn\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.6.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:task id=\"Task_1\" />\n    <bpmn:boundaryEvent id=\"MessageBoundaryEvent_1\" attachedToRef=\"Task_1\">\n      <bpmn:messageEventDefinition messageRef=\"Message_1\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"EscalationBoundaryEvent_1\" attachedToRef=\"Task_1\">\n      <bpmn:escalationEventDefinition escalationRef=\"Escalation_1\" camunda:escalationCodeVariable=\"foo\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"ErrorBoundaryEvent_1\" attachedToRef=\"Task_1\">\n      <bpmn:errorEventDefinition errorRef=\"Error_1\" camunda:errorCodeVariable=\"foo\" camunda:errorMessageVariable=\"bar\" />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"SignalBoundaryEvent_1\" attachedToRef=\"Task_1\">\n      <bpmn:signalEventDefinition signalRef=\"Signal_1\" />\n    </bpmn:boundaryEvent>\n    <bpmn:receiveTask id=\"ReceiveTask\" messageRef=\"Message_2\" />\n    <bpmn:receiveTask id=\"ReceiveTask_noRef\" />\n    <bpmn:task id=\"Task_2\" />\n    <bpmn:sendTask id=\"SendTask\" messageRef=\"Message_3\" />\n    <bpmn:sendTask id=\"SendTask_noRef\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent\" attachedToRef=\"Task_2\" />\n  </bpmn:process>\n  <bpmn:message id=\"Message_1\" name=\"Message_1\" />\n  <bpmn:escalation id=\"Escalation_1\" name=\"Escalation_1\" escalationCode=\"42\" />\n  <bpmn:error id=\"Error_1\" name=\"Error_1\" errorCode=\"1\" />\n  <bpmn:signal id=\"Signal_1\" name=\"Signal_1\" />\n  <bpmn:message id=\"Message_2\" name=\"Message_2\" />\n  <bpmn:message id=\"Message_3\" name=\"Message_3\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"170\" y=\"60\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ReceiveTask_di\" bpmnElement=\"ReceiveTask\">\n        <dc:Bounds x=\"170\" y=\"220\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ReceiveTask_noRef_di\" bpmnElement=\"ReceiveTask_noRef\">\n        <dc:Bounds x=\"170\" y=\"320\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"370\" y=\"60\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SendTask_1y80j0q_di\" bpmnElement=\"SendTask\">\n        <dc:Bounds x=\"370\" y=\"220\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SendTask_noRef_di\" bpmnElement=\"SendTask_noRef\">\n        <dc:Bounds x=\"370\" y=\"320\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1b2yxlf_di\" bpmnElement=\"BoundaryEvent\">\n        <dc:Bounds x=\"452\" y=\"122\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SignalBoundaryEvent_1_di\" bpmnElement=\"SignalBoundaryEvent_1\">\n        <dc:Bounds x=\"252\" y=\"122\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ErrorBoundaryEvent_1_di\" bpmnElement=\"ErrorBoundaryEvent_1\">\n        <dc:Bounds x=\"152\" y=\"42\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EscalationBoundaryEvent_1_di\" bpmnElement=\"EscalationBoundaryEvent_1\">\n        <dc:Bounds x=\"252\" y=\"42\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"MessageBoundaryEvent_1_di\" bpmnElement=\"MessageBoundaryEvent_1\">\n        <dc:Bounds x=\"152\" y=\"122\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/RootElementReferenceBehaviorSpec.js",
    "content": "import {\r\n  bootstrapModeler,\r\n  getBpmnJS,\r\n  inject\r\n} from 'test/TestHelper';\r\n\r\nimport coreModule from 'lib/core';\r\nimport modelingModule from 'lib/features/modeling';\r\n\r\nimport {\r\n  getBusinessObject,\r\n  is\r\n} from 'lib/util/ModelUtil';\r\n\r\nimport {\r\n  remove as collectionRemove\r\n} from 'diagram-js/lib/util/Collections';\r\n\r\nimport {\r\n  filter,\r\n  find,\r\n  forEach,\r\n  matchPattern\r\n} from 'min-dash';\r\n\r\nvar testModules = [\r\n  coreModule,\r\n  modelingModule\r\n];\r\n\r\n\r\ndescribe('features/modeling - root element reference behavior', function() {\r\n\r\n  var diagramXML = require('./RootElementReferenceBehavior.bpmn');\r\n\r\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\r\n\r\n\r\n  describe('add root element', function() {\r\n\r\n    forEach([\r\n      'error',\r\n      'escalation',\r\n      'message',\r\n      'signal'\r\n    ], function(type) {\r\n\r\n      describe(type, function() {\r\n\r\n        var id = capitalizeFirstChar(type) + 'BoundaryEvent_1';\r\n\r\n        var boundaryEvent,\r\n            host,\r\n            rootElement,\r\n            pastedRootElement;\r\n\r\n        describe('should add a copy', function() {\r\n\r\n          beforeEach(inject(function(bpmnjs, copyPaste, elementRegistry, modeling) {\r\n\r\n            // given\r\n            boundaryEvent = elementRegistry.get(id);\r\n\r\n            host = elementRegistry.get('Task_2');\r\n\r\n            var businessObject = getBusinessObject(boundaryEvent),\r\n                eventDefinitions = businessObject.get('eventDefinitions'),\r\n                eventDefinition = eventDefinitions[ 0 ];\r\n\r\n            rootElement = getRootElementReferenced(eventDefinition);\r\n\r\n            // when\r\n            copyPaste.copy(boundaryEvent);\r\n\r\n            modeling.removeShape(boundaryEvent);\r\n\r\n            collectionRemove(bpmnjs.getDefinitions().get('rootElements'), rootElement);\r\n\r\n            expect(hasRootElement(rootElement)).to.be.false;\r\n\r\n            boundaryEvent = copyPaste.paste({\r\n              element: host,\r\n              point: {\r\n                x: host.x,\r\n                y: host.y\r\n              },\r\n              hints: {\r\n                attach: 'attach'\r\n              }\r\n            })[0];\r\n\r\n            businessObject = getBusinessObject(boundaryEvent);\r\n            pastedRootElement = getRootElementReferenced(\r\n              businessObject.get('eventDefinitions')[ 0 ]\r\n            );\r\n          }));\r\n\r\n\r\n          it('<do>', function() {\r\n\r\n            // then\r\n            expect(hasRootElement(rootElement)).to.be.false;\r\n            expect(hasRootElement(pastedRootElement)).to.be.true;\r\n\r\n            // no garbage attached to element\r\n            expect(boundaryEvent.referencedRootElements).not.to.exist;\r\n          });\r\n\r\n\r\n          it('<undo>', inject(function(commandStack) {\r\n\r\n            // when\r\n            commandStack.undo();\r\n\r\n            // then\r\n            expect(hasRootElement(rootElement)).to.be.false;\r\n            expect(hasRootElement(pastedRootElement)).to.be.false;\r\n          }));\r\n\r\n\r\n          it('<redo>', inject(function(commandStack) {\r\n\r\n            // given\r\n            commandStack.undo();\r\n\r\n            // when\r\n            commandStack.redo();\r\n\r\n            // then\r\n            expect(hasRootElement(rootElement)).to.be.false;\r\n            expect(hasRootElement(pastedRootElement)).to.be.true;\r\n\r\n            // no garbage attached to element\r\n            expect(boundaryEvent.referencedRootElements).not.to.exist;\r\n          }));\r\n\r\n        });\r\n\r\n\r\n        it('should NOT add', inject(function(bpmnFactory, bpmnjs, copyPaste, elementRegistry, moddleCopy, modeling) {\r\n\r\n          // given\r\n          boundaryEvent = elementRegistry.get(id);\r\n\r\n          host = elementRegistry.get('Task_2');\r\n\r\n          var businessObject = getBusinessObject(boundaryEvent),\r\n              eventDefinitions = businessObject.get('eventDefinitions'),\r\n              eventDefinition = eventDefinitions[ 0 ],\r\n              rootElements = bpmnjs.getDefinitions().get('rootElements');\r\n\r\n          rootElement = getRootElementReferenced(eventDefinition);\r\n\r\n          var rootElementsOfTypeCount = filter(\r\n            rootElements, matchPattern({ $type: rootElement.$type })\r\n          ).length;\r\n\r\n          copyPaste.copy(boundaryEvent);\r\n\r\n          modeling.removeShape(boundaryEvent);\r\n\r\n          collectionRemove(rootElements, rootElement);\r\n\r\n          expect(hasRootElement(rootElement)).to.be.false;\r\n\r\n          var rootElementWithSameId = bpmnFactory.create(rootElement.$type);\r\n\r\n          moddleCopy.copyElement(rootElement, rootElementWithSameId);\r\n\r\n          collectionRemove(rootElements, rootElementWithSameId);\r\n\r\n          // when\r\n          boundaryEvent = copyPaste.paste({\r\n            element: host,\r\n            point: {\r\n              x: host.x,\r\n              y: host.y\r\n            },\r\n            hints: {\r\n              attach: 'attach'\r\n            }\r\n          })[0];\r\n\r\n          // then\r\n          var rootElementsOfType = filter(rootElements, matchPattern({ $type: rootElement.$type }));\r\n\r\n          expect(rootElementsOfType).to.have.lengthOf(rootElementsOfTypeCount);\r\n        }));\r\n\r\n      });\n\r\n\r\n      describe(`${type} (modeling#updateProperties)`, function() {\r\n\r\n        var boundaryEvent,\r\n            rootElement;\r\n\r\n        describe('should add root element if not added to diagram', function() {\r\n\r\n          beforeEach(inject(function(bpmnFactory, elementRegistry, modeling) {\r\n\r\n            // given\r\n            boundaryEvent = elementRegistry.get('BoundaryEvent');\r\n            rootElement = bpmnFactory.create(`bpmn:${capitalizeFirstChar(type)}`);\r\n            var eventDefinition = bpmnFactory.create(`bpmn:${capitalizeFirstChar(type)}EventDefinition`, {\r\n              [`${type}Ref`]: rootElement\r\n            });\r\n\r\n            // when\r\n            modeling.updateProperties(boundaryEvent, {\r\n              eventDefinitions: [\r\n                eventDefinition\r\n              ]\r\n            });\r\n          }));\r\n\r\n\r\n          it('<do>', function() {\r\n\r\n            // then\r\n            expect(hasRootElement(rootElement)).to.be.true;\r\n\r\n            // no garbage attached to element\r\n            expect(boundaryEvent.referencedRootElements).not.to.exist;\r\n          });\r\n\r\n\r\n          it('<undo>', inject(function(commandStack) {\r\n\r\n            // when\r\n            commandStack.undo();\r\n\r\n            // then\r\n            expect(hasRootElement(rootElement)).to.be.false;\r\n\r\n            // no garbage attached to element\r\n            expect(boundaryEvent.referencedRootElements).not.to.exist;\r\n          }));\r\n\r\n\r\n          it('<redo>', inject(function(commandStack) {\r\n\r\n            // given\r\n            commandStack.undo();\r\n\r\n            // when\r\n            commandStack.redo();\r\n\r\n            // then\r\n            expect(hasRootElement(rootElement)).to.be.true;\r\n\r\n            // no garbage attached to element\r\n            expect(boundaryEvent.referencedRootElements).not.to.exist;\r\n          }));\r\n\r\n        });\r\n\r\n\r\n        it('should NOT add root element to root elements if already present', inject(function(\r\n            bpmnFactory, bpmnjs, elementRegistry, modeling) {\r\n\r\n          // given\r\n          var rootElements = bpmnjs.getDefinitions().get('rootElements');\r\n          boundaryEvent = elementRegistry.get('BoundaryEvent');\r\n          rootElement = rootElements.find(matchPattern({ id: `${capitalizeFirstChar(type)}_1` }));\r\n\r\n          var rootElementsOfTypeCount = filter(\r\n            rootElements, matchPattern({ $type: rootElement.$type })\r\n          ).length;\r\n\r\n          var eventDefinition = bpmnFactory.create(`bpmn:${capitalizeFirstChar(type)}EventDefinition`, {\r\n            [`${type}Ref`]: rootElement\r\n          });\r\n\r\n\r\n          // when\r\n          modeling.updateProperties(boundaryEvent, {\r\n            eventDefinitions: [\r\n              eventDefinition\r\n            ]\r\n          });\r\n\r\n          // then\r\n          var rootElementsOfType = filter(rootElements, matchPattern({ $type: rootElement.$type }));\r\n\r\n          expect(rootElementsOfType).to.have.lengthOf(rootElementsOfTypeCount);\r\n        }));\r\n\r\n      });\n\r\n\r\n      describe(`${type} (modeling#updateModdleProperties)`, function() {\r\n\r\n        var boundaryEvent,\r\n            rootElement;\r\n\r\n        describe('should add root element if not added to diagram', function() {\r\n\r\n          beforeEach(inject(function(bpmnFactory, elementRegistry, modeling) {\r\n\r\n            // given\r\n            boundaryEvent = elementRegistry.get('BoundaryEvent');\r\n            rootElement = bpmnFactory.create(`bpmn:${capitalizeFirstChar(type)}`);\r\n            var bo = getBusinessObject(boundaryEvent);\r\n            var eventDefinition = bpmnFactory.create(`bpmn:${capitalizeFirstChar(type)}EventDefinition`, {\r\n              [`${type}Ref`]: rootElement\r\n            });\r\n\r\n            // when\r\n            modeling.updateModdleProperties(boundaryEvent, bo, {\r\n              eventDefinitions: [\r\n                eventDefinition\r\n              ]\r\n            });\r\n          }));\r\n\r\n\r\n          it('<do>', function() {\r\n\r\n            // then\r\n            expect(hasRootElement(rootElement)).to.be.true;\r\n\r\n            // no garbage attached to element\r\n            expect(boundaryEvent.referencedRootElements).not.to.exist;\r\n          });\r\n\r\n\r\n          it('<undo>', inject(function(commandStack) {\r\n\r\n            // when\r\n            commandStack.undo();\r\n\r\n            // then\r\n            expect(hasRootElement(rootElement)).to.be.false;\r\n\r\n            // no garbage attached to element\r\n            expect(boundaryEvent.referencedRootElements).not.to.exist;\r\n          }));\r\n\r\n\r\n          it('<redo>', inject(function(commandStack) {\r\n\r\n            // given\r\n            commandStack.undo();\r\n\r\n            // when\r\n            commandStack.redo();\r\n\r\n            // then\r\n            expect(hasRootElement(rootElement)).to.be.true;\r\n\r\n            // no garbage attached to element\r\n            expect(boundaryEvent.referencedRootElements).not.to.exist;\r\n          }));\r\n\r\n        });\r\n\r\n\r\n        it('should NOT add root element to root elements if already present', inject(function(\r\n            bpmnFactory, bpmnjs, elementRegistry, modeling) {\r\n\r\n          // given\r\n          var rootElements = bpmnjs.getDefinitions().get('rootElements');\r\n          boundaryEvent = elementRegistry.get('BoundaryEvent');\r\n          rootElement = rootElements.find(matchPattern({ id: `${capitalizeFirstChar(type)}_1` }));\r\n\r\n          var rootElementsOfTypeCount = filter(\r\n            rootElements, matchPattern({ $type: rootElement.$type })\r\n          ).length;\r\n\r\n          var bo = getBusinessObject(boundaryEvent);\r\n          var eventDefinition = bpmnFactory.create(`bpmn:${capitalizeFirstChar(type)}EventDefinition`, {\r\n            [`${type}Ref`]: rootElement\r\n          });\r\n\r\n\r\n          // when\r\n          modeling.updateProperties(boundaryEvent, bo, {\r\n            eventDefinitions: [\r\n              eventDefinition\r\n            ]\r\n          });\r\n\r\n          // then\r\n          var rootElementsOfType = filter(rootElements, matchPattern({ $type: rootElement.$type }));\r\n\r\n          expect(rootElementsOfType).to.have.lengthOf(rootElementsOfTypeCount);\r\n        }));\r\n\r\n      });\r\n\r\n    });\r\n\r\n\r\n    describe('receive and send task', function() {\r\n\r\n      forEach([\r\n        'ReceiveTask',\r\n        'SendTask'\r\n      ], function(type) {\r\n\r\n        var id = type;\r\n\r\n        var task,\r\n            rootElement,\r\n            pastedRootElement;\r\n\r\n        describe('should add a copy', function() {\r\n\r\n          beforeEach(inject(function(bpmnjs, copyPaste, elementRegistry, modeling, canvas) {\r\n\r\n            // given\r\n            task = elementRegistry.get(id);\r\n\r\n            var businessObject = getBusinessObject(task),\r\n                rootElement = businessObject.messageRef;\r\n\r\n            // when\r\n            copyPaste.copy(task);\r\n\r\n            modeling.removeShape(task);\r\n\r\n            collectionRemove(bpmnjs.getDefinitions().get('rootElements'), rootElement);\r\n\r\n            expect(hasRootElement(rootElement)).to.be.false;\r\n\r\n            task = copyPaste.paste({\r\n              element: canvas.getRootElement(),\r\n              point: {\r\n                x: task.x,\r\n                y: task.y + 200\r\n              }\r\n            })[0];\r\n\r\n            businessObject = getBusinessObject(task);\r\n            pastedRootElement = businessObject.messageRef;\r\n          }));\r\n\r\n\r\n          it('<do>', function() {\r\n\r\n            // then\r\n            expect(hasRootElement(rootElement)).to.be.false;\r\n            expect(hasRootElement(pastedRootElement)).to.be.true;\r\n          });\r\n\r\n\r\n          it('<undo>', inject(function(commandStack) {\r\n\r\n            // when\r\n            commandStack.undo();\r\n\r\n            // then\r\n            expect(hasRootElement(rootElement)).to.be.false;\r\n            expect(hasRootElement(pastedRootElement)).to.be.false;\r\n          }));\r\n\r\n\r\n          it('<redo>', inject(function(commandStack) {\r\n\r\n            // given\r\n            commandStack.undo();\r\n\r\n            // when\r\n            commandStack.redo();\r\n\r\n            // then\r\n            expect(hasRootElement(rootElement)).to.be.false;\r\n            expect(hasRootElement(pastedRootElement)).to.be.true;\r\n          }));\r\n\r\n        });\r\n\r\n\r\n        it('should NOT add', inject(function(\r\n            bpmnFactory, bpmnjs, copyPaste, elementRegistry, moddleCopy, modeling, canvas\r\n        ) {\r\n\r\n          // given\r\n          task = elementRegistry.get(id);\r\n\r\n          var businessObject = getBusinessObject(task),\r\n              rootElement = businessObject.messageRef,\r\n              rootElements = bpmnjs.getDefinitions().get('rootElements');\r\n\r\n          var rootElementsOfTypeCount = filter(\r\n            rootElements, matchPattern({ $type: rootElement.$type })\r\n          ).length;\r\n\r\n          copyPaste.copy(task);\r\n\r\n          modeling.removeShape(task);\r\n\r\n          collectionRemove(rootElements, rootElement);\r\n\r\n          expect(hasRootElement(rootElement)).to.be.false;\r\n\r\n          var rootElementWithSameId = bpmnFactory.create(rootElement.$type);\r\n\r\n          moddleCopy.copyElement(rootElement, rootElementWithSameId);\r\n\r\n          collectionRemove(rootElements, rootElementWithSameId);\r\n\r\n          // when\r\n          task = copyPaste.paste({\r\n            element: canvas.getRootElement(),\r\n            point: {\r\n              x: task.x,\r\n              y: task.y + 200\r\n            }\r\n          })[0];\r\n\r\n          // then\r\n          var rootElementsOfType = filter(rootElements, matchPattern({ $type: rootElement.$type }));\r\n\r\n          expect(rootElementsOfType).to.have.lengthOf(rootElementsOfTypeCount);\r\n        }));\r\n      });\r\n\r\n\r\n      describe('modeling#updateProperties', function() {\r\n        forEach([\r\n          'ReceiveTask_noRef',\r\n          'SendTask_noRef'\r\n        ], function(type) {\r\n\r\n          var id = type;\r\n\r\n          var task,\r\n              rootElement;\r\n\r\n          describe('should add on modeling#updateProperties', function() {\r\n\r\n\r\n            beforeEach(inject(function(bpmnFactory, elementRegistry, modeling) {\r\n\r\n              // given\r\n              task = elementRegistry.get(id);\r\n\r\n              rootElement = bpmnFactory.create('bpmn:Message', { id: 'NewMessage' });\r\n\r\n              // when\r\n              modeling.updateProperties(task, {\r\n                messageRef: rootElement,\r\n              });\r\n            }));\r\n\r\n\r\n            it('<do>', function() {\r\n\r\n              // then\r\n              expect(hasRootElement(rootElement)).to.be.true;\r\n            });\r\n\r\n\r\n            it('<undo>', inject(function(commandStack) {\r\n\r\n              // when\r\n              commandStack.undo();\r\n\r\n              // then\r\n              expect(hasRootElement(rootElement)).to.be.false;\r\n            }));\r\n\r\n\r\n            it('<redo>', inject(function(commandStack) {\r\n\r\n              // given\r\n              commandStack.undo();\r\n\r\n              // when\r\n              commandStack.redo();\r\n\r\n              // then\r\n              expect(hasRootElement(rootElement)).to.be.true;\r\n            }));\r\n          });\r\n\r\n\r\n          it('should NOT add message to root elements if already present', inject(function(\r\n              bpmnjs, elementRegistry, modeling\r\n          ) {\r\n\r\n            // given\r\n            task = elementRegistry.get(id);\r\n            var bo = getBusinessObject(task);\r\n\r\n            var rootElements = bpmnjs.getDefinitions().get('rootElements');\r\n            var message = rootElements.find(matchPattern({ id: 'Message_2' }));\r\n\r\n            var rootElementsOfTypeCount = filter(\r\n              rootElements, matchPattern({ $type: 'bpmn:Message' })\r\n            ).length;\r\n\r\n            // when\r\n            modeling.updateProperties(task, {\r\n              messageRef: message,\r\n            });\r\n\r\n            // then\r\n            var rootElementsOfType = filter(rootElements, matchPattern({ $type: 'bpmn:Message' }));\r\n            expect(rootElementsOfType).to.have.lengthOf(rootElementsOfTypeCount);\r\n            expect(bo.get('messageRef')).to.eq(message);\r\n          }));\r\n        });\r\n      });\r\n\r\n\r\n      describe('modeling#updateModdleProperties', function() {\r\n        forEach([\r\n          'ReceiveTask_noRef',\r\n          'SendTask_noRef'\r\n        ], function(type) {\r\n\r\n          var id = type;\r\n\r\n          var task,\r\n              rootElement;\r\n\r\n\r\n          describe('should add message to root elements', function() {\r\n\r\n\r\n            beforeEach(inject(function(bpmnFactory, elementRegistry, modeling) {\r\n\r\n              // given\r\n              task = elementRegistry.get(id);\r\n              var bo = getBusinessObject(task);\r\n\r\n              rootElement = bpmnFactory.create('bpmn:Message', { id: 'NewMessage' });\r\n\r\n              // when\r\n              modeling.updateModdleProperties(task, bo, {\r\n                messageRef: rootElement,\r\n              });\r\n            }));\r\n\r\n\r\n            it('<do>', function() {\r\n\r\n              // then\r\n              expect(hasRootElement(rootElement)).to.be.true;\r\n            });\r\n\r\n\r\n            it('<undo>', inject(function(commandStack) {\r\n\r\n              // when\r\n              commandStack.undo();\r\n\r\n              // then\r\n              expect(hasRootElement(rootElement)).to.be.false;\r\n            }));\r\n\r\n\r\n            it('<redo>', inject(function(commandStack) {\r\n\r\n              // given\r\n              commandStack.undo();\r\n\r\n              // when\r\n              commandStack.redo();\r\n\r\n              // then\r\n              expect(hasRootElement(rootElement)).to.be.true;\r\n            }));\r\n          });\r\n\r\n\r\n          it('should NOT add message to root elements if already present', inject(function(\r\n              bpmnjs, elementRegistry, modeling\r\n          ) {\r\n\r\n            // given\r\n            task = elementRegistry.get(id);\r\n            var bo = getBusinessObject(task);\r\n\r\n            var rootElements = bpmnjs.getDefinitions().get('rootElements');\r\n            var message = rootElements.find(matchPattern({ id: 'Message_2' }));\r\n\r\n            var rootElementsOfTypeCount = filter(\r\n              rootElements, matchPattern({ $type: 'bpmn:Message' })\r\n            ).length;\r\n\r\n            // when\r\n            modeling.updateModdleProperties(task, bo, {\r\n              messageRef: message,\r\n            });\r\n\r\n            // then\r\n            var rootElementsOfType = filter(rootElements, matchPattern({ $type: 'bpmn:Message' }));\r\n            expect(rootElementsOfType).to.have.lengthOf(rootElementsOfTypeCount);\r\n            expect(bo.get('messageRef')).to.eq(message);\r\n          }));\r\n        });\r\n      });\r\n    });\r\n\r\n  });\r\n\r\n\r\n  describe('copy root element reference', function() {\r\n\r\n    forEach([\r\n      'error',\r\n      'escalation',\r\n      'message',\r\n      'signal'\r\n    ], function(type) {\r\n\r\n      describe(type, function() {\r\n\r\n        var id = capitalizeFirstChar(type) + 'BoundaryEvent_1';\r\n\r\n        var boundaryEvent,\r\n            host,\r\n            rootElement;\r\n\r\n        beforeEach(inject(function(copyPaste, elementRegistry) {\r\n\r\n          // given\r\n          boundaryEvent = elementRegistry.get(id);\r\n\r\n          host = elementRegistry.get('Task_2');\r\n\r\n          var businessObject = getBusinessObject(boundaryEvent),\r\n              eventDefinitions = businessObject.get('eventDefinitions'),\r\n              eventDefinition = eventDefinitions[ 0 ];\r\n\r\n          rootElement = getRootElementReferenced(eventDefinition);\r\n\r\n          copyPaste.copy(boundaryEvent);\r\n\r\n          // when\r\n          boundaryEvent = copyPaste.paste({\r\n            element: host,\r\n            point: {\r\n              x: host.x,\r\n              y: host.y\r\n            },\r\n            hints: {\r\n              attach: 'attach'\r\n            }\r\n          })[0];\r\n        }));\r\n\r\n\r\n        it('should copy root element reference', function() {\r\n\r\n          // then\r\n          var businessObject = getBusinessObject(boundaryEvent),\r\n              eventDefinitions = businessObject.get('eventDefinitions'),\r\n              eventDefinition = eventDefinitions[ 0 ];\r\n\r\n          expect(getRootElementReferenced(eventDefinition)).to.equal(rootElement);\r\n        });\r\n\r\n      });\r\n\r\n    });\r\n\r\n\r\n    describe('receive and send task', function() {\r\n\r\n      forEach([\r\n        'ReceiveTask',\r\n        'SendTask'\r\n      ], function(type) {\r\n\r\n        var id = type,\r\n            task,\r\n            rootElement;\r\n\r\n        beforeEach(inject(function(copyPaste, elementRegistry, canvas) {\r\n\r\n          // given\r\n          task = elementRegistry.get(id);\r\n\r\n          var businessObject = getBusinessObject(task);\r\n\r\n          rootElement = businessObject.messageRef;\r\n\r\n          copyPaste.copy(task);\r\n\r\n          // when\r\n          task = copyPaste.paste({\r\n            element: canvas.getRootElement(),\r\n            point: {\r\n              x: task.x,\r\n              y: task.y + 200,\r\n            }\r\n          })[0];\r\n        }));\r\n\r\n\r\n        it('should copy root element reference', function() {\r\n\r\n          // then\r\n          var businessObject = getBusinessObject(task),\r\n              copiedRootElement = businessObject.messageRef;\r\n\r\n          expect(copiedRootElement).to.equal(rootElement);\r\n        });\r\n      });\r\n    });\r\n\r\n  });\r\n\r\n});\r\n\r\n// helpers //////////\r\n\r\nfunction getRootElementReferenced(eventDefinition) {\r\n  if (is(eventDefinition, 'bpmn:ErrorEventDefinition')) {\r\n    return eventDefinition.get('errorRef');\r\n  } else if (is(eventDefinition, 'bpmn:EscalationEventDefinition')) {\r\n    return eventDefinition.get('escalationRef');\r\n  } else if (is(eventDefinition, 'bpmn:MessageEventDefinition')) {\r\n    return eventDefinition.get('messageRef');\r\n  } else if (is(eventDefinition, 'bpmn:SignalEventDefinition')) {\r\n    return eventDefinition.get('signalRef');\r\n  }\r\n}\r\n\r\nfunction hasRootElement(rootElement) {\r\n  var definitions = getBpmnJS().getDefinitions(),\r\n      rootElements = definitions.get('rootElements');\r\n\r\n  return !!rootElement && !!find(rootElements, matchPattern({ id: rootElement.id }));\r\n}\r\n\r\nfunction capitalizeFirstChar(string) {\r\n  return string.charAt(0).toUpperCase() + string.slice(1);\r\n}"
  },
  {
    "path": "test/spec/features/modeling/behavior/SetCompensationActivityAfterPasteBehaviorSpec.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.25.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"Event_0wuaar2\">\n      <bpmn:outgoing>Flow_1ank1yi</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Compensation_Boundary_Task\">\n      <bpmn:incoming>Flow_1ank1yi</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"Flow_1ank1yi\" sourceRef=\"Event_0wuaar2\" targetRef=\"Compensation_Boundary_Task\" />\n    <bpmn:boundaryEvent id=\"Compensation_Boundary_Event\" attachedToRef=\"Compensation_Boundary_Task\">\n      <bpmn:compensateEventDefinition id=\"CompensateEventDefinition_0ibh5ku\" />\n    </bpmn:boundaryEvent>\n    <bpmn:task id=\"Compensation_Activity\" isForCompensation=\"true\" />\n    <bpmn:association id=\"Association_0x72gur\" associationDirection=\"One\" sourceRef=\"Compensation_Boundary_Event\" targetRef=\"Compensation_Activity\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Event_0wuaar2_di\" bpmnElement=\"Event_0wuaar2\">\n        <dc:Bounds x=\"152\" y=\"112\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Compensation_Boundary_Task_di\" bpmnElement=\"Compensation_Boundary_Task\">\n        <dc:Bounds x=\"240\" y=\"90\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Compensation_Activity_di\" bpmnElement=\"Compensation_Activity\">\n        <dc:Bounds x=\"370\" y=\"210\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_0x72gur_di\" bpmnElement=\"Association_0x72gur\">\n        <di:waypoint x=\"300\" y=\"188\" />\n        <di:waypoint x=\"300\" y=\"250\" />\n        <di:waypoint x=\"370\" y=\"250\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Event_0njauji_di\" bpmnElement=\"Compensation_Boundary_Event\">\n        <dc:Bounds x=\"282\" y=\"152\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1ank1yi_di\" bpmnElement=\"Flow_1ank1yi\">\n        <di:waypoint x=\"188\" y=\"130\" />\n        <di:waypoint x=\"240\" y=\"130\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/SetCompensationActivityAfterPasteBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\nimport { is } from 'lib/util/ModelUtil';\nimport copyPasteModule from 'lib/features/copy-paste';\n\nimport diagramXML from './SetCompensationActivityAfterPasteBehaviorSpec.bpmn';\n\n\ndescribe('features/modeling/behavior - compensation activity after paste', function() {\n\n  const testModules = [\n    copyPasteModule,\n    coreModule,\n    modelingModule\n  ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  describe('copy/paste compensation activity', function() {\n\n    it('without boundary event', inject(function(canvas, elementRegistry, copyPaste) {\n\n      // given\n      copyPaste.copy([ elementRegistry.get('Compensation_Activity') ]);\n\n      // when\n      var copiedElements = copyPaste.paste({\n        element: canvas.getRootElement(),\n        point: {\n          x: 100,\n          y: 100\n        }\n      });\n\n      // then\n      expect(copiedElements).to.have.lengthOf(1);\n      const taskElement = copiedElements.find(element => is(element, 'bpmn:Task'));\n      expect(taskElement.businessObject.isForCompensation).to.be.false;\n    }));\n\n\n    it('with boundary event', inject(function(canvas, elementRegistry, copyPaste) {\n\n      // given\n      copyPaste.copy([\n        elementRegistry.get('Compensation_Boundary_Task'),\n        elementRegistry.get('Compensation_Activity') ]);\n\n      // when\n      var copiedElements = copyPaste.paste({\n        element: canvas.getRootElement(),\n        point: {\n          x: 100,\n          y: 100\n        }\n      });\n\n      // then\n      expect(copiedElements).to.have.lengthOf(4);\n      expect(copiedElements.filter(element => is(element, 'bpmn:Association'))).to.have.length(1);\n      expect(copiedElements.filter(element => is(element, 'bpmn:BoundaryEvent'))).to.have.length(1);\n      expect(copiedElements.filter(element => is(element, 'bpmn:Task'))).to.have.length(2);\n\n      // verify that for every Task element, if businessObject.isForCompensation exists, it should be true\n      copiedElements.filter(element => is(element, 'bpmn:Task')).forEach(taskElement => {\n        if (Object.prototype.hasOwnProperty.call(taskElement.businessObject, 'isForCompensation')) {\n          expect(taskElement.businessObject.isForCompensation).to.be.true;\n        }\n      });\n    }));\n\n  });\n\n});"
  },
  {
    "path": "test/spec/features/modeling/behavior/SpaceToolBehaviorSpec.group.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_1bsm0aq\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.2.0\" modeler:executionPlatform=\"Camunda Cloud\" modeler:executionPlatformVersion=\"8.0.0\">\n  <bpmn:process id=\"Process_1v1lzam\" isExecutable=\"true\">\n    <bpmn:group id=\"Group_1\" categoryValueRef=\"CategoryValue_19s935a\" />\n  </bpmn:process>\n  <bpmn:category id=\"Category_1yvllu8\">\n    <bpmn:categoryValue id=\"CategoryValue_19s935a\" value=\"Group_1\" />\n  </bpmn:category>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1v1lzam\">\n      <bpmndi:BPMNShape id=\"Group_0h8w4ep_di\" bpmnElement=\"Group_1\">\n        <dc:Bounds x=\"160\" y=\"110\" width=\"300\" height=\"300\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"289\" y=\"117\" width=\"43\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/SpaceToolBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\nimport rulesModule from 'lib/features/rules';\nimport snappingModule from 'lib/features/snapping';\nimport spaceToolModule from 'diagram-js/lib/features/space-tool';\n\nimport {\n  createCanvasEvent as canvasEvent\n} from '../../../../util/MockEvents';\n\nimport {\n  GROUP_MIN_DIMENSIONS,\n  LANE_MIN_DIMENSIONS,\n  PARTICIPANT_MIN_DIMENSIONS,\n  VERTICAL_LANE_MIN_DIMENSIONS,\n  VERTICAL_PARTICIPANT_MIN_DIMENSIONS,\n  SUB_PROCESS_MIN_DIMENSIONS\n} from 'lib/features/modeling/behavior/ResizeBehavior';\n\nvar testModules = [\n  coreModule,\n  modelingModule,\n  rulesModule,\n  snappingModule,\n  spaceToolModule\n];\n\n\ndescribe('features/modeling - space tool behavior', function() {\n\n  describe('subprocess', function() {\n\n    describe('minimum dimensions', function() {\n\n      var diagramXML = require('./SpaceToolBehaviorSpec.subprocess.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      it('should ensure subprocess minimum dimensions', inject(\n        function(dragging, elementRegistry, spaceTool) {\n\n          // given\n          var subProcess = elementRegistry.get('SubProcess_1');\n\n          // when\n          spaceTool.activateMakeSpace(canvasEvent({ x: 300, y: 0 }));\n\n          dragging.move(canvasEvent({ x: 0, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expect(subProcess.width).to.equal(SUB_PROCESS_MIN_DIMENSIONS.width);\n        })\n      );\n\n    });\n\n  });\n\n\n  describe('participant', function() {\n\n    describe('minimum dimensions', function() {\n\n      var diagramXML = require('./SpaceToolBehaviorSpec.participant.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      it('should ensure participant minimum width', inject(\n        function(dragging, elementRegistry, spaceTool) {\n\n          // given\n          var participant = elementRegistry.get('Participant_1');\n\n          // when\n          spaceTool.activateMakeSpace(canvasEvent({ x: 300, y: 0 }));\n\n          dragging.move(canvasEvent({ x: -200, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expect(participant.width).to.equal(PARTICIPANT_MIN_DIMENSIONS.width);\n        })\n      );\n\n\n      it('should ensure participant minimum height', inject(\n        function(dragging, elementRegistry, spaceTool) {\n\n          // given\n          var participant = elementRegistry.get('Participant_1');\n\n          // when\n          spaceTool.activateMakeSpace(canvasEvent({ x: 0, y: 100 }));\n\n          dragging.move(canvasEvent({ x: 0, y: -400 }));\n\n          dragging.end();\n\n          // then\n          expect(participant.height).to.equal(PARTICIPANT_MIN_DIMENSIONS.height);\n        })\n      );\n\n\n      it('should ensure lane minimum width', inject(\n        function(dragging, elementRegistry, spaceTool) {\n\n          // given\n          var participant = elementRegistry.get('Participant_2');\n          var lane = elementRegistry.get('Lane_1');\n\n          // when\n          spaceTool.activateMakeSpace(canvasEvent({ x: 1200, y: 0 }));\n\n          dragging.move(canvasEvent({ x: 0, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expect(lane.width).to.equal(LANE_MIN_DIMENSIONS.width);\n          expect(participant.width).to.equal(LANE_MIN_DIMENSIONS.width + 30);\n        })\n      );\n\n\n      it('should ensure lane minimum height', inject(\n        function(dragging, elementRegistry, spaceTool) {\n\n          // given\n          var lane = elementRegistry.get('Lane_1');\n\n          // when\n          spaceTool.activateMakeSpace(canvasEvent({ x: 0, y: 400 }));\n\n          dragging.move(canvasEvent({ x: 0, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expect(lane.height).to.equal(LANE_MIN_DIMENSIONS.height);\n        })\n      );\n\n\n      it('should ensure nested lane minimum height', inject(\n        function(dragging, elementRegistry, spaceTool) {\n\n          // given\n          var lane = elementRegistry.get('Lane_6');\n\n          // when\n          spaceTool.activateMakeSpace(canvasEvent({ x: 0, y: 925 }));\n\n          dragging.move(canvasEvent({ x: 0, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expect(lane.height).to.equal(LANE_MIN_DIMENSIONS.height);\n        })\n      );\n\n    });\n\n  });\n\n\n  describe('vertical participant', function() {\n\n    describe('minimum dimensions', function() {\n\n      var diagramXML = require('./SpaceToolBehaviorSpec.participant.vertical.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      it('should ensure participant minimum height', inject(\n        function(dragging, elementRegistry, spaceTool) {\n\n          // given\n          var participant = elementRegistry.get('Vertical_Participant_1');\n\n          // when\n          spaceTool.activateMakeSpace(canvasEvent({ x: 0, y: 300 }));\n\n          dragging.move(canvasEvent({ x: 0, y: -200 }));\n\n          dragging.end();\n\n          // then\n          expect(participant.height).to.equal(VERTICAL_PARTICIPANT_MIN_DIMENSIONS.height);\n        })\n      );\n\n\n      it('should ensure participant minimum width', inject(\n        function(dragging, elementRegistry, spaceTool) {\n\n          // given\n          var participant = elementRegistry.get('Vertical_Participant_1');\n\n          // when\n          spaceTool.activateMakeSpace(canvasEvent({ x: 100, y: 0 }));\n\n          dragging.move(canvasEvent({ x: -400, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expect(participant.width).to.equal(VERTICAL_PARTICIPANT_MIN_DIMENSIONS.width);\n        })\n      );\n\n\n      it('should ensure lane minimum height', inject(\n        function(dragging, elementRegistry, spaceTool) {\n\n          // given\n          var participant = elementRegistry.get('Vertical_Participant_2');\n          var lane = elementRegistry.get('Vertical_Lane_1');\n\n          // when\n          spaceTool.activateMakeSpace(canvasEvent({ x: 0, y: 1200 }));\n\n          dragging.move(canvasEvent({ x: 0, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expect(lane.height).to.equal(VERTICAL_LANE_MIN_DIMENSIONS.height);\n          expect(participant.height).to.equal(VERTICAL_LANE_MIN_DIMENSIONS.height + 30);\n        })\n      );\n\n\n      it('should ensure lane minimum width', inject(\n        function(dragging, elementRegistry, spaceTool) {\n\n          // given\n          var lane = elementRegistry.get('Vertical_Lane_1');\n\n          // when\n          spaceTool.activateMakeSpace(canvasEvent({ x: 400, y: 0 }));\n\n          dragging.move(canvasEvent({ x: 0, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expect(lane.width).to.equal(VERTICAL_LANE_MIN_DIMENSIONS.width);\n        })\n      );\n\n\n      it('should ensure nested lane minimum width', inject(\n        function(dragging, elementRegistry, spaceTool) {\n\n          // given\n          var lane = elementRegistry.get('V_Lane_6');\n\n          // when\n          spaceTool.activateMakeSpace(canvasEvent({ x: 925, y: 0 }));\n\n          dragging.move(canvasEvent({ x: 0, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expect(lane.width).to.equal(VERTICAL_LANE_MIN_DIMENSIONS.width);\n        })\n      );\n\n    });\n\n  });\n\n\n  describe('group', function() {\n\n    describe('minimum dimensions', function() {\n\n      var diagramXML = require('./SpaceToolBehaviorSpec.group.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      it('should ensure group minimum dimensions', inject(\n        function(dragging, elementRegistry, spaceTool) {\n\n          // given\n          var group = elementRegistry.get('Group_1');\n\n          // when\n          spaceTool.activateMakeSpace(canvasEvent({ x: 450, y: 0 }));\n\n          dragging.move(canvasEvent({ x: 0, y: 0 }));\n\n          dragging.end();\n\n          // then\n          expect(group.width).to.equal(GROUP_MIN_DIMENSIONS.width);\n        })\n      );\n\n    });\n\n  });\n\n});"
  },
  {
    "path": "test/spec/features/modeling/behavior/SpaceToolBehaviorSpec.participant.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_0mdr1un\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.7.0\">\n  <bpmn:collaboration id=\"Collaboration_1\">\n    <bpmn:participant id=\"Participant_1\" name=\"Participant_1\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Participant_2\" name=\"Participant_2\" processRef=\"Process_2\" />\n    <bpmn:participant id=\"Participant_3\" name=\"Participant_3\" processRef=\"Process_3\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\" />\n  <bpmn:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn:laneSet id=\"LaneSet_16fkurg\">\n      <bpmn:lane id=\"Lane_1\" name=\"Lane_1\" />\n      <bpmn:lane id=\"Lane_2\" name=\"Lane_2\" />\n    </bpmn:laneSet>\n  </bpmn:process>\n  <bpmn:process id=\"Process_3\" isExecutable=\"false\">\n    <bpmn:laneSet id=\"LaneSet_04c016w\">\n      <bpmn:lane id=\"Lane_3\" name=\"Lane_3\" />\n      <bpmn:lane id=\"Lane_4\" name=\"Lane_4\">\n        <bpmn:childLaneSet id=\"LaneSet_1eow6b9\">\n          <bpmn:lane id=\"Lane_5\" name=\"Lane_5\" />\n          <bpmn:lane id=\"Lane_6\" name=\"Lane_6\" />\n        </bpmn:childLaneSet>\n      </bpmn:lane>\n    </bpmn:laneSet>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_06757og_di\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"0\" y=\"0\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_0ae1cne_di\" bpmnElement=\"Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"700\" y=\"350\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_030yoo3_di\" bpmnElement=\"Lane_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"730\" y=\"350\" width=\"570\" height=\"130\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1bwlv2s_di\" bpmnElement=\"Lane_2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"730\" y=\"480\" width=\"570\" height=\"120\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_01wmlzw_di\" bpmnElement=\"Participant_3\" isHorizontal=\"true\">\n        <dc:Bounds x=\"1400\" y=\"700\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0jco8kr_di\" bpmnElement=\"Lane_3\" isHorizontal=\"true\">\n        <dc:Bounds x=\"1430\" y=\"700\" width=\"570\" height=\"125\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0zojmuw_di\" bpmnElement=\"Lane_4\" isHorizontal=\"true\">\n        <dc:Bounds x=\"1430\" y=\"825\" width=\"570\" height=\"125\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1xlpjnj_di\" bpmnElement=\"Lane_5\" isHorizontal=\"true\">\n        <dc:Bounds x=\"1460\" y=\"825\" width=\"540\" height=\"63\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0k03ea4_di\" bpmnElement=\"Lane_6\" isHorizontal=\"true\">\n        <dc:Bounds x=\"1460\" y=\"888\" width=\"540\" height=\"62\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/SpaceToolBehaviorSpec.participant.vertical.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_0mdr2un\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.7.0\">\n  <bpmn:collaboration id=\"Collaboration_1\">\n    <bpmn:participant id=\"Vertical_Participant_1\" name=\"Vertical_Participant_1\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Vertical_Participant_2\" name=\"Vertical_Participant_2\" processRef=\"Process_2\" />\n    <bpmn:participant id=\"Vertical_Participant_3\" name=\"Vertical_Participant_3\" processRef=\"Process_3\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\" />\n  <bpmn:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn:laneSet id=\"LaneSet_17fkurg\">\n      <bpmn:lane id=\"Vertical_Lane_1\" name=\"Vertical_Lane_1\" />\n      <bpmn:lane id=\"Vertical_Lane_2\" name=\"Vertical_Lane_2\" />\n    </bpmn:laneSet>\n  </bpmn:process>\n  <bpmn:process id=\"Process_3\" isExecutable=\"false\">\n    <bpmn:laneSet id=\"LaneSet_04c017w\">\n      <bpmn:lane id=\"Vertical_Lane_3\" name=\"Vertical_Lane_3\" />\n      <bpmn:lane id=\"Vertical_Lane_4\" name=\"Vertical_Lane_4\">\n        <bpmn:childLaneSet id=\"LaneSet_1eow6b9\">\n          <bpmn:lane id=\"V_Lane_5\" name=\"V_Lane_5\" />\n          <bpmn:lane id=\"V_Lane_6\" name=\"V_Lane_6\" />\n        </bpmn:childLaneSet>\n      </bpmn:lane>\n    </bpmn:laneSet>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPVertical_Lane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_06757og_di\" bpmnElement=\"Vertical_Participant_1\" isHorizontal=\"false\">\n        <dc:Bounds x=\"0\" y=\"0\" width=\"250\" height=\"600\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_0ae1cne_di\" bpmnElement=\"Vertical_Participant_2\" isHorizontal=\"false\">\n        <dc:Bounds x=\"350\" y=\"700\" width=\"250\" height=\"600\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_030yoo3_di\" bpmnElement=\"Vertical_Lane_1\" isHorizontal=\"false\">\n        <dc:Bounds x=\"350\" y=\"730\" width=\"130\" height=\"570\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Vertical_Lane_1bwlv2s_di\" bpmnElement=\"Vertical_Lane_2\" isHorizontal=\"false\">\n        <dc:Bounds x=\"480\" y=\"730\" width=\"120\" height=\"570\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_01wmlzw_di\" bpmnElement=\"Vertical_Participant_3\" isHorizontal=\"false\">\n        <dc:Bounds x=\"700\" y=\"1400\" width=\"250\" height=\"600\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0jco8kr_di\" bpmnElement=\"Vertical_Lane_3\" isHorizontal=\"false\">\n        <dc:Bounds x=\"700\" y=\"1430\" width=\"125\" height=\"570\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0zojmuw_di\" bpmnElement=\"Vertical_Lane_4\" isHorizontal=\"false\">\n        <dc:Bounds x=\"825\" y=\"1430\" width=\"125\" height=\"570\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Vertical_Lane_1xlpjnj_di\" bpmnElement=\"V_Lane_5\" isHorizontal=\"false\">\n        <dc:Bounds x=\"825\" y=\"1460\" width=\"63\" height=\"540\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0k03ea4_di\" bpmnElement=\"V_Lane_6\" isHorizontal=\"false\">\n        <dc:Bounds x=\"888\" y=\"1460\" width=\"62\" height=\"540\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/SpaceToolBehaviorSpec.subprocess.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1ev9p7s\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.5.0\">\n  <bpmn:process id=\"Process_1msk4wr\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"SubProcess_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1msk4wr\">\n      <bpmndi:BPMNShape id=\"SubProcess_04mmoqh_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"0\" y=\"0\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/SubProcessBehavior.copy-paste.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.2.1\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:laneSet />\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <bpmn:subProcess id=\"SubProcess_2\">\n        <bpmn:multiInstanceLoopCharacteristics isSequential=\"true\" />\n        <bpmn:startEvent id=\"StartEvent_1\" name=\"hello\">\n          <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n        </bpmn:startEvent>\n        <bpmn:endEvent id=\"EndEvent_1\" name=\"world!\">\n          <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n        </bpmn:endEvent>\n        <bpmn:task id=\"Task_1\" name=\"wait for it..\" default=\"SequenceFlow_2\">\n          <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n          <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n          <bpmn:outgoing>SequenceFlow_3</bpmn:outgoing>\n        </bpmn:task>\n        <bpmn:sequenceFlow id=\"SequenceFlow_2\" name=\"\" sourceRef=\"Task_1\" targetRef=\"EndEvent_1\" />\n        <bpmn:sequenceFlow id=\"SequenceFlow_1\" name=\"blah\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n        <bpmn:boundaryEvent id=\"BoundaryEvent_2\" attachedToRef=\"Task_1\">\n          <bpmn:timerEventDefinition />\n        </bpmn:boundaryEvent>\n        <bpmn:boundaryEvent id=\"BoundaryEvent_1\" attachedToRef=\"Task_1\">\n          <bpmn:messageEventDefinition />\n        </bpmn:boundaryEvent>\n        <bpmn:intermediateThrowEvent id=\"IntermediateThrowEvent_1\">\n          <bpmn:incoming>SequenceFlow_3</bpmn:incoming>\n        </bpmn:intermediateThrowEvent>\n        <bpmn:sequenceFlow id=\"SequenceFlow_3\" sourceRef=\"Task_1\" targetRef=\"IntermediateThrowEvent_1\">\n          <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">foo</bpmn:conditionExpression>\n        </bpmn:sequenceFlow>\n      </bpmn:subProcess>\n      <bpmn:textAnnotation id=\"TextAnnotation_1\">\n        <bpmn:text>foo</bpmn:text>\n      </bpmn:textAnnotation>\n      <bpmn:association id=\"Association_1f53xbo\" sourceRef=\"SubProcess_2\" targetRef=\"TextAnnotation_1\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"SubProcess_3\">\n      <bpmn:subProcess id=\"Activity_1ee0a66\">\n        <bpmn:multiInstanceLoopCharacteristics isSequential=\"true\" />\n        <bpmn:startEvent id=\"Event_1b2gd6e\" name=\"hello\">\n          <bpmn:outgoing>Flow_0jd8k12</bpmn:outgoing>\n        </bpmn:startEvent>\n        <bpmn:endEvent id=\"Event_1dv9cu8\" name=\"world!\">\n          <bpmn:incoming>Flow_0d51bg2</bpmn:incoming>\n        </bpmn:endEvent>\n        <bpmn:task id=\"Activity_1joj57w\" name=\"wait for it..\" default=\"Flow_0d51bg2\">\n          <bpmn:incoming>Flow_0jd8k12</bpmn:incoming>\n          <bpmn:outgoing>Flow_0fotq2x</bpmn:outgoing>\n          <bpmn:outgoing>Flow_0d51bg2</bpmn:outgoing>\n        </bpmn:task>\n        <bpmn:intermediateThrowEvent id=\"Event_17rtxbp\">\n          <bpmn:incoming>Flow_0fotq2x</bpmn:incoming>\n        </bpmn:intermediateThrowEvent>\n        <bpmn:boundaryEvent id=\"Event_0pxvi7j\" attachedToRef=\"Activity_1joj57w\">\n          <bpmn:messageEventDefinition id=\"MessageEventDefinition_1qw0h7u\" />\n        </bpmn:boundaryEvent>\n        <bpmn:boundaryEvent id=\"Event_180mojf\" attachedToRef=\"Activity_1joj57w\">\n          <bpmn:timerEventDefinition id=\"TimerEventDefinition_070cdk8\" />\n        </bpmn:boundaryEvent>\n        <bpmn:sequenceFlow id=\"Flow_0fotq2x\" sourceRef=\"Activity_1joj57w\" targetRef=\"Event_17rtxbp\">\n          <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">foo</bpmn:conditionExpression>\n        </bpmn:sequenceFlow>\n        <bpmn:sequenceFlow id=\"Flow_0jd8k12\" name=\"blah\" sourceRef=\"Event_1b2gd6e\" targetRef=\"Activity_1joj57w\" />\n        <bpmn:sequenceFlow id=\"Flow_0d51bg2\" name=\"\" sourceRef=\"Activity_1joj57w\" targetRef=\"Event_1dv9cu8\" />\n      </bpmn:subProcess>\n      <bpmn:textAnnotation id=\"TextAnnotation_0zlz2tq\">\n        <bpmn:text>foo</bpmn:text>\n      </bpmn:textAnnotation>\n      <bpmn:association id=\"Association_0kvpg31\" sourceRef=\"Activity_1ee0a66\" targetRef=\"TextAnnotation_0zlz2tq\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_1kd6ist_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"156\" y=\"34\" width=\"613\" height=\"372\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_0gev7mx_di\" bpmnElement=\"SubProcess_2\" isExpanded=\"true\">\n        <dc:Bounds x=\"215\" y=\"118\" width=\"461\" height=\"259\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_07vo2r8_di\" bpmnElement=\"SequenceFlow_3\">\n        <di:waypoint x=\"411\" y=\"256\" />\n        <di:waypoint x=\"411\" y=\"305\" />\n        <di:waypoint x=\"526\" y=\"305\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"381\" y=\"250.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1rtr33r_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"271\" y=\"216\" />\n        <di:waypoint x=\"361\" y=\"216\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"305\" y=\"321\" width=\"21\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0y69l8f_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint x=\"461\" y=\"216\" />\n        <di:waypoint x=\"611\" y=\"216\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"421\" y=\"166\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"235\" y=\"198\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"241\" y=\"149\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_0yejuvr_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"611\" y=\"198\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"615\" y=\"272\" width=\"29\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1fo63a7_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"361\" y=\"176\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_09kpyzx_di\" bpmnElement=\"IntermediateThrowEvent_1\">\n        <dc:Bounds x=\"526\" y=\"287\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"431\" y=\"323\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1404oxd_di\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds x=\"343\" y=\"238\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"248\" y=\"274\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1c94bi9_di\" bpmnElement=\"BoundaryEvent_2\">\n        <dc:Bounds x=\"443\" y=\"238\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"348\" y=\"274\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_0h1hhgg_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"632\" y=\"58\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_1f53xbo_di\" bpmnElement=\"Association_1f53xbo\">\n        <di:waypoint x=\"663\" y=\"118\" />\n        <di:waypoint x=\"649\" y=\"88\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"SubProcess_3_di\" bpmnElement=\"SubProcess_3\" isExpanded=\"false\" $type=\"bpmndi:BPMNShape\" businessObject=\"[object Object]\">\n        <dc:Bounds x=\"155.5\" y=\"430\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1k76h3w\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_121uvzu\" bpmnElement=\"SubProcess_3\">\n      <bpmndi:BPMNShape id=\"TextAnnotation_0zlz2tq_di\" bpmnElement=\"TextAnnotation_0zlz2tq\" $type=\"bpmndi:BPMNShape\" businessObject=\"[object Object]\">\n        <dc:Bounds x=\"597\" y=\"160\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1ee0a66_di\" bpmnElement=\"Activity_1ee0a66\" isExpanded=\"true\" $type=\"bpmndi:BPMNShape\" businessObject=\"[object Object]\">\n        <dc:Bounds x=\"180\" y=\"220\" width=\"461\" height=\"259\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_0fotq2x_di\" bpmnElement=\"Flow_0fotq2x\" $type=\"bpmndi:BPMNEdge\" businessObject=\"[object Object]\">\n        <di:waypoint x=\"376\" y=\"358\" />\n        <di:waypoint x=\"376\" y=\"407\" />\n        <di:waypoint x=\"491\" y=\"407\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"381\" y=\"250.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0jd8k12_di\" bpmnElement=\"Flow_0jd8k12\" $type=\"bpmndi:BPMNEdge\" businessObject=\"[object Object]\">\n        <di:waypoint x=\"236\" y=\"318\" />\n        <di:waypoint x=\"326\" y=\"318\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"270\" y=\"423\" width=\"21\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0d51bg2_di\" bpmnElement=\"Flow_0d51bg2\" $type=\"bpmndi:BPMNEdge\" businessObject=\"[object Object]\">\n        <di:waypoint x=\"426\" y=\"318\" />\n        <di:waypoint x=\"576\" y=\"318\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"421\" y=\"166\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Event_1b2gd6e_di\" bpmnElement=\"Event_1b2gd6e\" $type=\"bpmndi:BPMNShape\" businessObject=\"[object Object]\">\n        <dc:Bounds x=\"200\" y=\"300\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"206\" y=\"251\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1dv9cu8_di\" bpmnElement=\"Event_1dv9cu8\" $type=\"bpmndi:BPMNShape\" businessObject=\"[object Object]\">\n        <dc:Bounds x=\"576\" y=\"300\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"580\" y=\"374\" width=\"30\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1joj57w_di\" bpmnElement=\"Activity_1joj57w\" $type=\"bpmndi:BPMNShape\" businessObject=\"[object Object]\">\n        <dc:Bounds x=\"326\" y=\"278\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_17rtxbp_di\" bpmnElement=\"Event_17rtxbp\" $type=\"bpmndi:BPMNShape\" businessObject=\"[object Object]\">\n        <dc:Bounds x=\"491\" y=\"389\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"431\" y=\"323\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0pxvi7j_di\" bpmnElement=\"Event_0pxvi7j\" $type=\"bpmndi:BPMNShape\" businessObject=\"[object Object]\">\n        <dc:Bounds x=\"308\" y=\"340\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"248\" y=\"274\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_180mojf_di\" bpmnElement=\"Event_180mojf\" $type=\"bpmndi:BPMNShape\" businessObject=\"[object Object]\">\n        <dc:Bounds x=\"408\" y=\"340\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"348\" y=\"274\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_0kvpg31_di\" bpmnElement=\"Association_0kvpg31\" $type=\"bpmndi:BPMNEdge\" businessObject=\"[object Object]\">\n        <di:waypoint x=\"628\" y=\"220\" />\n        <di:waypoint x=\"614\" y=\"190\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/SubProcessBehavior.multiple-planes.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_007va6i\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.2.0-dev\">\n  <bpmn:process id=\"Process_1giw3j5\" isExecutable=\"true\">\n    <bpmn:task id=\"Task_1\" />\n    <bpmn:subProcess id=\"SubProcess_1\" />\n    <bpmn:subProcess id=\"SubProcess_2\" name=\"Collapsed Nested\">\n      <bpmn:subProcess id=\"Activity_0xa1lp6\">\n        <bpmn:task id=\"nested_task\" />\n      </bpmn:subProcess>\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1giw3j5\">\n      <bpmndi:BPMNShape id=\"Task_07xra8r_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"156\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_01nq2r1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"160\" y=\"280\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1t6m7ms_di\" bpmnElement=\"SubProcess_2\">\n        <dc:Bounds x=\"310\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1pythet\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0bbk4a7\" bpmnElement=\"SubProcess_2\">\n      <bpmndi:BPMNShape id=\"Activity_0dirtvd_di\" bpmnElement=\"Activity_0xa1lp6\">\n        <dc:Bounds x=\"150\" y=\"120\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_0rferxm\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0nr9ud3\" bpmnElement=\"Activity_0xa1lp6\">\n      <bpmndi:BPMNShape id=\"nested_task_di\" bpmnElement=\"nested_task\">\n        <dc:Bounds x=\"140\" y=\"110\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>"
  },
  {
    "path": "test/spec/features/modeling/behavior/SubProcessBehavior.nested-subprocess-annotations.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.0.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <bpmn:subProcess id=\"SubProcess_2\">\n        <bpmn:startEvent id=\"StartEvent_1\" name=\"start\" />\n        <bpmn:task id=\"Task_1\" name=\"task 1\" />\n      </bpmn:subProcess>\n    </bpmn:subProcess>\n    <bpmn:textAnnotation id=\"TextAnnotation_1\">\n      <bpmn:text>Annotation sample</bpmn:text>\n    </bpmn:textAnnotation>\n    <bpmn:textAnnotation id=\"TextAnnotation_2\">\n      <bpmn:text>Subprocess annotation</bpmn:text>\n    </bpmn:textAnnotation>\n    <bpmn:association id=\"Association_1\" associationDirection=\"None\" sourceRef=\"Task_1\" targetRef=\"TextAnnotation_1\" />\n    <bpmn:association id=\"Association_2\" associationDirection=\"None\" sourceRef=\"SubProcess_1\" targetRef=\"TextAnnotation_2\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"160\" y=\"80\" width=\"500\" height=\"300\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_2_di\" bpmnElement=\"SubProcess_2\" isExpanded=\"true\">\n        <dc:Bounds x=\"200\" y=\"120\" width=\"300\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"220\" y=\"202\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"226\" y=\"245\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"260\" y=\"180\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_1_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"700\" y=\"100\" width=\"100\" height=\"41\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_2_di\" bpmnElement=\"TextAnnotation_2\">\n        <dc:Bounds x=\"700\" y=\"250\" width=\"100\" height=\"41\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_1_di\" bpmnElement=\"Association_1\">\n        <di:waypoint x=\"360\" y=\"200\" />\n        <di:waypoint x=\"700\" y=\"115\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Association_2_di\" bpmnElement=\"Association_2\">\n        <di:waypoint x=\"660\" y=\"280\" />\n        <di:waypoint x=\"700\" y=\"271\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/SubProcessBehavior.planes.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_007va6i\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.2.0\">\n  <bpmn:process id=\"Process_1giw3j5\" isExecutable=\"true\">\n    <bpmn:task id=\"Task_1\" />\n    <bpmn:subProcess id=\"SubProcess_1\" />\n    <bpmn:subProcess id=\"SubProcess_2\">\n      <bpmn:startEvent id=\"StartEvent_1\" name=\"StartEvent_1\">\n        <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n      </bpmn:startEvent>\n      <bpmn:task id=\"Task_2\">\n        <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n      </bpmn:task>\n      <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"Task_2\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1giw3j5\">\n      <bpmndi:BPMNShape id=\"Task_07xra8r_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"156\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_01nq2r1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"160\" y=\"280\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_169gyur_di\" bpmnElement=\"SubProcess_2\" isExpanded=\"true\">\n        <dc:Bounds x=\"160\" y=\"550\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1660c5c_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"236\" y=\"650\" />\n        <di:waypoint x=\"290\" y=\"650\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Event_017zosw_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"200\" y=\"632\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"187\" y=\"675\" width=\"64\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_05ptqa9_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"290\" y=\"610\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/SubProcessBehavior.start-event.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_007va6i\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.2.0-dev\">\n  <bpmn:process id=\"Process_1giw3j5\" isExecutable=\"true\">\n    <bpmn:task id=\"Task_1\" />\n    <bpmn:callActivity id=\"CallActivity_1\" />\n    <bpmn:subProcess id=\"SubProcess_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1giw3j5\">\n      <bpmndi:BPMNShape id=\"Task_07xra8r_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"156\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n     <bpmndi:BPMNShape id=\"Activity_1o55kco_di\" bpmnElement=\"CallActivity_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"285\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_01nq2r1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"160\" y=\"280\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/SubProcessPlaneBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\nimport replaceModule from 'lib/features/replace';\nimport bpmnCopyPasteModule from 'lib/features/copy-paste';\nimport copyPasteModule from 'diagram-js/lib/features/copy-paste';\n\nimport { is } from 'lib/util/ModelUtil';\nimport { keys } from 'min-dash';\n\ndescribe('features/modeling/behavior - subprocess planes', function() {\n\n  var diagramXML = require('./SubProcessBehavior.planes.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: [\n      coreModule,\n      modelingModule,\n      replaceModule\n    ]\n  }));\n\n\n  describe('create', function() {\n\n    it('should create new diagram for collapsed subprocess', inject(function(elementFactory, modeling, canvas, bpmnjs) {\n\n      // given\n      var subProcess = elementFactory.createShape({\n        type: 'bpmn:SubProcess',\n        isExpanded: false\n      });\n\n      // when\n      modeling.createShape(subProcess, { x: 300, y: 300 }, canvas.getRootElement());\n\n      // then\n      var diagrams = bpmnjs.getDefinitions().diagrams;\n      expect(diagrams).to.have.length(2);\n      expect(canvas.findRoot(planeId(subProcess))).to.exist;\n    }));\n\n\n    it('should not create new plane for expanded subprocess', inject(function(elementFactory, modeling, canvas, bpmnjs) {\n\n      // given\n      var subProcess = elementFactory.createShape({\n        type: 'bpmn:SubProcess',\n        isExpanded: true\n      });\n\n      // when\n      modeling.createShape(subProcess, { x: 300, y: 300 }, canvas.getRootElement());\n\n      // then\n      var diagrams = bpmnjs.getDefinitions().diagrams;\n      expect(diagrams).to.have.length(1);\n      expect(canvas.findRoot(planeId(subProcess))).to.not.exist;\n    }));\n\n\n    it('should move children to plane for collapsed subprocess', inject(function(elementFactory, modeling, canvas, bpmnjs) {\n\n      // given\n      var subProcess = elementFactory.createShape({\n        type: 'bpmn:SubProcess',\n        isExpanded: false\n      });\n\n      var child = elementFactory.createShape({\n        type: 'bpmn:Task',\n        parent: subProcess\n      });\n\n      // when\n      modeling.createElements([ subProcess, child ], { x: 300, y: 300 }, canvas.getRootElement());\n\n      // then\n      var diagrams = bpmnjs.getDefinitions().diagrams;\n      var newPlane = canvas.findRoot(planeId(subProcess));\n      expect(diagrams.length).to.equal(2);\n      expect(newPlane).to.exist;\n      expect(child.parent).to.equal(newPlane);\n    }));\n\n\n    it('should move labels to plane for collapsed subprocess', inject(\n      function(canvas, bpmnReplace, elementRegistry, modeling) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n            startEvent = elementRegistry.get('StartEvent_1'),\n            subProcess = elementRegistry.get('SubProcess_2'),\n            task = elementRegistry.get('Task_2');\n\n        // moving label will set its parent to root element\n        modeling.moveShape(startEvent.label, { x: 0, y: 100 }, subProcess);\n\n        // assume\n        expect(sequenceFlow.parent).to.equal(subProcess);\n        expect(startEvent.parent).to.equal(subProcess);\n        expect(startEvent.label.parent).to.equal(canvas.getRootElement());\n        expect(task.parent).to.equal(subProcess);\n\n        // when\n        bpmnReplace.replaceElement(subProcess, {\n          type: 'bpmn:SubProcess',\n          isExpanded: false\n        });\n\n        // then\n        var plane = elementRegistry.get('SubProcess_2_plane');\n\n        expect(sequenceFlow.parent).to.equal(plane);\n        expect(startEvent.parent).to.equal(plane);\n        expect(startEvent.label.parent).to.equal(plane);\n        expect(task.parent).to.equal(plane);\n      }\n    ));\n\n\n    it('should undo', inject(function(elementFactory, modeling, commandStack, canvas, bpmnjs) {\n\n      // given\n      var subProcess = elementFactory.createShape({\n        type: 'bpmn:SubProcess',\n        isExpanded: false\n      });\n      modeling.createShape(subProcess, { x: 300, y: 300 }, canvas.getRootElement());\n\n      // when\n      commandStack.undo();\n\n      // then\n      var diagrams = bpmnjs.getDefinitions().diagrams;\n      expect(diagrams).to.have.length(1);\n      expect(canvas.findRoot(planeId(subProcess))).to.not.exist;\n    }));\n\n\n    it('should redo', inject(function(elementFactory, modeling, commandStack, canvas, bpmnjs) {\n\n      // given\n      var subProcess = elementFactory.createShape({\n        type: 'bpmn:SubProcess',\n        isExpanded: false\n      });\n      modeling.createShape(subProcess, { x: 300, y: 300 }, canvas.getRootElement());\n      var plane = canvas.findRoot(planeId(subProcess));\n\n      // when\n      commandStack.undo();\n      commandStack.redo();\n\n      // then\n      var diagrams = bpmnjs.getDefinitions().diagrams;\n      expect(diagrams).to.have.length(2);\n      expect(canvas.findRoot(planeId(subProcess))).to.exist;\n      expect(canvas.findRoot(planeId(subProcess))).to.equal(plane);\n    }));\n\n  });\n\n\n  describe('annotations', function() {\n\n    var nestedAnnotationsXML = require('./SubProcessBehavior.nested-subprocess-annotations.bpmn');\n\n    beforeEach(bootstrapModeler(nestedAnnotationsXML, {\n      modules: [\n        coreModule,\n        modelingModule,\n        replaceModule\n      ]\n    }));\n\n\n    it('should move annotation to plane when collapsed', inject(\n      function(canvas, bpmnReplace, elementRegistry) {\n\n        // given\n        var subProcess = elementRegistry.get('SubProcess_1'),\n            annotation = elementRegistry.get('TextAnnotation_1'),\n            association = elementRegistry.get('Association_1'),\n            subProcessAnnotation = elementRegistry.get('TextAnnotation_2'),\n            subProcessAssociation = elementRegistry.get('Association_2'),\n            startEvent = elementRegistry.get('StartEvent_1');\n\n        // assume\n        expect(annotation.parent).to.equal(canvas.getRootElement());\n        expect(startEvent.label).to.exist;\n\n        // when\n        bpmnReplace.replaceElement(subProcess, {\n          type: 'bpmn:SubProcess',\n          isExpanded: false\n        });\n\n        // then\n        var plane = elementRegistry.get('SubProcess_1_plane');\n\n        expect(annotation.parent).to.equal(plane);\n        expect(association.parent).to.equal(plane);\n        expect(startEvent.label.parent).to.equal(plane);\n\n        // annotation connected to the sub-process itself should stay outside\n        expect(subProcessAnnotation.parent).to.equal(canvas.getRootElement());\n        expect(subProcessAssociation.parent).to.equal(canvas.getRootElement());\n      }\n    ));\n\n\n    it('should keep only subprocess annotation when connected to both subprocess and inner element', inject(\n      function(canvas, elementRegistry, modeling) {\n\n        // given\n        var subProcess = elementRegistry.get('SubProcess_1'),\n            task = elementRegistry.get('Task_1'),\n            annotation = elementRegistry.get('TextAnnotation_2');\n\n        // connect annotation to both subprocess (existing) and inner element\n        var localAssociation = modeling.connect(task, annotation, {\n          type: 'bpmn:Association',\n          associationDirection: 'one'\n        });\n\n        // when\n        modeling.toggleCollapse(subProcess);\n\n        // then\n        // annotation connected to the sub-process stays outside\n        expect(annotation.parent).to.equal(canvas.getRootElement());\n\n        // local association is removed\n        expect(elementRegistry.get(localAssociation.id)).to.not.exist;\n      }\n    ));\n\n\n    it('should move annotation back to process level after collapse and expand', inject(\n      function(canvas, elementRegistry, modeling) {\n\n        // given\n        var subProcess = elementRegistry.get('SubProcess_1'),\n            annotation = elementRegistry.get('TextAnnotation_1'),\n            association = elementRegistry.get('Association_1');\n\n        // when\n        modeling.toggleCollapse(subProcess);\n        modeling.toggleCollapse(subProcess);\n\n        // then\n        var rootElement = canvas.getRootElement();\n        expect(annotation.parent).to.equal(rootElement);\n        expect(association.parent).to.equal(rootElement);\n      }\n    ));\n\n\n    it('should remove annotation after collapse, expand, and delete', inject(\n      function(elementRegistry, modeling) {\n\n        // given\n        var subProcess = elementRegistry.get('SubProcess_1');\n\n        modeling.toggleCollapse(subProcess);\n        modeling.toggleCollapse(subProcess);\n\n        // when\n        modeling.removeElements([ subProcess ]);\n\n        // then\n        expect(elementRegistry.get('TextAnnotation_1')).to.not.exist;\n        expect(elementRegistry.get('Association_1')).to.not.exist;\n      }\n    ));\n\n\n    it('should remove annotation when subprocess is deleted', inject(\n      function(elementRegistry, modeling) {\n\n        // given\n        var subProcess = elementRegistry.get('SubProcess_1');\n\n        // when\n        modeling.removeShape(subProcess);\n\n        // then\n        expect(elementRegistry.get('TextAnnotation_1')).to.not.exist;\n        expect(elementRegistry.get('Association_1')).to.not.exist;\n        expect(elementRegistry.get('TextAnnotation_2')).to.not.exist;\n        expect(elementRegistry.get('Association_2')).to.not.exist;\n      }\n    ));\n\n  });\n\n\n  describe('replace', function() {\n\n    describe('task -> collapsed subprocess', function() {\n\n      it('should add new diagram for collapsed subprocess', inject(\n        function(elementRegistry, bpmnReplace, bpmnjs, canvas) {\n\n          // given\n          var task = elementRegistry.get('Task_1'),\n              collapsedSubProcess;\n\n          // when\n          collapsedSubProcess = bpmnReplace.replaceElement(task, {\n            type: 'bpmn:SubProcess',\n            isExpanded: false\n          });\n\n          // then\n          var diagrams = bpmnjs.getDefinitions().diagrams;\n          expect(diagrams).to.have.length(2);\n          expect(canvas.findRoot(planeId(collapsedSubProcess))).to.exist;\n        }\n      ));\n\n\n      it('should undo', inject(\n        function(elementRegistry, bpmnReplace, bpmnjs, canvas, commandStack) {\n\n          // given\n          var task = elementRegistry.get('Task_1'),\n              collapsedSubProcess = bpmnReplace.replaceElement(task, {\n                type: 'bpmn:SubProcess',\n                isExpanded: false\n              });\n\n          // when\n          commandStack.undo();\n\n\n          // then\n          var diagrams = bpmnjs.getDefinitions().diagrams;\n          expect(diagrams).to.have.length(1);\n          expect(canvas.findRoot(planeId(collapsedSubProcess))).to.not.exist;\n        }\n      ));\n\n\n      it('should redo', inject(\n        function(elementRegistry, bpmnReplace, bpmnjs, canvas, commandStack) {\n\n          // given\n          var task = elementRegistry.get('Task_1'),\n              collapsedSubProcess = bpmnReplace.replaceElement(task, {\n                type: 'bpmn:SubProcess',\n                isExpanded: false\n              });\n\n          // when\n          commandStack.undo();\n          commandStack.redo();\n\n          // then\n          var diagrams = bpmnjs.getDefinitions().diagrams;\n          expect(diagrams).to.have.length(2);\n          expect(canvas.findRoot(planeId(collapsedSubProcess))).to.exist;\n        }\n      ));\n    });\n\n\n    describe('task -> expanded subprocess', function() {\n\n      it('should not add new diagram for collapsed subprocess', inject(\n        function(elementRegistry, bpmnReplace, bpmnjs, canvas) {\n\n          // given\n          var task = elementRegistry.get('Task_1'),\n              collapsedSubProcess;\n\n          // when\n          collapsedSubProcess = bpmnReplace.replaceElement(task, {\n            type: 'bpmn:SubProcess',\n            isExpanded: true\n          });\n\n          // then\n          var diagrams = bpmnjs.getDefinitions().diagrams;\n          expect(diagrams).to.have.length(1);\n          expect(canvas.findRoot(planeId(collapsedSubProcess))).to.not.exist;\n        }\n      ));\n\n    });\n\n  });\n\n\n  describe('remove', function() {\n\n    var multipleDiagramXML = require('./SubProcessBehavior.multiple-planes.bpmn');\n\n    beforeEach(bootstrapModeler(multipleDiagramXML, {\n      modules: [\n        coreModule,\n        modelingModule,\n        replaceModule\n      ]\n    }));\n\n    it('should recursively remove diagrams', inject(function(elementRegistry, modeling, bpmnjs) {\n\n      // given\n      var subProcess = elementRegistry.get('SubProcess_2');\n\n      // when\n      modeling.removeShape(subProcess);\n\n      // then\n      var nestedTask = elementRegistry.get('nested_task');\n      var diagrams = bpmnjs.getDefinitions().diagrams;\n      expect(diagrams).to.have.length(1);\n      expect(nestedTask).to.not.exist;\n    }));\n\n\n    it('should undo', inject(function(elementRegistry, modeling, bpmnjs, commandStack) {\n\n      // given\n      var subProcess = elementRegistry.get('SubProcess_2');\n      modeling.removeShape(subProcess);\n\n      // when\n      commandStack.undo();\n\n      // then\n      var nestedTask = elementRegistry.get('nested_task');\n      var diagrams = bpmnjs.getDefinitions().diagrams;\n      expect(diagrams).to.have.length(3);\n      expect(nestedTask).to.exist;\n    }));\n\n\n    it('should redo', inject(function(elementRegistry, modeling, bpmnjs, commandStack) {\n\n      // given\n      var subProcess = elementRegistry.get('SubProcess_2');\n      modeling.removeShape(subProcess);\n\n      // when\n      commandStack.undo();\n      commandStack.redo();\n\n      // then\n      var nestedTask = elementRegistry.get('nested_task');\n      var diagrams = bpmnjs.getDefinitions().diagrams;\n      expect(diagrams).to.have.length(1);\n      expect(nestedTask).to.not.exist;\n    }));\n\n  });\n\n\n  describe('update', function() {\n\n    var multipleDiagramXML = require('./SubProcessBehavior.multiple-planes.bpmn');\n\n    beforeEach(bootstrapModeler(multipleDiagramXML, {\n      modules: [\n        coreModule,\n        modelingModule,\n        replaceModule\n      ]\n    }));\n\n\n    describe('do', function() {\n\n      it('should update plane id when primary shape is changed',\n        inject(function(modeling, elementRegistry) {\n\n          // given\n          var subProcess = elementRegistry.get('SubProcess_2'),\n              plane = elementRegistry.get('SubProcess_2_plane');\n\n          // when\n          modeling.updateProperties(subProcess, { id: 'new_name' });\n\n          // then\n          expect(subProcess.id).to.equal('new_name');\n          expect(plane.id).to.equal('new_name_plane');\n        }));\n\n\n      it('should update primary shape id when plane is changed',\n        inject(function(modeling, elementRegistry) {\n\n          // given\n          var subProcess = elementRegistry.get('SubProcess_2'),\n              plane = elementRegistry.get('SubProcess_2_plane');\n\n          // when\n          modeling.updateProperties(plane, { id: 'new_name' });\n\n          // then\n          expect(subProcess.id).to.equal('new_name');\n          expect(plane.id).to.equal('new_name_plane');\n        }));\n\n    });\n\n\n    describe('undo', function() {\n\n      it('should update plane id when primary shape is changed',\n        inject(function(modeling, elementRegistry, commandStack) {\n\n          // given\n          var subProcess = elementRegistry.get('SubProcess_2'),\n              plane = elementRegistry.get('SubProcess_2_plane');\n\n          // when\n          modeling.updateProperties(subProcess, { id: 'new_name' });\n          commandStack.undo();\n\n          // then\n          expect(subProcess.id).to.equal('SubProcess_2');\n          expect(plane.id).to.equal('SubProcess_2_plane');\n        }));\n\n\n      it('should update primary shape id when plane is changed',\n        inject(function(modeling, elementRegistry, commandStack) {\n\n          // given\n          var subProcess = elementRegistry.get('SubProcess_2'),\n              plane = elementRegistry.get('SubProcess_2_plane');\n\n          // when\n          modeling.updateProperties(plane, { id: 'new_name' });\n          commandStack.undo();\n\n          // then\n          expect(subProcess.id).to.equal('SubProcess_2');\n          expect(plane.id).to.equal('SubProcess_2_plane');\n        }));\n\n    });\n\n\n    describe('redo', function() {\n\n      it('should update plane id when primary shape is changed',\n        inject(function(modeling, elementRegistry, commandStack) {\n\n          // given\n          var subProcess = elementRegistry.get('SubProcess_2'),\n              plane = elementRegistry.get('SubProcess_2_plane');\n\n          // when\n          modeling.updateProperties(subProcess, { id: 'new_name' });\n          commandStack.undo();\n          commandStack.redo();\n\n          // then\n          expect(subProcess.id).to.equal('new_name');\n          expect(plane.id).to.equal('new_name_plane');\n        }));\n\n\n      it('should update primary shape id when plane is changed',\n        inject(function(modeling, elementRegistry, commandStack) {\n\n          // given\n          var subProcess = elementRegistry.get('SubProcess_2'),\n              plane = elementRegistry.get('SubProcess_2_plane');\n\n          // when\n          modeling.updateProperties(plane, { id: 'new_name' });\n          commandStack.undo();\n          commandStack.redo();\n\n          // then\n          expect(subProcess.id).to.equal('new_name');\n          expect(plane.id).to.equal('new_name_plane');\n        }));\n\n    });\n\n\n    it('should rerender primary shape name when plane is changed',\n      inject(function(modeling, elementRegistry, eventBus) {\n\n        // given\n        var subProcess = elementRegistry.get('SubProcess_2'),\n            plane = elementRegistry.get('SubProcess_2_plane');\n\n        var changedSpy = sinon.spy();\n\n        eventBus.on('element.changed', 5000, changedSpy);\n\n        // when\n        modeling.updateProperties(plane, { name: 'new name' });\n\n        // then\n        expect(changedSpy).to.have.been.calledTwice;\n        expect(changedSpy.secondCall.args[0].element).to.eql(subProcess);\n      })\n    );\n\n  });\n\n\n  describe('copy/paste', function() {\n\n    var copyXML = require('./SubProcessBehavior.copy-paste.bpmn');\n\n    beforeEach(bootstrapModeler(copyXML, {\n      modules: [\n        coreModule,\n        modelingModule,\n        bpmnCopyPasteModule,\n        copyPasteModule\n      ]\n    }));\n\n\n    it('should copy collapsed sub process', inject(function(copyPaste, elementRegistry) {\n\n      var subprcoess = elementRegistry.get('SubProcess_3');\n\n\n      // when\n      var tree = copyPaste.copy([ subprcoess ]);\n\n      // then\n      expect(keys(tree)).to.have.length(3);\n\n\n      expect(tree[ 0 ]).to.have.length(1);\n      expect(tree[ 1 ]).to.have.length(3);\n      expect(tree[ 2 ]).to.have.length(12);\n    }));\n\n\n    it('should paste subprocess plane', inject(\n      function(canvas, copyPaste, elementRegistry) {\n\n        // given\n        var subprcoess = elementRegistry.get('SubProcess_3'),\n            rootElement = canvas.getRootElement();\n\n        copyPaste.copy(subprcoess);\n\n        // when\n        var elements = copyPaste.paste({\n          element: rootElement,\n          point: {\n            x: 300,\n            y: 300\n          }\n        });\n\n\n        // then\n        var subprocess = elements[0];\n        var newRoot = canvas.findRoot(planeId(subprocess));\n\n        expect(newRoot).to.exist;\n        expect(newRoot.children).to.have.length(6);\n      }\n    ));\n\n\n    it('should undo paste of collapsed subprocess', inject(\n      function(canvas, commandStack, copyPaste, elementRegistry) {\n\n        // given\n        var subprocess = elementRegistry.get('SubProcess_3'),\n            rootElement = canvas.getRootElement();\n\n        var childrenCount = rootElement.children.length;\n\n        copyPaste.copy(subprocess);\n\n        copyPaste.paste({\n          element: rootElement,\n          point: {\n            x: 300,\n            y: 300\n          }\n        });\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(rootElement.children).to.have.length(childrenCount);\n      }\n    ));\n\n  });\n\n});\n\n\nfunction planeId(element) {\n  if (is(element, 'bpmn:SubProcess')) {\n    return element.id + '_plane';\n  }\n\n  return element.id;\n}\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/SubProcessStartEventBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\nimport replaceModule from 'lib/features/replace';\n\nimport { is, getDi } from 'lib/util/ModelUtil';\n\ndescribe('features/modeling/behavior - subprocess start event', function() {\n\n  var diagramXML = require('./SubProcessBehavior.start-event.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: [\n      coreModule,\n      modelingModule,\n      replaceModule\n    ]\n  }));\n\n\n  describe('replace', function() {\n\n    describe('task -> expanded subprocess', function() {\n\n      it('should add start event child to subprocess', inject(\n        function(elementRegistry, bpmnReplace) {\n\n          // given\n          var task = elementRegistry.get('Task_1'),\n              expandedSubProcess,\n              startEvents;\n\n          // when\n          expandedSubProcess = bpmnReplace.replaceElement(task, {\n            type: 'bpmn:SubProcess',\n            isExpanded: true\n          });\n\n          // then\n          startEvents = getChildStartEvents(expandedSubProcess);\n\n          expect(startEvents).to.have.length(1);\n        }\n      ));\n\n\n      it('should wire startEvent di correctly', inject(\n        function(elementRegistry, bpmnReplace) {\n\n          // given\n          var task = elementRegistry.get('Task_1'),\n              expandedSubProcess,\n              startEvent,\n              startEventDi;\n\n          // when\n          expandedSubProcess = bpmnReplace.replaceElement(task, {\n            type: 'bpmn:SubProcess',\n            isExpanded: true\n          });\n\n          // then\n          startEvent = getChildStartEvents(expandedSubProcess)[0];\n          startEventDi = getDi(startEvent);\n\n          expect(startEventDi.$parent).to.exist;\n        }\n      ));\n\n    });\n\n\n    describe('task -> adhoc subprocess', function() {\n\n      it('should NOT add start event child to adhoc subprocess', inject(\n        function(elementRegistry, bpmnReplace) {\n\n          // given\n          var task = elementRegistry.get('Task_1'),\n              collapsedSubProcess,\n              startEvents;\n\n          // when\n          collapsedSubProcess = bpmnReplace.replaceElement(task, {\n            type: 'bpmn:AdHocSubProcess',\n            isExpanded: true\n          });\n\n          // then\n          startEvents = getChildStartEvents(collapsedSubProcess);\n\n          expect(startEvents).to.have.length(0);\n        }));\n    });\n\n\n    describe('task -> collapsed subprocess', function() {\n\n      it('should NOT add start event child to subprocess', inject(\n        function(elementRegistry, bpmnReplace) {\n\n          // given\n          var task = elementRegistry.get('Task_1'),\n              collapsedSubProcess,\n              startEvents;\n\n          // when\n          collapsedSubProcess = bpmnReplace.replaceElement(task, {\n            type: 'bpmn:SubProcess',\n            isExpanded: false\n          });\n\n          // then\n          startEvents = getChildStartEvents(collapsedSubProcess);\n\n          expect(startEvents).to.have.length(0);\n        }\n      ));\n\n    });\n\n\n    describe('call activity -> expanded subprocess', function() {\n\n      it('should add start event child to subprocess', inject(\n        function(elementRegistry, bpmnReplace) {\n\n          // given\n          var callActivity = elementRegistry.get('CallActivity_1'),\n              expandedSubProcess,\n              startEvents;\n\n          // when\n          expandedSubProcess = bpmnReplace.replaceElement(callActivity, {\n            type: 'bpmn:SubProcess',\n            isExpanded: true\n          });\n\n          // then\n          startEvents = getChildStartEvents(expandedSubProcess);\n\n          expect(startEvents).to.have.length(1);\n        }\n      ));\n\n\n      it('should wire startEvent di correctly', inject(\n        function(elementRegistry, bpmnReplace) {\n\n          // given\n          var callActivity = elementRegistry.get('CallActivity_1'),\n              expandedSubProcess,\n              startEvent,\n              startEventDi;\n\n          // when\n          expandedSubProcess = bpmnReplace.replaceElement(callActivity, {\n            type: 'bpmn:SubProcess',\n            isExpanded: true\n          });\n\n          // then\n          startEvent = getChildStartEvents(expandedSubProcess)[0];\n          startEventDi = getDi(startEvent);\n\n          expect(startEventDi.$parent).to.exist;\n        }\n      ));\n\n    });\n\n  });\n\n});\n\n// helpers //////////\n\nfunction isStartEvent(element) {\n  return is(element, 'bpmn:StartEvent');\n}\n\nfunction getChildStartEvents(element) {\n  return element.children.filter(isStartEvent);\n}\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/TextAnnotationBehaviorSpec.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_0sumicc\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.19.0\" modeler:executionPlatform=\"Camunda Cloud\" modeler:executionPlatformVersion=\"8.4.0\">\n  <bpmn:process id=\"Process_00kwner\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"Subprocess_1\">\n      <bpmn:task id=\"Task_1\" />\n      <bpmn:textAnnotation id=\"TextAnnotation_1\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_00kwner\">\n      <bpmndi:BPMNShape id=\"Activity_0oq21yg_di\" bpmnElement=\"Subprocess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"160\" y=\"70\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_1beb5hp_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"380\" y=\"80\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0stlo9y_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"290\" y=\"130\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/TextAnnotationBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\nimport autoResizeModule from 'lib/features/auto-resize';\n\n\ndescribe('features/modeling - TextAnnotationBehavior', function() {\n\n  var testModules = [ coreModule, modelingModule, autoResizeModule ];\n\n  var processDiagramXML = require('./TextAnnotationBehaviorSpec.bpmn');\n\n  beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n  var annotation,\n      task,\n      subprocess;\n\n  beforeEach(inject(function(elementRegistry) {\n    annotation = elementRegistry.get('TextAnnotation_1');\n    task = elementRegistry.get('Task_1');\n    subprocess = elementRegistry.get('Subprocess_1');\n  }));\n\n\n  it('should NOT resize Container on appending Text Annotation', inject(function(modeling) {\n\n    // when\n    modeling.appendShape(task, { type: 'bpmn:TextAnnotation' });\n\n    // then\n    expect(subprocess.width).to.equal(350);\n    expect(subprocess.height).to.equal(200);\n  }));\n\n\n  it('should NOT resize Container on Text Annotation resize', inject(function(modeling) {\n\n    // when\n    modeling.resizeShape(annotation, { x: 0, y: 0, width: 1000, height: 1000 });\n\n    // then\n    expect(subprocess.width).to.equal(350);\n    expect(subprocess.height).to.equal(200);\n  }));\n\n\n  it('should NOT resize Container on Text Annotation move', inject(function(modeling) {\n\n    // when\n    modeling.moveShape(annotation, { x: 250, y: 250 });\n\n    // then\n    expect(subprocess.width).to.equal(350);\n    expect(subprocess.height).to.equal(200);\n  }));\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/ToggleCollapseConnectionBehaviourSpec.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_0aznxr3\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.11.1\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.15.0\">\n  <bpmn:collaboration id=\"Collaboration_01harm7\">\n    <bpmn:participant id=\"Participant_11e0vmc\" processRef=\"Process_1vdnuf7\" />\n    <bpmn:participant id=\"Participant_0dgf5bz\" processRef=\"Process_03jefgm\" />\n    <bpmn:messageFlow id=\"MessageFlow_1\" sourceRef=\"Activity_0y7prp6\" targetRef=\"Task_1\" />\n    <bpmn:messageFlow id=\"MessageFlow_2\" sourceRef=\"Task_1\" targetRef=\"Activity_0y7prp6\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1vdnuf7\" isExecutable=\"true\">\n    <bpmn:dataStoreReference id=\"DataStoreReference_03oe1ud\" />\n    <bpmn:startEvent id=\"Event_19nvrv6\" />\n    <bpmn:subProcess id=\"Subprocess_1\">\n      <bpmn:startEvent id=\"Event_02ek85q\">\n        <bpmn:outgoing>Flow_01hgf3n</bpmn:outgoing>\n      </bpmn:startEvent>\n      <bpmn:task id=\"Task_1\">\n        <bpmn:incoming>Flow_01hgf3n</bpmn:incoming>\n        <bpmn:outgoing>Flow_0h4tfi2</bpmn:outgoing>\n        <bpmn:property id=\"Property_0kwu583\" name=\"__targetRef_placeholder\" />\n        <bpmn:dataInputAssociation id=\"DataAssociation_1\">\n          <bpmn:sourceRef>DataStoreReference_03oe1ud</bpmn:sourceRef>\n          <bpmn:targetRef>Property_0kwu583</bpmn:targetRef>\n        </bpmn:dataInputAssociation>\n        <bpmn:dataOutputAssociation id=\"DataAssociation_2\">\n          <bpmn:targetRef>DataStoreReference_03oe1ud</bpmn:targetRef>\n        </bpmn:dataOutputAssociation>\n      </bpmn:task>\n      <bpmn:sequenceFlow id=\"Flow_01hgf3n\" sourceRef=\"Event_02ek85q\" targetRef=\"Task_1\" />\n      <bpmn:endEvent id=\"Event_1qrx5os\">\n        <bpmn:incoming>Flow_0h4tfi2</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:sequenceFlow id=\"Flow_0h4tfi2\" sourceRef=\"Task_1\" targetRef=\"Event_1qrx5os\" />\n      <bpmn:association id=\"Association_1\" sourceRef=\"Task_1\" targetRef=\"TextAnnotation_06fcwe1\" />\n    </bpmn:subProcess>\n    <bpmn:textAnnotation id=\"TextAnnotation_06fcwe1\" />\n  </bpmn:process>\n  <bpmn:process id=\"Process_03jefgm\" isExecutable=\"false\">\n    <bpmn:task id=\"Activity_0y7prp6\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_01harm7\">\n      <bpmndi:BPMNShape id=\"Participant_11e0vmc_di\" bpmnElement=\"Participant_11e0vmc\" isHorizontal=\"true\">\n        <dc:Bounds x=\"160\" y=\"230\" width=\"600\" height=\"317\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_06fcwe1_di\" bpmnElement=\"TextAnnotation_06fcwe1\">\n        <dc:Bounds x=\"520\" y=\"250\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_19nvrv6_di\" bpmnElement=\"Event_19nvrv6\">\n        <dc:Bounds x=\"202\" y=\"399\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Subprocess_1_di\" bpmnElement=\"Subprocess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"290\" y=\"310\" width=\"350\" height=\"207\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_01hgf3n_di\" bpmnElement=\"Flow_01hgf3n\">\n        <di:waypoint x=\"366\" y=\"417\" />\n        <di:waypoint x=\"420\" y=\"417\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0h4tfi2_di\" bpmnElement=\"Flow_0h4tfi2\">\n        <di:waypoint x=\"520\" y=\"417\" />\n        <di:waypoint x=\"582\" y=\"417\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Event_02ek85q_di\" bpmnElement=\"Event_02ek85q\">\n        <dc:Bounds x=\"330\" y=\"399\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"420\" y=\"377\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1qrx5os_di\" bpmnElement=\"Event_1qrx5os\">\n        <dc:Bounds x=\"582\" y=\"399\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_0hx47wy_di\" bpmnElement=\"Association_1\">\n        <di:waypoint x=\"496\" y=\"377\" />\n        <di:waypoint x=\"560\" y=\"280\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Participant_0dgf5bz_di\" bpmnElement=\"Participant_0dgf5bz\" isHorizontal=\"true\">\n        <dc:Bounds x=\"160\" y=\"590\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0y7prp6_di\" bpmnElement=\"Activity_0y7prp6\">\n        <dc:Bounds x=\"420\" y=\"680\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_03oe1ud_di\" bpmnElement=\"DataStoreReference_03oe1ud\">\n        <dc:Bounds x=\"235\" y=\"85\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1dx18am_di\" bpmnElement=\"MessageFlow_1\">\n        <di:waypoint x=\"460\" y=\"680\" />\n        <di:waypoint x=\"460\" y=\"457\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0vd4mvq_di\" bpmnElement=\"MessageFlow_2\">\n        <di:waypoint x=\"490\" y=\"457\" />\n        <di:waypoint x=\"490\" y=\"680\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_1kczmjn_di\" bpmnElement=\"DataAssociation_1\">\n        <di:waypoint x=\"278\" y=\"135\" />\n        <di:waypoint x=\"453\" y=\"377\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_0xkes2r_di\" bpmnElement=\"DataAssociation_2\">\n        <di:waypoint x=\"442\" y=\"377\" />\n        <di:waypoint x=\"269\" y=\"135\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/ToggleCollapseConnectionBehaviourSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\n\nvar testModules = [\n  coreModule,\n  modelingModule,\n];\n\ndescribe('features/modeling - Toggle Collapse Connection Behavior', function() {\n\n  var diagramXML = require('./ToggleCollapseConnectionBehaviourSpec.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n  describe('Subprocess', function() {\n\n    it('should reconnect flows on collapse', inject(function(elementRegistry, modeling) {\n\n      // given\n      var subProcess = elementRegistry.get('Subprocess_1'),\n          task = elementRegistry.get('Task_1'),\n          commentConnection = elementRegistry.get('Association_1'),\n          incommingDataConnection = elementRegistry.get('DataAssociation_1'),\n          outgoingDataConnection = elementRegistry.get('DataAssociation_2'),\n          incommingMessageFlow = elementRegistry.get('MessageFlow_1'),\n          outgoingMessageFlow = elementRegistry.get('MessageFlow_2');\n\n      // when\n      modeling.toggleCollapse(subProcess);\n\n      // then\n      expect(commentConnection.source).to.equal(task);\n      expect(incommingDataConnection.target).to.equal(subProcess);\n      expect(outgoingDataConnection.source).to.equal(subProcess);\n      expect(incommingMessageFlow.target).to.equal(subProcess);\n      expect(outgoingMessageFlow.source).to.equal(subProcess);\n    }));\n\n\n    it('should undo', inject(function(elementRegistry, modeling, commandStack) {\n\n      // given\n      var subProcess = elementRegistry.get('Subprocess_1'),\n          task = elementRegistry.get('Task_1'),\n          commentConnection = elementRegistry.get('Association_1'),\n          incommingDataConnection = elementRegistry.get('DataAssociation_1'),\n          outgoingDataConnection = elementRegistry.get('DataAssociation_2'),\n          incommingMessageFlow = elementRegistry.get('MessageFlow_1'),\n          outgoingMessageFlow = elementRegistry.get('MessageFlow_2');\n\n      modeling.toggleCollapse(subProcess);\n\n      // when\n      commandStack.undo();\n\n      // then\n      expect(commentConnection.source).to.equal(task);\n      expect(incommingDataConnection.target).to.equal(task);\n      expect(outgoingDataConnection.source).to.equal(task);\n      expect(incommingMessageFlow.target).to.equal(task);\n      expect(outgoingMessageFlow.source).to.equal(task);\n    }));\n\n\n    it('should redo', inject(function(elementRegistry, modeling, commandStack) {\n\n      // given\n      var subProcess = elementRegistry.get('Subprocess_1'),\n          task = elementRegistry.get('Task_1'),\n          commentConnection = elementRegistry.get('Association_1'),\n          incommingDataConnection = elementRegistry.get('DataAssociation_1'),\n          outgoingDataConnection = elementRegistry.get('DataAssociation_2'),\n          incommingMessageFlow = elementRegistry.get('MessageFlow_1'),\n          outgoingMessageFlow = elementRegistry.get('MessageFlow_2');\n\n      modeling.toggleCollapse(subProcess);\n\n      // when\n      commandStack.undo();\n      commandStack.redo();\n\n      // then\n      expect(commentConnection.source).to.equal(task);\n      expect(incommingDataConnection.target).to.equal(subProcess);\n      expect(outgoingDataConnection.source).to.equal(subProcess);\n      expect(incommingMessageFlow.target).to.equal(subProcess);\n      expect(outgoingMessageFlow.source).to.equal(subProcess);\n    }));\n\n  });\n\n});"
  },
  {
    "path": "test/spec/features/modeling/behavior/ToggleElementCollapseBehaviour.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"_U0Z10NLzEeSKyddZMwwjAA\" targetNamespace=\"http://camunda.org/schema/1.0/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"0.7.0-dev\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:subProcess id=\"SubProcess_1\">\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_4</bpmn2:outgoing>\n      <bpmn2:startEvent id=\"StartEvent_2\" name=\"StartEvent_2\">\n        <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n      </bpmn2:startEvent>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_2\" name=\"\" sourceRef=\"StartEvent_2\" targetRef=\"ExclusiveGateway_1\" />\n      <bpmn2:exclusiveGateway id=\"ExclusiveGateway_1\">\n        <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n        <bpmn2:outgoing>SequenceFlow_5</bpmn2:outgoing>\n        <bpmn2:outgoing>SequenceFlow_6</bpmn2:outgoing>\n      </bpmn2:exclusiveGateway>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_5\" name=\"\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"Task_1\" />\n      <bpmn2:sequenceFlow id=\"SequenceFlow_6\" name=\"\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"ScriptTask_1\" />\n      <bpmn2:scriptTask id=\"ScriptTask_1\">\n        <bpmn2:incoming>SequenceFlow_6</bpmn2:incoming>\n        <bpmn2:outgoing>SequenceFlow_7</bpmn2:outgoing>\n      </bpmn2:scriptTask>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_7\" name=\"\" sourceRef=\"ScriptTask_1\" targetRef=\"EndEvent_3\" />\n      <bpmn2:task id=\"Task_1\">\n        <bpmn2:incoming>SequenceFlow_5</bpmn2:incoming>\n        <bpmn2:outgoing>SequenceFlow_3</bpmn2:outgoing>\n      </bpmn2:task>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_3\" name=\"\" sourceRef=\"Task_1\" targetRef=\"EndEvent_1\" />\n      <bpmn2:endEvent id=\"EndEvent_1\" name=\"EndEvent_1\">\n        <bpmn2:incoming>SequenceFlow_3</bpmn2:incoming>\n      </bpmn2:endEvent>\n      <bpmn2:endEvent id=\"EndEvent_3\" name=\"EndEvent_3\">\n        <bpmn2:incoming>SequenceFlow_7</bpmn2:incoming>\n      </bpmn2:endEvent>\n    </bpmn2:subProcess>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_4\" name=\"\" sourceRef=\"SubProcess_1\" targetRef=\"EndEvent_2\" />\n    <bpmn2:startEvent id=\"StartEvent_1\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"StartEvent_1\" targetRef=\"SubProcess_1\" />\n    <bpmn2:endEvent id=\"EndEvent_2\">\n      <bpmn2:incoming>SequenceFlow_4</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:startEvent id=\"StartEvent_4\">\n      <bpmn2:outgoing>SequenceFlow_9</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_9\" sourceRef=\"StartEvent_4\" targetRef=\"AdHocSubProcess_1\" />\n    <bpmn2:endEvent id=\"EndEvent_5\">\n      <bpmn2:incoming>SequenceFlow_8</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_8\" sourceRef=\"AdHocSubProcess_1\" targetRef=\"EndEvent_5\" />\n    <bpmn2:subProcess id=\"SubProcess_3\" />\n    <bpmn2:adHocSubProcess id=\"SubProcess_4\">\n      <bpmn2:multiInstanceLoopCharacteristics />\n      <bpmn2:startEvent id=\"StartEvent_5\" />\n    </bpmn2:adHocSubProcess>\n    <bpmn2:adHocSubProcess id=\"AdHocSubProcess_1\">\n      <bpmn2:incoming>SequenceFlow_9</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_8</bpmn2:outgoing>\n      <bpmn2:multiInstanceLoopCharacteristics />\n      <bpmn2:startEvent id=\"StartEvent_3\">\n        <bpmn2:outgoing>SequenceFlow_10</bpmn2:outgoing>\n      </bpmn2:startEvent>\n      <bpmn2:task id=\"Task_2\" name=\"internal label\">\n        <bpmn2:incoming>SequenceFlow_10</bpmn2:incoming>\n        <bpmn2:outgoing>SequenceFlow_11</bpmn2:outgoing>\n      </bpmn2:task>\n      <bpmn2:endEvent id=\"EndEvent_4\" name=\"external label\">\n        <bpmn2:incoming>SequenceFlow_11</bpmn2:incoming>\n      </bpmn2:endEvent>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_10\" sourceRef=\"StartEvent_3\" targetRef=\"Task_2\" />\n      <bpmn2:sequenceFlow id=\"SequenceFlow_11\" name=\"connection label\" sourceRef=\"Task_2\" targetRef=\"EndEvent_4\" />\n    </bpmn2:adHocSubProcess>\n    <bpmn2:subProcess id=\"SubProcess_5\">\n      <bpmn2:startEvent id=\"StartEvent_6\" />\n    </bpmn2:subProcess>\n    <bpmn2:subProcess id=\"SubProcess_6\" />\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNEdge id=\"SequenceFlow_10jatau_di\" bpmnElement=\"SequenceFlow_8\">\n        <di:waypoint x=\"792\" y=\"435\" />\n        <di:waypoint x=\"834\" y=\"435\" />\n        <di:waypoint x=\"834\" y=\"435\" />\n        <di:waypoint x=\"883\" y=\"435\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"804\" y=\"425\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1t8nq5v_di\" bpmnElement=\"SequenceFlow_9\">\n        <di:waypoint x=\"323\" y=\"435\" />\n        <di:waypoint x=\"376\" y=\"435\" />\n        <di:waypoint x=\"376\" y=\"435\" />\n        <di:waypoint x=\"407\" y=\"435\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"346\" y=\"425\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_StartEvent_26\" targetElement=\"_BPMNShape_SubProcess_8\">\n        <di:waypoint x=\"336\" y=\"194\" />\n        <di:waypoint x=\"532\" y=\"194\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"364\" y=\"194\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_4\" bpmnElement=\"SequenceFlow_4\" sourceElement=\"_BPMNShape_SubProcess_8\" targetElement=\"_BPMNShape_EndEvent_59\">\n        <di:waypoint x=\"632\" y=\"194\" />\n        <di:waypoint x=\"813\" y=\"195\" />\n        <di:waypoint x=\"875\" y=\"195\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"677.5\" y=\"176.5\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_8\" bpmnElement=\"SubProcess_1\">\n        <dc:Bounds x=\"532\" y=\"154\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_26\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"300\" y=\"176\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"273\" y=\"217\" width=\"90\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_59\" bpmnElement=\"EndEvent_2\">\n        <dc:Bounds x=\"875\" y=\"176\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"848\" y=\"217\" width=\"90\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_14sl8b4_di\" bpmnElement=\"StartEvent_4\">\n        <dc:Bounds x=\"287\" y=\"417\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"260\" y=\"453\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_1j9tw48_di\" bpmnElement=\"EndEvent_5\">\n        <dc:Bounds x=\"883\" y=\"417\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"856\" y=\"453\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_081736t_di\" bpmnElement=\"SubProcess_3\">\n        <dc:Bounds x=\"363\" y=\"652\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"AdHocSubProcess_0ojckgh_di\" bpmnElement=\"SubProcess_4\" isExpanded=\"false\">\n        <dc:Bounds x=\"541\" y=\"652\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"AdHocSubProcess_128w1vu_di\" bpmnElement=\"AdHocSubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"407\" y=\"335\" width=\"385\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1s8bqj4_di\" bpmnElement=\"SequenceFlow_11\">\n        <di:waypoint x=\"625\" y=\"437\" />\n        <di:waypoint x=\"683\" y=\"437\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"614\" y=\"419\" width=\"80\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0gkhyqw_di\" bpmnElement=\"SequenceFlow_10\">\n        <di:waypoint x=\"468\" y=\"389\" />\n        <di:waypoint x=\"496\" y=\"389\" />\n        <di:waypoint x=\"496\" y=\"437\" />\n        <di:waypoint x=\"525\" y=\"437\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"466\" y=\"403\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"StartEvent_19uwuw1_di\" bpmnElement=\"StartEvent_3\">\n        <dc:Bounds x=\"432\" y=\"371\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"405\" y=\"407\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1y93al0_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"525\" y=\"397\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_1bmhzoz_di\" bpmnElement=\"EndEvent_4\">\n        <dc:Bounds x=\"683\" y=\"419\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"668\" y=\"462\" width=\"66\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_0qs6p1k_di\" bpmnElement=\"SubProcess_5\" isExpanded=\"false\">\n        <dc:Bounds x=\"716\" y=\"652\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_15na7ob_di\" bpmnElement=\"SubProcess_6\" isExpanded=\"true\">\n        <dc:Bounds x=\"398\" y=\"796\" width=\"385\" height=\"200\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram>\n    <bpmndi:BPMNPlane bpmnElement=\"SubProcess_1\">\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_3\" bpmnElement=\"SequenceFlow_3\" sourceElement=\"_BPMNShape_Task_3\" targetElement=\"_BPMNShape_EndEvent_58\">\n        <di:waypoint x=\"448\" y=\"200\" />\n        <di:waypoint x=\"488\" y=\"200\" />\n        <di:waypoint x=\"488\" y=\"190\" />\n        <di:waypoint x=\"551\" y=\"190\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"674\" y=\"111\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_7\" bpmnElement=\"SequenceFlow_7\" sourceElement=\"_BPMNShape_ScriptTask_2\" targetElement=\"_BPMNShape_EndEvent_60\">\n        <di:waypoint x=\"439\" y=\"350\" />\n        <di:waypoint x=\"464\" y=\"350\" />\n        <di:waypoint x=\"464\" y=\"371\" />\n        <di:waypoint x=\"524\" y=\"371\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"650\" y=\"276.5\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_6\" bpmnElement=\"SequenceFlow_6\" sourceElement=\"_BPMNShape_ExclusiveGateway_19\" targetElement=\"_BPMNShape_ScriptTask_2\">\n        <di:waypoint x=\"264\" y=\"276\" />\n        <di:waypoint x=\"264\" y=\"350\" />\n        <di:waypoint x=\"339\" y=\"350\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"391\" y=\"662\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_5\" bpmnElement=\"SequenceFlow_5\" sourceElement=\"_BPMNShape_ExclusiveGateway_19\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint x=\"289\" y=\"251\" />\n        <di:waypoint x=\"325\" y=\"251\" />\n        <di:waypoint x=\"325\" y=\"200\" />\n        <di:waypoint x=\"348\" y=\"200\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"496\" y=\"165\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"_BPMNShape_StartEvent_27\" targetElement=\"_BPMNShape_ExclusiveGateway_19\">\n        <di:waypoint x=\"216\" y=\"190\" />\n        <di:waypoint x=\"264\" y=\"190\" />\n        <di:waypoint x=\"264\" y=\"226\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"412\" y=\"109\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_27\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds x=\"180\" y=\"172\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"370\" y=\"132\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_ExclusiveGateway_19\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"239\" y=\"226\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"435\" y=\"200\" width=\"90\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_ScriptTask_2\" bpmnElement=\"ScriptTask_1\">\n        <dc:Bounds x=\"339\" y=\"310\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"348\" y=\"160\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_58\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"551\" y=\"172\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"740\" y=\"132\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_60\" bpmnElement=\"EndEvent_3\">\n        <dc:Bounds x=\"524\" y=\"353\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"668\" y=\"685\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram>\n    <bpmndi:BPMNPlane bpmnElement=\"SubProcess_3\" />\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram>\n    <bpmndi:BPMNPlane bpmnElement=\"SubProcess_4\">\n      <bpmndi:BPMNShape id=\"StartEvent_17rfv1e_di\" bpmnElement=\"StartEvent_5\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"546\" y=\"710\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram>\n    <bpmndi:BPMNPlane bpmnElement=\"SubProcess_5\">\n      <bpmndi:BPMNShape id=\"StartEvent_0076vg5_di\" bpmnElement=\"StartEvent_6\">\n        <dc:Bounds x=\"180\" y=\"160\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"468\" y=\"573\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/ToggleElementCollapseBehaviourSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\nimport {\n  is,\n  getDi\n} from 'lib/util/ModelUtil';\n\nvar testModules = [\n  modelingModule,\n  coreModule\n];\n\n\ndescribe('features/modeling - collapse and expand elements', function() {\n\n  var diagramXML = require('./ToggleElementCollapseBehaviour.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: testModules\n  }));\n\n\n  describe('expand', function() {\n\n    var defaultSize = {\n      width: 350,\n      height: 200\n    };\n\n\n    it('collapsed-marker is removed',\n      inject(function(elementRegistry, bpmnReplace) {\n\n        // given\n        var collapsedSubProcess = elementRegistry.get('SubProcess_3');\n\n        // when\n        var expandedSubProcess = bpmnReplace.replaceElement(collapsedSubProcess,\n          {\n            type: 'bpmn:SubProcess',\n            isExpanded: true\n          }\n        );\n\n        // then +-marker is removed\n        expect(getDi(expandedSubProcess).isExpanded).to.eql(true);\n      })\n    );\n\n\n    it('show all children, but hide empty labels',\n      inject(function(elementRegistry, bpmnReplace) {\n\n        // given\n        var collapsedSubProcess = elementRegistry.get('SubProcess_1');\n        var originalChildren = collapsedSubProcess.children.slice();\n\n        // when\n        var expandedSubProcess = bpmnReplace.replaceElement(collapsedSubProcess,\n          {\n            type: 'bpmn:SubProcess',\n            isExpanded: true\n          }\n        );\n\n        // then keep children\n        originalChildren.forEach(function(c) {\n          expect(expandedSubProcess.children).to.include(c);\n        });\n\n        // and show them\n        expect(expandedSubProcess.children).to.satisfy(allShown());\n      })\n    );\n\n\n    it('keep ad-hoc and multiInstance-marker',\n      inject(function(elementRegistry, bpmnReplace) {\n\n        // given\n        var collapsedAdHocSubProcess = elementRegistry.get('SubProcess_4');\n\n        // when\n        var expandedAdHocSubProcess = bpmnReplace.replaceElement(collapsedAdHocSubProcess,\n          {\n            type: 'bpmn:AdHocSubProcess',\n            isExpanded: true\n          }\n        );\n\n        // then\n        expect(is(expandedAdHocSubProcess, 'bpmn:AdHocSubProcess')).to.eql(true);\n        var businessObject = expandedAdHocSubProcess.businessObject;\n        expect(businessObject.loopCharacteristics).not.to.be.undefined;\n      })\n    );\n\n\n    describe('resizing', function() {\n\n\n      it('ignors hidden children',\n        inject(function(elementRegistry, bpmnReplace, eventBus) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('SubProcess_5');\n          var hiddenStartEvent = elementRegistry.get('StartEvent_6');\n          eventBus.once('commandStack.shape.toggleCollapse.postExecute', function(e) {\n            hiddenStartEvent.hidden = true;\n          });\n\n          // when\n          var expandedSubProcess = bpmnReplace.replaceElement(collapsedSubProcess,\n            {\n              type: 'bpmn:SubProcess',\n              isExpanded: true\n            }\n          );\n\n          // then hidden child should not be covered\n          expect(expandedSubProcess.x).to.be.greaterThan(hiddenStartEvent.x);\n          expect(expandedSubProcess.y).to.be.greaterThan(hiddenStartEvent.y);\n        })\n      );\n\n\n      it('without children is centered and has defaultBounds',\n        inject(function(elementRegistry, bpmnReplace) {\n\n          // given collapsed SubProcess without children\n          var collapsedSubProcess = elementRegistry.get('SubProcess_3');\n\n          var oldMid = {\n            x: collapsedSubProcess.x + collapsedSubProcess.width / 2,\n            y: collapsedSubProcess.y + collapsedSubProcess.height / 2\n          };\n\n          // when\n          var expandedSubProcess = bpmnReplace.replaceElement(collapsedSubProcess,\n            {\n              type: 'bpmn:SubProcess',\n              isExpanded: true\n            }\n          );\n\n          // then\n          var newMid = {\n            x: expandedSubProcess.x + expandedSubProcess.width / 2,\n            y: expandedSubProcess.y + expandedSubProcess.height / 2\n          };\n\n          expect(newMid).to.eql(oldMid);\n          expect(expandedSubProcess.width).to.be.at.least(defaultSize.width);\n          expect(expandedSubProcess.height).to.be.at.least(defaultSize.height);\n        })\n      );\n\n\n      it('with children is centered to childrenBoundingBox and has at least defaultBounds',\n        inject(function(elementRegistry, bpmnReplace) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('SubProcess_4');\n\n          // when\n          var expandedSubProcess = bpmnReplace.replaceElement(collapsedSubProcess,\n            {\n              type: 'bpmn:SubProcess',\n              isExpanded: true\n            }\n          );\n\n          // then\n          var startEvent = elementRegistry.get('StartEvent_5');\n          var midChildren = {\n            x: startEvent.x + startEvent.width / 2,\n            y: startEvent.y + startEvent.height / 2\n          };\n\n          var expandedMid = {\n            x: expandedSubProcess.x + expandedSubProcess.width / 2,\n            y: expandedSubProcess.y + expandedSubProcess.height / 2\n          };\n\n          expect(expandedMid).to.eql(midChildren),\n          expect(expandedSubProcess.width).to.be.at.least(defaultSize.width);\n          expect(expandedSubProcess.height).to.be.at.least(defaultSize.height);\n        })\n      );\n\n\n      it('to expanding collapsedSubProcess is coverd in childrenBoundingBox',\n        inject(function(elementRegistry, bpmnReplace) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('SubProcess_5');\n          var collapsedDownRightCorner = {\n            x: collapsedSubProcess.x + collapsedSubProcess.width,\n            y: collapsedSubProcess.y + collapsedSubProcess.height\n          };\n\n          // when\n          var expandedSubProcess = bpmnReplace.replaceElement(collapsedSubProcess,\n            {\n              type: 'bpmn:SubProcess',\n              isExpanded: true\n            }\n          );\n\n          // then\n          var expandedDownRightCorner = {\n            x: expandedSubProcess.x + expandedSubProcess.width,\n            y: expandedSubProcess.y + expandedSubProcess.height\n          };\n\n          expect(expandedDownRightCorner.x).to.be.at.least(collapsedDownRightCorner.x);\n          expect(expandedDownRightCorner.y).to.be.at.least(collapsedDownRightCorner.y);\n        })\n      );\n\n    });\n\n\n    describe('undo', function() {\n\n      it('collapsed-marker is placed',\n        inject(function(elementRegistry, bpmnReplace, commandStack) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('SubProcess_1');\n          var expandedSubProcess = bpmnReplace.replaceElement(collapsedSubProcess,\n            {\n              type: 'bpmn:SubProcess',\n              isExpanded: true\n            }\n          );\n\n          // when\n          commandStack.undo();\n\n          // then +-marker is placed\n          expect(getDi(expandedSubProcess).isExpanded).to.eql(false);\n        })\n      );\n\n\n      it('restore previous bounds',\n        inject(function(elementRegistry, bpmnReplace, commandStack) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('SubProcess_1');\n          var originalBounds = {\n            x: collapsedSubProcess.x,\n            y: collapsedSubProcess.y,\n            width: collapsedSubProcess.width,\n            height: collapsedSubProcess.height\n          };\n\n          bpmnReplace.replaceElement(collapsedSubProcess,\n            {\n              type: 'bpmn:SubProcess',\n              isExpanded: true\n            }\n          );\n\n          // when\n          commandStack.undo();\n\n          // then\n          expect(collapsedSubProcess).to.have.bounds(originalBounds);\n        })\n      );\n\n\n      it('hide children',\n        inject(function(elementRegistry, bpmnReplace, commandStack) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('SubProcess_1');\n          var originalChildren = collapsedSubProcess.children.slice();\n\n          bpmnReplace.replaceElement(collapsedSubProcess,\n            {\n              type: 'bpmn:SubProcess',\n              isExpanded: true\n            }\n          );\n\n          // when\n          commandStack.undo();\n\n          // then keep children\n          originalChildren.forEach(function(c) {\n            expect(collapsedSubProcess.children).to.include(c);\n          });\n\n          // and hide them\n          expect(collapsedSubProcess.children).to.satisfy(allHidden());\n        })\n      );\n\n    });\n\n  });\n\n\n  describe('collapse', function() {\n\n    var defaultSize = {\n      width: 100,\n      height: 80\n    };\n\n\n    it('collapsed-marker is placed',\n      inject(function(elementRegistry, bpmnReplace) {\n\n        // given\n        var expandedSubProcess = elementRegistry.get('AdHocSubProcess_1');\n\n        // when\n        var collapsedSubProcess = bpmnReplace.replaceElement(expandedSubProcess,\n          {\n            type: 'bpmn:AdHocSubProcess',\n            isExpanded: false\n          }\n        );\n\n        // then +-marker is set\n        expect(getDi(collapsedSubProcess).isExpanded).to.eql(false);\n      })\n    );\n\n\n    it('keep ad-hoc and multiInstance-marker',\n      inject(function(elementRegistry, bpmnReplace) {\n\n        // given\n        var expandedSubProcess = elementRegistry.get('AdHocSubProcess_1');\n\n        // when\n        var collapsedSubProcess = bpmnReplace.replaceElement(expandedSubProcess,\n          {\n            type: 'bpmn:AdHocSubProcess',\n            isExpanded: false\n          }\n        );\n\n        // then\n        expect(is(collapsedSubProcess, 'bpmn:AdHocSubProcess')).to.eql(true);\n        var businessObject = collapsedSubProcess.businessObject;\n        expect(businessObject.loopCharacteristics).not.to.be.undefined;\n      })\n    );\n\n\n    it('moves all children to plane',\n      inject(function(elementRegistry, bpmnReplace) {\n\n        // given\n        var expandedSubProcess = elementRegistry.get('AdHocSubProcess_1');\n        var originalChildren = expandedSubProcess.children.slice();\n\n        // when\n        bpmnReplace.replaceElement(expandedSubProcess,\n          {\n            type: 'bpmn:SubProcess',\n            isExpanded: false\n          }\n        );\n\n        // then\n        var plane = elementRegistry.get('AdHocSubProcess_1_plane');\n        originalChildren.forEach(function(c) {\n          expect(plane.children).to.include(c);\n        });\n      })\n    );\n\n\n    describe('resize', function() {\n\n      it('is centered and has default bounds',\n        inject(function(elementRegistry, bpmnReplace) {\n\n          // given\n          var expandedSubProcess = elementRegistry.get('AdHocSubProcess_1');\n          var oldMid = {\n            x: expandedSubProcess.x + expandedSubProcess.width / 2,\n            y: expandedSubProcess.y + expandedSubProcess.height / 2\n          };\n\n          // when\n          var collapsedSubProcess = bpmnReplace.replaceElement(expandedSubProcess,\n            {\n              type: 'bpmn:AdHocSubProcess',\n              isExpanded: false\n            }\n          );\n\n          // then\n          var newMid = {\n            x: collapsedSubProcess.x + collapsedSubProcess.width / 2,\n            y: collapsedSubProcess.y + collapsedSubProcess.height / 2\n          };\n\n          expect(newMid).to.eql(oldMid);\n          expect(collapsedSubProcess.width).to.be.at.least(defaultSize.width);\n          expect(collapsedSubProcess.height).to.be.at.least(defaultSize.height);\n\n        })\n      );\n\n    });\n\n\n    describe('undo', function() {\n\n      it('collapsed marker is removed',\n        inject(function(elementRegistry, bpmnReplace, commandStack) {\n\n          // given\n          var expandedSubProcess = elementRegistry.get('AdHocSubProcess_1');\n          var collapsedSubProcess = bpmnReplace.replaceElement(expandedSubProcess,\n            {\n              type: 'bpmn:AdHocSubProcess',\n              isExpanded: false\n            }\n          );\n\n          // when\n          commandStack.undo();\n\n          // then +-marker is placed\n          expect(getDi(collapsedSubProcess).isExpanded).to.eql(true);\n        })\n      );\n\n\n      it('originalBounds are restored',\n        inject(function(elementRegistry, bpmnReplace, commandStack) {\n\n          // given\n          var expandedSubProcess = elementRegistry.get('AdHocSubProcess_1');\n          var originalBounds = {\n            x: expandedSubProcess.x,\n            y: expandedSubProcess.y,\n            width: expandedSubProcess.width,\n            height: expandedSubProcess.height\n          };\n\n          bpmnReplace.replaceElement(expandedSubProcess,\n            {\n              type: 'bpmn:AdHocSubProcess',\n              isExpanded: false\n            }\n          );\n\n          // when\n          commandStack.undo();\n\n          // then\n          expect(expandedSubProcess).to.have.bounds(originalBounds);\n        })\n      );\n\n\n      it('show children that were visible',\n        inject(function(elementRegistry, bpmnReplace, commandStack) {\n\n          // given\n          var expandedSubProcess = elementRegistry.get('AdHocSubProcess_1');\n          var originalChildren = expandedSubProcess.children.slice();\n\n          bpmnReplace.replaceElement(expandedSubProcess,\n            {\n              type: 'bpmn:AdHocSubProcess',\n              isExpanded: false\n            }\n          );\n\n          // when\n          commandStack.undo();\n\n          // then keep children\n          originalChildren.forEach(function(c) {\n            expect(expandedSubProcess.children).to.include(c);\n          });\n\n          // and show the previously visible ones\n          expect(expandedSubProcess.children).to.satisfy(allShown());\n        })\n      );\n\n    });\n  });\n\n\n  describe('attaching marker', function() {\n\n    describe('collapsed', function() {\n\n      it('add ad-hoc-marker does not call toggleProvider',\n        inject(function(eventBus, bpmnReplace, elementRegistry) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('SubProcess_3');\n\n          // should not be called\n          eventBus.once('commandStack.shape.toggleCollapse.execute', function(e) {\n            expect(true).to.eql(false);\n          });\n\n          // when\n          bpmnReplace.replaceElement(collapsedSubProcess,\n            {\n              type: 'bpmn:AdHocSubProcess',\n              isExpanded: false\n            }\n          );\n\n          // then\n\n        })\n      );\n\n\n      it('remove ad-hoc-marker does not call toggleProvider',\n        inject(function(eventBus, bpmnReplace, elementRegistry) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('SubProcess_4');\n\n          // should not be called\n          eventBus.once('commandStack.shape.toggleCollapse.execute', function(e) {\n            expect(true).to.eql(false);\n          });\n\n          // when\n          bpmnReplace.replaceElement(collapsedSubProcess,\n            {\n              type: 'bpmn:SubProcess',\n              isExpanded: false\n            }\n          );\n\n          // then\n\n        })\n      );\n\n    });\n\n\n    describe('expanded', function() {\n\n      it('add ad-hoc-marker does not call toggleProvider',\n        inject(function(eventBus, bpmnReplace, elementRegistry) {\n\n          // given\n          var expandedSubProcess = elementRegistry.get('SubProcess_6');\n\n          // should not be called\n          eventBus.once('commandStack.shape.toggleCollapse.execute', function(e) {\n            expect(true).to.eql(false);\n          });\n\n          // when\n          bpmnReplace.replaceElement(expandedSubProcess,\n            {\n              type: 'bpmn:AdHocSubProcess',\n              isExpanded: true\n            }\n          );\n\n          // then\n\n        })\n      );\n\n\n      it('remove ad-hoc-marker does not call toggleProvider',\n        inject(function(eventBus, bpmnReplace, elementRegistry) {\n\n          // given\n          var expandedSubProcess = elementRegistry.get('AdHocSubProcess_1');\n\n          // should not be called\n          eventBus.once('commandStack.shape.toggleCollapse.execute', function(e) {\n            expect(true).to.eql(false);\n          });\n\n          // when\n          bpmnReplace.replaceElement(expandedSubProcess,\n            {\n              type: 'bpmn:SubProcess',\n              isExpanded: true\n            }\n          );\n\n          // then\n\n        })\n      );\n\n    });\n\n  });\n\n\n});\n\n\n// helpers //////////////////////\n\n\nfunction allHidden() {\n  return childrenHidden(true);\n}\n\nfunction allShown() {\n  return childrenHidden(false);\n}\n\nfunction childrenHidden(hidden) {\n  return function(children) {\n    return children.every(function(child) {\n\n      // empty labels are allways hidden\n      if (child.type === 'label' && !child.businessObject.name) {\n        return child.hidden;\n      }\n      else {\n        return !!child.hidden == hidden;\n      }\n    });\n  };\n}\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/UnclaimIdBehaviorSpec.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1fc1ugd\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.3.5\">\n  <bpmn:collaboration id=\"Collaboration_1\">\n    <bpmn:participant id=\"Participant_1\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:endEvent id=\"EndEvent_1\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"EndEvent_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_0bwhkbn_di\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"-200\" y=\"-25\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1l3vzgi_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"-98\" y=\"82\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_1nvhsm6_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"-8\" y=\"82\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_12bzkef_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"-62\" y=\"100\" />\n        <di:waypoint x=\"-8\" y=\"100\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/UnclaimIdBehaviorSpec.js",
    "content": "import {\r\n  bootstrapModeler,\r\n  inject\r\n} from 'test/TestHelper';\r\n\r\nimport coreModule from 'lib/core';\r\nimport modelingModule from 'lib/features/modeling';\r\n\r\n\r\ndescribe('features/modeling - unclaim id', function() {\r\n\r\n  var testModules = [ coreModule, modelingModule ];\r\n\r\n  var diagramXML = require('./UnclaimIdBehaviorSpec.bpmn');\r\n\r\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\r\n\r\n\r\n  it('should unclaim ID of shape', inject(function(elementRegistry, moddle, modeling) {\r\n\r\n    // given\r\n    var startEvent = elementRegistry.get('StartEvent_1');\r\n\r\n    // when\r\n    modeling.removeElements([ startEvent ]);\r\n\r\n    // then\r\n    expect(moddle.ids.assigned('StartEvent_1')).to.be.false;\r\n  }));\r\n\r\n\r\n  it('should unclaim ID of process', inject(function(elementRegistry, moddle, modeling) {\r\n\r\n    // given\r\n    var participant = elementRegistry.get('Participant_1');\r\n\r\n    // when\r\n    modeling.removeElements([ participant ]);\r\n\r\n    // then\r\n    expect(moddle.ids.assigned('Process_1')).to.be.false;\r\n  }));\r\n\r\n\r\n  it('should unclaim ID of connection', inject(function(elementRegistry, moddle, modeling) {\r\n\r\n    // given\r\n    var sequenceFlow = elementRegistry.get('SequenceFlow_1');\r\n\r\n    // when\r\n    modeling.removeElements([ sequenceFlow ]);\r\n\r\n    // then\r\n    expect(moddle.ids.assigned('SequenceFlow_1')).to.be.false;\r\n  }));\r\n\r\n\r\n  it('should unclaim ID of children', inject(function(elementRegistry, moddle, modeling) {\r\n\r\n    // given\r\n    var participant = elementRegistry.get('Participant_1');\r\n\r\n    // when\r\n    modeling.removeElements([ participant ]);\r\n\r\n    // then\r\n    expect(moddle.ids.assigned('StartEvent_1')).to.be.false;\r\n    expect(moddle.ids.assigned('SequenceFlow_1')).to.be.false;\r\n    expect(moddle.ids.assigned('EndEvent_1')).to.be.false;\r\n  }));\r\n\r\n\r\n  it('should unclaim ID of root', inject(function(elementRegistry, moddle, modeling) {\r\n\r\n    // given\r\n    var participant = elementRegistry.get('Participant_1');\r\n\r\n    // when\r\n    modeling.removeElements([ participant ]);\r\n\r\n    // then\r\n    expect(moddle.ids.assigned('Collaboration_1')).to.be.false;\r\n  }));\r\n\r\n\r\n  describe('morphing', function() {\r\n    var simpleXML = require('../../../../fixtures/bpmn/simple.bpmn');\r\n\r\n    beforeEach(bootstrapModeler(simpleXML, { modules: testModules }));\r\n\r\n    it('should keep ID of root', inject(function(moddle, modeling) {\r\n\r\n      // when\r\n      modeling.makeCollaboration();\r\n\r\n      // then\r\n      expect(moddle.ids.assigned('Process_1')).to.exist;\r\n    }));\r\n\r\n  });\r\n\r\n});"
  },
  {
    "path": "test/spec/features/modeling/behavior/UnsetDefaultFlowBehaviorSpec.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:exclusiveGateway id=\"exclusive-gateway\" default=\"flow-default\">\n      <bpmn:outgoing>flow-default</bpmn:outgoing>\n      <bpmn:outgoing>flow-normal</bpmn:outgoing>\n    </bpmn:exclusiveGateway>\n    <bpmn:task id=\"task-default\">\n      <bpmn:incoming>flow-default</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"flow-default\" sourceRef=\"exclusive-gateway\" targetRef=\"task-default\" />\n    <bpmn:task id=\"task-normal\">\n      <bpmn:incoming>flow-normal</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"flow-normal\" sourceRef=\"exclusive-gateway\" targetRef=\"task-normal\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_1kqn7y5_di\" bpmnElement=\"exclusive-gateway\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"312\" y=\"105\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"292\" y=\"155\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_000sfne_di\" bpmnElement=\"task-default\">\n        <dc:Bounds x=\"561\" y=\"90\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0xihk8q_di\" bpmnElement=\"flow-default\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"362\" y=\"130\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"561\" y=\"130\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"416.5\" y=\"120\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_08sfs0b_di\" bpmnElement=\"task-normal\">\n        <dc:Bounds x=\"561\" y=\"272\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_07cihrc_di\" bpmnElement=\"flow-normal\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"337\" y=\"155\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"337\" y=\"312\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"561\" y=\"312\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"292\" y=\"223.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/UnsetDefaultFlowBehaviorSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - delete default connection', function() {\n\n  var testModules = [ coreModule, modelingModule ];\n\n  var processDiagramXML = require('./UnsetDefaultFlowBehaviorSpec.bpmn');\n\n  beforeEach(bootstrapModeler(processDiagramXML, { modules: testModules }));\n\n  var gateway,\n      defaultConnection,\n      normalConnection;\n\n  beforeEach(inject(function(elementRegistry) {\n    gateway = elementRegistry.get('exclusive-gateway');\n    defaultConnection = elementRegistry.get('flow-default');\n    normalConnection = elementRegistry.get('flow-normal');\n  }));\n\n\n  it('should remove default connection', inject(function(modeling) {\n\n    // when\n    modeling.removeConnection(defaultConnection);\n\n    // then\n    expect(defaultConnection.parent).to.be.null;\n    expect(gateway.businessObject.default).to.be.null; // .property('default');\n  }));\n\n\n  it('should revert default connection', inject(function(modeling, commandStack) {\n\n    // given\n    modeling.removeConnection(defaultConnection);\n\n    // when\n    commandStack.undo();\n\n    // then\n    expect(defaultConnection.parent).to.be.not.null;\n    expect(gateway.businessObject.default).to.eql(defaultConnection.businessObject);\n  }));\n\n\n  it('should NOT remove default connection on removing other connections', inject(function(modeling) {\n\n    // when\n    modeling.removeConnection(normalConnection);\n\n    // then\n    expect(normalConnection.parent).to.be.null;\n\n    expect(defaultConnection.parent).to.be.not.null;\n    expect(gateway.businessObject.default).to.eql(defaultConnection.businessObject);\n  }));\n\n\n  it('should NOT remove default connection on restoring other connections', inject(function(modeling, commandStack) {\n\n    // given\n    modeling.removeConnection(normalConnection);\n\n    // when\n    commandStack.undo();\n\n    // then\n    expect(normalConnection.parent).to.be.not.null;\n\n    expect(defaultConnection.parent).to.be.not.null;\n    expect(gateway.businessObject.default).to.eql(defaultConnection.businessObject);\n  }));\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/util/GeometricUtilSpec.js",
    "content": "import {\n  getDistancePointLine,\n  getAngle,\n  getDistancePointPoint,\n  perpendicularFoot,\n  rotateVector\n} from 'lib/features/modeling/behavior/util/GeometricUtil';\n\n\ndescribe('modeling/behavior/util - GeometricUtil', function() {\n\n  it('should re-export diagram-js utility', function() {\n\n    expect(getDistancePointLine).to.exist;\n    expect(getAngle).to.exist;\n    expect(getDistancePointPoint).to.exist;\n    expect(perpendicularFoot).to.exist;\n    expect(rotateVector).to.exist;\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/util/LabelLayoutUtilSpec.js",
    "content": "var getLabelAdjustment = require('lib/features/modeling/behavior/util/LabelLayoutUtil').getLabelAdjustment;\n\n\ndescribe('modeling/behavior/util - LabelLayoutUtil#getLabelAdjustment', function() {\n\n  describe('should recognize on the line label', function() {\n\n    var newLine = [\n      { x: 10, y: 10 },\n\n      // -\n      { x: 15, y: 10 },\n\n      // |\n      { x: 15, y: 5 },\n\n      // -\n      { x: 30, y: 5 }\n    ];\n\n\n    it('horizontal', function() {\n\n      // given\n      var line = [\n        { x: 10, y: 10 },\n\n        // -\n        { x: 20, y: 10 }\n      ];\n\n      // label with center { x: 5, y: 10 }\n\n      var label = {\n        x: 0,\n        y: 5,\n        width: 10,\n        height: 10\n      };\n\n      // when\n      var delta = getLabelAdjustment(label, newLine, line, { connectionStart: true });\n\n      // then\n      expect(delta).to.eql({ x: 0, y: 0 });\n    });\n\n\n    it('zero-length line', function() {\n\n      // given\n      var line = [\n        { x: 10, y: 10 },\n\n        // -\n        { x: 10, y: 10 }\n      ];\n\n      // label with center { x: 5, y: 10 }\n\n      var label = {\n        x: 0,\n        y: 5,\n        width: 10,\n        height: 10\n      };\n\n      // when\n      var delta = getLabelAdjustment(label, newLine, line, { connectionStart: true });\n\n      // then\n      expect(delta).to.eql({ x: 0, y: 0 });\n    });\n\n  });\n\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/util/LineAttachmentUtilSpec.js",
    "content": "var getAttachment = require('lib/features/modeling/behavior/util/LineAttachmentUtil').getAttachment;\n\nvar EPSILON = 0.1;\n\n\ndescribe('modeling/behavior/util - LineAttachmentUtil#getAttachment', function() {\n\n  // test line\n  //\n  // *--*\n  //    |\n  //    *\n  //     \\\n  //      *\n  //\n  var line = [\n    { x: 10, y: 10 },\n\n    // -\n    { x: 30, y: 10 },\n\n    // |\n    { x: 30, y: 30 },\n\n    // \\\n    { x: 130, y: 130 }\n  ];\n\n\n  describe('should recognize segment', function() {\n\n    it('horizontal', function() {\n\n      // when\n      var attachment = getAttachment({ x: 20, y: 5 }, line);\n\n      // then\n      expect(attachment).to.eql({\n        type: 'segment',\n        position: { x: 20, y: 10 },\n        segmentIndex: 0,\n        relativeLocation: 0.5\n      });\n    });\n\n\n    it('horizontal (on line)', function() {\n\n      // when\n      var attachment = getAttachment({ x: 20, y: 10 }, line);\n\n      // then\n      expect(attachment).to.eql({\n        type: 'segment',\n        position: { x: 20, y: 10 },\n        segmentIndex: 0,\n        relativeLocation: 0.5\n      });\n    });\n\n\n    it('vertical', function() {\n\n      // when\n      var attachment = getAttachment({ x: 40, y: 20 }, line);\n\n      // then\n      expect(attachment).to.eql({\n        type: 'segment',\n        position: { x: 30, y: 20 },\n        segmentIndex: 1,\n        relativeLocation: 0.5\n      });\n    });\n\n\n    it('diagonal', function() {\n\n      // when\n      var attachment = getAttachment({ x: 30, y: 40 }, line);\n\n      // then\n      expect(attachment).to.eql({\n        type: 'segment',\n        position: { x: 35, y: 35 },\n        segmentIndex: 2,\n        relativeLocation: 0.05\n      });\n    });\n\n\n    it('diagonal (on line)', function() {\n\n      // when\n      var attachment = getAttachment({ x: 50, y: 50 }, line);\n\n      // then\n      expect(attachment).to.eql({\n        type: 'segment',\n        position: { x: 50, y: 50 },\n        segmentIndex: 2,\n        relativeLocation: 0.2\n      });\n    });\n\n\n    it('horizontal (conflicting with vertical)', function() {\n\n      // when\n      var attachment = getAttachment({ x: 25, y: 15 }, line);\n\n      // then\n      expect(attachment).to.eql({\n        type: 'segment',\n        position: { x: 25, y: 10 },\n        segmentIndex: 0,\n        relativeLocation: 0.75\n      });\n    });\n\n  });\n\n\n  describe('should recognize bendpoint', function() {\n\n    it('horizontal', function() {\n\n      // when\n      var attachment = getAttachment({ x: 35, y: 5 }, line);\n\n      // then\n      expect(attachment).to.eql({\n        type: 'bendpoint',\n        position: { x: 30, y: 10 },\n        bendpointIndex: 1,\n        segmentIndex: 0\n      });\n    });\n\n\n    it('horizontal (segment start)', function() {\n\n      // when\n      var attachment = getAttachment({ x: 5, y: 5 }, line);\n\n      // then\n      expect(attachment).to.eql({\n        type: 'bendpoint',\n        position: { x: 10, y: 10 },\n        bendpointIndex: 0,\n        segmentIndex: 0\n      });\n    });\n\n\n    it('vertical', function() {\n\n      // when\n      var attachment = getAttachment({ x: 35, y: 10 }, line);\n\n      // then\n      expect(attachment).to.eql({\n        type: 'bendpoint',\n        position: { x: 30, y: 10 },\n        bendpointIndex: 1,\n        segmentIndex: 0\n      });\n    });\n\n\n    it('vertical (segment start)', function() {\n\n      var otherLine = [\n        { x: 10, y: 10 },\n        { x: 10, y: 50 }\n      ];\n\n      // when\n      var attachment = getAttachment({ x: 5, y: 5 }, otherLine);\n\n      // then\n      expect(attachment).to.eql({\n        type: 'bendpoint',\n        position: { x: 10, y: 10 },\n        bendpointIndex: 0,\n        segmentIndex: 0\n      });\n    });\n\n  });\n\n\n  describe('should handle float values', function() {\n\n    // test line\n    //\n    // *--*\n    //    |\n    //    *\n    //     \\\n    //      *\n    //\n    var floatingPointLine = [\n      { x: 10.141592, y: 10.653589 },\n\n      // -\n      { x: 30.793238, y: 10.462643 },\n\n      // |\n      { x: 30.383279, y: 30.502884 },\n\n      // \\\n      { x: 130.197169, y: 130.399375 }\n    ];\n\n\n    it('float value segment', function() {\n\n      // when\n      var attachment = getAttachment({ x: 20.197169, y: 5.399375 }, floatingPointLine);\n\n      // then\n      expect(attachment.type).to.equal('segment');\n      expect(attachment.segmentIndex).to.equal(0);\n\n      // expect values to be roughly equal\n      expect(attachment.relativeLocation).to.be.within(0.5 - EPSILON, 0.5 + EPSILON);\n      expect(attachment.position.x).to.be.within(20.25 - EPSILON, 20.25 + EPSILON);\n      expect(attachment.position.y).to.be.within(10.5 - EPSILON, 10.5 + EPSILON);\n    });\n\n\n    it('float value bendboint', function() {\n\n      // when\n      var attachment = getAttachment({ x: 35.197169, y: 5.399375 }, floatingPointLine);\n\n      // then\n      expect(attachment.type).to.equal('bendpoint');\n      expect(attachment.segmentIndex).to.equal(1);\n      expect(attachment.bendpointIndex).to.equal(1);\n\n      // expect values to be roughly equal\n      expect(attachment.position.x).to.be.within(30.793 - EPSILON, 30.793 + EPSILON);\n      expect(attachment.position.y).to.be.within(10.463 - EPSILON, 10.463 + EPSILON);\n    });\n\n  });\n\n\n  describe('handle zero-length line', function() {\n\n    var zeroLengthLine = [\n      { x: 10, y: 10 },\n\n      // -\n      { x: 10, y: 10 }\n    ];\n\n\n    var zeroLengthFloatingPointLine = [\n      { x: 10.1, y: 10.12313 },\n\n      // -\n      { x: 10, y: 10.112 }\n    ];\n\n\n    it('should treat zero-length as bendpoint attach', function() {\n\n      // when\n      var attachment = getAttachment({ x: 15.1, y: 15.123 }, zeroLengthLine);\n\n      // then\n      expect(attachment).to.eql({\n        type: 'bendpoint',\n        position: { x: 10, y: 10 },\n        segmentIndex: 0,\n        bendpointIndex: 0\n      });\n    });\n\n\n    it('should treat approx zero-length as bendpoint attach', function() {\n\n      // when\n      var attachment = getAttachment({ x: 15.1, y: 15.123 }, zeroLengthFloatingPointLine);\n\n      // then\n      expect(attachment).to.eql({\n        type: 'bendpoint',\n        position: { x: 10.1, y: 10.12313 },\n        segmentIndex: 0,\n        bendpointIndex: 0\n      });\n    });\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/behavior/util/LineIntersectSpec.js",
    "content": "import intersection from 'lib/features/modeling/behavior/util/LineIntersect';\n\n\ndescribe('modeling/behavior/util - LineIntersect', function() {\n\n  it('should compute intersections', function() {\n    expect(intersection(\n      { x: 10, y: 20 }, { x: 50, y: 50 },\n      { x: 10, y: 50 }, { x: 50, y: 50 }\n    )).to.eql({ x: 50, y: 50 });\n\n    expect(intersection(\n      { x: 10, y: 20 }, { x: 10, y: 50 },\n      { x: 10, y: 50 }, { x: 50, y: 50 }\n    )).to.eql({ x: 10, y: 50 });\n\n    expect(intersection(\n      { x: 50, y: 50 }, { x: 10, y: 40 },\n      { x: 10, y: 50 }, { x: 50, y: 50 }\n    )).to.eql({ x: 50, y: 50 });\n\n    expect(intersection(\n      { x: 0, y: 0 }, { x: 100, y: 100 },\n      { x: 40, y: 0 }, { x: 30, y: 10 }\n    )).to.eql({ x: 20, y: 20 });\n\n  });\n\n});"
  },
  {
    "path": "test/spec/features/modeling/behavior/util/ResizeUtilSpec.js",
    "content": "import {\n  getParticipantResizeConstraints\n} from 'lib/features/modeling/behavior/util/ResizeUtil';\n\n\ndescribe('modeling/behavior/util - Resize', function() {\n\n  describe('#getParticipantResizeConstraints', function() {\n\n    it('should expose', function() {\n      expect(getParticipantResizeConstraints).to.exist;\n    });\n\n  });\n\n});"
  },
  {
    "path": "test/spec/features/modeling/input-output/DataInputOutput.bpmn",
    "content": "<semantic:definitions xmlns:semantic=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:color=\"http://www.omg.org/spec/BPMN/non-normative/color/1.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"_af3cbf6a-9c69-460b-9a1d-276711d30213\" targetNamespace=\"http://www.trisotech.com/definitions/_af3cbf6a-9c69-460b-9a1d-276711d30213\" expressionLanguage=\"http://www.w3.org/1999/XPath\" exporter=\"BPMN Modeler\" exporterVersion=\"6.1.22\" name=\"Travel Booking with Event Subprocess\">\n    <semantic:process id=\"_898aa942-9a96-4405-ae71-22b5e2e3d235\" name=\"Simple Travel Booking\" isClosed=\"false\">\n        <semantic:ioSpecification>\n            <semantic:dataInput name=\"Input\" isCollection=\"false\" id=\"DataInput\"/>\n            <semantic:dataOutput name=\"Output\" isCollection=\"false\" id=\"DataOutput\"/>\n            <semantic:inputSet id=\"_9f9aea93-30cd-4899-bbe1-e62165c3dbc9\">\n                <semantic:dataInputRefs>DataInput</semantic:dataInputRefs>\n            </semantic:inputSet>\n            <semantic:outputSet id=\"_8154d47e-5733-41c1-8125-29ff926b3cd2\">\n                <semantic:dataOutputRefs>DataOutput</semantic:dataOutputRefs>\n            </semantic:outputSet>\n        </semantic:ioSpecification>\n        <semantic:sendTask id=\"_9cc2ac34-f12c-49e0-b37c-144e5a84fd92\" name=\"Process Data\" implementation=\"##WebService\">\n            <semantic:ioSpecification>\n                <semantic:dataInput id=\"_9628422b-85a6-4857-8c14-7289b9fd9a8a\"/>\n                <semantic:dataOutput id=\"_29b8c649-e2a0-4dd3-804b-567e8cc71718\"/>\n                <semantic:inputSet id=\"_1957232b-478c-49d4-b3a7-86da323a1629\">\n                    <semantic:dataInputRefs>_9628422b-85a6-4857-8c14-7289b9fd9a8a</semantic:dataInputRefs>\n                </semantic:inputSet>\n                <semantic:outputSet id=\"_eb462f09-2a8c-43fb-b398-09da73357dde\">\n                    <semantic:dataOutputRefs>_29b8c649-e2a0-4dd3-804b-567e8cc71718</semantic:dataOutputRefs>\n                </semantic:outputSet>\n            </semantic:ioSpecification>\n            <semantic:dataInputAssociation id=\"_82006a49-2cc8-4814-83e2-28c5a85a4c4a\">\n                <semantic:sourceRef>DataInput</semantic:sourceRef>\n                <semantic:targetRef>_9628422b-85a6-4857-8c14-7289b9fd9a8a</semantic:targetRef>\n            </semantic:dataInputAssociation>\n            <semantic:dataOutputAssociation id=\"_ef945053-2c76-4796-8d8b-afc6be8bbfec\">\n                <semantic:sourceRef>_29b8c649-e2a0-4dd3-804b-567e8cc71718</semantic:sourceRef>\n                <semantic:targetRef>DataOutput</semantic:targetRef>\n            </semantic:dataOutputAssociation>\n        </semantic:sendTask>\n    </semantic:process>\n    <bpmndi:BPMNDiagram id=\"_f1aecfc3-a3da-4bde-bece-87786e25273d\" name=\"Simple Travel Booking\">\n        <bpmndi:BPMNPlane bpmnElement=\"_898aa942-9a96-4405-ae71-22b5e2e3d235\" id=\"_f1aecfc3-a3da-4bde-bece-87786e25273d_plane\">\n            <bpmndi:BPMNShape id=\"DataOutput_di\" bpmnElement=\"DataOutput\">\n                <dc:Bounds x=\"285\" y=\"150\" width=\"34\" height=\"40\"/>\n                <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n                    <dc:Bounds height=\"12\" width=\"30\" x=\"285\" y=\"195\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape id=\"DataInput_di\" bpmnElement=\"DataInput\">\n                <dc:Bounds x=\"100\" y=\"100\" width=\"34\" height=\"40\"/>\n                <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n                    <dc:Bounds height=\"12\" width=\"30\" x=\"100\" y=\"150\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNShape id=\"_8eb52f6a-0fd6-4fad-8ade-14bca1b066bf\" bpmnElement=\"_9cc2ac34-f12c-49e0-b37c-144e5a84fd92\">\n                <dc:Bounds x=\"167\" y=\"200\" width=\"96\" height=\"76\"/>\n                <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n                    <dc:Bounds height=\"26\" width=\"89\" x=\"170.5\" y=\"261.9739767206677\"/>\n                </bpmndi:BPMNLabel>\n            </bpmndi:BPMNShape>\n            <bpmndi:BPMNEdge id=\"_fa1439cb-56e1-4399-bfe8-638b37a16866\" bpmnElement=\"_82006a49-2cc8-4814-83e2-28c5a85a4c4a\" targetElement=\"_8eb52f6a-0fd6-4fad-8ade-14bca1b066bf\">\n                <di:waypoint x=\"135\" y=\"113.99809778522484\"/>\n                <di:waypoint x=\"215\" y=\"113.99809778522484\"/>\n                <di:waypoint x=\"215\" y=\"200\"/>\n                <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\"/>\n            </bpmndi:BPMNEdge>\n            <bpmndi:BPMNEdge id=\"_9f83d262-8e6a-47f5-84b3-86f560fbfcec\" bpmnElement=\"_ef945053-2c76-4796-8d8b-afc6be8bbfec\" sourceElement=\"_9cc2ac34-f12c-49e0-b37c-144e5a84fd92\">\n                <di:waypoint x=\"230\" y=\"200\"/>\n                <di:waypoint x=\"230\" y=\"170\"/>\n                <di:waypoint x=\"285\" y=\"170\"/>\n                <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\"/>\n            </bpmndi:BPMNEdge>\n        </bpmndi:BPMNPlane>\n        <bpmndi:BPMNLabelStyle id=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_0\">\n            <dc:Font name=\"Arial\" size=\"11\" isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\"/>\n        </bpmndi:BPMNLabelStyle>\n        <bpmndi:BPMNLabelStyle id=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n            <dc:Font name=\"arial,helvetica,sans-serif\" size=\"11\" isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\"/>\n        </bpmndi:BPMNLabelStyle>\n    </bpmndi:BPMNDiagram>\n</semantic:definitions>"
  },
  {
    "path": "test/spec/features/modeling/lanes/AddLaneSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject,\n  getBpmnJS\n} from 'test/TestHelper';\n\nimport {\n  map,\n  pick\n} from 'min-dash';\n\nimport contextPadModule from 'lib/features/context-pad';\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\n\nimport {\n  getChildLanes\n} from 'lib/features/modeling/util/LaneUtil';\n\nimport { query as domQuery } from 'min-dom';\n\nvar DEFAULT_LANE_HEIGHT = 120,\n    DEFAULT_VERTICAL_LANE_WIDTH = 120;\n\nvar testModules = [ coreModule, modelingModule ];\n\n\nfunction getBounds(element) {\n  return pick(element, [ 'x', 'y', 'width', 'height' ]);\n}\n\n\ndescribe('features/modeling - add Lane', function() {\n\n  describe('nested Lanes', function() {\n\n    var diagramXML = require('./lanes.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    it('should add after Lane', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Lane_A'),\n          belowLaneShape = elementRegistry.get('Lane_B');\n\n      // when\n      var newLane = modeling.addLane(laneShape, 'bottom');\n\n      // then\n      expect(newLane).to.have.bounds({\n        x: laneShape.x,\n        y: laneShape.y + laneShape.height,\n        width: laneShape.width,\n        height: DEFAULT_LANE_HEIGHT\n      });\n\n      // below lanes got moved by { dy: + LANE_HEIGHT }\n      expect(belowLaneShape).to.have.bounds({\n        x: laneShape.x,\n        y: laneShape.y + laneShape.height + DEFAULT_LANE_HEIGHT - 1,\n        width: laneShape.width,\n        height: belowLaneShape.height\n      });\n\n      expect(laneShape.di.isHorizontal).to.be.true;\n      expect(belowLaneShape.di.isHorizontal).to.be.true;\n      expect(newLane.di.isHorizontal).to.be.true;\n    }));\n\n\n    it('should add before Lane', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Lane_B'),\n          aboveLaneShape = elementRegistry.get('Lane_A');\n\n      // when\n      var newLane = modeling.addLane(laneShape, 'top');\n\n      // then\n      expect(newLane).to.have.bounds({\n        x: laneShape.x,\n        y: laneShape.y - DEFAULT_LANE_HEIGHT,\n        width: laneShape.width,\n        height: DEFAULT_LANE_HEIGHT\n      });\n\n      // below lanes got moved by { dy: + LANE_HEIGHT }\n      expect(aboveLaneShape).to.have.bounds({\n        x: laneShape.x,\n        y: laneShape.y - aboveLaneShape.height - DEFAULT_LANE_HEIGHT + 1,\n        width: laneShape.width,\n        height: aboveLaneShape.height\n      });\n\n      expect(laneShape.di.isHorizontal).to.be.true;\n      expect(aboveLaneShape.di.isHorizontal).to.be.true;\n      expect(newLane.di.isHorizontal).to.be.true;\n    }));\n\n\n    it('should add horizontal Lane after', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Lane_A'),\n          belowLaneShape = elementRegistry.get('Lane_B');\n\n      // when\n      var newLane = modeling.addLane(laneShape, 'right');\n\n      // then\n      expect(laneShape.di.isHorizontal).to.be.true;\n      expect(belowLaneShape.di.isHorizontal).to.be.true;\n      expect(newLane.di.isHorizontal).to.be.true;\n    }));\n\n\n    it('should add horizontal Lane before', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Lane_B'),\n          aboveLaneShape = elementRegistry.get('Lane_A');\n\n      // when\n      var newLane = modeling.addLane(laneShape, 'left');\n\n      // then\n      expect(laneShape.di.isHorizontal).to.be.true;\n      expect(aboveLaneShape.di.isHorizontal).to.be.true;\n      expect(newLane.di.isHorizontal).to.be.true;\n    }));\n\n\n    it('should add before nested Lane', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Nested_Lane_A'),\n          participantShape = elementRegistry.get('Participant_Lane'),\n          participantBounds = getBounds(participantShape);\n\n      // when\n      var newLane = modeling.addLane(laneShape, 'top');\n\n      // then\n      expect(newLane).to.have.bounds({\n        x: laneShape.x,\n        y: laneShape.y - DEFAULT_LANE_HEIGHT,\n        width: laneShape.width,\n        height: DEFAULT_LANE_HEIGHT\n      });\n\n      // participant got enlarged { top: + LANE_HEIGHT }\n      expect(participantShape).to.have.bounds({\n        x: participantBounds.x,\n        y: participantBounds.y - newLane.height,\n        width: participantBounds.width,\n        height: participantBounds.height + newLane.height\n      });\n\n      expect(participantShape.di.isHorizontal).to.be.true;\n      expect(laneShape.di.isHorizontal).to.be.true;\n      expect(newLane.di.isHorizontal).to.be.true;\n    }));\n\n\n    it('should add after Participant', inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Participant_Lane'),\n          participantBounds = getBounds(participantShape),\n          lastLaneShape = elementRegistry.get('Lane_B'),\n          lastLaneBounds = getBounds(lastLaneShape);\n\n      // when\n      var newLane = modeling.addLane(participantShape, 'bottom');\n\n      // then\n      expect(newLane).to.have.bounds({\n        x: participantBounds.x + 30,\n        y: participantBounds.y + participantBounds.height,\n        width: participantBounds.width - 30,\n        height: DEFAULT_LANE_HEIGHT\n      });\n\n      // last lane kept position\n      expect(lastLaneShape).to.have.bounds(lastLaneBounds);\n\n      // participant got enlarged by { dy: + LANE_HEIGHT } at bottom\n      expect(participantShape).to.have.bounds({\n        x: participantBounds.x,\n        y: participantBounds.y,\n        width: participantBounds.width,\n        height: participantBounds.height + DEFAULT_LANE_HEIGHT\n      });\n\n      expect(participantShape.di.isHorizontal).to.be.true;\n      expect(lastLaneShape.di.isHorizontal).to.be.true;\n      expect(newLane.di.isHorizontal).to.be.true;\n    }));\n\n\n    it('should add before Participant', inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Participant_Lane'),\n          participantBounds = getBounds(participantShape),\n          firstLaneShape = elementRegistry.get('Lane_A'),\n          firstLaneBounds = getBounds(firstLaneShape);\n\n      // when\n      var newLane = modeling.addLane(participantShape, 'top');\n\n      // then\n      expect(newLane).to.have.bounds({\n        x: participantBounds.x + 30,\n        y: participantBounds.y - DEFAULT_LANE_HEIGHT,\n        width: participantBounds.width - 30,\n        height: DEFAULT_LANE_HEIGHT\n      });\n\n      // first lane kept position\n      expect(firstLaneShape).to.have.bounds(firstLaneBounds);\n\n      // participant got enlarged by { dy: + LANE_HEIGHT } at bottom\n      expect(participantShape).to.have.bounds({\n        x: participantBounds.x,\n        y: participantBounds.y - DEFAULT_LANE_HEIGHT,\n        width: participantBounds.width,\n        height: participantBounds.height + DEFAULT_LANE_HEIGHT\n      });\n\n      expect(participantShape.di.isHorizontal).to.be.true;\n      expect(firstLaneShape.di.isHorizontal).to.be.true;\n      expect(newLane.di.isHorizontal).to.be.true;\n    }));\n\n  });\n\n\n  describe('nested vertical Lanes', function() {\n\n    var diagramXML = require('./lanes.vertical.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    it('should add after Lane', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Vertical_Lane_A'),\n          rightLaneShape = elementRegistry.get('Vertical_Lane_B');\n\n      // when\n      var newLane = modeling.addLane(laneShape, 'right');\n\n      // then\n      expect(newLane).to.have.bounds({\n        x: laneShape.x + laneShape.width,\n        y: laneShape.y,\n        height: laneShape.height,\n        width: DEFAULT_VERTICAL_LANE_WIDTH\n      });\n\n      // right lanes got moved by { dx: + DEFAULT_VERTICAL_LANE_WIDTH }\n      expect(rightLaneShape).to.have.bounds({\n        x: laneShape.x + laneShape.width + DEFAULT_VERTICAL_LANE_WIDTH,\n        y: laneShape.y,\n        width: rightLaneShape.width,\n        height: laneShape.height\n      });\n\n      expect(laneShape.di.isHorizontal).to.be.false;\n      expect(rightLaneShape.di.isHorizontal).to.be.false;\n      expect(newLane.di.isHorizontal).to.be.false;\n\n    }));\n\n\n    it('should add before Lane', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Vertical_Lane_B'),\n          leftLaneShape = elementRegistry.get('Vertical_Lane_A');\n\n      // when\n      var newLane = modeling.addLane(laneShape, 'left');\n\n      // then\n      expect(newLane).to.have.bounds({\n        x: laneShape.x - DEFAULT_VERTICAL_LANE_WIDTH,\n        y: laneShape.y,\n        width: DEFAULT_VERTICAL_LANE_WIDTH,\n        height: laneShape.height\n      });\n\n      // right lanes got moved by { dx: + DEFAULT_VERTICAL_LANE_WIDTH }\n      expect(leftLaneShape).to.have.bounds({\n        x: laneShape.x - leftLaneShape.width - DEFAULT_VERTICAL_LANE_WIDTH,\n        y: laneShape.y,\n        width: leftLaneShape.width,\n        height: laneShape.height\n      });\n\n      expect(laneShape.di.isHorizontal).to.be.false;\n      expect(leftLaneShape.di.isHorizontal).to.be.false;\n      expect(newLane.di.isHorizontal).to.be.false;\n    }));\n\n\n    it('should add vertical Lane after', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Vertical_Lane_A'),\n          rightLaneShape = elementRegistry.get('Vertical_Lane_B');\n\n      // when\n      var newLane = modeling.addLane(laneShape, 'bottom');\n\n      // then\n      expect(laneShape.di.isHorizontal).to.be.false;\n      expect(rightLaneShape.di.isHorizontal).to.be.false;\n      expect(newLane.di.isHorizontal).to.be.false;\n\n    }));\n\n\n    it('should add vertical Lane before', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Vertical_Lane_B'),\n          leftLaneShape = elementRegistry.get('Vertical_Lane_A');\n\n      // when\n      var newLane = modeling.addLane(laneShape, 'top');\n\n      // then\n      expect(laneShape.di.isHorizontal).to.be.false;\n      expect(leftLaneShape.di.isHorizontal).to.be.false;\n      expect(newLane.di.isHorizontal).to.be.false;\n    }));\n\n\n    it('should add before nested Lane', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Nested_Vertical_Lane_A'),\n          participantShape = elementRegistry.get('Vertical_Participant_Lane'),\n          participantBounds = getBounds(participantShape);\n\n      // when\n      var newLane = modeling.addLane(laneShape, 'left');\n\n      // then\n      expect(newLane).to.have.bounds({\n        x: laneShape.x - DEFAULT_VERTICAL_LANE_WIDTH,\n        y: laneShape.y,\n        width: DEFAULT_VERTICAL_LANE_WIDTH,\n        height: laneShape.height\n      });\n\n      // participant got enlarged { left: + DEFAULT_VERTICAL_LANE_WIDTH }\n      expect(participantShape).to.have.bounds({\n        x: participantBounds.x - newLane.width,\n        y: participantBounds.y,\n        width: participantBounds.width + newLane.width,\n        height: participantBounds.height\n      });\n\n      expect(laneShape.di.isHorizontal).to.be.false;\n      expect(participantShape.di.isHorizontal).to.be.false;\n      expect(newLane.di.isHorizontal).to.be.false;\n    }));\n\n\n    it('should add after Participant', inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Vertical_Participant_Lane'),\n          participantBounds = getBounds(participantShape),\n          lastLaneShape = elementRegistry.get('Vertical_Lane_B'),\n          lastLaneBounds = getBounds(lastLaneShape);\n\n      // when\n      var newLane = modeling.addLane(participantShape, 'right');\n\n      // then\n      expect(newLane).to.have.bounds({\n        x: participantBounds.x + participantBounds.width,\n        y: participantBounds.y + 30,\n        width: DEFAULT_VERTICAL_LANE_WIDTH,\n        height: participantBounds.height - 30\n      });\n\n      // last lane kept position\n      expect(lastLaneShape).to.have.bounds(lastLaneBounds);\n\n      // participant got enlarged by { dx: + DEFAULT_VERTICAL_LANE_WIDTH } to the right\n      expect(participantShape).to.have.bounds({\n        x: participantBounds.x,\n        y: participantBounds.y,\n        width: participantBounds.width + DEFAULT_VERTICAL_LANE_WIDTH,\n        height: participantBounds.height\n      });\n\n      expect(participantShape.di.isHorizontal).to.be.false;\n      expect(lastLaneShape.di.isHorizontal).to.be.false;\n      expect(newLane.di.isHorizontal).to.be.false;\n\n    }));\n\n\n    it('should add before Participant', inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Vertical_Participant_Lane'),\n          participantBounds = getBounds(participantShape),\n          firstLaneShape = elementRegistry.get('Vertical_Lane_A'),\n          firstLaneBounds = getBounds(firstLaneShape);\n\n      // when\n      var newLane = modeling.addLane(participantShape, 'left');\n\n      // then\n      expect(newLane).to.have.bounds({\n        x: participantBounds.x - DEFAULT_VERTICAL_LANE_WIDTH,\n        y: participantBounds.y + 30,\n        width: DEFAULT_VERTICAL_LANE_WIDTH,\n        height: participantBounds.height - 30\n      });\n\n      // first lane kept position\n      expect(firstLaneShape).to.have.bounds(firstLaneBounds);\n\n      // participant got enlarged by { dx: + DEFAULT_VERTICAL_LANE_WIDTH } to the left\n      expect(participantShape).to.have.bounds({\n        x: participantBounds.x - DEFAULT_VERTICAL_LANE_WIDTH,\n        y: participantBounds.y,\n        width: participantBounds.width + DEFAULT_VERTICAL_LANE_WIDTH,\n        height: participantBounds.height\n      });\n\n      expect(participantShape.di.isHorizontal).to.be.false;\n      expect(firstLaneShape.di.isHorizontal).to.be.false;\n      expect(newLane.di.isHorizontal).to.be.false;\n\n    }));\n\n  });\n\n\n  describe('without Participant', function() {\n\n    var diagramXML = require('./lanes.only.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    it('should add horizontal Lane after', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Lane_A'),\n          belowLaneShape = elementRegistry.get('Lane_B');\n\n      // when\n      var newLane = modeling.addLane(laneShape, 'right');\n\n      // then\n      expect(laneShape.di.isHorizontal).to.be.true;\n      expect(belowLaneShape.di.isHorizontal).to.be.true;\n      expect(newLane.di.isHorizontal).to.be.true;\n    }));\n\n\n    it('should add horizontal Lane before', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Lane_B'),\n          aboveLaneShape = elementRegistry.get('Lane_A');\n\n      // when\n      var newLane = modeling.addLane(laneShape, 'left');\n\n      // then\n      expect(laneShape.di.isHorizontal).to.be.true;\n      expect(aboveLaneShape.di.isHorizontal).to.be.true;\n      expect(newLane.di.isHorizontal).to.be.true;\n    }));\n\n  });\n\n\n  describe('vertical without Participant', function() {\n\n    var diagramXML = require('./lanes.only.vertical.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    it('should add vertical Lane after', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Vertical_Lane_A'),\n          rightLaneShape = elementRegistry.get('Vertical_Lane_B');\n\n      // when\n      var newLane = modeling.addLane(laneShape, 'bottom');\n\n      // then\n      expect(laneShape.di.isHorizontal).to.be.false;\n      expect(rightLaneShape.di.isHorizontal).to.be.false;\n      expect(newLane.di.isHorizontal).to.be.false;\n\n    }));\n\n\n    it('should add vertical Lane before', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Vertical_Lane_B'),\n          leftLaneShape = elementRegistry.get('Vertical_Lane_A');\n\n      // when\n      var newLane = modeling.addLane(laneShape, 'top');\n\n      // then\n      expect(laneShape.di.isHorizontal).to.be.false;\n      expect(leftLaneShape.di.isHorizontal).to.be.false;\n      expect(newLane.di.isHorizontal).to.be.false;\n    }));\n\n  });\n\n\n  describe('Participant without Lane', function() {\n\n    var diagramXML = require('./participant-no-lane.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    it('should add after Participant', inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Participant_No_Lane'),\n          participantBounds = getBounds(participantShape);\n\n      // when\n      modeling.addLane(participantShape, 'bottom');\n\n      var childLanes = getChildLanes(participantShape);\n\n      // then\n      expect(childLanes.length).to.eql(2);\n\n      var firstLane = childLanes[0],\n          secondLane = childLanes[1];\n\n      // new lane was added at participant location\n      expect(firstLane).to.have.bounds({\n        x: participantBounds.x + 30,\n        y: participantBounds.y,\n        width: participantBounds.width - 30,\n        height: participantBounds.height\n      });\n\n      expect(secondLane).to.have.bounds({\n        x: participantBounds.x + 30,\n        y: participantBounds.y + participantBounds.height,\n        width: participantBounds.width - 30,\n        height: DEFAULT_LANE_HEIGHT\n      });\n\n      expect(firstLane.di.isHorizontal).to.be.true;\n      expect(secondLane.di.isHorizontal).to.be.true;\n    }));\n\n\n    it('should add before Participant', inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Participant_No_Lane'),\n          participantBounds = getBounds(participantShape);\n\n      // when\n      modeling.addLane(participantShape, 'top');\n\n      var childLanes = getChildLanes(participantShape);\n\n      // then\n      expect(childLanes.length).to.eql(2);\n\n      var firstLane = childLanes[0],\n          secondLane = childLanes[1];\n\n      // new lane was added at participant location\n      expect(firstLane).to.have.bounds({\n        x: participantBounds.x + 30,\n        y: participantBounds.y,\n        width: participantBounds.width - 30,\n        height: participantBounds.height\n      });\n\n      expect(secondLane).to.have.bounds({\n        x: participantBounds.x + 30,\n        y: participantBounds.y - DEFAULT_LANE_HEIGHT,\n        width: participantBounds.width - 30,\n        height: DEFAULT_LANE_HEIGHT\n      });\n\n      expect(firstLane.di.isHorizontal).to.be.true;\n      expect(secondLane.di.isHorizontal).to.be.true;\n    }));\n\n  });\n\n\n  describe('vertical Participant without Lane', function() {\n\n    var diagramXML = require('./participant-no-lane-vertical.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    it('should add after Participant', inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Vertical_Participant_No_Lane'),\n          participantBounds = getBounds(participantShape);\n\n      // when\n      modeling.addLane(participantShape, 'right');\n\n      var childLanes = getChildLanes(participantShape);\n\n      // then\n      expect(childLanes.length).to.eql(2);\n\n      var firstLane = childLanes[0],\n          secondLane = childLanes[1];\n\n      // new lane was added at participant location\n      expect(firstLane).to.have.bounds({\n        x: participantBounds.x,\n        y: participantBounds.y + 30,\n        width: participantBounds.width,\n        height: participantBounds.height - 30\n      });\n\n      expect(secondLane).to.have.bounds({\n        x: participantBounds.x + participantBounds.width,\n        y: participantBounds.y + 30,\n        width: DEFAULT_VERTICAL_LANE_WIDTH,\n        height: participantBounds.height - 30\n      });\n\n      expect(firstLane.di.isHorizontal).to.be.false;\n      expect(secondLane.di.isHorizontal).to.be.false;\n    }));\n\n\n    it('should add before Participant', inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Vertical_Participant_No_Lane'),\n          participantBounds = getBounds(participantShape);\n\n      // when\n      modeling.addLane(participantShape, 'left');\n\n      var childLanes = getChildLanes(participantShape);\n\n      // then\n      expect(childLanes.length).to.eql(2);\n\n      var firstLane = childLanes[0],\n          secondLane = childLanes[1];\n\n      // new lane was added at participant location\n      expect(firstLane).to.have.bounds({\n        x: participantBounds.x,\n        y: participantBounds.y + 30,\n        width: participantBounds.width,\n        height: participantBounds.height - 30\n      });\n\n      expect(secondLane).to.have.bounds({\n        x: participantBounds.x - DEFAULT_VERTICAL_LANE_WIDTH,\n        y: participantBounds.y + 30,\n        width: DEFAULT_VERTICAL_LANE_WIDTH,\n        height: participantBounds.height - 30\n      });\n\n      expect(firstLane.di.isHorizontal).to.be.false;\n      expect(secondLane.di.isHorizontal).to.be.false;\n    }));\n\n  });\n\n\n  describe('flow node handling - basics', function() {\n\n    var diagramXML = require('./lanes.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    it('should move up flow nodes and sequence flows', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Nested_Lane_B'),\n          task_Boundary = elementRegistry.get('Task_Boundary'),\n          boundary = elementRegistry.get('Boundary'),\n          sequenceFlow = elementRegistry.get('SequenceFlow'),\n          sequenceFlow_From_Boundary = elementRegistry.get('SequenceFlow_From_Boundary');\n\n      // when\n      var newLane = modeling.addLane(laneShape, 'top');\n\n      // then\n      expect(task_Boundary).to.have.position({ x: 264, y: -57 });\n      expect(boundary).to.have.position({ x: 311, y: 5 });\n\n      expect(sequenceFlow_From_Boundary).to.have.waypoints([\n        { x: 329, y: 161 - newLane.height },\n        { x: 329, y: 188 - newLane.height },\n        { x: 482, y: 188 - newLane.height },\n        { x: 482, y: 143 - newLane.height }\n      ]);\n\n      expect(sequenceFlow).to.have.waypoints([\n        { x: 364, y: 103 - newLane.height },\n        { x: 432, y: 103 - newLane.height }\n      ]);\n    }));\n\n  });\n\n\n  describe('flow node handling - basics vertical', function() {\n\n    var diagramXML = require('./lanes.vertical.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    it('should move left flow nodes and sequence flows', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Nested_Vertical_Lane_B'),\n          task_Boundary = elementRegistry.get('V_Task_Boundary'),\n          boundary = elementRegistry.get('V_Boundary'),\n          sequenceFlow = elementRegistry.get('Flow_V'),\n          sequenceFlow_From_Boundary = elementRegistry.get('Flow_From_V_Boundary');\n\n      // when\n      var newLane = modeling.addLane(laneShape, 'left');\n\n      // then\n      expect(task_Boundary).to.have.position({ x: 190 - newLane.width, y: 170 });\n      expect(boundary).to.have.position({ x: 272 - newLane.width, y: 212 });\n\n      expect(sequenceFlow_From_Boundary).to.have.waypoints([\n        { x: 308 - newLane.width, y: 230 },\n        { x: 320 - newLane.width, y: 230 },\n        { x: 320 - newLane.width, y: 370 },\n        { x: 290 - newLane.width, y: 370 }\n      ]);\n\n      expect(sequenceFlow).to.have.waypoints([\n        { x: 240 - newLane.width, y: 250 },\n        { x: 240 - newLane.width, y: 330 }\n      ]);\n    }));\n\n  });\n\n\n  describe('flow node handling', function() {\n\n    var diagramXML = require('./lanes-flow-nodes.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    function addLaneAbove(laneId) {\n\n      return getBpmnJS().invoke(function(elementRegistry, modeling) {\n        var existingLane = elementRegistry.get(laneId);\n\n        expect(existingLane).to.exist;\n\n        return modeling.addLane(existingLane, 'top');\n      });\n    }\n\n    function addLaneBelow(laneId) {\n\n      return getBpmnJS().invoke(function(elementRegistry, modeling) {\n        var existingLane = elementRegistry.get(laneId);\n\n        expect(existingLane).to.exist;\n\n        return modeling.addLane(existingLane, 'bottom');\n      });\n    }\n\n\n    it('should move flow nodes', inject(function(elementRegistry, modeling) {\n\n      // given\n      var task_Boundary = elementRegistry.get('Task_Boundary'),\n          taskPosition = getPosition(task_Boundary),\n          boundary = elementRegistry.get('Boundary'),\n          boundaryPosition = getPosition(boundary);\n\n      // when\n      addLaneAbove('Nested_Lane_B');\n\n      // then\n      expect(task_Boundary).to.have.position({ x: taskPosition.x, y: taskPosition.y - 120 });\n      expect(boundary).to.have.position({ x: boundaryPosition.x, y: boundaryPosition.y - 120 });\n    }));\n\n\n    it('should move sequence flows', inject(function(elementRegistry, modeling) {\n\n      // given\n      var sequenceFlow = elementRegistry.get('SequenceFlow'),\n          sequenceFlowWaypoints = sequenceFlow.waypoints,\n          sequenceFlow_From_Boundary = elementRegistry.get('SequenceFlow_From_Boundary'),\n          sequenceFlow_From_BoundaryWaypoints = sequenceFlow_From_Boundary.waypoints;\n\n      // when\n      addLaneAbove('Nested_Lane_B');\n\n      // then\n      expect(sequenceFlow_From_Boundary).to.have.waypoints(\n        moveWaypoints(sequenceFlow_From_BoundaryWaypoints, 0, -120)\n      );\n\n      expect(sequenceFlow).to.have.waypoints(\n        moveWaypoints(sequenceFlowWaypoints, 0, -120)\n      );\n    }));\n\n\n    it('should move message flows when lane added above', inject(function(elementRegistry) {\n\n      // given\n      var messageFlow = elementRegistry.get('MessageFlowAbove'),\n          messageFlowWaypoints = messageFlow.waypoints;\n\n      // when\n      addLaneAbove('Nested_Lane_B');\n\n      // then\n      expect(messageFlow).to.have.waypoints([\n        movePosition(messageFlowWaypoints[0], 0, -120),\n        messageFlowWaypoints[1]\n      ]);\n    }));\n\n\n    it('should move message flows when lane added below', inject(function(elementRegistry) {\n\n      // given\n      var messageFlow = elementRegistry.get('MessageFlowBelow'),\n          messageFlowWaypoints = messageFlow.waypoints;\n\n      // when\n      addLaneBelow('Nested_Lane_B');\n\n      // then\n      expect(messageFlow).to.have.waypoints([\n        messageFlowWaypoints[0],\n        movePosition(messageFlowWaypoints[1], 0, 120)\n      ]);\n    }));\n\n\n    it('should move external labels', inject(function(elementRegistry, modeling) {\n\n      // given\n      var event = elementRegistry.get('Event'),\n          label = event.label,\n          labelPosition = getPosition(label),\n          boundary = elementRegistry.get('Boundary'),\n          boundaryLabel = boundary.label,\n          boundaryLabelPosition = getPosition(boundaryLabel);\n\n      // TODO(nikku): consolidate import + editing behavior => not consistent right now\n\n      // when\n      // force move label to trigger label editing + update parent behavior\n      modeling.moveElements([ label ], { x: 0, y: 0 });\n\n      addLaneAbove('Nested_Lane_B');\n\n      // then\n      expect(label).to.have.position({\n        x: labelPosition.x,\n        y: labelPosition.y - 120\n      });\n\n      expect(boundaryLabel).to.have.position({\n        x: boundaryLabelPosition.x,\n        y: boundaryLabelPosition.y - 120\n      });\n    }));\n\n  });\n\n\n  describe('flow node handling - vertical', function() {\n\n    var diagramXML = require('./lanes-flow-nodes-vertical.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    function addLaneLeft(laneId) {\n\n      return getBpmnJS().invoke(function(elementRegistry, modeling) {\n        var existingLane = elementRegistry.get(laneId);\n\n        expect(existingLane).to.exist;\n\n        return modeling.addLane(existingLane, 'left');\n      });\n    }\n\n    function addLaneRight(laneId) {\n\n      return getBpmnJS().invoke(function(elementRegistry, modeling) {\n        var existingLane = elementRegistry.get(laneId);\n\n        expect(existingLane).to.exist;\n\n        return modeling.addLane(existingLane, 'right');\n      });\n    }\n\n\n    it('should move flow nodes', inject(function(elementRegistry, modeling) {\n\n      // given\n      var task_Boundary = elementRegistry.get('V_Task_Boundary'),\n          taskPosition = getPosition(task_Boundary),\n          boundary = elementRegistry.get('V_Boundary'),\n          boundaryPosition = getPosition(boundary);\n\n      // when\n      addLaneLeft('Nested_Vertical_Lane_B');\n\n      // then\n      expect(task_Boundary).to.have.position({ x: taskPosition.x - 120, y: taskPosition.y });\n      expect(boundary).to.have.position({ x: boundaryPosition.x - 120, y: boundaryPosition.y });\n    }));\n\n\n    it('should move sequence flows', inject(function(elementRegistry, modeling) {\n\n      // given\n      var sequenceFlow = elementRegistry.get('Flow_V'),\n          sequenceFlowWaypoints = sequenceFlow.waypoints,\n          sequenceFlow_From_Boundary = elementRegistry.get('Flow_From_V_Boundary'),\n          sequenceFlow_From_BoundaryWaypoints = sequenceFlow_From_Boundary.waypoints;\n\n      // when\n      addLaneLeft('Nested_Vertical_Lane_B');\n\n      // then\n      expect(sequenceFlow_From_Boundary).to.have.waypoints(\n        moveWaypoints(sequenceFlow_From_BoundaryWaypoints, -120, 0)\n      );\n\n      expect(sequenceFlow).to.have.waypoints(\n        moveWaypoints(sequenceFlowWaypoints, -120, 0)\n      );\n    }));\n\n\n    it('should move message flows when lane added above', inject(function(elementRegistry) {\n\n      // given\n      var messageFlow = elementRegistry.get('MessageFlowLeft'),\n          messageFlowWaypoints = messageFlow.waypoints;\n\n      // when\n      addLaneLeft('Nested_Vertical_Lane_B');\n\n      // then\n      expect(messageFlow).to.have.waypoints([\n        movePosition(messageFlowWaypoints[0], -120, 0),\n        messageFlowWaypoints[1]\n      ]);\n    }));\n\n\n    it('should move message flows when lane added below', inject(function(elementRegistry) {\n\n      // given\n      var messageFlow = elementRegistry.get('MessageFlowRight'),\n          messageFlowWaypoints = messageFlow.waypoints;\n\n      // when\n      addLaneRight('Nested_Vertical_Lane_B');\n\n      // then\n      expect(messageFlow).to.have.waypoints([\n        messageFlowWaypoints[0],\n        movePosition(messageFlowWaypoints[1], 120, 0)\n      ]);\n    }));\n\n\n    it('should move external labels', inject(function(elementRegistry, modeling) {\n\n      // given\n      var event = elementRegistry.get('V_Event'),\n          label = event.label,\n          labelPosition = getPosition(label),\n          boundary = elementRegistry.get('V_Boundary'),\n          boundaryLabel = boundary.label,\n          boundaryLabelPosition = getPosition(boundaryLabel);\n\n      // TODO(nikku): consolidate import + editing behavior => not consistent right now\n\n      // when\n      // force move label to trigger label editing + update parent behavior\n      modeling.moveElements([ label ], { x: 0, y: 0 });\n\n      addLaneLeft('Nested_Vertical_Lane_B');\n\n      // then\n      expect(label).to.have.position({\n        x: labelPosition.x - 120,\n        y: labelPosition.y\n      });\n\n      expect(boundaryLabel).to.have.position({\n        x: boundaryLabelPosition.x - 120,\n        y: boundaryLabelPosition.y\n      });\n    }));\n\n  });\n\n\n  describe('Internet Explorer', function() {\n\n    var diagramXML = require('./participant-single-lane.bpmn');\n\n    var testModules = [\n      contextPadModule,\n      coreModule,\n      modelingModule\n    ];\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    // must be executed manually, cannot be reproduced programmatically\n    // https://github.com/bpmn-io/bpmn-js/issues/746\n    it('should NOT blow up in Internet Explorer', inject(\n      function(contextPad, elementRegistry) {\n\n        // given\n        var lane = elementRegistry.get('Lane_1');\n\n        contextPad.open(lane);\n\n        // mock event\n        var event = padEvent('lane-insert-below');\n\n        // when\n        contextPad.trigger('click', event);\n\n        // then\n        // expect Internet Explorer NOT to blow up\n      }\n    ));\n\n  });\n\n});\n\n// helpers //////////\n\nfunction padEntry(element, name) {\n  return domQuery('[data-action=\"' + name + '\"]', element);\n}\n\nfunction padEvent(entry) {\n\n  return getBpmnJS().invoke(function(overlays) {\n\n    var target = padEntry(overlays._overlayRoot, entry);\n\n    return {\n      target: target,\n      preventDefault: function() {},\n      clientX: 100,\n      clientY: 100\n    };\n  });\n}\n\nfunction getPosition(element) {\n  return {\n    x: element.x,\n    y: element.y\n  };\n}\n\nfunction moveWaypoints(waypoints, deltaX, deltaY) {\n  return map(waypoints, function(waypoint) {\n    return movePosition(waypoint, deltaX, deltaY);\n  });\n}\n\nfunction movePosition(point, deltaX, deltaY) {\n  return {\n    x: point.x + deltaX,\n    y: point.y + deltaY\n  };\n}\n"
  },
  {
    "path": "test/spec/features/modeling/lanes/DeleteLaneSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  pick\n} from 'min-dash';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - delete lane', function() {\n\n  var diagramXML = require('./lanes.bpmn');\n\n  var testModules = [ coreModule, modelingModule ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  it('should remove first Lane', inject(function(elementRegistry, modeling) {\n\n    // given\n    var laneShape = elementRegistry.get('Lane_A'),\n        belowLaneShape = elementRegistry.get('Lane_B'),\n        belowLaneBounds = getBounds(belowLaneShape);\n\n    // when\n    modeling.removeShape(laneShape);\n\n    // then\n    expect(belowLaneShape).to.have.bounds({\n      x: belowLaneBounds.x,\n      y: belowLaneBounds.y - laneShape.height,\n      width: belowLaneBounds.width,\n      height: belowLaneBounds.height + laneShape.height\n    });\n\n  }));\n\n\n  it('should remove last Lane', inject(function(elementRegistry, modeling) {\n\n    // given\n    var laneShape = elementRegistry.get('Lane_B'),\n        aboveLaneShape = elementRegistry.get('Lane_A'),\n        aboveLaneBounds = getBounds(aboveLaneShape);\n\n    // when\n    modeling.removeShape(laneShape);\n\n    // then\n    expect(aboveLaneShape).to.have.bounds({\n      x: aboveLaneBounds.x,\n      y: aboveLaneBounds.y,\n      width: aboveLaneShape.width,\n      height: aboveLaneBounds.height + laneShape.height\n    });\n\n  }));\n\n\n  describe('three lanes', function() {\n\n    it('should remove middle Lane', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Nested_Lane_B'),\n          aboveLaneShape = elementRegistry.get('Nested_Lane_A'),\n          aboveLaneBounds = getBounds(aboveLaneShape),\n          belowLaneShape = elementRegistry.get('Nested_Lane_C'),\n          belowLaneBounds = getBounds(belowLaneShape);\n\n      // when\n      modeling.removeShape(laneShape);\n\n      // then\n      expect(aboveLaneShape).to.have.bounds({\n        x: aboveLaneBounds.x,\n        y: aboveLaneBounds.y,\n        width: aboveLaneShape.width,\n        height: aboveLaneBounds.height + laneShape.height / 2\n      });\n\n      expect(belowLaneShape).to.have.bounds({\n        x: belowLaneBounds.x,\n        y: belowLaneBounds.y - laneShape.height / 2,\n        width: belowLaneBounds.width,\n        height: belowLaneBounds.height + laneShape.height / 2\n      });\n\n    }));\n\n\n    it('should remove first Lane', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Nested_Lane_A'),\n          belowLaneShape = elementRegistry.get('Nested_Lane_B'),\n          belowLaneBounds = getBounds(belowLaneShape),\n          lastLaneShape = elementRegistry.get('Nested_Lane_C'),\n          lastLaneBounds = getBounds(lastLaneShape);\n\n      // when\n      modeling.removeShape(laneShape);\n\n      // then\n      expect(belowLaneShape).to.have.bounds({\n        x: belowLaneBounds.x,\n        y: belowLaneBounds.y - laneShape.height,\n        width: belowLaneBounds.width,\n        height: belowLaneBounds.height + laneShape.height\n      });\n\n      expect(lastLaneShape).to.have.bounds(lastLaneBounds);\n\n    }));\n\n  });\n\n});\n\n\ndescribe('features/modeling - delete vertical lane', function() {\n\n  var diagramXML = require('./lanes.vertical.bpmn');\n\n  var testModules = [ coreModule, modelingModule ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  it('should remove first Lane', inject(function(elementRegistry, modeling) {\n\n    // given\n    var laneShape = elementRegistry.get('Vertical_Lane_A'),\n        rightSideLaneShape = elementRegistry.get('Vertical_Lane_B'),\n        rightSideLaneBounds = getBounds(rightSideLaneShape);\n\n    // when\n    modeling.removeShape(laneShape);\n\n    // then\n    expect(rightSideLaneShape).to.have.bounds({\n      x: rightSideLaneBounds.x - laneShape.width,\n      y: rightSideLaneBounds.y,\n      width: rightSideLaneBounds.width + laneShape.width,\n      height: rightSideLaneBounds.height\n    });\n\n  }));\n\n\n  it('should remove last Lane', inject(function(elementRegistry, modeling) {\n\n    // given\n    var laneShape = elementRegistry.get('Vertical_Lane_B'),\n        leftSideLaneShape = elementRegistry.get('Vertical_Lane_A'),\n        leftSideLaneBounds = getBounds(leftSideLaneShape);\n\n    // when\n    modeling.removeShape(laneShape);\n\n    // then\n    expect(leftSideLaneShape).to.have.bounds({\n      x: leftSideLaneBounds.x,\n      y: leftSideLaneBounds.y,\n      width: leftSideLaneBounds.width + laneShape.width,\n      height: leftSideLaneBounds.height\n    });\n\n  }));\n\n\n  describe('three lanes', function() {\n\n    it('should remove middle Lane', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Nested_Vertical_Lane_B'),\n          leftSideLaneShape = elementRegistry.get('Nested_Vertical_Lane_A'),\n          leftSideLaneBounds = getBounds(leftSideLaneShape),\n          rightSideLaneShape = elementRegistry.get('Nested_Vertical_Lane_C'),\n          rightSideLaneBounds = getBounds(rightSideLaneShape);\n\n      // when\n      modeling.removeShape(laneShape);\n\n      // then\n      expect(leftSideLaneShape).to.have.bounds({\n        x: leftSideLaneBounds.x,\n        y: leftSideLaneBounds.y,\n        width: leftSideLaneBounds.width + laneShape.width / 2,\n        height: leftSideLaneBounds.height\n      });\n\n      expect(rightSideLaneShape).to.have.bounds({\n        x: rightSideLaneBounds.x - laneShape.width / 2,\n        y: rightSideLaneBounds.y,\n        width: rightSideLaneBounds.width + laneShape.width / 2,\n        height: rightSideLaneBounds.height\n      });\n\n    }));\n\n\n    it('should remove first Lane', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Nested_Vertical_Lane_A'),\n          rightSideLaneShape = elementRegistry.get('Nested_Vertical_Lane_B'),\n          rightSideLaneBounds = getBounds(rightSideLaneShape),\n          lastLaneShape = elementRegistry.get('Nested_Vertical_Lane_C'),\n          lastLaneBounds = getBounds(lastLaneShape);\n\n      // when\n      modeling.removeShape(laneShape);\n\n      // then\n      expect(rightSideLaneShape).to.have.bounds({\n        x: rightSideLaneBounds.x - laneShape.width,\n        y: rightSideLaneBounds.y,\n        width: rightSideLaneBounds.width + laneShape.width,\n        height: rightSideLaneBounds.height\n      });\n\n      expect(lastLaneShape).to.have.bounds(lastLaneBounds);\n\n    }));\n\n  });\n\n});\n\n\n// helpers ///////////////\n\nfunction getBounds(element) {\n  return pick(element, [ 'x', 'y', 'width', 'height' ]);\n}"
  },
  {
    "path": "test/spec/features/modeling/lanes/ResizeLaneSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\nimport {\n  resizeTRBL\n} from 'diagram-js/lib/features/resize/ResizeUtil';\n\nimport {\n  pick\n} from 'min-dash';\n\nfunction getBounds(element) {\n  return pick(element, [ 'x', 'y', 'width', 'height' ]);\n}\n\n\ndescribe('features/modeling - resize lane', function() {\n\n  var diagramXML = require('./lanes.bpmn');\n\n  var testModules = [ coreModule, modelingModule ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  describe('vertical', function() {\n\n    describe('compensating', function() {\n\n      it('should expand Lane top', inject(function(elementRegistry, modeling) {\n\n        // given\n        var laneShape = elementRegistry.get('Lane_A'),\n            participantShape = elementRegistry.get('Participant_Lane');\n\n        var newLaneBounds = resizeTRBL(laneShape, { top: -50 });\n\n        var expectedParticipantBounds = resizeTRBL(participantShape, { top: -50 });\n\n        // when\n        modeling.resizeLane(laneShape, newLaneBounds, false);\n\n        // then\n        expect(laneShape).to.have.bounds(newLaneBounds);\n        expect(participantShape).to.have.bounds(expectedParticipantBounds);\n      }));\n\n\n      it('should shrink Lane top', inject(function(elementRegistry, modeling) {\n\n        // given\n        var laneShape = elementRegistry.get('Lane_A'),\n            participantShape = elementRegistry.get('Participant_Lane');\n\n        var newLaneBounds = resizeTRBL(laneShape, { top: 50 });\n\n        var expectedParticipantBounds = resizeTRBL(participantShape, { top: 50 });\n\n        // when\n        modeling.resizeLane(laneShape, newLaneBounds, false);\n\n        // then\n        expect(laneShape).to.have.bounds(newLaneBounds);\n        expect(participantShape).to.have.bounds(expectedParticipantBounds);\n      }));\n\n\n      it('should shrink Participant top', inject(function(elementRegistry, modeling) {\n\n        // given\n        var laneShape = elementRegistry.get('Lane_A'),\n            participantShape = elementRegistry.get('Participant_Lane');\n\n        var newParticipantBounds = resizeTRBL(participantShape, { top: 50 });\n\n        var expectedLaneBounds = resizeTRBL(laneShape, { top: 50 });\n\n        // when\n        modeling.resizeLane(participantShape, newParticipantBounds, false);\n\n        // then\n        expect(participantShape).to.have.bounds(newParticipantBounds);\n        expect(laneShape).to.have.bounds(expectedLaneBounds);\n      }));\n\n\n      it('should shrink Lane bottom', inject(function(elementRegistry, modeling) {\n\n        // given\n        var laneShape = elementRegistry.get('Lane_A'),\n            nextLaneShape = elementRegistry.get('Lane_B'),\n            nestedLaneShape = elementRegistry.get('Nested_Lane_C'),\n            participantShape = elementRegistry.get('Participant_Lane');\n\n        var newLaneBounds = resizeTRBL(laneShape, { bottom: -50 });\n\n        var expectedParticipantBounds = resizeTRBL(participantShape, { bottom: -50 }),\n            expectedNextLaneBounds = resizeTRBL(nextLaneShape, { top: -50, bottom: -50 }),\n            expectedNestedLaneBounds = resizeTRBL(nestedLaneShape, { bottom: -50 });\n\n        // when\n        modeling.resizeLane(laneShape, newLaneBounds, false);\n\n        // then\n        expect(laneShape).to.have.bounds(newLaneBounds);\n        expect(participantShape).to.have.bounds(expectedParticipantBounds);\n        expect(nestedLaneShape).to.have.bounds(expectedNestedLaneBounds);\n        expect(nextLaneShape).to.have.bounds(expectedNextLaneBounds);\n      }));\n\n\n      it('should expand Lane bottom', inject(function(elementRegistry, modeling) {\n\n        // given\n        var laneShape = elementRegistry.get('Lane_A'),\n            nextLaneShape = elementRegistry.get('Lane_B'),\n            nestedLaneShape = elementRegistry.get('Nested_Lane_C'),\n            participantShape = elementRegistry.get('Participant_Lane');\n\n        var newLaneBounds = resizeTRBL(laneShape, { bottom: 50 });\n\n        var expectedParticipantBounds = resizeTRBL(participantShape, { bottom: 50 }),\n            expectedNextLaneBounds = resizeTRBL(nextLaneShape, { top: 50, bottom: 50 }),\n            expectedNestedLaneBounds = resizeTRBL(nestedLaneShape, { bottom: 50 });\n\n        // when\n        modeling.resizeLane(laneShape, newLaneBounds, false);\n\n        // then\n        expect(laneShape).to.have.bounds(newLaneBounds);\n        expect(participantShape).to.have.bounds(expectedParticipantBounds);\n        expect(nestedLaneShape).to.have.bounds(expectedNestedLaneBounds);\n        expect(nextLaneShape).to.have.bounds(expectedNextLaneBounds);\n      }));\n\n    });\n\n\n    describe('enlarging / shrinking', function() {\n\n      it('should expand Lane top', inject(function(elementRegistry, modeling) {\n\n        // given\n        var laneShape = elementRegistry.get('Lane_A'),\n            participantShape = elementRegistry.get('Participant_Lane');\n\n        var newLaneBounds = resizeTRBL(laneShape, { top: -50 });\n\n        var expectedParticipantBounds = resizeTRBL(participantShape, { top: -50 });\n\n        // when\n        modeling.resizeLane(laneShape, newLaneBounds);\n\n        // then\n        expect(laneShape).to.have.bounds(newLaneBounds);\n        expect(participantShape).to.have.bounds(expectedParticipantBounds);\n      }));\n\n\n      it('should shrink Lane top', inject(function(elementRegistry, modeling) {\n\n        // given\n        var laneShape = elementRegistry.get('Lane_A'),\n            participantShape = elementRegistry.get('Participant_Lane');\n\n        var newLaneBounds = resizeTRBL(laneShape, { top: 50 });\n\n        var expectedParticipantBounds = resizeTRBL(participantShape, { top: 50 });\n\n        // when\n        modeling.resizeLane(laneShape, newLaneBounds);\n\n        // then\n        expect(laneShape).to.have.bounds(newLaneBounds);\n        expect(participantShape).to.have.bounds(expectedParticipantBounds);\n      }));\n\n\n      it('should shrink Participant top', inject(function(elementRegistry, modeling) {\n\n        // given\n        var laneShape = elementRegistry.get('Lane_A'),\n            participantShape = elementRegistry.get('Participant_Lane');\n\n        var newParticipantBounds = resizeTRBL(participantShape, { top: 50 });\n\n        var expectedLaneBounds = resizeTRBL(laneShape, { top: 50 });\n\n        // when\n        modeling.resizeLane(participantShape, newParticipantBounds);\n\n        // then\n        expect(participantShape).to.have.bounds(newParticipantBounds);\n        expect(laneShape).to.have.bounds(expectedLaneBounds);\n      }));\n\n\n      it('should move up above Lane', inject(function(elementRegistry, modeling) {\n\n        // given\n        var laneShape = elementRegistry.get('Lane_A'),\n            nextLaneShape = elementRegistry.get('Lane_B'),\n            nestedLaneShape = elementRegistry.get('Nested_Lane_C'),\n            participantShape = elementRegistry.get('Participant_Lane');\n\n        var newLaneBounds = resizeTRBL(laneShape, { bottom: -50 });\n\n        var expectedParticipantBounds = getBounds(participantShape),\n            expectedNextLaneBounds = resizeTRBL(nextLaneShape, { top: -50 + 1 /* compensation */ }),\n            expectedNestedLaneBounds = resizeTRBL(nestedLaneShape, { bottom: -50 });\n\n        // when\n        modeling.resizeLane(laneShape, newLaneBounds);\n\n        // then\n        expect(laneShape).to.have.bounds(newLaneBounds);\n        expect(participantShape).to.have.bounds(expectedParticipantBounds);\n        expect(nestedLaneShape).to.have.bounds(expectedNestedLaneBounds);\n        expect(nextLaneShape).to.have.bounds(expectedNextLaneBounds);\n      }));\n\n\n      it('should move down below Lane', inject(function(elementRegistry, modeling) {\n\n        // given\n        var laneShape = elementRegistry.get('Lane_A'),\n            nextLaneShape = elementRegistry.get('Lane_B'),\n            nestedLaneShape = elementRegistry.get('Nested_Lane_C'),\n            participantShape = elementRegistry.get('Participant_Lane');\n\n        var newLaneBounds = resizeTRBL(laneShape, { bottom: 50 });\n\n        var expectedParticipantBounds = getBounds(participantShape),\n            expectedNextLaneBounds = resizeTRBL(nextLaneShape, { top: 50 + 1 /* compensation */ }),\n            expectedNestedLaneBounds = resizeTRBL(nestedLaneShape, { bottom: 50 });\n\n        // when\n        modeling.resizeLane(laneShape, newLaneBounds);\n\n        // then\n        expect(laneShape).to.have.bounds(newLaneBounds);\n        expect(participantShape).to.have.bounds(expectedParticipantBounds);\n        expect(nestedLaneShape).to.have.bounds(expectedNestedLaneBounds);\n        expect(nextLaneShape).to.have.bounds(expectedNextLaneBounds);\n      }));\n\n    });\n\n  });\n\n\n  describe('horizontal', function() {\n\n    it('should expand Lane left', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Lane_A'),\n          participantShape = elementRegistry.get('Participant_Lane');\n\n      var newLaneBounds = resizeTRBL(laneShape, { left: -50 });\n\n      var expectedParticipantBounds = resizeTRBL(participantShape, { left: -50 });\n\n      // when\n      modeling.resizeLane(laneShape, newLaneBounds);\n\n      // then\n      expect(laneShape).to.have.bounds(newLaneBounds);\n      expect(participantShape).to.have.bounds(expectedParticipantBounds);\n    }));\n\n\n    it('should shrink Lane left', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Lane_A'),\n          participantShape = elementRegistry.get('Participant_Lane');\n\n      var newLaneBounds = resizeTRBL(laneShape, { left: 50 });\n\n      var expectedParticipantBounds = resizeTRBL(participantShape, { left: 50 });\n\n      // when\n      modeling.resizeLane(laneShape, newLaneBounds);\n\n      // then\n      expect(laneShape).to.have.bounds(newLaneBounds);\n      expect(participantShape).to.have.bounds(expectedParticipantBounds);\n    }));\n\n\n    it('should shrink Participant left', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Lane_A'),\n          participantShape = elementRegistry.get('Participant_Lane');\n\n      var newParticipantBounds = resizeTRBL(participantShape, { left: 50 });\n\n      var expectedLaneBounds = resizeTRBL(laneShape, { left: 50 });\n\n      // when\n      modeling.resizeLane(participantShape, newParticipantBounds);\n\n      // then\n      expect(participantShape).to.have.bounds(newParticipantBounds);\n      expect(laneShape).to.have.bounds(expectedLaneBounds);\n    }));\n\n\n    it('should shrink Lane right', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Lane_A'),\n          nextLaneShape = elementRegistry.get('Lane_B'),\n          nestedLaneShape = elementRegistry.get('Nested_Lane_C'),\n          participantShape = elementRegistry.get('Participant_Lane');\n\n      var newLaneBounds = resizeTRBL(laneShape, { right: -50 });\n\n      var expectedParticipantBounds = resizeTRBL(participantShape, { right: -50 }),\n          expectedNextLaneBounds = resizeTRBL(nextLaneShape, { right: -50 }),\n          expectedNestedLaneBounds = resizeTRBL(nestedLaneShape, { right: -50 });\n\n      // when\n      modeling.resizeLane(laneShape, newLaneBounds);\n\n      // then\n      expect(laneShape).to.have.bounds(newLaneBounds);\n      expect(participantShape).to.have.bounds(expectedParticipantBounds);\n      expect(nestedLaneShape).to.have.bounds(expectedNestedLaneBounds);\n      expect(nextLaneShape).to.have.bounds(expectedNextLaneBounds);\n    }));\n\n\n    it('should expand Lane right', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Lane_A'),\n          nextLaneShape = elementRegistry.get('Lane_B'),\n          nestedLaneShape = elementRegistry.get('Nested_Lane_C'),\n          participantShape = elementRegistry.get('Participant_Lane');\n\n      var newLaneBounds = resizeTRBL(laneShape, { right: 50 });\n\n      var expectedParticipantBounds = resizeTRBL(participantShape, { right: 50 }),\n          expectedNextLaneBounds = resizeTRBL(nextLaneShape, { right: 50 }),\n          expectedNestedLaneBounds = resizeTRBL(nestedLaneShape, { right: 50 });\n\n      // when\n      modeling.resizeLane(laneShape, newLaneBounds);\n\n      // then\n      expect(laneShape).to.have.bounds(newLaneBounds);\n      expect(participantShape).to.have.bounds(expectedParticipantBounds);\n      expect(nestedLaneShape).to.have.bounds(expectedNestedLaneBounds);\n      expect(nextLaneShape).to.have.bounds(expectedNextLaneBounds);\n    }));\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/lanes/SplitLane.nested.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_0czfmdy\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.5.0\">\n  <bpmn:collaboration id=\"Collaboration_166yin4\">\n    <bpmn:participant id=\"Participant\" name=\"Participant\" processRef=\"Process\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process\" isExecutable=\"true\">\n    <bpmn:laneSet id=\"LaneSet_113taei\">\n      <bpmn:lane id=\"Lane\" name=\"Lane\">\n        <bpmn:flowNodeRef>Event</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Task</bpmn:flowNodeRef>\n      </bpmn:lane>\n    </bpmn:laneSet>\n    <bpmn:startEvent id=\"Event\" name=\"Event\">\n      <bpmn:outgoing>SequenceFlow_192h0e0</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Task\" name=\"Task\">\n      <bpmn:incoming>SequenceFlow_192h0e0</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_192h0e0\" sourceRef=\"Event\" targetRef=\"Task\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_166yin4\">\n      <bpmndi:BPMNShape id=\"Participant_00t6m8v_di\" bpmnElement=\"Participant\" isHorizontal=\"true\">\n        <dc:Bounds x=\"170\" y=\"90\" width=\"791\" height=\"450\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"Event\">\n        <dc:Bounds x=\"323\" y=\"152\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"327\" y=\"195\" width=\"29\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_05q93nk_di\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"411\" y=\"130\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_192h0e0_di\" bpmnElement=\"SequenceFlow_192h0e0\">\n        <di:waypoint x=\"359\" y=\"170\" />\n        <di:waypoint x=\"411\" y=\"170\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Lane_1f7sfho_di\" bpmnElement=\"Lane\" isHorizontal=\"true\">\n        <dc:Bounds x=\"200\" y=\"90\" width=\"761\" height=\"450\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/lanes/SplitLane.nested.vertical.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_0czfmdy\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.19.0\">\n  <bpmn:collaboration id=\"Collaboration_166yin4\">\n    <bpmn:participant id=\"Vertical_Participant\" name=\"Vertical_Participant\" processRef=\"Process_Vertical\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_Vertical\" isExecutable=\"true\">\n    <bpmn:laneSet id=\"LaneSet_0qcwvbj\">\n      <bpmn:lane id=\"Vertical_Lane\" name=\"Vertical_Lane\">\n        <bpmn:flowNodeRef>Event_2</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Activity_2</bpmn:flowNodeRef>\n      </bpmn:lane>\n    </bpmn:laneSet>\n    <bpmn:startEvent id=\"Event_2\" name=\"Event\">\n      <bpmn:outgoing>Flow_0vlrl5f</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Activity_2\" name=\"Task\">\n      <bpmn:incoming>Flow_0vlrl5f</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"Flow_0vlrl5f\" sourceRef=\"Event_2\" targetRef=\"Activity_2\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_166yin4\">\n      <bpmndi:BPMNShape id=\"BPMNShape_189ueu2\" bpmnElement=\"Vertical_Participant\" isHorizontal=\"false\">\n        <dc:Bounds x=\"170\" y=\"90\" width=\"450\" height=\"791\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_17r7sue\" bpmnElement=\"Vertical_Lane\" isHorizontal=\"false\">\n        <dc:Bounds x=\"170\" y=\"120\" width=\"450\" height=\"761\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0pxo6ob\" bpmnElement=\"Event_2\">\n        <dc:Bounds x=\"232\" y=\"243\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"275\" y=\"253\" width=\"30\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0gattmp\" bpmnElement=\"Activity_2\">\n        <dc:Bounds x=\"210\" y=\"331\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_0wfri6v\" bpmnElement=\"Flow_0vlrl5f\">\n        <di:waypoint x=\"250\" y=\"279\" />\n        <di:waypoint x=\"250\" y=\"331\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/lanes/SplitLaneSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nvar pick = require('min-dash').pick;\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\nvar getChildLanes = require('lib/features/modeling/util/LaneUtil').getChildLanes;\n\n\nfunction getBounds(element) {\n  return pick(element, [ 'x', 'y', 'width', 'height' ]);\n}\n\n\ndescribe('features/modeling - SplitLane', function() {\n\n  var testModules = [ coreModule, modelingModule ];\n\n\n  describe('should split Participant with Lane', function() {\n\n    var diagramXML = require('./participant-lane.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    it('into two lanes', inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Participant_Lane'),\n          existingLane = elementRegistry.get('Lane'),\n          oldBounds = getBounds(participantShape);\n\n      // when\n      modeling.splitLane(participantShape, 2);\n\n      var childLanes = getChildLanes(participantShape);\n\n      var newLaneHeight = Math.round(participantShape.height / 2);\n\n      // then\n\n      // participant has original size\n      expect(participantShape).to.have.bounds(oldBounds);\n\n      // and two child lanes\n      expect(childLanes.length).to.eql(2);\n\n      // with the first lane being the original one\n      expect(childLanes[0]).to.equal(existingLane);\n\n      // with respective bounds\n      expect(childLanes[0]).to.have.bounds({\n        x: participantShape.x + 30,\n        y: participantShape.y,\n        width: participantShape.width - 30,\n        height: newLaneHeight\n      });\n\n      expect(childLanes[1]).to.have.bounds({\n        x: participantShape.x + 30,\n        y: participantShape.y + newLaneHeight,\n        width: participantShape.width - 30,\n        height: newLaneHeight - 1 // compensate for rounding issues\n      });\n\n      // with participant's direction\n      expect(childLanes[0].di.isHorizontal).to.be.true;\n      expect(childLanes[1].di.isHorizontal).to.be.true;\n    }));\n\n\n    it('into three lanes', inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Participant_Lane'),\n          existingLane = elementRegistry.get('Lane'),\n          oldBounds = getBounds(participantShape);\n\n      // when\n      modeling.splitLane(participantShape, 3);\n\n      var childLanes = getChildLanes(participantShape);\n\n      var newLaneHeight = Math.round(participantShape.height / 3);\n\n      // then\n\n      // participant has original size\n      expect(participantShape).to.have.bounds(oldBounds);\n\n      // and two child lanes\n      expect(childLanes.length).to.eql(3);\n\n      // with the first lane being the original one\n      expect(childLanes[0]).to.equal(existingLane);\n\n      // with respective bounds\n      expect(childLanes[0]).to.have.bounds({\n        x: participantShape.x + 30,\n        y: participantShape.y,\n        width: participantShape.width - 30,\n        height: newLaneHeight\n      });\n\n      expect(childLanes[1]).to.have.bounds({\n        x: participantShape.x + 30,\n        y: participantShape.y + newLaneHeight,\n        width: participantShape.width - 30,\n        height: newLaneHeight\n      });\n\n      expect(childLanes[2]).to.have.bounds({\n        x: participantShape.x + 30,\n        y: participantShape.y + newLaneHeight * 2,\n        width: participantShape.width - 30,\n        height: newLaneHeight - 1 // compensate for rounding issues\n      });\n\n      // with participant's direction\n      expect(childLanes[0].di.isHorizontal).to.be.true;\n      expect(childLanes[1].di.isHorizontal).to.be.true;\n      expect(childLanes[2].di.isHorizontal).to.be.true;\n    }));\n\n  });\n\n\n  describe('should split vertical Participant with Lane', function() {\n\n    var diagramXML = require('./participant-lane-vertical.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    it('into two lanes', inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Vertical_Participant_Lane'),\n          existingLane = elementRegistry.get('Vertical_Lane'),\n          oldBounds = getBounds(participantShape);\n\n      // when\n      modeling.splitLane(participantShape, 2);\n\n      var childLanes = getChildLanes(participantShape);\n\n      var newLaneWidth = Math.round(participantShape.width / 2);\n\n      // then\n\n      // participant has original size\n      expect(participantShape).to.have.bounds(oldBounds);\n\n      // and two child lanes\n      expect(childLanes.length).to.eql(2);\n\n      // with the first lane being the original one\n      expect(childLanes[0]).to.equal(existingLane);\n\n      // with respective bounds\n      expect(childLanes[0]).to.have.bounds({\n        x: participantShape.x,\n        y: participantShape.y + 30,\n        width: newLaneWidth,\n        height: participantShape.height - 30\n      });\n\n      expect(childLanes[1]).to.have.bounds({\n        x: participantShape.x + newLaneWidth,\n        y: participantShape.y + 30,\n        width: newLaneWidth - 1, // compensate for rounding issues\n        height: participantShape.height - 30\n      });\n\n      // with participant's direction\n      expect(childLanes[0].di.isHorizontal).to.be.false;\n      expect(childLanes[1].di.isHorizontal).to.be.false;\n    }));\n\n\n    it('into three lanes', inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Vertical_Participant_Lane'),\n          existingLane = elementRegistry.get('Vertical_Lane'),\n          oldBounds = getBounds(participantShape);\n\n      // when\n      modeling.splitLane(participantShape, 3);\n\n      var childLanes = getChildLanes(participantShape);\n\n      var newLaneWidth = Math.round(participantShape.width / 3);\n\n      // then\n\n      // participant has original size\n      expect(participantShape).to.have.bounds(oldBounds);\n\n      // and three child lanes\n      expect(childLanes.length).to.eql(3);\n\n      // with the first lane being the original one\n      expect(childLanes[0]).to.equal(existingLane);\n\n      // with respective bounds\n      expect(childLanes[0]).to.have.bounds({\n        x: participantShape.x,\n        y: participantShape.y + 30,\n        width: newLaneWidth,\n        height: participantShape.height - 30\n      });\n\n      expect(childLanes[1]).to.have.bounds({\n        x: participantShape.x + newLaneWidth,\n        y: participantShape.y + 30,\n        width: newLaneWidth,\n        height: participantShape.height - 30\n      });\n\n      expect(childLanes[2]).to.have.bounds({\n        x: participantShape.x + newLaneWidth * 2,\n        y: participantShape.y + 30,\n        width: newLaneWidth - 1, // compensate for rounding issues\n        height: participantShape.height - 30\n      });\n\n      // with participant's direction\n      expect(childLanes[0].di.isHorizontal).to.be.false;\n      expect(childLanes[1].di.isHorizontal).to.be.false;\n      expect(childLanes[2].di.isHorizontal).to.be.false;\n    }));\n\n  });\n\n\n  describe('should split Participant without Lane', function() {\n\n    var diagramXML = require('./participant-no-lane.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    it('into two lanes', inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Participant_No_Lane'),\n          oldBounds = getBounds(participantShape);\n\n      // when\n      modeling.splitLane(participantShape, 2);\n\n      var childLanes = getChildLanes(participantShape);\n\n      var newLaneHeight = Math.round(participantShape.height / 2);\n\n      // then\n\n      // participant has original size\n      expect(participantShape).to.have.bounds(oldBounds);\n\n      // and two child lanes\n      expect(childLanes).to.have.length(2);\n\n      // with respective bounds\n      expect(childLanes[0]).to.have.bounds({\n        x: participantShape.x + 30,\n        y: participantShape.y,\n        width: participantShape.width - 30,\n        height: newLaneHeight\n      });\n\n      expect(childLanes[1]).to.have.bounds({\n        x: participantShape.x + 30,\n        y: participantShape.y + newLaneHeight,\n        width: participantShape.width - 30,\n        height: newLaneHeight\n      });\n\n      // with participant's direction\n      expect(childLanes[0].di.isHorizontal).to.be.true;\n      expect(childLanes[1].di.isHorizontal).to.be.true;\n    }));\n\n\n    it('into three lanes', inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Participant_No_Lane'),\n          oldBounds = getBounds(participantShape);\n\n      // when\n      modeling.splitLane(participantShape, 3);\n\n      var childLanes = getChildLanes(participantShape);\n\n      var newLaneHeight = Math.round(participantShape.height / 3);\n\n      // then\n\n      // participant has original size\n      expect(participantShape).to.have.bounds(oldBounds);\n\n      // and two child lanes\n      expect(childLanes).to.have.length(3);\n\n      // with respective bounds\n      expect(childLanes[0]).to.have.bounds({\n        x: participantShape.x + 30,\n        y: participantShape.y,\n        width: participantShape.width - 30,\n        height: newLaneHeight\n      });\n\n      expect(childLanes[1]).to.have.bounds({\n        x: participantShape.x + 30,\n        y: participantShape.y + newLaneHeight,\n        width: participantShape.width - 30,\n        height: newLaneHeight\n      });\n\n      expect(childLanes[2]).to.have.bounds({\n        x: participantShape.x + 30,\n        y: participantShape.y + newLaneHeight * 2,\n        width: participantShape.width - 30,\n        height: newLaneHeight + 1 // compensate for rounding issues\n      });\n\n      // with participant's direction\n      expect(childLanes[0].di.isHorizontal).to.be.true;\n      expect(childLanes[1].di.isHorizontal).to.be.true;\n      expect(childLanes[2].di.isHorizontal).to.be.true;\n    }));\n\n  });\n\n\n  describe('should split vertical Participant without Lane', function() {\n\n    var diagramXML = require('./participant-no-lane-vertical.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    it('into two lanes', inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Vertical_Participant_No_Lane'),\n          oldBounds = getBounds(participantShape);\n\n      // when\n      modeling.splitLane(participantShape, 2);\n\n      var childLanes = getChildLanes(participantShape);\n\n      var newLaneWidth = Math.round(participantShape.width / 2);\n\n      // then\n\n      // participant has original size\n      expect(participantShape).to.have.bounds(oldBounds);\n\n      // and two child lanes\n      expect(childLanes).to.have.length(2);\n\n      // with respective bounds\n      expect(childLanes[0]).to.have.bounds({\n        x: participantShape.x,\n        y: participantShape.y + 30,\n        width: newLaneWidth,\n        height: participantShape.height - 30\n      });\n\n      expect(childLanes[1]).to.have.bounds({\n        x: participantShape.x + newLaneWidth,\n        y: participantShape.y + 30,\n        width: newLaneWidth,\n        height: participantShape.height - 30\n      });\n\n      // with participant's direction\n      expect(childLanes[0].di.isHorizontal).to.be.false;\n      expect(childLanes[1].di.isHorizontal).to.be.false;\n    }));\n\n\n    it('into three lanes', inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Vertical_Participant_No_Lane'),\n          oldBounds = getBounds(participantShape);\n\n      // when\n      modeling.splitLane(participantShape, 3);\n\n      var childLanes = getChildLanes(participantShape);\n\n      var newLaneWidth = Math.round(participantShape.width / 3);\n\n      // then\n\n      // participant has original size\n      expect(participantShape).to.have.bounds(oldBounds);\n\n      // and three child lanes\n      expect(childLanes).to.have.length(3);\n\n      // with respective bounds\n      expect(childLanes[0]).to.have.bounds({\n        x: participantShape.x,\n        y: participantShape.y + 30,\n        width: newLaneWidth,\n        height: participantShape.height - 30\n      });\n\n      expect(childLanes[1]).to.have.bounds({\n        x: participantShape.x + newLaneWidth,\n        y: participantShape.y + 30,\n        width: newLaneWidth,\n        height: participantShape.height - 30\n      });\n\n      expect(childLanes[2]).to.have.bounds({\n        x: participantShape.x + newLaneWidth * 2,\n        y: participantShape.y + 30,\n        width: newLaneWidth + 1, // compensate for rounding issues\n        height: participantShape.height - 30\n      });\n\n      // with participant's direction\n      expect(childLanes[0].di.isHorizontal).to.be.false;\n      expect(childLanes[1].di.isHorizontal).to.be.false;\n      expect(childLanes[2].di.isHorizontal).to.be.false;\n    }));\n\n  });\n\n\n  describe('should split nested Lane', function() {\n\n    var diagramXML = require('./SplitLane.nested.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    it('into two lanes', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Lane'),\n          laneBo = laneShape.businessObject,\n          oldBounds = getBounds(laneShape);\n\n      // when\n      modeling.splitLane(laneShape, 2);\n\n      var childLanes = getChildLanes(laneShape);\n\n      var newLaneHeight = Math.round(laneShape.height / 2);\n\n      // then\n\n      // participant has original size\n      expect(laneShape).to.have.bounds(oldBounds);\n\n      // and two child lanes\n      expect(childLanes).to.have.length(2);\n\n      // with respective bounds\n      expect(childLanes[0]).to.have.bounds({\n        x: laneShape.x + 30,\n        y: laneShape.y,\n        width: laneShape.width - 30,\n        height: newLaneHeight\n      });\n\n      expect(childLanes[1]).to.have.bounds({\n        x: laneShape.x + 30,\n        y: laneShape.y + newLaneHeight,\n        width: laneShape.width - 30,\n        height: newLaneHeight\n      });\n\n      // BPMN internals are properly updated\n      expect(laneBo.childLaneSet).to.exist;\n      expect(laneBo.childLaneSet.lanes).to.eql([\n        childLanes[0].businessObject,\n        childLanes[1].businessObject\n      ]);\n\n      // with parent lane's direction\n      expect(childLanes[0].di.isHorizontal).to.be.true;\n      expect(childLanes[1].di.isHorizontal).to.be.true;\n\n    }));\n\n  });\n\n\n  describe('should split nested vertical Lane', function() {\n\n    var diagramXML = require('./SplitLane.nested.vertical.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    it('into two lanes', inject(function(elementRegistry, modeling) {\n\n      // given\n      var laneShape = elementRegistry.get('Vertical_Lane'),\n          laneBo = laneShape.businessObject,\n          oldBounds = getBounds(laneShape);\n\n      // when\n      modeling.splitLane(laneShape, 2);\n\n      var childLanes = getChildLanes(laneShape);\n\n      var newLaneWidth = Math.round(laneShape.width / 2);\n\n      // then\n\n      // participant has original size\n      expect(laneShape).to.have.bounds(oldBounds);\n\n      // and two child lanes\n      expect(childLanes).to.have.length(2);\n\n      // with respective bounds\n      expect(childLanes[0]).to.have.bounds({\n        x: laneShape.x,\n        y: laneShape.y + 30,\n        width: newLaneWidth,\n        height: laneShape.height - 30\n      });\n\n      expect(childLanes[1]).to.have.bounds({\n        x: laneShape.x + newLaneWidth,\n        y: laneShape.y + 30,\n        width: newLaneWidth,\n        height: laneShape.height - 30\n      });\n\n      // BPMN internals are properly updated\n      expect(laneBo.childLaneSet).to.exist;\n      expect(laneBo.childLaneSet.lanes).to.eql([\n        childLanes[0].businessObject,\n        childLanes[1].businessObject\n      ]);\n\n      // with parent lane's direction\n      expect(childLanes[0].di.isHorizontal).to.be.false;\n      expect(childLanes[1].di.isHorizontal).to.be.false;\n    }));\n\n  });\n\n});"
  },
  {
    "path": "test/spec/features/modeling/lanes/UpdateFlowNodeRefs.basic.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"_2_FUoE-xEeWT0c1N_GlSWA\" targetNamespace=\"http://camunda.org/schema/1.0/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"2.2.4\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"Collaboration\">\n    <bpmn2:participant id=\"Participant_A\" name=\"Participant_A\" processRef=\"Process_A\" />\n    <bpmn2:participant id=\"Participant_B\" name=\"Participant_B\" processRef=\"Process_B\" />\n    <bpmn2:participant id=\"Participant_C\" name=\"Participant_C\" processRef=\"Process_C\" />\n    <bpmn2:participant id=\"Participant_D\" name=\"Participant_D\" processRef=\"Process_D\" />\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_A\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Lane\" name=\"Lane\">\n        <bpmn2:flowNodeRef>Task_A</bpmn2:flowNodeRef>\n        <bpmn2:flowNodeRef>Event</bpmn2:flowNodeRef>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:task id=\"Task_A\" name=\"Task_A\">\n      <bpmn2:outgoing>SequenceFlow</bpmn2:outgoing>\n    </bpmn2:task>\n    <bpmn2:intermediateCatchEvent id=\"Event\" name=\"Event\">\n      <bpmn2:incoming>SequenceFlow</bpmn2:incoming>\n    </bpmn2:intermediateCatchEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow\" name=\"\" sourceRef=\"Task_A\" targetRef=\"Event\" />\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_B\" isExecutable=\"false\">\n    <bpmn2:task id=\"Task_B\" name=\"Task_B\" />\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_C\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_06y7y48\">\n      <bpmn2:lane id=\"Participant_C_Lane_1\" name=\"Participant_C_Lane_1\">\n        <bpmn2:flowNodeRef>Task_C</bpmn2:flowNodeRef>\n        <bpmn2:flowNodeRef>IntermediateThrowEvent</bpmn2:flowNodeRef>\n      </bpmn2:lane>\n      <bpmn2:lane id=\"Participant_C_Lane_2\" name=\"Participant_C_Lane_2\">\n        <bpmn2:flowNodeRef>Task_D</bpmn2:flowNodeRef>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:task id=\"Task_C\" name=\"Task_C\" />\n    <bpmn2:task id=\"Task_D\" name=\"Task_D\" />\n    <bpmn2:intermediateThrowEvent id=\"IntermediateThrowEvent\" />\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_D\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1fp2wy1\">\n      <bpmn2:lane id=\"Lane_D_1\" name=\"Lane_D_1\">\n        <bpmn2:flowNodeRef>Task_E</bpmn2:flowNodeRef>\n        <bpmn2:childLaneSet id=\"LaneSet_10kvuaz\">\n          <bpmn2:lane id=\"Lane_D_1_2\" name=\"Lane_D_1_2\" />\n          <bpmn2:lane id=\"Lane_D_1_1\" name=\"Lane_D_1_1\">\n            <bpmn2:flowNodeRef>Task_E</bpmn2:flowNodeRef>\n          </bpmn2:lane>\n        </bpmn2:childLaneSet>\n      </bpmn2:lane>\n      <bpmn2:lane id=\"Lane_0z1sraf\" />\n    </bpmn2:laneSet>\n    <bpmn2:task id=\"Task_E\" name=\"Task_E\" />\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"Participant_A\" isHorizontal=\"true\">\n        <dc:Bounds x=\"154\" y=\"96\" width=\"540\" height=\"145\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_3\" bpmnElement=\"Participant_B\" isHorizontal=\"true\">\n        <dc:Bounds x=\"154\" y=\"312\" width=\"540\" height=\"133\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_A\">\n        <dc:Bounds x=\"238\" y=\"129\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_2\" bpmnElement=\"Lane\" isHorizontal=\"true\">\n        <dc:Bounds x=\"184\" y=\"96\" width=\"510\" height=\"145\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateCatchEvent_2\" bpmnElement=\"Event\">\n        <dc:Bounds x=\"454\" y=\"151\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"458\" y=\"192\" width=\"29\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow\" sourceElement=\"_BPMNShape_Task_2\" targetElement=\"_BPMNShape_IntermediateCatchEvent_2\">\n        <di:waypoint x=\"338\" y=\"169\" />\n        <di:waypoint x=\"454\" y=\"169\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"290\" y=\"169\" width=\"6\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_B\">\n        <dc:Bounds x=\"562\" y=\"339\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_C_di\" bpmnElement=\"Participant_C\" isHorizontal=\"true\">\n        <dc:Bounds x=\"154\" y=\"475\" width=\"540\" height=\"285\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0lsm3hs_di\" bpmnElement=\"Participant_C_Lane_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"184\" y=\"475\" width=\"510\" height=\"150\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_16dmnot_di\" bpmnElement=\"Participant_C_Lane_2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"184\" y=\"625\" width=\"510\" height=\"135\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1abs8bh_di\" bpmnElement=\"Task_C\">\n        <dc:Bounds x=\"230\" y=\"510\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_0oto7vx_di\" bpmnElement=\"IntermediateThrowEvent\">\n        <dc:Bounds x=\"592\" y=\"532\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0j7a294_di\" bpmnElement=\"Task_D\">\n        <dc:Bounds x=\"230\" y=\"650\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_D_di\" bpmnElement=\"Participant_D\">\n        <dc:Bounds x=\"154\" y=\"835\" width=\"539\" height=\"379\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1x5l7tv_di\" bpmnElement=\"Lane_D_1\">\n        <dc:Bounds x=\"184\" y=\"835\" width=\"509\" height=\"315\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0z1sraf_di\" bpmnElement=\"Lane_0z1sraf\">\n        <dc:Bounds x=\"184\" y=\"1150\" width=\"509\" height=\"64\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0l34pdv_di\" bpmnElement=\"Lane_D_1_2\">\n        <dc:Bounds x=\"214\" y=\"835\" width=\"479\" height=\"137\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_05oigjv_di\" bpmnElement=\"Lane_D_1_1\">\n        <dc:Bounds x=\"214\" y=\"972\" width=\"479\" height=\"178\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_196nq81_di\" bpmnElement=\"Task_E\">\n        <dc:Bounds x=\"358\" y=\"1011\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/lanes/UpdateFlowNodeRefsSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\nimport copyPasteModule from 'lib/features/copy-paste';\n\nimport {\n  find\n} from 'min-dash';\n\n\ndescribe('features/modeling - lanes - flowNodeRefs', function() {\n\n  var diagramXML = require('./UpdateFlowNodeRefs.basic.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: [\n      coreModule,\n      modelingModule,\n      copyPasteModule\n    ]\n  }));\n\n\n  describe('should unwire during move', function() {\n\n    it('execute', inject(function(elementRegistry, modeling) {\n\n      // given\n      var taskShape = elementRegistry.get('Task_A'),\n          task = taskShape.businessObject,\n          sourceLaneShape = elementRegistry.get('Lane'),\n          sourceLane = sourceLaneShape.businessObject,\n          targetParticipantShape = elementRegistry.get('Participant_B');\n\n      // when\n      modeling.moveElements([ taskShape ], { x: 0, y: +200 }, targetParticipantShape);\n\n      // then\n      expect(sourceLane.flowNodeRef).not.to.contain(task);\n    }));\n\n\n    it('undo', inject(function(elementRegistry, commandStack, modeling) {\n\n      // given\n      var taskShape = elementRegistry.get('Task_A'),\n          task = taskShape.businessObject,\n          sourceLaneShape = elementRegistry.get('Lane'),\n          sourceLane = sourceLaneShape.businessObject,\n          targetParticipantShape = elementRegistry.get('Participant_B');\n\n      modeling.moveElements([ taskShape ], { x: 0, y: +200 }, targetParticipantShape);\n\n      // when\n      commandStack.undo();\n\n      // then\n      expect(sourceLane.flowNodeRef).to.contain(task);\n    }));\n\n\n    it('redo', inject(function(elementRegistry, commandStack, modeling) {\n\n      // given\n      var taskShape = elementRegistry.get('Task_A'),\n          task = taskShape.businessObject,\n          sourceLaneShape = elementRegistry.get('Lane'),\n          sourceLane = sourceLaneShape.businessObject,\n          targetParticipantShape = elementRegistry.get('Participant_B');\n\n      modeling.moveElements([ taskShape ], { x: 0, y: +200 }, targetParticipantShape);\n\n      // when\n      commandStack.undo();\n      commandStack.redo();\n\n      // then\n      expect(sourceLane.flowNodeRef).not.to.contain(task);\n    }));\n\n  });\n\n\n  describe('should wire during move', function() {\n\n    it('execute', inject(function(elementRegistry, modeling) {\n\n      // given\n      var taskShape = elementRegistry.get('Task_B'),\n          task = taskShape.businessObject,\n          targetLaneShape = elementRegistry.get('Lane'),\n          targetLane = targetLaneShape.businessObject;\n\n      // when\n      modeling.moveElements([ taskShape ], { x: 0, y: -200 }, targetLaneShape);\n\n      // then\n      expect(targetLane.flowNodeRef).to.contain(task);\n    }));\n\n\n    it('undo', inject(function(elementRegistry, commandStack, modeling) {\n\n      // given\n      var taskShape = elementRegistry.get('Task_B'),\n          task = taskShape.businessObject,\n          targetLaneShape = elementRegistry.get('Lane'),\n          targetLane = targetLaneShape.businessObject;\n\n      modeling.moveElements([ taskShape ], { x: 0, y: -200 }, targetLaneShape);\n\n      // when\n      commandStack.undo();\n\n      // then\n      expect(targetLane.flowNodeRef).not.to.contain(task);\n    }));\n\n\n    it('redo', inject(function(elementRegistry, commandStack, modeling) {\n\n      // given\n      var taskShape = elementRegistry.get('Task_B'),\n          task = taskShape.businessObject,\n          targetLaneShape = elementRegistry.get('Lane'),\n          targetLane = targetLaneShape.businessObject;\n\n      modeling.moveElements([ taskShape ], { x: 0, y: -200 }, targetLaneShape);\n\n      // when\n      commandStack.undo();\n      commandStack.redo();\n\n      // then\n      expect(targetLane.flowNodeRef).to.contain(task);\n    }));\n\n  });\n\n\n  describe('should unwire during delete', function() {\n\n    it('execute', inject(function(elementRegistry, modeling) {\n\n      // given\n      var taskShape = elementRegistry.get('Task_A'),\n          task = taskShape.businessObject,\n          parentLaneShape = elementRegistry.get('Lane'),\n          parentLane = parentLaneShape.businessObject;\n\n      // when\n      modeling.removeElements([ taskShape ]);\n\n      // then\n      expect(parentLane.flowNodeRef).not.to.contain(task);\n    }));\n\n\n    it('undo', inject(function(elementRegistry, commandStack, modeling) {\n\n      // given\n      var taskShape = elementRegistry.get('Task_A'),\n          task = taskShape.businessObject,\n          parentLaneShape = elementRegistry.get('Lane'),\n          parentLane = parentLaneShape.businessObject;\n\n      modeling.removeElements([ taskShape ]);\n\n      // when\n      commandStack.undo();\n\n      // then\n      expect(parentLane.flowNodeRef).to.contain(task);\n    }));\n\n\n    it('redo', inject(function(elementRegistry, commandStack, modeling) {\n\n      // given\n      var taskShape = elementRegistry.get('Task_A'),\n          task = taskShape.businessObject,\n          parentLaneShape = elementRegistry.get('Lane'),\n          parentLane = parentLaneShape.businessObject;\n\n      modeling.removeElements([ taskShape ]);\n\n      // when\n      commandStack.undo();\n      commandStack.redo();\n\n      // then\n      expect(parentLane.flowNodeRef).not.to.contain(task);\n    }));\n\n  });\n\n\n  describe('should wire during create', function() {\n\n    it('execute', inject(function(elementRegistry, modeling) {\n\n      // given\n      var taskShape, task,\n          parentLaneShape = elementRegistry.get('Lane'),\n          parentLane = parentLaneShape.businessObject;\n\n      // when\n      taskShape = modeling.createShape({ type: 'bpmn:Task' }, { x: 500, y: 150 }, parentLaneShape);\n      task = taskShape.businessObject;\n\n      // then\n      expect(parentLane.flowNodeRef).to.contain(task);\n    }));\n\n\n    it('undo', inject(function(elementRegistry, commandStack, modeling) {\n\n      // given\n      var taskShape, task,\n          parentLaneShape = elementRegistry.get('Lane'),\n          parentLane = parentLaneShape.businessObject;\n\n      taskShape = modeling.createShape({ type: 'bpmn:Task' }, { x: 500, y: 150 }, parentLaneShape);\n      task = taskShape.businessObject;\n\n      // when\n      commandStack.undo();\n\n      // then\n      expect(parentLane.flowNodeRef).not.to.contain(task);\n    }));\n\n\n    it('redo', inject(function(elementRegistry, commandStack, modeling) {\n\n      // given\n      var taskShape, task,\n          parentLaneShape = elementRegistry.get('Lane'),\n          parentLane = parentLaneShape.businessObject;\n\n      taskShape = modeling.createShape({ type: 'bpmn:Task' }, { x: 500, y: 150 }, parentLaneShape);\n      task = taskShape.businessObject;\n\n      // when\n      commandStack.undo();\n      commandStack.redo();\n\n      // then\n      expect(parentLane.flowNodeRef).to.contain(task);\n    }));\n\n  });\n\n\n  it('should unwire moving multiple', inject(function(elementRegistry, modeling) {\n\n    // given\n    var taskShape = elementRegistry.get('Task_A'),\n        task = taskShape.businessObject,\n        eventShape = elementRegistry.get('Event'),\n        event = eventShape.businessObject,\n        targetParticipantShape = elementRegistry.get('Participant_B'),\n        sourceLaneShape = elementRegistry.get('Lane'),\n        sourceLane = sourceLaneShape.businessObject;\n\n    // when\n    modeling.moveElements([ taskShape, eventShape ], { x: 0, y: +200 }, targetParticipantShape);\n\n    // then\n    expect(sourceLane.flowNodeRef).not.to.contain(task);\n    expect(sourceLane.flowNodeRef).not.to.contain(event);\n  }));\n\n\n  it('should not create duplicate refs on attaching / detaching', inject(function(elementRegistry, modeling) {\n\n    // given\n    var eventID = 'IntermediateThrowEvent',\n        throwEvent = elementRegistry.get(eventID),\n        task1 = elementRegistry.get('Task_C'),\n        task2 = elementRegistry.get('Task_D'),\n        lane1 = elementRegistry.get('Participant_C_Lane_1').businessObject,\n        lane2 = elementRegistry.get('Participant_C_Lane_2').businessObject;\n\n    // when\n    modeling.moveElements([ throwEvent ], { x: -280, y: 30 }, task1, { attach: true });\n\n    var boundaryEvent = elementRegistry.get(eventID);\n\n    modeling.moveElements([ boundaryEvent ], { x: 0, y: 150 }, task2, { attach: true });\n\n    // then\n    expect(lane1.flowNodeRef).not.to.contain(boundaryEvent.businessObject);\n    expect(lane2.flowNodeRef).to.contain(boundaryEvent.businessObject);\n    expect(lane1.flowNodeRef).to.have.length(1);\n    expect(lane2.flowNodeRef).to.have.length(2);\n  }));\n\n\n  describe('should wire once during paste', function() {\n\n    it('execute', inject(function(canvas, eventBus, elementRegistry, copyPaste) {\n\n      // given\n      var participant = elementRegistry.get('Participant_D');\n\n      var updateRefsSpy = sinon.spy();\n\n      eventBus.on('commandStack.lane.updateRefs.execute', updateRefsSpy);\n\n      // when\n      copyPaste.copy(participant);\n\n      var pastedElements = copyPaste.paste({\n        element: canvas.getRootElement(),\n        point: {\n          x: 350,\n          y: 150\n        }\n      });\n\n      var pastedLane = find(pastedElements, function(e) {\n        return e.businessObject.name === 'Lane_D_1_1';\n      });\n\n      var pastedTask = find(pastedElements, function(e) {\n        return e.businessObject.name === 'Task_E';\n      });\n\n      // then\n      expect(updateRefsSpy).to.have.been.calledOnce;\n\n      expect(pastedLane.businessObject.flowNodeRef).to.include(pastedTask.businessObject);\n    }));\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/lanes/lanes-flow-nodes-vertical.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"_4bAZoD9WEeWLcNBL4nCk1A\" targetNamespace=\"http://camunda.org/schema/1.0/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.7.1\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"V_Participant_Lane\" name=\"V_Participant_Lane\" processRef=\"Process_Lane\" />\n    <bpmn2:participant id=\"VParticipantRight\" name=\"VParticipantRight\" processRef=\"Process_0kzdcfx\" />\n    <bpmn2:participant id=\"VParticipantLeft\" name=\"VParticipantLeft\" processRef=\"Process_1nej7ck\" />\n    <bpmn2:messageFlow id=\"MessageFlowRight\" sourceRef=\"VParticipantRight\" targetRef=\"V_Participant_Lane\" />\n    <bpmn2:messageFlow id=\"MessageFlowLeft\" name=\"MessageFlowLeft\" sourceRef=\"V_Participant_Lane\" targetRef=\"VParticipantLeft\" />\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_Lane\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Vertical_Lane_A\" name=\"Vertical_Lane_A\">\n        <bpmn2:flowNodeRef>V_Task_Boundary</bpmn2:flowNodeRef>\n        <bpmn2:flowNodeRef>V_Task</bpmn2:flowNodeRef>\n        <bpmn2:flowNodeRef>V_Event</bpmn2:flowNodeRef>\n        <bpmn2:flowNodeRef>V_Boundary</bpmn2:flowNodeRef>\n        <bpmn2:childLaneSet id=\"LaneSet_2\">\n          <bpmn2:lane id=\"Nested_Vertical_Lane_A\" name=\"Nested_Vertical_Lane_A\">\n            <bpmn2:flowNodeRef>V_Task_Boundary</bpmn2:flowNodeRef>\n            <bpmn2:flowNodeRef>V_Task</bpmn2:flowNodeRef>\n            <bpmn2:flowNodeRef>V_Event</bpmn2:flowNodeRef>\n            <bpmn2:flowNodeRef>V_Boundary</bpmn2:flowNodeRef>\n          </bpmn2:lane>\n          <bpmn2:lane id=\"Nested_Vertical_Lane_B\" name=\"Nested_Vertical_Lane_B\" />\n        </bpmn2:childLaneSet>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:task id=\"V_Task_Boundary\" name=\"V_Task_Boundary\">\n      <bpmn2:outgoing>Flow_V</bpmn2:outgoing>\n    </bpmn2:task>\n    <bpmn2:task id=\"V_Task\" name=\"V_Task\">\n      <bpmn2:incoming>Flow_From_V_Boundary</bpmn2:incoming>\n      <bpmn2:incoming>Flow_V</bpmn2:incoming>\n    </bpmn2:task>\n    <bpmn2:startEvent id=\"V_Event\" name=\"Start\" />\n    <bpmn2:boundaryEvent id=\"V_Boundary\" name=\"Boundary\" attachedToRef=\"V_Task_Boundary\">\n      <bpmn2:outgoing>Flow_From_V_Boundary</bpmn2:outgoing>\n    </bpmn2:boundaryEvent>\n    <bpmn2:sequenceFlow id=\"Flow_From_V_Boundary\" name=\"\" sourceRef=\"V_Boundary\" targetRef=\"V_Task\" />\n    <bpmn2:sequenceFlow id=\"Flow_V\" name=\"Flow\" sourceRef=\"V_Task_Boundary\" targetRef=\"V_Task\" />\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_0kzdcfx\" isExecutable=\"false\" />\n  <bpmn2:process id=\"Process_1nej7ck\" isExecutable=\"false\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"V_Participant_Lane\" isHorizontal=\"false\">\n        <dc:Bounds x=\"633\" y=\"152\" width=\"537\" height=\"540\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_3\" bpmnElement=\"Vertical_Lane_A\" isHorizontal=\"false\">\n        <dc:Bounds x=\"633\" y=\"182\" width=\"537\" height=\"510\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_4\" bpmnElement=\"Nested_Vertical_Lane_A\" isHorizontal=\"false\">\n        <dc:Bounds x=\"633\" y=\"212\" width=\"180\" height=\"480\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_5\" bpmnElement=\"Nested_Vertical_Lane_B\" isHorizontal=\"false\">\n        <dc:Bounds x=\"813\" y=\"212\" width=\"357\" height=\"480\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"Flow_From_V_Boundary\" sourceElement=\"_BPMNShape_BoundaryEvent_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint x=\"781\" y=\"409\" />\n        <di:waypoint x=\"808\" y=\"409\" />\n        <di:waypoint x=\"808\" y=\"562\" />\n        <di:waypoint x=\"763\" y=\"562\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"188\" y=\"377\" width=\"6\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"Flow_V\" sourceElement=\"_BPMNShape_Task_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint x=\"703\" y=\"424\" />\n        <di:waypoint x=\"703\" y=\"512\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"710\" y=\"467\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"V_Task_Boundary\">\n        <dc:Bounds x=\"663\" y=\"344\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"V_Task\">\n        <dc:Bounds x=\"663\" y=\"512\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_di\" bpmnElement=\"V_Event\">\n        <dc:Bounds x=\"685\" y=\"262\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"728\" y=\"273\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_BoundaryEvent_2\" bpmnElement=\"V_Boundary\">\n        <dc:Bounds x=\"745\" y=\"391\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"770\" y=\"369\" width=\"48\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_1nh1wgv_di\" bpmnElement=\"VParticipantRight\" isHorizontal=\"false\">\n        <dc:Bounds x=\"1500\" y=\"152\" width=\"250\" height=\"600\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_05yp9aj_di\" bpmnElement=\"VParticipantLeft\" isHorizontal=\"false\">\n        <dc:Bounds x=\"80\" y=\"152\" width=\"250\" height=\"600\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1g3bwbi_di\" bpmnElement=\"MessageFlowRight\">\n        <di:waypoint x=\"1500\" y=\"452\" />\n        <di:waypoint x=\"1170\" y=\"452\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0n2j5uv_di\" bpmnElement=\"MessageFlowLeft\">\n        <di:waypoint x=\"633\" y=\"422\" />\n        <di:waypoint x=\"330\" y=\"422\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"479\" y=\"393\" width=\"88\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/lanes/lanes-flow-nodes.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"_4bAZoD9WEeWLcNBL4nCk1A\" targetNamespace=\"http://camunda.org/schema/1.0/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.7.1\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"Participant_Lane\" name=\"Participant_Lane\" processRef=\"Process_Lane\" />\n    <bpmn2:participant id=\"ParticipantBelow\" name=\"ParticipantBelow\" processRef=\"Process_0kzdcfx\" />\n    <bpmn2:participant id=\"ParticipantAbove\" name=\"ParticipantAbove\" processRef=\"Process_1nej7ck\" />\n    <bpmn2:messageFlow id=\"MessageFlowBelow\" sourceRef=\"ParticipantBelow\" targetRef=\"Participant_Lane\" />\n    <bpmn2:messageFlow id=\"MessageFlowAbove\" name=\"MessageFlowAbove\" sourceRef=\"Participant_Lane\" targetRef=\"ParticipantAbove\" />\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_Lane\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Lane_A\" name=\"Lane_A\">\n        <bpmn2:flowNodeRef>Task_Boundary</bpmn2:flowNodeRef>\n        <bpmn2:flowNodeRef>Task</bpmn2:flowNodeRef>\n        <bpmn2:flowNodeRef>Event</bpmn2:flowNodeRef>\n        <bpmn2:flowNodeRef>Boundary</bpmn2:flowNodeRef>\n        <bpmn2:childLaneSet id=\"LaneSet_2\">\n          <bpmn2:lane id=\"Nested_Lane_A\" name=\"Nested_Lane_A\">\n            <bpmn2:flowNodeRef>Task_Boundary</bpmn2:flowNodeRef>\n            <bpmn2:flowNodeRef>Task</bpmn2:flowNodeRef>\n            <bpmn2:flowNodeRef>Event</bpmn2:flowNodeRef>\n            <bpmn2:flowNodeRef>Boundary</bpmn2:flowNodeRef>\n          </bpmn2:lane>\n          <bpmn2:lane id=\"Nested_Lane_B\" name=\"Nested_Lane_B\" />\n        </bpmn2:childLaneSet>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:task id=\"Task_Boundary\" name=\"Task_Boundary\">\n      <bpmn2:outgoing>SequenceFlow</bpmn2:outgoing>\n    </bpmn2:task>\n    <bpmn2:task id=\"Task\" name=\"Task\">\n      <bpmn2:incoming>SequenceFlow_From_Boundary</bpmn2:incoming>\n      <bpmn2:incoming>SequenceFlow</bpmn2:incoming>\n    </bpmn2:task>\n    <bpmn2:startEvent id=\"Event\" name=\"Start\" />\n    <bpmn2:boundaryEvent id=\"Boundary\" name=\"Boundary\" attachedToRef=\"Task_Boundary\">\n      <bpmn2:outgoing>SequenceFlow_From_Boundary</bpmn2:outgoing>\n    </bpmn2:boundaryEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_From_Boundary\" name=\"\" sourceRef=\"Boundary\" targetRef=\"Task\" />\n    <bpmn2:sequenceFlow id=\"SequenceFlow\" name=\"Flow\" sourceRef=\"Task_Boundary\" targetRef=\"Task\" />\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_0kzdcfx\" isExecutable=\"false\" />\n  <bpmn2:process id=\"Process_1nej7ck\" isExecutable=\"false\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"Participant_Lane\" isHorizontal=\"true\">\n        <dc:Bounds x=\"152\" y=\"633\" width=\"540\" height=\"537\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_3\" bpmnElement=\"Lane_A\" isHorizontal=\"true\">\n        <dc:Bounds x=\"182\" y=\"633\" width=\"510\" height=\"537\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_4\" bpmnElement=\"Nested_Lane_A\" isHorizontal=\"true\">\n        <dc:Bounds x=\"212\" y=\"633\" width=\"480\" height=\"180\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_5\" bpmnElement=\"Nested_Lane_B\" isHorizontal=\"true\">\n        <dc:Bounds x=\"212\" y=\"813\" width=\"480\" height=\"357\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_From_Boundary\" sourceElement=\"_BPMNShape_BoundaryEvent_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint x=\"409\" y=\"761\" />\n        <di:waypoint x=\"409\" y=\"788\" />\n        <di:waypoint x=\"562\" y=\"788\" />\n        <di:waypoint x=\"562\" y=\"743\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"377\" y=\"188\" width=\"6\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow\" sourceElement=\"_BPMNShape_Task_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint x=\"444\" y=\"703\" />\n        <di:waypoint x=\"512\" y=\"703\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"467\" y=\"685\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_Boundary\">\n        <dc:Bounds x=\"344\" y=\"663\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"512\" y=\"663\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_di\" bpmnElement=\"Event\">\n        <dc:Bounds x=\"262\" y=\"685\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"268\" y=\"728\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_BoundaryEvent_2\" bpmnElement=\"Boundary\">\n        <dc:Bounds x=\"391\" y=\"725\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"339\" y=\"760\" width=\"48\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_1nh1wgv_di\" bpmnElement=\"ParticipantBelow\" isHorizontal=\"true\">\n        <dc:Bounds x=\"152\" y=\"1500\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_05yp9aj_di\" bpmnElement=\"ParticipantAbove\" isHorizontal=\"true\">\n        <dc:Bounds x=\"152\" y=\"80\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1g3bwbi_di\" bpmnElement=\"MessageFlowBelow\">\n        <di:waypoint x=\"452\" y=\"1500\" />\n        <di:waypoint x=\"452\" y=\"1170\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0n2j5uv_di\" bpmnElement=\"MessageFlowAbove\">\n        <di:waypoint x=\"422\" y=\"633\" />\n        <di:waypoint x=\"422\" y=\"330\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"393\" y=\"479\" width=\"88\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/lanes/lanes.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_4bAZoD9WEeWLcNBL4nCk1A\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://camunda.org/schema/1.0/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"Participant_Lane\" name=\"Participant_Lane\" processRef=\"Process_Lane\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_Lane\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Lane_A\" name=\"Lane_A\">\n        <bpmn2:childLaneSet xsi:type=\"bpmn2:tLaneSet\" id=\"LaneSet_2\">\n          <bpmn2:lane id=\"Nested_Lane_A\" name=\"Nested_Lane_A\">\n            <bpmn2:flowNodeRef>Boundary</bpmn2:flowNodeRef>\n            <bpmn2:flowNodeRef>Task_Boundary</bpmn2:flowNodeRef>\n            <bpmn2:flowNodeRef>Task</bpmn2:flowNodeRef>\n          </bpmn2:lane>\n          <bpmn2:lane id=\"Nested_Lane_B\" name=\"Nested_Lane_B\"/>\n          <bpmn2:lane id=\"Nested_Lane_C\" name=\"Nested_Lane_C\"/>\n        </bpmn2:childLaneSet>\n      </bpmn2:lane>\n      <bpmn2:lane id=\"Lane_B\" name=\"Lane_B\"/>\n    </bpmn2:laneSet>\n    <bpmn2:boundaryEvent id=\"Boundary\" name=\"Boundary\" attachedToRef=\"Task_Boundary\">\n      <bpmn2:outgoing>SequenceFlow_From_Boundary</bpmn2:outgoing>\n    </bpmn2:boundaryEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_From_Boundary\" name=\"\" sourceRef=\"Boundary\" targetRef=\"Task\"/>\n    <bpmn2:task id=\"Task_Boundary\" name=\"Task_Boundary\">\n      <bpmn2:outgoing>SequenceFlow</bpmn2:outgoing>\n    </bpmn2:task>\n    <bpmn2:sequenceFlow id=\"SequenceFlow\" name=\"\" sourceRef=\"Task_Boundary\" targetRef=\"Task\"/>\n    <bpmn2:task id=\"Task\" name=\"Task\">\n      <bpmn2:incoming>SequenceFlow_From_Boundary</bpmn2:incoming>\n      <bpmn2:incoming>SequenceFlow</bpmn2:incoming>\n    </bpmn2:task>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"Participant_Lane\" isHorizontal=\"true\">\n        <dc:Bounds height=\"543.0\" width=\"540.0\" x=\"72.0\" y=\"33.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_Boundary\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"264.0\" y=\"63.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_BoundaryEvent_2\" bpmnElement=\"Boundary\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"311.0\" y=\"125.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"21.0\" width=\"61.0\" x=\"252.0\" y=\"160.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"432.0\" y=\"63.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_From_Boundary\" sourceElement=\"_BPMNShape_BoundaryEvent_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"329.0\" y=\"161.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"329.0\" y=\"188.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"482.0\" y=\"188.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"482.0\" y=\"143.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"377.0\" y=\"188.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow\" sourceElement=\"_BPMNShape_Task_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"364.0\" y=\"103.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"432.0\" y=\"103.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"403.0\" y=\"103.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_3\" bpmnElement=\"Lane_A\" isHorizontal=\"true\">\n        <dc:Bounds height=\"436.0\" width=\"510.0\" x=\"102.0\" y=\"33.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_4\" bpmnElement=\"Nested_Lane_A\" isHorizontal=\"true\">\n        <dc:Bounds height=\"181.0\" width=\"480.0\" x=\"132.0\" y=\"33.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_5\" bpmnElement=\"Nested_Lane_B\" isHorizontal=\"true\">\n        <dc:Bounds height=\"133.0\" width=\"480.0\" x=\"132.0\" y=\"213.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_6\" bpmnElement=\"Lane_B\" isHorizontal=\"true\">\n        <dc:Bounds height=\"108.0\" width=\"510.0\" x=\"102.0\" y=\"468.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_7\" bpmnElement=\"Nested_Lane_C\" isHorizontal=\"true\">\n        <dc:Bounds height=\"124.0\" width=\"480.0\" x=\"132.0\" y=\"345.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/spec/features/modeling/lanes/lanes.only.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_0ezavnl\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.19.0\" modeler:executionPlatform=\"Camunda Cloud\" modeler:executionPlatformVersion=\"8.4.0\">\n  <bpmn:process id=\"Process_135baez\" isExecutable=\"true\">\n    <bpmn:laneSet id=\"LaneSet_0it2ppv\">\n      <bpmn:lane id=\"Lane_B\" name=\"Lane B\" />\n      <bpmn:lane id=\"Lane_A\" name=\"Lane A\" />\n    </bpmn:laneSet>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_135baez\">\n      <bpmndi:BPMNShape id=\"Lane_B_di\" bpmnElement=\"Lane_B\" isHorizontal=\"true\">\n        <dc:Bounds x=\"180\" y=\"100\" width=\"570\" height=\"125\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_A_di\" bpmnElement=\"Lane_A\" isHorizontal=\"true\">\n        <dc:Bounds x=\"180\" y=\"225\" width=\"570\" height=\"125\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/lanes/lanes.only.vertical.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_0ezavnl\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.19.0\" modeler:executionPlatform=\"Camunda Cloud\" modeler:executionPlatformVersion=\"8.4.0\">\n  <bpmn:process id=\"Process_04d9c6l\" isExecutable=\"true\">\n    <bpmn:laneSet id=\"LaneSet_01xwmim\">\n      <bpmn:lane id=\"Vertical_Lane_B\" name=\"Vertical Lane B\" />\n      <bpmn:lane id=\"Vertical_Lane_A\" name=\"Vertical Lane A\" />\n    </bpmn:laneSet>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_04d9c6l\">\n      <bpmndi:BPMNShape id=\"Vertical_Lane_B_di\" bpmnElement=\"Vertical_Lane_B\" isHorizontal=\"false\">\n        <dc:Bounds x=\"200\" y=\"100\" width=\"125\" height=\"570\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Vertical_Lane_A_di\" bpmnElement=\"Vertical_Lane_A\" isHorizontal=\"false\">\n        <dc:Bounds x=\"325\" y=\"100\" width=\"125\" height=\"570\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/lanes/lanes.vertical.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_4bAZoD9WEeWLcNBL4nCk1A\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://camunda.org/schema/1.0/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"Vertical_Participant_Lane\" name=\"Vertical_Participant_Lane\" processRef=\"Process_Vertical_Lane\" />\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_Vertical_Lane\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1o2qvt0\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Vertical_Lane_B\" name=\"Vertical_Lane_B\" />\n      <bpmn2:lane id=\"Vertical_Lane_A\" name=\"Vertical_Lane_A\">\n        <bpmn2:flowNodeRef>V_Task</bpmn2:flowNodeRef>\n        <bpmn2:flowNodeRef>V_Task_Boundary</bpmn2:flowNodeRef>\n        <bpmn2:flowNodeRef>V_Boundary</bpmn2:flowNodeRef>\n        <bpmn2:childLaneSet id=\"LaneSet_1nz9a4u\">\n          <bpmn2:lane id=\"Nested_Vertical_Lane_C\" name=\"Nested_Vertical_Lane_C\" />\n          <bpmn2:lane id=\"Nested_Vertical_Lane_B\" name=\"Nested_Vertical_Lane_B\" />\n          <bpmn2:lane id=\"Nested_Vertical_Lane_A\" name=\"Nested_Vertical_Lane_A\">\n            <bpmn2:flowNodeRef>V_Task</bpmn2:flowNodeRef>\n            <bpmn2:flowNodeRef>V_Task_Boundary</bpmn2:flowNodeRef>\n            <bpmn2:flowNodeRef>V_Boundary</bpmn2:flowNodeRef>\n          </bpmn2:lane>\n        </bpmn2:childLaneSet>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:task id=\"V_Task\" name=\"V_Task\">\n      <bpmn2:incoming>Flow_V</bpmn2:incoming>\n      <bpmn2:incoming>Flow_From_V_Boundary</bpmn2:incoming>\n    </bpmn2:task>\n    <bpmn2:task id=\"V_Task_Boundary\" name=\"V_Task_Boundary\">\n      <bpmn2:outgoing>Flow_V</bpmn2:outgoing>\n    </bpmn2:task>\n    <bpmn2:boundaryEvent id=\"V_Boundary\" name=\"V_Boundary\" attachedToRef=\"V_Task_Boundary\">\n      <bpmn2:outgoing>Flow_From_V_Boundary</bpmn2:outgoing>\n    </bpmn2:boundaryEvent>\n    <bpmn2:sequenceFlow id=\"Flow_V\" name=\"\" sourceRef=\"V_Task_Boundary\" targetRef=\"V_Task\" />\n    <bpmn2:sequenceFlow id=\"Flow_From_V_Boundary\" name=\"\" sourceRef=\"V_Boundary\" targetRef=\"V_Task\" />\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"BPMNShape_140jwaa\" bpmnElement=\"Vertical_Participant_Lane\" isHorizontal=\"false\">\n        <dc:Bounds x=\"160\" y=\"50\" width=\"604\" height=\"540\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0n0ckvg\" bpmnElement=\"Vertical_Lane_B\" isHorizontal=\"false\">\n        <dc:Bounds x=\"656\" y=\"80\" width=\"108\" height=\"510\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1xhgbhc\" bpmnElement=\"Vertical_Lane_A\" isHorizontal=\"false\">\n        <dc:Bounds x=\"160\" y=\"80\" width=\"496\" height=\"510\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1vq767a\" bpmnElement=\"Nested_Vertical_Lane_C\" isHorizontal=\"false\">\n        <dc:Bounds x=\"503\" y=\"110\" width=\"153\" height=\"480\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0zxz1a9\" bpmnElement=\"Nested_Vertical_Lane_B\" isHorizontal=\"false\">\n        <dc:Bounds x=\"350\" y=\"110\" width=\"153\" height=\"480\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1dq00p8\" bpmnElement=\"Nested_Vertical_Lane_A\" isHorizontal=\"false\">\n        <dc:Bounds x=\"160\" y=\"110\" width=\"190\" height=\"480\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0t1n94f\" bpmnElement=\"V_Task\">\n        <dc:Bounds x=\"190\" y=\"330\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0d8jcff\" bpmnElement=\"V_Task_Boundary\">\n        <dc:Bounds x=\"190\" y=\"170\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0ft8wdi\" bpmnElement=\"V_Boundary\">\n        <dc:Bounds x=\"272\" y=\"212\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"259\" y=\"253\" width=\"62\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_0tb53a9\" bpmnElement=\"Flow_V\">\n        <di:waypoint x=\"240\" y=\"250\" />\n        <di:waypoint x=\"240\" y=\"330\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"403\" y=\"103\" width=\"6\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_0yevmra\" bpmnElement=\"Flow_From_V_Boundary\">\n        <di:waypoint x=\"308\" y=\"230\" />\n        <di:waypoint x=\"320\" y=\"230\" />\n        <di:waypoint x=\"320\" y=\"370\" />\n        <di:waypoint x=\"290\" y=\"370\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"377\" y=\"188\" width=\"6\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/spec/features/modeling/lanes/participant-lane-vertical.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"_DjEdwG27EeW3UIoxwJSm9g\" targetNamespace=\"http://camunda.org/schema/1.0/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.19.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"_Collaboration_3\">\n    <bpmn2:participant id=\"Vertical_Participant_Lane\" name=\"Vertical_Participant_Lane\" processRef=\"Process_Vertical_Lane\" />\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_Vertical_Lane\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_0crgcak\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Vertical_Lane\" name=\"Vertical_Lane\">\n        <bpmn2:flowNodeRef>Task_2</bpmn2:flowNodeRef>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:task id=\"Task_2\" />\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPLane\" bpmnElement=\"_Collaboration_3\">\n      <bpmndi:BPMNShape id=\"BPMNShape_0g790jf\" bpmnElement=\"Vertical_Participant_Lane\" isHorizontal=\"false\">\n        <dc:Bounds x=\"180\" y=\"80\" width=\"215\" height=\"540\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_14tn4re\" bpmnElement=\"Vertical_Lane\" isHorizontal=\"false\">\n        <dc:Bounds x=\"180\" y=\"110\" width=\"215\" height=\"510\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0thxq0s\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"267\" y=\"476\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/lanes/participant-lane.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"_DjEdwG27EeW3UIoxwJSm9g\" targetNamespace=\"http://camunda.org/schema/1.0/bpmn\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"_Collaboration_3\">\n    <bpmn2:participant id=\"Participant_Lane\" name=\"Participant_Lane\" processRef=\"Process_Lane\" />\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_Lane\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Lane\" name=\"Lane\">\n        <bpmn2:flowNodeRef>Task_1</bpmn2:flowNodeRef>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:task id=\"Task_1\" />\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPLane\" bpmnElement=\"_Collaboration_3\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_3\" bpmnElement=\"Participant_Lane\" isHorizontal=\"true\">\n        <dc:Bounds x=\"48\" y=\"60\" width=\"540\" height=\"215\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_7\" bpmnElement=\"Lane\" isHorizontal=\"true\">\n        <dc:Bounds x=\"78\" y=\"60\" width=\"510\" height=\"215\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_4\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"444\" y=\"167\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/spec/features/modeling/lanes/participant-no-lane-vertical.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"_DjEdwG27EeW3UIoxwJSm9g\" targetNamespace=\"http://camunda.org/schema/1.0/bpmn\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"_Collaboration_3\">\n    <bpmn2:participant id=\"Vertical_Participant_No_Lane\" name=\"Vertical_Participant_No_Lane\" processRef=\"Process_Vertical_No_Lane\" />\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_Vertical_No_Lane\" isExecutable=\"false\">\n    <bpmn2:startEvent id=\"Event_0lr3wn0\" />\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPLane\" bpmnElement=\"_Collaboration_3\">\n      <bpmndi:BPMNShape id=\"BPMNShape_1sdq5ic\" bpmnElement=\"Vertical_Participant_No_Lane\" isHorizontal=\"false\">\n        <dc:Bounds x=\"160\" y=\"90\" width=\"190\" height=\"567\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0tuqttt\" bpmnElement=\"Event_0lr3wn0\">\n        <dc:Bounds x=\"189\" y=\"439\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"130\" y=\"370\" width=\"0\" height=\"90\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/lanes/participant-no-lane.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"_DjEdwG27EeW3UIoxwJSm9g\" targetNamespace=\"http://camunda.org/schema/1.0/bpmn\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"_Collaboration_3\">\n    <bpmn2:participant id=\"Participant_No_Lane\" name=\"Participant_No_Lane\" processRef=\"Process_No_Lane\" />\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_No_Lane\" isExecutable=\"false\">\n    <bpmn2:startEvent id=\"StartEvent_1\" />\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPLane\" bpmnElement=\"_Collaboration_3\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_4\" bpmnElement=\"Participant_No_Lane\" isHorizontal=\"true\">\n        <dc:Bounds x=\"48\" y=\"60\" width=\"567\" height=\"190\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"397\" y=\"89\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"370\" y=\"130\" width=\"90\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/spec/features/modeling/lanes/participant-single-lane.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:camunda=\"http://camunda.org/schema/1.0/bpmn\" id=\"Definitions_0e8iwaa\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.1.2\">\r\n  <bpmn:collaboration id=\"Collaboration_1\">\r\n    <bpmn:participant id=\"Participant_1\" name=\"Participant_1\" processRef=\"Process_1\" />\r\n  </bpmn:collaboration>\r\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\" camunda:modelerTemplate=\"test\">\r\n    <bpmn:laneSet id=\"LaneSet_19hihz6\">\r\n      <bpmn:lane id=\"Lane_1\" name=\"Lane_1\" />\r\n    </bpmn:laneSet>\r\n  </bpmn:process>\r\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\r\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\r\n      <bpmndi:BPMNShape id=\"Participant_1j1fs6n_di\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\r\n        <dc:Bounds x=\"164\" y=\"110\" width=\"600\" height=\"250\" />\r\n      </bpmndi:BPMNShape>\r\n      <bpmndi:BPMNShape id=\"Lane_0fl7487_di\" bpmnElement=\"Lane_1\" isHorizontal=\"true\">\r\n        <dc:Bounds x=\"194\" y=\"110\" width=\"570\" height=\"250\" />\r\n      </bpmndi:BPMNShape>\r\n    </bpmndi:BPMNPlane>\r\n  </bpmndi:BPMNDiagram>\r\n</bpmn:definitions>\r\n"
  },
  {
    "path": "test/spec/features/modeling/layout/Helper.js",
    "content": "import {\n  getBpmnJS\n} from 'test/TestHelper';\n\n\nexport function connect(source, target, attrs) {\n\n  var elementRegistry = getBpmnJS().get('elementRegistry'),\n      modeling = getBpmnJS().get('modeling');\n\n  var sourceElement = typeof source === 'string' ? elementRegistry.get(source) : source;\n  var targetElement = typeof target === 'string' ? elementRegistry.get(target) : target;\n\n  // assume\n  expect(sourceElement).to.exist;\n  expect(targetElement).to.exist;\n\n  return modeling.connect(sourceElement, targetElement, attrs);\n}\n\n\nexport function reconnectEnd(connection, target, docking) {\n\n  var elementRegistry = getBpmnJS().get('elementRegistry'),\n      modeling = getBpmnJS().get('modeling');\n\n  var connectionElement = typeof connection === 'string' ? elementRegistry.get(connection) : connection;\n  var targetElement = typeof target === 'string' ? elementRegistry.get(target) : target;\n\n  // assume\n  expect(connectionElement).to.exist;\n  expect(targetElement).to.exist;\n\n  return modeling.reconnectEnd(connectionElement, targetElement, docking);\n}\n\n\nexport function element(id) {\n  return getBpmnJS().get('elementRegistry').get(id);\n}\n\n\nexport function move(shape, delta) {\n\n  var elementRegistry = getBpmnJS().get('elementRegistry'),\n      modeling = getBpmnJS().get('modeling');\n\n  var shapeElement = typeof shape === 'string' ? elementRegistry.get(shape) : shape;\n\n  // assume\n  expect(shapeElement).to.exist;\n\n  modeling.moveElements([ shapeElement ], delta);\n\n  return shapeElement;\n}\n\n// debugging\nexport function inspect(element) {\n  console.log(JSON.stringify(element));\n}"
  },
  {
    "path": "test/spec/features/modeling/layout/LayoutAssociationSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - layout association', function() {\n\n  var diagramXML = require('../../../../fixtures/bpmn/basic.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: [\n      coreModule,\n      modelingModule\n    ]\n  }));\n\n\n  var rootShape;\n\n  beforeEach(inject(function(canvas) {\n    rootShape = canvas.getRootElement();\n  }));\n\n\n  it('should layout straight after TextAnnotation creation', inject(function(elementRegistry, modeling) {\n\n    // given\n    var startEventShape = elementRegistry.get('StartEvent_1');\n\n    // when\n    var textAnnotationShape = modeling.createShape({ type: 'bpmn:TextAnnotation' }, { x: 400, y: 400 }, rootShape);\n\n    modeling.connect(textAnnotationShape, startEventShape);\n\n    var waypoints = textAnnotationShape.outgoing[0].waypoints;\n\n    // then\n    expect(waypoints).to.eql([\n      { original: { x: 400, y: 400 }, x: 389, y: 385 },\n      { original: { x: 191, y: 120 }, x: 202, y: 134 }\n    ]);\n\n  }));\n\n\n  it('should layout straight after TextAnnotation move', inject(function(elementRegistry, modeling) {\n\n    // given\n    var startEventShape = elementRegistry.get('StartEvent_1'),\n        textAnnotationShape = modeling.createShape({ type: 'bpmn:TextAnnotation' }, { x: 400, y: 400 }, rootShape);\n\n    modeling.connect(textAnnotationShape, startEventShape);\n\n    // when\n    modeling.moveElements([ textAnnotationShape ], { x: 20, y: 0 }, rootShape);\n\n    var waypoints = textAnnotationShape.outgoing[0].waypoints;\n\n    // then\n    expect(waypoints).to.eql([\n      { original: { x: 420, y: 400 }, x: 408, y: 385 },\n      { original: { x: 191, y: 120 }, x: 202, y: 134 }\n    ]);\n\n  }));\n\n\n  it('should retain waypoints after TextAnnotation move', inject(function(elementRegistry, modeling) {\n\n    // given\n    var startEventShape = elementRegistry.get('StartEvent_1'),\n        textAnnotationShape = modeling.createShape({ type: 'bpmn:TextAnnotation' }, { x: 400, y: 400 }, rootShape);\n\n    var connection = modeling.connect(textAnnotationShape, startEventShape),\n        waypoints = connection.waypoints;\n\n    // add a waypoint\n    waypoints.splice(1, 0, { x: 400, y: 300 });\n\n    modeling.updateWaypoints(connection, waypoints);\n\n    // when\n    modeling.moveElements([ textAnnotationShape ], { x: 20, y: 0 }, rootShape);\n\n    // then\n    expect(connection).to.have.waypoints([\n      { original: { x: 420, y: 400 }, x: 417, y: 385 },\n      { x: 400, y: 300 },\n      { original: { x: 191, y: 120 }, x: 204, y: 132 }\n    ]);\n\n  }));\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/layout/LayoutConnectionSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport { getDi } from 'lib/util/ModelUtil';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\nimport bendpointsModule from 'diagram-js/lib/features/bendpoints';\nimport connectionPreviewModule from 'diagram-js/lib/features/connection-preview';\nimport connectModule from 'diagram-js/lib/features/connect';\nimport createModule from 'diagram-js/lib/features/create';\n\nimport {\n  createCanvasEvent as canvasEvent\n} from '../../../../util/MockEvents';\n\n\nvar testModules = [\n  bendpointsModule,\n  connectionPreviewModule,\n  connectModule,\n  coreModule,\n  createModule,\n  modelingModule\n];\n\n\ndescribe('features/modeling - layout connection', function() {\n\n  var diagramXML = require('../../../../fixtures/bpmn/sequence-flows.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: testModules\n  }));\n\n\n  describe('should not change already layouted', function() {\n\n    it('execute', inject(function(elementRegistry, modeling, bpmnFactory) {\n\n      // given\n      var sequenceFlowConnection = elementRegistry.get('SequenceFlow_1'),\n          sequenceFlowDi = getDi(sequenceFlowConnection);\n\n      var expectedWaypoints = sequenceFlowConnection.waypoints;\n\n      // when\n      modeling.layoutConnection(sequenceFlowConnection);\n\n      // then\n\n      // expect cropped, repaired connection\n      // that was not actually modified\n\n      expect(sequenceFlowConnection.waypoints).to.eql(expectedWaypoints);\n\n      // expect cropped waypoints in di\n      var diWaypoints = bpmnFactory.createDiWaypoints(expectedWaypoints);\n\n      expect(sequenceFlowDi.waypoint).eql(diWaypoints);\n    }));\n\n\n    it('undo', inject(function(elementRegistry, commandStack, modeling) {\n\n      // given\n      var sequenceFlowConnection = elementRegistry.get('SequenceFlow_1'),\n          sequenceFlowDi = getDi(sequenceFlowConnection);\n\n      var oldWaypoints = sequenceFlowConnection.waypoints,\n          oldDiWaypoints = sequenceFlowDi.waypoint;\n\n      modeling.layoutConnection(sequenceFlowConnection);\n\n      // when\n      commandStack.undo();\n\n      // then\n      expect(sequenceFlowConnection.waypoints).eql(oldWaypoints);\n      expect(sequenceFlowDi.waypoint).eql(oldDiWaypoints);\n    }));\n\n\n    it('redo', inject(function(elementRegistry, commandStack, modeling) {\n\n      // given\n      var sequenceFlowConnection = elementRegistry.get('SequenceFlow_1'),\n          sequenceFlowDi = getDi(sequenceFlowConnection);\n\n\n      modeling.layoutConnection(sequenceFlowConnection);\n\n      var newWaypoints = sequenceFlowConnection.waypoints,\n          newDiWaypoints = sequenceFlowDi.waypoint;\n\n      // when\n      commandStack.undo();\n      commandStack.redo();\n\n      // then\n      expect(sequenceFlowConnection.waypoints).eql(newWaypoints);\n      expect(sequenceFlowDi.waypoint).eql(newDiWaypoints);\n    }));\n\n  });\n\n\n  it('should remove un-needed waypoints', inject(function(elementRegistry, modeling) {\n\n    // given\n    var taskShape = elementRegistry.get('Task_2'),\n        sequenceFlowConnection = elementRegistry.get('SequenceFlow_1');\n\n    // when\n    // moving task\n    modeling.moveElements([ taskShape ], { x: 250, y: -95 });\n\n    // then\n    var newWaypoints = sequenceFlowConnection.waypoints;\n\n    expect(newWaypoints.map(toPoint)).to.eql([\n      { x: 578, y: 341 },\n      { x: 982, y: 341 }\n    ]);\n  }));\n\n\n  describe('integration', function() {\n\n    describe('re-connection', function() {\n\n      it('should correctly layout after start re-connection', inject(function(elementRegistry, modeling) {\n\n        // given\n        var task1 = elementRegistry.get('Task_1'),\n            connection = elementRegistry.get('SequenceFlow_1'),\n            docking = { x: 292, y: 376 };\n\n        // when\n        modeling.reconnectStart(connection, task1, docking);\n\n        // then\n        var waypoints = connection.waypoints,\n            i,\n            first,\n            second;\n\n        for (i = 0; i < waypoints.length - 1; i++) {\n          first = waypoints[i];\n          second = waypoints[i + 1];\n\n          expect(areOnSameAxis(first, second), 'points are on different axes').to.be.true;\n        }\n\n      }));\n\n\n      it('should correctly layout after end re-connection', inject(function(elementRegistry, modeling) {\n\n        // given\n        var task1 = elementRegistry.get('Task_1'),\n            connection = elementRegistry.get('SequenceFlow_1'),\n            docking = { x: 292, y: 376 };\n\n        // when\n        modeling.reconnectEnd(connection, task1, docking);\n\n        // then\n        var waypoints = connection.waypoints,\n            i,\n            first,\n            second;\n\n        for (i = 0; i < waypoints.length - 1; i++) {\n          first = waypoints[i];\n          second = waypoints[i + 1];\n\n          expect(areOnSameAxis(first, second), 'points are on different axes').to.be.true;\n        }\n\n      }));\n\n    });\n\n\n    describe('connection preview', function() {\n\n      var task;\n\n      beforeEach(inject(function(elementFactory, dragging) {\n        task = elementFactory.createShape({\n          type: 'bpmn:Task'\n        });\n\n        dragging.setOptions({ manual: true });\n      }));\n\n      afterEach(inject(function(dragging) {\n        dragging.setOptions({ manual: false });\n      }));\n\n\n      it.skip('should correctly lay out connection preview on create',\n        inject(function(canvas, create, dragging, elementRegistry) {\n\n          // given\n          var rootShape = canvas.getRootElement(),\n              rootShapeGfx = canvas.getGraphics(rootShape),\n              task1 = elementRegistry.get('Task_1');\n\n          // when\n          create.start(canvasEvent({ x: 0, y: 0 }), task, task1);\n\n          dragging.move(canvasEvent({ x: 175, y: 175 }));\n          dragging.hover({ element: rootShape, gfx: rootShapeGfx });\n          dragging.move(canvasEvent({ x: 200, y: 200 }));\n\n          var ctx = dragging.context();\n          var context = ctx.data.context;\n\n          var connectionPreview = context.getConnection(\n            context.canExecute.connect,\n            context.source,\n            context.shape\n          );\n\n          var waypointsPreview = connectionPreview.waypoints.slice();\n\n          dragging.end();\n\n          // then\n          expect(task1.outgoing[0]).to.exist;\n          expect(task1.outgoing[0].waypoints).to.deep.eql(waypointsPreview);\n        })\n      );\n\n\n      it('should correctly lay out new connection preview',\n        inject(function(connect, dragging, elementRegistry) {\n\n          // given\n          var task1 = elementRegistry.get('Task_1'),\n              task2 = elementRegistry.get('Task_2');\n\n          // when\n          connect.start(canvasEvent({ x: 0, y: 0 }), task1);\n\n          dragging.move(canvasEvent({ x: 760, y: 420 }));\n          dragging.hover({ element: task2 });\n          dragging.move(canvasEvent({ x: 782, y: 436 }));\n\n          var ctx = dragging.context();\n          var context = ctx.data.context;\n\n          var connectionPreview = context.getConnection(\n            context.canExecute,\n            context.source,\n            context.target\n          );\n\n          var waypointsPreview = connectionPreview.waypoints.slice();\n\n          dragging.end();\n\n          // then\n          expect(task1.outgoing[0]).to.exist;\n          expect(task1.outgoing[0].waypoints).to.deep.eql(waypointsPreview);\n        })\n      );\n\n\n      it('should correctly lay out connection preview on reconnect start',\n        inject(function(canvas, bendpointMove, dragging, elementRegistry) {\n\n          // given\n          var task1 = elementRegistry.get('Task_1'),\n              task1Gfx = canvas.getGraphics(task1),\n              sequenceFlow2 = elementRegistry.get('SequenceFlow_2');\n\n          // when\n          bendpointMove.start(canvasEvent({ x: 0, y: 0 }), sequenceFlow2, 0);\n\n          dragging.move(canvasEvent({ x: 230, y: 360 }));\n          dragging.hover({ element: task1, gfx: task1Gfx });\n          dragging.move(canvasEvent({ x: 248, y: 382 }));\n\n          var ctx = dragging.context();\n          var context = ctx.data.context;\n\n          var connectionPreview = context.getConnection(\n            context.allowed,\n            context.source,\n            context.target\n          );\n\n          var waypointsPreview = connectionPreview.waypoints.slice();\n\n          dragging.end();\n\n          // then\n          expect(task1.outgoing[0]).to.exist;\n          expect(task1.outgoing[0].waypoints).to.deep.eql(waypointsPreview);\n        })\n      );\n\n\n      it('should correctly lay out connection preview on reconnect end',\n        inject(function(canvas, bendpointMove, dragging, elementRegistry) {\n\n          // given\n          var task1 = elementRegistry.get('Task_1'),\n              task1Gfx = canvas.getGraphics(task1),\n              sequenceFlow2 = elementRegistry.get('SequenceFlow_2');\n\n          // when\n          bendpointMove.start(canvasEvent({ x: 0, y: 0 }), sequenceFlow2, 2);\n\n          dragging.move(canvasEvent({ x: 230, y: 360 }));\n          dragging.hover({ element: task1, gfx: task1Gfx });\n          dragging.move(canvasEvent({ x: 248, y: 382 }));\n\n          var ctx = dragging.context();\n          var context = ctx.data.context;\n\n          var connectionPreview = context.getConnection(\n            context.allowed,\n            context.source,\n            context.target\n          );\n\n          var waypointsPreview = connectionPreview.waypoints.slice();\n\n          dragging.end();\n\n          // then\n          expect(task1.incoming[0]).to.exist;\n          expect(task1.incoming[0].waypoints).to.deep.eql(waypointsPreview);\n        })\n      );\n\n\n      it('should correctly lay out connection preview on inserted bendpoint move',\n        inject(function(bendpointMove, dragging, elementRegistry) {\n\n          // given\n          var task2 = elementRegistry.get('Task_2'),\n              sequenceFlow1 = elementRegistry.get('SequenceFlow_1');\n\n          // when\n          bendpointMove.start(canvasEvent({ x: 700, y: 341 }), sequenceFlow1, 1, true);\n\n          dragging.move(canvasEvent({ x: 700, y: 400 }));\n\n          var ctx = dragging.context();\n          var context = ctx.data.context;\n\n          var connectionPreview = context.getConnection(context.allowed);\n\n          var waypointsPreview = connectionPreview.waypoints.slice();\n\n          dragging.end();\n\n          // then\n          expect(task2.incoming[0]).to.exist;\n          expect(task2.incoming[0].waypoints).to.deep.eql(waypointsPreview);\n        })\n      );\n\n\n      it('should correctly lay out connection preview on existing bendpoint move',\n        inject(function(bendpointMove, dragging, elementRegistry) {\n\n          // given\n          var task2 = elementRegistry.get('Task_2'),\n              sequenceFlow1 = elementRegistry.get('SequenceFlow_1');\n\n          // when\n          bendpointMove.start(canvasEvent({ x: 934, y: 341 }), sequenceFlow1, 1);\n\n          dragging.move(canvasEvent({ x: 960, y: 340 }));\n\n          var ctx = dragging.context();\n          var context = ctx.data.context;\n\n          var connectionPreview = context.getConnection(context.allowed);\n\n          var waypointsPreview = connectionPreview.waypoints.slice();\n\n          dragging.end();\n\n          // then\n          expect(task2.incoming[0]).to.exist;\n          expect(task2.incoming[0].waypoints).to.deep.eql(waypointsPreview);\n        })\n      );\n    });\n\n\n    describe('connection preview with connection type replacement', function() {\n\n      var diagramXML = require('test/spec/features/modeling/behavior/ReplaceConnectionBehavior.message-sequence-flow.bpmn');\n\n      beforeEach(inject(function(dragging) {\n        dragging.setOptions({ manual: true });\n      }));\n\n      afterEach(inject(function(dragging) {\n        dragging.setOptions({ manual: false });\n      }));\n\n      beforeEach(bootstrapModeler(diagramXML, {\n        modules: testModules\n      }));\n\n\n      it('should correctly lay out connection preview when reconnecting with replacement',\n        inject(function(canvas, bendpointMove, dragging, elementRegistry) {\n\n          // given\n          var participant2 = elementRegistry.get('Participant_2'),\n              participant2Gfx = canvas.getGraphics(participant2),\n              sequenceFlow1 = elementRegistry.get('SequenceFlow_1');\n\n          // when\n          bendpointMove.start(canvasEvent(sequenceFlow1.waypoints[1]), sequenceFlow1, 1);\n\n          dragging.move(canvasEvent({ x: participant2.x + 100, y: participant2.y + 10 }));\n          dragging.hover({ element: participant2, gfx: participant2Gfx });\n          dragging.move(canvasEvent({ x: participant2.x + 105, y: participant2.y + 10 }));\n\n\n          var ctx = dragging.context();\n          var context = ctx.data.context;\n\n          var connectionPreview = context.getConnection(context.allowed);\n\n          var waypointsPreview = connectionPreview.waypoints.slice();\n\n          dragging.end();\n\n          var newWaypoints = participant2.incoming.slice(-1)[0].waypoints;\n\n          // then\n          expect(newWaypoints).to.exist;\n          expect(newWaypoints).to.deep.eql(waypointsPreview);\n        })\n      );\n    });\n\n\n    describe('attaching event', function() {\n\n      var diagramXML = require('test/spec/features/rules/BpmnRules.attaching.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, {\n        modules: testModules\n      }));\n\n\n      it('should correctly lay out connection after replacement',\n        inject(function(elementRegistry, modeling) {\n\n          // given\n          var event = elementRegistry.get('IntermediateThrowEventWithConnections'),\n              parent = elementRegistry.get('SubProcess_1');\n\n          // when\n          modeling.moveElements([ event ], { x: 0, y: -90 }, parent, { attach: true });\n\n          // then\n          var boundaryEvent = elementRegistry.get('IntermediateThrowEventWithConnections');\n\n          expect(boundaryEvent.outgoing[0]).to.have.waypoints([\n            { x: 769, y: 297 },\n            { x: 769, y: 369 },\n            { x: 837, y: 369 }\n          ]);\n        })\n      );\n\n    });\n  });\n\n});\n\n\n\n// helpers //////////////////////\n\nfunction toPoint(p) {\n  return {\n    x: p.x,\n    y: p.y\n  };\n}\n\nfunction areOnSameAxis(a, b) {\n  return a.x === b.x || a.y === b.y;\n}"
  },
  {
    "path": "test/spec/features/modeling/layout/LayoutDataAssociationSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - layout data association', function() {\n\n  var diagramXML = require('../../../../fixtures/bpmn/basic.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: [\n      coreModule,\n      modelingModule\n    ]\n  }));\n\n\n  var rootShape,\n      taskShape;\n\n  beforeEach(inject(function(elementRegistry, canvas) {\n    rootShape = canvas.getRootElement();\n    taskShape = elementRegistry.get('Task_1');\n  }));\n\n\n  it('should layout straight after DataObjectReference creation', inject(function(modeling) {\n\n    // when\n    var dataObjectShape = modeling.createShape({ type: 'bpmn:DataObjectReference' }, { x: 200, y: 400 }, rootShape);\n\n    modeling.connect(dataObjectShape, taskShape);\n\n    var waypoints = dataObjectShape.outgoing[0].waypoints;\n\n    // then\n    expect(waypoints).to.eql([\n      { original: { x: 200, y: 400 }, x: 218, y: 375 },\n      { original: { x: 403, y: 120 }, x: 374, y: 160 }\n    ]);\n\n  }));\n\n\n  it('should layout straight after DataObjectReference move', inject(function(modeling) {\n\n    // given\n    var dataObjectShape = modeling.createShape({ type: 'bpmn:DataObjectReference' }, { x: 200, y: 400 }, rootShape);\n\n    modeling.connect(dataObjectShape, taskShape);\n\n    // when\n    modeling.moveElements([ dataObjectShape ], { x: 20, y: 0 }, rootShape);\n\n    var waypoints = dataObjectShape.outgoing[0].waypoints;\n\n    // then\n    expect(waypoints).to.eql([\n      { original: { x: 220, y: 400 }, x: 236, y: 375 },\n      { original: { x: 403, y: 120 }, x: 377, y: 160 }\n    ]);\n\n  }));\n\n\n  it('should retain waypoints after DataObjectReference move', inject(function(modeling) {\n\n    // given\n    var dataObjectShape = modeling.createShape({ type: 'bpmn:DataObjectReference' }, { x: 200, y: 400 }, rootShape),\n        connection = modeling.connect(dataObjectShape, taskShape),\n        waypoints = connection.waypoints;\n\n    // add a waypoint\n    waypoints.splice(1, 0, { x: 400, y: 300 });\n\n    modeling.updateWaypoints(connection, waypoints);\n\n    // when\n    modeling.moveElements([ dataObjectShape ], { x: 20, y: 0 }, rootShape);\n\n    waypoints = taskShape.incoming[0].waypoints;\n\n    // then\n    expect(waypoints).to.eql([\n      { original: { x: 220, y: 400 }, x: 238, y: 390 },\n      { x: 400, y: 300 },\n      { original: { x: 403, y: 120 }, x: 402, y: 160 }\n    ]);\n\n  }));\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/layout/LayoutMessageFlowSpec.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"_pHDz0KojEeOJhIBv1RySdg\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.2.0-nightly\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"Participant_A\" name=\"A\" processRef=\"Process_A\" />\n    <bpmn2:participant id=\"Participant_B\" name=\"B\" processRef=\"Process_B\" />\n    <bpmn2:messageFlow id=\"MessageFlow_1\" name=\"1\" sourceRef=\"Task_B\" targetRef=\"Participant_B\" />\n    <bpmn2:messageFlow id=\"MessageFlow_2\" name=\"2\" sourceRef=\"Participant_B\" targetRef=\"Participant_A\" />\n    <bpmn2:messageFlow id=\"MessageFlow_3\" name=\"3\" sourceRef=\"SubProcess_E\" targetRef=\"SubProcess_G\" />\n    <bpmn2:messageFlow id=\"MessageFlow_4\" name=\"4\" sourceRef=\"Task_A\" targetRef=\"StartEvent_F\" />\n    <bpmn2:messageFlow id=\"MessageFlow_5\" name=\"5\" sourceRef=\"EndEvent_C\" targetRef=\"Participant_B\" />\n    <bpmn2:messageFlow id=\"MessageFlow_6\" name=\"6\" sourceRef=\"Participant_B\" targetRef=\"Task_D\" />\n    <bpmn2:messageFlow id=\"MessageFlow_7\" name=\"7\" sourceRef=\"SubProcess_G\" targetRef=\"Task_D\" />\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_A\" isExecutable=\"false\">\n    <bpmn2:task id=\"Task_A\" name=\"A\" />\n    <bpmn2:endEvent id=\"EndEvent_C\" name=\"C\">\n      <bpmn2:messageEventDefinition id=\"MessageEventDefinition_2\" />\n    </bpmn2:endEvent>\n    <bpmn2:task id=\"Task_B\" name=\"B\" />\n    <bpmn2:task id=\"Task_D\" name=\"D\" />\n    <bpmn2:subProcess id=\"SubProcess_E\" name=\"E\" />\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_B\" isExecutable=\"false\">\n    <bpmn2:subProcess id=\"SubProcess_G\" name=\"G\" />\n    <bpmn2:startEvent id=\"StartEvent_F\" name=\"F\">\n      <bpmn2:messageEventDefinition id=\"MessageEventDefinition_1\" />\n    </bpmn2:startEvent>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"Participant_A_di\" bpmnElement=\"Participant_A\" isHorizontal=\"true\">\n        <dc:Bounds x=\"278\" y=\"64\" width=\"823\" height=\"237\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_B_di\" bpmnElement=\"Participant_B\" isHorizontal=\"true\">\n        <dc:Bounds x=\"222\" y=\"415\" width=\"600\" height=\"185\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_F_di\" bpmnElement=\"StartEvent_F\">\n        <dc:Bounds x=\"300\" y=\"448\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"273\" y=\"489\" width=\"90\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_D\" bpmnElement=\"Task_A\">\n        <dc:Bounds x=\"360\" y=\"134\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_1\" bpmnElement=\"MessageFlow_1\" sourceElement=\"_BPMNShape_Task_4\" targetElement=\"Participant_B_di\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"590\" y=\"214\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"590\" y=\"415\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"555\" y=\"320\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_2\" bpmnElement=\"MessageFlow_2\" sourceElement=\"Participant_B_di\" targetElement=\"Participant_A_di\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"506\" y=\"415\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"506\" y=\"301\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"477\" y=\"356\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_4\" bpmnElement=\"MessageFlow_4\" sourceElement=\"_BPMNShape_Task_D\" targetElement=\"StartEvent_F_di\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"390\" y=\"214\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"390\" y=\"387\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"318\" y=\"387\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"318\" y=\"448\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"361\" y=\"321\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EndEvent_C_di\" bpmnElement=\"EndEvent_C\">\n        <dc:Bounds x=\"653\" y=\"178\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"626\" y=\"154\" width=\"90\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_5\" bpmnElement=\"MessageFlow_5\" sourceElement=\"EndEvent_C_di\" targetElement=\"Participant_B_di\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"671\" y=\"214\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"671\" y=\"415\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"636\" y=\"314\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_4\" bpmnElement=\"Task_B\">\n        <dc:Bounds x=\"516\" y=\"134\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_D_di\" bpmnElement=\"Task_D\">\n        <dc:Bounds x=\"723\" y=\"134\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_6_di\" bpmnElement=\"MessageFlow_6\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"773\" y=\"415\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"773\" y=\"214\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"743\" y=\"304.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"SubProcess_E_di\" bpmnElement=\"SubProcess_E\" isExpanded=\"true\">\n        <dc:Bounds x=\"855\" y=\"135\" width=\"184\" height=\"131\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_G_di\" bpmnElement=\"SubProcess_G\" isExpanded=\"true\">\n        <dc:Bounds x=\"566\" y=\"458\" width=\"212\" height=\"122\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_7_di\" bpmnElement=\"MessageFlow_7\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"752\" y=\"458\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"752\" y=\"214\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"698\" y=\"318\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"MessageFlow_3_di\" bpmnElement=\"MessageFlow_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"902\" y=\"266\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"902\" y=\"362\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"708\" y=\"362\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"708\" y=\"458\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"814\" y=\"340\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/layout/LayoutMessageFlowSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - layout message flows', function() {\n\n  var diagramXML = require('./LayoutMessageFlowSpec.bpmn');\n\n  var testModules = [ coreModule, modelingModule ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  it('should layout manhattan after Task move', inject(function(elementRegistry, modeling) {\n\n    // given\n    var taskShape = elementRegistry.get('Task_A'),\n        messageFlowConnection = elementRegistry.get('MessageFlow_4');\n\n    // when\n    modeling.moveElements([ taskShape ], { x: 30, y: 20 });\n\n    // then\n    // expect cropped, repaired manhattan connection\n    expect(messageFlowConnection).to.have.waypoints([\n      { original: { x: 420, y: 234 }, x: 420, y: 234 },\n      { x: 420, y: 387 },\n      { x: 318, y: 387 },\n      { original: { x: 318, y: 448 }, x: 318, y: 448 }\n    ]);\n  }));\n\n\n  it('should layout Task -> Participant straight after Task move',\n    inject(function(elementRegistry, modeling) {\n\n      // given\n      var taskShape = elementRegistry.get('Task_B'),\n          messageFlowConnection = elementRegistry.get('MessageFlow_1');\n\n      // when\n      modeling.moveElements([ taskShape ], { x: 20, y: -20 });\n\n      // then\n\n      // expect cropped, repaired manhattan connection\n      expect(messageFlowConnection).to.have.waypoints([\n        { original: { x: 610, y: 194 }, x: 610, y: 194 },\n        { original: { x: 610, y: 415 }, x: 610, y: 415 }\n      ]);\n    })\n  );\n\n\n  it('should layout straight after Participant move', inject(function(elementRegistry, modeling) {\n\n    // given\n    var participantShape = elementRegistry.get('Participant_B'),\n        messageFlowConnection = elementRegistry.get('MessageFlow_5');\n\n    // when\n    modeling.moveElements([ participantShape ], { x: 100, y: 50 });\n\n    // then\n\n    // expect cropped, repaired manhattan connection\n    expect(messageFlowConnection).to.have.waypoints([\n      { original: { x: 671, y: 214 }, x: 671, y: 214 },\n      { original: { x: 671, y: 465 }, x: 671, y: 465 }\n    ]);\n  }));\n\n\n  it('should layout EndEvent -> Participant manhattan',\n    inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Participant_B'),\n          messageFlowConnection = elementRegistry.get('MessageFlow_5');\n\n      // when\n      modeling.moveElements([ participantShape ], { x: -200, y: 0 });\n\n      // then\n      // expect cropped, repaired manhattan connection\n      expect(messageFlowConnection).to.have.waypoints([\n        { original: { x: 671, y: 214 }, x: 671, y: 214 },\n        { x: 671, y: 315 },\n        { x: 471, y: 315 },\n        { original: { x: 471, y: 415 }, x: 471, y: 415 }\n      ]);\n    })\n  );\n\n\n  it('should layout SubProcess -> SubProcess (straight) on SubProcess move',\n    inject(function(elementRegistry, modeling) {\n\n      // given\n      var subProcessShape = elementRegistry.get('SubProcess_G'),\n          messageFlowConnection = elementRegistry.get('MessageFlow_3');\n\n      // when\n      modeling.moveElements([ subProcessShape ], { x: 300, y: 0 });\n\n      // then\n      expect(messageFlowConnection).to.have.waypoints([\n        { x: 902, y: 266 }, { x: 902, y: 458 }\n      ]);\n    })\n  );\n\n\n  describe('should keep task docking', function() {\n\n    describe('on SubProcess resize', function() {\n\n      it('SubProcess -> Task (straight)',\n        inject(function(elementRegistry, modeling) {\n\n          // given\n          var subProcessShape = elementRegistry.get('SubProcess_G'),\n              messageFlowConnection = elementRegistry.get('MessageFlow_7');\n\n          // when\n          modeling.resizeShape(subProcessShape, {\n            x: 586,\n            y: 458,\n            width: 212,\n            height: 122\n          });\n\n          // then\n          // expect cropped, repaired manhattan connection\n          expect(messageFlowConnection).to.have.waypoints([\n            { x: 752, y: 458 },\n            { x: 752, y: 214 }\n          ]);\n        })\n      );\n    });\n\n\n    describe('on SubProcess move', function() {\n\n      it('SubProcess -> Task (straight)',\n        inject(function(elementRegistry, modeling) {\n\n          // given\n          var subProcessShape = elementRegistry.get('SubProcess_G'),\n              messageFlowConnection = elementRegistry.get('MessageFlow_7');\n\n          // when\n          modeling.moveElements([ subProcessShape ], { x: 50, y: 0 });\n\n          // then\n          // expect cropped, repaired manhattan connection\n          expect(messageFlowConnection).to.have.waypoints([\n            { x: 752, y: 458 },\n            { x: 752, y: 214 }\n          ]);\n        })\n      );\n    });\n\n\n    describe('on Participant move', function() {\n\n      it('Task -> Participant (straight)',\n        inject(function(elementRegistry, modeling) {\n\n          // given\n          var participantShape = elementRegistry.get('Participant_B'),\n              messageFlowConnection_1 = elementRegistry.get('MessageFlow_1'),\n              messageFlowConnection_6 = elementRegistry.get('MessageFlow_6');\n\n          // when\n          modeling.moveElements([ participantShape ], { x: 300, y: 50 });\n\n          // then\n\n          // expect cropped, repaired manhattan connection\n          expect(messageFlowConnection_1).to.have.waypoints([\n            { original: { x: 590, y: 214 }, x: 590, y: 214 },\n            { original: { x: 590, y: 465 }, x: 590, y: 465 }\n          ]);\n\n          expect(messageFlowConnection_6).to.have.waypoints([\n            { original: { x: 773, y: 465 }, x: 773, y: 465 },\n            { original: { x: 773, y: 214 }, x: 773, y: 214 }\n          ]);\n        })\n      );\n\n    });\n\n\n    describe('on Participant resize', function() {\n\n      it('Task -> Participant (straight)',\n        inject(function(elementRegistry, modeling) {\n\n          // given\n          var participantShape = elementRegistry.get('Participant_B'),\n              messageFlowConnection = elementRegistry.get('MessageFlow_1');\n\n          // when\n          modeling.resizeShape(participantShape, {\n            x: 222,\n            y: 415,\n            width: 580,\n            height: 185\n          });\n\n          // then\n          // expect cropped, repaired manhattan connection\n          expect(messageFlowConnection).to.have.waypoints([\n            { x: 590, y: 214 },\n            { x: 590, y: 415 }\n          ]);\n        })\n      );\n\n\n      it('Participant -> Task (straight)',\n        inject(function(elementRegistry, modeling) {\n\n          // given\n          var participantShape = elementRegistry.get('Participant_B'),\n              messageFlowConnection = elementRegistry.get('MessageFlow_6');\n\n          // when\n          modeling.resizeShape(participantShape, {\n            x: 222,\n            y: 415,\n            width: 580,\n            height: 185\n          });\n\n          // then\n          // expect cropped, repaired manhattan connection\n          expect(messageFlowConnection).to.have.waypoints([\n            { x: 773, y: 415 },\n            { x: 773, y: 214 }\n          ]);\n        })\n      );\n\n\n      it('Task -> Participant (manhattan)',\n        inject(function(elementRegistry, modeling) {\n\n          // given\n          var participantShape = elementRegistry.get('Participant_B'),\n              messageFlowConnection = elementRegistry.get('MessageFlow_1');\n\n          // when\n          modeling.resizeShape(participantShape, {\n            x: 622,\n            y: 415,\n            width: 600,\n            height: 185\n          });\n\n          // then\n          // expect cropped, repaired manhattan connection\n          expect(messageFlowConnection).to.have.waypoints([\n            { x: 590, y: 214 },\n            { x: 590, y: 315 },\n            { x: 990, y: 315 },\n            { x: 990, y: 415 }\n          ]);\n        })\n      );\n\n\n      it('Participant -> Task (manhattan)',\n        inject(function(elementRegistry, modeling) {\n\n          // given\n          var participantShape = elementRegistry.get('Participant_B'),\n              messageFlowConnection = elementRegistry.get('MessageFlow_6');\n\n          // when\n          modeling.resizeShape(participantShape, {\n            x: 222,\n            y: 415,\n            width: 500,\n            height: 185\n          });\n\n          // then\n          // expect cropped, repaired manhattan connection\n          expect(messageFlowConnection).to.have.waypoints([\n            { x: 681, y: 415 },\n            { x: 681, y: 315 },\n            { x: 773, y: 315 },\n            { x: 773, y: 214 }\n          ]);\n        })\n      );\n\n    });\n\n  });\n\n});\n\n\ndescribe('features/modeling - vertical layout message flows', function() {\n\n  var diagramXML = require('./LayoutMessageFlowSpec.vertical.bpmn');\n\n  var testModules = [ coreModule, modelingModule ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  it('should layout manhattan after Task move', inject(function(elementRegistry, modeling) {\n\n    // given\n    var taskShape = elementRegistry.get('Task_A'),\n        messageFlowConnection = elementRegistry.get('MessageFlow_4');\n\n    // when\n    modeling.moveElements([ taskShape ], { x: 20, y: 30 });\n\n    // then\n    // expect cropped, repaired manhattan connection\n    expect(messageFlowConnection).to.have.waypoints([\n      { x: 244, y: 420 },\n      { x: 387, y: 420 },\n      { x: 387, y: 318 },\n      { x: 448, y: 318 }\n    ]);\n  }));\n\n\n  it('should layout Task -> Participant straight after Task move',\n    inject(function(elementRegistry, modeling) {\n\n      // given\n      var taskShape = elementRegistry.get('Task_B'),\n          messageFlowConnection = elementRegistry.get('MessageFlow_1');\n\n      // when\n      modeling.moveElements([ taskShape ], { x: -20, y: 20 });\n\n      // then\n\n      // expect cropped, repaired manhattan connection\n      expect(messageFlowConnection).to.have.waypoints([\n        { x: 204, y: 600 },\n        { x: 415, y: 600 }\n      ]);\n    })\n  );\n\n\n  it('should layout straight after Participant move', inject(function(elementRegistry, modeling) {\n\n    // given\n    var participantShape = elementRegistry.get('Participant_B'),\n        messageFlowConnection = elementRegistry.get('MessageFlow_5');\n\n    // when\n    modeling.moveElements([ participantShape ], { x: 50, y: 100 });\n\n    // then\n\n    // expect cropped, repaired manhattan connection\n    expect(messageFlowConnection).to.have.waypoints([\n      { x: 214, y: 671 },\n      { x: 465, y: 671 }\n    ]);\n  }));\n\n\n  it('should layout EndEvent -> Participant manhattan',\n    inject(function(elementRegistry, modeling) {\n\n      // given\n      var participantShape = elementRegistry.get('Participant_B'),\n          messageFlowConnection = elementRegistry.get('MessageFlow_5');\n\n      // when\n      modeling.moveElements([ participantShape ], { x: 0, y: -200 });\n\n      // then\n      // expect cropped, repaired manhattan connection\n      expect(messageFlowConnection).to.have.waypoints([\n        { x: 214, y: 671 },\n        { x: 315, y: 671 },\n        { x: 315, y: 471 },\n        { x: 415, y: 471 }\n      ]);\n    })\n  );\n\n\n  it('should layout SubProcess -> SubProcess (straight) on SubProcess move',\n    inject(function(elementRegistry, modeling) {\n\n      // given\n      var subProcessShape = elementRegistry.get('SubProcess_G'),\n          messageFlowConnection = elementRegistry.get('MessageFlow_3');\n\n      // when\n      modeling.moveElements([ subProcessShape ], { x: 0, y: 300 });\n\n      // then\n      expect(messageFlowConnection).to.have.waypoints([\n        { x: 266, y: 902 },\n        { x: 458, y: 902 }\n      ]);\n    })\n  );\n\n\n  describe('should keep task docking', function() {\n\n    describe('on SubProcess resize', function() {\n\n      it('SubProcess -> Task (straight)',\n        inject(function(elementRegistry, modeling) {\n\n          // given\n          var subProcessShape = elementRegistry.get('SubProcess_G'),\n              messageFlowConnection = elementRegistry.get('MessageFlow_7');\n\n          // when\n          modeling.resizeShape(subProcessShape, {\n            x: 458,\n            y: 586,\n            width: 122,\n            height: 212\n          });\n\n          // then\n          // expect cropped, repaired manhattan connection\n          expect(messageFlowConnection).to.have.waypoints([\n            { x: 458, y: 752 },\n            { x: 224, y: 752 }\n          ]);\n        })\n      );\n    });\n\n\n    describe('on SubProcess move', function() {\n\n      it('SubProcess -> Task (straight)',\n        inject(function(elementRegistry, modeling) {\n\n          // given\n          var subProcessShape = elementRegistry.get('SubProcess_G'),\n              messageFlowConnection = elementRegistry.get('MessageFlow_7');\n\n          // when\n          modeling.moveElements([ subProcessShape ], { x: 0, y: 50 });\n\n          // then\n          // expect cropped, repaired manhattan connection\n          expect(messageFlowConnection).to.have.waypoints([\n            { x: 458, y: 752 },\n            { x: 224, y: 752 }\n          ]);\n        })\n      );\n    });\n\n\n    describe('on Participant move', function() {\n\n      it('Task -> Participant (straight)',\n        inject(function(elementRegistry, modeling) {\n\n          // given\n          var participantShape = elementRegistry.get('Participant_B'),\n              messageFlowConnection_1 = elementRegistry.get('MessageFlow_1'),\n              messageFlowConnection_6 = elementRegistry.get('MessageFlow_6');\n\n          // when\n          modeling.moveElements([ participantShape ], { x: 50, y: 300 });\n\n          // then\n\n          // expect cropped, repaired manhattan connection\n          expect(messageFlowConnection_1).to.have.waypoints([\n            { x: 224, y: 580 },\n            { x: 465, y: 580 }\n          ]);\n\n          expect(messageFlowConnection_6).to.have.waypoints([\n            { x: 465, y: 773 },\n            { x: 224, y: 773 }\n          ]);\n        })\n      );\n\n    });\n\n\n    describe('on Participant resize', function() {\n\n      it('Task -> Participant (straight)',\n        inject(function(elementRegistry, modeling) {\n\n          // given\n          var participantShape = elementRegistry.get('Participant_B'),\n              messageFlowConnection = elementRegistry.get('MessageFlow_1');\n\n          // when\n          modeling.resizeShape(participantShape, {\n            x: 415,\n            y: 222,\n            width: 185,\n            height: 580\n          });\n\n          // then\n          // expect cropped, repaired manhattan connection\n          expect(messageFlowConnection).to.have.waypoints([\n            { x: 224, y: 580 },\n            { x: 415, y: 580 }\n          ]);\n        })\n      );\n\n\n      it('Participant -> Task (straight)',\n        inject(function(elementRegistry, modeling) {\n\n          // given\n          var participantShape = elementRegistry.get('Participant_B'),\n              messageFlowConnection = elementRegistry.get('MessageFlow_6');\n\n          // when\n          modeling.resizeShape(participantShape, {\n            x: 415,\n            y: 222,\n            width: 185,\n            height: 580\n          });\n\n          // then\n          // expect cropped, repaired manhattan connection\n          expect(messageFlowConnection).to.have.waypoints([\n            { x: 415, y: 773 },\n            { x: 224, y: 773 }\n          ]);\n        })\n      );\n\n\n      it('Task -> Participant (manhattan)',\n        inject(function(elementRegistry, modeling) {\n\n          // given\n          var participantShape = elementRegistry.get('Participant_B'),\n              messageFlowConnection = elementRegistry.get('MessageFlow_1');\n\n          // when\n          modeling.resizeShape(participantShape, {\n            x: 415,\n            y: 622,\n            width: 185,\n            height: 600\n          });\n\n          // then\n          // expect cropped, repaired manhattan connection\n          expect(messageFlowConnection).to.have.waypoints([\n            { x: 224, y: 580 },\n            { x: 320, y: 580 },\n            { x: 320, y: 980 },\n            { x: 415, y: 980 }\n          ]);\n        })\n      );\n\n\n      it('Participant -> Task (manhattan)',\n        inject(function(elementRegistry, modeling) {\n\n          // given\n          var participantShape = elementRegistry.get('Participant_B'),\n              messageFlowConnection = elementRegistry.get('MessageFlow_6');\n\n          // when\n          modeling.resizeShape(participantShape, {\n            x: 415,\n            y: 222,\n            width: 185,\n            height: 500\n          });\n\n          // then\n          // expect cropped, repaired manhattan connection\n          expect(messageFlowConnection).to.have.waypoints([\n            { x: 415, y: 681 },\n            { x: 320, y: 681 },\n            { x: 320, y: 773 },\n            { x: 224, y: 773 }\n          ]);\n        })\n      );\n\n    });\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/modeling/layout/LayoutMessageFlowSpec.vertical.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"_pHDz0KojEeOJhIBv1RySdg\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.2.0-nightly\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"Participant_A\" name=\"A\" processRef=\"Process_A\" />\n    <bpmn2:participant id=\"Participant_B\" name=\"B\" processRef=\"Process_B\" />\n    <bpmn2:messageFlow id=\"MessageFlow_1\" name=\"1\" sourceRef=\"Task_B\" targetRef=\"Participant_B\" />\n    <bpmn2:messageFlow id=\"MessageFlow_2\" name=\"2\" sourceRef=\"Participant_B\" targetRef=\"Participant_A\" />\n    <bpmn2:messageFlow id=\"MessageFlow_3\" name=\"3\" sourceRef=\"SubProcess_E\" targetRef=\"SubProcess_G\" />\n    <bpmn2:messageFlow id=\"MessageFlow_4\" name=\"4\" sourceRef=\"Task_A\" targetRef=\"StartEvent_F\" />\n    <bpmn2:messageFlow id=\"MessageFlow_5\" name=\"5\" sourceRef=\"EndEvent_C\" targetRef=\"Participant_B\" />\n    <bpmn2:messageFlow id=\"MessageFlow_6\" name=\"6\" sourceRef=\"Participant_B\" targetRef=\"Task_D\" />\n    <bpmn2:messageFlow id=\"MessageFlow_7\" name=\"7\" sourceRef=\"SubProcess_G\" targetRef=\"Task_D\" />\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_A\" isExecutable=\"false\">\n    <bpmn2:task id=\"Task_A\" name=\"A\" />\n    <bpmn2:endEvent id=\"EndEvent_C\" name=\"C\">\n      <bpmn2:messageEventDefinition id=\"MessageEventDefinition_2\" />\n    </bpmn2:endEvent>\n    <bpmn2:task id=\"Task_B\" name=\"B\" />\n    <bpmn2:task id=\"Task_D\" name=\"D\" />\n    <bpmn2:subProcess id=\"SubProcess_E\" name=\"E\" />\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_B\" isExecutable=\"false\">\n    <bpmn2:subProcess id=\"SubProcess_G\" name=\"G\" />\n    <bpmn2:startEvent id=\"StartEvent_F\" name=\"F\">\n      <bpmn2:messageEventDefinition id=\"MessageEventDefinition_1\" />\n    </bpmn2:startEvent>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"Participant_A_di\" bpmnElement=\"Participant_A\" isHorizontal=\"false\">\n        <dc:Bounds x=\"64\" y=\"278\" width=\"237\" height=\"823\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_B_di\" bpmnElement=\"Participant_B\" isHorizontal=\"false\">\n        <dc:Bounds x=\"415\" y=\"222\" width=\"185\" height=\"600\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_F_di\" bpmnElement=\"StartEvent_F\">\n        <dc:Bounds x=\"448\" y=\"300\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"459\" y=\"313\" width=\"90\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_D\" bpmnElement=\"Task_A\">\n        <dc:Bounds x=\"124\" y=\"360\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_1\" bpmnElement=\"MessageFlow_1\" sourceElement=\"_BPMNShape_Task_4\" targetElement=\"Participant_B_di\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"224\" y=\"580\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"415\" y=\"580\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"320\" y=\"565\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_2\" bpmnElement=\"MessageFlow_2\" sourceElement=\"Participant_B_di\" targetElement=\"Participant_A_di\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"415\" y=\"506\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"301\" y=\"506\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"356\" y=\"487\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_4\" bpmnElement=\"MessageFlow_4\" sourceElement=\"_BPMNShape_Task_D\" targetElement=\"StartEvent_F_di\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"224\" y=\"390\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"387\" y=\"390\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"387\" y=\"318\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"448\" y=\"318\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"321\" y=\"361\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EndEvent_C_di\" bpmnElement=\"EndEvent_C\">\n        <dc:Bounds x=\"178\" y=\"653\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"114\" y=\"666\" width=\"90\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_5\" bpmnElement=\"MessageFlow_5\" sourceElement=\"EndEvent_C_di\" targetElement=\"Participant_B_di\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"214\" y=\"671\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"415\" y=\"671\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"314\" y=\"646\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_4\" bpmnElement=\"Task_B\">\n        <dc:Bounds x=\"124\" y=\"516\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_D_di\" bpmnElement=\"Task_D\">\n        <dc:Bounds x=\"124\" y=\"723\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_6_di\" bpmnElement=\"MessageFlow_6\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"415\" y=\"773\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"224\" y=\"773\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"289\" y=\"783\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"SubProcess_E_di\" bpmnElement=\"SubProcess_E\" isExpanded=\"true\">\n        <dc:Bounds x=\"135\" y=\"855\" width=\"131\" height=\"184\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_G_di\" bpmnElement=\"SubProcess_G\" isExpanded=\"true\">\n        <dc:Bounds x=\"458\" y=\"566\" width=\"122\" height=\"212\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_7_di\" bpmnElement=\"MessageFlow_7\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"458\" y=\"752\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"224\" y=\"752\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"288\" y=\"728\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"MessageFlow_3_di\" bpmnElement=\"MessageFlow_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"266\" y=\"902\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"362\" y=\"902\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"362\" y=\"708\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"458\" y=\"708\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"330\" y=\"824\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/layout/LayoutSequenceFlowSpec.boundaryEvents.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.16.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_Left\" />\n    <bpmn:subProcess id=\"SubProcess\" />\n    <bpmn:task id=\"Task_Right\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_TopLeft\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_TopCenter\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_BottomRight\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_BottomCenter\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_BottomLeft\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_TopRight\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_RightCenter\" attachedToRef=\"SubProcess\" />\n    <bpmn:task id=\"Task_Bottom\" />\n    <bpmn:task id=\"Task_Top\" />\n    <bpmn:task id=\"Task_CornerBoundary\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_BottomRightCorner\" attachedToRef=\"Task_CornerBoundary\" />\n    <bpmn:task id=\"Task_CornerTarget\" />\n    <bpmn:task id=\"Task_CornerBoundaryH\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_TopRightCorner\" attachedToRef=\"Task_CornerBoundaryH\" />\n    <bpmn:task id=\"Task_CornerTargetH\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_0b6k3xo_di\" bpmnElement=\"Task_Left\">\n        <dc:Bounds x=\"0\" y=\"350\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_12qmapm_di\" bpmnElement=\"SubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"300\" y=\"300\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_174r9fd_di\" bpmnElement=\"Task_Right\">\n        <dc:Bounds x=\"850\" y=\"350\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_0s0nl1k_di\" bpmnElement=\"BoundaryEvent_TopLeft\">\n        <dc:Bounds x=\"282\" y=\"320\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_TopCenter_di\" bpmnElement=\"BoundaryEvent_TopCenter\">\n        <dc:Bounds x=\"432\" y=\"282\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_0nomac7_di\" bpmnElement=\"BoundaryEvent_BottomRight\">\n        <dc:Bounds x=\"632\" y=\"450\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_BottomCenter_di\" bpmnElement=\"BoundaryEvent_BottomCenter\">\n        <dc:Bounds x=\"432\" y=\"482\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1spolhy_di\" bpmnElement=\"BoundaryEvent_BottomLeft\">\n        <dc:Bounds x=\"282\" y=\"482\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_13iwzlu_di\" bpmnElement=\"BoundaryEvent_TopRight\">\n        <dc:Bounds x=\"632\" y=\"282\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_RightCenter_di\" bpmnElement=\"BoundaryEvent_RightCenter\">\n        <dc:Bounds x=\"632\" y=\"372\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0ygk7bh_di\" bpmnElement=\"Task_Bottom\">\n        <dc:Bounds x=\"400\" y=\"650\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1bc634w_di\" bpmnElement=\"Task_Top\">\n        <dc:Bounds x=\"400\" y=\"0\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_CornerBoundary_di\" bpmnElement=\"Task_CornerBoundary\">\n        <dc:Bounds x=\"800\" y=\"300\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_BottomRightCorner_di\" bpmnElement=\"BoundaryEvent_BottomRightCorner\">\n        <dc:Bounds x=\"891\" y=\"371\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_CornerTarget_di\" bpmnElement=\"Task_CornerTarget\">\n        <dc:Bounds x=\"859\" y=\"480\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_CornerBoundaryH_di\" bpmnElement=\"Task_CornerBoundaryH\">\n        <dc:Bounds x=\"800\" y=\"100\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_TopRightCorner_di\" bpmnElement=\"BoundaryEvent_TopRightCorner\">\n        <dc:Bounds x=\"891\" y=\"91\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_CornerTargetH_di\" bpmnElement=\"Task_CornerTargetH\">\n        <dc:Bounds x=\"1000\" y=\"69\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/layout/LayoutSequenceFlowSpec.boundaryEventsLoops.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.1.1\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_TopLeft\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_BottomRight\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_BottomLeft\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_TopRight\" attachedToRef=\"SubProcess\" />\n    <bpmn:subProcess id=\"SubProcess_2\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_CenterRight\" attachedToRef=\"SubProcess_2\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_BottomCenter\" attachedToRef=\"SubProcess_2\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_TopCenter\" attachedToRef=\"SubProcess_2\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_CenterLeft\" attachedToRef=\"SubProcess_2\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_12qmapm_di\" bpmnElement=\"SubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"200\" y=\"200\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_0s0nl1k_di\" bpmnElement=\"BoundaryEvent_TopLeft\">\n        <dc:Bounds x=\"182\" y=\"220\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_0nomac7_di\" bpmnElement=\"BoundaryEvent_BottomRight\">\n        <dc:Bounds x=\"532\" y=\"350\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1spolhy_di\" bpmnElement=\"BoundaryEvent_BottomLeft\">\n        <dc:Bounds x=\"182\" y=\"382\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_13iwzlu_di\" bpmnElement=\"BoundaryEvent_TopRight\">\n        <dc:Bounds x=\"532\" y=\"182\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_2_di\" bpmnElement=\"SubProcess_2\" isExpanded=\"true\">\n        <dc:Bounds x=\"200\" y=\"460\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_CenterRight_di\" bpmnElement=\"BoundaryEvent_CenterRight\">\n        <dc:Bounds x=\"532\" y=\"542\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_BottomCenter_di\" bpmnElement=\"BoundaryEvent_BottomCenter\">\n        <dc:Bounds x=\"357\" y=\"642\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_TopCenter_di\" bpmnElement=\"BoundaryEvent_TopCenter\">\n        <dc:Bounds x=\"357\" y=\"442\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_CenterLeft_di\" bpmnElement=\"BoundaryEvent_CenterLeft\">\n        <dc:Bounds x=\"182\" y=\"542\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/layout/LayoutSequenceFlowSpec.flowElements.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.3.0-alpha.3\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\" />\n    <bpmn:exclusiveGateway id=\"ExclusiveGateway_1\" />\n    <bpmn:task id=\"Task_1\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_3</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_4</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:intermediateThrowEvent id=\"IntermediateThrowEvent_1\" />\n    <bpmn:serviceTask id=\"ServiceTask_1\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n    </bpmn:serviceTask>\n    <bpmn:parallelGateway id=\"ParallelGateway_1\" />\n    <bpmn:endEvent id=\"EndEvent_1\" />\n    <bpmn:businessRuleTask id=\"BusinessRuleTask_1\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"Task_1\" targetRef=\"ServiceTask_1\" />\n    <bpmn:task id=\"Task_2\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"Task_1\" targetRef=\"Task_2\" />\n    <bpmn:task id=\"Task_3\">\n      <bpmn:incoming>SequenceFlow_3</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_3\" sourceRef=\"Task_1\" targetRef=\"Task_3\" />\n    <bpmn:task id=\"Task_4\">\n      <bpmn:incoming>SequenceFlow_4</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_4\" sourceRef=\"Task_1\" targetRef=\"Task_4\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"StartEvent_1_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"152\" y=\"284\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"125\" y=\"320\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_1_di\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"653\" y=\"277\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"633\" y=\"327\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"282\" y=\"180\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_1_di\" bpmnElement=\"IntermediateThrowEvent_1\">\n        <dc:Bounds x=\"478\" y=\"284\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"451\" y=\"320\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ServiceTask_1_di\" bpmnElement=\"ServiceTask_1\">\n        <dc:Bounds x=\"628\" y=\"77\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ParallelGateway_1_di\" bpmnElement=\"ParallelGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"980\" y=\"277\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"960\" y=\"327\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_1_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"478\" y=\"99\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"451\" y=\"135\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BusinessRuleTask_1_di\" bpmnElement=\"BusinessRuleTask_1\">\n        <dc:Bounds x=\"790\" y=\"180\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"382\" y=\"241\" />\n        <di:waypoint x=\"559\" y=\"241\" />\n        <di:waypoint x=\"559\" y=\"138\" />\n        <di:waypoint x=\"628\" y=\"138\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"460\" y=\"158.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_05onbv9_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"120\" y=\"430\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1gkn3z9_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint x=\"332\" y=\"260\" />\n        <di:waypoint x=\"332\" y=\"470\" />\n        <di:waypoint x=\"220\" y=\"470\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_03oj6hc_di\" bpmnElement=\"Task_3\">\n        <dc:Bounds x=\"120\" y=\"77\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1w44kjx_di\" bpmnElement=\"SequenceFlow_3\">\n        <di:waypoint x=\"282\" y=\"220\" />\n        <di:waypoint x=\"250\" y=\"220\" />\n        <di:waypoint x=\"250\" y=\"117\" />\n        <di:waypoint x=\"220\" y=\"117\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_1ftm468_di\" bpmnElement=\"Task_4\">\n        <dc:Bounds x=\"446\" y=\"-70\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_12vhayc_di\" bpmnElement=\"SequenceFlow_4\">\n        <di:waypoint x=\"332\" y=\"180\" />\n        <di:waypoint x=\"332\" y=\"-30\" />\n        <di:waypoint x=\"446\" y=\"-30\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/layout/LayoutSequenceFlowSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  connect,\n  element,\n  move,\n  reconnectEnd\n} from './Helper';\n\nimport { getMid } from 'diagram-js/lib/layout/LayoutUtil';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - layout', function() {\n\n  describe('boundary events', function() {\n\n    describe('loops', function() {\n\n      var diagramXML = require('./LayoutSequenceFlowSpec.boundaryEventsLoops.bpmn');\n\n      var testModules = [ coreModule, modelingModule ];\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      describe('in the corner', function() {\n\n        it('attached top right', function() {\n\n          // when\n          var connection = connect('BoundaryEvent_TopRight', 'SubProcess');\n\n          // then\n          expect(connection).to.have.waypoints([\n            { original: { x: 550, y: 200 }, x: 550, y: 182 },\n            { x: 550, y: 162 },\n            { x: 375, y: 162 },\n            { original: { x: 375, y: 300 }, x: 375, y: 200 }\n          ]);\n        });\n\n\n        it('attached bottom right', function() {\n\n          // when\n          var connection = connect('BoundaryEvent_BottomRight', 'SubProcess');\n\n          // then\n          expect(connection).to.have.waypoints([\n            { original: { x: 550, y: 368 } , x: 568, y: 368 },\n            { x: 588, y: 368 },\n            { x: 588, y: 300 },\n            { original: { x: 375, y: 300 } , x: 550, y: 300 }\n          ]);\n        });\n\n\n        it('attached bottom left', function() {\n\n          // when\n          var connection = connect('BoundaryEvent_BottomLeft', 'SubProcess');\n\n          // then\n          expect(connection).to.have.waypoints([\n            { original: { x: 200, y: 500 }, x: 200, y: 418 },\n            { x: 200, y: 438 },\n            { x: 375, y: 438 },\n            { original: { x: 375, y: 300 }, x: 375, y: 400 }\n          ]);\n        });\n\n\n        it('attached top left', function() {\n\n          // when\n          var connection = connect('BoundaryEvent_TopLeft', 'SubProcess');\n\n          // then\n          expect(connection).to.have.waypoints([\n            { original: { x: 200, y: 238 }, x: 182, y: 238 },\n            { x: 162, y: 238 },\n            { x: 162, y: 300 },\n            { original: { x: 375, y: 300 }, x: 200, y: 300 }\n          ]);\n        });\n      });\n\n\n      describe('on the side center', function() {\n\n        var host = 'SubProcess_2';\n\n\n        it('attached top center', function() {\n\n          // when\n          var connection = connect('BoundaryEvent_TopCenter', host);\n\n          // then\n          expect(connection).to.have.waypoints([\n            { original: { x: 375, y: 460 }, x: 375, y: 442 },\n            { x:375, y: 422 },\n            { x:180, y: 422 },\n            { x:180, y: 560 },\n            { original:{ x: 375, y: 560 }, x: 200, y: 560 }\n          ]);\n        });\n\n\n        it('attached center right', function() {\n\n          // when\n          var connection = connect('BoundaryEvent_CenterRight', host);\n\n          // then\n          expect(connection).to.have.waypoints([\n            { original: { x: 550, y: 560 }, x: 568, y: 560 },\n            { x: 588, y: 560 },\n            { x: 588, y: 680 },\n            { x: 375, y: 680 },\n            { original: { x: 375, y: 560 }, x: 375, y: 660 }\n          ]);\n        });\n\n\n        it('attached bottom center', function() {\n\n          // when\n          var connection = connect('BoundaryEvent_BottomCenter', host);\n\n          // then\n          expect(connection).to.have.waypoints([\n            { original: { x: 375, y: 660 }, x: 375, y: 678 },\n            { x: 375, y: 698 },\n            { x: 180, y: 698 },\n            { x: 180, y: 560 },\n            { original: { x: 375, y: 560 }, x: 200, y: 560 }\n          ]);\n        });\n\n\n        it('attached center left', function() {\n\n          // when\n          var connection = connect('BoundaryEvent_CenterLeft', host);\n\n          // then\n          expect(connection).to.have.waypoints([\n            { original: { x: 200, y: 560 }, x: 182, y: 560 },\n            { x: 162, y: 560 },\n            { x: 162, y: 680 },\n            { x: 375, y: 680 },\n            { original: { x: 375, y: 560 }, x: 375, y: 660 }\n          ]);\n        });\n      });\n    });\n\n\n    describe('non-loops', function() {\n\n      var diagramXML = require('./LayoutSequenceFlowSpec.boundaryEvents.bpmn');\n\n      var testModules = [ coreModule, modelingModule ];\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      it('attached top right, orientation top', function() {\n\n        // when\n        var connection = connect('BoundaryEvent_TopRight', 'Task_Top');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { original: { x: 650, y: 300 }, x: 650, y: 282 },\n          { x: 650, y: 40 },\n          { original: { x: 450, y: 40 }, x: 500, y: 40 }\n        ]);\n      });\n\n\n      it('attached top right, orientation right', function() {\n\n        // when\n        var connection = connect('BoundaryEvent_TopRight', 'Task_Right');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { original: { x: 650, y: 300 }, x: 668, y: 300 },\n          { x: 900, y: 300 },\n          { original: { x: 900, y: 390 }, x: 900, y: 350 }\n        ]);\n      });\n\n\n      it('attached top right, orientation bottom', function() {\n\n        // when\n        var connection = connect('BoundaryEvent_TopRight', 'Task_Bottom');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { original: { x: 650, y: 300 }, x: 650, y: 282 },\n          { x: 650, y: 262 },\n          { x: 450, y: 262 },\n          { original: { x: 450, y: 690 }, x: 450, y: 650 }\n        ]);\n      });\n\n\n      it('attached top right, orientation left', function() {\n\n        // when\n        var connection = connect('BoundaryEvent_TopRight', 'Task_Left');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { original: { x: 650, y: 300 }, x: 650, y: 282 },\n          { x: 650, y: 262 },\n          { x: 50, y: 262 },\n          { original: { x: 50, y: 390 }, x: 50, y: 350 }\n        ]);\n      });\n\n\n      it('attached bottom center, orientation bottom', function() {\n\n        // when\n        var connection = connect('BoundaryEvent_BottomCenter', 'Task_Bottom');\n\n        expect(connection).to.have.waypoints([\n          { x: 450, y: 518 },\n          { x: 450, y: 650 }\n        ]);\n      });\n\n\n      it('attached top center, orientation top', function() {\n\n        // when\n        var connection = connect('BoundaryEvent_TopCenter', 'Task_Top');\n\n        expect(connection).to.have.waypoints([\n          { x: 450, y: 282 },\n          { x: 450, y: 80 }\n        ]);\n      });\n\n\n      it('attached right center, orientation right', function() {\n\n        // when\n        var connection = connect('BoundaryEvent_RightCenter', 'Task_Right');\n\n        expect(connection).to.have.waypoints([\n          { x: 668, y: 390 },\n          { x: 850, y: 390 }\n        ]);\n      });\n\n\n      it('attached right center, orientation left', function() {\n\n        // when\n        var connection = connect('BoundaryEvent_RightCenter', 'Task_Left');\n\n        expect(connection).to.have.waypoints([\n          { x: 668, y: 390 },\n          { x: 688, y: 390 },\n          { x: 688, y: 410 },\n          { x: 536, y: 410 },\n          { x: 536, y: 390 },\n          { x: 100, y: 390 }\n        ]);\n      });\n\n\n      it('should layout straight for axis-aligned corner boundary event', inject(\n        function(elementRegistry, modeling) {\n\n          // given\n          // BoundaryEvent_BottomRightCorner is on the bottom-right corner of\n          // Task_CornerBoundary (mid x=909, y=389 — outside the contracted task\n          // bounds right=890, bottom=370 — giving 'bottom-right' orientation).\n          // Task_CornerTarget center x=909 matches exactly, so getOrientation\n          // returns strict 'bottom' with no horizontal component, triggering the\n          // early return in getBoundaryEventTargetLayout → layout 'b:v'.\n          var boundaryEvent = elementRegistry.get('BoundaryEvent_BottomRightCorner'),\n              targetTask = elementRegistry.get('Task_CornerTarget');\n\n          // when\n          var connection = modeling.connect(boundaryEvent, targetTask);\n\n          // then - straight vertical line, no extra waypoints\n          expect(connection).to.have.waypoints([\n            { x: 909, y: 407 },\n            { x: 909, y: 480 }\n          ]);\n        }\n      ));\n\n\n      it('should layout straight for horizontally axis-aligned corner boundary event', inject(\n        function(elementRegistry, modeling) {\n\n          // given\n          // BoundaryEvent_TopRightCorner is on the top-right corner of\n          // Task_CornerBoundaryH (mid x=909, y=109 — outside the contracted task\n          // bounds right=890, top=110 — giving 'top-right' orientation).\n          // Task_CornerTargetH center y=109 matches exactly, so getOrientation\n          // returns strict 'right' with no vertical component, triggering the\n          // early return in getBoundaryEventTargetLayout → layout 'r:h'.\n          var boundaryEvent = elementRegistry.get('BoundaryEvent_TopRightCorner'),\n              targetTask = elementRegistry.get('Task_CornerTargetH');\n\n          // when\n          var connection = modeling.connect(boundaryEvent, targetTask);\n\n          // then - straight horizontal line, no extra waypoints\n          expect(connection).to.have.waypoints([\n            { x: 927, y: 109 },\n            { x: 1000, y: 109 }\n          ]);\n        }\n      ));\n    });\n\n  });\n\n\n  describe('vertical boundary events', function() {\n\n    describe('loops', function() {\n\n      var diagramXML = require('./LayoutSequenceFlowSpec.vertical.boundaryEventsLoops.bpmn');\n\n      var testModules = [ coreModule, modelingModule ];\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      describe('in the corner', function() {\n\n        it('attached top right', function() {\n\n          // when\n          var connection = connect('BoundaryEvent_TopRight', 'SubProcess');\n\n          // then\n          expect(connection).to.have.waypoints([\n            { x: 628, y: 170 },\n            { x: 648, y: 170 },\n            { x: 648, y: 270 },\n            { x: 610, y: 270 }\n          ]);\n        });\n\n\n        it('attached bottom right', function() {\n\n          // when\n          var connection = connect('BoundaryEvent_BottomRight', 'SubProcess');\n\n          // then\n          expect(connection).to.have.waypoints([\n            { x: 628, y: 338 },\n            { x: 648, y: 338 },\n            { x: 648, y: 270 },\n            { x: 610, y: 270 }\n          ]);\n        });\n\n\n        it('attached bottom left', function() {\n\n          // when\n          var connection = connect('BoundaryEvent_BottomLeft', 'SubProcess');\n\n          // then\n          expect(connection).to.have.waypoints([\n            { x: 242, y: 370 },\n            { x: 222, y: 370 },\n            { x: 222, y: 270 },\n            { x: 260, y: 270 }\n          ]);\n        });\n\n\n        it('attached top left', function() {\n\n          // when\n          var connection = connect('BoundaryEvent_TopLeft', 'SubProcess');\n\n          // then\n          expect(connection).to.have.waypoints([\n            { x: 242, y: 208 },\n            { x: 222, y: 208 },\n            { x: 222, y: 270 },\n            { x: 260, y: 270 }\n          ]);\n        });\n      });\n\n\n      describe('on the side center', function() {\n\n        var host = 'SubProcess_2';\n\n\n        it('attached top center', function() {\n\n          // when\n          var connection = connect('BoundaryEvent_TopCenter', host);\n\n          // then\n          expect(connection).to.have.waypoints([\n            { x: 435, y: 412 },\n            { x: 435, y: 392 },\n            { x: 630, y: 392 },\n            { x: 630, y: 530 },\n            { x: 610, y: 530 }\n          ]);\n        });\n\n\n        it('attached center right', function() {\n\n          // when\n          var connection = connect('BoundaryEvent_CenterRight', host);\n\n          // then\n          expect(connection).to.have.waypoints([\n            { x: 628, y: 530 },\n            { x: 648, y: 530 },\n            { x: 648, y: 410 },\n            { x: 435, y: 410 },\n            { x: 435, y: 430 }\n          ]);\n        });\n\n\n        it('attached bottom center', function() {\n\n          // when\n          var connection = connect('BoundaryEvent_BottomCenter', host);\n\n          // then\n          expect(connection).to.have.waypoints([\n            { x: 435, y: 648 },\n            { x: 435, y: 668 },\n            { x: 630, y: 668 },\n            { x: 630, y: 530 },\n            { x: 610, y: 530 }\n          ]);\n        });\n\n\n        it('attached center left', function() {\n\n          // when\n          var connection = connect('BoundaryEvent_CenterLeft', host);\n\n          // then\n          expect(connection).to.have.waypoints([\n            { x: 242, y: 530 },\n            { x: 222, y: 530 },\n            { x: 222, y: 410 },\n            { x: 435, y: 410 },\n            { x: 435, y: 430 }\n          ]);\n        });\n      });\n    });\n\n\n    describe('non-loops', function() {\n\n      var diagramXML = require('./LayoutSequenceFlowSpec.vertical.boundaryEvents.bpmn');\n\n      var testModules = [ coreModule, modelingModule ];\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      it('attached bottom left, orientation left', function() {\n\n        // when\n        var connection = connect('BoundaryEvent_BottomLeft', 'Task_Left');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: 502, y: 740 },\n          { x: 260, y: 740 },\n          { x: 260, y: 580 }\n        ]);\n      });\n\n\n      it('attached bottom left, orientation bottom', function() {\n\n        // when\n        var connection = connect('BoundaryEvent_BottomLeft', 'Task_Bottom');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: 520, y: 758 },\n          { x: 520, y: 990 },\n          { x: 560, y: 990 }\n        ]);\n      });\n\n\n      it('attached bottom left, orientation right', function() {\n\n        // when\n        var connection = connect('BoundaryEvent_BottomLeft', 'Task_Right');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: 502, y: 740 },\n          { x: 482, y: 740 },\n          { x: 482, y: 540 },\n          { x: 860, y: 540 }\n        ]);\n      });\n\n\n      it('attached bottom left, orientation top', function() {\n\n        // when\n        var connection = connect('BoundaryEvent_BottomLeft', 'Task_Top');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: 502, y: 740 },\n          { x: 482, y: 740 },\n          { x: 482, y: 140 },\n          { x: 560, y: 140 }\n        ]);\n      });\n\n\n      it('attached right center, orientation right', function() {\n\n        // when\n        var connection = connect('BoundaryEvent_RightCenter', 'Task_Right');\n\n        expect(connection).to.have.waypoints([\n          { x: 738, y: 540 },\n          { x: 860, y: 540 }\n        ]);\n      });\n\n\n      it('attached left center, orientation left', function() {\n\n        // when\n        var connection = connect('BoundaryEvent_LeftCenter', 'Task_Left');\n\n        expect(connection).to.have.waypoints([\n          { x: 502, y: 540 },\n          { x: 310, y: 540 }\n        ]);\n      });\n\n\n      it('attached bottom center, orientation bottom', function() {\n\n        // when\n        var connection = connect('BoundaryEvent_BottomCenter', 'Task_Bottom');\n\n        expect(connection).to.have.waypoints([\n          { x: 610, y: 758 },\n          { x: 610, y: 950 }\n        ]);\n      });\n\n\n      it('attached bottom center, orientation top', function() {\n\n        // when\n        var connection = connect('BoundaryEvent_BottomCenter', 'Task_Top');\n\n        expect(connection).to.have.waypoints([\n          { x: 610, y: 758 },\n          { x: 610, y: 778 },\n          { x: 630, y: 778 },\n          { x: 630, y: 624 },\n          { x: 610, y: 624 },\n          { x: 610, y: 180 }\n        ]);\n      });\n\n    });\n\n  });\n\n\n  describe('flow elements', function() {\n\n    var diagramXML = require('./LayoutSequenceFlowSpec.flowElements.bpmn');\n\n    var testModules = [ coreModule, modelingModule ];\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    describe('loops', function() {\n\n      it('should layout loop', function() {\n\n        // when\n        var connection = connect('Task_1', 'Task_1');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: 332, y: 260 },\n          { x: 332, y: 280 },\n          { x: 262, y: 280 },\n          { x: 262, y: 220 },\n          { x: 282, y: 220 }\n        ]);\n      });\n\n\n      it('should NOT relayout loop', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n            task = elementRegistry.get('Task_1');\n\n        // when\n        reconnectEnd(sequenceFlow, task, getMid(task));\n\n        // then\n        expect(sequenceFlow).to.have.waypoints([\n          { x: 382, y: 241 },\n          { x: 559, y: 241 },\n          { x: 559, y: 220 },\n          { x: 382, y: 220 }\n        ]);\n      }));\n\n\n      it('should relayout loop (b:l)', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_2'),\n            task = elementRegistry.get('Task_1');\n\n        // when\n        reconnectEnd(sequenceFlow, task, getMid(task));\n\n        // then\n        expect(sequenceFlow).to.have.waypoints([\n          { x: 332, y: 260 },\n          { x: 332, y: 280 },\n          { x: 262, y: 280 },\n          { x: 262, y: 220 },\n          { x: 282, y: 220 }\n        ]);\n      }));\n\n\n      it('should relayout loop (l:t)', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_3'),\n            task = elementRegistry.get('Task_1');\n\n        // when\n        reconnectEnd(sequenceFlow, task, getMid(task));\n\n        // then\n        expect(sequenceFlow).to.have.waypoints([\n          { x: 282, y: 220 },\n          { x: 262, y: 220 },\n          { x: 262, y: 160 },\n          { x: 332, y: 160 },\n          { x: 332, y: 180 }\n        ]);\n      }));\n\n\n      it('should relayout loop (t:r)', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_4'),\n            task = elementRegistry.get('Task_1');\n\n        // when\n        reconnectEnd(sequenceFlow, task, getMid(task));\n\n        // then\n        expect(sequenceFlow).to.have.waypoints([\n          { x: 332, y: 180 },\n          { x: 332, y: 160 },\n          { x: 402, y: 160 },\n          { x: 402, y: 220 },\n          { x: 382, y: 220 }\n        ]);\n      }));\n\n    });\n\n\n    describe('gateway layout', function() {\n\n      it('should layout v:h after Gateway', inject(function() {\n\n        // when\n        var connection = connect('ExclusiveGateway_1', 'BusinessRuleTask_1');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { original: { x: 678, y: 302 }, x: 678, y: 277 },\n          { x: 678, y: 220 },\n          { original: { x: 840, y: 220 }, x: 790, y: 220 }\n        ]);\n      }));\n\n\n      it('should layout h:v before Gateway', inject(function() {\n\n        // when\n        var connection = connect('BusinessRuleTask_1', 'ParallelGateway_1');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { original: { x: 840, y: 220 }, x: 890, y: 220 },\n          { x: 1005, y: 220 },\n          { original: { x: 1005, y: 302 }, x: 1005, y: 277 }\n        ]);\n      }));\n\n    });\n\n\n    describe('other elements layout', function() {\n\n      it('should layout h:h after StartEvent', inject(function() {\n\n        // when\n        var connection = connect('StartEvent_1', 'Task_1');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { original: { x: 170, y: 302 }, x: 188, y: 302 },\n          { x: 235, y: 302 },\n          { x: 235, y: 220 },\n          { original: { x: 332, y: 220 }, x: 282, y: 220 }\n        ]);\n      }));\n\n\n      it('should layout h:h after Task', inject(function() {\n\n        // when\n        var connection = connect('ServiceTask_1', 'BusinessRuleTask_1');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { original: { x: 678, y: 117 }, x: 728, y: 117 },\n          { x: 759, y: 117 },\n          { x: 759, y: 220 },\n          { original: { x: 840, y: 220 }, x: 790, y: 220 }\n        ]);\n      }));\n\n\n      it('should layout h:h after IntermediateEvent', inject(function() {\n\n        // when\n        var connection = connect('IntermediateThrowEvent_1', 'ServiceTask_1');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { original: { x: 496, y: 302 }, x: 514, y: 302 },\n          { x: 571, y: 302 },\n          { x: 571, y: 117 },\n          { original: { x: 678, y: 117 }, x: 628, y: 117 }\n        ]);\n      }));\n\n\n      it('should layout h:h after IntermediateEvent (right to left)', inject(function() {\n\n        // when\n        var connection = connect('IntermediateThrowEvent_1', 'Task_1');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { original: { x: 496, y: 302 }, x: 478, y: 302 },\n          { x: 430, y: 302 },\n          { x: 430, y: 220 },\n          { original: { x: 332, y: 220 }, x: 382, y: 220 }\n        ]);\n      }));\n\n    });\n\n\n    describe('relayout', function() {\n\n      it('should repair after reconnect end', inject(function() {\n\n        // given\n        var newDocking = { x: 660, y: 300 };\n        var connection = element('SequenceFlow_1');\n\n        // when\n        reconnectEnd(connection, 'ExclusiveGateway_1', newDocking);\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: 382, y: 241 },\n          { x: 559, y: 241 },\n          { x: 559, y: 300 },\n          { x: 655, y: 300 }\n        ]);\n      }));\n\n\n      it('should repair after target move', inject(function() {\n\n        // given\n        var delta = { x: -30, y: 20 };\n        var connection = element('SequenceFlow_1');\n\n        // when\n        move('ServiceTask_1', delta);\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: 382, y: 241 },\n          { x: 559, y: 241 },\n          { x: 559, y: 158 },\n          { x: 598, y: 158 }\n        ]);\n      }));\n\n\n      it('should repair after source move', inject(function() {\n\n        // given\n        var delta = { x: -30, y: 20 };\n        var connection = element('SequenceFlow_1');\n\n        // when\n        move('Task_1', delta);\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: 352, y: 261 },\n          { x: 559, y: 261 },\n          { x: 559, y: 138 },\n          { x: 628, y: 138 }\n        ]);\n      }));\n\n    });\n\n  });\n\n\n  describe('vertical flow elements', function() {\n\n    var diagramXML = require('./LayoutSequenceFlowSpec.vertical.flowElements.bpmn');\n\n    var testModules = [ coreModule, modelingModule ];\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    describe('loops', function() {\n\n      it('should layout loop', function() {\n\n        // when\n        var connection = connect('Task_1', 'Task_1');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: 510, y: 382 },\n          { x: 510, y: 402 },\n          { x: 580, y: 402 },\n          { x: 580, y: 342 },\n          { x: 560, y: 342 }\n        ]);\n      });\n\n\n      it('should NOT relayout loop', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n            task = elementRegistry.get('Task_1');\n\n        // when\n        reconnectEnd(sequenceFlow, task, getMid(task));\n\n        // then\n        expect(sequenceFlow).to.have.waypoints([\n          { x: 531, y: 382 },\n          { x: 531, y: 569 },\n          { x: 510, y: 569 },\n          { x: 510, y: 382 }\n        ]);\n      }));\n\n\n      it('should relayout loop (r:t)', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_2'),\n            task = elementRegistry.get('Task_1');\n\n        // when\n        reconnectEnd(sequenceFlow, task, getMid(task));\n\n        // then\n        expect(sequenceFlow).to.have.waypoints([\n          { x: 560, y: 342 },\n          { x: 580, y: 342 },\n          { x: 580, y: 282 },\n          { x: 510, y: 282 },\n          { x: 510, y: 302 }\n        ]);\n      }));\n\n\n      it('should relayout loop (t:l)', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_3'),\n            task = elementRegistry.get('Task_1');\n\n        // when\n        reconnectEnd(sequenceFlow, task, getMid(task));\n\n        // then\n        expect(sequenceFlow).to.have.waypoints([\n          { x: 510, y: 302 },\n          { x: 510, y: 282 },\n          { x: 440, y: 282 },\n          { x: 440, y: 342 },\n          { x: 460, y: 342 }\n        ]);\n      }));\n\n\n      it('should relayout loop (l:b)', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_4'),\n            task = elementRegistry.get('Task_1');\n\n        // when\n        reconnectEnd(sequenceFlow, task, getMid(task));\n\n        // then\n        expect(sequenceFlow).to.have.waypoints([\n          { x: 460, y: 342 },\n          { x: 440, y: 342 },\n          { x: 440, y: 402 },\n          { x: 510, y: 402 },\n          { x: 510, y: 382 }\n        ]);\n      }));\n\n    });\n\n\n    describe('gateway layout', function() {\n\n      it('should layout h:v after Gateway', inject(function() {\n\n        // when\n        var connection = connect('ExclusiveGateway_1', 'BusinessRuleTask_1');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: 577, y: 688 },\n          { x: 530, y: 688 },\n          { x: 530, y: 810 }\n        ]);\n      }));\n\n\n      it('should layout v:h before Gateway', inject(function() {\n\n        // when\n        var connection = connect('BusinessRuleTask_1', 'ParallelGateway_1');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: 530, y: 890 },\n          { x: 530, y: 1015 },\n          { x: 577, y: 1015 }\n        ]);\n      }));\n\n    });\n\n\n    describe('other elements layout', function() {\n\n      it('should layout v:v after StartEvent', inject(function() {\n\n        // when\n        var connection = connect('StartEvent_1', 'Task_1');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: 602, y: 198 },\n          { x: 602, y: 250 },\n          { x: 510, y: 250 },\n          { x: 510, y: 302 }\n        ]);\n      }));\n\n\n      it('should layout v:v after Task', inject(function() {\n\n        // when\n        var connection = connect('ServiceTask_1', 'BusinessRuleTask_1');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: 407, y: 728 },\n          { x: 407, y: 769 },\n          { x: 530, y: 769 },\n          { x: 530, y: 810 }\n        ]);\n      }));\n\n\n      it('should layout v:v after IntermediateEvent', inject(function() {\n\n        // when\n        var connection = connect('IntermediateThrowEvent_1', 'ServiceTask_1');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: 602, y: 524 },\n          { x: 602, y: 586 },\n          { x: 407, y: 586 },\n          { x: 407, y: 648 }\n        ]);\n      }));\n\n\n      it('should layout v:v after IntermediateEvent (bottom to top)', inject(function() {\n\n        // when\n        var connection = connect('IntermediateThrowEvent_1', 'Task_1');\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: 602, y: 488 },\n          { x: 602, y: 435 },\n          { x: 510, y: 435 },\n          { x: 510, y: 382 }\n        ]);\n      }));\n\n    });\n\n\n    describe('relayout', function() {\n\n      it('should repair after reconnect end', inject(function() {\n\n        // given\n        var newDocking = { x: 660, y: 300 };\n        var connection = element('SequenceFlow_1');\n\n        // when\n        reconnectEnd(connection, 'ExclusiveGateway_1', newDocking);\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: 531, y: 382 },\n          { x: 531, y: 569 },\n          { x: 660, y: 569 },\n          { x: 660, y: 300 }\n        ]);\n      }));\n\n\n      it('should repair after target move', inject(function() {\n\n        // given\n        var delta = { x: 20, y: -30 };\n        var connection = element('SequenceFlow_1');\n\n        // when\n        move('ServiceTask_1', delta);\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: 531, y: 382 },\n          { x: 531, y: 569 },\n          { x: 448, y: 569 },\n          { x: 448, y: 618 }\n        ]);\n      }));\n\n\n      it('should repair after source move', inject(function() {\n\n        // given\n        var delta = { x: 20, y: -30 };\n        var connection = element('SequenceFlow_1');\n\n        // when\n        move('Task_1', delta);\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: 551, y: 352 },\n          { x: 551, y: 569 },\n          { x: 428, y: 569 },\n          { x: 428, y: 648 }\n        ]);\n      }));\n\n    });\n\n  });\n\n\n  describe('subProcess', function() {\n\n    var diagramXML = require('./LayoutSequenceFlowSpec.subProcess.bpmn');\n\n    var testModules = [ coreModule, modelingModule ];\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    it('should layout straight between subProcesses (top -> bottom)', function() {\n\n      // when\n      var connection = connect('SubProcess_Center', 'SubProcess_Bottom'),\n          source = connection.source,\n          target = connection.target;\n\n      var expectedX = getMid(target).x;\n\n      // then\n      expect(connection).to.have.waypoints([\n        { x: expectedX, y: source.y + source.height },\n        { x: expectedX, y: target.y }\n      ]);\n    });\n\n\n    it('should layout straight between subProcesses (bottom -> top)', function() {\n\n      // when\n      var connection = connect('SubProcess_Bottom', 'SubProcess_Center'),\n          source = connection.source,\n          target = connection.target;\n\n      var expectedX = getMid(target).x;\n\n      // then\n      expect(connection).to.have.waypoints([\n        { x: expectedX, y: source.y },\n        { x: expectedX, y: target.y + target.height }\n      ]);\n    });\n\n\n    it('should layout straight between subProcess and task next to it (subProcess -> task)',\n      function() {\n\n        // when\n        var connection = connect('SubProcess_Center', 'Task_Right'),\n            source = connection.source,\n            target = connection.target;\n\n        var expectedY = getMid(target).y;\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: source.x + source.width, y: expectedY },\n          { x: target.x, y: expectedY }\n        ]);\n      }\n    );\n\n\n    it('should layout straight between subProcess and task next to it (task -> subProcess)',\n      function() {\n\n        // when\n        var connection = connect('Task_Right', 'SubProcess_Center'),\n            source = connection.source,\n            target = connection.target;\n\n        var expectedY = getMid(source).y;\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: source.x, y: expectedY },\n          { x: target.x + target.width, y: expectedY }\n        ]);\n      }\n    );\n\n\n    it('should layout straight between subProcess and task above (subProcess -> task)', function() {\n\n      // when\n      var connection = connect('SubProcess_Center', 'Task_Top'),\n          source = connection.source,\n          target = connection.target;\n\n      var expectedX = getMid(target).x;\n\n      // then\n      expect(connection).to.have.waypoints([\n        { x: expectedX, y: source.y },\n        { x: expectedX, y: target.y + target.height }\n      ]);\n    });\n\n\n    it('should layout straight between subProcess and task above (task -> subProcess)', function() {\n\n      // when\n      var connection = connect('Task_Top', 'SubProcess_Center'),\n          source = connection.source,\n          target = connection.target;\n\n      var expectedX = getMid(source).x;\n\n      // then\n      expect(connection).to.have.waypoints([\n        { x: expectedX, y: source.y + source.height },\n        { x: expectedX, y: target.y }\n      ]);\n    });\n  });\n\n\n  describe('vertical subProcess', function() {\n\n    var diagramXML = require('./LayoutSequenceFlowSpec.vertical.subProcess.bpmn');\n\n    var testModules = [ coreModule, modelingModule ];\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    it('should layout straight between subProcesses (left -> right)', function() {\n\n      // when\n      var connection = connect('SubProcess_Center', 'SubProcess_Right'),\n          source = connection.source,\n          target = connection.target;\n\n      var expectedY = getMid(target).y;\n\n      // then\n      expect(connection).to.have.waypoints([\n        { x: source.x + source.width, y: expectedY },\n        { x: target.x, y: expectedY }\n      ]);\n    });\n\n\n    it('should layout straight between subProcesses (right -> left)', function() {\n\n      // when\n      var connection = connect('SubProcess_Right', 'SubProcess_Center'),\n          source = connection.source,\n          target = connection.target;\n\n      var expectedY = getMid(target).y;\n\n      // then\n      expect(connection).to.have.waypoints([\n        { x: source.x, y: expectedY },\n        { x: target.x + target.width, y: expectedY }\n      ]);\n    });\n\n\n    it('should layout straight between subProcess and task below (subProcess -> task)',\n      function() {\n\n        // when\n        var connection = connect('SubProcess_Center', 'Task_Bottom'),\n            source = connection.source,\n            target = connection.target;\n\n        var expectedX = getMid(target).x;\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: expectedX, y: source.y + source.height },\n          { x: expectedX, y: target.y }\n        ]);\n      }\n    );\n\n\n    it('should layout straight between subProcess and task below (task -> subProcess)',\n      function() {\n\n        // when\n        var connection = connect('Task_Bottom', 'SubProcess_Center'),\n            source = connection.source,\n            target = connection.target;\n\n        var expectedX = getMid(source).x;\n\n        // then\n        expect(connection).to.have.waypoints([\n          { x: expectedX, y: source.y },\n          { x: expectedX, y: target.y + target.height }\n        ]);\n      }\n    );\n\n\n    it('should layout straight between subProcess and task next to it (subProcess -> task)', function() {\n\n      // when\n      var connection = connect('SubProcess_Center', 'Task_Left'),\n          source = connection.source,\n          target = connection.target;\n\n      var expectedY = getMid(target).y;\n\n      // then\n      expect(connection).to.have.waypoints([\n        { x: source.x, y: expectedY },\n        { x: target.x + target.width, y: expectedY }\n      ]);\n    });\n\n\n    it('should layout straight between subProcess and task next to it (task -> subProcess)', function() {\n\n      // when\n      var connection = connect('Task_Left', 'SubProcess_Center'),\n          source = connection.source,\n          target = connection.target;\n\n      var expectedY = getMid(source).y;\n\n      // then\n      expect(connection).to.have.waypoints([\n        { x: source.x + source.width, y: expectedY },\n        { x: target.x, y: expectedY }\n      ]);\n    });\n  });\n});\n"
  },
  {
    "path": "test/spec/features/modeling/layout/LayoutSequenceFlowSpec.subProcess.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_00dfyhw\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.7.1\">\n  <bpmn:process id=\"Process_00i7uqd\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"SubProcess_Center\" />\n    <bpmn:subProcess id=\"SubProcess_Bottom\" />\n    <bpmn:task id=\"Task_Right\" />\n    <bpmn:task id=\"Task_Top\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_00i7uqd\">\n      <bpmndi:BPMNShape id=\"Activity_0r2w32m_di\" bpmnElement=\"SubProcess_Center\" isExpanded=\"true\">\n        <dc:Bounds x=\"270\" y=\"270\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0tbriov_di\" bpmnElement=\"SubProcess_Bottom\" isExpanded=\"true\">\n        <dc:Bounds x=\"160\" y=\"600\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0fm36cc_di\" bpmnElement=\"Task_Right\">\n        <dc:Bounds x=\"780\" y=\"270\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_16fbgsj_di\" bpmnElement=\"Task_Top\">\n        <dc:Bounds x=\"520\" y=\"110\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/layout/LayoutSequenceFlowSpec.vertical.boundaryEvents.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.20.0\">\n  <bpmn:collaboration id=\"Collaboration_1c6j3sk\">\n    <bpmn:participant id=\"Participant_0gpnzzr\" name=\"Vertical Container\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_Bottom\" name=\"Bottom\" />\n    <bpmn:task id=\"Task_Top\" name=\"Top\" />\n    <bpmn:subProcess id=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_BottomCenter\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_BottomLeft\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_TopRight\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_RightCenter\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_BottomRight1\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_LeftCenter\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_TopLeft1\" attachedToRef=\"SubProcess\" />\n    <bpmn:task id=\"Task_Right\" name=\"Right\" />\n    <bpmn:task id=\"Task_Left\" name=\"Left\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1c6j3sk\">\n      <bpmndi:BPMNShape id=\"Participant_0gpnzzr_di\" bpmnElement=\"Participant_0gpnzzr\" isHorizontal=\"false\">\n        <dc:Bounds x=\"190\" y=\"50\" width=\"790\" height=\"1000\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0ygk7bh_di\" bpmnElement=\"Task_Right\">\n        <dc:Bounds x=\"860\" y=\"500\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_174r9fd_di\" bpmnElement=\"Task_Bottom\">\n        <dc:Bounds x=\"560\" y=\"950\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0b6k3xo_di\" bpmnElement=\"Task_Top\">\n        <dc:Bounds x=\"560\" y=\"100\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1bc634w_di\" bpmnElement=\"Task_Left\">\n        <dc:Bounds x=\"210\" y=\"500\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_12qmapm_di\" bpmnElement=\"SubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"520\" y=\"390\" width=\"200\" height=\"350\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_0s0nl1k_di\" bpmnElement=\"BoundaryEvent_TopLeft1\">\n        <dc:Bounds x=\"540\" y=\"372\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_TopCenter_di\" bpmnElement=\"BoundaryEvent_LeftCenter\">\n        <dc:Bounds x=\"502\" y=\"522\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_0nomac7_di\" bpmnElement=\"BoundaryEvent_BottomRight1\">\n        <dc:Bounds x=\"670\" y=\"722\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_BottomCenter_di\" bpmnElement=\"BoundaryEvent_RightCenter\">\n        <dc:Bounds x=\"702\" y=\"522\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1spolhy_di\" bpmnElement=\"BoundaryEvent_TopRight\">\n        <dc:Bounds x=\"702\" y=\"372\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_13iwzlu_di\" bpmnElement=\"BoundaryEvent_BottomLeft\">\n        <dc:Bounds x=\"502\" y=\"722\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_RightCenter_di\" bpmnElement=\"BoundaryEvent_BottomCenter\">\n        <dc:Bounds x=\"592\" y=\"722\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/layout/LayoutSequenceFlowSpec.vertical.boundaryEventsLoops.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.20.0\">\n  <bpmn:collaboration id=\"Collaboration_0ffsons\">\n    <bpmn:participant id=\"Participant_1n4j215\" name=\"Vertical Container\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess\" name=\"SubProcess\" />\n    <bpmn:subProcess id=\"SubProcess_2\" name=\"SubProcess_2\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_TopLeft\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_BottomRight\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_BottomLeft\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_TopRight\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_CenterRight\" attachedToRef=\"SubProcess_2\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_BottomCenter\" attachedToRef=\"SubProcess_2\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_TopCenter\" attachedToRef=\"SubProcess_2\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_CenterLeft\" attachedToRef=\"SubProcess_2\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_0ffsons\">\n      <bpmndi:BPMNShape id=\"Participant_1n4j215_di\" bpmnElement=\"Participant_1n4j215\" isHorizontal=\"false\">\n        <dc:Bounds x=\"160\" y=\"80\" width=\"540\" height=\"630\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_12qmapm_di\" bpmnElement=\"SubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"260\" y=\"170\" width=\"350\" height=\"200\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_2_di\" bpmnElement=\"SubProcess_2\" isExpanded=\"true\">\n        <dc:Bounds x=\"260\" y=\"430\" width=\"350\" height=\"200\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_0s0nl1k_di\" bpmnElement=\"BoundaryEvent_TopLeft\">\n        <dc:Bounds x=\"242\" y=\"190\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_0nomac7_di\" bpmnElement=\"BoundaryEvent_BottomRight\">\n        <dc:Bounds x=\"592\" y=\"320\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1spolhy_di\" bpmnElement=\"BoundaryEvent_BottomLeft\">\n        <dc:Bounds x=\"242\" y=\"352\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_13iwzlu_di\" bpmnElement=\"BoundaryEvent_TopRight\">\n        <dc:Bounds x=\"592\" y=\"152\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_CenterRight_di\" bpmnElement=\"BoundaryEvent_CenterRight\">\n        <dc:Bounds x=\"592\" y=\"512\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_BottomCenter_di\" bpmnElement=\"BoundaryEvent_BottomCenter\">\n        <dc:Bounds x=\"417\" y=\"612\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_TopCenter_di\" bpmnElement=\"BoundaryEvent_TopCenter\">\n        <dc:Bounds x=\"417\" y=\"412\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_CenterLeft_di\" bpmnElement=\"BoundaryEvent_CenterLeft\">\n        <dc:Bounds x=\"242\" y=\"512\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling/layout/LayoutSequenceFlowSpec.vertical.flowElements.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.20.0\">\n  <bpmn:collaboration id=\"Collaboration_0sm9luj\">\n    <bpmn:participant id=\"Participant_0ntgbyn\" name=\"Vertical Container\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\" />\n    <bpmn:exclusiveGateway id=\"ExclusiveGateway_1\" />\n    <bpmn:task id=\"Task_1\" name=\"Task_1\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_3</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_4</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:intermediateThrowEvent id=\"IntermediateThrowEvent_1\" />\n    <bpmn:serviceTask id=\"ServiceTask_1\" name=\"ServiceTask_1\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n    </bpmn:serviceTask>\n    <bpmn:parallelGateway id=\"ParallelGateway_1\" />\n    <bpmn:endEvent id=\"EndEvent_1\" />\n    <bpmn:businessRuleTask id=\"BusinessRuleTask_1\" name=\"BusinessRuleTask_1\" />\n    <bpmn:task id=\"Task_2\" name=\"Task_2\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:task id=\"Task_3\" name=\"Task_3\">\n      <bpmn:incoming>SequenceFlow_3</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:task id=\"Task_4\" name=\"Task_4\">\n      <bpmn:incoming>SequenceFlow_4</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"Task_1\" targetRef=\"ServiceTask_1\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"Task_1\" targetRef=\"Task_2\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_3\" sourceRef=\"Task_1\" targetRef=\"Task_3\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_4\" sourceRef=\"Task_1\" targetRef=\"Task_4\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_0sm9luj\">\n      <bpmndi:BPMNShape id=\"Participant_0ntgbyn_di\" bpmnElement=\"Participant_0ntgbyn\" isHorizontal=\"false\">\n        <dc:Bounds x=\"190\" y=\"90\" width=\"640\" height=\"970\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"584\" y=\"162\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"320\" y=\"125\" width=\"20\" height=\"90\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_1_di\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"577\" y=\"663\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"327\" y=\"633\" width=\"20\" height=\"90\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"460\" y=\"302\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_1_di\" bpmnElement=\"IntermediateThrowEvent_1\">\n        <dc:Bounds x=\"584\" y=\"488\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"320\" y=\"451\" width=\"20\" height=\"90\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ServiceTask_1_di\" bpmnElement=\"ServiceTask_1\">\n        <dc:Bounds x=\"357\" y=\"648\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ParallelGateway_1_di\" bpmnElement=\"ParallelGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"577\" y=\"990\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"327\" y=\"960\" width=\"20\" height=\"90\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_1_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"389\" y=\"488\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"135\" y=\"451\" width=\"20\" height=\"90\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BusinessRuleTask_1_di\" bpmnElement=\"BusinessRuleTask_1\">\n        <dc:Bounds x=\"480\" y=\"810\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"710\" y=\"140\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_3_di\" bpmnElement=\"Task_3\">\n        <dc:Bounds x=\"357\" y=\"140\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_4_di\" bpmnElement=\"Task_4\">\n        <dc:Bounds x=\"210\" y=\"466\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"531\" y=\"382\" />\n        <di:waypoint x=\"531\" y=\"569\" />\n        <di:waypoint x=\"428\" y=\"569\" />\n        <di:waypoint x=\"428\" y=\"648\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"158.5\" y=\"460\" width=\"20\" height=\"90\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_2_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint x=\"560\" y=\"342\" />\n        <di:waypoint x=\"760\" y=\"342\" />\n        <di:waypoint x=\"760\" y=\"220\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_3_di\" bpmnElement=\"SequenceFlow_3\">\n        <di:waypoint x=\"510\" y=\"302\" />\n        <di:waypoint x=\"510\" y=\"260\" />\n        <di:waypoint x=\"407\" y=\"260\" />\n        <di:waypoint x=\"407\" y=\"220\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_4_di\" bpmnElement=\"SequenceFlow_4\">\n        <di:waypoint x=\"460\" y=\"342\" />\n        <di:waypoint x=\"260\" y=\"342\" />\n        <di:waypoint x=\"260\" y=\"466\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>"
  },
  {
    "path": "test/spec/features/modeling/layout/LayoutSequenceFlowSpec.vertical.subProcess.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_00dfyhw\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.20.0\">\n  <bpmn:collaboration id=\"Collaboration_0qdgort\">\n    <bpmn:participant id=\"Participant_0ufcvvc\" name=\"Vertical Container\" processRef=\"Process_00i7uqd\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_00i7uqd\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"SubProcess_Right\" name=\"Sub Process Right\" />\n    <bpmn:subProcess id=\"SubProcess_Center\" name=\"Sub Process Top\" />\n    <bpmn:task id=\"Task_Left\" name=\"Left\" />\n    <bpmn:task id=\"Task_Bottom\" name=\"Bottom\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_0qdgort\">\n      <bpmndi:BPMNShape id=\"Participant_0ufcvvc_di\" bpmnElement=\"Participant_0ufcvvc\" isHorizontal=\"false\">\n        <dc:Bounds x=\"190\" y=\"80\" width=\"1090\" height=\"830\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_16fbgsj_di\" bpmnElement=\"Task_Left\">\n        <dc:Bounds x=\"240\" y=\"260\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0fm36cc_di\" bpmnElement=\"Task_Bottom\">\n        <dc:Bounds x=\"410\" y=\"490\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0tbriov_di\" bpmnElement=\"SubProcess_Right\" isExpanded=\"true\">\n        <dc:Bounds x=\"900\" y=\"220\" width=\"350\" height=\"210\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0r2w32m_di\" bpmnElement=\"SubProcess_Center\" isExpanded=\"true\">\n        <dc:Bounds x=\"410\" y=\"130\" width=\"350\" height=\"210\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/modeling-feedback/ModelingFeedback.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"bpmn-js\" exporterVersion=\"7.3.0\">\n  <collaboration id=\"Collaboration_1\">\n    <participant name=\"Participant_1\" id=\"Participant_1\" processRef=\"Process_1\" />\n  </collaboration>\n  <process id=\"Process_1\" />\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_1_di\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"160\" y=\"80\" width=\"420\" height=\"180\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/modeling-feedback/ModelingFeedbackSpec.js",
    "content": "import {\n  bootstrapModeler,\n  getBpmnJS,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  createCanvasEvent as canvasEvent\n} from 'test/util/MockEvents';\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\nimport modelingFeedbackModule from 'lib/features/modeling-feedback';\n\n\ndescribe('features/modeling - ModelingFeedback', function() {\n\n  var collaborationDiagramXML = require('./ModelingFeedback.bpmn');\n\n  beforeEach(bootstrapModeler(collaborationDiagramXML, {\n    modules: [\n      coreModule,\n      modelingModule,\n      modelingFeedbackModule\n    ]\n  }));\n\n  it('should indicate error when placing flow elements inside collaboration', inject(\n    function(create, canvas, elementFactory, dragging) {\n\n      // given\n      var task = elementFactory.createShape({ type: 'bpmn:Task' });\n\n      var collaboration = canvas.getRootElement();\n      var collaborationGfx = canvas.getGraphics(collaboration);\n\n      create.start(canvasEvent({ x: 100, y: 100 }), task);\n      dragging.hover({ element: collaboration, gfx: collaborationGfx });\n\n      // when\n      dragging.end();\n\n      // then\n      expectTooltip('error', 'flow elements must be children of pools/participants');\n    }));\n\n\n  it('should indicate error when placing data objects inside collaboration', inject(\n    function(create, canvas, elementFactory, dragging) {\n\n      // given\n      var dataObject = elementFactory.createShape({ type: 'bpmn:DataObjectReference' });\n\n      var collaboration = canvas.getRootElement();\n      var collaborationGfx = canvas.getGraphics(collaboration);\n\n      create.start(canvasEvent({ x: 150, y: 150 }), dataObject);\n      dragging.hover({ element: collaboration, gfx: collaborationGfx });\n\n      // when\n      dragging.end();\n\n      // then\n      expectTooltip('error', 'Data object must be placed within a pool/participant.');\n    }\n  ));\n\n});\n\nfunction expectTooltip(cls, message) {\n\n  return getBpmnJS().invoke(function(canvas) {\n\n    var tooltipEl = document.querySelector('[data-tooltip-id]', canvas.getContainer());\n\n    expect(tooltipEl.textContent).to.eql(message);\n    expect(tooltipEl.classList.contains(cls));\n  });\n}"
  },
  {
    "path": "test/spec/features/ordering/BpmnDiOrderingSpec.js",
    "content": "import {\n  bootstrapModeler,\n  getBpmnJS\n} from 'test/TestHelper';\n\nimport {\n  add,\n  attach,\n  connect\n} from './Helper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\nimport emptyProcessXML from 'test/fixtures/bpmn/collaboration/process-empty.bpmn';\n\n\ndescribe('features/modeling - di ordering', function() {\n  var testModules = [ coreModule, modelingModule ];\n\n  describe('boundary events', function() {\n\n    beforeEach(bootstrapModeler(emptyProcessXML, { modules: testModules }));\n\n\n    it('should place after tasks', function() {\n\n      // when\n      var task1 = add({ type: 'bpmn:Task' }, { x: 100, y: 100 }),\n          event = attach(\n            { type: 'bpmn:BoundaryEvent' },\n            { x: 100, y: 140 },\n            task1\n          ),\n          task2 = add({ type: 'bpmn:Task' }, { x: 300, y: 100 });\n\n      // then\n      return expectDiOrder([ 'Process_1', task1.id, task2.id, event.id ]);\n    });\n  });\n\n\n  describe('collaboration', function() {\n\n    beforeEach(bootstrapModeler(emptyProcessXML, { modules: testModules }));\n\n\n    it('should place di elements in correct order', function() {\n\n      // given\n      var canvas = getBpmnJS().get('canvas'),\n          root;\n\n      // when\n      var participant1 = add(\n        { type: 'bpmn:Participant', height: 300 }, { x: 300, y: 200 }, 'Process_1'\n      );\n\n      root = canvas.getRootElement();\n      var participant2 = add({ type: 'bpmn:Participant' }, { x: 300, y: 500 }),\n          task1 = add({ type: 'bpmn:Task' }, { x: 400, y: 150 }, participant1.id),\n          task2 = add({ type: 'bpmn:Task' }, { x: 250, y: 150 }, participant1.id);\n\n      var messageFlow1 = connect(task1, participant2),\n          messageFlow2 = connect(participant2, participant1),\n          sequenceFlow = connect(task2, task1);\n\n      // then\n      return expectDiOrder([\n        root.id,\n        participant1.id,\n        task1.id,\n        task2.id,\n        sequenceFlow.id,\n        participant2.id,\n        messageFlow1.id,\n        messageFlow2.id\n      ]);\n    });\n  });\n\n\n  describe('subprocess', function() {\n\n    beforeEach(bootstrapModeler(emptyProcessXML, { modules: testModules }));\n\n\n    it('should place di elements in correct order', function() {\n\n      // given\n      var canvas = getBpmnJS().get('canvas'),\n          root;\n\n      // when\n      var subProcess = add(\n        { type: 'bpmn:SubProcess', isExpanded: true, width: 300, height: 200 }, { x: 300, y: 200 }\n      );\n\n      var participant = add({ type: 'bpmn:Participant', width: 500, height: 300 }, { x: 300, y: 200 }),\n          task1 = add({ type: 'bpmn:Task' }, { x: 250, y: 200 }, subProcess.id);\n\n      root = canvas.getRootElement();\n\n      // then\n      return expectDiOrder([\n        root.id,\n        participant.id,\n        subProcess.id,\n        task1.id,\n      ]);\n    });\n\n\n    it('should order subprocess planes', function() {\n\n      // given\n      var canvas = getBpmnJS().get('canvas'),\n          root;\n\n      // when\n      var subProcess = add(\n        { type: 'bpmn:SubProcess', isExpanded: false, width: 300, height: 200 }, { x: 300, y: 200 }\n      );\n\n      var participant = add({ type: 'bpmn:Participant', width: 500, height: 300 }, { x: 300, y: 200 }),\n          task1 = add({ type: 'bpmn:Task' }, { x: 250, y: 200 }, subProcess.id + '_plane');\n\n      root = canvas.getRootElement();\n\n      // then\n      // subProcess id exists twice: once as collapsed shape and once as plane element\n      return expectDiOrder([\n        root.id,\n        participant.id,\n        subProcess.id,\n        subProcess.id,\n        task1.id,\n      ]);\n    });\n  });\n\n\n  describe('wrong ordering in xml', function() {\n    var diagramXML = require('./wrong-di-order.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n    it('should correctly order di elements on export', function() {\n\n      // then\n      return expectDiOrder(\n        [\n          'Page1Process',\n          'MakeBookingSubProcess',\n          'StartEvent_1',\n          'ExclusiveGateway_1l6x19l',\n          'BookFlightTask',\n          'CancelFlightTask',\n          'BookHotelTask',\n          'ParalelGateway',\n          'TravelBookedEndEvent',\n          'CancelHotelTask',\n          'HandleCompensationSubProcess',\n          'BookingStartEvent',\n          'ParallelGateway_0vh9j6n',\n          'FlightEvent',\n          'HotelEvent',\n          'ParallelGateway_1ycdyix',\n          'EndEvent_0nr3cro',\n          'SequenceFlow_0cip1mz',\n          'SequenceFlow_09qgqyw',\n          'SequenceFlow_0i33vwg',\n          'SequenceFlow_03663sw',\n          'SequenceFlow_0zpw5ma',\n          'SequenceFlow_0e6xitm',\n          'FlightBoundaryEvent',\n          'HotelBoundaryEvent',\n          'SequenceFlow_0e0tkzl',\n          'SequenceFlow_1244t37',\n          'SequenceFlow',\n          'SequenceFlow_1',\n          'SequenceFlow_2',\n          'SequenceFlow_3',\n          'Association_0qea76h',\n          'Association_1',\n          'CancelRequestEndEvent',\n          'RequestCancelledEndEvent',\n          'GatewayGateway',\n          'OfferApprovedEvent',\n          'N24HoursEvent',\n          'N24HoursEvent1',\n          'CancelRequestEvent',\n          'MakeFlyAndHotelOfferTask',\n          'RequestCreditCardInformationTask',\n          'NotifyCustomerOfferExpiredTask',\n          'UpdateCustomerRecordTask',\n          'ReceiveTravelRequestStartEvent',\n          'SequenceFlow_0zafwi9',\n          'SequenceFlow_0nqtgik',\n          'SequenceFlow_0qen1he',\n          'SequenceFlow_1ysz115',\n          'SequenceFlow_1sv6jqd',\n          'SequenceFlow_1kwx6kg',\n          'SequenceFlow_1fp5smb',\n          'SequenceFlow_1c22uay',\n          'SequenceFlow_13g7fzw'\n        ]\n      );\n    });\n\n  });\n\n});\n\n\n// helpers ////////////\n\nfunction expectDiOrder(expectedOrder) {\n  return getBpmnJS().saveXML({ format: true }).then(function(result) {\n\n    var xml = result.xml;\n\n    var pattern = /bpmnElement=\"([^\"]+)\"/g,\n        exportedOrder = [],\n        match = pattern.exec(xml);\n\n    while (match !== null) {\n      exportedOrder.push(match[1]);\n\n      match = pattern.exec(xml);\n    }\n\n    expect(exportedOrder).to.eql(expectedOrder);\n  });\n}\n"
  },
  {
    "path": "test/spec/features/ordering/BpmnOrderingProviderSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  move,\n  attach,\n  connect,\n  expectZOrder\n} from './Helper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling - ordering', function() {\n\n  var testModules = [\n    coreModule,\n    modelingModule\n  ];\n\n\n  describe('boundary events', function() {\n\n    describe('move', function() {\n\n      var diagramXML = require('./ordering.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      it('should stay in front of Task', inject(function() {\n\n        // when\n        move('Task_With_Boundary');\n\n        // then\n        expectZOrder('Task_With_Boundary', 'BoundaryEvent');\n      }));\n\n\n      it('should stay in front of Task, moving both', inject(function() {\n\n        // when\n        move([ 'BoundaryEvent', 'Task_With_Boundary' ], 'Participant_StartEvent');\n\n        // then\n        expectZOrder('Task_With_Boundary', 'BoundaryEvent');\n      }));\n\n    });\n\n\n    describe('add', function() {\n\n      var diagramXML = require('./ordering-start-event.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      it('should add in front of Task', inject(function() {\n\n        // when\n        var boundaryShape = attach({ type: 'bpmn:BoundaryEvent' }, { x: 300, y: 80 }, 'Task');\n\n        // then\n        expectZOrder('Task', boundaryShape.id);\n      }));\n\n    });\n\n  });\n\n\n  describe('participants', function() {\n\n    var diagramXML = require('./ordering.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    it('should stay behind MessageFlow', inject(function() {\n\n      // when\n      move('Participant', 'Collaboration');\n\n      // then\n      expectZOrder('Participant_StartEvent', 'Participant', 'MessageFlow');\n    }));\n\n\n    it('should stay behind Group', inject(function() {\n\n      // when\n      move('Participant', 'Collaboration');\n\n      // then\n      expectZOrder('Participant_StartEvent', 'Participant', 'Group');\n    }));\n\n\n    it('should stay behind DataInputAssociation when moving Participant with DataStore', inject(function() {\n\n      // when\n      move('Participant', { x: 5, y: 5 });\n\n      // then\n      expectZOrder('Participant', 'DataInputAssociation');\n      expectZOrder('Participant_StartEvent', 'DataInputAssociation');\n    }));\n\n\n    it('should stay behind DataInputAssociation when moving Participant with Task', inject(function() {\n\n      // when\n      move('Participant_StartEvent', { x: 5, y: 5 });\n\n      // then\n      expectZOrder('Participant', 'DataInputAssociation');\n      expectZOrder('Participant_StartEvent', 'DataInputAssociation');\n    }));\n\n\n    it('should stay behind DataOutputAssociation when moving Participant with DataStore', inject(function() {\n\n      // when\n      move('Participant', { x: 5, y: 5 });\n\n      // then\n      expectZOrder('Participant', 'DataOutputAssociation');\n      expectZOrder('Participant_StartEvent', 'DataOutputAssociation');\n    }));\n\n\n    it('should stay behind DataOutputAssociation when moving Participant with Task', inject(function() {\n\n      // when\n      move('Participant_StartEvent', { x: 5, y: 5 });\n\n      // then\n      expectZOrder('Participant', 'DataOutputAssociation');\n      expectZOrder('Participant_StartEvent', 'DataOutputAssociation');\n    }));\n\n  });\n\n\n  describe('sub processes', function() {\n\n    var diagramXML = require('./ordering-subprocesses.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    it('should stay behind boundary events', inject(function() {\n\n      // when\n      move('BoundaryEvent_SubProcess', { x: 50, y: 0 }, 'SubProcess_1', true);\n\n      // then\n      expectZOrder('SubProcess_1', 'BoundaryEvent_SubProcess');\n    }));\n\n\n    it('should stay behind tasks', inject(function() {\n\n      // when\n      move([ 'Task_1', 'Task_2' ], { x: 50, y: 0 }, 'SubProcess_1');\n\n      // then\n      expectZOrder('SubProcess_1', 'Task_1', 'Task_2');\n    }));\n\n\n    it('should be in front of tasks if task is not a child', inject(function() {\n\n      // when\n      move([ 'Task_1', 'Task_2' ], { x: 200, y: 0 }, 'Root');\n\n      // then\n      expectZOrder('Task_1', 'Task_2', 'SubProcess_1');\n    }));\n\n  });\n\n\n  describe('transaction', function() {\n\n    var diagramXML = require('./ordering-subprocesses.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    it('should stay behind boundary events', inject(function() {\n\n      // when\n      move('BoundaryEvent_Transaction', { x: 50, y: 0 }, 'Transaction_1', true);\n\n      // then\n      expectZOrder('Transaction_1', 'BoundaryEvent_Transaction');\n    }));\n\n\n    it('should stay behind tasks', inject(function() {\n\n      // when\n      move([ 'Task_1', 'Task_2' ], { x: 50, y: 0 }, 'Transaction_1');\n\n      // then\n      expectZOrder('Transaction_1', 'Task_1', 'Task_2');\n    }));\n\n\n    it('should be in front of tasks if task is not a child', inject(function() {\n\n      // when\n      move([ 'Task_1', 'Task_2' ], { x: 200, y: 0 }, 'Root');\n\n      // then\n      expectZOrder('Task_1', 'Task_2', 'Transaction_1');\n    }));\n\n  });\n\n\n  describe('labels', function() {\n\n    var diagramXML = require('./ordering.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    describe('should stay always in front', function() {\n\n      it('moving <SequenceFlow_label> onto <Participant>', inject(function() {\n\n        // when\n        move('SequenceFlow_label', { x: 300, y: 0 }, 'Collaboration', false);\n\n        // then\n        expectZOrder('Collaboration', 'Participant', 'SequenceFlow_label');\n      }));\n\n\n      it('moving <StartEvent_label> onto <Participant>', inject(function() {\n\n        // when\n        move('StartEvent_label', { x: 50, y: -330 }, 'Participant', false);\n\n        // then\n        expectZOrder(\n          'Participant',\n          'Task_With_Boundary',\n          'BoundaryEvent',\n          'Participant_StartEvent',\n          'StartEvent_label'\n        );\n      }));\n\n\n      it('move <StartEvent> with label onto <Participant>', inject(function() {\n\n        // when\n        move('StartEvent', { x: 0, y: -330 }, 'Participant', false);\n\n        // then\n        expectZOrder(\n          'Participant',\n          'Participant_StartEvent',\n          'StartEvent_label'\n        );\n      }));\n\n\n      it('move <DataStore> with label onto <Participant_StartEvent>', inject(function() {\n\n        // when\n        move('DataStore', { x: -150, y: 330 }, 'Participant_StartEvent', false);\n\n        // then\n        expectZOrder(\n          'Participant',\n          'Participant_StartEvent',\n          'DataStore',\n          'DataStore_label'\n        );\n      }));\n\n    });\n\n  });\n\n\n  describe('groups', function() {\n\n    var diagramXML = require('./groups.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    describe('should stay always in front', function() {\n\n      it('moving <Group> onto <StartEvent>', inject(function() {\n\n        // when\n        move('Group', { x: 100, y: 0 }, 'StartEvent', false);\n\n        // then\n        expectZOrder('StartEvent', 'Group');\n      }));\n\n\n      it('moving <Group> onto <Task>', inject(function() {\n\n        // when\n        move('Group', { x: 200, y: 50 }, 'Task', false);\n\n        // then\n        expectZOrder('Task', 'Group');\n      }));\n\n\n      it('move <Group> onto <SubProcess>', inject(function() {\n\n        // when\n        move('Group', { x: 400, y: 0 }, 'SubProcess', false);\n\n        // then\n        expectZOrder('SubProcess', 'Group');\n      }));\n\n\n      it('move <Group> onto <Participant>', inject(function() {\n\n        // when\n        move('Group', { x: 50, y: 0 }, 'Participant', false);\n\n        // then\n        expectZOrder('Participant', 'Group');\n      }));\n\n    });\n\n\n    describe('inside subprocess', function() {\n\n      var diagramXML = require('./collapsed-subprocess.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      describe('should stay always in front', function() {\n\n        it('moving <Group> onto <StartEvent>', inject(function() {\n\n          // when\n          move('Group', { x: 100, y: 0 }, 'StartEvent', false);\n\n          // then\n          expectZOrder('StartEvent', 'Group');\n        }));\n\n\n        it('moving <Group> onto <Task>', inject(function() {\n\n          // when\n          move('Group', { x: 200, y: 50 }, 'Task', false);\n\n          // then\n          expectZOrder('Task', 'Group');\n        }));\n\n\n        it('move <Group> onto <SubProcess>', inject(function() {\n\n          // when\n          move('Group', { x: 400, y: 0 }, 'SubProcess', false);\n\n          // then\n          expectZOrder('SubProcess', 'Group');\n        }));\n\n      });\n    });\n\n  });\n\n\n  describe('sequence flows', function() {\n\n    var diagramXML = require('./ordering.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n    it('should render sequence flows behind tasks', inject(function() {\n\n      // assume\n      expectZOrder('Task', 'BoundaryEvent', 'SequenceFlow');\n\n      // when\n      var connection = connect('BoundaryEvent', 'Task');\n\n      // then\n      expectZOrder('Task', 'BoundaryEvent', connection, connection.label);\n    }));\n\n  });\n\n\n  describe('data associations', function() {\n\n    var diagramXML = require('./data-association.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n    it('should render data associations infront of Collaboration', inject(function() {\n\n      // when\n      var connection = connect('DataStore', 'Task_1');\n\n      // then\n      expectZOrder('Collaboration_1', 'DataStore', connection);\n    }));\n\n\n    describe('inside subprocesses', function() {\n\n      it('should render data associations behind other Subprocess', inject(function() {\n\n        // assumne\n        expectZOrder('SubProcess_1', 'SubProcess_2');\n\n        // when\n        var connection = connect('DataReference_1', 'Task_1');\n\n        // then\n        expectZOrder('SubProcess_1', connection, 'SubProcess_2');\n\n      }));\n\n\n      it('should render in collapsed subprocess plane', inject(function() {\n\n        // when\n        var connection = connect('DataReference_2', 'Task_2');\n\n        // then\n        expectZOrder('collapsedSubProcess_plane', 'DataReference_2', connection);\n\n      }));\n\n    });\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/ordering/Helper.js",
    "content": "import {\n  getBpmnJS\n} from 'test/TestHelper';\n\nimport {\n  map,\n  forEach\n} from 'min-dash';\n\nfunction sign(x) {\n  x = +x; // convert to a number\n  if (x === 0 || isNaN(x)) {\n    return x;\n  }\n  return x > 0 ? 1 : -1;\n}\n\n\nexport function move(elementIds, delta, targetId, isAttach) {\n\n  if (typeof elementIds === 'string') {\n    elementIds = [ elementIds ];\n  }\n\n  if (typeof delta !== 'object') {\n    isAttach = targetId;\n    targetId = delta;\n    delta = { x: 0, y: 0 };\n  }\n\n  if (typeof targetId !== 'string') {\n    isAttach = targetId;\n    targetId = null;\n  }\n\n  return getBpmnJS().invoke(function(canvas, elementRegistry, modeling) {\n\n    function getElement(id) {\n\n      var element = elementRegistry.get(id);\n\n      expect(element).to.exist;\n\n      return element;\n    }\n\n    var elements = map(elementIds, getElement),\n        target;\n\n    if (targetId === 'Root') {\n      target = canvas.getRootElement();\n    } else {\n      target = targetId && getElement(targetId);\n    }\n\n    var hints = isAttach ? { attach: true } : {};\n\n    return modeling.moveElements(elements, delta, target, hints);\n  });\n}\n\n\nexport function add(attrs, position, target, isAttach) {\n\n  return getBpmnJS().invoke(function(canvas, elementRegistry, modeling) {\n\n    function getElement(id) {\n\n      var element = elementRegistry.get(id);\n\n      expect(element).to.exist;\n\n      return element;\n    }\n\n    if (!target) {\n      target = canvas.getRootElement();\n    } else if (typeof target === 'string') {\n      target = getElement(target);\n    }\n\n    return modeling.createShape(attrs, position, target, { attach: isAttach });\n  });\n}\n\n\nexport function connect(source, target) {\n\n  return getBpmnJS().invoke(function(canvas, elementRegistry, modeling) {\n\n    function getElement(id) {\n\n      var element = elementRegistry.get(id);\n\n      expect(element).to.exist;\n\n      return element;\n    }\n\n    if (typeof target === 'string') {\n      target = getElement(target);\n    }\n\n    if (typeof source === 'string') {\n      source = getElement(source);\n    }\n\n    return modeling.connect(source, target);\n  });\n}\n\n\nexport function attach(attrs, position, target) {\n  return add(attrs, position, target, true);\n}\n\n\nfunction getAncestors(element) {\n  var ancestors = [];\n\n  while (element) {\n    ancestors.push(element);\n\n    element = element.parent;\n  }\n\n  return ancestors;\n}\n\n\nfunction compareZOrder(a, b) {\n\n  var elementA,\n      elementB;\n\n  getBpmnJS().invoke(function(elementRegistry) {\n\n    function getElement(id) {\n\n      var element = elementRegistry.get(id);\n      expect(element, 'element <' + id + '>').to.exist;\n\n      return element;\n    }\n\n    if (typeof a === 'string') {\n      a = getElement(a);\n    }\n\n    if (typeof b === 'string') {\n      b = getElement(b);\n    }\n\n    elementA = a;\n    elementB = b;\n  });\n\n\n  var aAncestors = getAncestors(elementA),\n      bAncestors = getAncestors(elementB);\n\n  var sharedRoot = aAncestors.reduce(function(result, aAncestor, aParentIndex) {\n\n    if (result) {\n      return result;\n    }\n\n    var bParentIndex = bAncestors.indexOf(aAncestor);\n\n    if (bParentIndex !== -1) {\n      return {\n        a: aAncestors[aParentIndex - 1],\n        b: bAncestors[bParentIndex - 1],\n        parent: aAncestor\n      };\n    }\n  }, false);\n\n  // b contained in a\n  if (!sharedRoot.a) {\n    return -1;\n  }\n\n  // a contained in b\n  if (!sharedRoot.b) {\n    return 1;\n  }\n\n  var aIndex = sharedRoot.parent.children.indexOf(sharedRoot.a),\n      bIndex = sharedRoot.parent.children.indexOf(sharedRoot.b);\n\n  return sign(aIndex - bIndex);\n}\n\n\nexport function expectZOrder() {\n\n  var elements = Array.prototype.slice.call(arguments);\n\n  var next;\n\n  forEach(elements, function(e, idx) {\n\n    next = elements[idx + 1];\n\n    if (next && compareZOrder(e, next) !== -1) {\n      throw new Error(\n        `expected <element#${ next.id || next }> to be in front of <element#${ e.id || e }>`\n      );\n    }\n  });\n\n  return true;\n}"
  },
  {
    "path": "test/spec/features/ordering/collapsed-subprocess.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-0fcc2144-457b-4505-9e44-ff673663e3bc\" targetNamespace=\"http://www.signavio.com/bpmn20\" exporter=\"Camunda Modeler\" exporterVersion=\"3.0.1\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n  <category id=\"Category_1\">\n    <categoryValue id=\"CategoryValue_1\" value=\"my group\" />\n  </category>\n  <collaboration id=\"Collaboration_1\">\n    <participant id=\"Participant\" processRef=\"Process_1\" />\n  </collaboration>\n  <process id=\"Process_1\" processType=\"None\" isExecutable=\"false\">\n    <subProcess id=\"Activity_0cijtmw\">\n      <subProcess id=\"SubProcess\" />\n      <task id=\"Task\" />\n      <startEvent id=\"StartEvent\" />\n      <group id=\"Group\" categoryValueRef=\"CategoryValue_1\" />\n    </subProcess>\n  </process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_di\" bpmnElement=\"Participant\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"156\" y=\"118\" width=\"304\" height=\"172\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0cijtmw_di\" bpmnElement=\"Activity_0cijtmw\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"270\" y=\"150\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_144105t\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0njyhgb\" bpmnElement=\"Activity_0cijtmw\">\n      <bpmndi:BPMNShape id=\"SubProcess_02cid6e_di\" bpmnElement=\"SubProcess\" isExpanded=\"true\">\n        <omgdc:Bounds x=\"428\" y=\"160\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0nb7h9d_di\" bpmnElement=\"Task\">\n        <omgdc:Bounds x=\"288\" y=\"279\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_0yve8vf_di\" bpmnElement=\"StartEvent\">\n        <omgdc:Bounds x=\"180\" y=\"301\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_1di\" bpmnElement=\"Group\">\n        <omgdc:Bounds x=\"425\" y=\"106\" width=\"270\" height=\"387\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"491\" y=\"108\" width=\"46\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>"
  },
  {
    "path": "test/spec/features/ordering/data-association.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-0fcc2144-457b-4505-9e44-ff673663e3bc\" targetNamespace=\"http://www.signavio.com/bpmn20\" exporter=\"Camunda Modeler\" exporterVersion=\"3.0.1\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n  <collaboration id=\"Collaboration_1\">\n    <participant id=\"Participant\" processRef=\"Process_1\" />\n  </collaboration>\n  <process id=\"Process_1\" processType=\"None\" isExecutable=\"false\">\n    <subProcess id=\"collapsedSubProcess\">\n      <task id=\"Task_2\" />\n      <dataObjectReference id=\"DataReference_2\" dataObjectRef=\"DataObject_0pqzs5u\" />\n      <dataObject id=\"DataObject_0pqzs5u\" />\n    </subProcess>\n    <dataStoreReference id=\"DataStore\" />\n    <subProcess id=\"SubProcess_1\">\n      <dataObjectReference id=\"DataReference_1\" dataObjectRef=\"DataObject_0ltvnwb\" />\n      <dataObject id=\"DataObject_0ltvnwb\" />\n      <task id=\"Task_1\" />\n    </subProcess>\n    <subProcess id=\"SubProcess_2\" />\n  </process>\n  <category id=\"Category_1\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_di\" bpmnElement=\"Participant\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"220\" y=\"50\" width=\"640\" height=\"240\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"collapsedSubProcess_di\" bpmnElement=\"collapsedSubProcess\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"270\" y=\"150\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <omgdc:Bounds x=\"400\" y=\"70\" width=\"290\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataReference_1_di\" bpmnElement=\"DataReference_1\">\n        <omgdc:Bounds x=\"612\" y=\"195\" width=\"36\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <omgdc:Bounds x=\"480\" y=\"110\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_2_di\" bpmnElement=\"SubProcess_2\" isExpanded=\"true\">\n        <omgdc:Bounds x=\"700\" y=\"70\" width=\"140\" height=\"140\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStore_di\" bpmnElement=\"DataStore\">\n        <omgdc:Bounds x=\"410\" y=\"345\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_144105t\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0njyhgb\" bpmnElement=\"collapsedSubProcess\">\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <omgdc:Bounds x=\"200\" y=\"140\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataReference_2_di\" bpmnElement=\"DataReference_2\">\n        <omgdc:Bounds x=\"332\" y=\"265\" width=\"36\" height=\"50\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>"
  },
  {
    "path": "test/spec/features/ordering/groups.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-0fcc2144-457b-4505-9e44-ff673663e3bc\" targetNamespace=\"http://www.signavio.com/bpmn20\" exporter=\"Camunda Modeler\" exporterVersion=\"3.0.1\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n  <category id=\"Category_1\">\n    <categoryValue id=\"CategoryValue_1\" value=\"my group\" />\n  </category>\n  <collaboration id=\"Collaboration_1\">\n    <participant id=\"Participant\" processRef=\"Process_1\" />\n    <group id=\"Group\" categoryValueRef=\"CategoryValue_1\" />\n  </collaboration>\n  <process id=\"Process_1\" processType=\"None\" isExecutable=\"false\">\n    <startEvent id=\"StartEvent\" />\n    <task id=\"Task\" />\n    <subProcess id=\"SubProcess\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_di\" bpmnElement=\"Participant\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"156\" y=\"118\" width=\"724\" height=\"250\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"184\" y=\"107\" width=\"59\" height=\"15\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_0yve8vf_di\" bpmnElement=\"StartEvent\">\n        <omgdc:Bounds x=\"192\" y=\"242\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0nb7h9d_di\" bpmnElement=\"Task\">\n        <omgdc:Bounds x=\"280\" y=\"150\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_02cid6e_di\" bpmnElement=\"SubProcess\" isExpanded=\"true\">\n        <omgdc:Bounds x=\"430\" y=\"138\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_1di\" bpmnElement=\"Group\">\n        <omgdc:Bounds x=\"220\" y=\"73\" width=\"270\" height=\"387\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"286\" y=\"75\" width=\"46\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/ordering/ordering-start-event.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\" />\n    <bpmn:task id=\"Task\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_di\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"271\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/ordering/ordering-subprocesses.bpmn",
    "content": "\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <bpmn:task id=\"Task_1\" />\n      <bpmn:task id=\"Task_2\" />\n    </bpmn:subProcess>\n    <bpmn:boundaryEvent id=\"BoundaryEvent_SubProcess\" attachedToRef=\"SubProcess_1\" />\n    <bpmn:transaction id=\"Transaction_1\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_Transaction\" attachedToRef=\"Transaction_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"100\" y=\"44\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_SubProcess_di\" bpmnElement=\"BoundaryEvent_SubProcess\">\n        <dc:Bounds x=\"157\" y=\"226\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"130\" y=\"262\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"138\" y=\"68\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"305\" y=\"68\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Transaction_1_di\" bpmnElement=\"Transaction_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"100\" y=\"302\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_Transaction_di\" bpmnElement=\"BoundaryEvent_Transaction\">\n        <dc:Bounds x=\"249\" y=\"484\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"222\" y=\"520\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/ordering/ordering.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"_Sp0bEEZWEeW8AbPIK3dKxg\" targetNamespace=\"http://camunda.org/schema/1.0/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.2.2\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"Collaboration\">\n    <bpmn2:participant id=\"Participant\" name=\"Participant\" processRef=\"Process_Tasks\" />\n    <bpmn2:participant id=\"Participant_StartEvent\" name=\"Participant_StartEvent\" processRef=\"Process_StartEvent\" />\n    <bpmn2:messageFlow id=\"MessageFlow\" name=\"\" sourceRef=\"Task_With_Boundary\" targetRef=\"Participant_StartEvent\" />\n    <bpmn2:group id=\"Group\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_Tasks\" isExecutable=\"false\">\n    <bpmn2:sequenceFlow id=\"SequenceFlow\" name=\"SequenceFlow\" sourceRef=\"BoundaryEvent\" targetRef=\"Task\" />\n    <bpmn2:boundaryEvent id=\"BoundaryEvent\" name=\"\" attachedToRef=\"Task_With_Boundary\">\n      <bpmn2:outgoing>SequenceFlow</bpmn2:outgoing>\n    </bpmn2:boundaryEvent>\n    <bpmn2:task id=\"Task_With_Boundary\" />\n    <bpmn2:task id=\"Task\">\n      <bpmn2:incoming>SequenceFlow</bpmn2:incoming>\n    </bpmn2:task>\n    <bpmn2:dataStoreReference id=\"DataStore\" name=\"Store\" />\n    <bpmn2:dataStoreReference id=\"DataStore_With_Output\" />\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_StartEvent\" isExecutable=\"false\">\n    <bpmn2:task id=\"Task_With_Input\">\n      <bpmn2:property id=\"Property_17cs768\" name=\"__targetRef_placeholder\" />\n      <bpmn2:dataInputAssociation id=\"DataInputAssociation\">\n        <bpmn2:sourceRef>DataStore</bpmn2:sourceRef>\n        <bpmn2:targetRef>Property_17cs768</bpmn2:targetRef>\n      </bpmn2:dataInputAssociation>\n    </bpmn2:task>\n    <bpmn2:startEvent id=\"StartEvent\" name=\"StartEvent\" />\n    <bpmn2:task id=\"Task_With_Output\">\n      <bpmn2:dataOutputAssociation id=\"DataOutputAssociation\">\n        <bpmn2:targetRef>DataStore_With_Output</bpmn2:targetRef>\n      </bpmn2:dataOutputAssociation>\n    </bpmn2:task>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"Participant\" isHorizontal=\"true\">\n        <dc:Bounds x=\"192\" y=\"108\" width=\"686\" height=\"198\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_3\" bpmnElement=\"Participant_StartEvent\" isHorizontal=\"true\">\n        <dc:Bounds x=\"192\" y=\"444\" width=\"685\" height=\"160\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_With_Boundary\">\n        <dc:Bounds x=\"300\" y=\"144\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_BoundaryEvent_2\" bpmnElement=\"BoundaryEvent\">\n        <dc:Bounds x=\"346\" y=\"206\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"319\" y=\"242\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"480\" y=\"144\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow\" sourceElement=\"_BPMNShape_BoundaryEvent_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint x=\"364\" y=\"242\" />\n        <di:waypoint x=\"364\" y=\"272\" />\n        <di:waypoint x=\"530\" y=\"272\" />\n        <di:waypoint x=\"530\" y=\"224\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"429\" y=\"272\" width=\"90\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_MessageFlow_1\" bpmnElement=\"MessageFlow\" sourceElement=\"_BPMNShape_Task_2\" targetElement=\"_BPMNShape_Participant_3\">\n        <di:waypoint x=\"326\" y=\"224\" />\n        <di:waypoint x=\"326\" y=\"444\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"370\" y=\"334\" width=\"6\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent\">\n        <dc:Bounds x=\"271\" y=\"495\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"244\" y=\"531\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStore_di\" bpmnElement=\"DataStore\">\n        <dc:Bounds x=\"629\" y=\"159\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"641\" y=\"129\" width=\"27\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1w5ze4k_di\" bpmnElement=\"Task_With_Input\">\n        <dc:Bounds x=\"604\" y=\"473\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_1ubbgym_di\" bpmnElement=\"DataInputAssociation\">\n        <di:waypoint x=\"654\" y=\"209\" />\n        <di:waypoint x=\"654\" y=\"473\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"DataStoreReference_0jbctd4_di\" bpmnElement=\"DataStore_With_Output\">\n        <dc:Bounds x=\"772\" y=\"159\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"752\" y=\"209\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0vcqjeq_di\" bpmnElement=\"Task_With_Output\">\n        <dc:Bounds x=\"747\" y=\"473\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_di\" bpmnElement=\"Group\">\n        <dc:Bounds x=\"250\" y=\"73\" width=\"270\" height=\"287\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_1fcd0id_di\" bpmnElement=\"DataOutputAssociation\">\n        <di:waypoint x=\"797\" y=\"473\" />\n        <di:waypoint x=\"797\" y=\"209\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/ordering/wrong-di-order.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<semantic:definitions xmlns:semantic=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:color=\"http://www.omg.org/spec/BPMN/non-normative/color/1.0\" xmlns:trisobpmn=\"http://www.trisotech.com/2014/triso/bpmn\" xmlns:triso=\"http://www.trisotech.com/2015/triso/modeling\" xmlns:feel=\"http://www.omg.org/spec/DMN/20180521/FEEL/\" xmlns:bpsim=\"http://www.bpsim.org/schemas/1.0\" xmlns:rss=\"http://purl.org/rss/2.0/\" xmlns:trisofeed=\"http://trisotech.com/feed\" xmlns:drools=\"http://www.jboss.org/drools\" xmlns:openapi=\"https://openapis.org/bpmn/extension/1.0\" xmlns=\"http://bpmn.io/schema/bpmn\" id=\"Definitions_0v32ciy\" name=\"Drawing 1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.7.0\" trisobpmn:logoChoice=\"Default\">\n  <semantic:process id=\"Page1Process\" name=\"Page 1\" isClosed=\"false\" isExecutable=\"true\">\n    <semantic:subProcess id=\"MakeBookingSubProcess\" name=\"Make Booking\">\n      <semantic:incoming>SequenceFlow_13g7fzw</semantic:incoming>\n      <semantic:startEvent id=\"StartEvent_1\">\n        <semantic:outgoing>SequenceFlow_0e0tkzl</semantic:outgoing>\n      </semantic:startEvent>\n      <semantic:parallelGateway id=\"ExclusiveGateway_1l6x19l\" gatewayDirection=\"Diverging\">\n        <semantic:incoming>SequenceFlow_0e0tkzl</semantic:incoming>\n        <semantic:outgoing>SequenceFlow_1244t37</semantic:outgoing>\n        <semantic:outgoing>SequenceFlow</semantic:outgoing>\n      </semantic:parallelGateway>\n      <semantic:serviceTask id=\"BookFlightTask\" name=\"Book Flight\" implementation=\"##WebService\">\n        <semantic:incoming>SequenceFlow_1244t37</semantic:incoming>\n        <semantic:outgoing>SequenceFlow_1</semantic:outgoing>\n      </semantic:serviceTask>\n      <semantic:serviceTask id=\"CancelFlightTask\" name=\"Cancel Flight\" isForCompensation=\"true\" implementation=\"##WebService\" />\n      <semantic:serviceTask id=\"BookHotelTask\" name=\"Book Hotel\" implementation=\"##WebService\">\n        <semantic:incoming>SequenceFlow</semantic:incoming>\n        <semantic:outgoing>SequenceFlow_2</semantic:outgoing>\n      </semantic:serviceTask>\n      <semantic:parallelGateway id=\"ParalelGateway\" gatewayDirection=\"Converging\">\n        <semantic:incoming>SequenceFlow_1</semantic:incoming>\n        <semantic:incoming>SequenceFlow_2</semantic:incoming>\n        <semantic:outgoing>SequenceFlow_3</semantic:outgoing>\n      </semantic:parallelGateway>\n      <semantic:endEvent id=\"TravelBookedEndEvent\" name=\"Travel Booked\">\n        <semantic:incoming>SequenceFlow_3</semantic:incoming>\n      </semantic:endEvent>\n      <semantic:serviceTask id=\"CancelHotelTask\" name=\"Cancel Hotel\" isForCompensation=\"true\" implementation=\"##WebService\" />\n      <semantic:boundaryEvent id=\"HotelBoundaryEvent\" name=\"Hotel\" attachedToRef=\"BookHotelTask\">\n        <semantic:compensateEventDefinition id=\"_c758645b-bc1c-4d96-90ad-4c510c386752\" />\n      </semantic:boundaryEvent>\n      <semantic:boundaryEvent id=\"FlightBoundaryEvent\" name=\"Flight\" attachedToRef=\"BookFlightTask\">\n        <semantic:compensateEventDefinition />\n      </semantic:boundaryEvent>\n      <semantic:sequenceFlow id=\"SequenceFlow_0e0tkzl\" sourceRef=\"StartEvent_1\" targetRef=\"ExclusiveGateway_1l6x19l\" />\n      <semantic:sequenceFlow id=\"SequenceFlow_1244t37\" sourceRef=\"ExclusiveGateway_1l6x19l\" targetRef=\"BookFlightTask\" />\n      <semantic:sequenceFlow id=\"SequenceFlow\" sourceRef=\"ExclusiveGateway_1l6x19l\" targetRef=\"BookHotelTask\" />\n      <semantic:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"BookFlightTask\" targetRef=\"ParalelGateway\" />\n      <semantic:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"BookHotelTask\" targetRef=\"ParalelGateway\" />\n      <semantic:sequenceFlow id=\"SequenceFlow_3\" sourceRef=\"ParalelGateway\" targetRef=\"TravelBookedEndEvent\" />\n      <semantic:subProcess id=\"HandleCompensationSubProcess\" name=\"Handle Compensation\" triggeredByEvent=\"true\">\n        <semantic:startEvent id=\"BookingStartEvent\" name=\"Booking\">\n          <semantic:outgoing>SequenceFlow_0e6xitm</semantic:outgoing>\n          <semantic:compensateEventDefinition id=\"CompensateEventDefinition_0gbwp0m\" />\n        </semantic:startEvent>\n        <semantic:parallelGateway id=\"ParallelGateway_0vh9j6n\">\n          <semantic:incoming>SequenceFlow_0e6xitm</semantic:incoming>\n          <semantic:outgoing>SequenceFlow_03663sw</semantic:outgoing>\n          <semantic:outgoing>SequenceFlow_0zpw5ma</semantic:outgoing>\n        </semantic:parallelGateway>\n        <semantic:intermediateThrowEvent id=\"FlightEvent\" name=\"Flight\">\n          <semantic:incoming>SequenceFlow_0zpw5ma</semantic:incoming>\n          <semantic:outgoing>SequenceFlow_0i33vwg</semantic:outgoing>\n          <semantic:compensateEventDefinition id=\"CompensateEventDefinition_1jzvrat\" />\n        </semantic:intermediateThrowEvent>\n        <semantic:intermediateThrowEvent id=\"HotelEvent\" name=\"Hotel\">\n          <semantic:incoming>SequenceFlow_03663sw</semantic:incoming>\n          <semantic:outgoing>SequenceFlow_09qgqyw</semantic:outgoing>\n          <semantic:compensateEventDefinition id=\"CompensateEventDefinition_072qtxl\" />\n        </semantic:intermediateThrowEvent>\n        <semantic:parallelGateway id=\"ParallelGateway_1ycdyix\" name=\"\">\n          <semantic:incoming>SequenceFlow_09qgqyw</semantic:incoming>\n          <semantic:incoming>SequenceFlow_0i33vwg</semantic:incoming>\n          <semantic:outgoing>SequenceFlow_0cip1mz</semantic:outgoing>\n        </semantic:parallelGateway>\n        <semantic:endEvent id=\"EndEvent_0nr3cro\" name=\"\">\n          <semantic:incoming>SequenceFlow_0cip1mz</semantic:incoming>\n        </semantic:endEvent>\n        <semantic:sequenceFlow id=\"SequenceFlow_0cip1mz\" isImmediate=\"true\" sourceRef=\"ParallelGateway_1ycdyix\" targetRef=\"EndEvent_0nr3cro\" />\n        <semantic:sequenceFlow id=\"SequenceFlow_09qgqyw\" isImmediate=\"true\" sourceRef=\"HotelEvent\" targetRef=\"ParallelGateway_1ycdyix\" />\n        <semantic:sequenceFlow id=\"SequenceFlow_0i33vwg\" isImmediate=\"true\" sourceRef=\"FlightEvent\" targetRef=\"ParallelGateway_1ycdyix\" />\n        <semantic:sequenceFlow id=\"SequenceFlow_03663sw\" isImmediate=\"true\" sourceRef=\"ParallelGateway_0vh9j6n\" targetRef=\"HotelEvent\" />\n        <semantic:sequenceFlow id=\"SequenceFlow_0zpw5ma\" sourceRef=\"ParallelGateway_0vh9j6n\" targetRef=\"FlightEvent\" />\n        <semantic:sequenceFlow id=\"SequenceFlow_0e6xitm\" sourceRef=\"BookingStartEvent\" targetRef=\"ParallelGateway_0vh9j6n\" />\n      </semantic:subProcess>\n      <semantic:association id=\"Association_0qea76h\" associationDirection=\"One\" sourceRef=\"FlightBoundaryEvent\" targetRef=\"CancelFlightTask\" />\n      <semantic:association id=\"Association_1\" associationDirection=\"One\" sourceRef=\"HotelBoundaryEvent\" targetRef=\"CancelHotelTask\" />\n    </semantic:subProcess>\n    <semantic:endEvent id=\"CancelRequestEndEvent\" name=\"Cancel Request\" />\n    <semantic:endEvent id=\"RequestCancelledEndEvent\" name=\"Request Cancelled\">\n      <semantic:incoming>SequenceFlow_0zafwi9</semantic:incoming>\n    </semantic:endEvent>\n    <semantic:eventBasedGateway id=\"GatewayGateway\" name=\"Gateway\">\n      <semantic:incoming>SequenceFlow_0nqtgik</semantic:incoming>\n      <semantic:outgoing>SequenceFlow_0qen1he</semantic:outgoing>\n      <semantic:outgoing>SequenceFlow_1ysz115</semantic:outgoing>\n      <semantic:outgoing>SequenceFlow_1sv6jqd</semantic:outgoing>\n    </semantic:eventBasedGateway>\n    <semantic:intermediateCatchEvent id=\"OfferApprovedEvent\" name=\"Offer Approved\">\n      <semantic:incoming>SequenceFlow_0qen1he</semantic:incoming>\n      <semantic:outgoing>SequenceFlow_1kwx6kg</semantic:outgoing>\n      <semantic:messageEventDefinition id=\"MessageEventDefinition_16r7ej1\" />\n    </semantic:intermediateCatchEvent>\n    <semantic:intermediateCatchEvent id=\"N24HoursEvent\" name=\"24 Hours\">\n      <semantic:incoming>SequenceFlow_1ysz115</semantic:incoming>\n      <semantic:timerEventDefinition id=\"TimerEventDefinition_0i6m1ju\" />\n    </semantic:intermediateCatchEvent>\n    <semantic:intermediateCatchEvent id=\"N24HoursEvent1\" name=\"24 Hours\">\n      <semantic:compensateEventDefinition id=\"CompensateEventDefinition_0484wis\" />\n    </semantic:intermediateCatchEvent>\n    <semantic:intermediateCatchEvent id=\"CancelRequestEvent\" name=\"Cancel Request\">\n      <semantic:incoming>SequenceFlow_1sv6jqd</semantic:incoming>\n      <semantic:outgoing>SequenceFlow_1fp5smb</semantic:outgoing>\n      <semantic:messageEventDefinition id=\"MessageEventDefinition_1bkmr3i\" />\n    </semantic:intermediateCatchEvent>\n    <semantic:sendTask id=\"MakeFlyAndHotelOfferTask\" name=\"Make Fly and Hotel Offer\">\n      <semantic:incoming>SequenceFlow_1c22uay</semantic:incoming>\n      <semantic:outgoing>SequenceFlow_0nqtgik</semantic:outgoing>\n    </semantic:sendTask>\n    <semantic:sendTask id=\"RequestCreditCardInformationTask\" name=\"Request\n&#10;Credit Card Information\">\n      <semantic:incoming>SequenceFlow_1kwx6kg</semantic:incoming>\n      <semantic:outgoing>SequenceFlow_13g7fzw</semantic:outgoing>\n    </semantic:sendTask>\n    <semantic:sendTask id=\"NotifyCustomerOfferExpiredTask\" name=\"Notify Customer\n&#10;Offer Expired\" isForCompensation=\"true\" />\n    <semantic:serviceTask id=\"UpdateCustomerRecordTask\" name=\"Update Customer Record\">\n      <semantic:incoming>SequenceFlow_1fp5smb</semantic:incoming>\n      <semantic:outgoing>SequenceFlow_0zafwi9</semantic:outgoing>\n    </semantic:serviceTask>\n    <semantic:startEvent id=\"ReceiveTravelRequestStartEvent\" name=\"Receive Travel Request\">\n      <semantic:outgoing>SequenceFlow_1c22uay</semantic:outgoing>\n      <semantic:messageEventDefinition id=\"MessageEventDefinition_145aeab\" />\n    </semantic:startEvent>\n    <semantic:sequenceFlow id=\"SequenceFlow_0zafwi9\" name=\"\" sourceRef=\"UpdateCustomerRecordTask\" targetRef=\"RequestCancelledEndEvent\" />\n    <semantic:sequenceFlow id=\"SequenceFlow_0nqtgik\" name=\"\" sourceRef=\"MakeFlyAndHotelOfferTask\" targetRef=\"GatewayGateway\" />\n    <semantic:sequenceFlow id=\"SequenceFlow_0qen1he\" name=\"\" sourceRef=\"GatewayGateway\" targetRef=\"OfferApprovedEvent\" />\n    <semantic:sequenceFlow id=\"SequenceFlow_1ysz115\" name=\"\" sourceRef=\"GatewayGateway\" targetRef=\"N24HoursEvent\" />\n    <semantic:sequenceFlow id=\"SequenceFlow_1sv6jqd\" name=\"\" sourceRef=\"GatewayGateway\" targetRef=\"CancelRequestEvent\" />\n    <semantic:sequenceFlow id=\"SequenceFlow_1kwx6kg\" name=\"\" sourceRef=\"OfferApprovedEvent\" targetRef=\"RequestCreditCardInformationTask\" />\n    <semantic:sequenceFlow id=\"SequenceFlow_1fp5smb\" name=\"\" sourceRef=\"CancelRequestEvent\" targetRef=\"UpdateCustomerRecordTask\" />\n    <semantic:sequenceFlow id=\"SequenceFlow_1c22uay\" name=\"\" sourceRef=\"ReceiveTravelRequestStartEvent\" targetRef=\"MakeFlyAndHotelOfferTask\" />\n    <semantic:sequenceFlow id=\"SequenceFlow_13g7fzw\" sourceRef=\"RequestCreditCardInformationTask\" targetRef=\"MakeBookingSubProcess\" />\n  </semantic:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\" name=\"Page 1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Page1Process\" trisobpmn:diagramWidth=\"1485\" trisobpmn:diagramHeight=\"1050\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\" color:background-color=\"#ffffff\" color:border-color=\"#000000\">\n        <dc:Bounds x=\"1126.5\" y=\"249\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel labelStyle=\"LSBPMNDiagram_1_0\" color:color=\"#000000\" triso:defaultBounds=\"true\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ParallelGateway_0k3zjvh_di\" bpmnElement=\"ExclusiveGateway_1l6x19l\" color:background-color=\"#ffffff\" color:border-color=\"#000000\">\n        <dc:Bounds x=\"1211.5\" y=\"242\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel labelStyle=\"LSBPMNDiagram_1_0\" color:color=\"#000000\" triso:defaultBounds=\"true\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ServiceTask_0ffqml6_di\" bpmnElement=\"BookFlightTask\" color:background-color=\"#ffffff\" color:border-color=\"#000000\">\n        <dc:Bounds x=\"1281.5\" y=\"101\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"LSBPMNDiagram_1_0\" color:color=\"#000000\" triso:defaultBounds=\"true\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1fpw0uu_di\" bpmnElement=\"FlightBoundaryEvent\" color:background-color=\"#ffffff\" color:border-color=\"#000000\">\n        <dc:Bounds x=\"1335.5\" y=\"163\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel labelStyle=\"LSBPMNDiagram_1_0\" color:color=\"#000000\">\n          <dc:Bounds x=\"1367\" y=\"201\" width=\"27\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ServiceTask_0svlfsd_di\" bpmnElement=\"CancelFlightTask\" color:background-color=\"#ffffff\" color:border-color=\"#000000\">\n        <dc:Bounds x=\"1421.5\" y=\"221\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"LSBPMNDiagram_1_0\" color:color=\"#000000\" triso:defaultBounds=\"true\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_55ed0b6b-78a4-45c7-be2b-c9f2ae62e059\" bpmnElement=\"BookHotelTask\" color:background-color=\"#ffffff\" color:border-color=\"#000000\">\n        <dc:Bounds x=\"1283.5\" y=\"353\" width=\"96\" height=\"76\" />\n        <bpmndi:BPMNLabel labelStyle=\"LSBPMNDiagram_1_0\" color:color=\"#000000\" triso:defaultBounds=\"true\">\n          <dc:Bounds x=\"362.5\" y=\"365\" width=\"89\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_735cd99a-991d-4a1e-bf06-e58f24e6fa67\" bpmnElement=\"ParalelGateway\" color:background-color=\"#ffffff\" color:border-color=\"#000000\">\n        <dc:Bounds x=\"1587.5\" y=\"247\" width=\"42\" height=\"40\" />\n        <bpmndi:BPMNLabel labelStyle=\"LSBPMNDiagram_1_0\" color:color=\"#000000\" triso:defaultBounds=\"true\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_26e09c29-a907-4aec-93ae-816bc7d44f83\" bpmnElement=\"TravelBookedEndEvent\" color:background-color=\"#ffffff\" color:border-color=\"#000000\">\n        <dc:Bounds x=\"1683.5\" y=\"249\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel labelStyle=\"LSBPMNDiagram_1_0\" color:color=\"#000000\" triso:defaultBounds=\"true\">\n          <dc:Bounds x=\"1667\" y=\"295\" width=\"71\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_ae3ae527-4d03-4cee-b2da-c756fe0a027b\" bpmnElement=\"HotelBoundaryEvent\" color:background-color=\"#ffffff\" color:border-color=\"#000000\">\n        <dc:Bounds x=\"1313.5\" y=\"411\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel labelStyle=\"LSBPMNDiagram_1_0\" color:color=\"#000000\">\n          <dc:Bounds x=\"1340\" y=\"452\" width=\"26\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_9d5749f4-9f59-4e40-8dbd-53ac6fa256ca\" bpmnElement=\"CancelHotelTask\" color:background-color=\"#ffffff\" color:border-color=\"#000000\">\n        <dc:Bounds x=\"1423.5\" y=\"464\" width=\"96\" height=\"76\" />\n        <bpmndi:BPMNLabel labelStyle=\"LSBPMNDiagram_1_0\" color:color=\"#000000\" triso:defaultBounds=\"true\">\n          <dc:Bounds x=\"496.5\" y=\"476\" width=\"89\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0e0tkzl_di\" bpmnElement=\"SequenceFlow_0e0tkzl\" color:border-color=\"#000000\">\n        <di:waypoint x=\"1162.5\" y=\"267\" />\n        <di:waypoint x=\"1211.5\" y=\"267\" />\n        <bpmndi:BPMNLabel labelStyle=\"LSBPMNDiagram_1_0\" color:color=\"#000000\" triso:defaultBounds=\"true\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1244t37_di\" bpmnElement=\"SequenceFlow_1244t37\" color:border-color=\"#000000\">\n        <di:waypoint x=\"1236.5\" y=\"242\" />\n        <di:waypoint x=\"1236.5\" y=\"141\" />\n        <di:waypoint x=\"1281.5\" y=\"141\" />\n        <bpmndi:BPMNLabel labelStyle=\"LSBPMNDiagram_1_0\" color:color=\"#000000\" triso:defaultBounds=\"true\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Association_0qea76h_di\" bpmnElement=\"Association_0qea76h\" color:border-color=\"#000000\">\n        <di:waypoint x=\"1353.5\" y=\"199\" />\n        <di:waypoint x=\"1353.5\" y=\"261\" />\n        <di:waypoint x=\"1421.5\" y=\"261\" />\n        <bpmndi:BPMNLabel labelStyle=\"LSBPMNDiagram_1_0\" color:color=\"#000000\" triso:defaultBounds=\"true\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"_bdb1c43c-917f-413d-ba77-431ce93be3ef\" bpmnElement=\"SequenceFlow\" color:border-color=\"#000000\">\n        <di:waypoint x=\"1236.5\" y=\"292\" />\n        <di:waypoint x=\"1236.5\" y=\"391\" />\n        <di:waypoint x=\"1283.5\" y=\"391\" />\n        <bpmndi:BPMNLabel labelStyle=\"LSBPMNDiagram_1_0\" color:color=\"#000000\" triso:defaultBounds=\"true\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"_45eebdc5-ae17-4472-b76c-7880b58ab0be\" bpmnElement=\"SequenceFlow_1\" color:border-color=\"#000000\">\n        <di:waypoint x=\"1381.5\" y=\"141\" />\n        <di:waypoint x=\"1608.5\" y=\"141\" />\n        <di:waypoint x=\"1608.5\" y=\"247\" />\n        <bpmndi:BPMNLabel labelStyle=\"LSBPMNDiagram_1_0\" color:color=\"#000000\" triso:defaultBounds=\"true\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"_bd0e4152-53c1-4d3d-a13b-6d7df71dffa2\" bpmnElement=\"SequenceFlow_2\" color:border-color=\"#000000\">\n        <di:waypoint x=\"1379.5\" y=\"414\" />\n        <di:waypoint x=\"1608.5\" y=\"414\" />\n        <di:waypoint x=\"1608.5\" y=\"287\" />\n        <bpmndi:BPMNLabel labelStyle=\"LSBPMNDiagram_1_0\" color:color=\"#000000\" triso:defaultBounds=\"true\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"_667de68d-c8b2-47f2-94f5-9602806a3175\" bpmnElement=\"SequenceFlow_3\" color:border-color=\"#000000\">\n        <di:waypoint x=\"1629.5\" y=\"267\" />\n        <di:waypoint x=\"1683.5\" y=\"267\" />\n        <bpmndi:BPMNLabel labelStyle=\"LSBPMNDiagram_1_0\" color:color=\"#000000\" triso:defaultBounds=\"true\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"_f25774cf-e810-4deb-aae7-5e077671fb67\" bpmnElement=\"Association_1\" color:border-color=\"#000000\">\n        <di:waypoint x=\"1331.5\" y=\"447\" />\n        <di:waypoint x=\"1331.5\" y=\"502\" />\n        <di:waypoint x=\"1423.5\" y=\"502\" />\n        <bpmndi:BPMNLabel labelStyle=\"LSBPMNDiagram_1_0\" color:color=\"#000000\" triso:defaultBounds=\"true\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"SubProcess_01o85pt_di\" bpmnElement=\"MakeBookingSubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"1106.5\" y=\"81\" width=\"658\" height=\"822\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_01ag946_di\" bpmnElement=\"HandleCompensationSubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"1149.5\" y=\"586\" width=\"595\" height=\"297\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_0q6mpzc_di\" bpmnElement=\"BookingStartEvent\">\n        <dc:Bounds x=\"1210.5\" y=\"714\" width=\"32\" height=\"32\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"1207\" y=\"746\" width=\"40\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ParallelGateway_0vh9j6n_di\" bpmnElement=\"ParallelGateway_0vh9j6n\">\n        <dc:Bounds x=\"1297.5\" y=\"710\" width=\"42\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_1iv1cgd_di\" bpmnElement=\"FlightEvent\">\n        <dc:Bounds x=\"1420.5\" y=\"621\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"1424\" y=\"656\" width=\"27\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_0hqqa6z_di\" bpmnElement=\"HotelEvent\">\n        <dc:Bounds x=\"1380.5\" y=\"801\" width=\"32\" height=\"32\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"1385\" y=\"833\" width=\"26\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ParallelGateway_1ycdyix_di\" bpmnElement=\"ParallelGateway_1ycdyix\">\n        <dc:Bounds x=\"1532.5\" y=\"714\" width=\"40\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_0nr3cro_di\" bpmnElement=\"EndEvent_0nr3cro\">\n        <dc:Bounds x=\"1630.5\" y=\"719\" width=\"32\" height=\"32\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0cip1mz_di\" bpmnElement=\"SequenceFlow_0cip1mz\">\n        <di:waypoint x=\"1572.5\" y=\"734\" />\n        <di:waypoint x=\"1630.5\" y=\"734\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_09qgqyw_di\" bpmnElement=\"SequenceFlow_09qgqyw\">\n        <di:waypoint x=\"1412.5\" y=\"817\" />\n        <di:waypoint x=\"1551.5\" y=\"817\" />\n        <di:waypoint x=\"1551.5\" y=\"753\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0i33vwg_di\" bpmnElement=\"SequenceFlow_0i33vwg\">\n        <di:waypoint x=\"1456.5\" y=\"638\" />\n        <di:waypoint x=\"1552.5\" y=\"638\" />\n        <di:waypoint x=\"1552.5\" y=\"714\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_03663sw_di\" bpmnElement=\"SequenceFlow_03663sw\">\n        <di:waypoint x=\"1317.5\" y=\"749\" />\n        <di:waypoint x=\"1317.5\" y=\"817\" />\n        <di:waypoint x=\"1380.5\" y=\"817\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0zpw5ma_di\" bpmnElement=\"SequenceFlow_0zpw5ma\">\n        <di:waypoint x=\"1317.5\" y=\"708\" />\n        <di:waypoint x=\"1317.5\" y=\"638\" />\n        <di:waypoint x=\"1419.5\" y=\"638\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0e6xitm_di\" bpmnElement=\"SequenceFlow_0e6xitm\">\n        <di:waypoint x=\"1242.5\" y=\"730\" />\n        <di:waypoint x=\"1296.5\" y=\"730\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EndEvent_0501mm2_di\" bpmnElement=\"CancelRequestEndEvent\">\n        <dc:Bounds x=\"989.5\" y=\"330\" width=\"33\" height=\"33\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"967\" y=\"363\" width=\"79\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_0lptyhz_di\" bpmnElement=\"RequestCancelledEndEvent\">\n        <dc:Bounds x=\"992.5\" y=\"441\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"984\" y=\"471\" width=\"49\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EventBasedGateway_03g6mga_di\" bpmnElement=\"GatewayGateway\">\n        <dc:Bounds x=\"508.5\" y=\"323\" width=\"48\" height=\"48\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"511\" y=\"371\" width=\"44\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_0lmkar8_di\" bpmnElement=\"OfferApprovedEvent\">\n        <dc:Bounds x=\"635.5\" y=\"216\" width=\"35\" height=\"35\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"616\" y=\"251\" width=\"75\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_0n4cdam_di\" bpmnElement=\"N24HoursEvent\">\n        <dc:Bounds x=\"635.5\" y=\"329\" width=\"35\" height=\"35\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"632\" y=\"364\" width=\"45\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_0oknvc2_di\" bpmnElement=\"N24HoursEvent1\">\n        <dc:Bounds x=\"839.5\" y=\"247\" width=\"35\" height=\"35\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"836\" y=\"282\" width=\"45\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_1vy79dn_di\" bpmnElement=\"CancelRequestEvent\">\n        <dc:Bounds x=\"640.5\" y=\"441\" width=\"30\" height=\"30\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"617\" y=\"471\" width=\"79\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SendTask_07zf11a_di\" bpmnElement=\"MakeFlyAndHotelOfferTask\">\n        <dc:Bounds x=\"323.5\" y=\"317\" width=\"104\" height=\"61\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SendTask_05wxp2q_di\" bpmnElement=\"RequestCreditCardInformationTask\">\n        <dc:Bounds x=\"777.5\" y=\"203\" width=\"104\" height=\"61\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SendTask_11fseq5_di\" bpmnElement=\"NotifyCustomerOfferExpiredTask\">\n        <dc:Bounds x=\"777.5\" y=\"317\" width=\"104\" height=\"61\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ServiceTask_0ym6hsb_di\" bpmnElement=\"UpdateCustomerRecordTask\">\n        <dc:Bounds x=\"785.5\" y=\"420\" width=\"96\" height=\"72\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_03stt9p_di\" bpmnElement=\"ReceiveTravelRequestStartEvent\">\n        <dc:Bounds x=\"174.5\" y=\"329\" width=\"35\" height=\"35\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"156\" y=\"364\" width=\"73\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0zafwi9_di\" bpmnElement=\"SequenceFlow_0zafwi9\">\n        <di:waypoint x=\"881.5\" y=\"456\" />\n        <di:waypoint x=\"992.5\" y=\"456\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0nqtgik_di\" bpmnElement=\"SequenceFlow_0nqtgik\">\n        <di:waypoint x=\"427.5\" y=\"347\" />\n        <di:waypoint x=\"508.5\" y=\"347\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0qen1he_di\" bpmnElement=\"SequenceFlow_0qen1he\">\n        <di:waypoint x=\"532.5\" y=\"323\" />\n        <di:waypoint x=\"532.5\" y=\"234\" />\n        <di:waypoint x=\"635.5\" y=\"234\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1ysz115_di\" bpmnElement=\"SequenceFlow_1ysz115\">\n        <di:waypoint x=\"556.5\" y=\"347\" />\n        <di:waypoint x=\"574.5\" y=\"347\" />\n        <di:waypoint x=\"574.5\" y=\"347\" />\n        <di:waypoint x=\"635.5\" y=\"347\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1sv6jqd_di\" bpmnElement=\"SequenceFlow_1sv6jqd\">\n        <di:waypoint x=\"532.5\" y=\"371\" />\n        <di:waypoint x=\"532.5\" y=\"456\" />\n        <di:waypoint x=\"640.5\" y=\"456\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1kwx6kg_di\" bpmnElement=\"SequenceFlow_1kwx6kg\">\n        <di:waypoint x=\"670.5\" y=\"234\" />\n        <di:waypoint x=\"688.5\" y=\"234\" />\n        <di:waypoint x=\"688.5\" y=\"234\" />\n        <di:waypoint x=\"776.5\" y=\"234\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1fp5smb_di\" bpmnElement=\"SequenceFlow_1fp5smb\">\n        <di:waypoint x=\"670.5\" y=\"456\" />\n        <di:waypoint x=\"785.5\" y=\"456\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1c22uay_di\" bpmnElement=\"SequenceFlow_1c22uay\">\n        <di:waypoint x=\"209.5\" y=\"347\" />\n        <di:waypoint x=\"226.5\" y=\"347\" />\n        <di:waypoint x=\"226.5\" y=\"347\" />\n        <di:waypoint x=\"323.5\" y=\"347\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_13g7fzw_di\" bpmnElement=\"SequenceFlow_13g7fzw\">\n        <di:waypoint x=\"881.5\" y=\"234\" />\n        <di:waypoint x=\"1106.5\" y=\"234\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"LSBPMNDiagram_1_0\">\n      <dc:Font name=\"arial,helvetica,sans-serif\" size=\"11\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n</semantic:definitions>\n"
  },
  {
    "path": "test/spec/features/outline/OutlineProvider.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:zeebe=\"http://camunda.org/schema/zeebe/1.0\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_0runo6g\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.23.0\" modeler:executionPlatform=\"Camunda Cloud\" modeler:executionPlatformVersion=\"8.2.0\">\n  <bpmn:collaboration id=\"Collaboration_0zr6kvh\">\n    <bpmn:participant id=\"Participant\" processRef=\"Process_0wvtx2g\" />\n    <bpmn:group id=\"Group\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_0wvtx2g\" isExecutable=\"true\">\n    <bpmn:dataObjectReference id=\"DataObject\" dataObjectRef=\"DataObject_0usa0me\" />\n    <bpmn:dataObject id=\"DataObject_0usa0me\" />\n    <bpmn:dataStoreReference id=\"DataStore\" />\n    <bpmn:subProcess id=\"SubProcess\">\n      <bpmn:startEvent id=\"Event\" name=\"label\" />\n      <bpmn:task id=\"Task\" />\n      <bpmn:exclusiveGateway id=\"Gateway\" />\n    </bpmn:subProcess>\n    <bpmn:callActivity id=\"CallActivity\">\n      <bpmn:extensionElements>\n        <zeebe:calledElement propagateAllChildVariables=\"false\" />\n      </bpmn:extensionElements>\n    </bpmn:callActivity>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_0zr6kvh\">\n      <bpmndi:BPMNShape id=\"Participant_1fsrebj_di\" bpmnElement=\"Participant\" isHorizontal=\"true\">\n        <dc:Bounds x=\"129\" y=\"117\" width=\"871\" height=\"423\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_0cawmpm_di\" bpmnElement=\"DataObject\">\n        <dc:Bounds x=\"252\" y=\"215\" width=\"36\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_0xv2i27_di\" bpmnElement=\"DataStore\">\n        <dc:Bounds x=\"245\" y=\"375\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0weis0d_di\" bpmnElement=\"CallActivity\">\n        <dc:Bounds x=\"830\" y=\"300\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1xbvt0p_di\" bpmnElement=\"SubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"420\" y=\"240\" width=\"330\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0dihp8i_di\" bpmnElement=\"Event\">\n        <dc:Bounds x=\"460\" y=\"322\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"466\" y=\"365\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0b3cy2o_di\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"530\" y=\"300\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_0px6pz2_di\" bpmnElement=\"Gateway\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"665\" y=\"315\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_1utiosm_di\" bpmnElement=\"Group\">\n        <dc:Bounds x=\"200\" y=\"179\" width=\"140\" height=\"300\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/outline/OutlineProviderSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\nimport outlineProviderModule from 'lib/features/outline';\n\nimport diagramXml from './OutlineProvider.bpmn';\n\nimport {\n  DATA_OBJECT_REFERENCE_OUTLINE_PATH,\n  DATA_STORE_REFERENCE_OUTLINE_PATH\n} from 'lib/features/outline/OutlineUtil';\n\nimport {\n  query as domQuery\n} from 'min-dom';\n\ndescribe('features/outline - outline provider', function() {\n  var testModules = [\n    coreModule,\n    modelingModule,\n    outlineProviderModule\n  ];\n\n\n  beforeEach(bootstrapModeler(diagramXml, { modules: testModules }));\n\n  describe('should provide outline for', function() {\n\n    it('event', inject(function(elementRegistry, outline) {\n\n      // given\n      var event = elementRegistry.get('Event');\n\n      // when\n      var outlineShape = outline.getOutline(event);\n\n      // then\n      expect(outlineShape).to.exist;\n      expect(outlineShape.tagName).to.eql('circle');\n    }));\n\n\n    it('task', inject(function(elementRegistry, outline) {\n\n      // given\n      var task = elementRegistry.get('Task');\n\n      // when\n      var outlineShape = outline.getOutline(task);\n\n      // then\n      expect(outlineShape).to.exist;\n      expect(outlineShape.tagName).to.eql('rect');\n    }));\n\n\n    it('call activity', inject(function(elementRegistry, outline) {\n\n      // given\n      var callActivity = elementRegistry.get('CallActivity');\n\n      // when\n      var outlineShape = outline.getOutline(callActivity);\n\n      // then\n      expect(outlineShape).to.exist;\n      expect(outlineShape.tagName).to.eql('rect');\n    }));\n\n\n    it('gateway', inject(function(elementRegistry, outline) {\n\n      // given\n      var gateway = elementRegistry.get('Gateway');\n\n      // when\n      var outlineShape = outline.getOutline(gateway);\n\n      // then\n      expect(outlineShape).to.exist;\n      expect(outlineShape.tagName).to.eql('rect');\n      expect(outlineShape.style.transform).to.eql('rotate(45deg)');\n    }));\n\n\n    it('sub process', inject(function(elementRegistry, outline) {\n\n      // given\n      var subProcess = elementRegistry.get('SubProcess');\n\n      // when\n      var outlineShape = outline.getOutline(subProcess);\n\n      // then\n      expect(outlineShape).to.exist;\n      expect(outlineShape.tagName).to.eql('rect');\n    }));\n\n\n    it('data object', inject(function(elementRegistry, outline) {\n\n      // given\n      var dataObject = elementRegistry.get('DataObject');\n\n      // when\n      var outlineShape = outline.getOutline(dataObject);\n\n      // then\n      expect(outlineShape).to.exist;\n      expect(outlineShape.tagName).to.eql('path');\n      expect(outlineShape.getAttribute('d')).to.eql(DATA_OBJECT_REFERENCE_OUTLINE_PATH);\n    }));\n\n\n    it('data store', inject(function(elementRegistry, outline) {\n\n      // given\n      var dataStore = elementRegistry.get('DataStore');\n\n      // when\n      var outlineShape = outline.getOutline(dataStore);\n\n      // then\n      expect(outlineShape).to.exist;\n      expect(outlineShape.tagName).to.eql('path');\n      expect(outlineShape.getAttribute('d')).to.eql(DATA_STORE_REFERENCE_OUTLINE_PATH);\n    }));\n\n  });\n\n\n  describe('update', function() {\n\n    describe('should update label', function() {\n\n      var DELTA = 3;\n\n      it('should update label according to label dimentions', inject(function(elementRegistry, selection, modeling) {\n\n        // given\n        var event = elementRegistry.get('Event');\n        var externalLabel = event.label;\n\n        selection.select(externalLabel);\n        var outlineShape = domQuery('.selected .djs-outline', outlineShape);\n\n        // then\n        let bounds = outlineShape.getBoundingClientRect();\n        expect(bounds.width).to.be.closeTo(34, DELTA);\n        expect(bounds.height).to.be.closeTo(24, DELTA);\n\n        // when\n        modeling.updateLabel(externalLabel, 'fooooooooooooooo');\n\n        // then\n        bounds = outlineShape.getBoundingClientRect();\n        expect(bounds.width).to.be.closeTo(93, DELTA);\n        expect(bounds.height).to.be.closeTo(37, DELTA);\n      }));\n\n    });\n\n\n    describe('should update dimensions on resize', function() {\n\n      it('sub process', inject(function(elementRegistry, outline, modeling) {\n\n        // given\n        var subProcess = elementRegistry.get('SubProcess');\n        var outlineShape = outline.getOutline(subProcess);\n\n        // when\n        modeling.resizeShape(subProcess, { x: 339, y: 142, width: 250, height: 250 });\n        outline.updateShapeOutline(outlineShape, subProcess);\n\n        // then\n        expect(outlineShape.getAttribute('width')).to.eql('260');\n        expect(outlineShape.getAttribute('height')).to.eql('260');\n      }));\n\n\n      it('group', inject(function(elementRegistry, outline, modeling) {\n\n        // given\n        var group = elementRegistry.get('Group');\n        var outlineShape = outline.getOutline(group);\n\n        // when\n        modeling.resizeShape(group, { x: 339, y: 142, width: 250, height: 250 });\n        outline.updateShapeOutline(outlineShape, group);\n\n        // then\n        expect(outlineShape.getAttribute('width')).to.eql('260');\n        expect(outlineShape.getAttribute('height')).to.eql('260');\n      }));\n\n    });\n\n  });\n});\n"
  },
  {
    "path": "test/spec/features/palette/PaletteProviderSpec.js",
    "content": "import {\n  bootstrapModeler,\n  getBpmnJS,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport createModule from 'diagram-js/lib/features/create';\nimport modelingModule from 'lib/features/modeling';\nimport paletteModule from 'lib/features/palette';\n\nimport { createMoveEvent } from 'diagram-js/lib/features/mouse/Mouse';\n\nimport { is } from 'lib/util/ModelUtil';\n\nimport {\n  createCanvasEvent as canvasEvent\n} from '../../../util/MockEvents';\n\nimport {\n  query as domQuery,\n  queryAll as domQueryAll\n} from 'min-dom';\n\n\ndescribe('features/palette', function() {\n\n  var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');\n\n  var testModules = [\n    coreModule,\n    createModule,\n    modelingModule,\n    paletteModule\n  ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  it('should provide BPMN modeling palette', inject(function(canvas) {\n\n    // when\n    var paletteElement = domQuery('.djs-palette', canvas._container);\n    var entries = domQueryAll('.entry', paletteElement);\n\n    // then\n    expect(entries.length).to.equal(14);\n  }));\n\n\n  describe('sub process', function() {\n\n    it('should create sub process with start event', inject(function(dragging) {\n\n      // when\n      triggerPaletteEntry('create.subprocess-expanded');\n\n      // then\n      var context = dragging.context(),\n          elements = context.data.elements;\n\n      expect(elements).to.have.length(2);\n      expect(is(elements[0], 'bpmn:SubProcess')).to.be.true;\n      expect(is(elements[1], 'bpmn:StartEvent')).to.be.true;\n      expect(elements[0].di.isExpanded).to.be.true;\n    }));\n\n\n    it('should select sub-process', inject(function(canvas, dragging, selection) {\n\n      // given\n      var rootElement = canvas.getRootElement(),\n          rootGfx = canvas.getGraphics(rootElement);\n\n      triggerPaletteEntry('create.subprocess-expanded');\n\n      // when\n      dragging.hover({ element: rootElement, gfx: rootGfx });\n\n      dragging.move(canvasEvent({ x: 100, y: 100 }));\n\n      // when\n      dragging.end();\n\n      // then\n      var selected = selection.get();\n\n      expect(selected).to.have.length(1);\n      expect(is(selected[0], 'bpmn:SubProcess')).to.be.true;\n    }));\n\n  });\n\n\n  describe('gateway', function() {\n\n    it('should set gateway marker', inject(function(dragging) {\n\n      // when\n      triggerPaletteEntry('create.exclusive-gateway');\n\n      // then\n      var context = dragging.context(),\n          elements = context.data.elements;\n\n      expect(elements).to.have.length(1);\n      expect(is(elements[0], 'bpmn:ExclusiveGateway')).to.be.true;\n      expect(elements[0].di.isMarkerVisible).to.be.true;\n    }));\n\n  });\n\n\n  describe('tools', function() {\n\n    it('should not fire <move> on globalConnect', inject(\n      function(eventBus) {\n\n        // given\n        var moveSpy = sinon.spy();\n\n        eventBus.on('global-connect.move', moveSpy);\n\n        // when\n        triggerPaletteEntry('global-connect-tool');\n\n        // then\n        expect(moveSpy).to.not.have.been.called;\n\n      }\n    ));\n\n  });\n\n});\n\n// helpers //////////\n\nfunction triggerPaletteEntry(id) {\n  getBpmnJS().invoke(function(palette) {\n    var entry = palette.getEntries()[ id ];\n\n    if (entry && entry.action && entry.action.click) {\n      entry.action.click(createMoveEvent(0, 0));\n    }\n  });\n}"
  },
  {
    "path": "test/spec/features/popup-menu/ReplaceMenuProvider.collapsedSubProcess.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.3.5\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"Task_1\" />\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <bpmn:outgoing>SequenceFlow_3</bpmn:outgoing>\n      <bpmn:startEvent id=\"StartEvent_1\">\n        <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n      </bpmn:startEvent>\n      <bpmn:task id=\"Task_2\">\n        <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n        <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n      </bpmn:task>\n      <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"Task_2\" />\n      <bpmn:endEvent id=\"EndEvent_1\">\n        <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"Task_2\" targetRef=\"EndEvent_1\" />\n    </bpmn:subProcess>\n    <bpmn:endEvent id=\"EndEvent_2\">\n      <bpmn:incoming>SequenceFlow_3</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_3\" sourceRef=\"SubProcess_1\" targetRef=\"EndEvent_2\" />\n    <bpmn:adHocSubProcess id=\"AdhocSubProcess_1\">\n      <bpmn:startEvent id=\"StartEvent_2\">\n        <bpmn:outgoing>SequenceFlow_4</bpmn:outgoing>\n      </bpmn:startEvent>\n      <bpmn:task id=\"Task_3\">\n        <bpmn:incoming>SequenceFlow_4</bpmn:incoming>\n        <bpmn:outgoing>SequenceFlow_5</bpmn:outgoing>\n      </bpmn:task>\n      <bpmn:endEvent id=\"EndEvent_3\">\n        <bpmn:incoming>SequenceFlow_5</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:sequenceFlow id=\"SequenceFlow_4\" sourceRef=\"StartEvent_2\" targetRef=\"Task_3\" />\n      <bpmn:sequenceFlow id=\"SequenceFlow_5\" sourceRef=\"Task_3\" targetRef=\"EndEvent_3\" />\n    </bpmn:adHocSubProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_0loe8m1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"149\" y=\"128\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_078mjn9_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"false\">\n        <dc:Bounds x=\"485\" y=\"128\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_06rrfr5_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"400\" y=\"150\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_06m6q8n_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"490\" y=\"128\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_09ygyhb_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"436\" y=\"168\" />\n        <di:waypoint x=\"490\" y=\"168\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EndEvent_1sgr4mk_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"652\" y=\"150\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_10kqeu3_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint x=\"590\" y=\"168\" />\n        <di:waypoint x=\"652\" y=\"168\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EndEvent_1tbfi2d_di\" bpmnElement=\"EndEvent_2\">\n        <dc:Bounds x=\"762\" y=\"232\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_18gyvps_di\" bpmnElement=\"SequenceFlow_3\">\n        <di:waypoint x=\"585\" y=\"168\" />\n        <di:waypoint x=\"670\" y=\"168\" />\n        <di:waypoint x=\"670\" y=\"250\" />\n        <di:waypoint x=\"762\" y=\"250\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"StartEvent_1kebej2_di\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds x=\"855\" y=\"150\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1qnpo60_di\" bpmnElement=\"Task_3\">\n        <dc:Bounds x=\"945\" y=\"128\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1ffetd8_di\" bpmnElement=\"SequenceFlow_4\">\n        <di:waypoint x=\"891\" y=\"168\" />\n        <di:waypoint x=\"945\" y=\"168\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EndEvent_0a4p737_di\" bpmnElement=\"EndEvent_3\">\n        <dc:Bounds x=\"1107\" y=\"150\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1qs2ip4_di\" bpmnElement=\"SequenceFlow_5\">\n        <di:waypoint x=\"1045\" y=\"168\" />\n        <di:waypoint x=\"1107\" y=\"168\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"AdHocSubProcess_0lfb35q_di\" bpmnElement=\"AdhocSubProcess_1\" isExpanded=\"false\">\n        <dc:Bounds x=\"940\" y=\"128\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/popup-menu/ReplaceMenuProvider.compensation-activity.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_bOa6QL90EeWDkOoe0mYe7w\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:task id=\"Task_1\" isForCompensation=\"true\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"116.0\" y=\"189.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/spec/features/popup-menu/ReplaceMenuProvider.conditionalFlows.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\" name=\"Hunger noticed\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Task_1\" name=\"Choose recipe\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_3</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n    <bpmn:task id=\"Task_2\" name=\"Bi Bim Bap\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"Task_1\" targetRef=\"Task_2\" />\n    <bpmn:task id=\"Task_3\" name=\"Dessert&#10;&#10;if starving&#10;\">\n      <bpmn:incoming>SequenceFlow_3</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_3\" sourceRef=\"Task_1\" targetRef=\"Task_3\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"160\" y=\"179\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"133\" y=\"215\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"289\" y=\"157\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"196\" y=\"197\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"289\" y=\"197\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"197.5\" y=\"187\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"497\" y=\"73\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_2_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"389\" y=\"197\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"443\" y=\"197\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"443\" y=\"113\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"497\" y=\"113\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"398\" y=\"145\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_3_di\" bpmnElement=\"Task_3\">\n        <dc:Bounds x=\"497\" y=\"238\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_3_di\" bpmnElement=\"SequenceFlow_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"389\" y=\"197\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"443\" y=\"197\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"443\" y=\"278\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"497\" y=\"278\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"398\" y=\"227.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/popup-menu/ReplaceMenuProvider.defaultFlows.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:exclusiveGateway id=\"ExclusiveGateway_1\" name=\"desired dish? \">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_3</bpmn:outgoing>\n    </bpmn:exclusiveGateway>\n    <bpmn:task id=\"Task_1\" name=\"Make a pizza\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"Task_1\" />\n    <bpmn:task id=\"Task_2\" name=\"cook salmon\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"Task_2\" />\n    <bpmn:task id=\"Task_3\" name=\"starve..\">\n      <bpmn:incoming>SequenceFlow_3</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_3\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"Task_3\" />\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>SequenceFlow_4</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Task_4\">\n      <bpmn:incoming>SequenceFlow_4</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_4\" sourceRef=\"StartEvent_1\" targetRef=\"Task_4\" />\n    <bpmn:task id=\"Task_1ei94kl\" name=\"what to say?\">\n      <bpmn:outgoing>SequenceFlow_15f5knn</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_10yqnek</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"Task_0t0m2c3\" name=\"hello\">\n      <bpmn:incoming>SequenceFlow_15f5knn</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_15f5knn\" sourceRef=\"Task_1ei94kl\" targetRef=\"Task_0t0m2c3\" />\n    <bpmn:task id=\"Task_15ymz00\" name=\"bye\">\n      <bpmn:incoming>SequenceFlow_10yqnek</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_10yqnek\" sourceRef=\"Task_1ei94kl\" targetRef=\"Task_15ymz00\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_1_di\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"452\" y=\"282\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"347\" y=\"305\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"636\" y=\"127\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"477\" y=\"282\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"477\" y=\"167\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"636\" y=\"167\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"432\" y=\"214.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"636\" y=\"267\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_2_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"502\" y=\"307\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"569\" y=\"307\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"569\" y=\"307\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"636\" y=\"307\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"524\" y=\"304.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_3_di\" bpmnElement=\"Task_3\">\n        <dc:Bounds x=\"636\" y=\"420\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_3_di\" bpmnElement=\"SequenceFlow_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"477\" y=\"332\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"477\" y=\"460\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"636\" y=\"460\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"432\" y=\"386\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"StartEvent_1_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"864\" y=\"289\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"837\" y=\"325\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_4_di\" bpmnElement=\"Task_4\">\n        <dc:Bounds x=\"1045\" y=\"267\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_4_di\" bpmnElement=\"SequenceFlow_4\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"900\" y=\"307\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"1045\" y=\"307\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"927.5\" y=\"297\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_1ei94kl_di\" bpmnElement=\"Task_1ei94kl\">\n        <dc:Bounds x=\"1261\" y=\"267\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0t0m2c3_di\" bpmnElement=\"Task_0t0m2c3\">\n        <dc:Bounds x=\"1474\" y=\"149\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_15f5knn_di\" bpmnElement=\"SequenceFlow_15f5knn\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"1311\" y=\"267\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"1311\" y=\"189\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"1474\" y=\"189\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"1371\" y=\"236\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_15ymz00_di\" bpmnElement=\"Task_15ymz00\">\n        <dc:Bounds x=\"1474\" y=\"383\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_10yqnek_di\" bpmnElement=\"SequenceFlow_10yqnek\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"1311\" y=\"347\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"1311\" y=\"423\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"1474\" y=\"423\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"1371\" y=\"350\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/popup-menu/ReplaceMenuProvider.defaultFlowsFromComplexGateways.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_1\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"ComplexGateway_1\" targetRef=\"Task_1\" />\n    <bpmn:ComplexGateway id=\"ComplexGateway_1\" default=\"SequenceFlow_1\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n    </bpmn:ComplexGateway>\n    <bpmn:task id=\"Task_2\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"ComplexGateway_1\" targetRef=\"Task_2\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"230\" y=\"25\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"156\" y=\"65\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"230\" y=\"65\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"168\" y=\"55\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"ComplexGateway_1_di\" bpmnElement=\"ComplexGateway_1\">\n        <dc:Bounds x=\"106\" y=\"40\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"86\" y=\"90\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"230\" y=\"134\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_2_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"131\" y=\"90\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"131\" y=\"174\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"230\" y=\"174\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"86\" y=\"122\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/popup-menu/ReplaceMenuProvider.defaultFlowsFromInclusiveGateways.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_1\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"InclusiveGateway_1\" targetRef=\"Task_1\" />\n    <bpmn:inclusiveGateway id=\"InclusiveGateway_1\" default=\"SequenceFlow_1\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n    </bpmn:inclusiveGateway>\n    <bpmn:task id=\"Task_2\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"InclusiveGateway_1\" targetRef=\"Task_2\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"230\" y=\"25\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"156\" y=\"65\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"230\" y=\"65\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"168\" y=\"55\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"InclusiveGateway_1_di\" bpmnElement=\"InclusiveGateway_1\">\n        <dc:Bounds x=\"106\" y=\"40\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"86\" y=\"90\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"230\" y=\"134\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_2_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"131\" y=\"90\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"131\" y=\"174\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"230\" y=\"174\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"86\" y=\"122\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/popup-menu/ReplaceMenuProvider.events.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_0yl4vso\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.7.1\">\n  <bpmn:process id=\"Process_07klzkj\" isExecutable=\"true\">\n    <bpmn:startEvent id=\"StartEvent\" />\n    <bpmn:intermediateThrowEvent id=\"IntermediateEvent\" />\n    <bpmn:endEvent id=\"EndEvent\" />\n    <bpmn:subProcess id=\"Activity_0vmnap0\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent\" attachedToRef=\"Activity_0vmnap0\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_07klzkj\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent\">\n        <dc:Bounds x=\"179\" y=\"79\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1nfgnhx_di\" bpmnElement=\"IntermediateEvent\">\n        <dc:Bounds x=\"342\" y=\"79\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0bbnae8_di\" bpmnElement=\"EndEvent\">\n        <dc:Bounds x=\"502\" y=\"79\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0vmnap0_di\" bpmnElement=\"Activity_0vmnap0\" isExpanded=\"true\">\n        <dc:Bounds x=\"185\" y=\"200\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0so9mwz_di\" bpmnElement=\"BoundaryEvent\">\n        <dc:Bounds x=\"332\" y=\"382\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/popup-menu/ReplaceMenuProvider.pools.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:collaboration id=\"Collaboration_1\">\n    <bpmn:participant id=\"Participant_1\" name=\"Participant 1\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Participant_2\" name=\"Participant 2\" processRef=\"Process_2\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>Flow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Task_1\">\n      <bpmn:incoming>Flow_1</bpmn:incoming>\n      <bpmn:outgoing>Flow_2</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"Flow_1\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n    <bpmn:endEvent id=\"EndEvent_1\">\n      <bpmn:incoming>Flow_2</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"Flow_2\" sourceRef=\"Task_1\" targetRef=\"EndEvent_1\" />\n  </bpmn:process>\n  <bpmn:process id=\"Process_2\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_1_di\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"170\" y=\"70\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_2_di\" bpmnElement=\"Flow_2\">\n        <di:waypoint x=\"490\" y=\"190\" />\n        <di:waypoint x=\"582\" y=\"190\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1_di\" bpmnElement=\"Flow_1\">\n        <di:waypoint x=\"298\" y=\"190\" />\n        <di:waypoint x=\"390\" y=\"190\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"StartEvent_1_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"262\" y=\"172\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"390\" y=\"150\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_1_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"582\" y=\"172\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_2_di\" bpmnElement=\"Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"170\" y=\"350\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/popup-menu/ReplaceMenuProvider.subProcesses.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.30.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess_1\">\n      <bpmn:task id=\"Activity_0j5zj2x\" />\n    </bpmn:subProcess>\n    <bpmn:adHocSubProcess id=\"AdhocSubProcess_1\">\n      <bpmn:task id=\"Activity_1j5hq1s\" />\n    </bpmn:adHocSubProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_0loe8m1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"160\" y=\"60\" width=\"360\" height=\"210\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0j5zj2x_di\" bpmnElement=\"Activity_0j5zj2x\">\n        <dc:Bounds x=\"290\" y=\"120\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"AdHocSubProcess_0lfb35q_di\" bpmnElement=\"AdhocSubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"600\" y=\"65\" width=\"360\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_14akb0e\" bpmnElement=\"Activity_1j5hq1s\">\n        <dc:Bounds x=\"740\" y=\"120\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/popup-menu/ReplaceMenuProviderSpec.js",
    "content": "import { expectToBeAccessible } from '@bpmn-io/a11y';\n\nimport {\n  bootstrapModeler,\n  getBpmnJS,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  createEvent as globalEvent\n} from '../../../util/MockEvents';\n\nimport autoResizeModule from 'lib/features/auto-resize';\nimport coreModule from 'lib/core';\nimport customRulesModule from '../../../util/custom-rules';\nimport modelingModule from 'lib/features/modeling';\nimport replaceMenuProviderModule from 'lib/features/popup-menu';\n\nimport camundaModdleModule from 'camunda-bpmn-moddle/lib';\nimport camundaPackage from 'camunda-bpmn-moddle/resources/camunda.json';\n\nimport {\n  query as domQuery,\n  queryAll as domQueryAll,\n  classes as domClasses\n} from 'min-dom';\n\nimport { is } from 'lib/util/ModelUtil';\n\nimport { isExpanded } from 'lib/util/DiUtil';\nimport { getBusinessObject } from '../../../../lib/util/ModelUtil';\nimport { omit } from 'min-dash';\n\n\ndescribe('features/popup-menu - replace menu provider', function() {\n\n  var diagramXMLMarkers = require('../../../fixtures/bpmn/draw/activity-markers-simple.bpmn'),\n      diagramXMLReplace = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn'),\n      diagramXMLDataElements = require('../../../fixtures/bpmn/features/replace/data-elements.bpmn'),\n      diagramXMLDataStoresPositionedAgainstParticipant = require('../../../fixtures/bpmn/features/replace/data-stores-positioned-against-participant.bpmn'),\n      diagramXMLParticipants = require('../../../fixtures/bpmn/features/replace/participants.bpmn');\n\n  var testModules = [\n    coreModule,\n    modelingModule,\n    replaceMenuProviderModule,\n    customRulesModule\n  ];\n\n\n  describe('data object - collection marker', function() {\n\n    beforeEach(bootstrapModeler(diagramXMLDataElements, { modules: testModules }));\n\n\n    it('should toggle on', inject(function(elementRegistry) {\n\n      // given\n      var dataObjectReference = elementRegistry.get('DataObjectReference_1');\n\n      openPopup(dataObjectReference);\n\n      // when\n      triggerAction('toggle-is-collection');\n\n      openPopup(dataObjectReference);\n\n      var isCollectionMarker = queryEntry('toggle-is-collection');\n\n      // then\n      expect(domClasses(isCollectionMarker).has('active')).to.be.true;\n      expect(dataObjectReference.businessObject.dataObjectRef.isCollection).to.be.true;\n    }));\n\n\n    it('should undo', inject(function(commandStack, elementRegistry) {\n\n      // given\n      var dataObjectReference = elementRegistry.get('DataObjectReference_1');\n\n      openPopup(dataObjectReference);\n\n      triggerAction('toggle-is-collection');\n\n      // when\n      commandStack.undo();\n\n      openPopup(dataObjectReference);\n\n      var isCollectionMarker = queryEntry('toggle-is-collection');\n\n      // then\n      expect(domClasses(isCollectionMarker).has('active')).to.be.false;\n      expect(dataObjectReference.businessObject.dataObjectRef.isCollection).not.to.be.true;\n    }));\n\n\n    it('should redo', inject(function(commandStack, elementRegistry) {\n\n      // given\n      var dataObjectReference = elementRegistry.get('DataObjectReference_1');\n\n      openPopup(dataObjectReference);\n\n      triggerAction('toggle-is-collection');\n\n      commandStack.undo();\n\n      // when\n      commandStack.redo();\n\n      openPopup(dataObjectReference);\n\n      var isCollectionMarker = queryEntry('toggle-is-collection');\n\n      // then\n      expect(domClasses(isCollectionMarker).has('active')).to.be.true;\n      expect(dataObjectReference.businessObject.dataObjectRef.isCollection).to.be.true;\n    }));\n\n\n    it('should toggle off', inject(function(elementRegistry) {\n\n      // given\n      var dataObjectReference = elementRegistry.get('DataObjectReference_1');\n\n      openPopup(dataObjectReference);\n\n      triggerAction('toggle-is-collection');\n\n      openPopup(dataObjectReference);\n\n      // when\n      triggerAction('toggle-is-collection');\n\n      openPopup(dataObjectReference);\n\n      var isCollectionMarker = queryEntry('toggle-is-collection');\n\n      // then\n      expect(domClasses(isCollectionMarker).has('active')).to.be.false;\n      expect(dataObjectReference.businessObject.dataObjectRef.isCollection).to.be.false;\n    }));\n\n\n    it('should activate marker of linked data object reference', inject(function(elementRegistry) {\n\n      // given\n      var dataObjectReference1 = elementRegistry.get('DataObjectReference_1');\n      var dataObjectReference2 = elementRegistry.get('DataObjectReference_2');\n\n      openPopup(dataObjectReference1);\n\n      // when\n      triggerAction('toggle-is-collection');\n\n      openPopup(dataObjectReference2);\n\n      var isCollectionMarker = queryEntry('toggle-is-collection');\n\n      // then\n      expect(domClasses(isCollectionMarker).has('active')).to.be.true;\n    }));\n\n\n    it('should deactivate marker of linked data object reference', inject(function(elementRegistry) {\n\n      // given\n      var dataObjectReference1 = elementRegistry.get('DataObjectReference_1');\n      var dataObjectReference2 = elementRegistry.get('DataObjectReference_2');\n\n      openPopup(dataObjectReference1);\n\n      triggerAction('toggle-is-collection');\n\n      openPopup(dataObjectReference1);\n\n      // when\n      triggerAction('toggle-is-collection');\n\n      openPopup(dataObjectReference2);\n\n      var isCollectionMarker = queryEntry('toggle-is-collection');\n\n      // then\n      expect(domClasses(isCollectionMarker).has('active')).to.be.false;\n    }));\n\n  });\n\n\n  describe('participants - multiplicity marker', function() {\n\n    beforeEach(bootstrapModeler(diagramXMLParticipants, { modules: testModules }));\n\n\n    it('should toggle on', inject(function(elementRegistry) {\n\n      // given\n      var participant = elementRegistry.get('Participant_1');\n\n      openPopup(participant);\n\n      // when\n      triggerAction('toggle-participant-multiplicity');\n\n      openPopup(participant);\n\n      var multiplicityMarker = queryEntry('toggle-participant-multiplicity');\n\n      // then\n      expect(domClasses(multiplicityMarker).has('active')).to.be.true;\n      expect(participant.businessObject.participantMultiplicity).to.exist;\n    }));\n\n\n    it('should undo', inject(function(commandStack, elementRegistry) {\n\n      // given\n      var participant = elementRegistry.get('Participant_1');\n\n      openPopup(participant);\n\n      triggerAction('toggle-participant-multiplicity');\n\n      // when\n      commandStack.undo();\n\n      openPopup(participant);\n\n      var multiplicityMarker = queryEntry('toggle-participant-multiplicity');\n\n      // then\n      expect(domClasses(multiplicityMarker).has('active')).to.be.false;\n      expect(participant.businessObject.participantMultiplicity).not.to.exist;\n    }));\n\n\n    it('should redo', inject(function(commandStack, elementRegistry) {\n\n      // given\n      var participant = elementRegistry.get('Participant_1');\n\n      openPopup(participant);\n\n      triggerAction('toggle-participant-multiplicity');\n\n      commandStack.undo();\n\n      // when\n      commandStack.redo();\n\n      openPopup(participant);\n\n      var multiplicityMarker = queryEntry('toggle-participant-multiplicity');\n\n      // then\n      expect(domClasses(multiplicityMarker).has('active')).to.be.true;\n      expect(participant.businessObject.participantMultiplicity).to.exist;\n    }));\n\n\n    it('should toggle off', inject(function(elementRegistry) {\n\n      // given\n      var participant = elementRegistry.get('Participant_1');\n\n      openPopup(participant);\n\n      triggerAction('toggle-participant-multiplicity');\n\n      openPopup(participant);\n\n      // when\n      triggerAction('toggle-participant-multiplicity');\n\n      openPopup(participant);\n\n      var multiplicityMarker = queryEntry('toggle-participant-multiplicity');\n\n      // then\n      expect(domClasses(multiplicityMarker).has('active')).to.be.false;\n      expect(participant.businessObject.participantMultiplicity).not.to.exist;\n    }));\n\n  });\n\n\n  describe('toggle', function() {\n\n    beforeEach(bootstrapModeler(diagramXMLMarkers,{\n      modules: Object.assign(testModules, camundaModdleModule),\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n    var toggleActive;\n\n    beforeEach(inject(function(popupMenu) {\n      toggleActive = function(entryCls) {\n        return popupMenu._getEntry(entryCls).active;\n      };\n    }));\n\n\n    describe('active attribute', function() {\n\n      it('should be true for parallel marker', inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('ParallelTask'),\n            loopCharacteristics = task.businessObject.loopCharacteristics;\n\n        // assume\n        expect(loopCharacteristics.isSequential).to.be.false;\n        expect(loopCharacteristics.isSequential).to.exist;\n\n        // when\n        openPopup(task);\n\n        // then\n        expect(is(loopCharacteristics, 'bpmn:MultiInstanceLoopCharacteristics')).to.be.true;\n\n        expect(toggleActive('toggle-parallel-mi')).to.be.true;\n      }));\n\n\n      it('should be true for sequential marker', inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('SequentialTask'),\n            loopCharacteristics = task.businessObject.loopCharacteristics;\n\n        // assume\n        expect(loopCharacteristics.isSequential).to.be.true;\n        expect(is(loopCharacteristics, 'bpmn:MultiInstanceLoopCharacteristics')).to.be.true;\n\n        // when\n        openPopup(task);\n\n        // then\n        expect(toggleActive('toggle-sequential-mi')).to.be.true;\n      }));\n\n\n      it('should be true for loop marker', inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('LoopTask'),\n            loopCharacteristics = task.businessObject.loopCharacteristics;\n\n        // assume\n        expect(loopCharacteristics.isSequential).not.to.exist;\n        expect(is(loopCharacteristics, 'bpmn:MultiInstanceLoopCharacteristics')).to.be.false;\n\n        // when\n        openPopup(task);\n\n        // then\n        expect(toggleActive('toggle-loop')).to.be.true;\n      }));\n\n    });\n\n\n    describe('parallel toggle button', function() {\n\n      it('should toggle parallel marker off',\n        inject(function(elementRegistry) {\n\n          // given\n          var task = elementRegistry.get('ParallelTask');\n\n          openPopup(task);\n\n          // when\n          triggerAction('toggle-parallel-mi');\n\n          openPopup(task);\n\n          var parallelEntry = queryEntry('toggle-parallel-mi');\n\n          // then\n          expect(task.businessObject.loopCharacteristics).not.to.exist;\n          expect(domClasses(parallelEntry).has('active')).to.be.false;\n        })\n      );\n\n\n      it('should toggle parallel marker on', inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task');\n\n        openPopup(task);\n\n        // when\n        triggerAction('toggle-parallel-mi');\n\n        openPopup(task);\n\n        var parallelEntry = queryEntry('toggle-parallel-mi');\n\n        // then\n        expect(domClasses(parallelEntry).has('active')).to.be.true;\n        expect(task.businessObject.loopCharacteristics.isSequential).to.be.false;\n        expect(is(task.businessObject.loopCharacteristics, 'bpmn:MultiInstanceLoopCharacteristics')).to.be.true;\n      }));\n\n\n      it('should set sequential button inactive', inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('SequentialTask');\n\n        openPopup(task);\n\n        // when\n        triggerAction('toggle-parallel-mi');\n\n        openPopup(task);\n\n        var sequentialEntry = queryEntry('toggle-sequential-mi');\n\n        // then\n        expect(domClasses(sequentialEntry).has('active')).to.be.false;\n      }));\n\n\n      it('should set loop button inactive', inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('LoopTask');\n\n        openPopup(task);\n\n        // when\n        triggerAction('toggle-parallel-mi');\n\n        openPopup(task);\n\n        var loopEntry = queryEntry('toggle-loop');\n\n        // then\n        expect(domClasses(loopEntry).has('active')).to.be.false;\n      }));\n\n\n      it('should set loop characteristics type', inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('LoopTask'),\n            businessObject = getBusinessObject(task);\n\n        openPopup(task);\n\n        // when\n        triggerAction('toggle-parallel-mi');\n\n        // then\n        var newLoopCharacteristics = businessObject.loopCharacteristics;\n\n        expect(is(newLoopCharacteristics, 'bpmn:MultiInstanceLoopCharacteristics')).to.be.true;\n        expect(newLoopCharacteristics.isSequential).to.be.false;\n      }));\n\n\n      it('should keep sequential properties', inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('SequentialTask'),\n            businessObject = getBusinessObject(task),\n            loopCharacteristics = businessObject.get('loopCharacteristics');\n\n        openPopup(task);\n\n        // assume\n        expect(loopCharacteristics.get('isSequential')).to.be.true;\n\n        // when\n        triggerAction('toggle-parallel-mi');\n\n        // then\n        const newLoopCharacteristics = businessObject.get('loopCharacteristics');\n\n        expect(newLoopCharacteristics).to.equal(loopCharacteristics);\n        expect(newLoopCharacteristics.get('isSequential')).to.be.false;\n        expect(omit(newLoopCharacteristics, 'isSequential')).to.eql(omit(loopCharacteristics, 'isSequential'));\n      }));\n\n    });\n\n\n    describe('sequential toggle button', function() {\n\n      it('should toggle sequential marker off', inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('SequentialTask');\n\n        openPopup(task);\n\n        // when\n        triggerAction('toggle-sequential-mi');\n\n        openPopup(task);\n\n        var sequentialEntry = queryEntry('toggle-sequential-mi');\n\n        // then\n        expect(task.businessObject.loopCharacteristics).not.to.exist;\n        expect(domClasses(sequentialEntry).has('active')).to.be.false;\n      }));\n\n\n      it('should toggle sequential marker on', inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task');\n\n        openPopup(task);\n\n        // when\n        triggerAction('toggle-sequential-mi');\n\n        openPopup(task);\n\n        var sequentialEntry = queryEntry('toggle-sequential-mi');\n\n        // then\n        expect(domClasses(sequentialEntry).has('active')).to.be.true;\n        expect(task.businessObject.loopCharacteristics.isSequential).to.be.true;\n        expect(is(task.businessObject.loopCharacteristics, 'bpmn:MultiInstanceLoopCharacteristics')).to.be.true;\n      }));\n\n\n      it('should set loop button inactive', inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('LoopTask');\n\n        openPopup(task);\n\n        // when\n        triggerAction('toggle-sequential-mi');\n\n        openPopup(task);\n\n        var loopEntry = queryEntry('toggle-loop');\n\n        // then\n        expect(domClasses(loopEntry).has('active')).to.be.false;\n      }));\n\n\n      it('should set parallel button inactive', inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('ParallelTask');\n\n        openPopup(task);\n\n        // when\n        triggerAction('toggle-sequential-mi');\n\n        openPopup(task);\n\n        var parallelEntry = queryEntry('toggle-parallel-mi');\n\n        // then\n        expect(domClasses(parallelEntry).has('active')).to.be.false;\n      }));\n\n\n      it('should set loop characteristics type', inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('LoopTask'),\n            businessObject = getBusinessObject(task);\n\n        openPopup(task);\n\n        // when\n        triggerAction('toggle-sequential-mi');\n\n        // then\n        var newLoopCharacteristics = businessObject.loopCharacteristics;\n\n        expect(is(newLoopCharacteristics, 'bpmn:MultiInstanceLoopCharacteristics')).to.be.true;\n        expect(newLoopCharacteristics.isSequential).to.be.true;\n      }));\n\n\n      it('should keep parallel properties', inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('ParallelTask'),\n            businessObject = getBusinessObject(task),\n            loopCharacteristics = businessObject.get('loopCharacteristics');\n\n        openPopup(task);\n\n        // assume\n        expect(loopCharacteristics.get('isSequential')).to.be.false;\n\n        // when\n        triggerAction('toggle-sequential-mi');\n\n        // then\n        var newLoopCharacteristics = businessObject.get('loopCharacteristics');\n\n        expect(newLoopCharacteristics).to.equal(loopCharacteristics);\n        expect(newLoopCharacteristics.get('isSequential')).to.be.true;\n        expect(omit(newLoopCharacteristics, 'isSequential')).to.eql(omit(loopCharacteristics, 'isSequential'));\n      }));\n\n    });\n\n\n    describe('loop toggle button', function() {\n\n      it('should toggle loop marker off', inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('LoopTask');\n\n        openPopup(task);\n\n        // when\n        triggerAction('toggle-loop');\n\n        openPopup(task);\n\n        var loopEntry = queryEntry('toggle-loop');\n\n        // then\n        expect(domClasses(loopEntry).has('active')).to.be.false;\n        expect(is(task.businessObject.loopCharacteristics, 'bpmn:MultiInstanceLoopCharacteristics')).not.to.exist;\n      }));\n\n\n      it('should toggle loop marker on', inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('Task');\n\n        openPopup(task);\n\n        // when\n        triggerAction('toggle-loop');\n\n        openPopup(task);\n\n        var loopEntry = queryEntry('toggle-loop');\n\n        // then\n        expect(domClasses(loopEntry).has('active')).to.be.true;\n        expect(is(task.businessObject.loopCharacteristics, 'bpmn:StandardLoopCharacteristics')).to.be.true;\n      }));\n\n\n      it('should set sequential button inactive', inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('SequentialTask');\n\n        openPopup(task);\n\n        triggerAction('toggle-loop');\n\n        // when\n        openPopup(task);\n\n        var sequentialEntry = queryEntry('toggle-sequential-mi');\n\n        // then\n        expect(domClasses(sequentialEntry).has('active')).to.be.false;\n      }));\n\n\n      it('should set parallel button inactive', inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('ParallelTask');\n\n        openPopup(task);\n\n        // when\n        triggerAction('toggle-loop');\n\n        openPopup(task);\n\n        var parallelEntry = queryEntry('toggle-parallel-mi');\n\n        // then\n        expect(domClasses(parallelEntry).has('active')).to.be.false;\n      }));\n\n\n      it('should set loop characteristics type', inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('SequentialTask'),\n            businessObject = getBusinessObject(task);\n\n        openPopup(task);\n\n        // when\n        triggerAction('toggle-loop');\n\n        // then\n        var newLoopCharacteristics = businessObject.loopCharacteristics;\n\n        expect(is(newLoopCharacteristics, 'bpmn:StandardLoopCharacteristics')).to.be.true;\n        expect(newLoopCharacteristics.isSequential).to.be.undefined;\n      }));\n    });\n\n\n    describe('non-interrupting toggle', function() {\n      beforeEach(bootstrapModeler(diagramXMLReplace,{\n        modules: Object.assign(testModules, camundaModdleModule),\n        moddleExtensions: {\n          camunda: camundaPackage\n        }\n      }));\n\n      describe('start events', function() {\n\n        it('should toggle non-interrupting marker off', inject(function(bpmnReplace, elementRegistry) {\n\n          // given\n          var event = elementRegistry.get('StartEvent_3');\n\n          openPopup(event);\n\n          // when\n          triggerAction('toggle-non-interrupting');\n\n          openPopup(event);\n\n          var nonInterruptingEntry = queryEntry('toggle-non-interrupting');\n\n          // then\n          expect(event.businessObject.isInterrupting).to.be.true;\n          expect(domClasses(nonInterruptingEntry).has('active')).to.be.false;\n        }));\n\n\n        it('should toggle non-interrupting marker on', inject(function(bpmnReplace, elementRegistry) {\n\n          // given\n          var event = elementRegistry.get('StartEvent_6');\n\n          openPopup(event);\n\n          // when\n          triggerAction('toggle-non-interrupting');\n\n          openPopup(event);\n\n          var nonInterruptingEntry = queryEntry('toggle-non-interrupting');\n\n          // then\n          expect(event.businessObject.isInterrupting).to.be.false;\n          expect(domClasses(nonInterruptingEntry).has('active')).to.be.true;\n        }));\n\n      });\n\n\n      describe('boundary events', function() {\n\n        it('should toggle non-interrupting marker off', inject(function(bpmnReplace, elementRegistry) {\n\n          // given\n          var event = elementRegistry.get('BoundaryEvent_1');\n\n          openPopup(event);\n\n          // when\n          triggerAction('toggle-non-interrupting');\n\n          openPopup(event);\n\n          var nonInterruptingEntry = queryEntry('toggle-non-interrupting');\n\n          // then\n          expect(event.businessObject.cancelActivity).to.be.true;\n          expect(domClasses(nonInterruptingEntry).has('active')).to.be.false;\n        }));\n\n\n        it('should toggle non-interrupting marker on', inject(function(bpmnReplace, elementRegistry) {\n\n          // given\n          var event = elementRegistry.get('BoundaryEvent_2');\n\n          openPopup(event);\n\n          // when\n          triggerAction('toggle-non-interrupting');\n\n          openPopup(event);\n\n          var nonInterruptingEntry = queryEntry('toggle-non-interrupting');\n\n          // then\n          expect(event.businessObject.cancelActivity).to.be.false;\n          expect(domClasses(nonInterruptingEntry).has('active')).to.be.true;\n        }));\n\n      });\n\n    });\n\n\n    describe('integration', function() {\n\n      it('should toggle sequential -> undo to parallel', inject(function(elementRegistry, commandStack) {\n\n        // given\n        var task = elementRegistry.get('ParallelTask');\n\n        openPopup(task);\n\n        // when\n        triggerAction('toggle-sequential-mi');\n\n        commandStack.undo();\n\n        // then\n        const bo = getBusinessObject(task),\n              loopCharacteristics = bo.get('loopCharacteristics');\n\n        expect(is(loopCharacteristics, 'bpmn:MultiInstanceLoopCharacteristics')).to.be.true;\n        expect(loopCharacteristics.isSequential).to.be.false;\n      }));\n\n\n      it('should toggle parallel -> undo to parallel', inject(function(elementRegistry, commandStack) {\n\n        // given\n        var task = elementRegistry.get('ParallelTask');\n\n        openPopup(task);\n\n        // when\n        triggerAction('toggle-parallel-mi');\n\n        commandStack.undo();\n\n        // then\n        const bo = getBusinessObject(task),\n              loopCharacteristics = bo.get('loopCharacteristics');\n\n        expect(is(loopCharacteristics, 'bpmn:MultiInstanceLoopCharacteristics')).to.be.true;\n        expect(loopCharacteristics.isSequential).to.be.false;\n      }));\n\n\n      it('should toggle loop -> undo to parallel', inject(function(elementRegistry, commandStack) {\n\n        // given\n        var task = elementRegistry.get('ParallelTask');\n\n        openPopup(task);\n\n        // when\n        triggerAction('toggle-loop');\n\n        commandStack.undo();\n\n        // then\n        const bo = getBusinessObject(task),\n              loopCharacteristics = bo.get('loopCharacteristics');\n\n        expect(is(loopCharacteristics, 'bpmn:MultiInstanceLoopCharacteristics')).to.be.true;\n        expect(loopCharacteristics.isSequential).to.be.false;\n      }));\n    });\n\n  });\n\n\n  describe('replacing', function() {\n\n    beforeEach(bootstrapModeler(diagramXMLMarkers, { modules: testModules }));\n\n    it('should retain the loop characteristics', inject(function(elementRegistry) {\n\n      // given\n      var task = elementRegistry.get('SequentialTask');\n\n      openPopup(task);\n\n      // when\n      // replacing the task with a send task\n      var sendTask = triggerAction('replace-with-send-task');\n\n      // then\n      expect(sendTask.businessObject.loopCharacteristics).to.exist;\n      expect(sendTask.businessObject.loopCharacteristics.isSequential).to.be.true;\n      expect(is(sendTask.businessObject.loopCharacteristics, 'bpmn:MultiInstanceLoopCharacteristics')).to.be.true;\n    }));\n\n\n    it('should retain the loop characteristics for call activites',\n      inject(function(elementRegistry) {\n\n        // given\n        var task = elementRegistry.get('SequentialTask');\n\n        openPopup(task);\n\n        // when\n        // replacing the task with a call activity\n        var callActivity = triggerAction('replace-with-call-activity');\n\n        // then\n        expect(callActivity.businessObject.loopCharacteristics).to.exist;\n        expect(callActivity.businessObject.loopCharacteristics.isSequential).to.be.true;\n        expect(is(callActivity.businessObject.loopCharacteristics, 'bpmn:MultiInstanceLoopCharacteristics')).to.be.true;\n      })\n    );\n\n\n    it('should retain expanded status for sub processes',\n      inject(function(elementRegistry) {\n\n        // given\n        var subProcess = elementRegistry.get('SubProcess');\n\n        openPopup(subProcess);\n\n        // when\n        // replacing the expanded sub process with a transaction\n        var transaction = triggerAction('replace-with-transaction');\n\n        // then\n        expect(isExpanded(transaction)).to.equal(isExpanded(subProcess));\n      })\n    );\n\n\n    it('should replace sub processes -> event sub process',\n      inject(function(elementRegistry) {\n\n        // given\n        var subProcess = elementRegistry.get('SubProcess');\n\n        openPopup(subProcess);\n\n        // when\n        // replacing the expanded sub process with a eventSubProcess\n        var eventSubProcess = triggerAction('replace-with-event-subprocess');\n\n        // then\n        expect(eventSubProcess.businessObject.triggeredByEvent).to.be.true;\n      })\n    );\n\n\n    it('should replace event sub processes -> sub process',\n      inject(function(elementRegistry) {\n\n        // given\n        var eventSubProcess = elementRegistry.get('EventSubProcess');\n\n        openPopup(eventSubProcess);\n\n        // when\n        // replacing the expanded sub process with a eventSubProcess\n        var subProcess = triggerAction('replace-with-subprocess');\n\n        // then\n        expect(subProcess.businessObject.triggeredByEvent).to.be.false;\n      })\n    );\n\n\n    it('should retain the loop characteristics and the expanded status for transactions',\n      inject(function(elementRegistry) {\n\n        // given\n        var transaction = elementRegistry.get('Transaction');\n\n        openPopup(transaction);\n\n        // when\n        // replacing the transaction with an expanded sub process\n        var subProcess = triggerAction('replace-with-subprocess');\n\n        // then\n        expect(isExpanded(subProcess)).to.equal(isExpanded(transaction));\n      })\n    );\n\n\n    it('should not retain the loop characteristics morphing to an event sub process',\n      inject(function(bpmnFactory, elementRegistry, modeling) {\n\n        // given\n        var transaction = elementRegistry.get('Transaction');\n\n        modeling.updateProperties(transaction, {\n          loopCharacteristics: bpmnFactory.create('bpmn:MultiInstanceLoopCharacteristics', {\n            isParallel: true\n          })\n        });\n\n        openPopup(transaction);\n\n        // when\n        // replacing the transaction with an event sub process\n        var subProcess = triggerAction('replace-with-event-subprocess');\n\n        // then\n        expect(isExpanded(subProcess)).to.equal(isExpanded(transaction));\n      })\n    );\n\n\n    it('should retain the expanded property morphing to an event sub processes',\n      inject(function(elementRegistry) {\n\n        // given\n        var transaction = elementRegistry.get('Transaction');\n\n        openPopup(transaction);\n\n        // when\n        // replacing the transaction with an expanded sub process\n        var eventSubProcess = triggerAction('replace-with-event-subprocess');\n\n        // then\n        expect(isExpanded(eventSubProcess)).to.equal(isExpanded(transaction));\n      })\n    );\n\n\n    it('should replace sub processes -> ad hoc sub process',\n      inject(function(elementRegistry) {\n\n        // given\n        var subprocess = elementRegistry.get('SubProcess');\n\n        openPopup(subprocess);\n\n        // when\n        var adHocSubProcess = triggerAction('replace-with-ad-hoc-subprocess');\n\n        // then\n        expect(adHocSubProcess.type).to.equal('bpmn:AdHocSubProcess');\n      })\n    );\n\n\n    it('should replace interrupting event <-> non-interrupting event',\n      inject(function(elementRegistry) {\n\n        // given\n        const event = elementRegistry.get('MessageStartEvent');\n\n        // when\n        openPopup(event);\n        const nonInterruptingEvent = triggerAction('replace-with-non-interrupting-message-start');\n\n        // then\n        expect(nonInterruptingEvent.businessObject.isInterrupting, 'isInterrupting').to.be.false;\n\n        // when\n        openPopup(nonInterruptingEvent);\n        const interruptingEvent = triggerAction('replace-with-message-start');\n\n        // then\n        expect(interruptingEvent.businessObject.isInterrupting, 'isInterrupting').to.be.true;\n      })\n    );\n  });\n\n\n  describe('replace menu', function() {\n\n    describe('events', function() {\n\n      beforeEach(bootstrapModeler(diagramXMLReplace, { modules: testModules }));\n\n      it('should contain all except the current one',\n        inject(function(elementRegistry) {\n\n          // given\n          var startEvent = elementRegistry.get('StartEvent_1');\n\n          // when\n          openPopup(startEvent);\n\n          // then\n          expect(queryEntry('replace-with-none-start')).to.be.null;\n          expect(queryBodyEntries()).to.have.length(6);\n        })\n      );\n\n\n      it('should contain all start events inside event sub process except the current one',\n        inject(function(elementRegistry) {\n\n          // given\n          var startEvent = elementRegistry.get('StartEvent_3');\n\n          // when\n          openPopup(startEvent);\n\n          // then\n          expect(queryEntry('replace-with-non-interrupting-message-start')).to.be.null;\n          expect(queryEntry('replace-with-message-start')).to.exist;\n\n          expect(queryBodyEntries()).to.have.length(14);\n        })\n      );\n\n\n      it('should contain all non interrupting start events inside event sub process except the current one',\n        inject(function(bpmnReplace, elementRegistry) {\n\n          // given\n          var startEvent = elementRegistry.get('StartEvent_3');\n\n          var newElement = bpmnReplace.replaceElement(startEvent, {\n            type: 'bpmn:StartEvent',\n            eventDefinitionType: 'bpmn:ConditionalEventDefinition',\n            isInterrupting: false\n          });\n\n          // when\n          openPopup(newElement);\n\n          // then\n          expect(queryEntry('replace-with-conditional-start')).to.exist;\n          expect(queryEntry('replace-with-non-interrupting-conditional-start')).to.be.null;\n\n          expect(queryBodyEntries()).to.have.length(12);\n        })\n      );\n\n\n      it('should include non-interrupting toggle for non interrupting start event',\n        inject(function(elementRegistry) {\n\n          // given\n          var startEvent = elementRegistry.get('StartEvent_3');\n\n          // when\n          openPopup(startEvent);\n\n          // then\n          expect(queryEntry('toggle-non-interrupting')).to.exist;\n        })\n      );\n\n\n      it('should include non-interrupting toggle for interrupting start event',\n        inject(function(elementRegistry) {\n\n          // given\n          var startEvent = elementRegistry.get('StartEvent_6');\n\n          // when\n          openPopup(startEvent);\n\n          // then\n          expect(queryEntry('toggle-non-interrupting')).to.exist;\n        })\n      );\n\n\n      it('should NOT include non-interrupting toggle for start events that must be interrupting',\n        inject(function(bpmnReplace, elementRegistry) {\n\n          // given\n          var startEvent = elementRegistry.get('StartEvent_3');\n\n          var newElement = bpmnReplace.replaceElement(startEvent, {\n            type: 'bpmn:StartEvent'\n          });\n\n          // when\n          openPopup(newElement);\n\n          // then\n          expect(queryEntry('toggle-non-interrupting')).not.to.exist;\n        })\n      );\n\n\n      it('should contain only start event, end event and intermediate throw event inside sub process except the current one',\n        inject(function(elementRegistry) {\n\n          // given\n          var startEvent = elementRegistry.get('StartEvent_2');\n\n          // when\n          openPopup(startEvent);\n\n          // then\n          expect(queryEntry('replace-with-message-start')).to.be.null;\n          expect(queryEntry('replace-with-none-end')).to.exist;\n          expect(queryEntry('replace-with-none-intermediate-throwing')).to.exist;\n\n          expect(queryBodyEntries()).to.have.length(2);\n        })\n      );\n\n\n      it('should contain all intermediate events except the current one',\n        inject(function(elementRegistry) {\n\n          // given\n          var intermediateEvent = elementRegistry.get('IntermediateThrowEvent_1');\n\n          // when\n          openPopup(intermediateEvent);\n\n          // then\n          expect(queryEntry('replace-with-none-intermediate-throw')).to.be.null;\n\n          expect(queryBodyEntries()).to.have.length(12);\n        })\n      );\n\n\n      it('should contain all end events except the current one',\n        inject(function(elementRegistry) {\n\n          // given\n          var endEvent = elementRegistry.get('EndEvent_1');\n\n          // when\n          openPopup(endEvent);\n\n          // then\n          expect(queryEntry('replace-with-none-end')).to.be.null;\n\n          expect(queryBodyEntries()).to.have.length(8);\n        })\n      );\n\n\n      it('should show corresponding \"non-interrupting\" event',\n        inject(function(elementRegistry) {\n\n          // given\n          var messageStartEvent = elementRegistry.get('StartEvent_6');\n\n          // when\n          openPopup(messageStartEvent);\n\n          // then\n          expect(queryEntry('replace-with-message-start')).to.be.null;\n          expect(queryEntry('replace-with-non-interrupting-message-start')).exist;\n        })\n      );\n\n\n      it('should show corresponding variants for a timer event',\n        inject(function(elementRegistry) {\n\n          // given\n          var timerStartEvent = elementRegistry.get('StartEvent_4');\n\n          // when\n          openPopup(timerStartEvent);\n\n          // then\n          expect(queryEntry('replace-with-timer-start')).to.be.null;\n          expect(queryEntry('replace-with-timer-intermediate-catch')).exist;\n        })\n      );\n\n\n      it('should show corresponding variants for a message event',\n        inject(function(elementRegistry) {\n\n          // given\n          var messageStartEvent = elementRegistry.get('StartEvent_5');\n\n          // when\n          openPopup(messageStartEvent);\n\n          // then\n          expect(queryEntry('replace-with-message-start')).to.be.null;\n          expect(queryEntry('replace-with-message-intermediate-catch')).exist;\n          expect(queryEntry('replace-with-message-intermediate-throw')).exist;\n          expect(queryEntry('replace-with-message-end')).exist;\n        })\n      );\n\n\n      it('should show corresponding variants for a compensation event',\n        inject(function(elementRegistry) {\n\n          // given\n          var messageStartEvent = elementRegistry.get('CompensationEvent');\n\n          // when\n          openPopup(messageStartEvent);\n\n          // then\n          expect(queryEntry('replace-with-compensation-start')).to.be.null;\n          expect(queryEntry('replace-with-compensation-intermediate-throw')).to.be.null;\n          expect(queryEntry('replace-with-compensation-end')).exist;\n        })\n      );\n\n\n      it('should show corresponding variants for a conditional event',\n        inject(function(elementRegistry) {\n\n          // given\n          var messageStartEvent = elementRegistry.get('ConditionalEvent');\n\n          // when\n          openPopup(messageStartEvent);\n\n          // then\n          expect(queryEntry('replace-with-conditional-start')).exist;\n          expect(queryEntry('replace-with-conditional-intermediate-catch')).to.be.null;\n        })\n      );\n\n\n      it('should show corresponding variants for an error event',\n        inject(function(elementRegistry) {\n\n          // given\n          var messageStartEvent = elementRegistry.get('ErrorEvent');\n\n          // when\n          openPopup(messageStartEvent);\n\n          // then\n          expect(queryEntry('replace-with-error-start')).exist;\n          expect(queryEntry('replace-with-error-end')).to.be.null;\n        })\n      );\n\n\n      it('should NOT show corresponding start event variants for a message event in subprocess',\n        inject(function(elementRegistry) {\n\n          // given\n          var messageStartEvent = elementRegistry.get('IntermediateCatchMessageEvent');\n\n          // when\n          openPopup(messageStartEvent);\n\n          // then\n          expect(queryEntry('replace-with-message-start')).to.be.null;\n          expect(queryEntry('replace-with-message-intermediate-catch')).to.be.null;\n          expect(queryEntry('replace-with-message-intermediate-throw')).exist;\n          expect(queryEntry('replace-with-message-end')).exist;\n        })\n      );\n\n    });\n\n\n    describe('cancel event definition', function() {\n\n      var diagramXML = require('../../../fixtures/bpmn/features/replace/cancel-events.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      describe('for end events', function() {\n\n        it('should contain cancel event replace option in transaction',\n          inject(function(elementRegistry) {\n\n            // given\n            var endEvent = elementRegistry.get('EndEvent_3');\n\n            // when\n            openPopup(endEvent);\n\n            // then\n            expect(queryBodyEntries()).to.have.length(11);\n\n            expect(queryEntry('replace-with-cancel-end')).to.exist;\n          })\n        );\n\n\n        it('should NOT contain cancel event replace option in transaction when already set',\n          inject(function(elementRegistry) {\n\n            // given\n            var endEvent = elementRegistry.get('EndEvent_1');\n\n            // when\n            openPopup(endEvent);\n\n            // then\n            expect(queryBodyEntries()).to.have.length(9);\n            expect(queryEntry('replace-with-cancel-end')).to.be.null;\n          })\n        );\n\n\n        it('should NOT contain cancel event replace option outside transaction',\n          inject(function(elementRegistry) {\n\n            // given\n            var endEvent = elementRegistry.get('EndEvent_2');\n\n            // when\n            openPopup(endEvent);\n\n            // then\n            expect(queryBodyEntries()).to.have.length(8);\n\n            expect(queryEntry('replace-with-cancel-end')).to.be.null;\n          })\n        );\n\n      });\n\n\n      describe('for boundary events', function() {\n\n        it('should contain cancel event replace option attachted to Transaction',\n          inject(function(elementRegistry) {\n\n            // given\n            var boundaryEvent = elementRegistry.get('BoundaryEvent_1');\n\n            // when\n            openPopup(boundaryEvent);\n\n            // then\n            expect(queryBodyEntries()).to.have.length(13);\n\n            expect(queryEntry('replace-with-cancel-boundary')).to.exist;\n          })\n        );\n\n\n        it('should NOT contain cancel event replace option attached to SubProcess',\n          inject(function(elementRegistry) {\n\n            // given\n            var boundaryEvent = elementRegistry.get('BoundaryEvent_2');\n\n            // when\n            openPopup(boundaryEvent);\n\n            // then\n            expect(queryBodyEntries()).to.have.length(12);\n\n            expect(queryEntry('replace-with-cancel-boundary')).to.be.null;\n          })\n        );\n\n\n        it('should NOT contain cancel event replace option attached to Activity',\n          inject(function(elementRegistry) {\n\n            // given\n            var boundaryEvent = elementRegistry.get('BoundaryEvent_3');\n\n            // when\n            openPopup(boundaryEvent);\n\n            // then\n            expect(queryBodyEntries()).to.have.length(12);\n\n            expect(queryEntry('replace-with-cancel-boundary')).to.be.null;\n          })\n        );\n\n      });\n\n    });\n\n\n    describe('boundary events', function() {\n\n      beforeEach(bootstrapModeler(diagramXMLReplace, { modules: testModules }));\n\n      it('should contain all boundary events (except for cancel and currently active) for an interrupting boundary event',\n        inject(function(elementRegistry) {\n\n          // given\n          var boundaryEvent = elementRegistry.get('BoundaryEvent_1');\n\n          // when\n          openPopup(boundaryEvent, 40);\n\n          // then\n          expect(queryEntry('replace-with-conditional-intermediate-catch')).to.be.null;\n          expect(queryEntry('replace-with-cancel-boundary')).to.be.null;\n          expect(queryBodyEntries()).to.have.length(11);\n        })\n      );\n\n\n      it('should contain all boundary events (except for cancel and currently active) for a non interrupting boundary event',\n        inject(function(elementRegistry) {\n\n          // given\n          var boundaryEvent = elementRegistry.get('BoundaryEvent_2');\n\n          // when\n          openPopup(boundaryEvent, 40);\n\n          // then\n          expect(queryEntry('replace-with-non-interrupting-message-intermediate-catch')).to.be.null;\n          expect(queryEntry('replace-with-cancel-boundary')).to.be.null;\n          expect(queryBodyEntries()).to.have.length(11);\n        })\n      );\n\n\n      it('should contain compensation boundary event',\n        inject(function(elementRegistry) {\n\n          // given\n          var boundaryEvent = elementRegistry.get('BoundaryEvent_1');\n\n          // when\n          openPopup(boundaryEvent, 40);\n\n          // then\n          expect(queryEntry('replace-with-compensation-boundary')).to.exist;\n        })\n      );\n\n    });\n\n\n    describe('default flows', function() {\n\n      var diagramXML = require('./ReplaceMenuProvider.defaultFlows.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, {\n        modules: testModules\n      }));\n\n\n      it('should show default replace option [gateway]', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_3');\n\n        // when\n        openPopup(sequenceFlow);\n\n        // then\n        expect(queryBodyEntries()).to.have.length(1);\n      }));\n\n\n      it('should show Default replace option [task]', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_15f5knn');\n\n        // when\n        openPopup(sequenceFlow);\n\n        // then\n        expect(queryBodyEntries()).to.have.length(2);\n      }));\n\n\n      it('should NOT show default replace option', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_4');\n\n        // when\n        openPopup(sequenceFlow);\n\n        // then\n        expect(queryBodyEntries()).to.have.length(0);\n      }));\n\n    });\n\n\n    describe('default flows from inclusive gateways', function() {\n\n      var diagramXML = require('./ReplaceMenuProvider.defaultFlowsFromInclusiveGateways.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, {\n        modules: testModules\n      }));\n\n\n      it('should show default replace option', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_2');\n\n        // when\n        openPopup(sequenceFlow);\n\n        var sequenceFlowEntry = queryEntry('replace-with-sequence-flow'),\n            defaultFlowEntry = queryEntry('replace-with-default-flow');\n\n        // then\n        expect(sequenceFlowEntry).not.to.exist;\n        expect(defaultFlowEntry).to.exist;\n      }));\n\n\n      it('should NOT show default replace option', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_1');\n\n        // when\n        openPopup(sequenceFlow);\n\n        var sequenceFlowEntry = queryEntry('replace-with-sequence-flow'),\n            defaultFlowEntry = queryEntry('replace-with-default-flow');\n\n        // then\n        expect(sequenceFlowEntry).to.exist;\n        expect(defaultFlowEntry).not.to.exist;\n      }));\n\n    });\n\n\n    describe('default flows from complex gateways', function() {\n\n      var diagramXML = require('./ReplaceMenuProvider.defaultFlowsFromComplexGateways.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, {\n        modules: testModules\n      }));\n\n\n      it('should show default replace option', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_2');\n\n        // when\n        openPopup(sequenceFlow);\n\n        var sequenceFlowEntry = queryEntry('replace-with-sequence-flow'),\n            defaultFlowEntry = queryEntry('replace-with-default-flow');\n\n        // then\n        expect(sequenceFlowEntry).not.to.exist;\n        expect(defaultFlowEntry).to.exist;\n      }));\n\n\n      it('should NOT show default replace option', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_1');\n\n        // when\n        openPopup(sequenceFlow);\n\n        var sequenceFlowEntry = queryEntry('replace-with-sequence-flow'),\n            defaultFlowEntry = queryEntry('replace-with-default-flow');\n\n        // then\n        expect(sequenceFlowEntry).to.exist;\n        expect(defaultFlowEntry).not.to.exist;\n      }));\n\n    });\n\n\n    describe('conditional flows', function() {\n\n      var diagramXML = require('./ReplaceMenuProvider.conditionalFlows.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, {\n        modules: testModules\n      }));\n\n\n      it('should show ConditionalFlow replace option', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_3');\n\n        // when\n        openPopup(sequenceFlow);\n\n        var conditionalFlowEntry = queryEntry('replace-with-conditional-flow');\n\n        // then\n        expect(conditionalFlowEntry).to.exist;\n\n        expect(queryBodyEntries()).to.have.length(2);\n      }));\n\n\n      it('should NOT show ConditionalFlow replace option', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_1');\n\n        // when\n        openPopup(sequenceFlow);\n\n        // then\n        expect(queryBodyEntries()).to.have.length(0);\n      }));\n\n    });\n\n\n    describe('compensate activities', function() {\n\n      var diagramXML = require('./ReplaceMenuProvider.compensation-activity.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      it('options should include subProcesses and callActivity', inject(function(elementRegistry) {\n\n        // given\n        var taskElement = elementRegistry.get('Task_1');\n\n        // when\n        openPopup(taskElement);\n\n        var callActivityEntry = queryEntry('replace-with-call-activity'),\n            subProcessEntry = queryEntry('replace-with-collapsed-subprocess');\n\n        // then\n        expect(callActivityEntry).to.exist;\n        expect(subProcessEntry).to.exist;\n      }));\n\n    });\n\n\n    describe('subprocesses', function() {\n\n      var diagramXML = require('./ReplaceMenuProvider.subProcesses.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n      describe('subprocess', function() {\n\n        it('options do not include subprocess itself', inject(function(elementRegistry) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('SubProcess_1');\n\n          // when\n          openPopup(collapsedSubProcess);\n\n          var entry = queryEntry('replace-with-subprocess');\n\n          // then\n          expect(entry).not.to.exist;\n        }));\n\n\n        it('options include collapsed subprocess', inject(function(elementRegistry) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('SubProcess_1');\n\n          // when\n          openPopup(collapsedSubProcess);\n\n          var entry = queryEntry('replace-with-collapsed-subprocess');\n\n          // then\n          expect(entry).to.exist;\n        }));\n\n\n        it('options include ad hoc subprocess', inject(function(elementRegistry) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('SubProcess_1');\n\n          // when\n          openPopup(collapsedSubProcess);\n\n          var entry = queryEntry('replace-with-ad-hoc-subprocess');\n\n          // then\n          expect(entry).to.exist;\n        }));\n\n\n        it('options do not include collapsed ad hoc subprocess', inject(function(elementRegistry) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('SubProcess_1');\n\n          // when\n          openPopup(collapsedSubProcess);\n\n          var entry = queryEntry('replace-with-collapsed-ad-hoc-subprocess');\n\n          // then\n          expect(entry).not.to.exist;\n        }));\n\n      });\n\n\n      describe('ad hoc subprocess', function() {\n\n        it('options do not include ad hoc subprocess itself', inject(function(elementRegistry) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('AdhocSubProcess_1');\n\n          // when\n          openPopup(collapsedSubProcess);\n\n          var entry = queryEntry('replace-with-ad-hoc-subprocess');\n\n          // then\n          expect(entry).not.to.exist;\n        }));\n\n\n        it('options include collapsed subprocess', inject(function(elementRegistry) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('AdhocSubProcess_1');\n\n          // when\n          openPopup(collapsedSubProcess);\n\n          var entry = queryEntry('replace-with-collapsed-ad-hoc-subprocess');\n\n          // then\n          expect(entry).to.exist;\n        }));\n\n\n        it('options include subprocess', inject(function(elementRegistry) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('AdhocSubProcess_1');\n\n          // when\n          openPopup(collapsedSubProcess);\n\n          var entry = queryEntry('replace-with-subprocess');\n\n          // then\n          expect(entry).to.exist;\n        }));\n\n\n        it('options do not include collapsed subprocess', inject(function(elementRegistry) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('AdhocSubProcess_1');\n\n          // when\n          openPopup(collapsedSubProcess);\n\n          var entry = queryEntry('replace-with-collapsed-subprocess');\n\n          // then\n          expect(entry).not.to.exist;\n        }));\n\n      });\n\n    });\n\n\n    describe('collapsed subprocesses', function() {\n\n      var diagramXML = require('./ReplaceMenuProvider.collapsedSubProcess.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n      describe('collapsed subprocess', function() {\n\n        it('options do not include collapsed subprocess itself', inject(function(elementRegistry) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('Task_1');\n\n          // when\n          openPopup(collapsedSubProcess);\n\n          var entry = queryEntry('replace-with-collapsed-subprocess');\n\n          // then\n          expect(entry).not.to.exist;\n        }));\n\n\n        it('options include collapsed ad hoc subprocess', inject(function(elementRegistry) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('Task_1');\n\n          // when\n          openPopup(collapsedSubProcess);\n\n          var entry = queryEntry('replace-with-collapsed-ad-hoc-subprocess');\n\n          // then\n          expect(entry).to.exist;\n        }));\n\n\n        it('options include expanded subprocess', inject(function(elementRegistry) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('Task_1');\n\n          // when\n          openPopup(collapsedSubProcess);\n\n          var entry = queryEntry('replace-with-expanded-subprocess');\n\n          // then\n          expect(entry).to.exist;\n        }));\n\n\n        it('options do not include ad hoc subprocess', inject(function(elementRegistry) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('Task_1');\n\n          // when\n          openPopup(collapsedSubProcess);\n\n          var entry = queryEntry('replace-with-ad-hoc-subprocess');\n\n          // then\n          expect(entry).not.to.exist;\n        }));\n\n      });\n\n\n      describe('collapsed ad hoc subprocess', function() {\n\n        it('options do not include collapsed ad hoc subprocess itself', inject(function(elementRegistry) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('AdhocSubProcess_1');\n\n          // when\n          openPopup(collapsedSubProcess);\n\n          var entry = queryEntry('replace-with-collapsed-ad-hoc-subprocess');\n\n          // then\n          expect(entry).not.to.exist;\n        }));\n\n\n        it('options include collapsed subprocess', inject(function(elementRegistry) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('AdhocSubProcess_1');\n\n          // when\n          openPopup(collapsedSubProcess);\n\n          var entry = queryEntry('replace-with-collapsed-subprocess');\n\n          // then\n          expect(entry).to.exist;\n        }));\n\n\n        it('options include expanded ad hoc subprocess', inject(function(elementRegistry) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('AdhocSubProcess_1');\n\n          // when\n          openPopup(collapsedSubProcess);\n\n          var entry = queryEntry('replace-with-ad-hoc-subprocess');\n\n          // then\n          expect(entry).to.exist;\n        }));\n\n\n        it('options do not include expanded subprocess', inject(function(elementRegistry) {\n\n          // given\n          var collapsedSubProcess = elementRegistry.get('AdhocSubProcess_1');\n\n          // when\n          openPopup(collapsedSubProcess);\n\n          var entry = queryEntry('replace-with-subprocess');\n\n          // then\n          expect(entry).not.to.exist;\n        }));\n\n      });\n\n    });\n\n\n    describe('pools', function() {\n\n      var diagramXML = require('./ReplaceMenuProvider.pools.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      it('should indicate removing content', inject(function(elementRegistry) {\n\n        // given\n        var expandedPool = elementRegistry.get('Participant_1');\n\n        // when\n        openPopup(expandedPool);\n\n        var emptyPoolLabel = queryEntryLabel('replace-with-collapsed-pool');\n\n        // then\n        expect(emptyPoolLabel).to.exist;\n        expect(emptyPoolLabel.textContent).to.eql('Empty pool/participant (removes content)');\n      }));\n\n\n      it('should NOT indicate removing content', inject(function(elementRegistry) {\n\n        // given\n        var expandedPool = elementRegistry.get('Participant_2');\n\n        // when\n        openPopup(expandedPool);\n\n        var emptyPoolLabel = queryEntryLabel('replace-with-collapsed-pool');\n\n        // then\n        expect(emptyPoolLabel).to.exist;\n        expect(emptyPoolLabel.textContent).to.eql('Empty pool/participant');\n      }));\n\n    });\n\n\n    describe('data object', function() {\n\n      beforeEach(bootstrapModeler(diagramXMLDataElements, { modules: testModules }));\n\n\n      it('should only contain data store reference', inject(function(elementRegistry) {\n\n        // given\n        var dataObjectReference = elementRegistry.get('DataObjectReference_1');\n\n        // when\n        openPopup(dataObjectReference);\n\n        // then\n        expect(queryBodyEntries()).to.have.length(1);\n        expect(queryEntry('toggle-is-collection')).to.exist;\n        expect(queryEntry('replace-with-data-store-reference')).to.exist;\n        expect(queryEntry('replace-with-data-object-reference')).to.be.null;\n      }));\n\n\n      it('should handle missing dataObjectRef', inject(function(elementRegistry) {\n\n        // given\n        var dataObjectReference = elementRegistry.get('DataObjectReference_NO_DataObject');\n\n        // when\n        openPopup(dataObjectReference);\n\n        // then\n        expect(queryEntry('toggle-is-collection')).not.to.exist;\n      }));\n\n    });\n\n\n    describe('data store', function() {\n\n      beforeEach(bootstrapModeler(diagramXMLDataElements, { modules: testModules }));\n\n\n      it('should only contain data object reference', inject(function(elementRegistry) {\n\n        // given\n        var dataStoreReference = elementRegistry.get('DataStoreReference_1');\n\n        // when\n        openPopup(dataStoreReference);\n\n        // then\n        expect(queryBodyEntries()).to.have.length(1);\n        expect(queryEntry('toggle-is-collection')).to.be.null;\n        expect(queryEntry('replace-with-data-store-reference')).to.be.null;\n        expect(queryEntry('replace-with-data-object-reference')).to.exist;\n      }));\n\n\n      it('should handle missing dataStoreRef', inject(function(elementRegistry) {\n\n        // given\n        var dataStoreReference = elementRegistry.get('DataStoreReference_NO_DataStore');\n\n        // when\n        openPopup(dataStoreReference);\n\n        // then\n        expect(queryEntry('toggle-is-collection')).to.be.null;\n      }));\n\n    });\n\n\n    describe('data store positioned against participant', function() {\n\n      beforeEach(bootstrapModeler(diagramXMLDataStoresPositionedAgainstParticipant, { modules: testModules }));\n\n\n      it('should only contain data object reference', inject(function(elementRegistry) {\n\n        // given\n        var dataStoreReferenceWithinParticipant = elementRegistry.get('DataStoreReference_0');\n\n        // when\n        openPopup(dataStoreReferenceWithinParticipant);\n\n        // then\n        expect(queryBodyEntries()).to.have.length(1);\n        expect(queryEntry('replace-with-data-object-reference')).to.exist;\n      }));\n\n\n      it('should contain no reference', inject(function(elementRegistry) {\n\n        // given\n        var dataStoreReferenceOutsideParticipant = elementRegistry.get('DataStoreReference_1');\n\n        // when\n        openPopup(dataStoreReferenceOutsideParticipant);\n\n        // then\n        expect(queryBodyEntries()).to.have.length(0);\n        expect(queryEntry('replace-with-data-object-reference')).to.be.null;\n      }));\n\n    });\n\n  });\n\n\n  describe('a11y', function() {\n\n    beforeEach(bootstrapModeler(diagramXMLReplace, { modules: testModules }));\n\n\n    it('should report no violations', inject(async function(elementRegistry) {\n\n      // given\n      const startEvent = elementRegistry.get('StartEvent_1');\n\n      // when\n      openPopup(startEvent);\n\n      // then\n      const container = getMenuContainer();\n      await expectToBeAccessible(container);\n    }));\n  });\n\n\n  describe('integration', function() {\n\n\n    describe('default flows', function() {\n\n      var diagramXML = require('./ReplaceMenuProvider.defaultFlows.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n      it('should replace SequenceFlow with DefaultFlow [gateway]', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_3');\n\n        // when\n        openPopup(sequenceFlow);\n\n        triggerAction('replace-with-default-flow');\n\n        var gateway = elementRegistry.get('ExclusiveGateway_1');\n\n        // then\n        expect(gateway.businessObject.default).to.equal(sequenceFlow.businessObject);\n      }));\n\n\n      it('should replace SequenceFlow with DefaultFlow [task]', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_15f5knn');\n\n        // when\n        openPopup(sequenceFlow);\n\n        triggerAction('replace-with-default-flow');\n\n        var task = elementRegistry.get('Task_1ei94kl');\n\n        // then\n        expect(task.businessObject.default).to.equal(sequenceFlow.businessObject);\n      }));\n\n\n      it('should morph DefaultFlow into a SequenceFlow [task]', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_15f5knn');\n\n        openPopup(sequenceFlow);\n\n        triggerAction('replace-with-default-flow');\n\n        // when\n        openPopup(sequenceFlow);\n\n        triggerAction('replace-with-sequence-flow');\n\n        var task = elementRegistry.get('Task_1ei94kl');\n\n        // then\n        expect(task.businessObject.default).not.to.exist;\n      }));\n\n\n      it('should morph DefaultFlow into a SequenceFlow [task] -> undo',\n        inject(function(elementRegistry, commandStack) {\n\n          // given\n          var sequenceFlow = elementRegistry.get('SequenceFlow_15f5knn');\n\n          openPopup(sequenceFlow);\n\n          triggerAction('replace-with-default-flow');\n\n          // when\n          openPopup(sequenceFlow);\n\n          triggerAction('replace-with-sequence-flow');\n\n          commandStack.undo();\n\n          var task = elementRegistry.get('Task_1ei94kl');\n\n          // then\n          expect(task.businessObject.default).to.equal(sequenceFlow.businessObject);\n        })\n      );\n\n\n      it('should morph DefaultFlow into a ConditionalFlow [task]', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_15f5knn'),\n            task = elementRegistry.get('Task_1ei94kl');\n\n        openPopup(sequenceFlow);\n\n        triggerAction('replace-with-default-flow');\n\n        // when\n        openPopup(sequenceFlow);\n\n        triggerAction('replace-with-conditional-flow');\n\n        // then\n        expect(task.businessObject.default).not.to.exist;\n      }));\n\n\n      it('should morph DefaultFlow into a ConditionalFlow [task] -> undo',\n        inject(function(elementRegistry, commandStack) {\n\n          // given\n          var sequenceFlow = elementRegistry.get('SequenceFlow_15f5knn'),\n              task = elementRegistry.get('Task_1ei94kl');\n\n          openPopup(sequenceFlow);\n\n          triggerAction('replace-with-default-flow');\n\n          // when\n          openPopup(sequenceFlow);\n\n          triggerAction('replace-with-conditional-flow');\n\n          commandStack.undo();\n\n          // then\n          expect(task.businessObject.default).to.equal(sequenceFlow.businessObject);\n        })\n      );\n\n\n      it('should replace SequenceFlow with DefaultFlow [gateway] -> undo',\n        inject(function(elementRegistry, commandStack) {\n\n          // given\n          var sequenceFlow = elementRegistry.get('SequenceFlow_3'),\n              gateway = elementRegistry.get('ExclusiveGateway_1');\n\n          // when\n          openPopup(sequenceFlow);\n\n          triggerAction('replace-with-default-flow');\n\n          commandStack.undo();\n\n          // then\n          expect(gateway.businessObject.default).not.to.exist;\n        })\n      );\n\n\n      it('should replace SequenceFlow with DefaultFlow [task] -> undo',\n        inject(function(elementRegistry, commandStack) {\n\n          // given\n          var sequenceFlow = elementRegistry.get('SequenceFlow_15f5knn');\n\n          // when\n          openPopup(sequenceFlow);\n\n          triggerAction('replace-with-default-flow');\n\n          commandStack.undo();\n\n          var task = elementRegistry.get('Task_1ei94kl');\n\n          // then\n          expect(task.businessObject.default).not.to.exist;\n        })\n      );\n\n\n      it('should only have one DefaultFlow', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n            sequenceFlow3 = elementRegistry.get('SequenceFlow_3');\n\n\n        // when\n        // trigger morphing sequenceFlow3 to default flow\n        openPopup(sequenceFlow3);\n\n        triggerAction('replace-with-default-flow');\n\n        // trigger morphing sequenceFlow to default flow\n        openPopup(sequenceFlow);\n\n        triggerAction('replace-with-default-flow');\n\n        var gateway = elementRegistry.get('ExclusiveGateway_1');\n\n        // then\n        expect(gateway.businessObject.default).to.equal(sequenceFlow.businessObject);\n      }));\n\n\n      it('should replace DefaultFlow with SequenceFlow when changing source',\n        inject(function(elementRegistry, modeling) {\n\n          // given\n          var sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n              task = elementRegistry.get('Task_2');\n\n          openPopup(sequenceFlow);\n\n          triggerAction('replace-with-default-flow');\n\n          // when\n          modeling.reconnectStart(sequenceFlow, task, [\n            { x: 686, y: 267, original: { x: 686, y: 307 } },\n            { x: 686, y: 207, original: { x: 686, y: 187 } }\n          ]);\n\n          var gateway = elementRegistry.get('ExclusiveGateway_1');\n\n          // then\n          expect(gateway.businessObject.default).not.to.exist;\n        })\n      );\n\n\n      it('should replace DefaultFlow with SequenceFlow when changing source -> undo',\n        inject(function(elementRegistry, modeling, commandStack) {\n\n          // given\n          var sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n              task = elementRegistry.get('Task_2');\n\n          openPopup(sequenceFlow);\n\n          triggerAction('replace-with-default-flow');\n\n          // when\n          modeling.reconnectStart(sequenceFlow, task, [\n            { x: 686, y: 267, original: { x: 686, y: 307 } },\n            { x: 686, y: 207, original: { x: 686, y: 187 } }\n          ]);\n\n          commandStack.undo();\n\n          var gateway = elementRegistry.get('ExclusiveGateway_1');\n\n          // then\n          expect(gateway.businessObject.default).equal(sequenceFlow.businessObject);\n        })\n      );\n\n\n      [\n        'bpmn:Task',\n        'bpmn:EndEvent',\n        'bpmn:IntermediateThrowEvent',\n        'bpmn:IntermediateCatchEvent'\n      ].forEach(function(type) {\n\n        it('should keep DefaultFlow when changing target to ' + type,\n          inject(function(elementRegistry, elementFactory, canvas, modeling) {\n\n            // given\n            var sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n                root = canvas.getRootElement();\n\n            var intermediateEvent = elementFactory.createShape({ type: type });\n\n            modeling.createShape(intermediateEvent, { x: 686, y: 50 }, root);\n\n            openPopup(sequenceFlow);\n\n            triggerAction('replace-with-default-flow');\n\n            // when\n            modeling.reconnectEnd(sequenceFlow, intermediateEvent, [\n              { x: 686, y: 267, original: { x: 686, y: 307 } },\n              { x: 686, y: 50, original: { x: 686, y: 75 } }\n            ]);\n\n            var gateway = elementRegistry.get('ExclusiveGateway_1');\n\n            // then\n            expect(gateway.businessObject.default).to.exist;\n          })\n        );\n      });\n\n\n      it('should replace DefaultFlow with SequenceFlow when changing target -> undo',\n        inject(function(elementRegistry, elementFactory, canvas, modeling, commandStack) {\n\n          // given\n          var sequenceFlow = elementRegistry.get('SequenceFlow_1'),\n              rootElement = canvas.getRootElement();\n\n          var intermediateEvent = elementFactory.createShape({ type: 'bpmn:StartEvent' });\n\n          modeling.createShape(intermediateEvent, { x: 686, y: 50 }, rootElement);\n\n          openPopup(sequenceFlow);\n\n          triggerAction('replace-with-default-flow');\n\n          // when\n          modeling.reconnectEnd(sequenceFlow, intermediateEvent, [\n            { x: 686, y: 267, original: { x: 686, y: 307 } },\n            { x: 686, y: 50, original: { x: 686, y: 75 } }\n          ]);\n\n          commandStack.undo();\n\n          var gateway = elementRegistry.get('ExclusiveGateway_1');\n\n          // then\n          expect(gateway.businessObject.default).equal(sequenceFlow.businessObject);\n        })\n      );\n\n\n      it('should keep DefaultFlow when morphing Gateway', inject(function(elementRegistry, bpmnReplace) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_3'),\n            exclusiveGateway = elementRegistry.get('ExclusiveGateway_1');\n\n        // when\n        openPopup(sequenceFlow);\n\n        triggerAction('replace-with-default-flow');\n\n        var inclusiveGateway = bpmnReplace.replaceElement(exclusiveGateway, { type: 'bpmn:InclusiveGateway' });\n\n        // then\n        expect(inclusiveGateway.businessObject.default).to.equal(sequenceFlow.businessObject);\n      }));\n\n\n      it('should keep DefaultFlow when morphing Task', inject(\n        function(elementRegistry, bpmnReplace) {\n\n          // given\n          var sequenceFlow = elementRegistry.get('SequenceFlow_15f5knn'),\n              task = elementRegistry.get('Task_1ei94kl');\n\n          // when\n          openPopup(sequenceFlow);\n\n          // trigger DefaultFlow replacement\n          triggerAction('replace-with-default-flow');\n\n          var sendTask = bpmnReplace.replaceElement(task, { type: 'bpmn:SendTask' });\n\n          // then\n          expect(sendTask.businessObject.default).to.equal(sequenceFlow.businessObject);\n        })\n      );\n\n\n      it('should keep DefaultFlow when morphing Gateway -> undo',\n        inject(function(elementRegistry, bpmnReplace, commandStack) {\n\n          // given\n          var sequenceFlow = elementRegistry.get('SequenceFlow_3'),\n              exclusiveGateway = elementRegistry.get('ExclusiveGateway_1');\n\n          // when\n          openPopup(sequenceFlow);\n\n          triggerAction('replace-with-default-flow');\n\n          bpmnReplace.replaceElement(exclusiveGateway, { type: 'bpmn:InclusiveGateway' });\n\n          commandStack.undo();\n\n          // then\n          expect(exclusiveGateway.businessObject.default).to.equal(sequenceFlow.businessObject);\n        })\n      );\n\n\n      it('should remove any conditionExpression when morphing to DefaultFlow',\n        inject(function(elementRegistry, modeling, moddle) {\n\n          // given\n          var sequenceFlow = elementRegistry.get('SequenceFlow_3'),\n              exclusiveGateway = elementRegistry.get('ExclusiveGateway_1');\n\n          var conditionExpression = moddle.create('bpmn:FormalExpression', {\n            body: ''\n          });\n\n          modeling.updateProperties(sequenceFlow, {\n            conditionExpression: conditionExpression\n          });\n\n          // when\n          openPopup(sequenceFlow);\n\n          // trigger DefaultFlow replacement\n          triggerAction('replace-with-default-flow');\n\n          // then\n          expect(exclusiveGateway.businessObject.default).to.equal(sequenceFlow.businessObject);\n          expect(sequenceFlow.businessObject.conditionExpression).not.to.exist;\n        })\n      );\n\n\n      it('should remove any conditionExpression when morphing to DefaultFlow -> undo',\n        inject(function(elementRegistry, modeling, moddle, commandStack) {\n\n          // given\n          var sequenceFlow = elementRegistry.get('SequenceFlow_3'),\n              exclusiveGateway = elementRegistry.get('ExclusiveGateway_1');\n\n          var conditionExpression = moddle.create('bpmn:FormalExpression', { body: '' });\n\n          modeling.updateProperties(sequenceFlow, { conditionExpression: conditionExpression });\n\n          // when\n          openPopup(sequenceFlow);\n\n          // trigger DefaultFlow replacement\n          triggerAction('replace-with-default-flow');\n\n          commandStack.undo();\n\n          // then\n          expect(exclusiveGateway.businessObject.default).not.to.exist;\n          expect(sequenceFlow.businessObject.conditionExpression).to.equal(conditionExpression);\n        })\n      );\n\n    });\n\n\n    describe('conditional flows', function() {\n\n      var diagramXML = require('./ReplaceMenuProvider.conditionalFlows.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, {\n        modules: testModules\n      }));\n\n\n      it('should morph into a ConditionalFlow', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_2');\n\n        // when\n        openPopup(sequenceFlow);\n\n        triggerAction('replace-with-conditional-flow');\n\n        // then\n        expect(sequenceFlow.businessObject.conditionExpression.$type).to.equal('bpmn:FormalExpression');\n      }));\n\n\n      it('should morph into a ConditionalFlow -> undo', inject(\n        function(elementRegistry, commandStack) {\n\n          // given\n          var sequenceFlow = elementRegistry.get('SequenceFlow_2');\n\n          // when\n          openPopup(sequenceFlow);\n\n          triggerAction('replace-with-conditional-flow');\n\n          commandStack.undo();\n\n          // then\n          expect(sequenceFlow.businessObject.conditionExpression).not.to.exist;\n        }\n      ));\n\n\n      it('should morph back into a SequenceFlow', inject(function(elementRegistry) {\n\n        // given\n        var sequenceFlow = elementRegistry.get('SequenceFlow_2');\n\n        // when\n        openPopup(sequenceFlow);\n\n        // trigger ConditionalFlow replacement\n        triggerAction('replace-with-conditional-flow');\n\n        openPopup(sequenceFlow);\n\n        // replace with SequenceFlow\n        triggerAction('replace-with-sequence-flow');\n\n        // then\n        expect(sequenceFlow.businessObject.conditionExpression).not.to.exist;\n      }));\n\n\n      it('should replace ConditionalFlow with SequenceFlow when changing source',\n        inject(function(elementRegistry, modeling) {\n\n          // given\n          var sequenceFlow = elementRegistry.get('SequenceFlow_3'),\n              startEvent = elementRegistry.get('StartEvent_1');\n\n          // when\n          openPopup(sequenceFlow);\n\n          triggerAction('replace-with-conditional-flow');\n\n          // when\n          modeling.reconnectStart(sequenceFlow, startEvent, [\n            { x: 196, y: 197, original: { x: 178, y: 197 } },\n            { x: 497, y: 278, original: { x: 547, y: 278 } }\n          ]);\n\n          // then\n          expect(sequenceFlow.businessObject.conditionExpression).not.to.exist;\n        })\n      );\n\n\n      it('should replace ConditionalFlow with SequenceFlow when changing source -> undo',\n        inject(function(elementRegistry, modeling, commandStack) {\n\n          // given\n          var sequenceFlow = elementRegistry.get('SequenceFlow_3'),\n              startEvent = elementRegistry.get('StartEvent_1');\n\n          // when\n          openPopup(sequenceFlow);\n\n          triggerAction('replace-with-conditional-flow');\n\n          // when\n          modeling.reconnectStart(sequenceFlow, startEvent, [\n            { x: 196, y: 197, original: { x: 178, y: 197 } },\n            { x: 497, y: 278, original: { x: 547, y: 278 } }\n          ]);\n\n          commandStack.undo();\n\n          // then\n          expect(sequenceFlow.businessObject.conditionExpression.$type).to.equal('bpmn:FormalExpression');\n        })\n      );\n\n\n      [\n        'bpmn:Task',\n        'bpmn:EndEvent',\n        'bpmn:IntermediateThrowEvent',\n        'bpmn:IntermediateCatchEvent'\n      ].forEach(function(type) {\n\n        it('should keep ConditionalFlow when changing target to ' + type,\n          inject(function(elementRegistry, elementFactory, canvas, modeling) {\n\n            // given\n            var sequenceFlow = elementRegistry.get('SequenceFlow_3'),\n                root = canvas.getRootElement(),\n                intermediateEvent = elementFactory.createShape({ type: type });\n\n            modeling.createShape(intermediateEvent, { x: 497, y: 197 }, root);\n\n            openPopup(sequenceFlow);\n\n            triggerAction('replace-with-conditional-flow');\n\n            // when\n            modeling.reconnectEnd(sequenceFlow, intermediateEvent, [\n              { x: 389, y: 197, original: { x: 389, y: 197 } },\n              { x: 497, y: 197, original: { x: 497, y: 197 } }\n            ]);\n\n            // then\n            expect(sequenceFlow.businessObject.conditionExpression).to.exist;\n          })\n        );\n\n      });\n\n\n      it('should replace ConditionalFlow with SequenceFlow when changing target -> undo',\n        inject(function(elementRegistry, elementFactory, canvas, modeling, commandStack) {\n\n          // given\n          var sequenceFlow = elementRegistry.get('SequenceFlow_3'),\n              root = canvas.getRootElement(),\n              intermediateEvent = elementFactory.createShape({ type: 'bpmn:StartEvent' });\n\n          modeling.createShape(intermediateEvent, { x: 497, y: 197 }, root);\n\n          openPopup(sequenceFlow);\n\n          // trigger ConditionalFlow replacement\n          triggerAction('replace-with-conditional-flow');\n\n          // when\n          modeling.reconnectEnd(sequenceFlow, intermediateEvent, [\n            { x: 389, y: 197, original: { x: 389, y: 197 } },\n            { x: 497, y: 197, original: { x: 497, y: 197 } }\n          ]);\n\n          commandStack.undo();\n\n          // then\n          expect(sequenceFlow.businessObject.conditionExpression.$type).to.equal('bpmn:FormalExpression');\n        })\n      );\n\n    });\n\n\n    describe('adhoc sub process', function() {\n\n      var diagramXML = require('./ReplaceMenuProvider.subProcesses.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, {\n        modules: testModules.concat(autoResizeModule)\n      }));\n\n\n      describe('sub process -> adhoc', function() {\n\n        it('should not resize', inject(function(elementRegistry, modeling) {\n\n          // given\n          var subProcess = elementRegistry.get('SubProcess_1');\n\n          // when\n          openPopup(subProcess);\n\n          const adHocSubProcess = triggerAction('replace-with-ad-hoc-subprocess');\n\n          // then\n          const sizeChanged = didSizeChange(subProcess, adHocSubProcess);\n          expect(sizeChanged).to.be.false;\n        }));\n\n\n        it('should not lay out connection', inject(function(elementRegistry, modeling) {\n\n          // given\n          var subProcess = elementRegistry.get('SubProcess_1');\n\n          var layoutConnectionSpy = sinon.spy(modeling, 'layoutConnection');\n\n          // when\n          openPopup(subProcess);\n\n          triggerAction('replace-with-ad-hoc-subprocess');\n\n          // then\n          expect(layoutConnectionSpy).not.to.have.been.called;\n        }));\n\n      });\n\n\n      describe('adhoc -> sub process', function() {\n\n        it('should not resize', inject(function(elementRegistry, modeling) {\n\n          // given\n          var adhocSubProcess = elementRegistry.get('AdhocSubProcess_1');\n\n          // when\n          openPopup(adhocSubProcess);\n\n          const subprocess = triggerAction('replace-with-subprocess');\n\n          // then\n          const sizeChanged = didSizeChange(adhocSubProcess, subprocess);\n          expect(sizeChanged).to.be.false;\n        }));\n\n\n        it('should not lay out connection', inject(function(elementRegistry, modeling) {\n\n          // given\n          var adhocSubProcess = elementRegistry.get('AdhocSubProcess_1');\n\n          var layoutConnectionSpy = sinon.spy(modeling, 'layoutConnection');\n\n          // when\n          openPopup(adhocSubProcess);\n\n          triggerAction('replace-with-subprocess');\n\n          // then\n          expect(layoutConnectionSpy).not.to.have.been.called;\n        }));\n\n      });\n\n    });\n\n\n    describe('events', function() {\n\n      var diagramXML = require('./ReplaceMenuProvider.events.bpmn');\n\n      beforeEach(bootstrapModeler(diagramXML, {\n        modules: testModules\n      }));\n\n\n      it('should set default link name for a link catch event', inject(function(elementRegistry) {\n\n        // given\n        var event = elementRegistry.get('IntermediateEvent');\n\n        // when\n        openPopup(event);\n\n        triggerAction('replace-with-link-intermediate-catch');\n\n        // then\n        event = elementRegistry.get('IntermediateEvent');\n\n        expect(event).to.exist;\n        expect(is(event, 'bpmn:IntermediateCatchEvent'), 'is not a catch event').to.be.true;\n\n        var eventBo = event.businessObject,\n            eventDefinitions = eventBo.eventDefinitions;\n\n        expect(eventDefinitions).to.exist;\n        expect(eventDefinitions).to.have.length(1);\n\n        var eventDefinition = eventDefinitions[ 0 ];\n\n        expect(is(eventDefinition, 'bpmn:LinkEventDefinition')).to.be.true;\n        expect(eventDefinition.name, 'name is not set').to.eql('');\n      }));\n\n\n      it('should set default link name for a link throw event', inject(function(elementRegistry) {\n\n        // given\n        var event = elementRegistry.get('IntermediateEvent');\n\n        // when\n        openPopup(event);\n\n        triggerAction('replace-with-link-intermediate-throw');\n\n        // then\n        event = elementRegistry.get('IntermediateEvent');\n\n        expect(event).to.exist;\n        expect(is(event, 'bpmn:IntermediateThrowEvent'), 'is not a throw event').to.be.true;\n\n        var eventBo = event.businessObject,\n            eventDefinitions = eventBo.eventDefinitions;\n\n        expect(eventDefinitions).to.exist;\n        expect(eventDefinitions).to.have.length(1);\n\n        var eventDefinition = eventDefinitions[ 0 ];\n\n        expect(is(eventDefinition, 'bpmn:LinkEventDefinition')).to.be.true;\n        expect(eventDefinition.name, 'name is not set').to.eql('');\n      }));\n    });\n\n  });\n\n\n  describe('rules', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/basic.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules.concat([ customRulesModule ])\n    }));\n\n\n    it('should get entries by default', inject(function(elementRegistry) {\n\n      // given\n      var startEvent = elementRegistry.get('StartEvent_1');\n\n      // when\n      openPopup(startEvent);\n\n      // then\n      expect(queryBodyEntries()).to.have.length.above(0);\n    }));\n\n\n    it('should get entries when custom rule returns true',\n      inject(function(elementRegistry, customRules) {\n\n        // given\n        var startEvent = elementRegistry.get('StartEvent_1');\n\n        customRules.addRule('shape.replace', function() {\n          return true;\n        });\n\n        // when\n        openPopup(startEvent);\n\n        // then\n        expect(queryBodyEntries()).to.have.length.above(0);\n      })\n    );\n\n\n    it('should get no entries when custom rule returns false',\n      inject(function(elementRegistry, customRules) {\n\n        // given\n        var startEvent = elementRegistry.get('StartEvent_1');\n\n        customRules.addRule('shape.replace', function() {\n          return false;\n        });\n\n        // when\n        openPopup(startEvent);\n\n        // then\n        expect(queryBodyEntries()).to.have.length(0);\n      })\n    );\n\n\n    it('should provide element to custom rules', inject(function(elementRegistry, customRules) {\n\n      // given\n      var startEvent = elementRegistry.get('StartEvent_1');\n      var actual;\n\n      customRules.addRule('shape.replace', function(context) {\n        actual = context.element;\n      });\n\n      // when\n      openPopup(startEvent);\n\n      // then\n      expect(actual).to.equal(startEvent);\n    }));\n\n\n    it('should evaluate rule once', inject(function(elementRegistry, customRules) {\n\n      // given\n      var callCount = 0;\n      var startEvent = elementRegistry.get('StartEvent_1');\n\n      customRules.addRule('shape.replace', function() {\n        callCount++;\n      });\n\n      // when\n      openPopup(startEvent);\n\n      // then\n      expect(callCount).to.equal(1);\n    }));\n\n  });\n\n});\n\n\n\n// helpers ////////////\n\nfunction openPopup(element, offset) {\n  offset = offset || 100;\n\n  getBpmnJS().invoke(function(popupMenu) {\n\n    popupMenu.open(element, 'bpmn-replace', {\n      x: element.x + offset, y: element.y + offset\n    });\n\n  });\n}\n\nfunction queryEntry(id) {\n  var container = getMenuContainer();\n\n  return domQuery('.djs-popup [data-id=\"' + id + '\"]', container);\n}\n\nfunction queryBodyEntries() {\n  var container = getMenuContainer();\n\n  return domQueryAll('.djs-popup .djs-popup-body .entry', container);\n}\n\nfunction queryEntryLabel(id) {\n  var entry = queryEntry(id);\n\n  return domQuery('span', entry);\n}\n\nfunction triggerAction(id) {\n  var entry = queryEntry(id);\n\n  if (!entry) {\n    throw new Error('entry \"' + id + '\" not found in replace menu');\n  }\n\n  var popupMenu = getBpmnJS().get('popupMenu');\n\n  return popupMenu.trigger(globalEvent(entry, { x: 0, y: 0 }));\n}\n\nfunction getMenuContainer() {\n  const popup = getBpmnJS().get('popupMenu');\n  return popup._current.container;\n}\n\nfunction didSizeChange(element, newElement) {\n  return element.di.bounds.width !== newElement.di.bounds.width ||\n          element.di.bounds.height !== newElement.di.bounds.height;\n}"
  },
  {
    "path": "test/spec/features/replace/BpmnReplace.collaboration.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:collaboration id=\"Collaboration_1wsnry3\">\n    <bpmn:participant id=\"Participant_1\" name=\"A\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Participant_2\" name=\"B\" />\n    <bpmn:messageFlow id=\"MessageFlow_B_to_A\" sourceRef=\"Participant_2\" targetRef=\"Participant_1\" />\n    <bpmn:messageFlow id=\"MessageFlow_1\" sourceRef=\"Task_1\" targetRef=\"Participant_2\" />\n    <bpmn:messageFlow id=\"MessageFlow_3\" sourceRef=\"EndEvent_1\" targetRef=\"Participant_2\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:laneSet>\n      <bpmn:lane id=\"Lane_1\">\n        <bpmn:flowNodeRef>Task_1</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>EndEvent_1</bpmn:flowNodeRef>\n      </bpmn:lane>\n      <bpmn:lane id=\"Lane_2\" />\n    </bpmn:laneSet>\n    <bpmn:task id=\"Task_1\" />\n    <bpmn:endEvent id=\"EndEvent_1\">\n      <bpmn:messageEventDefinition />\n    </bpmn:endEvent>\n  </bpmn:process>\n  <bpmn:process id=\"Process_18059hr\" isExecutable=\"false\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1wsnry3\">\n      <bpmndi:BPMNShape id=\"Participant_0dhyklk_di\" bpmnElement=\"Participant_1\">\n        <dc:Bounds x=\"181\" y=\"82\" width=\"458\" height=\"271\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1lr6kkb_di\" bpmnElement=\"Lane_1\">\n        <dc:Bounds x=\"211\" y=\"82\" width=\"428\" height=\"138\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0c9o07a_di\" bpmnElement=\"Lane_2\">\n        <dc:Bounds x=\"211\" y=\"220\" width=\"428\" height=\"133\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_06fwm9a_di\" bpmnElement=\"Participant_2\">\n        <dc:Bounds x=\"237\" y=\"436\" width=\"378\" height=\"115\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_1xdh89f_di\" bpmnElement=\"MessageFlow_B_to_A\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"368\" y=\"436\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"368\" y=\"353\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"381\" y=\"384.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_0atv48s_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"276\" y=\"112\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_19wrxbj_di\" bpmnElement=\"MessageFlow_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"326\" y=\"192\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"326\" y=\"436\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"281\" y=\"304\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EndEvent_1ooqi8q_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"535\" y=\"134\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"508\" y=\"170\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_B_to_A_di\" bpmnElement=\"MessageFlow_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"553\" y=\"170\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"553\" y=\"434\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"508\" y=\"293\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/replace/BpmnReplace.collaboration.vertical.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:collaboration id=\"Collaboration_1wsnry3\">\n    <bpmn:participant id=\"V_Participant_1\" name=\"Vertical_A\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"V_Participant_2\" name=\"Vertical_B\" />\n    <bpmn:messageFlow id=\"V_MessageFlow_B_to_A\" sourceRef=\"V_Participant_2\" targetRef=\"V_Participant_1\" />\n    <bpmn:messageFlow id=\"MessageFlow_1\" sourceRef=\"Task_1\" targetRef=\"V_Participant_2\" />\n    <bpmn:messageFlow id=\"MessageFlow_3\" sourceRef=\"EndEvent_1\" targetRef=\"V_Participant_2\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:laneSet>\n      <bpmn:lane id=\"Lane_1\">\n        <bpmn:flowNodeRef>Task_1</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>EndEvent_1</bpmn:flowNodeRef>\n      </bpmn:lane>\n      <bpmn:lane id=\"Lane_2\" />\n    </bpmn:laneSet>\n    <bpmn:task id=\"Task_1\" />\n    <bpmn:endEvent id=\"EndEvent_1\">\n      <bpmn:messageEventDefinition />\n    </bpmn:endEvent>\n  </bpmn:process>\n  <bpmn:process id=\"Process_18059hr\" isExecutable=\"false\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1wsnry3\">\n      <bpmndi:BPMNShape id=\"Participant_0dhyklk_di\" bpmnElement=\"V_Participant_1\" isHorizontal=\"false\">\n        <dc:Bounds x=\"82\" y=\"181\" width=\"271\" height=\"458\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1lr6kkb_di\" bpmnElement=\"Lane_1\">\n        <dc:Bounds x=\"82\" y=\"211\" width=\"138\" height=\"428\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0c9o07a_di\" bpmnElement=\"Lane_2\">\n        <dc:Bounds x=\"220\" y=\"211\" width=\"133\" height=\"428\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_06fwm9a_di\" bpmnElement=\"V_Participant_2\" isHorizontal=\"false\">\n        <dc:Bounds x=\"436\" y=\"237\" width=\"115\" height=\"378\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_1xdh89f_di\" bpmnElement=\"V_MessageFlow_B_to_A\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"436\" y=\"368\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"353\" y=\"368\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"384.5\" y=\"381\" width=\"20\" height=\"90\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_0atv48s_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"102\" y=\"286\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_19wrxbj_di\" bpmnElement=\"MessageFlow_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"202\" y=\"326\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"436\" y=\"326\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"304\" y=\"281\" width=\"20\" height=\"90\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"EndEvent_1ooqi8q_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"134\" y=\"535\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"170\" y=\"508\" width=\"20\" height=\"90\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_B_to_A_di\" bpmnElement=\"MessageFlow_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"170\" y=\"553\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"434\" y=\"553\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"293\" y=\"508\" width=\"20\" height=\"90\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/replace/BpmnReplace.collapsedSubProcess.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:signavio=\"http://www.signavio.com\" id=\"sid-edcb32b0-ba3c-4331-9874-58685c514c55\" targetNamespace=\"http://www.signavio.com\" expressionLanguage=\"http://www.w3.org/TR/XPath\" exporter=\"Signavio Process Editor, http://www.signavio.com\" exporterVersion=\"15.4.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n  <error id=\"sid-c4218475-d7d4-4ee6-ae73-5d44c49114b8\" />\n  <process id=\"rootProcess\" name=\"Root\" processType=\"None\" isClosed=\"false\" isExecutable=\"false\">\n    <startEvent id=\"sid-6687E2F4-B03D-4E57-A62B-68FA642BE19C\">\n      <outgoing>sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300</outgoing>\n    </startEvent>\n    <parallelGateway id=\"parallelGateway\" gatewayDirection=\"Diverging\">\n      <incoming>sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300</incoming>\n      <outgoing>sid-F06605E1-AEC1-4B39-8843-4AD3F547B557</outgoing>\n      <outgoing>sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500</outgoing>\n    </parallelGateway>\n    <subProcess id=\"collapsedProcess\" name=\"Collapsed Process\">\n      <incoming>sid-F06605E1-AEC1-4B39-8843-4AD3F547B557</incoming>\n      <outgoing>sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05</outgoing>\n      <startEvent id=\"sid-AB14D824-C8B9-4211-B224-C5AF8CED8BBD\">\n        <outgoing>sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657</outgoing>\n      </startEvent>\n      <task id=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724\" name=\"Check Items\">\n        <incoming>sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657</incoming>\n        <outgoing>sid-FB543319-8DFB-4445-AAA3-720137FB230B</outgoing>\n      </task>\n      <subProcess id=\"expandedProcess\" name=\"Expanded Process\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"bgcolor\" metaValue=\"#ffffff\" />\n          <signavio:signavioMetaData metaKey=\"bordercolor\" metaValue=\"#000000\" />\n        </extensionElements>\n        <incoming>sid-FB543319-8DFB-4445-AAA3-720137FB230B</incoming>\n        <outgoing>sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0</outgoing>\n        <startEvent id=\"sid-3B0273A0-FE3B-4525-9E1F-FBAE2F53C2E7\">\n          <outgoing>sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC</outgoing>\n        </startEvent>\n        <subProcess id=\"collapsedProcess_2\" name=\"Collapsed Process 2\">\n          <incoming>sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC</incoming>\n          <outgoing>sid-910420B0-D11B-4F9D-B285-703D8AC0BA90</outgoing>\n          <startEvent id=\"sid-C67DBACD-2E96-4A69-97F0-9B04CCB255EC\">\n            <outgoing>sid-A7460113-CB75-491D-817B-5E1A8C606B8C</outgoing>\n          </startEvent>\n          <task id=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830\" name=\"Call External Supplier\">\n            <incoming>sid-A7460113-CB75-491D-817B-5E1A8C606B8C</incoming>\n            <outgoing>sid-01982395-64E8-43EF-A6D3-CDD276C312AA</outgoing>\n          </task>\n          <endEvent id=\"sid-987C40F8-82D3-4637-ABCE-A85A5E2AB8A9\">\n            <incoming>sid-01982395-64E8-43EF-A6D3-CDD276C312AA</incoming>\n          </endEvent>\n          <sequenceFlow id=\"sid-A7460113-CB75-491D-817B-5E1A8C606B8C\" sourceRef=\"sid-C67DBACD-2E96-4A69-97F0-9B04CCB255EC\" targetRef=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830\">\n          </sequenceFlow>\n          <sequenceFlow id=\"sid-01982395-64E8-43EF-A6D3-CDD276C312AA\" sourceRef=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830\" targetRef=\"sid-987C40F8-82D3-4637-ABCE-A85A5E2AB8A9\">\n          </sequenceFlow>\n        </subProcess>\n        <endEvent id=\"sid-17C71FEB-D00D-46D0-ACBE-BB424A3EE5A5\">\n          <incoming>sid-910420B0-D11B-4F9D-B285-703D8AC0BA90</incoming>\n        </endEvent>\n        <sequenceFlow id=\"sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC\" sourceRef=\"sid-3B0273A0-FE3B-4525-9E1F-FBAE2F53C2E7\" targetRef=\"collapsedProcess_2\">\n        </sequenceFlow>\n        <sequenceFlow id=\"sid-910420B0-D11B-4F9D-B285-703D8AC0BA90\" sourceRef=\"collapsedProcess_2\" targetRef=\"sid-17C71FEB-D00D-46D0-ACBE-BB424A3EE5A5\">\n        </sequenceFlow>\n      </subProcess>\n      <endEvent id=\"sid-EE9F103D-15EA-4FBB-A4DB-8B94E5F04390\">\n        <incoming>sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0</incoming>\n      </endEvent>\n      <sequenceFlow id=\"sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657\" sourceRef=\"sid-AB14D824-C8B9-4211-B224-C5AF8CED8BBD\" targetRef=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-FB543319-8DFB-4445-AAA3-720137FB230B\" sourceRef=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724\" targetRef=\"expandedProcess\">\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0\" sourceRef=\"expandedProcess\" targetRef=\"sid-EE9F103D-15EA-4FBB-A4DB-8B94E5F04390\">\n      </sequenceFlow>\n    </subProcess>\n    <subProcess id=\"SubProcess_Collapsed\" name=\"SubProcess_Collapsed\">\n      <incoming>sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500</incoming>\n      <outgoing>sid-5B23450F-AF5E-4519-B134-32107776BD44</outgoing>\n      <startEvent id=\"sid-A13CFBB9-5471-4439-96FA-B65862CA7B21\">\n        <outgoing>sid-E71F5783-AFE7-44ED-8A9C-378C95087448</outgoing>\n      </startEvent>\n      <userTask id=\"UserTask\" name=\"UserTask\">\n        <incoming>sid-E71F5783-AFE7-44ED-8A9C-378C95087448</incoming>\n        <outgoing>sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16</outgoing>\n      </userTask>\n      <subProcess id=\"NestedCollapsed_SubProcess\" name=\"NestedCollapse_SubProcess\">\n        <incoming>sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16</incoming>\n        <outgoing>sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519</outgoing>\n        <startEvent id=\"sid-2098A7EE-D7D8-405E-AF61-95BA48E891B6\">\n          <outgoing>sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC</outgoing>\n        </startEvent>\n        <task id=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB\" name=\"NestedCollapse_SubProcess\">\n          <incoming>sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC</incoming>\n          <outgoing>sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E</outgoing>\n        </task>\n        <endEvent id=\"sid-DAFD7764-8FA5-417B-BB33-55E483687A7D\">\n          <incoming>sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E</incoming>\n        </endEvent>\n        <sequenceFlow id=\"sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC\" sourceRef=\"sid-2098A7EE-D7D8-405E-AF61-95BA48E891B6\" targetRef=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB\">\n        </sequenceFlow>\n        <sequenceFlow id=\"sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E\" sourceRef=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB\" targetRef=\"sid-DAFD7764-8FA5-417B-BB33-55E483687A7D\">\n        </sequenceFlow>\n      </subProcess>\n      <endEvent id=\"sid-345BB5A6-CE3B-4711-972A-81E47BA4B667\">\n        <incoming>sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519</incoming>\n      </endEvent>\n      <sequenceFlow id=\"sid-E71F5783-AFE7-44ED-8A9C-378C95087448\" sourceRef=\"sid-A13CFBB9-5471-4439-96FA-B65862CA7B21\" targetRef=\"UserTask\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"bordercolor\" metaValue=\"#000000\" />\n        </extensionElements>\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16\" sourceRef=\"UserTask\" targetRef=\"NestedCollapsed_SubProcess\">\n        <extensionElements>\n          <signavio:signavioMetaData metaKey=\"bordercolor\" metaValue=\"#000000\" />\n        </extensionElements>\n      </sequenceFlow>\n      <sequenceFlow id=\"sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519\" sourceRef=\"NestedCollapsed_SubProcess\" targetRef=\"sid-345BB5A6-CE3B-4711-972A-81E47BA4B667\">\n      </sequenceFlow>\n    </subProcess>\n    <parallelGateway id=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\" gatewayDirection=\"Converging\">\n      <incoming>sid-5B23450F-AF5E-4519-B134-32107776BD44</incoming>\n      <incoming>sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05</incoming>\n      <outgoing>sid-F7DA1903-6A1A-4858-AF4B-286A968C957F</outgoing>\n    </parallelGateway>\n    <boundaryEvent id=\"sid-C586DCF2-0B1B-4878-8042-F9869023F21B\" attachedToRef=\"SubProcess_Collapsed\">\n      <outgoing>sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4</outgoing>\n      <errorEventDefinition id=\"sid-804c8ce9-8013-49e6-a6f5-bf97d24f6cf0\" errorRef=\"sid-c4218475-d7d4-4ee6-ae73-5d44c49114b8\" />\n    </boundaryEvent>\n    <endEvent id=\"sid-A53C38A9-456B-4AC9-9D4A-6EC9663BA77C\">\n      <incoming>sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4</incoming>\n    </endEvent>\n    <subProcess id=\"parallelGateway_withoutContent\" name=\"Ship Items (todo)\">\n      <incoming>sid-F7DA1903-6A1A-4858-AF4B-286A968C957F</incoming>\n      <outgoing>sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3</outgoing>\n    </subProcess>\n    <endEvent id=\"sid-DA90DE99-58B0-4371-B71D-87A718ACB64D\">\n      <incoming>sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3</incoming>\n    </endEvent>\n    <sequenceFlow id=\"sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300\" sourceRef=\"sid-6687E2F4-B03D-4E57-A62B-68FA642BE19C\" targetRef=\"parallelGateway\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-F06605E1-AEC1-4B39-8843-4AD3F547B557\" sourceRef=\"parallelGateway\" targetRef=\"collapsedProcess\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500\" sourceRef=\"parallelGateway\" targetRef=\"SubProcess_Collapsed\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-5B23450F-AF5E-4519-B134-32107776BD44\" sourceRef=\"SubProcess_Collapsed\" targetRef=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05\" sourceRef=\"collapsedProcess\" targetRef=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4\" sourceRef=\"sid-C586DCF2-0B1B-4878-8042-F9869023F21B\" targetRef=\"sid-A53C38A9-456B-4AC9-9D4A-6EC9663BA77C\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-F7DA1903-6A1A-4858-AF4B-286A968C957F\" sourceRef=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\" targetRef=\"parallelGateway_withoutContent\">\n    </sequenceFlow>\n    <sequenceFlow id=\"sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3\" sourceRef=\"parallelGateway_withoutContent\" targetRef=\"sid-DA90DE99-58B0-4371-B71D-87A718ACB64D\">\n    </sequenceFlow>\n  </process>\n  <bpmndi:BPMNDiagram id=\"sid-cbeafa41-c891-415c-ab0d-3eb4a233f9ed\">\n    <bpmndi:BPMNPlane id=\"sid-5fb4720f-4b99-4727-8770-dd4166bcd5e4\" bpmnElement=\"rootProcess\">\n      <bpmndi:BPMNEdge id=\"sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3_gui\" bpmnElement=\"sid-3FAE72F2-4037-4CBA-8B89-01D7FC7FF3E3\">\n        <omgdi:waypoint x=\"675\" y=\"215\" />\n        <omgdi:waypoint x=\"720\" y=\"215\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-F7DA1903-6A1A-4858-AF4B-286A968C957F_gui\" bpmnElement=\"sid-F7DA1903-6A1A-4858-AF4B-286A968C957F\">\n        <omgdi:waypoint x=\"530\" y=\"215.41484716157206\" />\n        <omgdi:waypoint x=\"575\" y=\"215.2183406113537\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4_gui\" bpmnElement=\"sid-DCB98638-BEBD-4548-B501-F0E29AC71ED4\">\n        <omgdi:waypoint x=\"420\" y=\"370\" />\n        <omgdi:waypoint x=\"420\" y=\"427.89053746720595\" />\n        <omgdi:waypoint x=\"515\" y=\"428\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05_gui\" bpmnElement=\"sid-31F6EC44-E44C-4121-B4FE-BD69AF208C05\">\n        <omgdi:waypoint x=\"445\" y=\"110\" />\n        <omgdi:waypoint x=\"510.5\" y=\"110\" />\n        <omgdi:waypoint x=\"510.5\" y=\"195\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-5B23450F-AF5E-4519-B134-32107776BD44_gui\" bpmnElement=\"sid-5B23450F-AF5E-4519-B134-32107776BD44\">\n        <omgdi:waypoint x=\"445\" y=\"315\" />\n        <omgdi:waypoint x=\"510.5\" y=\"315\" />\n        <omgdi:waypoint x=\"510.5\" y=\"235\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500_gui\" bpmnElement=\"sid-FC2ECAF5-771E-4ED3-BEF6-EFAB45E79500\">\n        <omgdi:waypoint x=\"255.5\" y=\"235\" />\n        <omgdi:waypoint x=\"255.5\" y=\"315\" />\n        <omgdi:waypoint x=\"345\" y=\"315\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-F06605E1-AEC1-4B39-8843-4AD3F547B557_gui\" bpmnElement=\"sid-F06605E1-AEC1-4B39-8843-4AD3F547B557\">\n        <omgdi:waypoint x=\"255.5\" y=\"195\" />\n        <omgdi:waypoint x=\"255.5\" y=\"110\" />\n        <omgdi:waypoint x=\"345\" y=\"110\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300_gui\" bpmnElement=\"sid-89A3F9F2-CCC8-46C7-816B-DD8AC8A98300\">\n        <omgdi:waypoint x=\"190\" y=\"215.09316770186336\" />\n        <omgdi:waypoint x=\"235\" y=\"215.37267080745343\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"sid-6687E2F4-B03D-4E57-A62B-68FA642BE19C_gui\" bpmnElement=\"sid-6687E2F4-B03D-4E57-A62B-68FA642BE19C\">\n        <omgdc:Bounds x=\"160\" y=\"200\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"parallelGateway_gui\" bpmnElement=\"parallelGateway\">\n        <omgdc:Bounds x=\"235\" y=\"195\" width=\"40\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"collapsedProcess_gui\" bpmnElement=\"collapsedProcess\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"345\" y=\"70\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-c53530f5-9da8-4535-ae6d-c94859ea5b93\">\n          <omgdc:Bounds x=\"352.99214363098145\" y=\"102\" width=\"84.08571243286133\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ProcurePayment_gui\" bpmnElement=\"SubProcess_Collapsed\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"345\" y=\"275\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-c53530f5-9da8-4535-ae6d-c94859ea5b93\">\n          <omgdc:Bounds x=\"349.520715713501\" y=\"307\" width=\"91.02856826782227\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B_gui\" bpmnElement=\"sid-7412307A-1A0F-43BA-933B-6E84157B4E5B\">\n        <omgdc:Bounds x=\"490\" y=\"195\" width=\"40\" height=\"40\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-A53C38A9-456B-4AC9-9D4A-6EC9663BA77C_gui\" bpmnElement=\"sid-A53C38A9-456B-4AC9-9D4A-6EC9663BA77C\">\n        <omgdc:Bounds x=\"515\" y=\"413.89053746720595\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"parallelGateway_withoutContent_gui\" bpmnElement=\"parallelGateway_withoutContent\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"575\" y=\"175\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-c53530f5-9da8-4535-ae6d-c94859ea5b93\">\n          <omgdc:Bounds x=\"595.7207126617432\" y=\"201\" width=\"58.62857437133789\" height=\"24\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-DA90DE99-58B0-4371-B71D-87A718ACB64D_gui\" bpmnElement=\"sid-DA90DE99-58B0-4371-B71D-87A718ACB64D\">\n        <omgdc:Bounds x=\"720\" y=\"201\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-C586DCF2-0B1B-4878-8042-F9869023F21B_gui\" bpmnElement=\"sid-C586DCF2-0B1B-4878-8042-F9869023F21B\">\n        <omgdc:Bounds x=\"405\" y=\"340\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-c53530f5-9da8-4535-ae6d-c94859ea5b93\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"sid-99a6a759-9161-4f4a-a83d-9ad6b9fbdc7e\">\n    <bpmndi:BPMNPlane id=\"sid-62501c88-ba6c-44ea-90f1-3ccf6a7cea2f\" bpmnElement=\"collapsedProcess\">\n      <bpmndi:BPMNShape id=\"sid-AB14D824-C8B9-4211-B224-C5AF8CED8BBD_gui\" bpmnElement=\"sid-AB14D824-C8B9-4211-B224-C5AF8CED8BBD\">\n        <omgdc:Bounds x=\"150\" y=\"140\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724_gui\" bpmnElement=\"sid-9E3BA75C-29DD-4DAC-8283-8FDE4E9A6724\">\n        <omgdc:Bounds x=\"225\" y=\"115\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-592ddc98-48fc-42b3-b7f9-1df8b6d368c5\">\n          <omgdc:Bounds x=\"241.44285583496094\" y=\"147\" width=\"67.11428833007812\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-3B0273A0-FE3B-4525-9E1F-FBAE2F53C2E7_gui\" bpmnElement=\"sid-3B0273A0-FE3B-4525-9E1F-FBAE2F53C2E7\">\n        <omgdc:Bounds x=\"390\" y=\"140\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"collapsedProcess_2_gui\" bpmnElement=\"collapsedProcess_2\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"465\" y=\"115\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-592ddc98-48fc-42b3-b7f9-1df8b6d368c5\">\n          <omgdc:Bounds x=\"481.4778537750244\" y=\"141\" width=\"67.11429214477539\" height=\"24\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-17C71FEB-D00D-46D0-ACBE-BB424A3EE5A5_gui\" bpmnElement=\"sid-17C71FEB-D00D-46D0-ACBE-BB424A3EE5A5\">\n        <omgdc:Bounds x=\"610\" y=\"141\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC_gui\" bpmnElement=\"sid-472B540C-A0CD-46F4-9640-DF692EC1BFFC\">\n        <omgdi:waypoint x=\"420\" y=\"155\" />\n        <omgdi:waypoint x=\"465\" y=\"155\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-910420B0-D11B-4F9D-B285-703D8AC0BA90_gui\" bpmnElement=\"sid-910420B0-D11B-4F9D-B285-703D8AC0BA90\">\n        <omgdi:waypoint x=\"565\" y=\"155\" />\n        <omgdi:waypoint x=\"610\" y=\"155\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"expandedProcess_gui\" bpmnElement=\"expandedProcess\" isExpanded=\"true\">\n        <omgdc:Bounds x=\"370\" y=\"79\" width=\"288\" height=\"151\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-592ddc98-48fc-42b3-b7f9-1df8b6d368c5\">\n          <omgdc:Bounds x=\"378\" y=\"89\" width=\"65.57142639160156\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-EE9F103D-15EA-4FBB-A4DB-8B94E5F04390_gui\" bpmnElement=\"sid-EE9F103D-15EA-4FBB-A4DB-8B94E5F04390\">\n        <omgdc:Bounds x=\"703\" y=\"141\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657_gui\" bpmnElement=\"sid-EB275CF2-5EF1-44FA-B41B-71EB37CC2657\">\n        <omgdi:waypoint x=\"180\" y=\"155\" />\n        <omgdi:waypoint x=\"225\" y=\"155\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-FB543319-8DFB-4445-AAA3-720137FB230B_gui\" bpmnElement=\"sid-FB543319-8DFB-4445-AAA3-720137FB230B\">\n        <omgdi:waypoint x=\"325\" y=\"154.89539748953976\" />\n        <omgdi:waypoint x=\"370\" y=\"154.80125523012552\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0_gui\" bpmnElement=\"sid-B99D259B-1BD5-45FF-BD57-FB99C360BAC0\">\n        <omgdi:waypoint x=\"658\" y=\"154.85467980295567\" />\n        <omgdi:waypoint x=\"703\" y=\"154.9655172413793\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-592ddc98-48fc-42b3-b7f9-1df8b6d368c5\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"sid-0bbc44a9-8a6a-44a1-8b61-0cf870c26fe4\">\n    <bpmndi:BPMNPlane id=\"sid-275fa3fd-9114-4005-b305-71f6c1411c24\" bpmnElement=\"collapsedProcess_2\">\n      <bpmndi:BPMNShape id=\"sid-C67DBACD-2E96-4A69-97F0-9B04CCB255EC_gui\" bpmnElement=\"sid-C67DBACD-2E96-4A69-97F0-9B04CCB255EC\">\n        <omgdc:Bounds x=\"230\" y=\"130\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830_gui\" bpmnElement=\"sid-3459D5A6-4E18-4133-8362-0418AC9CE830\">\n        <omgdc:Bounds x=\"305\" y=\"105\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-efc2a4e3-a5c6-411d-80d4-64f3a53bc4a4\">\n          <omgdc:Bounds x=\"321.44285583496094\" y=\"131\" width=\"67.11428833007812\" height=\"24\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-987C40F8-82D3-4637-ABCE-A85A5E2AB8A9_gui\" bpmnElement=\"sid-987C40F8-82D3-4637-ABCE-A85A5E2AB8A9\">\n        <omgdc:Bounds x=\"450\" y=\"131\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-A7460113-CB75-491D-817B-5E1A8C606B8C_gui\" bpmnElement=\"sid-A7460113-CB75-491D-817B-5E1A8C606B8C\">\n        <omgdi:waypoint x=\"260\" y=\"145\" />\n        <omgdi:waypoint x=\"305\" y=\"145\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-01982395-64E8-43EF-A6D3-CDD276C312AA_gui\" bpmnElement=\"sid-01982395-64E8-43EF-A6D3-CDD276C312AA\">\n        <omgdi:waypoint x=\"405\" y=\"145\" />\n        <omgdi:waypoint x=\"450\" y=\"145\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-efc2a4e3-a5c6-411d-80d4-64f3a53bc4a4\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"sid-19b0e874-234e-4bee-b83c-068fe088c591\">\n    <bpmndi:BPMNPlane id=\"sid-89d69f37-848f-4da3-bb9a-df3a9889286d\" bpmnElement=\"SubProcess_Collapsed\">\n      <bpmndi:BPMNShape id=\"sid-A13CFBB9-5471-4439-96FA-B65862CA7B21_gui\" bpmnElement=\"sid-A13CFBB9-5471-4439-96FA-B65862CA7B21\">\n        <omgdc:Bounds x=\"190\" y=\"170\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"UserTask_gui\" bpmnElement=\"UserTask\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"265\" y=\"145\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-3bb65e49-bd30-45eb-a52f-e94a5e93edbc\">\n          <omgdc:Bounds x=\"281.09214210510254\" y=\"177\" width=\"67.88571548461914\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"NestedCollapsed_SubProcess_gui\" bpmnElement=\"NestedCollapsed_SubProcess\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"410\" y=\"145\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-3bb65e49-bd30-45eb-a52f-e94a5e93edbc\">\n          <omgdc:Bounds x=\"424.5492877960205\" y=\"165\" width=\"70.9714241027832\" height=\"36\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-345BB5A6-CE3B-4711-972A-81E47BA4B667_gui\" bpmnElement=\"sid-345BB5A6-CE3B-4711-972A-81E47BA4B667\">\n        <omgdc:Bounds x=\"555\" y=\"171\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-E71F5783-AFE7-44ED-8A9C-378C95087448_gui\" bpmnElement=\"sid-E71F5783-AFE7-44ED-8A9C-378C95087448\">\n        <omgdi:waypoint x=\"220\" y=\"185\" />\n        <omgdi:waypoint x=\"265\" y=\"185\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16_gui\" bpmnElement=\"sid-6B9741CD-D94B-41C7-A2EA-63A4C9445E16\">\n        <omgdi:waypoint x=\"365\" y=\"185\" />\n        <omgdi:waypoint x=\"410\" y=\"185\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519_gui\" bpmnElement=\"sid-1A9DABC6-6079-4BF2-9D49-C4DC9569C519\">\n        <omgdi:waypoint x=\"510\" y=\"185\" />\n        <omgdi:waypoint x=\"555\" y=\"185\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-3bb65e49-bd30-45eb-a52f-e94a5e93edbc\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"sid-63fc7b22-cc85-458f-aaab-e165a0e36240\">\n    <bpmndi:BPMNPlane id=\"sid-3f3c0ecd-73e0-4a0a-b05c-0b6bd60eeeb1\" bpmnElement=\"NestedCollapsed_SubProcess\">\n      <bpmndi:BPMNShape id=\"sid-2098A7EE-D7D8-405E-AF61-95BA48E891B6_gui\" bpmnElement=\"sid-2098A7EE-D7D8-405E-AF61-95BA48E891B6\">\n        <omgdc:Bounds x=\"240\" y=\"250\" width=\"30\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB_gui\" bpmnElement=\"sid-E21C867A-7A56-46DD-9A1E-94C02FDB18FB\">\n        <omgdc:Bounds x=\"315\" y=\"225\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel labelStyle=\"sid-d93ac8fb-7a66-4ace-93a6-71582a8ab1a1\">\n          <omgdc:Bounds x=\"329.51428604125977\" y=\"245\" width=\"70.97142791748047\" height=\"36\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-DAFD7764-8FA5-417B-BB33-55E483687A7D_gui\" bpmnElement=\"sid-DAFD7764-8FA5-417B-BB33-55E483687A7D\">\n        <omgdc:Bounds x=\"460\" y=\"251\" width=\"28\" height=\"28\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC_gui\" bpmnElement=\"sid-E5404926-738D-4447-87FE-FC6DD1E8BEFC\">\n        <omgdi:waypoint x=\"270\" y=\"265\" />\n        <omgdi:waypoint x=\"315\" y=\"265\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E_gui\" bpmnElement=\"sid-FED62A8F-6C3A-4BB2-8DE9-18FB0B35B50E\">\n        <omgdi:waypoint x=\"415\" y=\"265\" />\n        <omgdi:waypoint x=\"460\" y=\"265\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-d93ac8fb-7a66-4ace-93a6-71582a8ab1a1\">\n      <omgdc:Font name=\"Arial\" size=\"12\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n</definitions>"
  },
  {
    "path": "test/spec/features/replace/BpmnReplace.compensation.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_bOa6QL90EeWDkOoe0mYe7w\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:task id=\"Task_1\" isForCompensation=\"true\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"116.0\" y=\"189.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/spec/features/replace/BpmnReplace.dataObjects.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"Task\">\n      <bpmn:property id=\"TaskPlaceholderProperty\" name=\"__targetRef_placeholder\" />\n      <bpmn:dataInputAssociation id=\"DataInputAssociation\">\n        <bpmn:sourceRef>DataObjectReference_IN</bpmn:sourceRef>\n        <bpmn:targetRef>TaskPlaceholderProperty</bpmn:targetRef>\n      </bpmn:dataInputAssociation>\n      <bpmn:dataOutputAssociation id=\"DataOutputAssociation_1by9zp9\">\n        <bpmn:targetRef>DataObjectReference_OUT</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n    </bpmn:task>\n    <bpmn:dataObjectReference id=\"DataObjectReference_IN\" dataObjectRef=\"DataObject_1l9lukc\" />\n    <bpmn:dataObject id=\"DataObject_1l9lukc\" />\n    <bpmn:dataObjectReference id=\"DataObjectReference_OUT\" dataObjectRef=\"DataObject_03twvyv\" />\n    <bpmn:dataObject id=\"DataObject_03twvyv\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_di\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"132\" y=\"150\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_IN_di\" bpmnElement=\"DataObjectReference_IN\">\n        <dc:Bounds x=\"62\" y=\"33\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"80\" y=\"87\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_di\" bpmnElement=\"DataInputAssociation\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"98\" y=\"81\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"152\" y=\"150\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"DataObjectReference_OUT_di\" bpmnElement=\"DataObjectReference_OUT\">\n        <dc:Bounds x=\"232\" y=\"33\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"250\" y=\"87\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_1by9zp9_di\" bpmnElement=\"DataOutputAssociation_1by9zp9\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"207\" y=\"150\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"248\" y=\"83\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/replace/BpmnReplace.eventSubProcesses.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.2.2\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess_1\" name=\"SubProcess_1\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>\n      <bpmn:startEvent id=\"StartEvent_1\" name=\"StartEvent_1\">\n        <bpmn:outgoing>SequenceFlow_3</bpmn:outgoing>\n        <bpmn:messageEventDefinition />\n      </bpmn:startEvent>\n      <bpmn:task id=\"Task_1\">\n        <bpmn:incoming>SequenceFlow_3</bpmn:incoming>\n      </bpmn:task>\n      <bpmn:sequenceFlow id=\"SequenceFlow_3\" sourceRef=\"StartEvent_1\" targetRef=\"Task_1\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"SubProcess_2\" name=\"SubProcess_2\" triggeredByEvent=\"true\">\n      <bpmn:startEvent id=\"StartEvent_2\" name=\"StartEvent_2\" isInterrupting=\"false\">\n        <bpmn:outgoing>SequenceFlow_4</bpmn:outgoing>\n        <bpmn:messageEventDefinition />\n      </bpmn:startEvent>\n      <bpmn:task id=\"Task_2\">\n        <bpmn:incoming>SequenceFlow_4</bpmn:incoming>\n      </bpmn:task>\n      <bpmn:sequenceFlow id=\"SequenceFlow_4\" sourceRef=\"StartEvent_2\" targetRef=\"Task_2\" />\n    </bpmn:subProcess>\n    <bpmn:task id=\"Task_3\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"Task_4\">\n      <bpmn:incoming>SequenceFlow_2</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"Task_3\" targetRef=\"SubProcess_1\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"SubProcess_1\" targetRef=\"Task_4\" />\n    <bpmn:subProcess id=\"SubProcess_3\" name=\"SubProcess_3\" triggeredByEvent=\"true\">\n      <bpmn:startEvent id=\"StartEvent_3\" name=\"StartEvent_3\">\n        <bpmn:outgoing>SequenceFlow_094t9fa</bpmn:outgoing>\n        <bpmn:errorEventDefinition />\n      </bpmn:startEvent>\n      <bpmn:task id=\"Task_5\">\n        <bpmn:incoming>SequenceFlow_094t9fa</bpmn:incoming>\n      </bpmn:task>\n      <bpmn:sequenceFlow id=\"SequenceFlow_094t9fa\" sourceRef=\"StartEvent_3\" targetRef=\"Task_5\" />\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"SubProcess_4\" name=\"SubProcess_4\" isForCompensation=\"true\">\n      <bpmn:startEvent id=\"Event_1lmhg6t\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"374\" y=\"65\" width=\"214\" height=\"170\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"394\" y=\"134\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"367\" y=\"170\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"460\" y=\"112\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_3_di\" bpmnElement=\"SequenceFlow_3\">\n        <di:waypoint x=\"430\" y=\"152\" />\n        <di:waypoint x=\"460\" y=\"152\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"400\" y=\"142\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"SubProcess_2_di\" bpmnElement=\"SubProcess_2\" isExpanded=\"true\">\n        <dc:Bounds x=\"122\" y=\"66\" width=\"204\" height=\"168\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_2_di\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds x=\"137\" y=\"132\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"110\" y=\"168\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_2_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"209\" y=\"110\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_4_di\" bpmnElement=\"SequenceFlow_4\">\n        <di:waypoint x=\"173\" y=\"150\" />\n        <di:waypoint x=\"209\" y=\"150\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"151\" y=\"120.5\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_3_di\" bpmnElement=\"Task_3\">\n        <dc:Bounds x=\"685\" y=\"175\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_4_di\" bpmnElement=\"Task_4\">\n        <dc:Bounds x=\"685\" y=\"67\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_09cm4qb_di\" bpmnElement=\"SubProcess_3\" isExpanded=\"true\">\n        <dc:Bounds x=\"816\" y=\"59\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_1v1eve6_di\" bpmnElement=\"StartEvent_3\">\n        <dc:Bounds x=\"858\" y=\"134\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"831\" y=\"170\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1j96pnq_di\" bpmnElement=\"Task_5\">\n        <dc:Bounds x=\"972\" y=\"112\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_094t9fa_di\" bpmnElement=\"SequenceFlow_094t9fa\">\n        <di:waypoint x=\"894\" y=\"152\" />\n        <di:waypoint x=\"972\" y=\"152\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"888\" y=\"127\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Activity_11qbmnl_di\" bpmnElement=\"SubProcess_4\" isExpanded=\"true\">\n        <dc:Bounds x=\"290\" y=\"270\" width=\"350\" height=\"200\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1lmhg6t_di\" bpmnElement=\"Event_1lmhg6t\">\n        <dc:Bounds x=\"330\" y=\"352\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"685\" y=\"215\" />\n        <di:waypoint x=\"588\" y=\"215\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"406\" y=\"251\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_2_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint x=\"589\" y=\"107\" />\n        <di:waypoint x=\"685\" y=\"107\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"469.5\" y=\"251\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/replace/BpmnReplace.poolMessageFlows.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.5.0\">\n  <bpmn:collaboration id=\"Collaboration_16ydlxc\">\n    <bpmn:participant id=\"Participant_1\" name=\"Participant_1\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Participant_2\" name=\"Participant_2\" processRef=\"Process_2\" />\n    <bpmn:messageFlow id=\"MessageFlow_1\" sourceRef=\"Task_A\" targetRef=\"Task_B\" />\n    <bpmn:messageFlow id=\"MessageFlow_2\" sourceRef=\"Task_B\" targetRef=\"Task_A\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:laneSet />\n    <bpmn:task id=\"Task_B\" name=\"Task_B\" />\n  </bpmn:process>\n  <bpmn:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_A\" name=\"Task_A\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_16ydlxc\">\n      <bpmndi:BPMNShape id=\"Participant_1_di\" bpmnElement=\"Participant_1\">\n        <dc:Bounds x=\"94\" y=\"483\" width=\"372\" height=\"149\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_B_di\" bpmnElement=\"Task_B\">\n        <dc:Bounds x=\"332\" y=\"532\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_2_di\" bpmnElement=\"Participant_2\">\n        <dc:Bounds x=\"96\" y=\"40\" width=\"383\" height=\"125\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_A_di\" bpmnElement=\"Task_A\">\n        <dc:Bounds x=\"332\" y=\"61\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_1_di\" bpmnElement=\"MessageFlow_1\">\n        <di:waypoint x=\"400\" y=\"141\" />\n        <di:waypoint x=\"402\" y=\"532\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"815\" y=\"301.5\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"MessageFlow_2_di\" bpmnElement=\"MessageFlow_2\">\n        <di:waypoint x=\"366\" y=\"532\" />\n        <di:waypoint x=\"366\" y=\"141\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"795\" y=\"316.5\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/replace/BpmnReplace.poolMessageFlows.vertical.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.5.0\">\n  <bpmn:collaboration id=\"Collaboration_16ydlxc\">\n    <bpmn:participant id=\"V_Participant_1\" name=\"V_Participant_1\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"V_Participant_2\" name=\"V_Participant_2\" processRef=\"Process_2\" />\n    <bpmn:messageFlow id=\"V_MessageFlow_1\" sourceRef=\"Task_A\" targetRef=\"Task_B\" />\n    <bpmn:messageFlow id=\"V_MessageFlow_2\" sourceRef=\"Task_B\" targetRef=\"Task_A\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:laneSet />\n    <bpmn:task id=\"Task_B\" name=\"Task_B\" />\n  </bpmn:process>\n  <bpmn:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_A\" name=\"Task_A\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_16ydlxc\">\n      <bpmndi:BPMNShape id=\"Participant_1_di\" bpmnElement=\"V_Participant_1\" isHorizontal=\"false\">\n        <dc:Bounds x=\"483\" y=\"94\" width=\"149\" height=\"372\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_B_di\" bpmnElement=\"Task_B\">\n        <dc:Bounds x=\"522\" y=\"342\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_2_di\" bpmnElement=\"V_Participant_2\" isHorizontal=\"false\">\n        <dc:Bounds x=\"40\" y=\"96\" width=\"125\" height=\"383\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_A_di\" bpmnElement=\"Task_A\">\n        <dc:Bounds x=\"51\" y=\"342\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"V_MessageFlow_1_di\" bpmnElement=\"V_MessageFlow_1\">\n        <di:waypoint x=\"151\" y=\"400\" />\n        <di:waypoint x=\"522\" y=\"402\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"301.5\" y=\"815\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"MessageFlow_2_di\" bpmnElement=\"V_MessageFlow_2\">\n        <di:waypoint x=\"522\" y=\"366\" />\n        <di:waypoint x=\"151\" y=\"366\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"316.5\" y=\"795\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/replace/BpmnReplaceSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  assign,\n  pick\n} from 'min-dash';\n\nimport modelingModule from 'lib/features/modeling';\nimport replaceModule from 'lib/features/replace';\nimport moveModule from 'diagram-js/lib/features/move';\nimport coreModule from 'lib/core';\n\nimport camundaModdleModule from 'camunda-bpmn-moddle/lib';\nimport camundaPackage from 'camunda-bpmn-moddle/resources/camunda.json';\n\nimport {\n  is,\n  getDi\n} from 'lib/util/ModelUtil';\n\nimport {\n  isExpanded,\n  isInterrupting,\n  isEventSubProcess,\n  hasErrorEventDefinition\n} from 'lib/util/DiUtil';\n\nimport { getMid } from 'diagram-js/lib/layout/LayoutUtil';\n\n\ndescribe('features/replace - bpmn replace', function() {\n\n  var testModules = [\n    camundaModdleModule,\n    coreModule,\n    modelingModule,\n    moveModule,\n    replaceModule\n  ];\n\n\n  describe('should replace', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    it('task', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var task = elementRegistry.get('Task_1');\n      var newElementData = {\n        type: 'bpmn:UserTask'\n      };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(task, newElementData);\n\n      // then\n      var businessObject = newElement.businessObject;\n\n      expect(newElement).to.exist;\n      expect(is(businessObject, 'bpmn:UserTask')).to.be.true;\n    }));\n\n\n    it('Task with new DI', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var task = elementRegistry.get('Task_1');\n      var taskDi = getDi(taskDi);\n      var newElementData = {\n        type: 'bpmn:UserTask'\n      };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(task, newElementData);\n\n      // then\n      expect(newElement).to.exist;\n\n    }));\n\n\n    it('gateway', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var gateway = elementRegistry.get('ExclusiveGateway_1');\n      var newElementData = {\n        type: 'bpmn:InclusiveGateway'\n      };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(gateway, newElementData);\n\n\n      // then\n      var businessObject = newElement.businessObject;\n\n      expect(newElement).to.exist;\n      expect(is(businessObject, 'bpmn:InclusiveGateway')).to.be.true;\n      expect(newElement.di.isMarkerVisible).to.not.exist;\n    }));\n\n\n    it('gateway and set marker', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var gateway = elementRegistry.get('ComplexGateway_1');\n      var newElementData = {\n        type: 'bpmn:ExclusiveGateway'\n      };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(gateway, newElementData);\n\n      // then\n      var businessObject = newElement.businessObject;\n\n      expect(newElement).to.exist;\n      expect(is(businessObject, 'bpmn:ExclusiveGateway')).to.be.true;\n      expect(newElement.di.isMarkerVisible).to.be.true;\n    }));\n\n\n    it('expanded sub process', inject(function(elementRegistry, modeling, bpmnReplace, canvas) {\n\n      // given\n      var subProcess = elementRegistry.get('SubProcess_1'),\n          newElementData = {\n            type: 'bpmn:Transaction',\n            isExpanded: true\n          };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(subProcess, newElementData);\n\n      // then\n      expect(newElement).to.exist;\n      expect(is(newElement.businessObject, 'bpmn:Transaction')).to.be.true;\n\n    }));\n\n\n    it('transaction', inject(function(elementRegistry, modeling, bpmnReplace, canvas) {\n\n      // given\n      var transaction = elementRegistry.get('Transaction_1'),\n          newElementData = {\n            type: 'bpmn:SubProcess',\n            isExpanded: true\n          };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(transaction, newElementData);\n\n      // then\n      expect(newElement).to.exist;\n      expect(is(newElement.businessObject, 'bpmn:SubProcess')).to.be.true;\n\n    }));\n\n\n    it('event sub process', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var transaction = elementRegistry.get('SubProcess_1'),\n          newElementData = {\n            type: 'bpmn:SubProcess',\n            triggeredByEvent: true\n          };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(transaction, newElementData);\n\n      // then\n      expect(newElement).to.exist;\n      expect(isEventSubProcess(newElement)).to.be.true;\n\n    }));\n\n\n    describe('boundary event', function() {\n\n      it('<non-interrupting> with <interrupting>',\n        inject(function(elementRegistry, modeling, bpmnReplace, canvas) {\n\n          // given\n          var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n              boundaryBo = boundaryEvent.businessObject,\n              newElementData = {\n                type: 'bpmn:BoundaryEvent',\n                eventDefinitionType: 'bpmn:TimerEventDefinition',\n                cancelActivity: true\n              };\n\n          var eventDefinitions = boundaryBo.get('eventDefinitions').slice();\n\n          // when\n          var newElement = bpmnReplace.replaceElement(boundaryEvent, newElementData);\n          var newBo = newElement.businessObject;\n\n          // then\n          expect(newElement).to.exist;\n\n          expect(is(newBo, 'bpmn:BoundaryEvent')).to.be.true;\n\n          expect(newBo.get('eventDefinitions')).to.jsonEqual(eventDefinitions, skipId);\n\n          expect(newBo.cancelActivity).to.be.true;\n        })\n      );\n\n\n      it('<interrupting> with <non-interrupting>',\n        inject(function(elementRegistry, modeling, bpmnReplace, canvas) {\n\n          // given\n          var boundaryEvent = elementRegistry.get('BoundaryEvent_2'),\n              boundaryBo = boundaryEvent.businessObject,\n              newElementData = {\n                type: 'bpmn:BoundaryEvent',\n                eventDefinitionType: 'bpmn:ConditionalEventDefinition',\n                cancelActivity: false\n              };\n\n          var eventDefinitions = boundaryBo.get('eventDefinitions').slice();\n\n          // when\n          var newElement = bpmnReplace.replaceElement(boundaryEvent, newElementData);\n          var newBo = newElement.businessObject;\n\n          // then\n          expect(newElement).to.exist;\n\n          expect(is(newBo, 'bpmn:BoundaryEvent')).to.be.true;\n\n          expect(newBo.get('eventDefinitions')).to.jsonEqual(eventDefinitions, skipId);\n\n          expect(newBo.cancelActivity).to.be.false;\n        })\n      );\n\n\n      it('<timer> with <signal>',\n        inject(function(elementRegistry, modeling, bpmnReplace, canvas) {\n\n          // given\n          var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n              newElementData = {\n                type: 'bpmn:BoundaryEvent',\n                eventDefinitionType: 'bpmn:SignalEventDefinition',\n                cancelActivity: false\n              };\n\n          // when\n          var newElement = bpmnReplace.replaceElement(boundaryEvent, newElementData);\n\n          var newBo = newElement.businessObject;\n          var newEventDefinitions = newBo.get('eventDefinitions');\n          var newEventDefinition = newEventDefinitions[0];\n\n          // then\n          expect(newElement).to.exist;\n          expect(newEventDefinitions).to.have.length(1);\n\n          expect(is(newBo, 'bpmn:BoundaryEvent')).to.be.true;\n          expect(is(newEventDefinition, 'bpmn:SignalEventDefinition')).to.be.true;\n\n          expect(newBo.cancelActivity).to.be.false;\n        })\n      );\n\n\n      it('<conditional> with <timer>',\n        inject(function(elementRegistry, modeling, bpmnReplace, canvas) {\n\n          // given\n          var boundaryEvent = elementRegistry.get('BoundaryEvent_2'),\n              newElementData = {\n                type: 'bpmn:BoundaryEvent',\n                eventDefinitionType: 'bpmn:TimerEventDefinition'\n              };\n\n          // when\n          var newElement = bpmnReplace.replaceElement(boundaryEvent, newElementData);\n\n          var newBo = newElement.businessObject;\n          var newEventDefinitions = newBo.get('eventDefinitions');\n          var newEventDefinition = newEventDefinitions[0];\n\n          // then\n          expect(newElement).to.exist;\n          expect(newEventDefinitions).to.have.length(1);\n\n          expect(is(newBo, 'bpmn:BoundaryEvent')).to.be.true;\n          expect(is(newEventDefinition, 'bpmn:TimerEventDefinition')).to.be.true;\n\n          expect(newBo.cancelActivity).to.be.true;\n        })\n      );\n\n\n      it('updating host',\n        inject(function(elementRegistry, modeling, bpmnReplace, canvas) {\n\n          // given\n          var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n              host = elementRegistry.get('Task_1'),\n              newElementData = {\n                type: 'bpmn:BoundaryEvent',\n                eventDefinitionType: 'bpmn:ErrorEventDefinition'\n              };\n\n          // when\n          var newElement = bpmnReplace.replaceElement(boundaryEvent, newElementData);\n\n          // then\n          expect(newElement.host).to.exist;\n          expect(newElement.host).to.eql(host);\n        })\n      );\n\n    });\n\n  });\n\n\n  describe('should replace in sub-process (collapsed)', function() {\n\n    var diagramXML = require('./BpmnReplace.collapsedSubProcess.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    beforeEach(inject(function(canvas) {\n      canvas.setRootElement(canvas.findRoot('SubProcess_Collapsed_plane'));\n    }));\n\n\n    it('task', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var task = elementRegistry.get('UserTask');\n      var newElementData = {\n        type: 'bpmn:ServiceTask'\n      };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(task, newElementData);\n\n      // then\n      var businessObject = newElement.businessObject;\n\n      expect(newElement).to.exist;\n      expect(is(businessObject, 'bpmn:ServiceTask')).to.be.true;\n    }));\n\n\n    it('task with collapsed sub-process', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var task = elementRegistry.get('UserTask');\n      var newElementData = {\n        type: 'bpmn:SubProcess'\n      };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(task, newElementData);\n\n      // then\n      var businessObject = newElement.businessObject;\n\n      expect(newElement).to.exist;\n      expect(is(businessObject, 'bpmn:SubProcess')).to.be.true;\n    }));\n\n\n    it('collapsed sub-process with task', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var task = elementRegistry.get('NestedCollapsed_SubProcess');\n      var newElementData = {\n        type: 'bpmn:Task'\n      };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(task, newElementData);\n\n      // then\n      var businessObject = newElement.businessObject;\n\n      expect(newElement).to.exist;\n      expect(is(businessObject, 'bpmn:Task')).to.be.true;\n    }));\n  });\n\n\n  describe('should replace in collaboration', function() {\n\n    var diagramXML = require('./BpmnReplace.collaboration.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    it('expanded with collapsed pool', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var shape = elementRegistry.get('Participant_1');\n\n      var messageFlow = elementRegistry.get('MessageFlow_B_to_A');\n\n      var collapsedBounds = assign({}, getBounds(shape), { height: 60 });\n\n      // when\n      var newShape = bpmnReplace.replaceElement(shape, {\n        type: 'bpmn:Participant',\n        isExpanded: false\n      });\n\n      // then\n      expect(isExpanded(newShape)).to.be.false; // collapsed\n      expect(newShape.children).to.be.empty;\n      expect(newShape.di.isHorizontal).to.be.true;\n\n      expect(newShape).to.have.bounds(collapsedBounds);\n\n      expect(messageFlow).to.have.waypoints([\n        { x: 368, y: 436 },\n        { x: 368, y: newShape.y + collapsedBounds.height }\n      ]);\n    }));\n\n\n    it('collapsed with expanded pool', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var shape = elementRegistry.get('Participant_2');\n\n      var expandedBounds = assign({}, getBounds(shape), { height: 250 });\n\n      // when\n      var newShape = bpmnReplace.replaceElement(shape, {\n        type: 'bpmn:Participant',\n        isExpanded: true\n      });\n\n      // then\n      expect(isExpanded(newShape)).to.be.true; // expanded\n      expect(newShape.children).to.be.empty;\n      expect(newShape.di.isHorizontal).to.be.true;\n\n      expect(newShape).to.have.bounds(expandedBounds);\n    }));\n\n  });\n\n\n  describe('should replace in vertical collaboration', function() {\n\n    var diagramXML = require('./BpmnReplace.collaboration.vertical.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    it('expanded with collapsed pool', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var shape = elementRegistry.get('V_Participant_1');\n\n      var messageFlow = elementRegistry.get('V_MessageFlow_B_to_A');\n\n      var collapsedBounds = assign({}, getBounds(shape), { width: 60 });\n\n      // when\n      var newShape = bpmnReplace.replaceElement(shape, {\n        type: 'bpmn:Participant',\n        isExpanded: false\n      });\n\n      // then\n      expect(isExpanded(newShape)).to.be.false; // collapsed\n      expect(newShape.children).to.be.empty;\n      expect(newShape.di.isHorizontal).to.be.false;\n\n      expect(newShape).to.have.bounds(collapsedBounds);\n\n      expect(messageFlow).to.have.waypoints([\n        { x: 436, y: 368 },\n        { x: newShape.x + collapsedBounds.width, y: 368 }\n      ]);\n    }));\n\n\n    it('collapsed with expanded pool', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var shape = elementRegistry.get('V_Participant_2');\n\n      var expandedBounds = assign({}, getBounds(shape), { width: 250 });\n\n      // when\n      var newShape = bpmnReplace.replaceElement(shape, {\n        type: 'bpmn:Participant',\n        isExpanded: true\n      });\n\n      // then\n      expect(isExpanded(newShape)).to.be.true; // expanded\n      expect(newShape.children).to.be.empty;\n      expect(newShape.di.isHorizontal).to.be.false;\n\n      expect(newShape).to.have.bounds(expandedBounds);\n    }));\n\n  });\n\n\n  describe('should collapse pool, reconnecting message flows', function() {\n\n    var diagramXML = require('./BpmnReplace.poolMessageFlows.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    it('expanded with collapsed pool', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var shape = elementRegistry.get('Participant_1');\n\n      // when\n      var newShape = bpmnReplace.replaceElement(shape, {\n        type: 'bpmn:Participant',\n        isExpanded: false\n      });\n\n      // then\n      expect(isExpanded(newShape)).to.be.false; // collapsed\n      expect(newShape.children).to.be.empty;\n\n      expect(elementRegistry.get('MessageFlow_1')).to.exist;\n      expect(elementRegistry.get('MessageFlow_2')).to.exist;\n    }));\n\n  });\n\n\n  describe('should collapse vertical pool, reconnecting message flows', function() {\n\n    var diagramXML = require('./BpmnReplace.poolMessageFlows.vertical.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    it('expanded with collapsed pool', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var shape = elementRegistry.get('V_Participant_1');\n\n      // when\n      var newShape = bpmnReplace.replaceElement(shape, {\n        type: 'bpmn:Participant',\n        isExpanded: false\n      });\n\n      // then\n      expect(isExpanded(newShape)).to.be.false; // collapsed\n      expect(newShape.children).to.be.empty;\n\n      expect(elementRegistry.get('V_MessageFlow_1')).to.exist;\n      expect(elementRegistry.get('V_MessageFlow_2')).to.exist;\n    }));\n\n  });\n\n\n  describe('should replace with data objects', function() {\n\n    var diagramXML = require('./BpmnReplace.dataObjects.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    it('restoring dataAssociations', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var task = elementRegistry.get('Task');\n\n      // when\n      var serviceTask = bpmnReplace.replaceElement(task, { type: 'bpmn:ServiceTask' });\n      var bo = serviceTask.businessObject;\n\n      // then\n      // expect one incoming connection\n      expect(serviceTask.incoming).to.have.length(1);\n\n      var inputAssociations = bo.dataInputAssociations;\n      expect(inputAssociations).to.have.length(1);\n\n      var inputAssociation = inputAssociations[0];\n\n      // expect input association references __target_ref_placeholder property\n      expect(inputAssociation.targetRef).to.equal(bo.properties[0]);\n\n      // ...and\n      // expect one outgoing connection\n      expect(serviceTask.outgoing).to.have.length(1);\n\n      var outputAssociations = bo.dataOutputAssociations;\n      expect(outputAssociations).to.have.length(1);\n\n    }));\n\n  });\n\n\n  describe('position and size', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    it('should keep position', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var task = elementRegistry.get('Task_1');\n      var newElementData = {\n        type: 'bpmn:UserTask'\n      };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(task, newElementData);\n\n      // then\n      expect(newElement.x).to.equal(task.x);\n      expect(newElement.y).to.equal(task.y);\n    }));\n\n\n    it('should keep label position', inject(function(elementRegistry, bpmnReplace, modeling) {\n\n      // given\n      var startEvent = elementRegistry.get('StartEvent_1');\n      var label = elementRegistry.get('StartEvent_1_label');\n\n      var newElementData = {\n        type: 'bpmn:EndEvent'\n      };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(startEvent, newElementData);\n\n      // then\n      expect(newElement.label.x).to.equal(label.x);\n      expect(newElement.label.y).to.equal(label.y);\n    }));\n\n\n    it('should assign default size when replacing task with expanded sub process', inject(\n      function(elementRegistry, bpmnReplace) {\n\n        // given\n        var task = elementRegistry.get('Task_1');\n\n        var mid = getMid(task);\n\n        var newElementData = {\n          type: 'bpmn:SubProcess',\n          isExpanded: true\n        };\n\n        // when\n        var newElement = bpmnReplace.replaceElement(task, newElementData);\n\n        // then\n        expect(newElement).to.exist;\n        expect(is(newElement, 'bpmn:SubProcess')).to.be.true;\n        expect(getMid(newElement)).to.eql(mid);\n        expect(newElement.width).to.equal(350);\n        expect(newElement.height).to.equal(200);\n      }\n    ));\n\n  });\n\n\n  describe('selection', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    it('should select after replace',\n      inject(function(elementRegistry, selection, bpmnReplace) {\n\n        // given\n        var task = elementRegistry.get('Task_1');\n        var newElementData = {\n          type: 'bpmn:UserTask'\n        };\n\n        // when\n        var newElement = bpmnReplace.replaceElement(task, newElementData);\n\n        // then\n        expect(selection.get()).to.include(newElement);\n      })\n    );\n\n  });\n\n\n  describe('label', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n    it('should keep internal labels',\n      inject(function(elementRegistry, bpmnReplace) {\n\n        // given\n        var task = elementRegistry.get('Task_1');\n\n        var newElementData = {\n          type: 'bpmn:UserTask'\n        };\n\n        // when\n        var newElement = bpmnReplace.replaceElement(task, newElementData);\n\n        // then\n        expect(newElement.businessObject.name).to.equal('Task Caption');\n      })\n    );\n\n\n    it('should keep external labels',\n      inject(function(elementRegistry, bpmnReplace) {\n\n        // given\n        var startEvent = elementRegistry.get('StartEvent_1');\n\n        var newElementData = {\n          type: 'bpmn:EndEvent'\n        };\n\n        // when\n        var newElement = bpmnReplace.replaceElement(startEvent, newElementData);\n\n        // then\n        expect(newElement.label.labelTarget).to.equal(newElement);\n        expect(newElement.businessObject.name).to.equal('KEEP ME');\n      })\n    );\n\n  });\n\n\n  describe('undo support', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    it('should undo', inject(function(elementRegistry, bpmnReplace, commandStack) {\n\n      // given\n      var task = elementRegistry.get('Task_1');\n      var newElementData = {\n        type: 'bpmn:UserTask'\n      };\n\n      bpmnReplace.replaceElement(task, newElementData);\n\n      // when\n      commandStack.undo();\n\n      // then\n      var target = elementRegistry.get('Task_1'),\n          businessObject = target.businessObject;\n\n      expect(target).to.exist;\n      expect(is(businessObject, 'bpmn:Task')).to.be.true;\n    }));\n\n\n    it('should redo', inject(function(elementRegistry, bpmnReplace, commandStack) {\n\n      // given\n      var task = elementRegistry.get('Task_1');\n      var newElementData = {\n        type: 'bpmn:UserTask'\n      };\n      var newElementData2 = {\n        type: 'bpmn:ServiceTask'\n      };\n\n      var usertask = bpmnReplace.replaceElement(task, newElementData);\n      var servicetask = bpmnReplace.replaceElement(usertask, newElementData2);\n\n      commandStack.undo();\n      commandStack.undo();\n\n      // when\n      commandStack.redo();\n      commandStack.redo();\n\n      // then\n      var businessObject = servicetask.businessObject;\n\n      expect(servicetask).to.exist;\n      expect(is(businessObject, 'bpmn:ServiceTask')).to.be.true;\n    }));\n\n  });\n\n\n  describe('connection handling', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    it('should reconnect valid', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var task = elementRegistry.get('Task_1');\n      var newElementData = {\n        type: 'bpmn:UserTask'\n      };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(task, newElementData);\n\n      // then\n      var incoming = newElement.incoming[0],\n          outgoing = newElement.outgoing[0],\n          source = incoming.source,\n          target = outgoing.target;\n\n      expect(incoming).to.exist;\n      expect(outgoing).to.exist;\n      expect(source).to.eql(elementRegistry.get('StartEvent_1'));\n      expect(target).to.eql(elementRegistry.get('ExclusiveGateway_1'));\n    }));\n\n\n    it('should remove invalid (incoming)', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var task = elementRegistry.get('StartEvent_1');\n      var newElementData = {\n        type: 'bpmn:EndEvent'\n      };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(task, newElementData);\n\n      // then\n      expect(newElement.incoming).to.be.empty;\n    }));\n\n\n    it('should remove invalid (outgoing)', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var task = elementRegistry.get('EndEvent_1');\n      var newElementData = {\n        type: 'bpmn:StartEvent'\n      };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(task, newElementData);\n\n      // then\n      expect(newElement.outgoing).to.be.empty;\n    }));\n\n\n    describe('undo support', function() {\n\n      it('should reconnect valid', inject(function(elementRegistry, bpmnReplace, commandStack) {\n\n        // given\n        var task = elementRegistry.get('Task_1');\n        var newElementData = {\n          type: 'bpmn:UserTask'\n        };\n\n        bpmnReplace.replaceElement(task, newElementData);\n\n        // when\n        commandStack.undo();\n\n        // then\n        var newTask = elementRegistry.get('Task_1');\n        var incoming = newTask.incoming[0],\n            outgoing = newTask.outgoing[0],\n            source = incoming.source,\n            target = outgoing.target;\n\n        expect(incoming).to.exist;\n        expect(outgoing).to.exist;\n        expect(source).to.eql(elementRegistry.get('StartEvent_1'));\n        expect(target).to.eql(elementRegistry.get('ExclusiveGateway_1'));\n      }));\n\n\n      it('should remove invalid (invalid)',\n        inject(function(elementRegistry, bpmnReplace, commandStack) {\n\n          // given\n          var startEvent = elementRegistry.get('StartEvent_1');\n          var newElementData = {\n            type: 'bpmn:EndEvent'\n          };\n\n          bpmnReplace.replaceElement(startEvent, newElementData);\n\n          // when\n          commandStack.undo();\n\n          // then\n          var newEvent = elementRegistry.get('StartEvent_1');\n          var incoming = newEvent.incoming[0],\n              outgoing = newEvent.outgoing[0],\n              target = outgoing.target;\n\n\n          expect(incoming).not.to.exist;\n          expect(outgoing).to.exist;\n          expect(target).to.eql(elementRegistry.get('Task_1'));\n        })\n      );\n\n\n      it('should remove invalid outgoing connections',\n        inject(function(elementRegistry, bpmnReplace, commandStack) {\n\n          // given\n          var endEvent = elementRegistry.get('EndEvent_1');\n          var newElementData = {\n            type: 'bpmn:StartEvent'\n          };\n\n          bpmnReplace.replaceElement(endEvent, newElementData);\n\n          // when\n          commandStack.undo();\n\n          // then\n          var newEvent = elementRegistry.get('EndEvent_1');\n          var incoming = newEvent.incoming[0],\n              outgoing = newEvent.outgoing[0],\n              source = incoming.source;\n\n          expect(incoming).to.exist;\n          expect(outgoing).not.to.exist;\n          expect(source).to.eql(elementRegistry.get('Transaction_1'));\n        })\n      );\n\n    });\n\n\n    describe('redo support', function() {\n\n      it('should reconnect valid connections',\n        inject(function(elementRegistry, bpmnReplace, commandStack) {\n\n          // given\n          var task = elementRegistry.get('Task_1');\n          var newElementData = {\n            type: 'bpmn:UserTask'\n          };\n          var newElement = bpmnReplace.replaceElement(task, newElementData);\n\n          // when\n          commandStack.undo();\n          commandStack.redo();\n\n          // then\n          var incoming = newElement.incoming[0],\n              outgoing = newElement.outgoing[0],\n              source = incoming.source,\n              target = outgoing.target;\n\n\n          expect(incoming).to.exist;\n          expect(outgoing).to.exist;\n          expect(source).to.eql(elementRegistry.get('StartEvent_1'));\n          expect(target).to.eql(elementRegistry.get('ExclusiveGateway_1'));\n        })\n      );\n\n\n      it('should remove invalid incoming connections',\n        inject(function(elementRegistry, bpmnReplace, commandStack) {\n\n          // given\n          var startEvent = elementRegistry.get('StartEvent_1');\n          var newElementData = {\n            type: 'bpmn:EndEvent'\n          };\n          var newElement = bpmnReplace.replaceElement(startEvent, newElementData);\n\n          // when\n          commandStack.undo();\n          commandStack.redo();\n\n          // then\n          var incoming = newElement.incoming[0],\n              outgoing = newElement.outgoing[0];\n\n\n          expect(incoming).not.to.exist;\n          expect(outgoing).not.to.exist;\n        })\n      );\n\n\n      it('should remove invalid outgoing connections',\n        inject(function(elementRegistry, bpmnReplace, commandStack) {\n\n          // given\n          var endEvent = elementRegistry.get('EndEvent_1');\n          var newElementData = {\n            type: 'bpmn:StartEvent'\n          };\n          var newElement = bpmnReplace.replaceElement(endEvent, newElementData);\n\n          // when\n          commandStack.undo();\n          commandStack.redo();\n\n          // then\n          var incoming = newElement.incoming[0],\n              outgoing = newElement.outgoing[0];\n\n\n          expect(incoming).not.to.exist;\n          expect(outgoing).not.to.exist;\n        })\n      );\n\n    });\n\n  });\n\n\n  describe('children handling', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    it('should update bpmn containment properly', inject(function(elementRegistry, modeling, bpmnReplace) {\n\n      // given\n      var subProcessShape = elementRegistry.get('SubProcess_1');\n      var startEventShape = elementRegistry.get('StartEvent_2');\n      var taskShape = elementRegistry.get('Task_2');\n      var sequenceFlowConnection = elementRegistry.get('SequenceFlow_4');\n\n      var transactionShapeData = {\n        type: 'bpmn:Transaction'\n      };\n\n      // when\n      var transactionShape = bpmnReplace.replaceElement(subProcessShape, transactionShapeData);\n\n      // then\n      var subProcess = subProcessShape.businessObject,\n          transaction = transactionShape.businessObject;\n\n      var transactionChildren = transaction.get('flowElements');\n      var subProcessChildren = subProcess.get('flowElements');\n\n      expect(transactionChildren).to.include(startEventShape.businessObject);\n      expect(transactionChildren).to.include(taskShape.businessObject);\n      expect(transactionChildren).to.include(sequenceFlowConnection.businessObject);\n\n      expect(subProcessChildren).not.to.include(startEventShape.businessObject);\n      expect(subProcessChildren).not.to.include(taskShape.businessObject);\n      expect(subProcessChildren).not.to.include(sequenceFlowConnection.businessObject);\n    }));\n\n  });\n\n\n  describe('sub processes', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    it('should allow morphing expanded into expanded ad hoc',\n      inject(function(bpmnReplace, elementRegistry) {\n\n        // given\n        var element = elementRegistry.get('SubProcess_1');\n        var newElementData = {\n          type: 'bpmn:AdHocSubProcess'\n        };\n\n        // when\n        var newElement = bpmnReplace.replaceElement(element, newElementData);\n\n        // then\n        expect(is(newElement, 'bpmn:AdHocSubProcess')).to.be.true;\n        expect(isExpanded(newElement)).to.be.true;\n      })\n    );\n\n\n    it('should allow morphing expanded ad hoc into expanded',\n      inject(function(bpmnReplace, elementRegistry) {\n\n        // given\n        var element = elementRegistry.get('AdHocSubProcessExpanded');\n        var newElementData = {\n          type: 'bpmn:SubProcess'\n        };\n\n        // when\n        var newElement = bpmnReplace.replaceElement(element, newElementData);\n\n        // then\n        expect(is(newElement, 'bpmn:SubProcess')).to.be.true;\n        expect(is(newElement, 'bpmn:AdHocSubProcess')).to.be.false;\n        expect(isExpanded(newElement)).to.be.true;\n      })\n    );\n\n\n    it('should allow morphing collapsed into collapsed ad hoc',\n      inject(function(bpmnReplace, elementRegistry) {\n\n        // given\n        var element = elementRegistry.get('SubProcessCollapsed');\n        var newElementData = {\n          type: 'bpmn:AdHocSubProcess'\n        };\n\n        // when\n        var newElement = bpmnReplace.replaceElement(element, newElementData);\n\n        // then\n        expect(is(newElement, 'bpmn:AdHocSubProcess')).to.be.true;\n        expect(isExpanded(newElement)).not.to.be.true;\n      })\n    );\n\n\n    it('should allow morphing collapsed ad hoc into collapsed',\n      inject(function(bpmnReplace, elementRegistry) {\n\n        // given\n        var element = elementRegistry.get('AdHocSubProcessCollapsed');\n        var newElementData = {\n          type: 'bpmn:SubProcess'\n        };\n\n        // when\n        var newElement = bpmnReplace.replaceElement(element, newElementData);\n\n        // then\n        expect(is(newElement, 'bpmn:SubProcess')).to.be.true;\n        expect(is(newElement, 'bpmn:AdHocSubProcess')).to.be.false;\n        expect(isExpanded(newElement)).not.to.be.true;\n      })\n    );\n\n\n    it('should allow expanding newly created subprocess',\n      inject(function(bpmnReplace, elementFactory) {\n\n        // given\n        var collapsedProcess = elementFactory.createShape({\n          type: 'bpmn:SubProcess',\n          isExpanded: false\n        });\n\n        var newElementData = {\n          type: 'bpmn:SubProcess',\n          isExpanded: true\n        };\n\n        // when\n        var newElement = bpmnReplace.replaceElement(collapsedProcess, newElementData);\n\n        // then\n        expect(is(newElement, 'bpmn:SubProcess')).to.be.true;\n        expect(isExpanded(newElement)).to.be.true;\n      })\n    );\n\n\n    it('should keep size when morphing ad hoc',\n      inject(function(bpmnReplace, elementRegistry, modeling) {\n\n        // given\n        var element = elementRegistry.get('SubProcess_1');\n        var newElementData = {\n          type: 'bpmn:AdHocSubProcess'\n        };\n\n        var width = element.width,\n            height = element.height;\n\n        modeling.resizeShape(element, {\n          x: element.x,\n          y: element.y,\n          width: width + 20,\n          height: height + 20\n        });\n\n        // when\n        var newElement = bpmnReplace.replaceElement(element, newElementData);\n\n        // then\n        expect(is(newElement, 'bpmn:AdHocSubProcess')).to.be.true;\n        expect(isExpanded(newElement)).to.be.true;\n\n        expect(newElement.width).to.equal(width + 20);\n        expect(newElement.height).to.equal(height + 20);\n      })\n    );\n\n\n    it('should remove children of collapsed sub process not morphing into expanded',\n      inject(function(bpmnReplace, elementRegistry, modeling) {\n\n        // given\n        var element = elementRegistry.get('SubProcess_1');\n        var newElementData = {\n          type: 'bpmn:CallActivity'\n        };\n\n        modeling.toggleCollapse(element);\n\n        // when\n        var newElement = bpmnReplace.replaceElement(element, newElementData);\n\n        // then\n        expect(is(newElement, 'bpmn:CallActivity')).to.be.true;\n      }));\n\n\n    it('should drop event type from start event after moving it into sub process',\n      inject(function(bpmnReplace, elementRegistry, modeling) {\n\n        // given\n        var startEvent = elementRegistry.get('StartEvent_4'),\n            subProcess = elementRegistry.get('SubProcess_2');\n\n        // when\n        modeling.moveElements([ startEvent ], { x: 100, y: 0 }, subProcess);\n\n        var startEventAfter = elementRegistry.filter(function(element) {\n          return is(element, 'bpmn:StartEvent') && element.parent === subProcess;\n        })[0];\n\n        // then\n        expect(startEventAfter.businessObject.get('eventDefinitions')).is.empty;\n      })\n    );\n\n\n    it('should not drop event type from start event after moving it into event sub process',\n      inject(function(bpmnReplace, elementRegistry, modeling) {\n\n        // given\n        var startEvent = elementRegistry.get('StartEvent_5'),\n            subProcess = elementRegistry.get('EventSubProcess_2');\n\n        // when\n        modeling.moveElements([ startEvent ], { x: -100, y: 0 }, subProcess);\n\n        var startEventAfter = elementRegistry.filter(function(element) {\n          return is(element, 'bpmn:StartEvent') && element.parent === subProcess;\n        })[0];\n\n        // then\n        expect(startEventAfter.businessObject.get('eventDefinitions')[0].$type).to.equal('bpmn:MessageEventDefinition');\n      })\n    );\n\n  });\n\n\n  describe('morph task with boundaryEvent', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    it('to expanded sub process', inject(function(bpmnReplace, elementRegistry) {\n\n      // given\n      var element = elementRegistry.get('Task_1');\n      var newElementData = {\n        type: 'bpmn:SubProcess',\n        isExpanded: true\n      };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(element, newElementData);\n\n      // then\n      expect(is(newElement, 'bpmn:SubProcess')).to.be.true;\n      expect(isExpanded(newElement)).to.be.true;\n\n      // and keep boundaryEvent\n      expect(newElement.attachers.length).to.be.equal(2);\n    }));\n\n\n    it('to collapsed sub process', inject(function(bpmnReplace, elementRegistry) {\n\n      // given\n      var element = elementRegistry.get('Task_1');\n      var newElementData = {\n        type: 'bpmn:SubProcess',\n        isExpanded: false\n      };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(element, newElementData);\n\n      // then\n      expect(is(newElement, 'bpmn:SubProcess')).to.be.true;\n      expect(isExpanded(newElement)).to.be.false;\n\n      // and keep boundaryEvent\n      expect(newElement.attachers.length).to.eql(2);\n    }));\n\n  });\n\n\n  describe('compensation activity', function() {\n\n    var diagramXML = require('./BpmnReplace.compensation.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    it('should keep isForCompensation attr', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var task = elementRegistry.get('Task_1');\n      var newElementData = {\n        type: 'bpmn:ServiceTask'\n      };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(task, newElementData);\n\n      // then\n      expect(newElement.businessObject.isForCompensation).to.be.true;\n    }));\n\n  });\n\n\n  describe('event sub processes', function() {\n\n    var diagramXML = require('./BpmnReplace.eventSubProcesses.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    it('should remove connections',\n      inject(function(elementRegistry, bpmnReplace) {\n\n        // given\n        var transaction = elementRegistry.get('SubProcess_1');\n        var newElementData = {\n          type: 'bpmn:SubProcess',\n          triggeredByEvent: true\n        };\n\n        // when\n        var newElement = bpmnReplace.replaceElement(transaction, newElementData);\n\n        // then\n        var incoming = newElement.incoming[0],\n            outgoing = newElement.outgoing[0];\n\n        expect(incoming).not.to.exist;\n        expect(outgoing).not.to.exist;\n      })\n    );\n\n\n    it('should replace non-interrupting start event after moving it outside event sub process',\n      inject(function(bpmnReplace, elementRegistry, modeling) {\n\n        // given\n        var startEvent = elementRegistry.get('StartEvent_2'),\n            root = elementRegistry.get('Process_1');\n\n        // when\n        modeling.moveElements([ startEvent ], { x: 0, y: 200 }, root);\n\n        var startEventAfter = elementRegistry.filter(function(element) {\n          return is(element, 'bpmn:StartEvent') && element.parent === root;\n        })[0];\n\n        // then\n        expect(isInterrupting(startEventAfter)).to.be.true;\n        expect(startEventAfter.parent).to.equal(root);\n\n      })\n    );\n\n\n    it('should replace non-interrupting start event after moving it to a regular sub process',\n      inject(function(bpmnReplace, elementRegistry, modeling) {\n\n        // given\n        var startEvent = elementRegistry.get('StartEvent_2'),\n            subProcess = elementRegistry.get('SubProcess_1');\n\n        // when\n        modeling.moveElements([ startEvent ], { x: 260, y: 60 }, subProcess);\n\n        var startEventAfter = elementRegistry.filter(function(element) {\n          return is(element, 'bpmn:StartEvent') && element.parent === subProcess;\n        })[0];\n\n        // then\n        expect(isInterrupting(startEventAfter)).to.be.true;\n        expect(startEventAfter.parent).to.equal(subProcess);\n\n      })\n    );\n\n\n    it('should not replace non-interrupting start event after moving it to another event sub process',\n      inject(function(bpmnReplace, elementRegistry, modeling) {\n\n        // given\n        var startEvent = elementRegistry.get('StartEvent_2'),\n            subProcess = elementRegistry.get('SubProcess_1');\n\n        var eventSubProcess = bpmnReplace.replaceElement(subProcess, {\n          type: 'bpmn:SubProcess',\n          triggeredByEvent: true,\n          isExpanded: true\n        });\n\n        // when\n        modeling.moveElements([ startEvent ], { x: 260, y: 60 }, eventSubProcess);\n\n        var startEventAfter = elementRegistry.filter(function(element) {\n          return is(element, 'bpmn:StartEvent') && element.parent === eventSubProcess && element.type !== 'label';\n        })[1];\n\n        // then\n        expect(startEvent.id).to.equal(startEventAfter.id);\n        expect(startEventAfter.parent).to.equal(eventSubProcess);\n\n      })\n    );\n\n\n    it('should not replace interrupting start event after moving it outside event sub process',\n      inject(function(bpmnReplace, elementRegistry, modeling) {\n\n        // given\n        var startEvent = elementRegistry.get('StartEvent_2'),\n            root = elementRegistry.get('Process_1');\n\n        var interruptingStartEvent = bpmnReplace.replaceElement(startEvent, { type: 'bpmn:StartEvent' });\n\n        // when\n        modeling.moveElements([ interruptingStartEvent ], { x: 0, y: 200 }, root);\n\n        var startEventAfter = elementRegistry.filter(function(element) {\n          return is(element, 'bpmn:StartEvent')\n            && element.type !== 'label'\n            && element.parent === root;\n        })[0];\n\n        // then\n        expect(startEventAfter).to.equal(interruptingStartEvent);\n        expect(startEventAfter.parent).to.equal(root);\n\n      })\n    );\n\n\n    it('should replace non-interrupting start event when replacing parent event sub process',\n      inject(function(elementRegistry, bpmnReplace) {\n\n        // given\n        var eventSubProcess = elementRegistry.get('SubProcess_2');\n\n        // when\n        var subProcess = bpmnReplace.replaceElement(eventSubProcess, { type: 'bpmn:SubProcess' });\n\n        // then\n        var replacedStartEvent = elementRegistry.filter(function(element) {\n          return (element.parent === subProcess && element.type !== 'label');\n        })[0];\n\n        expect(isInterrupting(replacedStartEvent)).to.be.true;\n        expect(replacedStartEvent.parent).to.equal(subProcess);\n      })\n    );\n\n\n    it('should not replace non-interrupting start event when moving parent event sub process',\n      inject(function(elementRegistry, bpmnReplace, modeling) {\n\n        // given\n        var eventSubProcess = elementRegistry.get('SubProcess_2'),\n            startEvent = elementRegistry.get('StartEvent_2');\n\n        // when\n        modeling.moveElements([ eventSubProcess ], { x: 20, y: 30 });\n\n        // start event after moving parent\n        var startEventAfter = elementRegistry.filter(function(element) {\n          return (element.parent === eventSubProcess && element.type !== 'label');\n        })[0];\n\n        // then\n        expect(startEventAfter).to.equal(startEvent);\n        expect(startEventAfter.parent).to.eql(eventSubProcess);\n      })\n    );\n\n\n    it('should replace error start event after moving it outside event sub process',\n      inject(function(elementRegistry, bpmnReplace, modeling) {\n\n        // given\n        var startEvent = elementRegistry.get('StartEvent_3'),\n            root = elementRegistry.get('Process_1');\n\n        // when\n        modeling.moveElements([ startEvent ], { x: 0, y: 200 }, root);\n\n        var startEventAfter = elementRegistry.filter(function(element) {\n          return is(element, 'bpmn:StartEvent') && element.parent === root;\n        })[0];\n\n        // then\n        expect(hasErrorEventDefinition(startEventAfter)).to.be.false;\n        expect(startEventAfter.parent).to.equal(root);\n      })\n    );\n\n\n    it('should replace error start event after moving it to a regular sub process',\n      inject(function(bpmnReplace, elementRegistry, modeling) {\n\n        // given\n        var startEvent = elementRegistry.get('StartEvent_3'),\n            subProcess = elementRegistry.get('SubProcess_1');\n\n        // when\n        modeling.moveElements([ startEvent ], { x: 260, y: 60 }, subProcess);\n\n        var startEventAfter = elementRegistry.filter(function(element) {\n          return is(element, 'bpmn:StartEvent') && element.parent === subProcess;\n        })[0];\n\n        // then\n        expect(hasErrorEventDefinition(startEventAfter)).to.be.false;\n        expect(startEventAfter.parent).to.equal(subProcess);\n\n      })\n    );\n\n\n    it('should not replace error start event after moving it to another event sub process',\n      inject(function(bpmnReplace, elementRegistry, modeling) {\n\n        // given\n        var startEvent = elementRegistry.get('StartEvent_3'),\n            subProcess = elementRegistry.get('SubProcess_1');\n\n        var eventSubProcess = bpmnReplace.replaceElement(subProcess, {\n          type: 'bpmn:SubProcess',\n          triggeredByEvent: true,\n          isExpanded: true\n        });\n\n        // when\n        modeling.moveElements([ startEvent ], { x: 260, y: 60 }, eventSubProcess);\n\n        var startEventAfter = elementRegistry.filter(function(element) {\n          return is(element, 'bpmn:StartEvent') && element.parent === eventSubProcess && element.type !== 'label';\n        })[1];\n\n        // then\n        expect(hasErrorEventDefinition(startEventAfter)).to.be.true;\n        expect(startEventAfter.parent).to.equal(eventSubProcess);\n\n      })\n    );\n\n\n    it('should replace error start event when replacing parent event sub process',\n      inject(function(elementRegistry, bpmnReplace) {\n\n        // given\n        var eventSubProcess = elementRegistry.get('SubProcess_3');\n\n        // when\n        var subProcess = bpmnReplace.replaceElement(eventSubProcess, { type: 'bpmn:SubProcess' });\n\n        // then\n        var replacedStartEvent = elementRegistry.filter(function(element) {\n          return (element.parent === subProcess && element.type !== 'label');\n        })[0];\n\n        expect(hasErrorEventDefinition(replacedStartEvent)).to.be.false;\n        expect(replacedStartEvent.parent).to.equal(subProcess);\n      })\n    );\n\n\n    it('should not replace error start event when moving parent event sub process',\n      inject(function(elementRegistry, bpmnReplace, modeling) {\n\n        // given\n        var eventSubProcess = elementRegistry.get('SubProcess_3'),\n            startEvent = elementRegistry.get('StartEvent_3');\n\n        // when\n        modeling.moveElements([ eventSubProcess ], { x: 20, y: 30 });\n\n        // start event after moving parent\n        var startEventAfter = elementRegistry.filter(function(element) {\n          return (element.parent === eventSubProcess && element.type !== 'label');\n        })[0];\n\n        // then\n        expect(startEventAfter).to.equal(startEvent);\n        expect(startEventAfter.parent).to.eql(eventSubProcess);\n      })\n    );\n\n\n    it('should remove `isForCompensation` when replacing sub process', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var compensationSubProcess = elementRegistry.get('SubProcess_4');\n\n      // when\n      var subProcess = bpmnReplace.replaceElement(\n        compensationSubProcess,\n        { type: 'bpmn:SubProcess', triggeredByEvent: true }\n      );\n\n      // then\n      expect(subProcess.businessObject.isForCompensation).to.be.false;\n    }));\n\n  });\n\n\n  describe('events', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/basic.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n\n    it('should properly set parent of event definitions', inject(\n      function(elementRegistry, bpmnReplace) {\n\n        // given\n        var startEvent = elementRegistry.get('StartEvent_1');\n\n        var messageEvent = bpmnReplace.replaceElement(startEvent, {\n          type: 'bpmn:StartEvent',\n          eventDefinitionType: 'bpmn:MessageEventDefinition'\n        });\n\n        var parent = messageEvent.businessObject.get('eventDefinitions')[0].$parent;\n\n        expect(parent).to.exist;\n        expect(parent).to.equal(messageEvent.businessObject);\n      })\n    );\n\n\n    it('should add condition with ConditionalEventDefinition', inject(\n      function(elementRegistry, bpmnReplace) {\n\n        // given\n        var startEvent = elementRegistry.get('StartEvent_1');\n\n        // when\n        var messageEvent = bpmnReplace.replaceElement(startEvent, {\n          type: 'bpmn:StartEvent',\n          eventDefinitionType: 'bpmn:ConditionalEventDefinition'\n        });\n\n        var definition = messageEvent.businessObject.get('eventDefinitions')[0];\n\n        // then\n        expect(definition.condition).to.exist;\n      })\n    );\n\n\n    it('should set host for boundary event if provided',\n      inject(function(elementRegistry, bpmnReplace) {\n\n        // given\n        var startEvent = elementRegistry.get('StartEvent_1'),\n            task = elementRegistry.get('Task_1');\n\n        // when\n        var boundaryEvent = bpmnReplace.replaceElement(startEvent, {\n          type: 'bpmn:BoundaryEvent',\n          host: task\n        });\n\n        // then\n        expect(boundaryEvent).to.exist;\n        expect(boundaryEvent).to.have.property('host', task);\n        expect(task).to.have.property('attachers');\n        expect(task.attachers).to.deep.eql([ boundaryEvent ]);\n      })\n    );\n\n  });\n\n\n  describe('properties', function() {\n    var copyPropertiesXML = require('../../../fixtures/bpmn/features/replace/copy-properties.bpmn');\n\n    beforeEach(bootstrapModeler(copyPropertiesXML, {\n      modules: testModules,\n      moddleExtensions: {\n        camunda: camundaPackage\n      }\n    }));\n\n    it('should copy properties', inject(function(bpmnReplace, elementRegistry) {\n\n      // given\n      var task = elementRegistry.get('Task_1');\n\n      var newElementData = {\n        type: 'bpmn:ServiceTask'\n      };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(task, newElementData);\n\n      // then\n      var businessObject = newElement.businessObject;\n\n      expect(businessObject.asyncBefore).to.be.true;\n      expect(businessObject.jobPriority).to.equal('100');\n\n      var documentation = businessObject.documentation;\n\n      expect(documentation).to.have.length(1);\n      expect(documentation[0]).to.exist;\n      expect(documentation[0].text).to.equal('hello world');\n\n      var extensionElements = businessObject.extensionElements;\n\n      expect(extensionElements.values).to.have.length(4);\n\n      var inputOutput = extensionElements.values[0],\n          properties = extensionElements.values[1],\n          executionListener = extensionElements.values[2],\n          retryCycle = extensionElements.values[3];\n\n      expect(is(inputOutput, 'camunda:InputOutput')).to.be.true;\n\n      expect(is(inputOutput.inputParameters[0], 'camunda:InputParameter')).to.be.true;\n      expect(inputOutput.inputParameters[0].name).to.equal('Input_1');\n      expect(inputOutput.inputParameters[0].value).to.equal('foo');\n\n      expect(is(inputOutput.outputParameters[0], 'camunda:OutputParameter')).to.be.true;\n      expect(inputOutput.outputParameters[0].name).to.equal('Output_1');\n      expect(inputOutput.outputParameters[0].value).to.equal('bar');\n\n      expect(is(properties, 'camunda:Properties')).to.be.true;\n\n      expect(is(properties.values[0], 'camunda:Property')).to.be.true;\n      expect(properties.values[0].name).to.equal('bar');\n      expect(properties.values[0].value).to.equal('foo');\n\n      expect(is(executionListener, 'camunda:ExecutionListener')).to.be.true;\n\n      expect(executionListener.class).to.equal('reallyClassy');\n      expect(executionListener.event).to.equal('start');\n\n      expect(is(retryCycle, 'camunda:FailedJobRetryTimeCycle')).to.be.true;\n\n      expect(retryCycle.body).to.equal('10');\n    }));\n\n  });\n\n\n  describe('colors', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n    it('should have new di', inject(function(elementRegistry, bpmnReplace) {\n\n      // given\n      var task = elementRegistry.get('Task_1');\n      var di = getDi(task);\n      var newElementData = {\n        type: 'bpmn:UserTask'\n      };\n\n      // when\n      var newElement = bpmnReplace.replaceElement(task, newElementData);\n\n      // then\n      var newDi = getDi(newElement);\n\n      expect(newDi).to.not.equal(di);\n    }));\n\n\n    it('should maintain colors', inject(function(elementRegistry, bpmnReplace, modeling) {\n\n      // given\n      var task = elementRegistry.get('Task_1');\n      var newElementData = {\n            type: 'bpmn:UserTask'\n          },\n          fill = '#ff0000',\n          stroke = '#00ff00';\n\n      modeling.setColor(task, { fill: fill, stroke: stroke });\n\n      // when\n      var newElement = bpmnReplace.replaceElement(task, newElementData);\n\n      // then\n      var di = getDi(newElement);\n\n      expect(di.get('background-color')).to.equal(fill);\n      expect(di.get('border-color')).to.equal(stroke);\n\n      // TODO @barmac: remove when we drop bpmn.io properties\n      expect(di.fill).to.equal(fill);\n      expect(di.stroke).to.equal(stroke);\n    }));\n\n  });\n\n\n  describe('center', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/features/replace/data-elements.bpmn');\n\n    var testModules = [\n      modelingModule,\n      coreModule\n    ];\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n\n    describe('data store reference to data object reference', function() {\n\n      it('should center on replace', inject(function(bpmnReplace, elementRegistry) {\n\n        // given\n        var dataStoreReference = elementRegistry.get('DataStoreReference_1');\n        var positionX = dataStoreReference.x;\n\n        // when\n        bpmnReplace.replaceElement(dataStoreReference, { type: 'bpmn:DataObjectReference' });\n\n        var dataObjectReference = elementRegistry.get('DataStoreReference_1');\n        var newPositionX = positionX + (dataStoreReference.width - dataObjectReference.width) / 2;\n\n        // then\n        expect(dataObjectReference.x).to.eql(newPositionX);\n      }));\n\n\n      it('should undo', inject(function(bpmnReplace, commandStack, elementRegistry) {\n\n        // given\n        var dataStoreReference = elementRegistry.get('DataStoreReference_1');\n        var positionX = dataStoreReference.x;\n\n        bpmnReplace.replaceElement(dataStoreReference, { type: 'bpmn:DataObjectReference' });\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(elementRegistry.get('DataStoreReference_1').x).to.eql(positionX);\n      }));\n\n\n      it('should redo', inject(function(bpmnReplace, commandStack, elementRegistry) {\n\n        // given\n        var dataStoreReference = elementRegistry.get('DataStoreReference_1');\n        var positionX = dataStoreReference.x;\n\n        bpmnReplace.replaceElement(dataStoreReference, { type: 'bpmn:DataObjectReference' });\n        commandStack.undo();\n\n        // when\n        commandStack.redo();\n\n        var dataObjectReference = elementRegistry.get('DataStoreReference_1');\n        var newPositionX = positionX + (dataStoreReference.width - dataObjectReference.width) / 2;\n\n        // then\n        expect(dataObjectReference.x).to.eql(newPositionX);\n      }));\n\n    });\n\n\n    describe('data object reference to data store reference', function() {\n\n      it('should center on replace', inject(function(bpmnReplace, elementRegistry) {\n\n        // given\n        var dataObjectReference = elementRegistry.get('DataObjectReference_1');\n        var positionX = dataObjectReference.x;\n\n        // when\n        bpmnReplace.replaceElement(dataObjectReference, { type: 'bpmn:DataStoreReference' });\n\n        var dataStoreReference = elementRegistry.get('DataObjectReference_1');\n        var newPositionX = positionX + (dataObjectReference.width - dataStoreReference.width) / 2;\n\n        // then\n        expect(dataStoreReference.x).to.eql(newPositionX);\n      }));\n\n\n      it('should undo', inject(function(bpmnReplace, commandStack, elementRegistry) {\n\n        // given\n        var dataObjectReference = elementRegistry.get('DataObjectReference_1');\n        var positionX = dataObjectReference.x;\n\n        bpmnReplace.replaceElement(dataObjectReference, { type: 'bpmn:DataStoreReference' });\n\n        // when\n        commandStack.undo();\n\n        // then\n        expect(elementRegistry.get('DataObjectReference_1').x).to.eql(positionX);\n      }));\n\n\n      it('should redo', inject(function(bpmnReplace, commandStack, elementRegistry) {\n\n        // given\n        var dataObjectReference = elementRegistry.get('DataObjectReference_1');\n        var positionX = dataObjectReference.x;\n\n        bpmnReplace.replaceElement(dataObjectReference, { type: 'bpmn:DataStoreReference' });\n        commandStack.undo();\n\n        // when\n        commandStack.redo();\n\n        var dataStoreReference = elementRegistry.get('DataObjectReference_1');\n        var newPositionX = positionX + (dataObjectReference.width - dataStoreReference.width) / 2;\n\n        // then\n        expect(dataStoreReference.x).to.eql(newPositionX);\n      }));\n\n    });\n\n  });\n\n});\n\n\n// helpers ////////////////////////\n\nfunction skipId(key, value) {\n\n  if (key === 'id') {\n    return;\n  }\n\n  return value;\n}\n\nfunction getBounds(shape) {\n  return pick(shape, [ 'x', 'y', 'width', 'height' ]);\n}"
  },
  {
    "path": "test/spec/features/replace/ReplaceRulesSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport modelingModule from 'lib/features/modeling';\nimport replaceModule from 'lib/features/replace';\nimport coreModule from 'lib/core';\n\n\n\ndescribe('features/replace - rules', function() {\n\n  var diagramXML = require('../../../fixtures/bpmn/features/replace/association-gateways.bpmn');\n\n  var testModules = [ coreModule, modelingModule, replaceModule ];\n\n  beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));\n\n\n  describe('should keep associations', function() {\n\n    it('replacing Gateway -> EventBasedGateway', inject(function(elementRegistry, modeling, bpmnReplace) {\n\n      // given\n      var element = elementRegistry.get('ExclusiveGateway_140v6lc');\n\n      var target = {\n        type: 'bpmn:EventBasedGateway'\n      };\n\n      // when\n      bpmnReplace.replaceElement(element, target);\n\n      // then\n      expect(elementRegistry.get('Association_0gzxvep')).to.exist;\n      expect(elementRegistry.get('SequenceFlow_1rme11l')).to.exist;\n      expect(elementRegistry.get('SequenceFlow_0608fzs')).not.to.exist;\n    }));\n\n\n    it('replacing StartEvent -> EndEvent', inject(function(elementRegistry, modeling, bpmnReplace) {\n\n      // given\n      var element = elementRegistry.get('StartEvent_1');\n      var target = {\n        type: 'bpmn:EndEvent'\n      };\n\n      // when\n      bpmnReplace.replaceElement(element, target);\n\n      // then\n      expect(elementRegistry.get('Association_1ncsghq')).to.exist;\n      expect(elementRegistry.get('SequenceFlow_0fn1a6r')).not.to.exist;\n    }));\n\n\n    it('replacing EndEvent -> StartEvent', inject(function(elementRegistry, modeling, bpmnReplace) {\n\n      // given\n      var element = elementRegistry.get('EndEvent_1');\n      var target = {\n        type: 'bpmn:StartEvent'\n      };\n\n      // when\n      bpmnReplace.replaceElement(element, target);\n\n      // then\n      expect(elementRegistry.get('Association_06tpzma')).to.exist;\n      expect(elementRegistry.get('SequenceFlow_19u6x8u')).not.to.exist;\n    }));\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/replace/SubProcess-collapsed.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_QfpVMDO5Eeav0IX5Z32OQQ\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:subProcess id=\"SubProcess_1\">\n      <bpmn2:task id=\"Task_1\">\n        <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n      </bpmn2:task>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"\" sourceRef=\"Task_1\" targetRef=\"EndEvent_1\"/>\n      <bpmn2:endEvent id=\"EndEvent_1\">\n        <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n      </bpmn2:endEvent>\n    </bpmn2:subProcess>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_2\" bpmnElement=\"SubProcess_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"120.0\" y=\"84.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"55.0\" y=\"84.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"249.0\" y=\"106.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"267.0\" y=\"147.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_1\" sourceElement=\"_BPMNShape_Task_2\" targetElement=\"_BPMNShape_EndEvent_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"155.0\" y=\"124.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"249.0\" y=\"124.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"177.0\" y=\"124.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/spec/features/replace-preview/BpmnReplacePreview.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess.1\" triggeredByEvent=\"true\">\n      <bpmn:startEvent id=\"StartEvent.1\" isInterrupting=\"false\">\n        <bpmn:messageEventDefinition />\n      </bpmn:startEvent>\n      <bpmn:startEvent id=\"StartEvent.2\" />\n      <bpmn:startEvent id=\"StartEvent.3\" isInterrupting=\"false\">\n        <bpmn:timerEventDefinition />\n      </bpmn:startEvent>\n    </bpmn:subProcess>\n    <bpmn:subProcess id=\"SubProcess_2\" triggeredByEvent=\"true\" />\n    <bpmn:subProcess id=\"SubProcess_3\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess.1_di\" bpmnElement=\"SubProcess.1\" isExpanded=\"true\">\n        <dc:Bounds x=\"92\" y=\"46\" width=\"149\" height=\"138\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent.1_di\" bpmnElement=\"StartEvent.1\">\n        <dc:Bounds x=\"119\" y=\"75\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"92\" y=\"111\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent.2_di\" bpmnElement=\"StartEvent.2\">\n        <dc:Bounds x=\"119\" y=\"127\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"92\" y=\"163\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent.3_di\" bpmnElement=\"StartEvent.3\">\n        <dc:Bounds x=\"180\" y=\"75\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"153\" y=\"111\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_2_di\" bpmnElement=\"SubProcess_2\" isExpanded=\"true\">\n        <dc:Bounds x=\"299\" y=\"46\" width=\"144\" height=\"138\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_3_di\" bpmnElement=\"SubProcess_3\" isExpanded=\"true\">\n        <dc:Bounds x=\"503\" y=\"46\" width=\"161\" height=\"137\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/replace-preview/BpmnReplacePreviewSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport replacePreviewModule from 'lib/features/replace-preview';\nimport moveModule from 'diagram-js/lib/features/move';\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\nimport {\n  createCanvasEvent as canvasEvent\n} from '../../../util/MockEvents';\n\nimport {\n  assign\n} from 'min-dash';\n\nimport {\n  attr as svgAttr,\n  clone as svgClone,\n  innerSVG\n} from 'tiny-svg';\n\n\ndescribe('features/replace-preview', function() {\n\n  var diagramXML = require('./BpmnReplacePreview.bpmn');\n\n  var startEvent1,\n      rootElement;\n\n  var getGfx,\n      moveShape;\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: [\n      replacePreviewModule,\n      moveModule,\n      modelingModule,\n      coreModule\n    ]\n  }));\n\n  beforeEach(inject(function(canvas, elementRegistry, elementFactory, move, dragging) {\n\n    startEvent1 = elementRegistry.get('StartEvent.1');\n    rootElement = canvas.getRootElement();\n\n    /**\n     * returns the gfx representation of an element type\n     *\n     * @param  {Object} elementData\n     *\n     * @return {Object}\n     */\n    getGfx = function(elementData) {\n      assign(elementData, { x: 0, y: 0 });\n\n      var tempShape = elementFactory.createShape(elementData);\n\n      canvas.addShape(tempShape, rootElement);\n\n      var gfx = svgClone(elementRegistry.getGraphics(tempShape));\n\n      canvas.removeShape(tempShape);\n\n      return gfx;\n    };\n\n    moveShape = function(shape, target, position) {\n      var startPosition = {\n        x: shape.x + 10 + (shape.width / 2),\n        y: shape.y + 30 + (shape.height / 2)\n      };\n\n      move.start(canvasEvent(startPosition), shape);\n\n      dragging.hover({\n        element: target,\n        gfx: elementRegistry.getGraphics(target)\n      });\n\n      dragging.move(canvasEvent(position));\n    };\n\n  }));\n\n\n  it('should draw replaced visuals at correct position', inject(function(dragging) {\n\n    // when\n    moveShape(startEvent1, rootElement, { x: 280, y: 120 });\n\n    // then\n    var dragGroup = dragging.context().data.context.dragGroup;\n\n    svgAttr(dragGroup.childNodes[0], 'display', 'inline');\n\n    expect(dragGroup.childNodes[0].getBBox()).to.eql(dragGroup.childNodes[1].getBBox());\n  }));\n\n\n  skipCI('Mac OS') && it('should add dragger to context.visualReplacements once', inject(function(dragging) {\n\n    // when\n    moveShape(startEvent1, rootElement, { x: 275, y: 120 });\n    moveShape(startEvent1, rootElement, { x: 280, y: 120 });\n    moveShape(startEvent1, rootElement, { x: 285, y: 120 });\n\n    // then\n    var visualReplacements = dragging.context().data.context.visualReplacements;\n\n    expect(visualReplacements[startEvent1.id]).to.exist;\n    expect(Object.keys(visualReplacements).length).to.equal(1);\n  }));\n\n\n  skipCI('Mac OS') && it('should remove dragger from context.visualReplacements', inject(\n    function(elementRegistry, dragging) {\n\n      // given\n      var subProcess2 = elementRegistry.get('SubProcess_2');\n\n      // when\n      moveShape(startEvent1, rootElement, { x: 275, y: 120 });\n      moveShape(startEvent1, rootElement, { x: 280, y: 120 });\n      moveShape(startEvent1, subProcess2, { x: 350, y: 120 });\n\n      // then\n      var visualReplacements = dragging.context().data.context.visualReplacements;\n\n      expect(visualReplacements).to.be.empty;\n    }\n  ));\n\n\n  it('should hide the replaced visual', inject(function(dragging) {\n\n    // when\n    moveShape(startEvent1, rootElement, { x: 280, y: 120 });\n\n    // then\n    var dragGroup = dragging.context().data.context.dragGroup;\n\n    expect(svgAttr(dragGroup.childNodes[0], 'display')).to.equal('none');\n  }));\n\n\n  it('should not replace non-interrupting start event while hover over same event sub process',\n    inject(function(dragging, elementRegistry) {\n\n      // given\n      var subProcess1 = elementRegistry.get('SubProcess.1');\n\n      // when\n      moveShape(startEvent1, subProcess1, { x: 210, y: 180 });\n\n      var context = dragging.context().data.context;\n\n      // then\n      // check if the visual representation remains a non interrupting message start event\n      var startEventGfx = getGfx({\n        type: 'bpmn:StartEvent',\n        isInterrupting: false,\n        eventDefinitionType: 'bpmn:MessageEventDefinition'\n      });\n\n      expect(innerSVG(context.dragGroup.childNodes[0])).to.equal(innerSVG(startEventGfx));\n    })\n  );\n\n\n  it('should replace non-interrupting start event while hover over root element',\n    inject(function(dragging, elementRegistry) {\n\n      // when\n      moveShape(startEvent1, rootElement, { x: 280, y: 120 });\n\n      var context = dragging.context().data.context;\n\n      // then\n      // check if the visual replacement is a blank interrupting start event\n      var startEventGfx = getGfx({ type: 'bpmn:StartEvent' });\n\n      expect(innerSVG(context.dragGroup.childNodes[1])).to.equal(innerSVG(startEventGfx));\n    })\n  );\n\n\n  it('should not replace non-interrupting start event while hover over another event sub process',\n    inject(function(dragging, elementRegistry) {\n\n      // given\n      var subProcess2 = elementRegistry.get('SubProcess_2');\n\n      // when\n      moveShape(startEvent1, subProcess2, { x: 350, y: 120 });\n\n      var context = dragging.context().data.context;\n\n      // then\n      // check if the visual representation remains a non interrupting message start event\n      var startEventGfx = getGfx({\n        type: 'bpmn:StartEvent',\n        isInterrupting: false,\n        eventDefinitionType: 'bpmn:MessageEventDefinition'\n      });\n\n      expect(innerSVG(context.dragGroup.childNodes[0])).to.equal(innerSVG(startEventGfx));\n    })\n  );\n\n\n  it('should replace non-interrupting start event while hover over regular sub process',\n    inject(function(dragging, elementRegistry) {\n\n      // given\n      var subProcess3 = elementRegistry.get('SubProcess_3');\n\n      // when\n      moveShape(startEvent1, subProcess3, { x: 600, y: 120 });\n\n      var context = dragging.context().data.context;\n\n      // then\n      // check if the visual representation remains a non interrupting message start event\n      var startEventGfx = getGfx({ type: 'bpmn:StartEvent' });\n\n      expect(innerSVG(context.dragGroup.childNodes[1])).to.equal(innerSVG(startEventGfx));\n    })\n  );\n\n\n  it('should replace all non-interrupting start events in a selection of multiple elements',\n    inject(function(move, dragging, elementRegistry, selection) {\n\n      // given\n      var startEvent2 = elementRegistry.get('StartEvent.2'),\n          startEvent3 = elementRegistry.get('StartEvent.3');\n\n      // when\n      selection.select([ startEvent1, startEvent2, startEvent3 ]);\n\n      moveShape(startEvent1, rootElement, { x: 150, y: 250 });\n\n      var context = dragging.context().data.context;\n\n      // then\n      // check if the visual replacements are blank interrupting start events\n      var startEventGfx = getGfx({ type: 'bpmn:StartEvent' });\n\n      expect(innerSVG(context.dragGroup.childNodes[1])).to.equal(innerSVG(startEventGfx));\n      expect(innerSVG(context.dragGroup.childNodes[3])).to.equal(innerSVG(startEventGfx));\n      expect(innerSVG(context.dragGroup.childNodes[4])).to.equal(innerSVG(startEventGfx));\n    })\n  );\n\n\n  it('should not replace any non-interrupting start events in a selection of multiple elements',\n    inject(function(move, dragging, elementRegistry, selection) {\n\n      // given\n      var startEvent2 = elementRegistry.get('StartEvent.2'),\n          startEvent3 = elementRegistry.get('StartEvent.3'),\n          subProcess2 = elementRegistry.get('SubProcess_2');\n\n      var messageStartEventGfx = getGfx({\n        type: 'bpmn:StartEvent',\n        isInterrupting: false,\n        eventDefinitionType: 'bpmn:MessageEventDefinition'\n      });\n\n      var timerStartEventGfx = getGfx({\n        type: 'bpmn:StartEvent',\n        isInterrupting: false,\n        eventDefinitionType: 'bpmn:TimerEventDefinition'\n      });\n\n      var startEventGfx = getGfx({ type: 'bpmn:StartEvent' });\n\n      // when\n      selection.select([ startEvent1, startEvent2, startEvent3 ]);\n\n      moveShape(startEvent1, subProcess2, { x: 350, y: 120 });\n\n      var context = dragging.context().data.context;\n\n      // then\n      expect(innerSVG(context.dragGroup.childNodes[0])).to.equal(innerSVG(messageStartEventGfx));\n      expect(innerSVG(context.dragGroup.childNodes[1])).to.equal(innerSVG(startEventGfx));\n      expect(innerSVG(context.dragGroup.childNodes[2])).to.equal(innerSVG(timerStartEventGfx));\n    })\n  );\n\n\n  it('should not throw TypeError when moving boundaryEvent',\n    inject(function(move, dragging, elementRegistry, elementFactory, selection, modeling) {\n\n      // given\n      var startEvent1 = elementRegistry.get('StartEvent.1'),\n          subProcess3 = elementRegistry.get('SubProcess_3');\n\n      var intermediateEvent = elementFactory.createShape({ type: 'bpmn:IntermediateThrowEvent' });\n\n      var boundaryEvent = modeling.createShape(\n        intermediateEvent,\n        { x: 550, y: 180 },\n        subProcess3,\n        true\n      );\n\n      // when\n      selection.select([ startEvent1 ]);\n\n      moveShape(boundaryEvent, subProcess3, { x: 580, y: 210 });\n      moveShape(boundaryEvent, subProcess3, { x: 580, y: 180 });\n\n      // then\n      // expect not to throw TypeError: Cannot read property 'oldElementId' of undefined\n    })\n  );\n\n});\n\n\n// helpers /////////////\n\nfunction skipCI(userAgent) {\n  const ci = window.__env__ && window.__env__.CI;\n\n  if (!ci) {\n    return false;\n  }\n\n  if (userAgent) {\n    return window.navigator.userAgent.includes(userAgent);\n  }\n\n  return true;\n}"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.attaching.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.1.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess_1\" name=\"SubProcess\" />\n    <bpmn:intermediateCatchEvent id=\"MessageCatchEvent\" name=\"2\">\n      <bpmn:messageEventDefinition />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:intermediateThrowEvent id=\"MessageThrowEvent\" name=\"3\">\n      <bpmn:messageEventDefinition />\n    </bpmn:intermediateThrowEvent>\n    <bpmn:intermediateThrowEvent id=\"IntermediateThrowEvent\" name=\"1\" />\n    <bpmn:intermediateCatchEvent id=\"TimerCatchEvent\" name=\"4\">\n      <bpmn:timerEventDefinition />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:intermediateThrowEvent id=\"EscalationThrowEvent\" name=\"5\">\n      <bpmn:escalationEventDefinition />\n    </bpmn:intermediateThrowEvent>\n    <bpmn:intermediateCatchEvent id=\"ConditionalCatchEvent\" name=\"6\">\n      <bpmn:conditionalEventDefinition>\n        <bpmn:condition xsi:type=\"bpmn:tFormalExpression\" />\n      </bpmn:conditionalEventDefinition>\n    </bpmn:intermediateCatchEvent>\n    <bpmn:intermediateCatchEvent id=\"LinkCatchEvent\" name=\"7\">\n      <bpmn:linkEventDefinition />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:intermediateThrowEvent id=\"LinkThrowEvent\" name=\"8\">\n      <bpmn:linkEventDefinition />\n    </bpmn:intermediateThrowEvent>\n    <bpmn:intermediateThrowEvent id=\"CompensateThrowEvent\" name=\"9\">\n      <bpmn:compensateEventDefinition />\n    </bpmn:intermediateThrowEvent>\n    <bpmn:intermediateCatchEvent id=\"SignalCatchEvent\" name=\"10\">\n      <bpmn:signalEventDefinition />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:intermediateThrowEvent id=\"SignalThrowEvent\" name=\"11\">\n      <bpmn:signalEventDefinition />\n    </bpmn:intermediateThrowEvent>\n    <bpmn:intermediateThrowEvent id=\"IntermediateThrowEventWithConnections\" name=\"12\">\n      <bpmn:incoming>SequenceFlow_1pdic6v</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_106kcuw</bpmn:outgoing>\n    </bpmn:intermediateThrowEvent>\n    <bpmn:task id=\"Task_1\" name=\"Task\">\n      <bpmn:incoming>SequenceFlow_106kcuw</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_106kcuw\" sourceRef=\"IntermediateThrowEventWithConnections\" targetRef=\"Task_1\" />\n    <bpmn:exclusiveGateway id=\"Gateway_1\" name=\"Gateway\">\n      <bpmn:outgoing>SequenceFlow_1pdic6v</bpmn:outgoing>\n    </bpmn:exclusiveGateway>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1pdic6v\" sourceRef=\"Gateway_1\" targetRef=\"IntermediateThrowEventWithConnections\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"156\" y=\"81\" width=\"660\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_0ckelak_di\" bpmnElement=\"MessageCatchEvent\">\n        <dc:Bounds x=\"234\" y=\"351\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"249\" y=\"391\" width=\"7\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_0h76veu_di\" bpmnElement=\"MessageThrowEvent\">\n        <dc:Bounds x=\"281\" y=\"351\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"296\" y=\"391\" width=\"7\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_di\" bpmnElement=\"IntermediateThrowEvent\">\n        <dc:Bounds x=\"188\" y=\"351\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"203\" y=\"391\" width=\"7\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_1bkb8p2_di\" bpmnElement=\"TimerCatchEvent\">\n        <dc:Bounds x=\"343\" y=\"351\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"358\" y=\"391\" width=\"7\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_0fxof2e_di\" bpmnElement=\"EscalationThrowEvent\">\n        <dc:Bounds x=\"402\" y=\"351\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"417\" y=\"391\" width=\"7\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_0r6qqek_di\" bpmnElement=\"ConditionalCatchEvent\">\n        <dc:Bounds x=\"454\" y=\"351\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"469\" y=\"391\" width=\"7\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_179y1zf_di\" bpmnElement=\"LinkCatchEvent\">\n        <dc:Bounds x=\"505\" y=\"351\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"520\" y=\"391\" width=\"7\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_169wfo1_di\" bpmnElement=\"LinkThrowEvent\">\n        <dc:Bounds x=\"556\" y=\"351\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"571\" y=\"391\" width=\"7\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_1o8dtmg_di\" bpmnElement=\"CompensateThrowEvent\">\n        <dc:Bounds x=\"605\" y=\"351\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"620\" y=\"391\" width=\"7\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_0du6szv_di\" bpmnElement=\"SignalCatchEvent\">\n        <dc:Bounds x=\"654\" y=\"351\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"666\" y=\"391\" width=\"13\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_0sqptpn_di\" bpmnElement=\"SignalThrowEvent\">\n        <dc:Bounds x=\"701\" y=\"351\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"713\" y=\"391\" width=\"12\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_1hc8tmi_di\" bpmnElement=\"IntermediateThrowEventWithConnections\">\n        <dc:Bounds x=\"751\" y=\"351\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"762\" y=\"327\" width=\"13\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1fq7alz_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"837\" y=\"329\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_106kcuw_di\" bpmnElement=\"SequenceFlow_106kcuw\">\n        <di:waypoint x=\"787\" y=\"369\" />\n        <di:waypoint x=\"837\" y=\"369\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_1yk4171_di\" bpmnElement=\"Gateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"744\" y=\"448\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"747\" y=\"505\" width=\"44\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1pdic6v_di\" bpmnElement=\"SequenceFlow_1pdic6v\">\n        <di:waypoint x=\"769\" y=\"448\" />\n        <di:waypoint x=\"769\" y=\"387\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.boundaryEvent.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:collaboration id=\"Collaboration\">\n    <bpmn:textAnnotation id=\"TextAnnotation\">\n      <bpmn:text>Boundary Events are awesome!</bpmn:text>\n    </bpmn:textAnnotation>\n    <bpmn:participant id=\"Participant\" processRef=\"Process\" />\n    <bpmn:participant id=\"OtherParticipant\" processRef=\"OtherProcess\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess\">\n      <bpmn:task id=\"Task_nested\" />\n      <bpmn:boundaryEvent id=\"BoundaryEvent_nested\" attachedToRef=\"Task_nested\" />\n      <bpmn:endEvent id=\"EndEvent_nested\" />\n    </bpmn:subProcess>\n    <bpmn:boundaryEvent id=\"BoundaryEvent_on_SubProcess\" attachedToRef=\"SubProcess\" />\n    <bpmn:task id=\"Task\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_on_Task\" attachedToRef=\"Task\" />\n    <bpmn:startEvent id=\"StartEvent_None\" />\n    <bpmn:exclusiveGateway id=\"ExclusiveGateway\" />\n    <bpmn:boundaryEvent id=\"MessageBoundaryEvent_onSubProcess\" attachedToRef=\"SubProcess\">\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_1owasie\" />\n    </bpmn:boundaryEvent>\n  </bpmn:process>\n  <bpmn:process id=\"OtherProcess\">\n    <bpmn:task id=\"Task_in_OtherProcess\" name=\"3\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_in_OtherProcess\" name=\"4\" attachedToRef=\"Task_in_OtherProcess\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"Participant_di\" bpmnElement=\"Participant\">\n        <dc:Bounds x=\"111\" y=\"31\" width=\"600\" height=\"275\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"OtherParticipant_di\" bpmnElement=\"OtherParticipant\">\n        <dc:Bounds x=\"382\" y=\"394\" width=\"329\" height=\"182\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_in_OtherProcess_di\" bpmnElement=\"Task_in_OtherProcess\">\n        <dc:Bounds x=\"450\" y=\"426\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_in_OtherProcess_di\" bpmnElement=\"BoundaryEvent_in_OtherProcess\">\n        <dc:Bounds x=\"495\" y=\"488\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"468\" y=\"524\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_di\" bpmnElement=\"SubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"196\" y=\"67\" width=\"243\" height=\"155\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_di\" bpmnElement=\"BoundaryEvent_on_SubProcess\">\n        <dc:Bounds x=\"237\" y=\"204\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"210\" y=\"240\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_nested_di\" bpmnElement=\"Task_nested\">\n        <dc:Bounds x=\"295\" y=\"88\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_nested_di\" bpmnElement=\"BoundaryEvent_nested\">\n        <dc:Bounds x=\"340\" y=\"150\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"313\" y=\"186\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_di\" bpmnElement=\"EndEvent_nested\">\n        <dc:Bounds x=\"229\" y=\"110\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"202\" y=\"146\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_di\" bpmnElement=\"ExclusiveGateway\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"596\" y=\"232\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"576\" y=\"282\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_di\" bpmnElement=\"TextAnnotation\">\n        <dc:Bounds x=\"804\" y=\"101\" width=\"143\" height=\"83\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_di\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"557\" y=\"95\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_on_Task_di\" bpmnElement=\"BoundaryEvent_on_Task\">\n        <dc:Bounds x=\"603\" y=\"157\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"576\" y=\"193\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_None_di\" bpmnElement=\"StartEvent_None\">\n        <dc:Bounds x=\"501\" y=\"239\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"474\" y=\"275\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"MessageBoundaryEvent_onSubProcess_di\" bpmnElement=\"MessageBoundaryEvent_onSubProcess\">\n        <dc:Bounds x=\"362\" y=\"204\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.collaboration-dataAssociation.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.5.1\">\n  <bpmn:collaboration id=\"Collaboration\">\n    <bpmn:participant id=\"Participant\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"Task\">\n      <bpmn:property id=\"Property_1oyztzi\" name=\"__targetRef_placeholder\" />\n      <bpmn:dataInputAssociation id=\"DataInputAssociation\">\n        <bpmn:sourceRef>DataStoreReference</bpmn:sourceRef>\n        <bpmn:targetRef>Property_1oyztzi</bpmn:targetRef>\n      </bpmn:dataInputAssociation>\n    </bpmn:task>\n    <bpmn:dataStoreReference id=\"DataStoreReference\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"Participant_di\" bpmnElement=\"Participant\">\n        <dc:Bounds x=\"28\" y=\"24\" width=\"300\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_di\" bpmnElement=\"DataStoreReference\">\n        <dc:Bounds x=\"109\" y=\"194\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"134\" y=\"244\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_di\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"153\" y=\"64\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_di\" bpmnElement=\"DataInputAssociation\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"149\" y=\"194\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"179\" y=\"144\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.collaboration-empty.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"_biH3sOTeEeS2YerRfpjPrw\" targetNamespace=\"http://camunda.org/schema/1.0/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"1.14.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"Collaboration\">\n    <bpmn2:participant id=\"Participant\" name=\"Pool\"/>\n  </bpmn2:collaboration>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_3\" bpmnElement=\"Participant\" isHorizontal=\"true\">\n        <dc:Bounds x=\"72\" y=\"48\" width=\"706\" height=\"266\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.collaboration-lanes.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_4bAZoD9WEeWLcNBL4nCk1A\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:collaboration id=\"Collaboration\">\n    <bpmn2:participant id=\"Participant_Lane\" name=\"Participant_Lane\" processRef=\"Process_Lane\"/>\n    <bpmn2:participant id=\"Participant\" name=\"Participant\" processRef=\"Process\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_Lane\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Lane\" name=\"Lane\">\n        <bpmn2:flowNodeRef>Boundary</bpmn2:flowNodeRef>\n        <bpmn2:flowNodeRef>Task_Boundary</bpmn2:flowNodeRef>\n        <bpmn2:flowNodeRef>Task</bpmn2:flowNodeRef>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:boundaryEvent id=\"Boundary\" name=\"Boundary\" attachedToRef=\"Task_Boundary\">\n      <bpmn2:outgoing>SequenceFlow_from_Boundary</bpmn2:outgoing>\n    </bpmn2:boundaryEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_from_Boundary\" name=\"\" sourceRef=\"Boundary\" targetRef=\"Task\"/>\n    <bpmn2:task id=\"Task_Boundary\" name=\"Task_Boundary\">\n      <bpmn2:outgoing>SequenceFlow</bpmn2:outgoing>\n    </bpmn2:task>\n    <bpmn2:sequenceFlow id=\"SequenceFlow\" name=\"\" sourceRef=\"Task_Boundary\" targetRef=\"Task\"/>\n    <bpmn2:task id=\"Task\" name=\"Task\">\n      <bpmn2:incoming>SequenceFlow_from_Boundary</bpmn2:incoming>\n      <bpmn2:incoming>SequenceFlow</bpmn2:incoming>\n    </bpmn2:task>\n  </bpmn2:process>\n  <bpmn2:process id=\"Process\" isExecutable=\"false\">\n    <bpmn2:subProcess id=\"SubProcess\" name=\"SubProcess\">\n      <bpmn2:task id=\"Task_in_SubProcess\" name=\"Task_in_SubProcess\"/>\n    </bpmn2:subProcess>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"Participant_Lane\" isHorizontal=\"true\">\n        <dc:Bounds height=\"181.0\" width=\"540.0\" x=\"156.0\" y=\"84.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_Boundary\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"348.0\" y=\"114.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_BoundaryEvent_2\" bpmnElement=\"Boundary\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"395.0\" y=\"176.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"21.0\" width=\"61.0\" x=\"336.0\" y=\"211.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"516.0\" y=\"114.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_1\" bpmnElement=\"SequenceFlow_from_Boundary\" sourceElement=\"_BPMNShape_BoundaryEvent_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"413.0\" y=\"212.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"413.0\" y=\"242.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"566.0\" y=\"242.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"566.0\" y=\"194.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"458.0\" y=\"242.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow\" sourceElement=\"_BPMNShape_Task_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"448.0\" y=\"154.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"516.0\" y=\"154.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"6.0\" width=\"6.0\" x=\"487.0\" y=\"154.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_3\" bpmnElement=\"Lane\" isHorizontal=\"true\">\n        <dc:Bounds height=\"181.0\" width=\"510.0\" x=\"186.0\" y=\"84.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_4\" bpmnElement=\"Participant\" isHorizontal=\"true\">\n        <dc:Bounds height=\"181.0\" width=\"540.0\" x=\"156.0\" y=\"384.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_3\" bpmnElement=\"SubProcess\" isExpanded=\"true\">\n        <dc:Bounds height=\"150.0\" width=\"200.0\" x=\"384.0\" y=\"396.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_5\" bpmnElement=\"Task_in_SubProcess\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"472.0\" y=\"443.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.collaboration.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"_biH3sOTeEeS2YerRfpjPrw\" targetNamespace=\"http://camunda.org/schema/1.0/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.8.1\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"Collaboration\">\n    <bpmn2:participant id=\"Participant\" name=\"Pool\" processRef=\"Process\" />\n    <bpmn2:participant id=\"OtherParticipant\" name=\"Pool\" processRef=\"OtherProcess\" />\n    <bpmn2:participant id=\"CollapsedParticipant\" name=\"Pool\" />\n    <bpmn2:messageFlow id=\"MessageFlow_labeled\" name=\"LABEL\" sourceRef=\"Participant\" targetRef=\"OtherParticipant\" />\n    <bpmn2:messageFlow id=\"MessageFlow_2\" sourceRef=\"OtherParticipant\" targetRef=\"SubProcess\" />\n    <bpmn2:textAnnotation id=\"TextAnnotation_Global\" />\n    <bpmn2:group id=\"Group\" />\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process\" isExecutable=\"false\">\n    <bpmn2:startEvent id=\"StartEvent_None\" />\n    <bpmn2:startEvent id=\"StartEvent_Message\">\n      <bpmn2:messageEventDefinition />\n    </bpmn2:startEvent>\n    <bpmn2:startEvent id=\"StartEvent_Timer\">\n      <bpmn2:timerEventDefinition />\n    </bpmn2:startEvent>\n    <bpmn2:subProcess id=\"SubProcess\">\n      <bpmn2:task id=\"Task_in_SubProcess\" />\n      <bpmn2:endEvent id=\"EndEvent_None_in_SubProcess\" />\n    </bpmn2:subProcess>\n    <bpmn2:endEvent id=\"EndEvent_Message\">\n      <bpmn2:messageEventDefinition />\n    </bpmn2:endEvent>\n    <bpmn2:endEvent id=\"EndEvent_None\">\n      <bpmn2:incoming>SequenceFlow</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:intermediateCatchEvent id=\"IntermediateCatchEvent_Escalation\">\n      <bpmn2:escalationEventDefinition />\n    </bpmn2:intermediateCatchEvent>\n    <bpmn2:intermediateThrowEvent id=\"IntermediateThrowEvent_Message\">\n      <bpmn2:messageEventDefinition id=\"MessageEventDefinition_1\" />\n    </bpmn2:intermediateThrowEvent>\n    <bpmn2:intermediateThrowEvent id=\"IntermediateThrowEvent_None\">\n      <bpmn2:outgoing>SequenceFlow</bpmn2:outgoing>\n    </bpmn2:intermediateThrowEvent>\n    <bpmn2:intermediateThrowEvent id=\"IntermediateThrowEvent_Signal\">\n      <bpmn2:signalEventDefinition />\n    </bpmn2:intermediateThrowEvent>\n    <bpmn2:endEvent id=\"EndEvent_Cancel\">\n      <bpmn2:cancelEventDefinition />\n    </bpmn2:endEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow\" sourceRef=\"IntermediateThrowEvent_None\" targetRef=\"EndEvent_None\" />\n  </bpmn2:process>\n  <bpmn2:process id=\"OtherProcess\" isExecutable=\"false\">\n    <bpmn2:task id=\"Task_in_OtherParticipant\">\n      <bpmn2:dataOutputAssociation id=\"DataOutputAssociation\">\n        <bpmn2:targetRef>DataStoreReference</bpmn2:targetRef>\n      </bpmn2:dataOutputAssociation>\n    </bpmn2:task>\n    <bpmn2:dataStoreReference id=\"DataStoreReference\" />\n    <bpmn2:callActivity id=\"CallActivity\" />\n    <bpmn2:textAnnotation id=\"TextAnnotation_OtherParticipant\" />\n  </bpmn2:process>\n  <bpmn2:process id=\"Process_18q5tmq\" isExecutable=\"false\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_3\" bpmnElement=\"Participant\" isHorizontal=\"true\">\n        <dc:Bounds x=\"152\" y=\"48\" width=\"706\" height=\"266\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_di\" bpmnElement=\"SequenceFlow\">\n        <di:waypoint x=\"355\" y=\"252\" />\n        <di:waypoint x=\"497\" y=\"252\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"StartEvent_None_di\" bpmnElement=\"StartEvent_None\">\n        <dc:Bounds x=\"224\" y=\"234\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"117\" y=\"270\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_Message_di\" bpmnElement=\"StartEvent_Message\">\n        <dc:Bounds x=\"224\" y=\"157\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"117\" y=\"193\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_Timer_di\" bpmnElement=\"StartEvent_Timer\">\n        <dc:Bounds x=\"224\" y=\"78\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"117\" y=\"114\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_3\" bpmnElement=\"SubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"590\" y=\"72\" width=\"248\" height=\"205\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_in_SubProcess\">\n        <dc:Bounds x=\"615\" y=\"95\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_None_in_SubProcess_di\" bpmnElement=\"EndEvent_None_in_SubProcess\">\n        <dc:Bounds x=\"769\" y=\"117\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"662\" y=\"153\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_Message_di\" bpmnElement=\"EndEvent_Message\">\n        <dc:Bounds x=\"497\" y=\"157\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"390\" y=\"193\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_None_di\" bpmnElement=\"EndEvent_None\">\n        <dc:Bounds x=\"497\" y=\"234\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"390\" y=\"270\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_Escalation_di\" bpmnElement=\"IntermediateCatchEvent_Escalation\">\n        <dc:Bounds x=\"319\" y=\"78\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"212\" y=\"114\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateCatchEvent_2\" bpmnElement=\"IntermediateThrowEvent_Message\">\n        <dc:Bounds x=\"319\" y=\"157\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"212\" y=\"198\" width=\"90\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_None_di\" bpmnElement=\"IntermediateThrowEvent_None\">\n        <dc:Bounds x=\"319\" y=\"234\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"212\" y=\"270\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_Signal_di\" bpmnElement=\"IntermediateThrowEvent_Signal\">\n        <dc:Bounds x=\"406\" y=\"78\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"299\" y=\"114\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_Cancel_di\" bpmnElement=\"EndEvent_Cancel\">\n        <dc:Bounds x=\"497\" y=\"78\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"390\" y=\"114\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_4\" bpmnElement=\"OtherParticipant\" isHorizontal=\"true\">\n        <dc:Bounds x=\"152\" y=\"432\" width=\"697\" height=\"157\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_7\" bpmnElement=\"Task_in_OtherParticipant\">\n        <dc:Bounds x=\"488\" y=\"465\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_09caypn_di\" bpmnElement=\"DataStoreReference\">\n        <dc:Bounds x=\"752\" y=\"480\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"696.8233151183972\" y=\"534\" width=\"0\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_TextAnnotation_3\" bpmnElement=\"TextAnnotation_OtherParticipant\">\n        <dc:Bounds x=\"242\" y=\"465\" width=\"103\" height=\"88\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"CallActivity_di\" bpmnElement=\"CallActivity\">\n        <dc:Bounds x=\"360\" y=\"465\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_09perow_di\" bpmnElement=\"CollapsedParticipant\" isHorizontal=\"true\">\n        <dc:Bounds x=\"205\" y=\"704\" width=\"594\" height=\"117\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_TextAnnotation_4\" bpmnElement=\"TextAnnotation_Global\">\n        <dc:Bounds x=\"1002\" y=\"128\" width=\"96\" height=\"88\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_di\" bpmnElement=\"Group\">\n        <dc:Bounds x=\"280\" y=\"200\" width=\"100\" height=\"100\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_di\" bpmnElement=\"DataOutputAssociation\">\n        <di:waypoint x=\"588\" y=\"505\" />\n        <di:waypoint x=\"752\" y=\"505\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"MessageFlow_labeled_di\" bpmnElement=\"MessageFlow_labeled\">\n        <di:waypoint x=\"505\" y=\"314\" />\n        <di:waypoint x=\"505\" y=\"432\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"513\" y=\"364\" width=\"35\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"MessageFlow_2_di\" bpmnElement=\"MessageFlow_2\">\n        <di:waypoint x=\"631\" y=\"432\" />\n        <di:waypoint x=\"631\" y=\"277\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.collapsedPools.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_ah3a1f\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"http://bpmn.io\" exporterVersion=\"0.10.1\">\n  <collaboration id=\"Collaboration_1\">\n    <participant id=\"CollapsedPool_A\" name=\"A\" />\n    <participant id=\"CollapsedPool_B\" name=\"B\" />\n    <participant id=\"ExpandedPool\" name=\"C\" processRef=\"Process_C\" />\n  </collaboration>\n  <process id=\"Process_C\" />\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_150rzdx_di\" bpmnElement=\"CollapsedPool_A\">\n        <omgdc:Bounds x=\"142\" y=\"79\" width=\"355\" height=\"100\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"CollapsedPool_B_di\" bpmnElement=\"CollapsedPool_B\">\n        <omgdc:Bounds x=\"142\" y=\"237\" width=\"355\" height=\"100\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExpandedPool_di\" bpmnElement=\"ExpandedPool\">\n        <omgdc:Bounds x=\"565\" y=\"79\" width=\"305\" height=\"99\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.compensation-collaboration.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"_9X-DgL31EeWxRuodBysTLQ\" targetNamespace=\"http://activiti.org/bpmn\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"Collaboration_0loy6fl\">\n    <bpmn2:participant id=\"Participant_05lagcz\" processRef=\"Process_1\" />\n    <bpmn2:participant id=\"CollapsedPool\" />\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:task id=\"Task\" />\n    <bpmn2:task id=\"CompensationTask\" isForCompensation=\"true\" />\n    <bpmn2:boundaryEvent id=\"CompensationBoundary\" attachedToRef=\"Task\">\n      <bpmn2:compensateEventDefinition id=\"_CompensateEventDefinition_2\" waitForCompletion=\"false\" />\n    </bpmn2:boundaryEvent>\n    <bpmn2:association id=\"Association_1eqfqtu\" associationDirection=\"One\" sourceRef=\"CompensationBoundary\" targetRef=\"CompensationTask\" />\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_0loy6fl\">\n      <bpmndi:BPMNShape id=\"Participant_05lagcz_di\" bpmnElement=\"Participant_05lagcz\">\n        <dc:Bounds x=\"50\" y=\"45\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_TaskForCompensation\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"100\" y=\"65\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"CompensationTask_di\" bpmnElement=\"CompensationTask\">\n        <dc:Bounds x=\"230\" y=\"185\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_BoundaryEvent_2\" bpmnElement=\"CompensationBoundary\">\n        <dc:Bounds x=\"144\" y=\"127\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"117\" y=\"97\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_1eqfqtu_di\" bpmnElement=\"Association_1eqfqtu\">\n        <di:waypoint x=\"162\" y=\"163\" />\n        <di:waypoint x=\"162\" y=\"225\" />\n        <di:waypoint x=\"230\" y=\"225\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Participant_08qzqg7_di\" bpmnElement=\"CollapsedPool\">\n        <dc:Bounds x=\"133\" y=\"368\" width=\"332\" height=\"96\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.compensation.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"_9X-DgL31EeWxRuodBysTLQ\" targetNamespace=\"http://camunda.org/schema/1.0/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.16.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:task id=\"Task\" />\n    <bpmn2:boundaryEvent id=\"CompensationBoundary\" attachedToRef=\"Task\">\n      <bpmn2:compensateEventDefinition id=\"_CompensateEventDefinition_2\" waitForCompletion=\"false\" />\n    </bpmn2:boundaryEvent>\n    <bpmn2:task id=\"TaskForCompensation\" isForCompensation=\"true\" />\n    <bpmn2:intermediateThrowEvent id=\"IntermediateThrowEvent_1\">\n      <bpmn2:compensateEventDefinition id=\"_CompensateEventDefinition_3\" waitForCompletion=\"false\" />\n    </bpmn2:intermediateThrowEvent>\n    <bpmn2:subProcess id=\"SubProcess_1\" isForCompensation=\"true\" triggeredByEvent=\"true\">\n      <bpmn2:startEvent id=\"StartEvent_1\">\n        <bpmn2:compensateEventDefinition id=\"_CompensateEventDefinition_4\" waitForCompletion=\"false\" />\n      </bpmn2:startEvent>\n    </bpmn2:subProcess>\n    <bpmn2:endEvent id=\"EndEvent_1\">\n      <bpmn2:compensateEventDefinition id=\"_CompensateEventDefinition_5\" waitForCompletion=\"false\" />\n    </bpmn2:endEvent>\n    <bpmn2:exclusiveGateway id=\"Gateway\" />\n    <bpmn2:intermediateThrowEvent id=\"IntermediateEvent\" />\n    <bpmn2:subProcess id=\"SubProcess_2\">\n      <bpmn2:startEvent id=\"Event_0ih2uit\" />\n      <bpmn2:task id=\"TaskInSubprocess\" />\n    </bpmn2:subProcess>\n    <bpmn2:task id=\"NoneTask\" />\n    <bpmn2:task id=\"TaskWithBoundary\" />\n    <bpmn2:boundaryEvent id=\"Event_0vwtzr3\" attachedToRef=\"TaskWithBoundary\" />\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_TaskForCompensation\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"453\" y=\"99\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"TaskForCompensation\">\n        <dc:Bounds x=\"142\" y=\"240\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateThrowEvent_2\" bpmnElement=\"IntermediateThrowEvent_1\">\n        <dc:Bounds x=\"192\" y=\"121\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"210\" y=\"162\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_04z4f93_di\" bpmnElement=\"TaskWithBoundary\">\n        <dc:Bounds x=\"570\" y=\"369\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_2\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"142\" y=\"369\" width=\"200\" height=\"150\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"180\" y=\"408\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"198\" y=\"449\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"298\" y=\"120\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_ExclusiveGateway_2\" bpmnElement=\"Gateway\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"316\" y=\"254\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"341\" y=\"309\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateThrowEvent_4\" bpmnElement=\"IntermediateEvent\">\n        <dc:Bounds x=\"432\" y=\"262\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"450\" y=\"303\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_11kmncl_di\" bpmnElement=\"SubProcess_2\" isExpanded=\"true\">\n        <dc:Bounds x=\"160\" y=\"344\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0ih2uit_di\" bpmnElement=\"Event_0ih2uit\">\n        <dc:Bounds x=\"200\" y=\"426\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1h7q4en_di\" bpmnElement=\"TaskInSubprocess\">\n        <dc:Bounds x=\"360\" y=\"404\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_07nmwoh_di\" bpmnElement=\"NoneTask\">\n        <dc:Bounds x=\"570\" y=\"240\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_BoundaryEvent_2\" bpmnElement=\"CompensationBoundary\">\n        <dc:Bounds x=\"497\" y=\"161\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0iz5azc_di\" bpmnElement=\"Event_0vwtzr3\">\n        <dc:Bounds x=\"602\" y=\"431\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.connectOnCreate.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"3.4.0\">\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <task id=\"Task_A\" name=\"A\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_A_di\" bpmnElement=\"Task_A\">\n        <omgdc:Bounds x=\"156\" y=\"81\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.dataAssociation.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process\" isExecutable=\"false\">\n    <bpmn:dataObjectReference id=\"DataObjectReference\" dataObjectRef=\"DataObject\" />\n    <bpmn:dataObject id=\"DataObject\" />\n    <bpmn:task id=\"Task\">\n      <bpmn:dataOutputAssociation id=\"DataAssociation\">\n        <bpmn:targetRef>DataObjectReference</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n    </bpmn:task>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process\">\n      <bpmndi:BPMNShape id=\"DataObjectReference_di\" bpmnElement=\"DataObjectReference\">\n        <dc:Bounds x=\"201\" y=\"184\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"174\" y=\"234\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataAssociation_di\" bpmnElement=\"DataAssociation\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"47\" y=\"60\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"112\" y=\"184\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_di\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"52\" y=\"36\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.dataInputOutput.collaboration.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<semantic:definitions xmlns:semantic=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:color=\"http://www.omg.org/spec/BPMN/non-normative/color/1.0\" id=\"_af3cbf6a-9c69-460b-9a1d-276711d30213\" name=\"Travel Booking with Event Subprocess\" targetNamespace=\"http://www.trisotech.com/definitions/_af3cbf6a-9c69-460b-9a1d-276711d30213\" exporter=\"BPMN Modeler\" exporterVersion=\"6.1.22\">\n  <semantic:collaboration id=\"Collaboration_0vimy52\">\n    <semantic:participant id=\"Participant_A\" name=\"A\" processRef=\"Process_A\" />\n    <semantic:participant id=\"Participant_B\" name=\"B\" processRef=\"Process_B\" />\n  </semantic:collaboration>\n  <semantic:process id=\"Process_A\" name=\"Simple Travel Booking\" isClosed=\"false\">\n    <semantic:ioSpecification>\n      <semantic:dataInput id=\"DataInput\" name=\"Input\" />\n      <semantic:dataOutput id=\"DataOutput\" name=\"Output\" />\n      <semantic:inputSet id=\"_9f9aea93-30cd-4899-bbe1-e62165c3dbc9\">\n        <semantic:dataInputRefs>DataInput</semantic:dataInputRefs>\n      </semantic:inputSet>\n      <semantic:outputSet id=\"_8154d47e-5733-41c1-8125-29ff926b3cd2\">\n        <semantic:dataOutputRefs>DataOutput</semantic:dataOutputRefs>\n      </semantic:outputSet>\n    </semantic:ioSpecification>\n    <semantic:sendTask id=\"Task\" name=\"Process Data\" implementation=\"##WebService\">\n      <semantic:ioSpecification>\n        <semantic:dataInput id=\"_9628422b-85a6-4857-8c14-7289b9fd9a8a\" />\n        <semantic:dataOutput id=\"_29b8c649-e2a0-4dd3-804b-567e8cc71718\" />\n        <semantic:inputSet id=\"_1957232b-478c-49d4-b3a7-86da323a1629\">\n          <semantic:dataInputRefs>_9628422b-85a6-4857-8c14-7289b9fd9a8a</semantic:dataInputRefs>\n        </semantic:inputSet>\n        <semantic:outputSet id=\"_eb462f09-2a8c-43fb-b398-09da73357dde\">\n          <semantic:dataOutputRefs>_29b8c649-e2a0-4dd3-804b-567e8cc71718</semantic:dataOutputRefs>\n        </semantic:outputSet>\n      </semantic:ioSpecification>\n      <semantic:dataInputAssociation id=\"_82006a49-2cc8-4814-83e2-28c5a85a4c4a\">\n        <semantic:sourceRef>DataInput</semantic:sourceRef>\n        <semantic:targetRef>Property_1wt0ffm</semantic:targetRef>\n      </semantic:dataInputAssociation>\n      <semantic:dataOutputAssociation id=\"_ef945053-2c76-4796-8d8b-afc6be8bbfec\">\n        <semantic:sourceRef>_29b8c649-e2a0-4dd3-804b-567e8cc71718</semantic:sourceRef>\n        <semantic:targetRef>DataOutput</semantic:targetRef>\n      </semantic:dataOutputAssociation>\n    </semantic:sendTask>\n  </semantic:process>\n  <semantic:process id=\"Process_B\" />\n  <bpmndi:BPMNDiagram id=\"_f1aecfc3-a3da-4bde-bece-87786e25273d\" name=\"Simple Travel Booking\">\n    <bpmndi:BPMNPlane id=\"_f1aecfc3-a3da-4bde-bece-87786e25273d_plane\" bpmnElement=\"Collaboration_0vimy52\">\n      <bpmndi:BPMNShape id=\"Participant_A_di\" bpmnElement=\"Participant_A\" isHorizontal=\"true\">\n        <dc:Bounds x=\"111\" y=\"110\" width=\"426\" height=\"234\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataInput_di\" bpmnElement=\"DataInput\">\n        <dc:Bounds x=\"209\" y=\"130\" width=\"34\" height=\"40\" />\n        <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n          <dc:Bounds x=\"211\" y=\"180\" width=\"26\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataOutput_di\" bpmnElement=\"DataOutput\">\n        <dc:Bounds x=\"394\" y=\"180\" width=\"34\" height=\"40\" />\n        <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n          <dc:Bounds x=\"392\" y=\"225\" width=\"34\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_8eb52f6a-0fd6-4fad-8ade-14bca1b066bf\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"276\" y=\"230\" width=\"96\" height=\"76\" />\n        <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n          <dc:Bounds x=\"170.5\" y=\"261.9739767206677\" width=\"89\" height=\"26\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"_fa1439cb-56e1-4399-bfe8-638b37a16866\" bpmnElement=\"_82006a49-2cc8-4814-83e2-28c5a85a4c4a\" targetElement=\"_8eb52f6a-0fd6-4fad-8ade-14bca1b066bf\">\n        <di:waypoint x=\"244\" y=\"143.99809778522484\" />\n        <di:waypoint x=\"324\" y=\"143.99809778522484\" />\n        <di:waypoint x=\"324\" y=\"230\" />\n        <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"_9f83d262-8e6a-47f5-84b3-86f560fbfcec\" bpmnElement=\"_ef945053-2c76-4796-8d8b-afc6be8bbfec\" sourceElement=\"_8eb52f6a-0fd6-4fad-8ade-14bca1b066bf\">\n        <di:waypoint x=\"339\" y=\"230\" />\n        <di:waypoint x=\"339\" y=\"200\" />\n        <di:waypoint x=\"394\" y=\"200\" />\n        <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Participant_B_di\" bpmnElement=\"Participant_B\" isHorizontal=\"true\">\n        <dc:Bounds x=\"111\" y=\"391\" width=\"423\" height=\"160\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_0\">\n      <dc:Font name=\"Arial\" size=\"11\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n    <bpmndi:BPMNLabelStyle id=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n      <dc:Font name=\"arial,helvetica,sans-serif\" size=\"11\" isBold=\"false\" isItalic=\"false\" isUnderline=\"false\" isStrikeThrough=\"false\" />\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n</semantic:definitions>"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.dataInputOutput.process.bpmn",
    "content": "<semantic:definitions xmlns:semantic=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:color=\"http://www.omg.org/spec/BPMN/non-normative/color/1.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"_af3cbf6a-9c69-460b-9a1d-276711d30213\" targetNamespace=\"http://www.trisotech.com/definitions/_af3cbf6a-9c69-460b-9a1d-276711d30213\" expressionLanguage=\"http://www.w3.org/1999/XPath\" exporter=\"BPMN Modeler\" exporterVersion=\"6.1.22\" name=\"Travel Booking with Event Subprocess\">\n  <semantic:process id=\"Process\" name=\"Simple Travel Booking\" isClosed=\"false\">\n    <semantic:ioSpecification>\n      <semantic:dataInput name=\"Input\" isCollection=\"false\" id=\"DataInput\"/>\n      <semantic:dataOutput name=\"Output\" isCollection=\"false\" id=\"DataOutput\"/>\n      <semantic:inputSet id=\"Process_InputSet\">\n        <semantic:dataInputRefs>DataInput</semantic:dataInputRefs>\n      </semantic:inputSet>\n      <semantic:outputSet id=\"Process_OutputSet\">\n        <semantic:dataOutputRefs>DataOutput</semantic:dataOutputRefs>\n      </semantic:outputSet>\n    </semantic:ioSpecification>\n    <semantic:sendTask id=\"Task\" name=\"Process Data\" implementation=\"##WebService\">\n      <semantic:ioSpecification>\n        <semantic:dataInput id=\"Task_DataInput\"/>\n        <semantic:dataOutput id=\"Task_DataOutput\"/>\n        <semantic:inputSet id=\"Task_InputSet\">\n          <semantic:dataInputRefs>Task_DataInput</semantic:dataInputRefs>\n        </semantic:inputSet>\n        <semantic:outputSet id=\"Task_OutputSet\">\n          <semantic:dataOutputRefs>Task_DataOutput</semantic:dataOutputRefs>\n        </semantic:outputSet>\n      </semantic:ioSpecification>\n      <semantic:dataInputAssociation id=\"DataInputAssociation\">\n        <semantic:sourceRef>DataInput</semantic:sourceRef>\n        <semantic:targetRef>Task_DataInput</semantic:targetRef>\n      </semantic:dataInputAssociation>\n      <semantic:dataOutputAssociation id=\"DataOutputAssociation\">\n        <semantic:sourceRef>Task_DataOutput</semantic:sourceRef>\n        <semantic:targetRef>DataOutput</semantic:targetRef>\n      </semantic:dataOutputAssociation>\n    </semantic:sendTask>\n  </semantic:process>\n  <bpmndi:BPMNDiagram id=\"_f1aecfc3-a3da-4bde-bece-87786e25273d\" name=\"Simple Travel Booking\">\n    <bpmndi:BPMNPlane bpmnElement=\"Process\" id=\"_f1aecfc3-a3da-4bde-bece-87786e25273d_plane\">\n      <bpmndi:BPMNShape id=\"DataOutput_di\" bpmnElement=\"DataOutput\">\n        <dc:Bounds x=\"285\" y=\"150\" width=\"34\" height=\"40\"/>\n        <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n          <dc:Bounds height=\"12\" width=\"30\" x=\"285\" y=\"195\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataInput_di\" bpmnElement=\"DataInput\">\n        <dc:Bounds x=\"100\" y=\"100\" width=\"34\" height=\"40\"/>\n        <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n          <dc:Bounds height=\"12\" width=\"30\" x=\"100\" y=\"150\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_di\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"167\" y=\"200\" width=\"96\" height=\"76\"/>\n        <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n          <dc:Bounds height=\"26\" width=\"89\" x=\"170.5\" y=\"261.9739767206677\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_di\" bpmnElement=\"DataInputAssociation\" targetElement=\"Task_di\">\n        <di:waypoint x=\"135\" y=\"113.99809778522484\"/>\n        <di:waypoint x=\"215\" y=\"113.99809778522484\"/>\n        <di:waypoint x=\"215\" y=\"200\"/>\n        <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_di\" bpmnElement=\"DataOutputAssociation\" sourceElement=\"Task\">\n        <di:waypoint x=\"230\" y=\"200\"/>\n        <di:waypoint x=\"230\" y=\"170\"/>\n        <di:waypoint x=\"285\" y=\"170\"/>\n        <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\"/>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_0\">\n      <dc:Font name=\"Arial\" size=\"11\" isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\"/>\n    </bpmndi:BPMNLabelStyle>\n    <bpmndi:BPMNLabelStyle id=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n      <dc:Font name=\"arial,helvetica,sans-serif\" size=\"11\" isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\"/>\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n</semantic:definitions>"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.detaching.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.1.1\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess_1\" name=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent\" attachedToRef=\"SubProcess_1\" />\n    <bpmn:boundaryEvent id=\"BoundaryMessageEvent\" attachedToRef=\"SubProcess_1\">\n      <bpmn:messageEventDefinition />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundaryTimerEvent\" attachedToRef=\"SubProcess_1\">\n      <bpmn:timerEventDefinition />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundaryEscalationEvent\" attachedToRef=\"SubProcess_1\">\n      <bpmn:escalationEventDefinition />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundaryConditionalEvent\" attachedToRef=\"SubProcess_1\">\n      <bpmn:conditionalEventDefinition>\n        <bpmn:condition xsi:type=\"bpmn:tFormalExpression\" />\n      </bpmn:conditionalEventDefinition>\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundaryErrorEvent\" attachedToRef=\"SubProcess_1\">\n      <bpmn:errorEventDefinition />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundarySignalEvent\" attachedToRef=\"SubProcess_1\">\n      <bpmn:signalEventDefinition />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundaryCompensationEvent\" attachedToRef=\"SubProcess_1\">\n      <bpmn:compensateEventDefinition />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundaryNonInterruptingMessageEvent\" cancelActivity=\"false\" attachedToRef=\"SubProcess_1\">\n      <bpmn:messageEventDefinition />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundaryTimerNonInterruptingEvent\" cancelActivity=\"false\" attachedToRef=\"SubProcess_1\">\n      <bpmn:timerEventDefinition />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundaryEscalationNonInterruptingEvent\" cancelActivity=\"false\" attachedToRef=\"SubProcess_1\">\n      <bpmn:escalationEventDefinition />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundaryConditionalNonInterruptingEvent\" cancelActivity=\"false\" attachedToRef=\"SubProcess_1\">\n      <bpmn:conditionalEventDefinition>\n        <bpmn:condition xsi:type=\"bpmn:tFormalExpression\" />\n      </bpmn:conditionalEventDefinition>\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundaryCancelEvent\" attachedToRef=\"SubProcess_1\">\n      <bpmn:cancelEventDefinition />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundarySignalNonInterruptingEvent\" cancelActivity=\"false\" attachedToRef=\"SubProcess_1\">\n      <bpmn:signalEventDefinition />\n    </bpmn:boundaryEvent>\n    <bpmn:boundaryEvent id=\"BoundaryEventWithConnections\" attachedToRef=\"SubProcess_1\">\n      <bpmn:outgoing>SequenceFlow_06au3yc</bpmn:outgoing>\n    </bpmn:boundaryEvent>\n    <bpmn:task id=\"Task_1\">\n      <bpmn:incoming>SequenceFlow_06au3yc</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_06au3yc\" sourceRef=\"BoundaryEventWithConnections\" targetRef=\"Task_1\" />\n    <bpmn:boundaryEvent id=\"BoundaryEventWithLabel\" name=\"label\" attachedToRef=\"SubProcess_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_1_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"156\" y=\"81\" width=\"849\" height=\"201\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_07t981c_di\" bpmnElement=\"BoundaryEvent\">\n        <dc:Bounds x=\"170\" y=\"264\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_14eo0nz_di\" bpmnElement=\"BoundaryMessageEvent\">\n        <dc:Bounds x=\"218\" y=\"264\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1caoqb9_di\" bpmnElement=\"BoundaryTimerEvent\">\n        <dc:Bounds x=\"261\" y=\"264\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_0us9p55_di\" bpmnElement=\"BoundaryEscalationEvent\">\n        <dc:Bounds x=\"309\" y=\"264\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_10jnkwx_di\" bpmnElement=\"BoundaryConditionalEvent\">\n        <dc:Bounds x=\"353\" y=\"264\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_0heyf2g_di\" bpmnElement=\"BoundaryErrorEvent\">\n        <dc:Bounds x=\"399\" y=\"264\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1a81efa_di\" bpmnElement=\"BoundarySignalEvent\">\n        <dc:Bounds x=\"452\" y=\"264\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_08kjzds_di\" bpmnElement=\"BoundaryCompensationEvent\">\n        <dc:Bounds x=\"535\" y=\"264\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1jl6ugf_di\" bpmnElement=\"BoundaryNonInterruptingMessageEvent\">\n        <dc:Bounds x=\"590\" y=\"264\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_0v82qap_di\" bpmnElement=\"BoundaryTimerNonInterruptingEvent\">\n        <dc:Bounds x=\"645\" y=\"264\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_0nnhzzw_di\" bpmnElement=\"BoundaryEscalationNonInterruptingEvent\">\n        <dc:Bounds x=\"700\" y=\"264\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1b3ud2q_di\" bpmnElement=\"BoundaryConditionalNonInterruptingEvent\">\n        <dc:Bounds x=\"758\" y=\"264\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_1btj0hc_di\" bpmnElement=\"BoundaryCancelEvent\">\n        <dc:Bounds x=\"492\" y=\"264\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_04ls5w4_di\" bpmnElement=\"BoundarySignalNonInterruptingEvent\">\n        <dc:Bounds x=\"813\" y=\"264\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_06gp814_di\" bpmnElement=\"BoundaryEventWithConnections\">\n        <dc:Bounds x=\"862\" y=\"264\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0k50qut_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"1010\" y=\"370\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_06au3yc_di\" bpmnElement=\"SequenceFlow_06au3yc\">\n        <di:waypoint x=\"880\" y=\"300\" />\n        <di:waypoint x=\"880\" y=\"410\" />\n        <di:waypoint x=\"1010\" y=\"410\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_111pjze_di\" bpmnElement=\"BoundaryEventWithLabel\">\n        <dc:Bounds x=\"138\" y=\"162\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"144\" y=\"205\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.eventBasedGatewayBasic.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_e9eVgOdVEeSyFtFBe7wX5g\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"Process\" isExecutable=\"false\">\n    <bpmn2:intermediateCatchEvent id=\"IntermediateCatchEvent_Message\">\n      <bpmn2:messageEventDefinition id=\"_MessageEventDefinition_3\"/>\n    </bpmn2:intermediateCatchEvent>\n    <bpmn2:intermediateThrowEvent id=\"IntermediateThrowEvent_Message\">\n      <bpmn2:messageEventDefinition id=\"_MessageEventDefinition_4\"/>\n    </bpmn2:intermediateThrowEvent>\n    <bpmn2:intermediateCatchEvent id=\"IntermediateCatchEvent_Signal\">\n      <bpmn2:signalEventDefinition id=\"_SignalEventDefinition_2\"/>\n    </bpmn2:intermediateCatchEvent>\n    <bpmn2:intermediateCatchEvent id=\"IntermediateCatchEvent_Condition\">\n      <bpmn2:conditionalEventDefinition id=\"_ConditionalEventDefinition_2\"/>\n    </bpmn2:intermediateCatchEvent>\n    <bpmn2:intermediateCatchEvent id=\"IntermediateCatchEvent_Timer\">\n      <bpmn2:timerEventDefinition id=\"_TimerEventDefinition_2\"/>\n    </bpmn2:intermediateCatchEvent>\n    <bpmn2:intermediateCatchEvent id=\"IntermediateCatchEvent\"/>\n    <bpmn2:receiveTask id=\"ReceiveTask\"/>\n    <bpmn2:parallelGateway id=\"ParallelGateway\"/>\n    <bpmn2:task id=\"Task_None\"/>\n    <bpmn2:eventBasedGateway id=\"EventBasedGateway\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_EventBasedGateway_2\" bpmnElement=\"EventBasedGateway\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"269.0\" y=\"204.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"294.0\" y=\"259.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateThrowEvent_3\" bpmnElement=\"IntermediateCatchEvent_Message\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"433.0\" y=\"212.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"451.0\" y=\"253.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateThrowEvent_4\" bpmnElement=\"IntermediateThrowEvent_Message\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"433.0\" y=\"288.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"451.0\" y=\"329.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_10\" bpmnElement=\"ReceiveTask\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"401.0\" y=\"360.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_ParallelGateway_2\" bpmnElement=\"ParallelGateway\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"425.0\" y=\"472.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"450.0\" y=\"527.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateCatchEvent_4\" bpmnElement=\"IntermediateCatchEvent_Signal\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"529.0\" y=\"212.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"547.0\" y=\"253.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateCatchEvent_5\" bpmnElement=\"IntermediateCatchEvent_Condition\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"624.0\" y=\"212.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"642.0\" y=\"253.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateCatchEvent_6\" bpmnElement=\"IntermediateCatchEvent_Timer\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"711.0\" y=\"212.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"729.0\" y=\"253.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateCatchEvent_7\" bpmnElement=\"IntermediateCatchEvent\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"804.0\" y=\"212.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"822.0\" y=\"253.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_11\" bpmnElement=\"Task_None\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"547.0\" y=\"360.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.groups.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:signavio=\"http://www.signavio.com\" xmlns:tns=\"http://www.signavio.com/bpmn20\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:yaoqiang=\"http://bpmn.sourceforge.net\" id=\"sid-0fcc2144-457b-4505-9e44-ff673663e3bc\" name=\"\" targetNamespace=\"http://www.signavio.com/bpmn20\" exporter=\"Camunda Modeler\" exporterVersion=\"3.0.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://bpmn.sourceforge.net/schemas/BPMN20.xsd\">\n  <category id=\"Category_1\">\n    <categoryValue id=\"CategoryValue_1\" value=\"group\" />\n  </category>\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <startEvent id=\"StartEvent_1\" />\n    <task id=\"Task_1\" />\n    <subProcess id=\"SubProcess_1\" />\n    <group id=\"Group_1\" categoryValueRef=\"CategoryValue_1\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"BPMNShape_1\" bpmnElement=\"Group_1\">\n        <omgdc:Bounds x=\"189\" y=\"62\" width=\"400\" height=\"254\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"276\" y=\"98\" width=\"58\" height=\"18.96\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_2\" bpmnElement=\"StartEvent_1\">\n        <omgdc:Bounds x=\"296\" y=\"379\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_3\" bpmnElement=\"Task_1\">\n        <omgdc:Bounds x=\"370\" y=\"357\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_4\" bpmnElement=\"SubProcess_1\" isExpanded=\"false\">\n        <omgdc:Bounds x=\"501\" y=\"357\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_2\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"SubProcess_1\" />\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.insert.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"http://bpmn.io\" exporterVersion=\"0.10.1\">\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <startEvent id=\"START\" name=\"START\">\n      <outgoing>S1</outgoing>\n      <outgoing>S2</outgoing>\n    </startEvent>\n    <sequenceFlow id=\"S1\" name=\"S1\" sourceRef=\"START\" targetRef=\"END\" />\n    <endEvent id=\"END\" name=\"END\">\n      <incoming>S1</incoming>\n    </endEvent>\n    <exclusiveGateway id=\"GATEWAY\" name=\"GATEWAY\">\n      <incoming>S2</incoming>\n    </exclusiveGateway>\n    <sequenceFlow id=\"S2\" name=\"S2\" sourceRef=\"START\" targetRef=\"GATEWAY\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"START_di\" bpmnElement=\"START\">\n        <omgdc:Bounds x=\"254\" y=\"174\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"254\" y=\"144\" width=\"36\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"S1_di\" bpmnElement=\"S1\">\n        <omgdi:waypoint x=\"290\" y=\"192\" />\n        <omgdi:waypoint x=\"497\" y=\"192\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"387\" y=\"174\" width=\"13\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"END_di\" bpmnElement=\"END\">\n        <omgdc:Bounds x=\"497\" y=\"174\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"503\" y=\"217\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"GATEWAY_di\" bpmnElement=\"GATEWAY\" isMarkerVisible=\"true\">\n        <omgdc:Bounds x=\"364\" y=\"281\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"362\" y=\"338\" width=\"54\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"S2_di\" bpmnElement=\"S2\">\n        <omgdi:waypoint x=\"272\" y=\"210\" />\n        <omgdi:waypoint x=\"272\" y=\"306\" />\n        <omgdi:waypoint x=\"364\" y=\"306\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"281\" y=\"255\" width=\"13\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.messageFlow.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:collaboration id=\"Collaboration\">\n    <bpmn:participant id=\"Participant_1\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Participant_2\" processRef=\"Process_1a4wate\" />\n    <bpmn:messageFlow id=\"MessageFlow\" sourceRef=\"Participant_1\" targetRef=\"Participant_2\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\" />\n  <bpmn:process id=\"Process_1a4wate\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"Participant_1_di\" bpmnElement=\"Participant_1\">\n        <dc:Bounds x=\"208\" y=\"62\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_2_di\" bpmnElement=\"Participant_2\">\n        <dc:Bounds x=\"320\" y=\"440\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_di\" bpmnElement=\"MessageFlow\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"508\" y=\"312\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"508\" y=\"440\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"463\" y=\"366\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.moveLane.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"http://bpmn.io\" exporterVersion=\"0.10.1\">\n  <collaboration id=\"Collaboration_00p2rt7\">\n    <participant id=\"Participant_1f9ghrx\" processRef=\"Process_0td36v7\" />\n  </collaboration>\n  <process id=\"Process_0td36v7\">\n    <laneSet id=\"LaneSet_0pqv2qu\">\n      <lane id=\"Lane_1\" />\n      <lane id=\"Lane_2\" />\n    </laneSet>\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Collaboration_00p2rt7\">\n      <bpmndi:BPMNShape id=\"Participant_1f9ghrx_di\" bpmnElement=\"Participant_1f9ghrx\">\n        <omgdc:Bounds x=\"96\" y=\"100\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1_di\" bpmnElement=\"Lane_1\">\n        <omgdc:Bounds x=\"126\" y=\"100\" width=\"570\" height=\"125\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_2_di\" bpmnElement=\"Lane_2\">\n        <omgdc:Bounds x=\"126\" y=\"225\" width=\"570\" height=\"125\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.multiSelectionPools.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:collaboration id=\"Collaboration_01hoeuv\">\n    <bpmn:participant id=\"Participant_1\" name=\"Participant_1\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Participant_2\" name=\"Participant_2\" processRef=\"Process_2\" />\n    <bpmn:messageFlow id=\"MessageFlow_1v3u2fb\" sourceRef=\"Task_A\" targetRef=\"Task_B\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_A\" name=\"Task_A\" />\n  </bpmn:process>\n  <bpmn:process id=\"Process_2\">\n    <bpmn:task id=\"Task_B\" name=\"Task_B\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_01hoeuv\">\n      <bpmndi:BPMNShape id=\"Participant_1_di\" bpmnElement=\"Participant_1\">\n        <dc:Bounds x=\"114\" y=\"49\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_2_di\" bpmnElement=\"Participant_2\">\n        <dc:Bounds x=\"114\" y=\"370\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_B_di\" bpmnElement=\"Task_B\">\n        <dc:Bounds x=\"277\" y=\"436\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_A_di\" bpmnElement=\"Task_A\">\n        <dc:Bounds x=\"277\" y=\"97\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_1v3u2fb_di\" bpmnElement=\"MessageFlow_1v3u2fb\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"327\" y=\"177\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"327\" y=\"436\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"300\" y=\"275\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.process.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"_biH3sOTeEeS2YerRfpjPrw\" targetNamespace=\"http://camunda.org/schema/1.0/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.7.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:process id=\"Process\" isExecutable=\"false\">\n    <bpmn2:startEvent id=\"StartEvent_None\" />\n    <bpmn2:subProcess id=\"EventSubProcess\" triggeredByEvent=\"true\">\n      <bpmn2:startEvent id=\"StartEvent_Message_in_EventSubProcess\">\n        <bpmn2:messageEventDefinition id=\"MessageEventDefinition_1\" />\n      </bpmn2:startEvent>\n    </bpmn2:subProcess>\n    <bpmn2:task id=\"Task\" />\n    <bpmn2:intermediateThrowEvent id=\"IntermediateThrowEvent_Link\">\n      <bpmn2:linkEventDefinition id=\"_LinkEventDefinition_2\" />\n    </bpmn2:intermediateThrowEvent>\n    <bpmn2:intermediateCatchEvent id=\"IntermediateCatchEvent_Link\">\n      <bpmn2:linkEventDefinition id=\"_LinkEventDefinition_3\" />\n    </bpmn2:intermediateCatchEvent>\n    <bpmn2:subProcess id=\"SubProcess\">\n      <bpmn2:endEvent id=\"EndEvent_in_SubProcess\" />\n    </bpmn2:subProcess>\n    <bpmn2:endEvent id=\"EndEvent_None\" />\n    <bpmn2:dataObjectReference id=\"DataObjectReference\" dataObjectRef=\"DataObject\" />\n    <bpmn2:dataObject id=\"DataObject\" />\n    <bpmn2:dataStoreReference id=\"DataStoreReference\" name=\"\" dataStoreRef=\"DataStore_1\" />\n    <bpmn2:subProcess id=\"CollapsedSubProcess\" />\n    <bpmn2:task id=\"SourceTask\">\n      <bpmn2:outgoing>SequenceFlow</bpmn2:outgoing>\n    </bpmn2:task>\n    <bpmn2:task id=\"TargetTask\">\n      <bpmn2:incoming>SequenceFlow</bpmn2:incoming>\n    </bpmn2:task>\n    <bpmn2:sequenceFlow id=\"SequenceFlow\" sourceRef=\"SourceTask\" targetRef=\"TargetTask\" />\n    <bpmn2:textAnnotation id=\"TextAnnotation\" />\n    <bpmn2:group id=\"Group\" categoryValueRef=\"CategoryValue\" />\n  </bpmn2:process>\n  <bpmn2:dataStore id=\"DataStore_1\" name=\"Data Store 1\" />\n  <bpmn2:category id=\"Category\">\n    <bpmn2:categoryValue id=\"CategoryValue\" />\n  </bpmn2:category>\n  <bpmndi:BPMNDiagram id=\"_BPMNDiagram_2\">\n    <bpmndi:BPMNPlane id=\"_BPMNPlane_2\" bpmnElement=\"Process\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_TextAnnotation_2\" bpmnElement=\"TextAnnotation\">\n        <dc:Bounds x=\"676\" y=\"86\" width=\"85\" height=\"85\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1b3d6i3_di\" bpmnElement=\"SequenceFlow\">\n        <di:waypoint x=\"372\" y=\"129\" />\n        <di:waypoint x=\"422\" y=\"129\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_4\" bpmnElement=\"StartEvent_None\">\n        <dc:Bounds x=\"165\" y=\"219\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"83\" y=\"210\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_8\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"272\" y=\"197\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateCatchEvent_3\" bpmnElement=\"IntermediateThrowEvent_Link\">\n        <dc:Bounds x=\"436\" y=\"218\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"354\" y=\"209\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_IntermediateThrowEvent_2\" bpmnElement=\"IntermediateCatchEvent_Link\">\n        <dc:Bounds x=\"525\" y=\"218\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"443\" y=\"209\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_6\" bpmnElement=\"EndEvent_None\">\n        <dc:Bounds x=\"616\" y=\"218\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"534\" y=\"209\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_di\" bpmnElement=\"DataObjectReference\">\n        <dc:Bounds x=\"701\" y=\"212\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"574\" y=\"212\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_DataStoreReference_2\" bpmnElement=\"DataStoreReference\">\n        <dc:Bounds x=\"771\" y=\"211\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"657\" y=\"216\" width=\"79\" height=\"21\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_08mshr6_di\" bpmnElement=\"SourceTask\">\n        <dc:Bounds x=\"272\" y=\"89\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1c9pfmg_di\" bpmnElement=\"TargetTask\">\n        <dc:Bounds x=\"422\" y=\"89\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_4\" bpmnElement=\"EventSubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"232\" y=\"410\" width=\"313\" height=\"169\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_5\" bpmnElement=\"StartEvent_Message_in_EventSubProcess\">\n        <dc:Bounds x=\"271\" y=\"469\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"189\" y=\"460\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_SubProcess_5\" bpmnElement=\"SubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"616\" y=\"410\" width=\"205\" height=\"169\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_EndEvent_5\" bpmnElement=\"EndEvent_in_SubProcess\">\n        <dc:Bounds x=\"739\" y=\"501\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"CollapsedSubProcess_di\" bpmnElement=\"CollapsedSubProcess\">\n        <dc:Bounds x=\"856\" y=\"408\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_di\" bpmnElement=\"Group\">\n        <dc:Bounds x=\"870\" y=\"140\" width=\"210\" height=\"120\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/rules/BpmnRules.subProcess-dataAssociation.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:subProcess id=\"SubProcess\">\n      <bpmn:dataStoreReference id=\"DataStoreReference\" />\n      <bpmn:task id=\"Task\">\n        <bpmn:property id=\"Property_0x4gewx\" name=\"__targetRef_placeholder\" />\n        <bpmn:dataInputAssociation id=\"DataInputAssociation\">\n          <bpmn:sourceRef>DataStoreReference</bpmn:sourceRef>\n          <bpmn:targetRef>Property_0x4gewx</bpmn:targetRef>\n        </bpmn:dataInputAssociation>\n        <bpmn:dataOutputAssociation id=\"DataOutputAssociation\">\n          <bpmn:targetRef>DataStoreReference</bpmn:targetRef>\n        </bpmn:dataOutputAssociation>\n      </bpmn:task>\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_di\" bpmnElement=\"SubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"73\" y=\"83\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_di\" bpmnElement=\"DataStoreReference\">\n        <dc:Bounds x=\"168\" y=\"117\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"193\" y=\"167\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_di\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"254\" y=\"168\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_di\" bpmnElement=\"DataInputAssociation\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"193\" y=\"167\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"193\" y=\"203\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"254\" y=\"203\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_di\" bpmnElement=\"DataOutputAssociation\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"304\" y=\"168\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"304\" y=\"133\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"218\" y=\"133\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/rules/BpmnRulesSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  expectCanConnect,\n  expectCanCopy,\n  expectCanCreate,\n  expectCanDrop,\n  expectCanInsert,\n  expectCanMove\n} from './Helper';\n\nimport modelingModule from 'lib/features/modeling';\nimport coreModule from 'lib/core';\n\n\ndescribe('features/modeling/rules - BpmnRules', function() {\n\n  var testModules = [ coreModule, modelingModule ];\n\n\n  describe('create elements', function() {\n\n    var testXML = require('./BpmnRules.process.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n    it('create tasks -> process', inject(function(elementFactory) {\n\n      // given\n      var task1 = elementFactory.createShape({ type: 'bpmn:Task' }),\n          task2 = elementFactory.createShape({ type: 'bpmn:Task' });\n\n      // then\n      expectCanCreate([ task1, task2 ], 'Process', true);\n    }));\n\n\n    it('create tasks -> task', inject(function(elementFactory) {\n\n      // given\n      var task1 = elementFactory.createShape({ type: 'bpmn:Task' }),\n          task2 = elementFactory.createShape({ type: 'bpmn:Task' });\n\n      // then\n      expectCanCreate([ task1, task2 ], 'Task', false);\n    }));\n\n\n    it('create tasks and sequence flow -> process', inject(function(elementFactory) {\n\n      // given\n      var task1 = elementFactory.createShape({ type: 'bpmn:Task' }),\n          task2 = elementFactory.createShape({ type: 'bpmn:Task' }),\n          sequenceFlow = elementFactory.createConnection({\n            type: 'bpmn:SequenceFlow',\n            source: task1,\n            target: task2\n          });\n\n      // then\n      expectCanCreate([ task1, task2, sequenceFlow ], 'Process', true);\n    }));\n\n\n    it('create tasks and message flow -> process', inject(function(elementFactory) {\n\n      // given\n      var task1 = elementFactory.createShape({ type: 'bpmn:Task' }),\n          task2 = elementFactory.createShape({ type: 'bpmn:Task' }),\n          messageFlow = elementFactory.createConnection({\n            type: 'bpmn:MessageFlow',\n            source: task1,\n            target: task2\n          });\n\n      // then\n      expectCanCreate([ task1, task2, messageFlow ], 'Process', false);\n    }));\n\n\n    it('create task and non-interrupting boundary event', inject(function(elementFactory) {\n\n      // given\n      var task = elementFactory.createShape({ type: 'bpmn:Task' }),\n          boundaryEvent = elementFactory.createShape({\n            type: 'bpmn:BoundaryEvent',\n            eventDefinitionType: 'bpmn:EscalationEventDefinition',\n            cancelActivity: false,\n            host: task\n          });\n\n      // then\n      expectCanCreate([ task, boundaryEvent ], 'Process', true);\n    }));\n\n\n    it('create task and interrupting boundary event', inject(function(elementFactory) {\n\n      // given\n      var task = elementFactory.createShape({ type: 'bpmn:Task' }),\n          boundaryEvent = elementFactory.createShape({\n            type: 'bpmn:BoundaryEvent',\n            eventDefinitionType: 'bpmn:EscalationEventDefinition',\n            host: task\n          });\n\n      // then\n      expectCanCreate([ task, boundaryEvent ], 'Process', true);\n    }));\n\n\n    it('can\\'t create multiple elements on flow', inject(function(elementFactory) {\n\n      // given\n      var task1 = elementFactory.createShape({ type: 'bpmn:Task' }),\n          task2 = elementFactory.createShape({ type: 'bpmn:Task' });\n\n      // then\n      expectCanCreate([ task1, task2 ], 'SequenceFlow', false);\n    }));\n\n\n    describe('empty pool', function() {\n\n      var testXML = require('./BpmnRules.collaboration-empty.bpmn');\n\n      beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n      it('should not allow to drop DataStoreReference when there is no process to append to',\n        inject(function(elementFactory) {\n\n          // given\n          var dataStoreReference = elementFactory.createShape({ type: 'bpmn:DataStoreReference' });\n\n          // then\n          expectCanCreate(dataStoreReference, 'Collaboration', false);\n        })\n      );\n    });\n\n  });\n\n\n  describe('copy elements', function() {\n\n    var testXML = require('./BpmnRules.process.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n    it('copy task', inject(function(elementFactory) {\n\n      // given\n      var task1 = elementFactory.createShape({ type: 'bpmn:Task' });\n\n      // then\n      expectCanCopy(task1, [ task1 ], true);\n    }));\n\n\n    it('copy label', inject(function(elementFactory) {\n\n      // given\n      var task = elementFactory.createShape({ type: 'bpmn:Task' }),\n          label = elementFactory.createLabel({ labelTarget: task });\n\n      // then\n      // copying labels should always be allowed\n      expectCanCopy(label, [], true);\n    }));\n\n\n    it('copy lane with parent participant', inject(function(elementFactory) {\n\n      // given\n      var participant = elementFactory.createShape({ type: 'bpmn:Participant' }),\n          lane = elementFactory.createShape({ type: 'bpmn:Lane', parent: participant });\n\n      // then\n      expectCanCopy(lane, [ participant ], true);\n    }));\n\n\n    it('copy lane without parent participant', inject(function(elementFactory) {\n\n      // given\n      var participant = elementFactory.createShape({ type: 'bpmn:Participant' }),\n          lane = elementFactory.createShape({ type: 'bpmn:Lane', parent: participant });\n\n      // then\n      expectCanCopy(lane, [], false);\n    }));\n\n\n    it('copy boundary event with host', inject(function(elementFactory) {\n\n      // given\n      var task = elementFactory.createShape({ type: 'bpmn:Task' }),\n          boundaryEvent = elementFactory.createShape({ type: 'bpmn:BoundaryEvent', host: task });\n\n      // then\n      expectCanCopy(boundaryEvent, [ task ], true);\n    }));\n\n\n    it('copy boundary event without host', inject(function(elementFactory) {\n\n      // given\n      var task = elementFactory.createShape({ type: 'bpmn:Task' }),\n          boundaryEvent = elementFactory.createShape({ type: 'bpmn:BoundaryEvent', host: task });\n\n      // then\n      expectCanCopy(boundaryEvent, [ boundaryEvent ], true);\n    }));\n\n  });\n\n\n  describe('on process diagram', function() {\n\n    var testXML = require('./BpmnRules.process.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n    it('connect StartEvent_None -> Task', inject(function() {\n\n      expectCanConnect('StartEvent_None', 'Task', {\n        sequenceFlow: true,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect StartEvent_None -> TextAnnotation', inject(function() {\n\n      expectCanConnect('StartEvent_None', 'TextAnnotation', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect SequenceFlow -> TextAnnotation', inject(function() {\n\n      expectCanConnect('SequenceFlow', 'TextAnnotation', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect Task -> IntermediateThrowEvent_Link', inject(function() {\n\n      expectCanConnect('Task', 'IntermediateThrowEvent_Link', {\n        sequenceFlow: true,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect IntermediateThrowEvent_Link -> EndEvent_None', inject(function() {\n\n      expectCanConnect('IntermediateThrowEvent_Link', 'EndEvent_None', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect StartEvent_None -> IntermediateCatchEvent_Link', inject(function() {\n\n      expectCanConnect('StartEvent_None', 'IntermediateCatchEvent_Link', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect IntermediateCatchEvent_Link -> Task', inject(function() {\n\n      expectCanConnect('IntermediateCatchEvent_Link', 'Task', {\n        sequenceFlow: true,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('drop TextAnnotation -> Process', inject(function() {\n\n      expectCanDrop('TextAnnotation', 'Process', true);\n    }));\n\n\n    it('drop TextAnnotation -> SubProcess', inject(function() {\n\n      expectCanDrop('TextAnnotation', 'SubProcess', true);\n    }));\n\n\n    it('drop Start Event -> Collapsed Sub Process', function() {\n\n      expectCanDrop('StartEvent_None', 'CollapsedSubProcess', false);\n    });\n\n\n    it('connect DataObjectReference -> StartEvent_None', inject(function() {\n\n      expectCanConnect('DataObjectReference', 'StartEvent_None', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect StartEvent_None -> DataObjectReference', inject(function() {\n\n      expectCanConnect('StartEvent_None', 'DataObjectReference', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: { type: 'bpmn:DataOutputAssociation' }\n      });\n    }));\n\n\n    it('connect DataObjectReference -> EndEvent_None', inject(function() {\n\n      expectCanConnect('DataObjectReference', 'EndEvent_None', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: { type: 'bpmn:DataInputAssociation' }\n      });\n    }));\n\n\n    it('connect EndEvent_None -> DataObjectReference', inject(function() {\n\n      expectCanConnect('EndEvent_None', 'DataObjectReference', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect Task -> DataObjectReference', inject(function() {\n\n      expectCanConnect('Task', 'DataObjectReference', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: { type: 'bpmn:DataOutputAssociation' }\n      });\n    }));\n\n\n    it('connect DataObjectReference -> Task', inject(function() {\n\n      expectCanConnect('DataObjectReference', 'Task', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: { type: 'bpmn:DataInputAssociation' }\n      });\n    }));\n\n\n    it('connect SubProcess -> DataObjectReference', inject(function() {\n\n      expectCanConnect('SubProcess', 'DataObjectReference', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: { type: 'bpmn:DataOutputAssociation' }\n      });\n    }));\n\n\n    it('connect DataObjectReference -> SubProcess', inject(function() {\n\n      expectCanConnect('DataObjectReference', 'SubProcess', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: { type: 'bpmn:DataInputAssociation' }\n      });\n    }));\n\n\n    it('connect DataStoreReference -> StartEvent_None', inject(function() {\n\n      expectCanConnect('DataStoreReference', 'StartEvent_None', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect DataObjectReference -> TextAnnotation', inject(function() {\n\n      expectCanConnect('DataObjectReference', 'TextAnnotation', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect TextAnnotation -> DataObjectReference', inject(function() {\n\n      expectCanConnect('TextAnnotation', 'DataObjectReference', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect DataStoreReference -> TextAnnotation', inject(function() {\n\n      expectCanConnect('DataStoreReference', 'TextAnnotation', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect TextAnnotation -> DataStoreReference', inject(function() {\n\n      expectCanConnect('TextAnnotation', 'DataStoreReference', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect Group -> TextAnnotation', inject(function() {\n\n      expectCanConnect('Group', 'TextAnnotation', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect TextAnnotation -> Group', inject(function() {\n\n      expectCanConnect('TextAnnotation', 'Group', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect StartEvent_None -> DataStoreReference', inject(function() {\n\n      expectCanConnect('StartEvent_None', 'DataStoreReference', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: { type: 'bpmn:DataOutputAssociation' }\n      });\n    }));\n\n\n    it('connect DataStoreReference -> EndEvent_None', inject(function() {\n\n      expectCanConnect('DataStoreReference', 'EndEvent_None', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: { type: 'bpmn:DataInputAssociation' }\n      });\n    }));\n\n\n    it('connect EndEvent_None -> DataStoreReference', inject(function() {\n\n      expectCanConnect('EndEvent_None', 'DataStoreReference', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect Task -> DataStoreReference', inject(function() {\n\n      expectCanConnect('Task', 'DataStoreReference', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: { type: 'bpmn:DataOutputAssociation' }\n      });\n    }));\n\n\n    it('connect DataStoreReference -> Task', inject(function() {\n\n      expectCanConnect('DataStoreReference', 'Task', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: { type: 'bpmn:DataInputAssociation' }\n      });\n    }));\n\n\n    it('connect SubProcess -> DataStoreReference', inject(function() {\n\n      expectCanConnect('SubProcess', 'DataStoreReference', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: { type: 'bpmn:DataOutputAssociation' }\n      });\n    }));\n\n\n    it('connect DataStoreReference -> SubProcess', inject(function() {\n\n      expectCanConnect('DataStoreReference', 'SubProcess', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: { type: 'bpmn:DataInputAssociation' }\n      });\n    }));\n\n\n    it('connect Task -> Task', inject(function() {\n\n      expectCanConnect('Task', 'Task', {\n        sequenceFlow: true,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n  });\n\n\n  describe('boundary events', function() {\n\n    var testXML = require('./BpmnRules.boundaryEvent.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n    it('connect BoundaryEvent_on_SubProcess -> Task', inject(function() {\n\n      expectCanConnect('BoundaryEvent_on_SubProcess', 'Task', {\n        sequenceFlow: true,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect BoundaryEvent_on_SubProcess -> ExclusiveGateway', inject(function() {\n\n      expectCanConnect('BoundaryEvent_on_SubProcess', 'ExclusiveGateway', {\n        sequenceFlow: true,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect BoundaryEvent_on_SubProcess -> SubProcess', inject(function() {\n\n      expectCanConnect('BoundaryEvent_on_SubProcess', 'SubProcess', {\n        sequenceFlow: true,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect BoundaryEvent_on_SubProcess -> BoundaryEvent_on_Task', inject(function() {\n\n      expectCanConnect('BoundaryEvent_on_SubProcess', 'BoundaryEvent_on_Task', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect BoundaryEvent_on_SubProcess -> StartEvent_None', inject(function() {\n\n      expectCanConnect('BoundaryEvent_on_SubProcess', 'StartEvent_None', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect StartEvent_None -> BoundaryEvent_on_SubProcess', inject(function() {\n\n      expectCanConnect('StartEvent_None', 'BoundaryEvent_on_SubProcess', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect BoundaryEvent_nested -> Task', inject(function() {\n\n      expectCanConnect('BoundaryEvent_nested', 'Task', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect BoundaryEvent_nested -> EndEvent_nested', inject(function() {\n\n      expectCanConnect('BoundaryEvent_nested', 'EndEvent_nested', {\n        sequenceFlow: true,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect BoundaryEvent_on_SubProcess -> BoundaryEvent_in_OtherProcess', inject(function() {\n\n      expectCanConnect('BoundaryEvent_on_SubProcess', 'BoundaryEvent_in_OtherProcess', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect BoundaryEvent_on_SubProcess -> Task_in_OtherProcess', inject(function() {\n\n      expectCanConnect('BoundaryEvent_on_SubProcess', 'Task_in_OtherProcess', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect Task_in_OtherProcess -> BoundaryEvent_on_SubProcess', inject(function() {\n\n      expectCanConnect('Task_in_OtherProcess', 'BoundaryEvent_on_SubProcess', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect Task_in_OtherProcess -> MessageBoundaryEvent_onSubProcess', inject(function() {\n\n      expectCanConnect('Task_in_OtherProcess', 'MessageBoundaryEvent_onSubProcess', {\n        sequenceFlow: false,\n        messageFlow: true,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('drop BoundaryEvent -> Task', function() {\n      expectCanDrop('BoundaryEvent_on_SubProcess', 'Task_in_OtherProcess', false);\n    });\n  });\n\n\n  describe('compensation', function() {\n\n    var testXML = require('./BpmnRules.compensation.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n    it('connect CompensationBoundary -> NoneTask', inject(function() {\n\n      expectCanConnect('CompensationBoundary', 'NoneTask', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false,\n        compensationAssociation: true\n      });\n    }));\n\n\n    it('connect CompensationBoundary -> SubProcess', inject(function() {\n\n      expectCanConnect('CompensationBoundary', 'SubProcess_2', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false,\n        compensationAssociation: true\n      });\n    }));\n\n\n    it('connect CompensationBoundary -> Event SubProcess', inject(function() {\n\n      expectCanConnect('CompensationBoundary', 'SubProcess_1', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false,\n        compensationAssociation: false\n      });\n    }));\n\n\n    it('connect CompensationBoundary -> TaskForCompensation', inject(function() {\n\n      expectCanConnect('CompensationBoundary', 'TaskForCompensation', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false,\n        compensationAssociation: true\n      });\n\n    }));\n\n\n    it('connect CompensationBoundary -> Gateway', inject(function() {\n\n      expectCanConnect('CompensationBoundary', 'Gateway', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false,\n        compensationAssociation: false\n      });\n\n    }));\n\n\n    it('connect CompensationBoundary -> IntermediateEvent', inject(function() {\n\n      expectCanConnect('CompensationBoundary', 'IntermediateEvent', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false,\n        compensationAssociation: false\n      });\n\n    }));\n\n\n    it('connect Task -> TaskForCompensation', inject(function() {\n\n      expectCanConnect('Task', 'TaskForCompensation', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false,\n        compensationAssociation: false\n      });\n\n    }));\n\n\n    it('connect TaskForCompensation -> Task', inject(function() {\n\n      expectCanConnect('TaskForCompensation', 'Task', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false,\n        compensationAssociation: false\n      });\n\n    }));\n\n\n    it('connect CompensationBoundary -> TaskInSubprocess', function() {\n\n      expectCanConnect('CompensationBoundary', 'TaskInSubprocess', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false,\n        compensationAssociation: false\n      });\n    });\n\n\n    it('connect CompensationBoundary -> Host (Task)', function() {\n\n      expectCanConnect('CompensationBoundary', 'Task', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false,\n        compensationAssociation: false\n      });\n    });\n\n\n    it('connect CompensationBoundary -> TaskWithBoundary', function() {\n\n      expectCanConnect('CompensationBoundary', 'TaskWithBoundary', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false,\n        compensationAssociation: true\n      });\n    });\n  });\n\n\n  describe('compensation in collaboration', function() {\n\n    var testXML = require('./BpmnRules.compensation-collaboration.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n    it('connect CompensationTask -> CollapsedPool', inject(function() {\n\n      expectCanConnect('CompensationTask', 'CollapsedPool', {\n        sequenceFlow: false,\n        messageFlow: true,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect CollapsedPool -> CompensationTask', inject(function() {\n\n      expectCanConnect('CollapsedPool', 'CompensationTask', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n\n    }));\n\n  });\n\n\n  describe('on collaboration diagram', function() {\n\n    var testXML = require('./BpmnRules.collaboration.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n    it('connect StartEvent_None -> IntermediateEvent', inject(function() {\n\n      expectCanConnect('StartEvent_None', 'IntermediateThrowEvent_Message', {\n        sequenceFlow: true,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect StartEvent_None -> OtherParticipant', inject(function() {\n\n      expectCanConnect('StartEvent_None', 'OtherParticipant', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect OtherParticipant -> StartEvent_None', inject(function() {\n\n      expectCanConnect('OtherParticipant', 'StartEvent_None', {\n        sequenceFlow: false,\n        messageFlow: true,\n        association: false,\n        dataAssociation: false\n      });\n\n    }));\n\n\n    it('connect OtherParticipant -> StartEvent_Timer', inject(function() {\n\n      expectCanConnect('OtherParticipant', 'StartEvent_Timer', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n\n    }));\n\n\n    it('connect OtherParticipant -> StartEvent_Message', inject(function() {\n\n      expectCanConnect('OtherParticipant', 'StartEvent_Message', {\n        sequenceFlow: false,\n        messageFlow: true,\n        association: false,\n        dataAssociation: false\n      });\n\n    }));\n\n\n    it('connect EndEvent_None -> OtherParticipant', inject(function() {\n\n      expectCanConnect('EndEvent_None', 'OtherParticipant', {\n        sequenceFlow: false,\n        messageFlow: true,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect EndEvent_Cancel -> OtherParticipant', inject(function() {\n\n      expectCanConnect('EndEvent_Cancel', 'OtherParticipant', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect EndEvent_Message -> OtherParticipant', inject(function() {\n\n      expectCanConnect('EndEvent_Message', 'OtherParticipant', {\n        sequenceFlow: false,\n        messageFlow: true,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect OtherParticipant -> EndEvent_None', inject(function() {\n\n      expectCanConnect('OtherParticipant', 'EndEvent_None', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect IntermediateThrowEvent_Message -> OtherParticipant', inject(function() {\n\n      expectCanConnect('IntermediateThrowEvent_Message', 'OtherParticipant', {\n        sequenceFlow: false,\n        messageFlow: true,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect IntermediateThrowEvent_None -> OtherParticipant', inject(function() {\n\n      expectCanConnect('IntermediateThrowEvent_None', 'OtherParticipant', {\n        sequenceFlow: false,\n        messageFlow: true,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect IntermediateThrowEvent_Signal -> OtherParticipant', inject(function() {\n\n      expectCanConnect('IntermediateThrowEvent_Signal', 'OtherParticipant', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect OtherParticipant -> IntermediateThrowEvent_Message', inject(function() {\n\n      expectCanConnect('OtherParticipant', 'IntermediateThrowEvent_Message', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect Task_in_SubProcess -> OtherParticipant', inject(function() {\n\n      expectCanConnect('Task_in_SubProcess', 'OtherParticipant', {\n        sequenceFlow: false,\n        messageFlow: true,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect EndEvent_None_in_SubProcess -> OtherParticipant', inject(function() {\n\n      expectCanConnect('EndEvent_None_in_SubProcess', 'OtherParticipant', {\n        sequenceFlow: false,\n        messageFlow: true,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect OtherParticipant -> Task_in_SubProcess', inject(function() {\n\n      expectCanConnect('OtherParticipant', 'Task_in_SubProcess', {\n        sequenceFlow: false,\n        messageFlow: true,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect Participant -> OtherParticipant', inject(function() {\n\n      expectCanConnect('Participant', 'OtherParticipant', {\n        sequenceFlow: false,\n        messageFlow: true,\n        association: false,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect StartEvent_None -> TextAnnotation_OtherParticipant', inject(function() {\n\n      expectCanConnect('StartEvent_None', 'TextAnnotation_OtherParticipant', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('connect CallActivity -> Participant', function() {\n\n      expectCanConnect('CallActivity', 'Participant', {\n        sequenceFlow: false,\n        messageFlow: true,\n        association: false,\n        dataAssociation: false\n      });\n    });\n\n\n    it('connect MessageFlow -> TextAnnotation', inject(function() {\n\n      expectCanConnect('MessageFlow_2', 'TextAnnotation_Global', {\n        sequenceFlow: false,\n        messageFlow: false,\n        association: true,\n        dataAssociation: false\n      });\n    }));\n\n\n    it('drop TextAnnotation_Global -> Participant', inject(function() {\n      expectCanDrop('TextAnnotation_Global', 'Participant', true);\n    }));\n\n\n    it('drop DataStoreReference -> Collaboration', function() {\n      expectCanDrop('DataStoreReference', 'Collaboration', true);\n    });\n\n\n    it('drop element -> collapsed Participant', inject(function() {\n      expectCanDrop('StartEvent_None', 'CollapsedParticipant', false);\n      expectCanDrop('SubProcess', 'CollapsedParticipant', false);\n      expectCanDrop('Task_in_SubProcess', 'CollapsedParticipant', false);\n      expectCanDrop('TextAnnotation_Global', 'CollapsedParticipant', false);\n    }));\n\n\n    describe('drop MessageFlow label', function() {\n\n      var label;\n\n      beforeEach(inject(function(elementRegistry) {\n        label = elementRegistry.get('MessageFlow_labeled').label;\n      }));\n\n\n      it('-> MessageFlow', function() {\n        expectCanDrop(label, 'MessageFlow_labeled', true);\n      });\n\n\n      it('-> CollapsedParticipant', function() {\n        expectCanDrop(label, 'CollapsedParticipant', true);\n      });\n\n\n      it('-> Collaboration', function() {\n\n        // then\n        expectCanDrop(label, 'Collaboration', true);\n      });\n\n\n      it('-> Task_in_SubProcess', function() {\n        expectCanDrop(label, 'Task_in_SubProcess', true);\n      });\n\n\n      it('-> SequenceFlow', function() {\n        expectCanDrop(label, 'SequenceFlow', true);\n      });\n\n\n      it('-> DataOutputAssociation', function() {\n        expectCanDrop(label, 'DataOutputAssociation', true);\n      });\n\n\n      it('-> Group', function() {\n        expectCanDrop(label, 'Group', true);\n      });\n\n    });\n\n\n    describe('create Group', function() {\n\n      var group;\n\n      beforeEach(inject(function(elementFactory) {\n        group = elementFactory.createShape({\n          type: 'bpmn:Group',\n          x: 413, y: 254\n        });\n      }));\n\n\n      it('-> MessageFlow', function() {\n        expectCanCreate(group, 'MessageFlow_labeled', true);\n      });\n\n\n      it('-> CollapsedParticipant', function() {\n        expectCanCreate(group, 'CollapsedParticipant', true);\n      });\n\n\n      it('-> Collaboration', function() {\n\n        // then\n        expectCanCreate(group, 'Collaboration', true);\n      });\n\n\n      it('-> Task_in_SubProcess', function() {\n        expectCanCreate(group, 'Task_in_SubProcess', true);\n      });\n\n\n      it('-> SequenceFlow', function() {\n        expectCanCreate(group, 'SequenceFlow', true);\n      });\n\n\n      it('-> DataOutputAssociation', function() {\n        expectCanCreate(group, 'DataOutputAssociation', true);\n      });\n\n\n      it('-> Group', function() {\n        expectCanCreate(group, 'Group', true);\n      });\n\n    });\n\n\n    describe('reject create on Group', function() {\n\n      it('DataStoreReference ->', inject(function(elementFactory) {\n        var dataStoreReference = elementFactory.createShape({\n          type: 'bpmn:DataStoreReference',\n          x: 413, y: 254\n        });\n\n        expectCanCreate(dataStoreReference, 'Group', false);\n      }));\n\n\n      it('Task ->', inject(function(elementFactory) {\n        var task = elementFactory.createShape({\n          type: 'bpmn:Task',\n          x: 413, y: 254\n        });\n\n        expectCanCreate(task, 'Group', false);\n      }));\n\n    });\n\n\n    describe('reject create on label', function() {\n\n      var label;\n\n      beforeEach(inject(function(elementRegistry) {\n        label = elementRegistry.get('MessageFlow_labeled').label;\n      }));\n\n\n      it('DataStoreReference ->', inject(function(elementFactory) {\n        var dataStoreReference = elementFactory.createShape({\n          type: 'bpmn:DataStoreReference',\n          x: 413, y: 254\n        });\n\n        expectCanCreate(dataStoreReference, label, false);\n      }));\n\n\n      it('Task ->', inject(function(elementFactory) {\n        var task = elementFactory.createShape({\n          type: 'bpmn:Task',\n          x: 413, y: 254\n        });\n\n        expectCanCreate(task, label, false);\n      }));\n\n    });\n\n  });\n\n\n  describe('participants', function() {\n\n    var testXML = require('./BpmnRules.collapsedPools.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n    it('connect CollapsedPool_A -> CollapsedPool_B', inject(function() {\n\n      expectCanConnect('CollapsedPool_A', 'CollapsedPool_B', {\n        sequenceFlow: false,\n        messageFlow: true,\n        association: false,\n        dataAssociation: false\n      });\n\n    }));\n\n\n    it('connect CollapsedPool_A -> ExpandedPool', inject(function() {\n\n      expectCanConnect('CollapsedPool_A', 'ExpandedPool', {\n        sequenceFlow: false,\n        messageFlow: true,\n        association: false,\n        dataAssociation: false\n      });\n\n    }));\n\n\n    it('connect ExpandedPool -> CollapsedPool_A', inject(function() {\n\n      expectCanConnect('ExpandedPool', 'CollapsedPool_A', {\n        sequenceFlow: false,\n        messageFlow: true,\n        association: false,\n        dataAssociation: false\n      });\n\n    }));\n\n  });\n\n\n  describe('message flows', function() {\n\n    var testXML = require('./BpmnRules.messageFlow.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n    it('drop MessageFlow -> Collaboration', inject(function() {\n\n      expectCanDrop('MessageFlow', 'Collaboration', true);\n    }));\n\n  });\n\n\n  describe('data association move', function() {\n\n    describe('on process diagram', function() {\n\n      var testXML = require('./BpmnRules.dataAssociation.bpmn');\n\n      beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n      it('move selection including data association', inject(function(elementRegistry) {\n\n        // when\n        var elements = [\n          elementRegistry.get('Task'),\n          elementRegistry.get('DataAssociation'),\n          elementRegistry.get('DataObjectReference')\n        ];\n\n        // then\n        expectCanMove(elements, 'Process', {\n          attach: false,\n          move: true\n        });\n      }));\n\n    });\n\n\n    describe('on sub process', function() {\n\n      var testXML = require('./BpmnRules.subProcess-dataAssociation.bpmn');\n\n      beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n      it('move task and data association', inject(function(elementRegistry) {\n\n        // when\n        var elements = [\n          elementRegistry.get('DataInputAssociation'),\n          elementRegistry.get('DataOutputAssociation'),\n          elementRegistry.get('DataStoreReference'),\n          elementRegistry.get('Task')\n        ];\n\n        // then\n        expectCanMove(elements, 'SubProcess', {\n          attach: false,\n          move: true\n        });\n      }));\n    });\n\n\n    describe('on collaboration', function() {\n\n      var testXML = require('./BpmnRules.collaboration-dataAssociation.bpmn');\n\n      beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n      it('move participant and data association', inject(function(elementRegistry) {\n\n        // when\n        var elements = [\n          elementRegistry.get('DataInputAssociation'),\n          elementRegistry.get('Participant')\n        ];\n\n        // then\n        expectCanMove(elements, 'Collaboration', {\n          attach: false,\n          move: true\n        });\n      }));\n    });\n\n  });\n\n\n  describe('multi selection move', function() {\n\n    var testXML = require('./BpmnRules.multiSelectionPools.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n    it('is allowed across pools when parent does not change', inject(function(elementRegistry) {\n\n      // when\n      var elements = [\n        elementRegistry.get('Task_A'),\n        elementRegistry.get('Task_B'),\n        elementRegistry.get('MessageFlow_1v3u2fb')\n      ];\n\n      var target = 'Participant_1';\n\n      // then\n      expectCanMove(elements, target, {\n        attach: false,\n        move: true\n      });\n    }));\n\n  });\n\n\n  describe('event move', function() {\n\n    var testXML = require('../../../fixtures/bpmn/boundary-events.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n    it('attach/move multiple BoundaryEvents -> SubProcess_1', inject(\n      function(elementRegistry) {\n\n        // when\n        var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n            boundaryEvent2 = elementRegistry.get('BoundaryEvent_2');\n\n        // we assume boundary events and labels\n        // to be already filtered during move\n        var elements = [ boundaryEvent, boundaryEvent2 ];\n\n        // then\n        expectCanMove(elements, 'SubProcess_1', {\n          attach: false,\n          move: true\n        });\n      }\n    ));\n\n\n    it('attach/move SubProcess, BoundaryEvent and label -> Process', inject(\n      function(elementRegistry) {\n\n        // when\n        var subProcess = elementRegistry.get('SubProcess_1'),\n            boundaryEvent = elementRegistry.get('BoundaryEvent_1'),\n            label = boundaryEvent.label;\n\n        // we assume boundary events and labels\n        // to be already filtered during move\n        var elements = [ subProcess, boundaryEvent, label ];\n\n        // then\n        expectCanMove(elements, 'Process_1', {\n          attach: false,\n          move: true\n        });\n      }\n    ));\n  });\n\n\n  describe('event keyboard move', function() {\n\n    var testXML = require('./BpmnRules.boundaryEvent.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n    it('should NOT allow keyboard move of boundary event without host',\n      inject(function(elementRegistry, rules) {\n\n        // given\n        var boundaryEvent = elementRegistry.get('BoundaryEvent_on_Task');\n\n        // when\n        var canMove = rules.allowed('elements.move', {\n          shapes: [ boundaryEvent ],\n          hints: {\n            keyboardMove: true\n          }\n        });\n\n        // then\n        expect(canMove).to.be.false;\n      })\n    );\n\n\n    it('should allow keyboard move of boundary event with host',\n      inject(function(elementRegistry, rules) {\n\n        // given\n        var task = elementRegistry.get('Task');\n        var boundaryEvent = elementRegistry.get('BoundaryEvent_on_Task');\n\n        // when\n        var canMove = rules.allowed('elements.move', {\n          shapes: [ task, boundaryEvent ],\n          hints: {\n            keyboardMove: true\n          }\n        });\n\n        // then\n        expect(canMove).to.be.true;\n      })\n    );\n\n  });\n\n\n  describe('event attaching', function() {\n\n    var testXML = require('./BpmnRules.attaching.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n    it('should allow to attach attachable events to SubProcess', inject(function(elementRegistry) {\n\n      // given\n      var attachableEvents = [\n        'IntermediateThrowEvent',\n        'MessageCatchEvent',\n        'TimerCatchEvent',\n        'SignalCatchEvent',\n        'ConditionalCatchEvent',\n        'IntermediateThrowEventWithConnections'\n      ];\n\n      var events = attachableEvents.map(function(eventId) {\n        return elementRegistry.get(eventId);\n      });\n\n      // then\n      events.forEach(function(event) {\n\n        expectCanMove([ event ], 'SubProcess_1', {\n          attach: 'attach',\n          move: true\n        });\n      });\n    }));\n\n\n    it('should not allow to attach non-attachable events to SubProcess',\n      inject(function(elementRegistry) {\n\n        // given\n        var nonAttachableEvents = [\n          'MessageThrowEvent',\n          'EscalationThrowEvent',\n          'LinkCatchEvent',\n          'LinkThrowEvent',\n          'CompensateThrowEvent',\n          'SignalThrowEvent'\n        ];\n\n        var events = nonAttachableEvents.map(function(eventId) {\n          return elementRegistry.get(eventId);\n        });\n\n        // then\n        events.forEach(function(event) {\n\n          expectCanMove([ event ], 'SubProcess_1', {\n            attach: false,\n            move: true\n          });\n        });\n      })\n    );\n  });\n\n\n  describe('event create', function() {\n\n    var testXML = require('../../../fixtures/bpmn/boundary-events.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n    it('attach IntermediateEvent to Task', inject(function(elementFactory) {\n\n      // given\n      var eventShape = elementFactory.createShape({\n        type: 'bpmn:IntermediateThrowEvent',\n        x: 413, y: 254\n      });\n\n      // then\n      expectCanMove([ eventShape ], 'Task_1', {\n        attach: 'attach',\n        move: false\n      });\n    }));\n\n\n    it('not attach IntermediateEvent to CompensationTask', inject(\n      function(elementFactory) {\n\n        // given\n        var eventShape = elementFactory.createShape({\n          type: 'bpmn:IntermediateThrowEvent',\n          x: 413, y: 254\n        });\n\n        // then\n        expectCanMove([ eventShape ], 'CompensationTask', {\n          attach: false,\n          move: false\n        });\n      }\n    ));\n\n\n    it('attach IntermediateEvent to SubProcess inner', inject(\n      function(elementFactory, elementRegistry, bpmnRules) {\n\n        // given\n        var subProcessElement = elementRegistry.get('SubProcess_1');\n        var eventShape = elementFactory.createShape({\n          type: 'bpmn:IntermediateThrowEvent',\n          x: 413, y: 350\n        });\n\n        var position = {\n          x: subProcessElement.x + subProcessElement.width / 2,\n          y: subProcessElement.y + subProcessElement.height / 2\n        };\n\n        // when\n        var canAttach = bpmnRules.canAttach(\n          [ eventShape ],\n          subProcessElement,\n          null,\n          position\n        );\n\n        // then\n        expect(canAttach).to.be.false;\n      }\n    ));\n\n\n    it('attach IntermediateEvent to SubProcess border', inject(\n      function(elementFactory, elementRegistry, bpmnRules) {\n\n        // given\n        var subProcessElement = elementRegistry.get('SubProcess_1');\n        var eventShape = elementFactory.createShape({\n          type: 'bpmn:IntermediateThrowEvent',\n          x: 0, y: 0\n        });\n\n        var position = {\n          x: subProcessElement.x + subProcessElement.width / 2,\n          y: subProcessElement.y + subProcessElement.height\n        };\n\n        // when\n        var canAttach = bpmnRules.canAttach(\n          [ eventShape ],\n          subProcessElement,\n          null,\n          position\n        );\n\n        // then\n        expect(canAttach).to.equal('attach');\n      }\n    ));\n\n\n    it('not attach IntermediateEvent to compensation activity', inject(\n      function(elementFactory, elementRegistry, bpmnRules) {\n\n        // given\n        var compensationTask = elementRegistry.get('CompensationTask');\n        var eventShape = elementFactory.createShape({\n          type: 'bpmn:IntermediateThrowEvent',\n          x: 0, y: 0\n        });\n\n        var position = {\n          x: compensationTask.x + compensationTask.width / 2,\n          y: compensationTask.y + compensationTask.height\n        };\n\n        // when\n        var canAttach = bpmnRules.canAttach(\n          [ eventShape ],\n          compensationTask,\n          null,\n          position\n        );\n\n        // then\n        expect(canAttach).to.be.false;\n      }\n    ));\n\n\n    it('not attach IntermediateEvent to ReceiveTask after EventBasedGateway', inject(\n      function(canvas, modeling, elementFactory, bpmnRules) {\n\n        // given\n        var rootElement = canvas.getRootElement(),\n            eventBasedGatewayShape = elementFactory.createShape({ type: 'bpmn:EventBasedGateway' }),\n            receiveTaskShape = elementFactory.createShape({ type: 'bpmn:ReceiveTask' }),\n            eventShape = elementFactory.createShape({\n              type: 'bpmn:IntermediateThrowEvent',\n              x: 0, y: 0\n            });\n\n        var boundaryPosition = {\n          x: 175,\n          y: 100 + receiveTaskShape.height\n        };\n\n        // when\n        modeling.createShape(eventBasedGatewayShape, { x: 100, y: 100 }, rootElement);\n        modeling.createShape(receiveTaskShape, { x : 150, y: 100 }, rootElement);\n        modeling.connect(eventBasedGatewayShape, receiveTaskShape, {\n          type: 'bpmn:SequenceFlow'\n        });\n\n        var canAttach = bpmnRules.canAttach(\n          [ eventShape ],\n          receiveTaskShape,\n          null,\n          boundaryPosition\n        );\n\n        // then\n        expect(canAttach).to.be.false;\n      }\n    ));\n\n\n    it('create IntermediateEvent in SubProcess body', inject(\n      function(elementFactory, elementRegistry, bpmnRules) {\n\n        // given\n        var subProcessElement = elementRegistry.get('SubProcess_1');\n        var eventShape = elementFactory.createShape({\n          type: 'bpmn:IntermediateThrowEvent',\n          x: 413, y: 250\n        });\n\n        var position = {\n          x: eventShape.x,\n          y: eventShape.y\n        };\n\n        // when\n        var canAttach = bpmnRules.canAttach(\n          [ eventShape ],\n          subProcessElement,\n          null,\n          position\n        );\n\n        var canCreate = bpmnRules.canCreate(\n          eventShape,\n          subProcessElement,\n          null,\n          position\n        );\n\n        // then\n        expect(canAttach).to.be.false;\n        expect(canCreate).to.be.true;\n      }\n    ));\n\n  });\n\n\n  describe('event append', function() {\n\n    var testXML = require('../../../fixtures/bpmn/boundary-events.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n    it('append IntermediateEvent from Task', inject(\n      function(elementFactory, elementRegistry, bpmnRules) {\n\n        // given\n        var subProcessElement = elementRegistry.get('SubProcess_1'),\n            taskElement = elementRegistry.get('Task_2');\n\n        var eventShape = elementFactory.createShape({\n          type: 'bpmn:IntermediateThrowEvent',\n          x: 413, y: 250\n        });\n\n        var position = {\n          x: eventShape.x,\n          y: eventShape.y\n        };\n\n        // when\n        var canAttach = bpmnRules.canAttach(\n          [ eventShape ],\n          subProcessElement,\n          taskElement,\n          position\n        );\n\n        var canCreate = bpmnRules.canCreate(\n          eventShape,\n          subProcessElement,\n          taskElement,\n          position\n        );\n\n        // then\n        expect(canAttach).to.be.false;\n        expect(canCreate).to.be.true;\n      }\n    ));\n\n\n    it('append IntermediateEvent from BoundaryEvent', inject(\n      function(elementFactory, elementRegistry, bpmnRules) {\n\n        // given\n        var boundaryElement = elementRegistry.get('BoundaryEvent_1'),\n            taskElement = elementRegistry.get('Task_2');\n\n        var eventShape = elementFactory.createShape({\n          type: 'bpmn:IntermediateThrowEvent',\n          x: 413, y: 250\n        });\n\n        // when\n        var canAttach = bpmnRules.canAttach(\n          [ eventShape ],\n          taskElement,\n          boundaryElement\n        );\n\n        var canCreate = bpmnRules.canCreate(\n          eventShape,\n          taskElement,\n          boundaryElement\n        );\n\n        // then\n        expect(canAttach).to.eql('attach');\n        expect(canCreate).to.be.false;\n      }\n    ));\n\n  });\n\n\n  describe('groups', function() {\n\n    var testXML = require('./BpmnRules.groups.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n    describe('should resize', function() {\n\n      it('Group', inject(function(bpmnRules, elementRegistry) {\n\n        // given\n        var groupElement = elementRegistry.get('Group_1');\n\n        // when\n        var canResize = bpmnRules.canResize(groupElement);\n\n        // then\n        expect(canResize).to.be.true;\n      }));\n\n    });\n\n  });\n\n\n  describe('lanes', function() {\n\n    var testXML = require('./BpmnRules.collaboration-lanes.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n    describe('should add', function() {\n\n      it('Lane -> Participant', inject(function(elementFactory, elementRegistry, bpmnRules) {\n\n        // given\n        var participantElement = elementRegistry.get('Participant');\n\n        var laneShape = elementFactory.createShape({\n          type: 'bpmn:Lane',\n          x: 413, y: 250\n        });\n\n        // when\n        var canCreate = bpmnRules.canCreate(laneShape, participantElement);\n\n        // then\n        expect(canCreate).to.be.true;\n      }));\n\n\n      it('Lane -> Participant_Lane', inject(function(elementFactory, elementRegistry, bpmnRules) {\n\n        // given\n        var participantElement = elementRegistry.get('Participant_Lane');\n\n        var laneShape = elementFactory.createShape({\n          type: 'bpmn:Lane',\n          x: 413, y: 250\n        });\n\n        // when\n        var canCreate = bpmnRules.canCreate(laneShape, participantElement);\n\n        // then\n        expect(canCreate).to.be.true;\n      }));\n\n\n      it('[not] Lane -> SubProcess', inject(function(elementFactory, elementRegistry, bpmnRules) {\n\n        // given\n        var subProcessElement = elementRegistry.get('SubProcess');\n\n        var laneShape = elementFactory.createShape({\n          type: 'bpmn:Lane',\n          x: 413, y: 250\n        });\n\n        // when\n        var canCreate = bpmnRules.canCreate(laneShape, subProcessElement);\n\n        // then\n        expect(canCreate).to.be.false;\n      }));\n\n    });\n\n\n    describe('should not allow move', function() {\n\n      it('Lane -> Participant', inject(function(elementFactory, elementRegistry, bpmnRules) {\n\n        // given\n        var participantElement = elementRegistry.get('Participant'),\n            laneElement = elementRegistry.get('Lane');\n\n        // when\n        var canMove = bpmnRules.canMove([ laneElement ], participantElement);\n\n        // then\n        expect(canMove).to.be.false;\n      }));\n\n\n      it('Lane -> SubProcess', inject(function(elementFactory, elementRegistry, bpmnRules) {\n\n        // given\n        var subProcessElement = elementRegistry.get('SubProcess'),\n            laneElement = elementRegistry.get('Lane');\n\n        // when\n        var canMove = bpmnRules.canMove([ laneElement ], subProcessElement);\n\n        // then\n        expect(canMove).to.be.false;\n      }));\n\n    });\n\n\n    describe('should resize', function() {\n\n      it('Lane', inject(function(bpmnRules, elementRegistry) {\n\n        // given\n        var laneElement = elementRegistry.get('Lane');\n\n        // when\n        var canResize = bpmnRules.canResize(laneElement);\n\n        // then\n        expect(canResize).to.be.true;\n      }));\n\n    });\n\n\n    describe('should allow drop', function() {\n\n      it('SubProcess -> Lane', inject(function(elementFactory, elementRegistry, bpmnRules) {\n\n        // given\n        var element = elementRegistry.get('SubProcess'),\n            laneElement = elementRegistry.get('Lane');\n\n        // when\n        var canMove = bpmnRules.canMove([ element ], laneElement);\n\n        // then\n        expect(canMove).to.be.true;\n      }));\n\n\n      it('Task_in_SubProcess -> Lane', inject(function(elementFactory, elementRegistry, bpmnRules) {\n\n        // given\n        var element = elementRegistry.get('Task_in_SubProcess'),\n            laneElement = elementRegistry.get('Lane');\n\n        // when\n        var canMove = bpmnRules.canMove([ element ], laneElement);\n\n        // then\n        expect(canMove).to.be.true;\n      }));\n\n    });\n\n  });\n\n\n  describe('insert', function() {\n\n    var testXML = require('./BpmnRules.insert.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n    it('insert END -> S1', function() {\n      expectCanInsert('END', 'S1', false);\n    });\n\n\n    it('insert START -> S1', function() {\n      expectCanInsert('START', 'S1', false);\n    });\n\n\n    it('insert GATEWAY -> S1', function() {\n      expectCanInsert('GATEWAY', 'S1', true);\n    });\n\n  });\n\n\n  describe('connect on create', function() {\n\n    var testXML = require('./BpmnRules.connectOnCreate.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n    it('should handle target without parent', inject(function(elementFactory) {\n\n      // given\n      var types = [\n        'bpmn:Task',\n        'bpmn:StartEvent',\n        'bpmn:EndEvent',\n        'bpmn:Gateway'\n      ];\n\n      types.forEach(function(type) {\n\n        // when\n        var element = elementFactory.createShape({ type: type });\n\n        // then\n        expectCanConnect('Task_A', element, {\n          sequenceFlow: false,\n          messageFlow: false,\n          association: false,\n          dataAssociation: false\n        });\n      });\n\n    }));\n\n  });\n\n\n  describe('data input / output', function() {\n\n    describe('in process', function() {\n\n      var testXML = require('./BpmnRules.dataInputOutput.process.bpmn');\n\n      beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n      it('should move', inject(function(elementRegistry) {\n\n        // when\n        var elements = [\n          'Task',\n          'DataInput',\n          'DataOutput'\n        ];\n\n        // then\n        expectCanDrop('DataInput', 'Process', true);\n        expectCanDrop('DataOutput', 'Process', true);\n\n        expectCanMove(elements, 'Process', {\n          attach: false,\n          move: true\n        });\n      }));\n\n    });\n\n\n    describe('in collaboration', function() {\n\n      var testXML = require('./BpmnRules.dataInputOutput.collaboration.bpmn');\n\n      beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n      it('should move', inject(function(elementRegistry) {\n\n        // when\n        var elements = [\n          'Task',\n          'DataInput',\n          'DataOutput'\n        ];\n\n        // then\n        expectCanDrop('DataInput', 'Participant_A', true);\n        expectCanDrop('DataInput', 'Participant_B', false);\n\n        expectCanDrop('DataOutput', 'Participant_A', true);\n        expectCanDrop('DataOutput', 'Participant_B', false);\n\n        expectCanMove(elements, 'Participant_A', {\n          attach: false,\n          move: true\n        });\n\n        expectCanMove(elements, 'Participant_B', {\n          attach: false,\n          move: false\n        });\n      }));\n\n    });\n\n  });\n\n\n  describe('integration', function() {\n\n    describe('move Lane', function() {\n\n      var testXML = require('./BpmnRules.moveLane.bpmn');\n\n      beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n      it('should disallow', inject(function(elementRegistry, rules) {\n\n        // given\n        var lane = elementRegistry.get('Lane_1');\n\n        // when\n        var result = rules.allowed('elements.move', {\n          shapes: [ lane ]\n        });\n\n        // then\n        expect(result).to.be.false;\n      }));\n\n    });\n\n  });\n\n\n  describe('start connection', function() {\n\n    var testXML = require('../../../fixtures/bpmn/simple.bpmn');\n\n    beforeEach(bootstrapModeler(testXML, { modules: testModules }));\n\n\n    it('should allow start for given element types', inject(function(elementFactory, rules) {\n\n      // given\n      var types = [\n        'bpmn:FlowNode',\n        'bpmn:InteractionNode',\n        'bpmn:DataObjectReference',\n        'bpmn:DataStoreReference',\n        'bpmn:Group',\n        'bpmn:TextAnnotation'\n      ];\n\n      // when\n      var results = types.map(function(type) {\n        var element = elementFactory.createShape({ type: type });\n        return rules.allowed('connection.start', { source: element });\n      });\n\n      // then\n      results.forEach(function(result) {\n        expect(result).to.be.true;\n      });\n    }));\n\n\n    it('should ignore label elements', inject(function(elementFactory, rules) {\n\n      // given\n      var label = elementFactory.createLabel({});\n\n      // when\n      var result = rules.allowed('connection.start', { source: label });\n\n      // then\n      expect(result).to.be.null;\n    }));\n\n\n    it('should NOT allow start on unknown element', inject(function(rules) {\n\n      // given\n      var element = { type: 'bpmn:SomeUnknownType' };\n\n      // when\n      var result = rules.allowed('connection.start', { source: element });\n\n      // then\n      expect(result).to.be.false;\n    }));\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/features/rules/Helper.js",
    "content": "import {\n  getBpmnJS\n} from 'test/TestHelper';\n\nimport {\n  isArray,\n  isString,\n  map\n} from 'min-dash';\n\n/**\n * @typedef {import('../../../../lib/model/Types').Parent} Parent\n * @typedef {import('../../../../lib/model/Types').Shape} Shape\n */\n\nexport function expectCanConnect(source, target, rules) {\n\n  var results = {};\n\n  getBpmnJS().invoke(function(bpmnRules) {\n\n    source = get(source);\n    target = get(target);\n\n    if ('sequenceFlow' in rules) {\n      results.sequenceFlow = bpmnRules.canConnectSequenceFlow(source, target);\n    }\n\n    if ('messageFlow' in rules) {\n      results.messageFlow = bpmnRules.canConnectMessageFlow(source, target);\n    }\n\n    if ('association' in rules) {\n      results.association = bpmnRules.canConnectAssociation(source, target);\n    }\n\n    if ('dataAssociation' in rules) {\n      results.dataAssociation = bpmnRules.canConnectDataAssociation(source, target);\n    }\n\n    if ('compensationAssociation' in rules) {\n      results.compensationAssociation = bpmnRules.canConnectCompensationAssociation(source, target);\n    }\n  });\n\n  expect(results).to.eql(rules);\n}\n\n\nexport function expectCanDrop(element, target, expectedResult) {\n\n  var result = getBpmnJS().invoke(function(bpmnRules) {\n    return bpmnRules.canDrop(get(element), get(target));\n  });\n\n  expect(result).to.eql(expectedResult);\n}\n\n\n/**\n * @param {Shape|Element[]} shape Shape or array of elements to create.\n * @param {Parent} target\n * @param {any} expectedResult\n */\nexport function expectCanCreate(shape, target, expectedResult) {\n\n  var result = getBpmnJS().invoke(function(rules) {\n\n    if (isArray(shape)) {\n      return rules.allowed('elements.create', {\n        elements: get(shape),\n        target: get(target)\n      });\n    }\n\n    return rules.allowed('shape.create', {\n      shape: get(shape),\n      target: get(target)\n    });\n  });\n\n  expect(result).to.eql(expectedResult);\n}\n\n\nexport function expectCanCopy(element, elements, expectedResult) {\n\n  var result = getBpmnJS().invoke(function(rules) {\n    return rules.allowed('element.copy', {\n      element: element,\n      elements: elements\n    });\n  });\n\n  expect(result).to.eql(expectedResult);\n}\n\n\nexport function expectCanInsert(element, target, expectedResult) {\n\n  var result = getBpmnJS().invoke(function(bpmnRules) {\n    return bpmnRules.canInsert(get(element), get(target));\n  });\n\n  expect(result).to.eql(expectedResult);\n}\n\n\nexport function expectCanMove(elements, target, rules) {\n\n  var results = {};\n\n  elements = elements.map(get);\n\n  getBpmnJS().invoke(function(bpmnRules) {\n\n    target = get(target);\n\n    if ('attach' in rules) {\n      results.attach = bpmnRules.canAttach(elements, target);\n    }\n\n    if ('move' in rules) {\n      results.move = bpmnRules.canMove(elements, target);\n    }\n  });\n\n  expect(results).to.eql(rules);\n}\n\n\n/**\n * Retrieve element, resolving an ID with\n * the actual element.\n */\nfunction get(elementId) {\n\n  if (isArray(elementId)) {\n    return map(elementId, get);\n  }\n\n  var element;\n\n  if (isString(elementId)) {\n    element = getBpmnJS().invoke(function(elementRegistry) {\n      return elementRegistry.get(elementId);\n    });\n\n    if (!element) {\n      throw new Error('element #' + elementId + ' not found');\n    }\n\n    return element;\n  }\n\n  return elementId;\n}"
  },
  {
    "path": "test/spec/features/search/BpmnSearchProviderSpec.js",
    "content": "import {\n  bootstrapViewer,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  pick\n} from 'min-dash';\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\nimport bpmnSearchModule from 'lib/features/search';\n\n\ndescribe('features - BPMN search provider', function() {\n\n  var testModules = [\n    coreModule,\n    modelingModule,\n    bpmnSearchModule\n  ];\n\n\n  describe('collaboration', function() {\n    var diagramXML = require('./bpmn-search-collaboration.bpmn');\n\n    beforeEach(bootstrapViewer(diagramXML, { modules: testModules }));\n\n\n    it('should not return root element (collaboration)', inject(function(bpmnSearch) {\n\n      // given\n      var pattern = 'collaboration';\n\n      // when\n      var elements = bpmnSearch.find(pattern);\n\n      // then\n      expect(elements).to.have.length(0);\n    }));\n\n  });\n\n\n  describe('process', function() {\n\n    var diagramXML = require('./bpmn-search.bpmn');\n\n    beforeEach(bootstrapViewer(diagramXML, { modules: testModules }));\n\n\n    it('find should return all elements that match label or ID', inject(function(bpmnSearch) {\n\n      // given\n      var pattern = '123456';\n\n      // when\n      var elements = bpmnSearch.find(pattern);\n\n      // then\n      expect(elements).length(3);\n      elements.forEach(function(e) {\n        expect(e).to.have.property('element');\n        expect(e).to.have.property('primaryTokens');\n        expect(e).to.have.property('secondaryTokens');\n      });\n    }));\n\n\n    it('matches IDs', inject(function(bpmnSearch) {\n\n      // given\n      var pattern = 'datastore';\n\n      // when\n      var elements = bpmnSearch.find(pattern);\n\n      // then\n      expectTokens(elements[0].primaryTokens, [\n        { value: 'has matched ID' }\n      ]);\n      expectTokens(elements[0].secondaryTokens, [\n        { value: 'some_' },\n        { value: 'DataStore', match: true },\n        { value: '_123456_id' }\n      ]);\n    }));\n\n\n    it('should not return root element (process)', inject(function(bpmnSearch) {\n\n      // given\n      var pattern = 'process';\n\n      // when\n      var elements = bpmnSearch.find(pattern);\n\n      // then\n      expect(elements).to.have.length(0);\n    }));\n\n\n    it('should not return root element (collabsed subprocess)', inject(function(bpmnSearch, elementRegistry) {\n\n      // given\n      var subprocessShape = elementRegistry.get('collapsed');\n      var pattern = 'Collapsed';\n\n      // when\n      var elements = bpmnSearch.find(pattern);\n\n      // then\n      expect(elements).to.have.length(1);\n      expect(elements[0].element).to.eql(subprocessShape);\n    }));\n\n\n    describe('should split result into matched and non matched tokens', function() {\n\n      it('matched all', inject(function(bpmnSearch) {\n\n        // given\n        var pattern = 'all matched';\n\n        // when\n        var elements = bpmnSearch.find(pattern);\n\n        // then\n        expectTokens(elements[0].primaryTokens, [\n          { value: 'all matched', match: true }\n        ]);\n      }));\n\n\n      it('matched start', inject(function(bpmnSearch) {\n\n        // given\n        var pattern = 'before';\n\n        // when\n        var elements = bpmnSearch.find(pattern);\n\n        // then\n        expectTokens(elements[0].primaryTokens, [\n          { value: 'before', match: true },\n          { value: ' 321' }\n        ]);\n      }));\n\n\n      it('matched middle', inject(function(bpmnSearch) {\n\n        // given\n        var pattern = 'middle';\n\n        // when\n        var elements = bpmnSearch.find(pattern);\n\n        // then\n        expectTokens(elements[0].primaryTokens, [\n          { value: '123 ' },\n          { value: 'middle', match: true },\n          { value: ' 321' }\n        ]);\n      }));\n\n\n      it('matched end', inject(function(bpmnSearch) {\n\n        // given\n        var pattern = 'after';\n\n        // when\n        var elements = bpmnSearch.find(pattern);\n\n        // then\n        expectTokens(elements[0].primaryTokens, [\n          { value: '123 ' },\n          { value: 'after', match: true }\n        ]);\n      }));\n\n    });\n\n  });\n\n\n  describe('sorting', function() {\n\n    var diagramXML = require('./bpmn-search-sorting.bpmn');\n\n    beforeEach(bootstrapViewer(diagramXML, { modules: testModules }));\n\n\n    it('should sort', inject(function(bpmnSearch) {\n\n      // given\n      var pattern = 'foo';\n\n      // when\n      var elements = bpmnSearch.find(pattern);\n\n      var idsAndNames = elements.map(e => [ e.element.id, e.element.businessObject.name ]);\n\n      // then\n      expect(idsAndNames).to.eql([\n        [ 'foo_2', 'foo bar' ],\n        [ 'foo_3', 'foo bar' ],\n        [ 'bar', 'foo bar' ],\n        [ 'foo_0', 'bar' ],\n        [ 'foo_1', 'baz' ],\n        [ 'baz', 'bar foo' ]\n      ]);\n    }));\n\n\n    it('should handle elements without label', inject(function(bpmnSearch) {\n\n      // given\n      var pattern = 'ass';\n\n      // when\n      var elements = bpmnSearch.find(pattern);\n\n      // then\n      expect(elements).length(2);\n      expect(elements[0].element.id).to.eql('Association_1');\n      expect(elements[1].element.id).to.eql('Association_2');\n    }));\n\n  });\n\n});\n\n\n// helpers ///////////////\n\nfunction expectTokens(tokens, expectedTokens) {\n  const cleanTokens = tokens.map(\n    token => pick(token, [ 'value', 'match' ])\n  );\n\n  expect(cleanTokens).to.eql(expectedTokens);\n}"
  },
  {
    "path": "test/spec/features/search/bpmn-search-collaboration.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"0.7.0-dev\">\n  <bpmn:collaboration id=\"Collaboration_0b1a2hl\">\n    <bpmn:participant id=\"Participant_17ug74t\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_1j5i0e6\" name=\"Second 123456 task here\">\n      <bpmn:outgoing>SequenceFlow_0wgiusn</bpmn:outgoing>\n      <bpmn:dataOutputAssociation id=\"DataOutputAssociation_1jomsz7\">\n        <bpmn:targetRef>some_DataStore_123456_id</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n    </bpmn:task>\n    <bpmn:intermediateThrowEvent id=\"IntermediateThrowEvent_1lhurmj\" name=\"Third 123456\">\n      <bpmn:incoming>SequenceFlow_0wgiusn</bpmn:incoming>\n    </bpmn:intermediateThrowEvent>\n    <bpmn:dataStoreReference id=\"some_DataStore_123456_id\" name=\"has matched ID\" />\n    <bpmn:task id=\"Task_0dso4ju\" name=\"UNIQUE ELEMENT\" />\n    <bpmn:task id=\"Task_asdfasd\" name=\"before 321\">\n      <bpmn:incoming>SequenceFlow_1bhe9h2</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_02ymelh</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"Task_asdfasddgg\" name=\"123 middle 321\">\n      <bpmn:incoming>SequenceFlow_02ymelh</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_0ugwp0d</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"Task_asdfasdsdfgg\" name=\"123 after\">\n      <bpmn:incoming>SequenceFlow_0ugwp0d</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:task id=\"Task_0vuhy0s\" name=\"all matched\">\n      <bpmn:outgoing>SequenceFlow_1bhe9h2</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_0wgiusn\" sourceRef=\"Task_1j5i0e6\" targetRef=\"IntermediateThrowEvent_1lhurmj\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_1bhe9h2\" sourceRef=\"Task_0vuhy0s\" targetRef=\"Task_asdfasd\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_02ymelh\" sourceRef=\"Task_asdfasd\" targetRef=\"Task_asdfasddgg\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_0ugwp0d\" sourceRef=\"Task_asdfasddgg\" targetRef=\"Task_asdfasdsdfgg\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_0b1a2hl\">\n      <bpmndi:BPMNShape id=\"Participant_17ug74t_di\" bpmnElement=\"Participant_17ug74t\">\n        <dc:Bounds x=\"-50.5\" y=\"-20.5\" width=\"1109\" height=\"375\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1j5i0e6_di\" bpmnElement=\"Task_1j5i0e6\">\n        <dc:Bounds x=\"195\" y=\"106\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_1lhurmj_di\" bpmnElement=\"IntermediateThrowEvent_1lhurmj\">\n        <dc:Bounds x=\"227\" y=\"299\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"200\" y=\"335\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_093mpev_di\" bpmnElement=\"some_DataStore_123456_id\">\n        <dc:Bounds x=\"371\" y=\"121\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"351\" y=\"186\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0dso4ju_di\" bpmnElement=\"Task_0dso4ju\">\n        <dc:Bounds x=\"0\" y=\"0\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0vyzyuo_di\" bpmnElement=\"Task_asdfasd\">\n        <dc:Bounds x=\"623\" y=\"247\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1wkhcs9_di\" bpmnElement=\"Task_asdfasddgg\">\n        <dc:Bounds x=\"783\" y=\"247\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1m7fa4o_di\" bpmnElement=\"Task_asdfasdsdfgg\">\n        <dc:Bounds x=\"939\" y=\"247\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0vuhy0s_di\" bpmnElement=\"Task_0vuhy0s\">\n        <dc:Bounds x=\"471\" y=\"247\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_1jomsz7_di\" bpmnElement=\"DataOutputAssociation_1jomsz7\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"295\" y=\"146\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"371\" y=\"146\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0wgiusn_di\" bpmnElement=\"SequenceFlow_0wgiusn\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"245\" y=\"186\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"245\" y=\"299\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"339\" y=\"265\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1bhe9h2_di\" bpmnElement=\"SequenceFlow_1bhe9h2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"571\" y=\"287\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"623\" y=\"287\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"552\" y=\"277\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_02ymelh_di\" bpmnElement=\"SequenceFlow_02ymelh\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"723\" y=\"287\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"783\" y=\"287\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"708\" y=\"277\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0ugwp0d_di\" bpmnElement=\"SequenceFlow_0ugwp0d\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"883\" y=\"287\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"939\" y=\"287\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"866\" y=\"277\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/search/bpmn-search-sorting.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_0ikirpg\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.27.0-rc.0\" modeler:executionPlatform=\"Camunda Cloud\" modeler:executionPlatformVersion=\"8.5.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:task id=\"foo_3\" name=\"foo bar\" />\n    <bpmn:task id=\"baz\" name=\"bar foo\" />\n    <bpmn:task id=\"bar\" name=\"foo bar\" />\n    <bpmn:task id=\"foo_2\" name=\"foo bar\" />\n    <bpmn:task id=\"foo_1\" name=\"baz\" />\n    <bpmn:task id=\"foo_0\" name=\"bar\" />\n    <bpmn:textAnnotation id=\"TextAnnotation_1\" />\n    <bpmn:association id=\"Association_1\" associationDirection=\"None\" sourceRef=\"foo_3\" targetRef=\"TextAnnotation_1\" />\n    <bpmn:textAnnotation id=\"TextAnnotation_2\" />\n    <bpmn:association id=\"Association_2\" associationDirection=\"None\" sourceRef=\"baz\" targetRef=\"TextAnnotation_2\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Activity_1sd3etr_di\" bpmnElement=\"foo_3\">\n        <dc:Bounds x=\"160\" y=\"160\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0tpx833_di\" bpmnElement=\"baz\">\n        <dc:Bounds x=\"290\" y=\"160\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_03mqj66_di\" bpmnElement=\"bar\">\n        <dc:Bounds x=\"420\" y=\"160\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1pc6qua_di\" bpmnElement=\"foo_2\">\n        <dc:Bounds x=\"550\" y=\"160\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0g0alrr_di\" bpmnElement=\"foo_1\">\n        <dc:Bounds x=\"680\" y=\"160\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0mbe5y4_di\" bpmnElement=\"foo_0\">\n        <dc:Bounds x=\"810\" y=\"160\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_0sxp2i6_di\" bpmnElement=\"Association_1\">\n        <di:waypoint x=\"248\" y=\"160\" />\n        <di:waypoint x=\"296\" y=\"110\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Association_1gmudwp_di\" bpmnElement=\"Association_2\">\n        <di:waypoint x=\"378\" y=\"160\" />\n        <di:waypoint x=\"426\" y=\"110\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"TextAnnotation_0g5dnhq_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"260\" y=\"80\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_17bv75f_di\" bpmnElement=\"TextAnnotation_2\">\n        <dc:Bounds x=\"390\" y=\"80\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/search/bpmn-search.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.22.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_1j5i0e6\" name=\"Second 123456 task here\">\n      <bpmn:outgoing>SequenceFlow_0wgiusn</bpmn:outgoing>\n      <bpmn:dataOutputAssociation id=\"DataOutputAssociation_1jomsz7\">\n        <bpmn:targetRef>some_DataStore_123456_id</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n    </bpmn:task>\n    <bpmn:intermediateThrowEvent id=\"IntermediateThrowEvent_1lhurmj\" name=\"Third 123456\">\n      <bpmn:incoming>SequenceFlow_0wgiusn</bpmn:incoming>\n    </bpmn:intermediateThrowEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_0wgiusn\" sourceRef=\"Task_1j5i0e6\" targetRef=\"IntermediateThrowEvent_1lhurmj\" />\n    <bpmn:dataStoreReference id=\"some_DataStore_123456_id\" name=\"has matched ID\" />\n    <bpmn:task id=\"Task_0dso4ju\" name=\"UNIQUE ELEMENT\" />\n    <bpmn:task id=\"Task_asdfasd\" name=\"before 321\">\n      <bpmn:incoming>SequenceFlow_1bhe9h2</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_02ymelh</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:task id=\"Task_asdfasddgg\" name=\"123 middle 321\">\n      <bpmn:incoming>SequenceFlow_02ymelh</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_0ugwp0d</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_02ymelh\" sourceRef=\"Task_asdfasd\" targetRef=\"Task_asdfasddgg\" />\n    <bpmn:task id=\"Task_asdfasdsdfgg\" name=\"123 after\">\n      <bpmn:incoming>SequenceFlow_0ugwp0d</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_0ugwp0d\" sourceRef=\"Task_asdfasddgg\" targetRef=\"Task_asdfasdsdfgg\" />\n    <bpmn:task id=\"Task_0vuhy0s\" name=\"all matched\">\n      <bpmn:outgoing>SequenceFlow_1bhe9h2</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1bhe9h2\" sourceRef=\"Task_0vuhy0s\" targetRef=\"Task_asdfasd\" />\n    <bpmn:subProcess id=\"collapsed\" name=\"Collapsed\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_1j5i0e6_di\" bpmnElement=\"Task_1j5i0e6\">\n        <dc:Bounds x=\"355\" y=\"186\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_1lhurmj_di\" bpmnElement=\"IntermediateThrowEvent_1lhurmj\">\n        <dc:Bounds x=\"387\" y=\"379\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"373\" y=\"415\" width=\"64\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_093mpev_di\" bpmnElement=\"some_DataStore_123456_id\">\n        <dc:Bounds x=\"531\" y=\"201\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"517\" y=\"266\" width=\"78\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0dso4ju_di\" bpmnElement=\"Task_0dso4ju\">\n        <dc:Bounds x=\"160\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0vyzyuo_di\" bpmnElement=\"Task_asdfasd\">\n        <dc:Bounds x=\"783\" y=\"327\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1wkhcs9_di\" bpmnElement=\"Task_asdfasddgg\">\n        <dc:Bounds x=\"943\" y=\"327\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1m7fa4o_di\" bpmnElement=\"Task_asdfasdsdfgg\">\n        <dc:Bounds x=\"1099\" y=\"327\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0vuhy0s_di\" bpmnElement=\"Task_0vuhy0s\">\n        <dc:Bounds x=\"631\" y=\"327\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_14an2wn_di\" bpmnElement=\"collapsed\" isExpanded=\"false\">\n        <dc:Bounds x=\"631\" y=\"186\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_1jomsz7_di\" bpmnElement=\"DataOutputAssociation_1jomsz7\">\n        <di:waypoint x=\"455\" y=\"226\" />\n        <di:waypoint x=\"531\" y=\"226\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0wgiusn_di\" bpmnElement=\"SequenceFlow_0wgiusn\">\n        <di:waypoint x=\"405\" y=\"266\" />\n        <di:waypoint x=\"405\" y=\"379\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"339\" y=\"265\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1bhe9h2_di\" bpmnElement=\"SequenceFlow_1bhe9h2\">\n        <di:waypoint x=\"731\" y=\"367\" />\n        <di:waypoint x=\"783\" y=\"367\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"552\" y=\"277\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_02ymelh_di\" bpmnElement=\"SequenceFlow_02ymelh\">\n        <di:waypoint x=\"883\" y=\"367\" />\n        <di:waypoint x=\"943\" y=\"367\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"708\" y=\"277\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_0ugwp0d_di\" bpmnElement=\"SequenceFlow_0ugwp0d\">\n        <di:waypoint x=\"1043\" y=\"367\" />\n        <di:waypoint x=\"1099\" y=\"367\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"866\" y=\"277\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_0tt6svc\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_0rfm64a\" bpmnElement=\"collapsed\" />\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/snapping/BpmnConnectSnapping.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1xakeh4\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.3.4\">\n  <bpmn:collaboration id=\"Collaboration_1\">\n    <bpmn:participant id=\"Participant_1\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Participant_2\" processRef=\"Process_2\" />\n    <bpmn:participant id=\"Participant_3\" processRef=\"Process_3\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_Right\" attachedToRef=\"SubProcess\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_Bottom\" attachedToRef=\"SubProcess\" />\n    <bpmn:startEvent id=\"StartEvent_1\" />\n    <bpmn:exclusiveGateway id=\"Gateway_1\" />\n    <bpmn:endEvent id=\"EndEvent_1\" />\n    <bpmn:task id=\"Task_1\" />\n    <bpmn:dataObjectReference id=\"DataObjectReference_1\" dataObjectRef=\"DataObject_16xfc7e\" />\n    <bpmn:dataObject id=\"DataObject_16xfc7e\" />\n  </bpmn:process>\n  <bpmn:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn:intermediateThrowEvent id=\"IntermediateThrowEvent_1\">\n      <bpmn:messageEventDefinition />\n    </bpmn:intermediateThrowEvent>\n    <bpmn:intermediateCatchEvent id=\"IntermediateCatchEvent_1\">\n      <bpmn:messageEventDefinition />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:task id=\"Task_2\" />\n  </bpmn:process>\n  <bpmn:process id=\"Process_3\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_2\" />\n    <bpmn:startEvent id=\"StartEvent_3\" />\n    <bpmn:task id=\"Task_3\" />\n    <bpmn:subProcess id=\"SubProcess_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_03743bx_di\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"0\" y=\"0\" width=\"800\" height=\"383\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"62\" y=\"32\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_1fetlei_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"62\" y=\"222\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0ed1rn5_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"200\" y=\"200\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_0pf2ezq_di\" bpmnElement=\"DataObjectReference_1\">\n        <dc:Bounds x=\"562\" y=\"285\" width=\"36\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_1ooemal_di\" bpmnElement=\"Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"0\" y=\"420\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0iwlfts_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"370\" y=\"510\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateCatchEvent_08covmw_di\" bpmnElement=\"IntermediateCatchEvent_1\">\n        <dc:Bounds x=\"162\" y=\"532\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"IntermediateThrowEvent_1jsmhky_di\" bpmnElement=\"IntermediateThrowEvent_1\">\n        <dc:Bounds x=\"52\" y=\"532\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_di\" bpmnElement=\"SubProcess\" isExpanded=\"true\">\n        <dc:Bounds x=\"400\" y=\"30\" width=\"360\" height=\"170\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_di\" bpmnElement=\"BoundaryEvent_Bottom\">\n        <dc:Bounds x=\"572\" y=\"182\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_1nir8te_di\" bpmnElement=\"Gateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"225\" y=\"25\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_0echqt5_di\" bpmnElement=\"Participant_3\" isHorizontal=\"true\">\n        <dc:Bounds x=\"0\" y=\"710\" width=\"600\" height=\"430\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_0dv3wii_di\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds x=\"62\" y=\"827\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_04e4734_di\" bpmnElement=\"Task_3\">\n        <dc:Bounds x=\"150\" y=\"805\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"StartEvent_0wio031_di\" bpmnElement=\"StartEvent_3\">\n        <dc:Bounds x=\"62\" y=\"1007\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SubProcess_0c0l60x_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"150\" y=\"925\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEventRight_di\" bpmnElement=\"BoundaryEvent_Right\">\n        <dc:Bounds x=\"742\" y=\"112\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/snapping/BpmnConnectSnappingSpec.js",
    "content": "import {\r\n  bootstrapModeler,\r\n  inject\r\n} from 'test/TestHelper';\r\n\r\nimport connectModule from 'diagram-js/lib/features/connect';\r\nimport coreModule from 'lib/core';\r\nimport globalConnectModule from 'diagram-js/lib/features/global-connect';\r\nimport modelingModule from 'lib/features/modeling';\r\nimport rulesModule from 'lib/features/rules';\r\nimport snappingModule from 'lib/features/snapping';\r\n\r\nimport { createCanvasEvent as canvasEvent } from '../../../util/MockEvents';\r\n\r\n\r\ndescribe('features/snapping - BpmnConnectSnapping', function() {\r\n\r\n  var testModules = [\r\n    connectModule,\r\n    coreModule,\r\n    globalConnectModule,\r\n    modelingModule,\r\n    rulesModule,\r\n    snappingModule\r\n  ];\r\n\r\n  var diagramXML = require('./BpmnConnectSnapping.bpmn');\r\n\r\n  beforeEach(bootstrapModeler(diagramXML, {\r\n    modules: testModules\r\n  }));\r\n\r\n  beforeEach(inject(function(dragging) {\r\n    dragging.setOptions({ manual: true });\r\n  }));\r\n\r\n\r\n  describe('sequence flow', function() {\r\n\r\n    describe('boundary event loop', function() {\r\n\r\n      it('should snap left', inject(\r\n        function(connect, dragging, elementRegistry) {\r\n\r\n          // given\r\n          var boundaryEvent = elementRegistry.get('BoundaryEvent_Bottom'),\r\n              subProcess = elementRegistry.get('SubProcess'),\r\n              subProcessGfx = elementRegistry.getGraphics(subProcess);\r\n\r\n          // when\r\n          connect.start(canvasEvent({ x: 590, y: 200 }), boundaryEvent);\r\n\r\n          dragging.hover({ element: subProcess, gfx: subProcessGfx });\r\n\r\n          dragging.move(canvasEvent({ x: 400, y: 115 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          var waypoints = boundaryEvent.outgoing[0].waypoints;\r\n\r\n          expect(waypoints).to.have.length(5);\r\n\r\n          expect(waypoints[ 4 ].original).to.eql({\r\n            x: 420,\r\n            y: 115\r\n          });\r\n        }\r\n      ));\r\n\r\n\r\n      it('should snap bottom (from bottom)', inject(\r\n        function(connect, dragging, elementRegistry) {\r\n\r\n          // given\r\n          var boundaryEvent = elementRegistry.get('BoundaryEvent_Bottom'),\r\n              subProcess = elementRegistry.get('SubProcess'),\r\n              subProcessGfx = elementRegistry.getGraphics(subProcess);\r\n\r\n          // when\r\n          connect.start(canvasEvent({ x: 630, y: 200 }), boundaryEvent);\r\n\r\n          dragging.hover({ element: subProcess, gfx: subProcessGfx });\r\n\r\n          dragging.move(canvasEvent({ x: 580, y: 115 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          var waypoints = boundaryEvent.outgoing[0].waypoints;\r\n\r\n          expect(waypoints).to.have.length(4);\r\n\r\n          expect(waypoints[ 3 ].original).to.eql({\r\n            x: 550,\r\n            y: 115\r\n          });\r\n        }\r\n      ));\r\n\r\n\r\n      it('should snap right', inject(\r\n        function(connect, dragging, elementRegistry) {\r\n\r\n          // given\r\n          var boundaryEvent = elementRegistry.get('BoundaryEvent_Right'),\r\n              subProcess = elementRegistry.get('SubProcess'),\r\n              subProcessGfx = elementRegistry.getGraphics(subProcess);\r\n\r\n          // when\r\n          connect.start(canvasEvent({ x: 760, y: 130 }), boundaryEvent);\r\n\r\n          dragging.hover({ element: subProcess, gfx: subProcessGfx });\r\n\r\n          dragging.move(canvasEvent({ x: 580, y: 115 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          var waypoints = boundaryEvent.outgoing[0].waypoints;\r\n\r\n          expect(waypoints).to.have.length(4);\r\n\r\n          expect(waypoints[ 3 ].original).to.eql({\r\n            x: 580,\r\n            y: 90\r\n          });\r\n        }\r\n      ));\r\n\r\n\r\n      it('should snap bottom (from right)', inject(\r\n        function(connect, dragging, elementRegistry) {\r\n\r\n          // given\r\n          var boundaryEvent = elementRegistry.get('BoundaryEvent_Right'),\r\n              subProcess = elementRegistry.get('SubProcess'),\r\n              subProcessGfx = elementRegistry.getGraphics(subProcess);\r\n\r\n          // when\r\n          connect.start(canvasEvent({ x: 760, y: 130 }), boundaryEvent);\r\n\r\n          dragging.hover({ element: subProcess, gfx: subProcessGfx });\r\n\r\n          dragging.move(canvasEvent({ x: 580, y: 200 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          var waypoints = boundaryEvent.outgoing[0].waypoints;\r\n\r\n          expect(waypoints).to.have.length(5);\r\n\r\n          expect(waypoints[ 4 ].original).to.eql({\r\n            x: 580,\r\n            y: 180\r\n          });\r\n        }\r\n      ));\r\n\r\n    });\r\n\r\n\r\n    describe('activity target', function() {\r\n\r\n      it('should snap to task mid', inject(\r\n        function(connect, dragging, elementRegistry) {\r\n\r\n          // given\r\n          var startEvent = elementRegistry.get('StartEvent_2'),\r\n              task = elementRegistry.get('Task_3'),\r\n              taskGfx = elementRegistry.getGraphics(task);\r\n\r\n          // when\r\n          connect.start(canvasEvent({ x: 80, y: 845 }), startEvent);\r\n\r\n          dragging.hover({ element: task, gfx: taskGfx });\r\n\r\n          dragging.move(canvasEvent({ x: 200, y: 850 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          var waypoints = startEvent.outgoing[0].waypoints;\r\n\r\n          expect(waypoints).to.have.length(2);\r\n\r\n          expect(waypoints[ 1 ].original).to.eql({\r\n            x: 200,\r\n            y: 845\r\n          });\r\n        }\r\n      ));\r\n\r\n\r\n      it('should snap to sub-process mid', inject(\r\n        function(connect, dragging, elementRegistry) {\r\n\r\n          // given\r\n          var startEvent = elementRegistry.get('StartEvent_3'),\r\n              subProcess = elementRegistry.get('SubProcess_1'),\r\n              subProcessGfx = elementRegistry.getGraphics(subProcess);\r\n\r\n          // when\r\n          connect.start(canvasEvent({ x: 80, y: 1025 }), startEvent);\r\n\r\n          dragging.hover({ element: subProcess, gfx: subProcessGfx });\r\n\r\n          dragging.move(canvasEvent({ x: 325, y: 1030 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          var waypoints = startEvent.outgoing[0].waypoints;\r\n\r\n          expect(waypoints).to.have.length(2);\r\n\r\n          expect(waypoints[ 1 ].original).to.eql({\r\n            x: 325,\r\n            y: 1025\r\n          });\r\n        }\r\n      ));\r\n\r\n    });\r\n\r\n\r\n    it('should to snap gateway target mid', inject(\r\n      function(connect, dragging, elementRegistry) {\r\n\r\n        // given\r\n        var startEvent = elementRegistry.get('StartEvent_1'),\r\n            gateway = elementRegistry.get('Gateway_1'),\r\n            gatewayGfx = elementRegistry.getGraphics(gateway);\r\n\r\n        // when\r\n        connect.start(canvasEvent({ x: 80, y: 50 }), startEvent);\r\n\r\n        dragging.hover({ element: gateway, gfx: gatewayGfx });\r\n\r\n        dragging.move(canvasEvent({ x: 255, y: 55 }));\r\n\r\n        dragging.end();\r\n\r\n        // then\r\n        var waypoints = startEvent.outgoing[0].waypoints;\r\n\r\n        expect(waypoints).to.have.length(2);\r\n\r\n        expect(waypoints[ 1 ].original).to.eql({\r\n          x: 250,\r\n          y: 50\r\n        });\r\n      }\r\n    ));\r\n\r\n\r\n    it('should snap to event target mid', inject(\r\n      function(connect, dragging, elementRegistry) {\r\n\r\n        // given\r\n        var startEvent = elementRegistry.get('StartEvent_1'),\r\n            endEvent = elementRegistry.get('EndEvent_1'),\r\n            endEventGfx = elementRegistry.getGraphics(endEvent);\r\n\r\n        // when\r\n        connect.start(canvasEvent({ x: 80, y: 50 }), startEvent);\r\n\r\n        dragging.hover({ element: endEvent, gfx: endEventGfx });\r\n\r\n        dragging.move(canvasEvent({ x: 85, y: 245 }));\r\n\r\n        dragging.end();\r\n\r\n        // then\r\n        var waypoints = startEvent.outgoing[0].waypoints;\r\n\r\n        expect(waypoints).to.have.length(2);\r\n\r\n        expect(waypoints[ 1 ].original).to.eql({\r\n          x: 80,\r\n          y: 240\r\n        });\r\n      }\r\n    ));\r\n\r\n  });\r\n\r\n\r\n  describe('message flow', function() {\r\n\r\n    describe('connect', function() {\r\n\r\n      it('should snap target', inject(function(connect, dragging, elementRegistry) {\r\n\r\n        // given\r\n        var task = elementRegistry.get('Task_1'),\r\n            intermediateCatchEvent = elementRegistry.get('IntermediateCatchEvent_1'),\r\n            intermediateCatchEventGfx = elementRegistry.getGraphics(intermediateCatchEvent);\r\n\r\n        // when\r\n        connect.start(canvasEvent({ x: 250, y: 240 }), task);\r\n\r\n        dragging.hover({ element: intermediateCatchEvent, gfx: intermediateCatchEventGfx });\r\n\r\n        dragging.move(canvasEvent({ x: 185, y: 555 }));\r\n\r\n        dragging.end();\r\n\r\n        // then\r\n        var waypoints = task.outgoing[0].waypoints;\r\n\r\n        expect(waypoints).to.have.length(4);\r\n\r\n        expect(waypoints[ 3 ].original).to.eql({\r\n          x: 180,\r\n          y: 550\r\n        });\r\n      }));\r\n\r\n    });\r\n\r\n\r\n    describe('global connect', function() {\r\n\r\n      it('should snap source', inject(function(connect, dragging, elementRegistry) {\r\n\r\n        // given\r\n        var intermediateThrowEvent = elementRegistry.get('IntermediateThrowEvent_1'),\r\n            task = elementRegistry.get('Task_1'),\r\n            taskGfx = elementRegistry.getGraphics(task);\r\n\r\n        // when\r\n        connect.start(null, intermediateThrowEvent, { x: 75, y: 555 });\r\n\r\n        dragging.hover({ element: task, gfx: taskGfx });\r\n\r\n        dragging.move(canvasEvent({ x: 290, y: 240 }));\r\n\r\n        dragging.end();\r\n\r\n        // then\r\n        var waypoints = intermediateThrowEvent.outgoing[0].waypoints;\r\n\r\n        expect(waypoints).to.have.length(4);\r\n\r\n        expect(waypoints[ 0 ].original).to.eql({\r\n          x: 70,\r\n          y: 550\r\n        });\r\n\r\n        // NOT snapped\r\n        expect(waypoints[ 3 ].original).to.eql({\r\n          x: 290,\r\n          y: 240\r\n        });\r\n      }));\r\n\r\n\r\n      it('should snap target', inject(function(connect, dragging, elementRegistry) {\r\n\r\n        // given\r\n        var task = elementRegistry.get('Task_1'),\r\n            intermediateCatchEvent = elementRegistry.get('IntermediateCatchEvent_1'),\r\n            intermediateCatchEventGfx = elementRegistry.getGraphics(intermediateCatchEvent);\r\n\r\n        // when\r\n        connect.start(null, task, { x: 255, y: 245 });\r\n\r\n        dragging.hover({ element: intermediateCatchEvent, gfx: intermediateCatchEventGfx });\r\n\r\n        dragging.move(canvasEvent({ x: 185, y: 555 }));\r\n\r\n        dragging.end();\r\n\r\n        // then\r\n        var waypoints = task.outgoing[0].waypoints;\r\n\r\n        expect(waypoints).to.have.length(4);\r\n\r\n        // NOT snapped\r\n        expect(waypoints[ 0 ].original).to.eql({\r\n          x: 255,\r\n          y: 245\r\n        });\r\n\r\n        expect(waypoints[ 3 ].original).to.eql({\r\n          x: 180,\r\n          y: 550\r\n        });\r\n      }));\r\n\r\n    });\r\n\r\n  });\r\n\r\n});\r\n"
  },
  {
    "path": "test/spec/features/snapping/BpmnCreateMoveSnapping.boundary-events.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_08wp20a\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.1.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"SubProcess_1\" />\n    <bpmn:task id=\"Task_1\" />\n    <bpmn:boundaryEvent id=\"BoundaryEvent_1\" attachedToRef=\"SubProcess_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"SubProcess_0nmy4dr_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"100\" y=\"100\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_04xg7vj_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"100\" y=\"400\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BoundaryEvent_0oi65v9_di\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds x=\"282\" y=\"282\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/snapping/BpmnCreateMoveSnapping.collaboration.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_0yz080z\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.1.0\">\n  <bpmn:collaboration id=\"Collaboration_1\">\n    <bpmn:participant id=\"Participant_1\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:laneSet id=\"LaneSet_1v4qu8c\">\n      <bpmn:lane id=\"Lane_0asua49\">\n        <bpmn:flowNodeRef>Task_1</bpmn:flowNodeRef>\n      </bpmn:lane>\n      <bpmn:lane id=\"Lane_0thsd04\" />\n    </bpmn:laneSet>\n    <bpmn:task id=\"Task_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1\">\n      <bpmndi:BPMNShape id=\"Participant_1c5vcmc_di\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"100\" y=\"100\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0asua49_di\" bpmnElement=\"Lane_0asua49\" isHorizontal=\"true\">\n        <dc:Bounds x=\"130\" y=\"100\" width=\"570\" height=\"125\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_0thsd04_di\" bpmnElement=\"Lane_0thsd04\" isHorizontal=\"true\">\n        <dc:Bounds x=\"130\" y=\"225\" width=\"570\" height=\"125\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1i9ngbl_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"150\" y=\"125\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/snapping/BpmnCreateMoveSnapping.docking-create-mode.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_0hu8z4u\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.5.0\">\n  <bpmn:process id=\"Process_1t22f8o\" isExecutable=\"true\">\n    <bpmn:task id=\"Task_1\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"Task_1\" targetRef=\"Task_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1t22f8o\">\n      <bpmndi:BPMNShape id=\"Task_1_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"200\" y=\"77\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"250\" y=\"157\" />\n        <di:waypoint x=\"250\" y=\"177\" />\n        <di:waypoint x=\"160\" y=\"177\" />\n        <di:waypoint x=\"160\" y=\"117\" />\n        <di:waypoint x=\"200\" y=\"117\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/snapping/BpmnCreateMoveSnapping.docking-points.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:camunda=\"http://camunda.org/schema/1.0/bpmn\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1u6quyt\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.1.2\">\n  <bpmn:collaboration id=\"Collaboration_1i29mxs\">\n    <bpmn:participant id=\"Participant_1\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Participant_2\" processRef=\"Process_2\" />\n    <bpmn:messageFlow id=\"MessageFlow_1\" sourceRef=\"Task_1\" targetRef=\"Task_2\" />\n    <bpmn:messageFlow id=\"MessageFlow_2\" sourceRef=\"Task_4\" targetRef=\"Task_3\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\" camunda:modelerTemplate=\"test\">\n    <bpmn:extensionElements>\n      <camunda:properties>\n        <camunda:property name=\"Test Property\" value=\"\" />\n      </camunda:properties>\n    </bpmn:extensionElements>\n    <bpmn:task id=\"Task_1\" />\n    <bpmn:task id=\"Task_3\" />\n  </bpmn:process>\n  <bpmn:process id=\"Process_2\" isExecutable=\"false\">\n    <bpmn:task id=\"Task_2\" />\n    <bpmn:task id=\"Task_4\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_1i29mxs\">\n      <bpmndi:BPMNShape id=\"Participant_0ijucrg_di\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"100\" y=\"100\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_1xqykjr_di\" bpmnElement=\"Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"100\" y=\"400\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0hpqryw_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"200\" y=\"200\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0n6qirq_di\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"350\" y=\"500\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_1rs289f_di\" bpmnElement=\"MessageFlow_1\">\n        <di:waypoint x=\"275\" y=\"280\" />\n        <di:waypoint x=\"275\" y=\"380\" />\n        <di:waypoint x=\"400\" y=\"380\" />\n        <di:waypoint x=\"400\" y=\"500\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_09n61pi_di\" bpmnElement=\"Task_3\">\n        <dc:Bounds x=\"400\" y=\"200\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_0zuw5ek_di\" bpmnElement=\"Task_4\">\n        <dc:Bounds x=\"550\" y=\"500\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"MessageFlow_0zxikve_di\" bpmnElement=\"MessageFlow_2\">\n        <di:waypoint x=\"600\" y=\"500\" />\n        <di:waypoint x=\"600\" y=\"390\" />\n        <di:waypoint x=\"480\" y=\"390\" />\n        <di:waypoint x=\"480\" y=\"280\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/snapping/BpmnCreateMoveSnapping.process.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1tk7vec\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.1.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:task id=\"Task_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Task_1mjbupu_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"100\" y=\"100\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/snapping/BpmnCreateMoveSnapping.sequence-flows.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_0o5cz3h\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"3.1.0\">\n  <bpmn:process id=\"Process_0kw81oc\" isExecutable=\"true\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>SequenceFlow_1</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:endEvent id=\"EndEvent_1\">\n      <bpmn:incoming>SequenceFlow_1</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"SequenceFlow_1\" sourceRef=\"StartEvent_1\" targetRef=\"EndEvent_1\" />\n    <bpmn:task id=\"Task_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_0kw81oc\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"82\" y=\"82\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_03zjpp9_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"482\" y=\"82\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1s3hj82_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"118\" y=\"100\" />\n        <di:waypoint x=\"482\" y=\"100\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Task_10kgr65_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"200\" y=\"200\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/snapping/BpmnCreateMoveSnapping.trbl-snapping.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"4.0.0-beta.6\">\n  <collaboration id=\"Collaboration_0802rol\">\n    <participant id=\"PARTICIPANT_1\" name=\"PARTICIPANT_1\" processRef=\"Process_1\" />\n    <participant id=\"PARTICIPANT_2\" name=\"PARTICIPANT_2\" processRef=\"Process_2\" />\n    <textAnnotation id=\"TEXT_1\">\n      <text>TEXT_1</text>\n    </textAnnotation>\n    <textAnnotation id=\"TEXT_2\">\n      <text>TEXT_2</text>\n    </textAnnotation>\n  </collaboration>\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <subProcess id=\"SUB_PROCESS_1\" name=\"SUB_PROCESS_1\">\n      <startEvent id=\"START_EVENT\" />\n    </subProcess>\n    <task id=\"TASK\" name=\"TASK\" />\n  </process>\n  <process id=\"Process_2\" />\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Collaboration_0802rol\">\n      <bpmndi:BPMNShape id=\"PARTICIPANT_1_di\" bpmnElement=\"PARTICIPANT_1\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"160\" y=\"70\" width=\"630\" height=\"340\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"SUB_PROCESS_1_di\" bpmnElement=\"SUB_PROCESS_1\" isExpanded=\"true\">\n        <omgdc:Bounds x=\"250\" y=\"180\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"START_EVENT_di\" bpmnElement=\"START_EVENT\">\n        <omgdc:Bounds x=\"290.3333333333333\" y=\"262\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"PARTICIPANT_2_di\" bpmnElement=\"PARTICIPANT_2\" isHorizontal=\"true\">\n        <omgdc:Bounds x=\"270\" y=\"470\" width=\"480\" height=\"220\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TEXT_1_di\" bpmnElement=\"TEXT_1\">\n        <omgdc:Bounds x=\"840\" y=\"40\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TASK_di\" bpmnElement=\"TASK\">\n        <omgdc:Bounds x=\"650\" y=\"220\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TEXT_2_di\" bpmnElement=\"TEXT_2\">\n        <omgdc:Bounds x=\"810\" y=\"150\" width=\"190\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/features/snapping/BpmnCreateMoveSnappingSpec.js",
    "content": "import {\r\n  bootstrapModeler,\r\n  getBpmnJS,\r\n  inject\r\n} from 'test/TestHelper';\r\n\r\nimport TestContainer from 'mocha-test-container-support';\r\n\r\nimport coreModule from 'lib/core';\r\nimport createModule from 'diagram-js/lib/features/create';\r\nimport modelingModule from 'lib/features/modeling';\r\nimport moveModule from 'diagram-js/lib/features/move';\r\nimport rulesModule from 'lib/features/rules';\r\nimport snappingModule from 'lib/features/snapping';\r\n\r\nimport {\r\n  isSnapped,\r\n  mid\r\n} from 'diagram-js/lib/features/snapping/SnapUtil';\r\n\r\nimport { createCanvasEvent as canvasEvent } from '../../../util/MockEvents';\r\n\r\nimport {\r\n  DEFAULT_LABEL_SIZE,\r\n  getExternalLabelMid\r\n} from 'lib/util/LabelUtil';\r\n\r\nimport { queryAll as domQueryAll } from 'min-dom';\r\n\r\nimport { attr as svgAttr } from 'tiny-svg';\r\n\r\n\r\ndescribe('features/snapping - BpmnCreateMoveSnapping', function() {\r\n\r\n  var testModules = [\r\n    coreModule,\r\n    createModule,\r\n    modelingModule,\r\n    moveModule,\r\n    rulesModule,\r\n    snappingModule,\r\n    {\r\n      __init__: [ function(dragging) {\r\n        dragging.setOptions({ manual: true });\r\n      } ]\r\n    }\r\n  ];\r\n\r\n\r\n  describe('create participant', function() {\r\n\r\n    describe('process', function() {\r\n\r\n      var diagramXML = require('./BpmnCreateMoveSnapping.process.bpmn');\r\n\r\n\r\n      it('should snap participant if constrained', function(done) {\r\n\r\n        bootstrapModeler(diagramXML, {\r\n          container: TestContainer.get(this),\r\n          modules: testModules\r\n        })().then(function() {\r\n\r\n          // when\r\n          inject(function(canvas, create, dragging, elementFactory, eventBus) {\r\n\r\n            // given\r\n            dragging.setOptions({ manual: true });\r\n\r\n            var participantShape = elementFactory.createParticipantShape(false),\r\n                rootElement = canvas.getRootElement(),\r\n                rootGfx = canvas.getGraphics(rootElement);\r\n\r\n            create.start(canvasEvent({ x: 0, y: 0 }), participantShape);\r\n\r\n            dragging.hover({ element: rootElement, gfx: rootGfx });\r\n\r\n            eventBus.once('create.move', function(event) {\r\n\r\n              // then\r\n              // expect snapped to avoid snapping outside of constraints\r\n              expect(isSnapped(event)).to.be.true;\r\n\r\n              done();\r\n            });\r\n\r\n            // when\r\n            dragging.move(canvasEvent({ x: 1000, y: 1000 }));\r\n          })();\r\n\r\n        });\r\n\r\n      });\r\n\r\n    });\r\n\r\n\r\n    describe('collaboration', function() {\r\n\r\n      var diagramXML = require('./BpmnCreateMoveSnapping.collaboration.bpmn');\r\n\r\n\r\n      it('should snap to participant border with higher priority', function(done) {\r\n\r\n        var container = TestContainer.get(this);\r\n\r\n        bootstrapModeler(diagramXML, {\r\n          container: container,\r\n          modules: testModules\r\n        })().then(function() {\r\n\r\n          // when\r\n          inject(function(create, dragging, elementFactory, elementRegistry, eventBus) {\r\n\r\n            // given\r\n            dragging.setOptions({ manual: true });\r\n\r\n            var participant = elementFactory.createParticipantShape(false),\r\n                collaboration = elementRegistry.get('Collaboration_1'),\r\n                collaborationGfx = elementRegistry.getGraphics(collaboration);\r\n\r\n            create.start(canvasEvent({ x: 0, y: 0 }), participant);\r\n\r\n            dragging.hover({ element: collaboration, gfx: collaborationGfx });\r\n\r\n            dragging.move(canvasEventTopLeft({ x: 0, y: 0 }, participant));\r\n\r\n            eventBus.once('create.move', function(event) {\r\n\r\n              // then\r\n              // expect snap line at left border of participant\r\n              expect(svgAttr(domQueryAll('.djs-snap-line', container)[1], 'd'))\r\n                .to.equal('M 100,-100000 L 100, +100000');\r\n\r\n              done();\r\n            });\r\n\r\n            // when\r\n            dragging.move(canvasEventTopLeft({ x: 95, y: 400 }, participant));\r\n          })();\r\n\r\n        });\r\n\r\n      });\r\n\r\n    });\r\n\r\n  });\r\n\r\n\r\n  describe('boundary events', function() {\r\n\r\n    describe('creating boundary event', function() {\r\n\r\n      var diagramXML = require('./BpmnCreateMoveSnapping.process.bpmn');\r\n\r\n      beforeEach(bootstrapModeler(diagramXML, {\r\n        modules: testModules\r\n      }));\r\n\r\n      var task, taskGfx, intermediateThrowEvent;\r\n\r\n\r\n      describe('without label', function() {\r\n\r\n        beforeEach(inject(function(create, dragging, elementRegistry, elementFactory) {\r\n          task = elementRegistry.get('Task_1');\r\n\r\n          taskGfx = elementRegistry.getGraphics(task);\r\n\r\n          intermediateThrowEvent = elementFactory.createShape({\r\n            type: 'bpmn:IntermediateThrowEvent'\r\n          });\r\n\r\n          create.start(canvasEvent({ x: 0, y: 0 }), intermediateThrowEvent);\r\n\r\n          dragging.hover({ element: task, gfx: taskGfx });\r\n        }));\r\n\r\n\r\n        it('should snap to top', inject(function(dragging) {\r\n\r\n          // when\r\n          dragging.move(canvasEvent({ x: 150, y: 95 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          var boundaryEvent = getBoundaryEvent(task);\r\n\r\n          expect(mid(boundaryEvent)).to.eql({\r\n            x: 150,\r\n            y: 100 // 95 snapped to 100\r\n          });\r\n        }));\r\n\r\n\r\n        it('should snap to right', inject(function(dragging) {\r\n\r\n          // when\r\n          dragging.move(canvasEvent({ x: 195, y: 140 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          var boundaryEvent = getBoundaryEvent(task);\r\n\r\n          expect(mid(boundaryEvent)).to.eql({\r\n            x: 200, // 195 snapped to 200\r\n            y: 140\r\n          });\r\n        }));\r\n\r\n\r\n        it('should snap to bottom', inject(function(dragging) {\r\n\r\n          // when\r\n          dragging.move(canvasEvent({ x: 150, y: 175 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          var boundaryEvent = getBoundaryEvent(task);\r\n\r\n          expect(mid(boundaryEvent)).to.eql({\r\n            x: 150,\r\n            y: 180 // 175 snapped to 180\r\n          });\r\n        }));\r\n\r\n\r\n        it('should snap to left', inject(function(dragging) {\r\n\r\n          // when\r\n          dragging.move(canvasEvent({ x: 95, y: 140 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          var boundaryEvent = getBoundaryEvent(task);\r\n\r\n          expect(mid(boundaryEvent)).to.eql({\r\n            x: 100, // 95 snapped to 100\r\n            y: 140\r\n          });\r\n        }));\r\n      });\r\n\r\n\r\n      describe('with label', function() {\r\n\r\n        beforeEach(inject(function(\r\n            bpmnFactory,\r\n            create,\r\n            dragging,\r\n            elementFactory,\r\n            elementRegistry,\r\n            textRenderer\r\n        ) {\r\n          task = elementRegistry.get('Task_1');\r\n\r\n          taskGfx = elementRegistry.getGraphics(task);\r\n\r\n          intermediateThrowEvent = elementFactory.createShape({\r\n            businessObject: bpmnFactory.create('bpmn:IntermediateThrowEvent', {\r\n              name: 'Foo'\r\n            }),\r\n            type: 'bpmn:IntermediateThrowEvent',\r\n            x: 0,\r\n            y: 0\r\n          });\r\n\r\n          var externalLabelMid = getExternalLabelMid(intermediateThrowEvent);\r\n\r\n          var externalLabelBounds = textRenderer.getExternalLabelBounds(DEFAULT_LABEL_SIZE, 'Foo');\r\n\r\n          var label = elementFactory.createLabel({\r\n            labelTarget: intermediateThrowEvent,\r\n            x: externalLabelMid.x - externalLabelBounds.width / 2,\r\n            y: externalLabelMid.y - externalLabelBounds.height / 2,\r\n            width: externalLabelBounds.width,\r\n            height: externalLabelBounds.height,\r\n            businessObject: intermediateThrowEvent.businessObject\r\n          });\r\n\r\n          create.start(canvasEvent({ x: 0, y: 0 }), [ intermediateThrowEvent, label ]);\r\n\r\n          dragging.hover({ element: task, gfx: taskGfx });\r\n        }));\r\n\r\n\r\n        it('should snap to top-left', inject(function(dragging) {\r\n\r\n          // when\r\n          dragging.move(canvasEvent({ x: 90, y: 95 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          var boundaryEvent = getBoundaryEvent(task);\r\n\r\n          expect(mid(boundaryEvent)).to.eql({\r\n            x: 100, // 90 snapped to 100\r\n            y: 100 // 95 snapped to 100\r\n          });\r\n        }));\r\n\r\n\r\n        it('should snap to top-right', inject(function(dragging) {\r\n\r\n          // when\r\n          dragging.move(canvasEvent({ x: 210, y: 95 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          var boundaryEvent = getBoundaryEvent(task);\r\n\r\n          expect(mid(boundaryEvent)).to.eql({\r\n            x: 200, // 210 snapped to 200\r\n            y: 100 // 95 snapped to 100\r\n          });\r\n        }));\r\n\r\n\r\n        it('should snap to bottom-left', inject(function(dragging) {\r\n\r\n          // when\r\n          dragging.move(canvasEvent({ x: 90, y: 190 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          var boundaryEvent = getBoundaryEvent(task);\r\n\r\n          expect(mid(boundaryEvent)).to.eql({\r\n            x: 100, // 90 snapped to 100\r\n            y: 180 // 190 snapped to 180\r\n          });\r\n        }));\r\n\r\n\r\n        it('should snap to bottom-right', inject(function(dragging) {\r\n\r\n          // when\r\n          dragging.move(canvasEvent({ x: 210, y: 190 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          var boundaryEvent = getBoundaryEvent(task);\r\n\r\n          expect(mid(boundaryEvent)).to.eql({\r\n            x: 200, // 210 snapped to 200\r\n            y: 180 // 190 snapped to 180\r\n          });\r\n        }));\r\n      });\r\n\r\n    });\r\n\r\n\r\n    describe('snapping to boundary events', function() {\r\n\r\n      var diagramXML = require('./BpmnCreateMoveSnapping.boundary-events.bpmn');\r\n\r\n      beforeEach(bootstrapModeler(diagramXML, {\r\n        modules: testModules\r\n      }));\r\n\r\n      var task;\r\n\r\n      beforeEach(inject(function(dragging, elementRegistry, move) {\r\n        task = elementRegistry.get('Task_1');\r\n\r\n        var process = elementRegistry.get('Process_1'),\r\n            processGfx = elementRegistry.getGraphics(process);\r\n\r\n        move.start(canvasEventTopLeft({ x: 100, y: 400 }, task), task, true);\r\n\r\n        dragging.hover({ element: process, gfx: processGfx });\r\n\r\n        dragging.move(canvasEventTopLeft({ x: 100, y: 400 }, task));\r\n      }));\r\n\r\n\r\n      it('should snap to boundary events', inject(function(dragging) {\r\n\r\n        // when\r\n        dragging.move(canvasEventTopLeft({ x: 245, y: 400 }, task));\r\n\r\n        dragging.end();\r\n\r\n        // then\r\n        expect(task).to.have.bounds({\r\n          x: 250, // 245 snapped to 250\r\n          y: 400,\r\n          width: 100,\r\n          height: 80\r\n        });\r\n      }));\r\n\r\n    });\r\n\r\n  });\r\n\r\n\r\n  describe('sequence flows', function() {\r\n\r\n    var diagramXML = require('./BpmnCreateMoveSnapping.sequence-flows.bpmn');\r\n\r\n    beforeEach(bootstrapModeler(diagramXML, {\r\n      modules: testModules\r\n    }));\r\n\r\n    var sequenceFlow, sequenceFlowGfx, task;\r\n\r\n    beforeEach(inject(function(create, dragging, elementRegistry, elementFactory) {\r\n      sequenceFlow = elementRegistry.get('SequenceFlow_1');\r\n      sequenceFlowGfx = elementRegistry.getGraphics(sequenceFlow);\r\n\r\n      task = elementFactory.createShape({\r\n        type: 'bpmn:Task'\r\n      });\r\n\r\n      create.start(canvasEvent({ x: 0, y: 0 }), task);\r\n\r\n      dragging.hover({ element: sequenceFlow, gfx: sequenceFlowGfx });\r\n    }));\r\n\r\n\r\n    it('should add snap targets of sequence flow parent', inject(function(dragging) {\r\n\r\n      // when\r\n      dragging.move(canvasEventTopLeft({ x: 195, y: 60 }, task));\r\n\r\n      dragging.end();\r\n\r\n      // then\r\n      expect(task).to.have.bounds({\r\n        x: 200, // 195 snapped to 200\r\n        y: 60,\r\n        width: 100,\r\n        height: 80\r\n      });\r\n    }));\r\n\r\n  });\r\n\r\n\r\n  describe('lanes', function() {\r\n\r\n    var diagramXML = require('./BpmnCreateMoveSnapping.collaboration.bpmn');\r\n\r\n    beforeEach(bootstrapModeler(diagramXML, {\r\n      modules: testModules\r\n    }));\r\n\r\n    var task;\r\n\r\n    beforeEach(inject(function(dragging, elementRegistry, move) {\r\n      task = elementRegistry.get('Task_1');\r\n\r\n      move.start(canvasEvent({ x: 200, y: 165 }), task);\r\n    }));\r\n\r\n\r\n    it('should should NOT snap to lanes', inject(function(dragging) {\r\n\r\n      // when\r\n      // lane mid is { x: 415, y: 162.5 }\r\n      dragging.move(canvasEvent({ x: 410, y: 160 }));\r\n\r\n      dragging.end();\r\n\r\n      // then\r\n      expect(task).to.have.bounds({\r\n        x: 360,\r\n        y: 120,\r\n        width: 100,\r\n        height: 80\r\n      });\r\n    }));\r\n\r\n  });\r\n\r\n\r\n  describe('docking points', function() {\r\n\r\n    describe('move mode', function() {\r\n\r\n      var diagramXML = require('./BpmnCreateMoveSnapping.docking-points.bpmn');\r\n\r\n      beforeEach(bootstrapModeler(diagramXML, {\r\n        modules: testModules\r\n      }));\r\n\r\n      var participant,\r\n          participantGfx;\r\n\r\n      beforeEach(inject(function(dragging, elementRegistry, move) {\r\n        participant = elementRegistry.get('Participant_2');\r\n        participantGfx = elementRegistry.getGraphics(participant);\r\n      }));\r\n\r\n      it('should snap to docking point (incoming connections)', inject(\r\n        function(dragging, elementRegistry, move) {\r\n\r\n          // given\r\n          var task = elementRegistry.get('Task_2');\r\n\r\n          move.start(canvasEvent({ x: 400, y: 540 }), task);\r\n\r\n          dragging.hover({ element: participant, gfx: participantGfx });\r\n\r\n          dragging.move(canvasEvent({ x: 0, y: 0 }));\r\n\r\n          // when\r\n          dragging.move(canvasEvent({ x: 270, y: 540 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          expect(mid(task)).to.eql({\r\n            x: 275,\r\n            y: 540\r\n          });\r\n        }\r\n      ));\r\n\r\n\r\n      it('should snap to docking point (outgoing connections)', inject(\r\n        function(dragging, elementRegistry, move) {\r\n\r\n          // given\r\n          var task = elementRegistry.get('Task_4');\r\n\r\n          move.start(canvasEvent({ x: 600, y: 540 }), task);\r\n\r\n          dragging.hover({ element: participant, gfx: participantGfx });\r\n\r\n          dragging.move(canvasEvent({ x: 0, y: 0 }));\r\n\r\n          // when\r\n          dragging.move(canvasEvent({ x: 475, y: 540 }));\r\n\r\n          dragging.end();\r\n\r\n          // then\r\n          expect(mid(task)).to.eql({\r\n            x: 480,\r\n            y: 540\r\n          });\r\n        }\r\n      ));\r\n    });\r\n\r\n\r\n    describe('create mode', function() {\r\n\r\n      var diagramXML = require('./BpmnCreateMoveSnapping.docking-create-mode.bpmn');\r\n\r\n\r\n      beforeEach(bootstrapModeler(diagramXML, {\r\n        modules: testModules\r\n      }));\r\n\r\n\r\n      it('should correctly set snap origins', inject(\r\n        function(elementRegistry, copyPaste, eventBus) {\r\n\r\n          // given\r\n          var task1 = elementRegistry.get('Task_1');\r\n\r\n          var startListener = sinon.spy(function(event) {\r\n\r\n            var snapContext = event.context.snapContext;\r\n            var snapLocations = snapContext.getSnapLocations();\r\n            var sequenceFlowSnapOrigin = snapContext.getSnapOrigin(snapLocations[3]);\r\n\r\n            // then\r\n            expect(sequenceFlowSnapOrigin.x).to.be.eql(-30);\r\n            expect(sequenceFlowSnapOrigin.y).to.be.eql(-10);\r\n          });\r\n\r\n          eventBus.on('create.start', startListener);\r\n\r\n          // when\r\n          copyPaste.copy(task1);\r\n          copyPaste.paste();\r\n\r\n          // then\r\n          expect(startListener).to.have.been.called;\r\n        }\r\n      ));\r\n\r\n    });\r\n\r\n  });\r\n\r\n\r\n  describe('TRBL snapping', function() {\r\n\r\n    var diagramXML = require('./BpmnCreateMoveSnapping.trbl-snapping.bpmn');\r\n\r\n    beforeEach(bootstrapModeler(diagramXML, {\r\n      modules: testModules\r\n    }));\r\n\r\n\r\n    function get(element) {\r\n      return getBpmnJS().invoke(function(elementRegistry) {\r\n        return elementRegistry.get(element);\r\n      });\r\n    }\r\n\r\n    function absoluteMove(element, toPosition) {\r\n\r\n      getBpmnJS().invoke(function(elementRegistry, move, dragging, canvas) {\r\n\r\n        var parent = element.parent;\r\n\r\n        move.start(canvasEvent({ x: 0, y: 0 }), element);\r\n\r\n        dragging.hover({\r\n          element: parent,\r\n          gfx: canvas.getGraphics(parent)\r\n        });\r\n\r\n        dragging.move(canvasEvent({ x: 100, y: 100 }), element);\r\n\r\n        dragging.move(canvasEvent({\r\n          x: toPosition.x - element.x,\r\n          y: toPosition.y - element.y\r\n        }));\r\n\r\n        dragging.end();\r\n      });\r\n\r\n    }\r\n\r\n\r\n    it('should snap text annotations', function() {\r\n\r\n      // given\r\n      var annotation = get('TEXT_1');\r\n      var otherAnnotation = get('TEXT_2');\r\n\r\n      // when\r\n      absoluteMove(annotation, {\r\n        x: otherAnnotation.x + 5,\r\n        y: otherAnnotation.y - 5\r\n      });\r\n\r\n      // then\r\n      expect(annotation).to.have.position(otherAnnotation);\r\n    });\r\n\r\n\r\n    it('should snap task to container', function() {\r\n\r\n      // given\r\n      var task = get('TASK');\r\n      var subProcess = get('SUB_PROCESS_1');\r\n\r\n      // when\r\n      absoluteMove(task, {\r\n        x: subProcess.x,\r\n        y: subProcess.y - 5\r\n      });\r\n\r\n      // then\r\n      expect(task).to.have.position(subProcess);\r\n    });\r\n\r\n\r\n    it('should snap container to container', function() {\r\n\r\n      // given\r\n      var participant = get('PARTICIPANT_1');\r\n      var otherParticipant = get('PARTICIPANT_2');\r\n\r\n      // when\r\n      absoluteMove(participant, {\r\n        x: otherParticipant.x + 5,\r\n        y: otherParticipant.y\r\n      });\r\n\r\n      // then\r\n      expect(participant).to.have.position(otherParticipant);\r\n    });\r\n\r\n\r\n    it('should snap container to container right', function() {\r\n\r\n      // given\r\n      var participant = get('PARTICIPANT_1');\r\n      var otherParticipant = get('PARTICIPANT_2');\r\n\r\n      // when\r\n      absoluteMove(participant, {\r\n        x: otherParticipant.x + otherParticipant.width - participant.width + 5,\r\n        y: 5\r\n      });\r\n\r\n      // then\r\n      expect(participant).to.have.position({\r\n        x: otherParticipant.x + otherParticipant.width - participant.width,\r\n        y: 5\r\n      });\r\n\r\n    });\r\n\r\n  });\r\n\r\n});\r\n\r\n// helpers //////////\r\n\r\nfunction canvasEventTopLeft(position, shape) {\r\n  return canvasEvent({\r\n    x: position.x + shape.width / 2,\r\n    y: position.y + shape.height / 2\r\n  });\r\n}\r\n\r\nfunction getBoundaryEvent(element) {\r\n  return element.attachers[0];\r\n}\r\n"
  },
  {
    "path": "test/spec/features/space-tool/BpmnSpaceTool.artifacts.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_14kk48y\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.32.0-rc.0\">\n  <bpmn:collaboration id=\"COLLABORATION\">\n    <bpmn:participant id=\"PARTICIPANT\" name=\"PARTICIPANT\" processRef=\"PROCESS\" />\n    <bpmn:textAnnotation id=\"ANNOTATION_1\">\n      <bpmn:text>ANNOTATION_1</bpmn:text>\n    </bpmn:textAnnotation>\n    <bpmn:textAnnotation id=\"ANNOTATION_3\">\n      <bpmn:text>ANNOTATION_3</bpmn:text>\n    </bpmn:textAnnotation>\n    <bpmn:textAnnotation id=\"ANNOTATION_2\">\n      <bpmn:text>ANNOTATION_2</bpmn:text>\n    </bpmn:textAnnotation>\n    <bpmn:group id=\"GROUP_CONTAINED_PARTICIPANT\" categoryValueRef=\"CategoryValue_1fn4md7\" />\n    <bpmn:group id=\"GROUP_OUTSIDE\" categoryValueRef=\"CategoryValue_0w429b8\" />\n    <bpmn:group id=\"GROUP_CONTAINED_SUB\" categoryValueRef=\"CategoryValue_0l3p581\" />\n    <bpmn:textAnnotation id=\"ANNOTATION_4\">\n      <bpmn:text>ANNOTATION_4</bpmn:text>\n    </bpmn:textAnnotation>\n    <bpmn:association id=\"Association_1iiawtv\" associationDirection=\"None\" sourceRef=\"ANNOTATION_4\" targetRef=\"GROUP_CONTAINED_SUB\" />\n    <bpmn:association id=\"Association_180iz30\" associationDirection=\"None\" sourceRef=\"TASK\" targetRef=\"ANNOTATION_1\" />\n    <bpmn:association id=\"Association_08csipe\" associationDirection=\"None\" sourceRef=\"TASK\" targetRef=\"ANNOTATION_3\" />\n    <bpmn:textAnnotation id=\"ANNOTATION_5\">\n      <bpmn:text>ANNOTATION_5</bpmn:text>\n    </bpmn:textAnnotation>\n    <bpmn:group id=\"GROUP_OUTSIDE_SUB\" categoryValueRef=\"CategoryValue_1rcl2uo\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"PROCESS\" isExecutable=\"false\">\n    <bpmn:laneSet id=\"LaneSet_04jep3i\" />\n    <bpmn:task id=\"TASK\" name=\"TASK\" />\n    <bpmn:subProcess id=\"SUB\" name=\"SUB\" />\n  </bpmn:process>\n  <bpmn:category id=\"Category_0tto0k6\">\n    <bpmn:categoryValue id=\"CategoryValue_1fn4md7\" value=\"GROUP_CONTAINED_PARTICIPANT\" />\n  </bpmn:category>\n  <bpmn:category id=\"Category_002evdo\">\n    <bpmn:categoryValue id=\"CategoryValue_0w429b8\" value=\"GROUP_OUTSIDE\" />\n  </bpmn:category>\n  <bpmn:category id=\"Category_1u7ocho\">\n    <bpmn:categoryValue id=\"CategoryValue_0l3p581\" value=\"GROUP_CONTAINED_SUB\" />\n  </bpmn:category>\n  <bpmn:category id=\"Category_00robw0\">\n    <bpmn:categoryValue id=\"CategoryValue_1rcl2uo\" value=\"GROUP_OUTSIDE_SUB\" />\n  </bpmn:category>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"COLLABORATION\">\n      <bpmndi:BPMNShape id=\"Participant_0lm71nu_di\" bpmnElement=\"PARTICIPANT\" isHorizontal=\"true\">\n        <dc:Bounds x=\"160\" y=\"130\" width=\"900\" height=\"420\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1g8l8sp_di\" bpmnElement=\"TASK\">\n        <dc:Bounds x=\"280\" y=\"280\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1mtvx36_di\" bpmnElement=\"SUB\" isExpanded=\"true\">\n        <dc:Bounds x=\"650\" y=\"200\" width=\"350\" height=\"280\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_180iz30_di\" bpmnElement=\"Association_180iz30\">\n        <di:waypoint x=\"379\" y=\"287\" />\n        <di:waypoint x=\"494\" y=\"209\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Association_08csipe_di\" bpmnElement=\"Association_08csipe\">\n        <di:waypoint x=\"336\" y=\"360\" />\n        <di:waypoint x=\"378\" y=\"650\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Association_1iiawtv_di\" bpmnElement=\"Association_1iiawtv\">\n        <di:waypoint x=\"869\" y=\"410\" />\n        <di:waypoint x=\"850\" y=\"360\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"TextAnnotation_0kurhwc_di\" bpmnElement=\"ANNOTATION_1\">\n        <dc:Bounds x=\"470\" y=\"170\" width=\"109.99999237060547\" height=\"39\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_1vsrf4d\" bpmnElement=\"ANNOTATION_2\">\n        <dc:Bounds x=\"450\" y=\"430\" width=\"110\" height=\"41\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_1q5j3c0_di\" bpmnElement=\"GROUP_CONTAINED_PARTICIPANT\">\n        <dc:Bounds x=\"240\" y=\"190\" width=\"170\" height=\"220\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"282\" y=\"197\" width=\"88\" height=\"40\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0m8gbmr\" bpmnElement=\"GROUP_OUTSIDE\">\n        <dc:Bounds x=\"210\" y=\"80\" width=\"370\" height=\"500\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"355\" y=\"87\" width=\"80\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"TextAnnotation_0r40zjh_di\" bpmnElement=\"ANNOTATION_3\">\n        <dc:Bounds x=\"330\" y=\"650\" width=\"110\" height=\"41\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_0887xry_di\" bpmnElement=\"GROUP_CONTAINED_SUB\">\n        <dc:Bounds x=\"690\" y=\"240\" width=\"200\" height=\"120\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"748\" y=\"247\" width=\"85\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0hnq4f9\" bpmnElement=\"ANNOTATION_4\">\n        <dc:Bounds x=\"820\" y=\"410\" width=\"110\" height=\"30\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_0m4uhit_di\" bpmnElement=\"GROUP_OUTSIDE_SUB\">\n        <dc:Bounds x=\"725\" y=\"140\" width=\"300\" height=\"390\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"837\" y=\"147\" width=\"80\" height=\"27\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_0t9rdue\" bpmnElement=\"ANNOTATION_5\">\n        <dc:Bounds x=\"870\" y=\"490\" width=\"109.99999237060547\" height=\"25.999998092651367\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/space-tool/BpmnSpaceTool.basics.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"simple\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.4.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:subProcess id=\"SubProcess_1\">\n      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n      <bpmn2:startEvent id=\"StartEvent_2\" name=\"foo\">\n        <bpmn2:outgoing>SequenceFlow_3</bpmn2:outgoing>\n      </bpmn2:startEvent>\n      <bpmn2:task id=\"Task_1\">\n        <bpmn2:incoming>SequenceFlow_3</bpmn2:incoming>\n        <bpmn2:outgoing>SequenceFlow_4</bpmn2:outgoing>\n      </bpmn2:task>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_3\" name=\"bar\" sourceRef=\"StartEvent_2\" targetRef=\"Task_1\" />\n      <bpmn2:endEvent id=\"EndEvent_2\" name=\"foo\">\n        <bpmn2:incoming>SequenceFlow_4</bpmn2:incoming>\n      </bpmn2:endEvent>\n      <bpmn2:sequenceFlow id=\"SequenceFlow_4\" name=\"bar\" sourceRef=\"Task_1\" targetRef=\"EndEvent_2\" />\n    </bpmn2:subProcess>\n    <bpmn2:startEvent id=\"StartEvent_1\" name=\"foo\">\n      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_1\" name=\"bar\" sourceRef=\"StartEvent_1\" targetRef=\"SubProcess_1\" />\n    <bpmn2:endEvent id=\"EndEvent_1\" name=\"foo\">\n      <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_2\" name=\"bar\" sourceRef=\"SubProcess_1\" targetRef=\"EndEvent_1\" />\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNEdge id=\"Flow_1vn4mer_di\" bpmnElement=\"SequenceFlow_2\">\n        <di:waypoint x=\"610\" y=\"240\" />\n        <di:waypoint x=\"662\" y=\"240\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"628\" y=\"222\" width=\"17\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_148nxsh_di\" bpmnElement=\"SequenceFlow_1\">\n        <di:waypoint x=\"188\" y=\"240\" />\n        <di:waypoint x=\"240\" y=\"240\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"206\" y=\"222\" width=\"17\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Activity_0zkduw3_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"240\" y=\"140\" width=\"370\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1qugtmw_di\" bpmnElement=\"SequenceFlow_4\">\n        <di:waypoint x=\"470\" y=\"240\" />\n        <di:waypoint x=\"532\" y=\"240\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"493\" y=\"222\" width=\"17\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_01o445e_di\" bpmnElement=\"SequenceFlow_3\">\n        <di:waypoint x=\"316\" y=\"240\" />\n        <di:waypoint x=\"370\" y=\"240\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"335\" y=\"222\" width=\"17\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Event_0inmegp_di\" bpmnElement=\"StartEvent_2\">\n        <dc:Bounds x=\"280\" y=\"222\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"290\" y=\"265\" width=\"16\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_10wolm0_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"370\" y=\"200\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_05z1uqy_di\" bpmnElement=\"EndEvent_2\">\n        <dc:Bounds x=\"532\" y=\"222\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"542\" y=\"265\" width=\"16\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0fibly7_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"152\" y=\"222\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"162\" y=\"265\" width=\"16\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_11rvkx1_di\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds x=\"662\" y=\"222\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"672\" y=\"265\" width=\"16\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/features/space-tool/BpmnSpaceTool.boundary-events.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_068qmqg\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.8.1\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.15.0\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"SubProcess_1\" name=\"SubProcess_1\">\n      <bpmn:task id=\"Task_1\" name=\"Task_1\" />\n      <bpmn:boundaryEvent id=\"BoundaryEvent_1\" name=\"BoundaryEvent_1\" attachedToRef=\"Task_1\" />\n    </bpmn:subProcess>\n    <bpmn:boundaryEvent id=\"BoundaryEvent_2\" name=\"BoundaryEvent_2\" attachedToRef=\"SubProcess_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Activity_0w17tde_di\" bpmnElement=\"SubProcess_1\" isExpanded=\"true\">\n        <dc:Bounds x=\"160\" y=\"77\" width=\"350\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_171vv0l_di\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"280\" y=\"137\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0a6i1ev_di\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds x=\"362\" y=\"199\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"336\" y=\"242\" width=\"88\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0tfh977_di\" bpmnElement=\"BoundaryEvent_2\">\n        <dc:Bounds x=\"492\" y=\"259\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"466\" y=\"302\" width=\"88\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/space-tool/BpmnSpaceTool.participants.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_14kk48y\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.12.1\">\n  <bpmn:collaboration id=\"Collaboration_0ci7cuj\">\n    <bpmn:participant id=\"Participant_1\" name=\"Expanded Pool\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Participant_2\" name=\"Empty Pool\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\" />\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_0ci7cuj\">\n      <bpmndi:BPMNShape id=\"Participant_0f6z5qz_di\" bpmnElement=\"Participant_1\" isHorizontal=\"true\">\n        <dc:Bounds x=\"160\" y=\"80\" width=\"600\" height=\"60\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_1pw3o1x_di\" bpmnElement=\"Participant_2\" isHorizontal=\"true\">\n        <dc:Bounds x=\"160\" y=\"170\" width=\"600\" height=\"60\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/space-tool/BpmnSpaceTool.text-annotations.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_0wbg8s4\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.0.0-alpha.1\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"true\">\n    <bpmn:startEvent id=\"StartEvent_1\" />\n    <bpmn:textAnnotation id=\"TextAnnotation_1\">\n      <bpmn:text>Foo bar baz</bpmn:text>\n    </bpmn:textAnnotation>\n    <bpmn:association id=\"Association_1\" sourceRef=\"StartEvent_1\" targetRef=\"TextAnnotation_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"TextAnnotation_1pqsx76_di\" bpmnElement=\"TextAnnotation_1\">\n        <dc:Bounds x=\"220\" y=\"70\" width=\"100\" height=\"30\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"179\" y=\"159\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_08o03bb_di\" bpmnElement=\"Association_1\">\n        <di:waypoint x=\"208\" y=\"163\" />\n        <di:waypoint x=\"258\" y=\"100\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/features/space-tool/BpmnSpaceToolSpec.js",
    "content": "import {\n  bootstrapModeler,\n  getBpmnJS,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\nimport rulesModule from 'lib/features/rules';\nimport snappingModule from 'lib/features/snapping';\nimport spaceToolModule from 'lib/features/space-tool';\n\nimport { createCanvasEvent as canvasEvent } from '../../../util/MockEvents';\n\nimport { getMid } from 'diagram-js/lib/layout/LayoutUtil';\n\nimport { isString, pick } from 'min-dash';\n\nimport { isMac } from 'diagram-js/lib/util/Platform';\n\nvar invertModifier = isMac() ? { metaKey: true } : { ctrlKey: true };\n\n\ndescribe('features/space-tool - BpmnSpaceTool', function() {\n\n  // adopt conservative retry strategy\n  // in an attempt to improve the stability\n  // of our test suite\n  this.retries(2);\n\n\n  var testModules = [\n    coreModule,\n    modelingModule,\n    rulesModule,\n    snappingModule,\n    spaceToolModule\n  ];\n\n\n  describe('basics', function() {\n\n    var diagramXML = require('./BpmnSpaceTool.basics.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n    beforeEach(inject(function(dragging) {\n      dragging.setOptions({ manual: true });\n    }));\n\n\n    describe('add space', function() {\n\n      it('should add space top', inject(function() {\n\n        // given\n        var subProcess1 = $element('SubProcess_1');\n\n        var subProcess1Bounds = getBounds(subProcess1);\n\n        // when\n        makeSpace({ x: 420, y: 240 }, { dy: -100 }, true);\n\n        // then\n        expect(subProcess1).to.have.bounds({\n          x: subProcess1Bounds.x,\n          y: subProcess1Bounds.y - 100,\n          width: subProcess1Bounds.width,\n          height: subProcess1Bounds.height + 100\n        });\n      }));\n\n\n      it('should add space right', inject(function() {\n\n        // given\n        var endEvent1 = $element('EndEvent_1'),\n            endEvent2 = $element('EndEvent_2'),\n            endEvent1Label = endEvent1.label,\n            endEvent2Label = endEvent2.label,\n            sequenceFlow2 = $element('SequenceFlow_2'),\n            sequenceFlow4 = $element('SequenceFlow_4'),\n            subProcess1 = $element('SubProcess_1');\n\n        var endEvent1Mid = getMid(endEvent1),\n            endEvent2Mid = getMid(endEvent2),\n            endEvent1LabelMid = getMid(endEvent1Label),\n            endEvent2LabelMid = getMid(endEvent2Label),\n            sequenceFlow2Waypoints = sequenceFlow2.waypoints.slice(),\n            sequenceFlow4Waypoints = sequenceFlow4.waypoints.slice(),\n            subProcess1Bounds = getBounds(subProcess1);\n\n        // when\n        makeSpace({ x: 420, y: 240 }, { dx: 100 });\n\n        // then\n        expect(getMid(endEvent1)).to.eql({\n          x: endEvent1Mid.x + 100,\n          y: endEvent1Mid.y\n        });\n\n        expect(getMid(endEvent2)).to.eql({\n          x: endEvent2Mid.x + 100,\n          y: endEvent2Mid.y\n        });\n\n        expect(getMid(endEvent1Label)).to.eql({\n          x: endEvent1LabelMid.x + 100,\n          y: endEvent1LabelMid.y\n        });\n\n        expect(getMid(endEvent2Label).x).to.be.closeTo(650, 1); // Label position was adjusted\n        expect(getMid(endEvent2Label).y).to.equal(endEvent2LabelMid.y);\n\n        expect(sequenceFlow2.waypoints[ 0 ]).to.include({ x: sequenceFlow2Waypoints[ 0 ].x + 100, y: 240 });\n        expect(sequenceFlow2.waypoints[ 1 ]).to.include({ x: sequenceFlow2Waypoints[ 1 ].x + 100, y: 240 });\n\n        expect(sequenceFlow4.waypoints[ 0 ]).to.include({ x: sequenceFlow4Waypoints[ 0 ].x, y: 240 });\n        expect(sequenceFlow4.waypoints[ 1 ]).to.include({ x: sequenceFlow4Waypoints[ 1 ].x + 100, y: 240 });\n\n        expect(subProcess1).to.have.bounds({\n          x: subProcess1Bounds.x,\n          y: subProcess1Bounds.y,\n          width: subProcess1Bounds.width + 100,\n          height: subProcess1Bounds.height\n        });\n      }));\n\n\n      it('should add space bottom', inject(function() {\n\n        // given\n        var subProcess1 = $element('SubProcess_1');\n\n        var subProcess1Bounds = getBounds(subProcess1);\n\n        // when\n        makeSpace({ x: 420, y: 240 }, { dy: 100 });\n\n        // then\n        expect(subProcess1).to.have.bounds({\n          x: subProcess1Bounds.x,\n          y: subProcess1Bounds.y,\n          width: subProcess1Bounds.width,\n          height: subProcess1Bounds.height + 100\n        });\n      }));\n\n\n      it('should add space left', inject(function() {\n\n        // given\n        var startEvent1 = $element('StartEvent_1'),\n            startEvent2 = $element('StartEvent_2'),\n            startEvent1Label = startEvent1.label,\n            startEvent2Label = startEvent2.label,\n            sequenceFlow1 = $element('SequenceFlow_1'),\n            sequenceFlow3 = $element('SequenceFlow_3'),\n            subProcess1 = $element('SubProcess_1');\n\n        var startEvent1Mid = getMid(startEvent1),\n            startEvent2Mid = getMid(startEvent2),\n            startEvent1LabelMid = getMid(startEvent1Label),\n            startEvent2LabelMid = getMid(startEvent2Label),\n            sequenceFlow1Waypoints = sequenceFlow1.waypoints.slice(),\n            sequenceFlow3Waypoints = sequenceFlow3.waypoints.slice(),\n            subProcess1Bounds = getBounds(subProcess1);\n\n        // when\n        makeSpace({ x: 420, y: 240 }, { dx: -100 }, true);\n\n        // then\n        expect(getMid(startEvent1)).to.eql({\n          x: startEvent1Mid.x - 100,\n          y: startEvent1Mid.y\n        });\n\n        expect(getMid(startEvent2)).to.eql({\n          x: startEvent2Mid.x - 100,\n          y: startEvent2Mid.y\n        });\n\n        expect(getMid(startEvent1Label)).to.eql({\n          x: startEvent1LabelMid.x - 100,\n          y: startEvent1LabelMid.y\n        });\n\n        expect(getMid(startEvent2Label).x).to.be.closeTo(198, 1); // Label position was adjusted\n        expect(getMid(startEvent2Label).y).to.equal(startEvent2LabelMid.y);\n\n        expect(sequenceFlow1.waypoints[ 0 ]).to.include({ x: sequenceFlow1Waypoints[ 0 ].x - 100, y: 240 });\n        expect(sequenceFlow1.waypoints[ 1 ]).to.include({ x: sequenceFlow1Waypoints[ 1 ].x - 100, y: 240 });\n\n        expect(sequenceFlow3.waypoints[ 0 ]).to.include({ x: sequenceFlow3Waypoints[ 0 ].x - 100, y: 240 });\n        expect(sequenceFlow3.waypoints[ 1 ]).to.include({ x: sequenceFlow3Waypoints[ 1 ].x, y: 240 });\n\n        expect(subProcess1).to.have.bounds({\n          x: subProcess1Bounds.x - 100,\n          y: subProcess1Bounds.y,\n          width: subProcess1Bounds.width + 100,\n          height: subProcess1Bounds.height\n        });\n      }));\n\n    });\n\n\n    describe('remove', function() {\n\n      it('should remove space top', inject(function() {\n\n        // given\n        var subProcess1 = $element('SubProcess_1');\n\n        var subProcess1Bounds = getBounds(subProcess1);\n\n        // when\n        makeSpace({ x: 420, y: 240 }, { dy: 100 }, true);\n\n        // then\n        expect(subProcess1).to.have.bounds({\n          x: subProcess1Bounds.x,\n          y: 180,\n          width: subProcess1Bounds.width,\n          height: 160\n        });\n      }));\n\n\n      it('should remove space right', inject(function() {\n\n        // given\n        var endEvent1 = $element('EndEvent_1'),\n            endEvent2 = $element('EndEvent_2'),\n            endEvent1Label = endEvent1.label,\n            endEvent2Label = endEvent2.label,\n            sequenceFlow2 = $element('SequenceFlow_2'),\n            sequenceFlow4 = $element('SequenceFlow_4'),\n            subProcess1 = $element('SubProcess_1');\n\n        var endEvent1Mid = getMid(endEvent1),\n            endEvent2Mid = getMid(endEvent2),\n            endEvent1LabelMid = getMid(endEvent1Label),\n            sequenceFlow2Waypoints = sequenceFlow2.waypoints.slice(),\n            subProcess1Bounds = getBounds(subProcess1);\n\n        // when\n        makeSpace({ x: 420, y: 240 }, { dx: -100 });\n\n        // then\n        expect(getMid(endEvent1)).to.eql({\n          x: endEvent1Mid.x - 100,\n          y: endEvent1Mid.y\n        });\n\n        expect(getMid(endEvent2)).to.eql({\n          x: endEvent2Mid.x - 100,\n          y: endEvent2Mid.y\n        });\n\n        expect(getMid(endEvent1Label)).to.eql({\n          x: endEvent1LabelMid.x - 100,\n          y: endEvent1LabelMid.y\n        });\n\n        expect(getMid(endEvent2Label).x).to.be.closeTo(450, 1); // Label position was adjusted\n        expect(getMid(endEvent2Label).y).to.be.closeTo(272, 1); // Label position was adjusted\n\n        expect(sequenceFlow2.waypoints[ 0 ]).to.include({ x: sequenceFlow2Waypoints[ 0 ].x - 100, y: 240 });\n        expect(sequenceFlow2.waypoints[ 1 ]).to.include({ x: sequenceFlow2Waypoints[ 1 ].x - 100, y: 240 });\n\n        expect(sequenceFlow4.waypoints).to.have.length(4);\n\n        expect(subProcess1).to.have.bounds({\n          x: subProcess1Bounds.x,\n          y: subProcess1Bounds.y,\n          width: subProcess1Bounds.width - 100,\n          height: subProcess1Bounds.height\n        });\n      }));\n\n\n      it('should remove space bottom', inject(function() {\n\n        // given\n        var subProcess1 = $element('SubProcess_1');\n\n        var subProcess1Bounds = getBounds(subProcess1);\n\n        // when\n        makeSpace({ x: 420, y: 240 }, { dy: -100 });\n\n        // then\n        expect(subProcess1).to.have.bounds({\n          x: subProcess1Bounds.x,\n          y: subProcess1Bounds.y,\n          width: subProcess1Bounds.width,\n          height: 160\n        });\n      }));\n\n\n      it('should remove space left', inject(function() {\n\n        // given\n        var startEvent1 = $element('StartEvent_1'),\n            startEvent2 = $element('StartEvent_2'),\n            startEvent1Label = startEvent1.label,\n            startEvent2Label = startEvent2.label,\n            sequenceFlow1 = $element('SequenceFlow_1'),\n            sequenceFlow3 = $element('SequenceFlow_3'),\n            subProcess1 = $element('SubProcess_1');\n\n        var startEvent1Mid = getMid(startEvent1),\n            startEvent2Mid = getMid(startEvent2),\n            startEvent1LabelMid = getMid(startEvent1Label),\n            sequenceFlow1Waypoints = sequenceFlow1.waypoints.slice(),\n            subProcess1Bounds = getBounds(subProcess1);\n\n        // when\n        makeSpace({ x: 420, y: 240 }, { dx: 100 }, true);\n\n        // then\n        expect(getMid(startEvent1)).to.eql({\n          x: startEvent1Mid.x + 100,\n          y: startEvent1Mid.y\n        });\n\n        expect(getMid(startEvent2)).to.eql({\n          x: startEvent2Mid.x + 100,\n          y: startEvent2Mid.y\n        });\n\n        expect(getMid(startEvent1Label)).to.eql({\n          x: startEvent1LabelMid.x + 100,\n          y: startEvent1LabelMid.y\n        });\n\n        expect(getMid(startEvent2Label).x).to.be.closeTo(398, 1); // Label position was adjusted\n        expect(getMid(startEvent2Label).y).to.be.closeTo(272, 1); // Label position was adjusted\n\n        expect(sequenceFlow1.waypoints[ 0 ]).to.include({ x: sequenceFlow1Waypoints[ 0 ].x + 100, y: 240 });\n        expect(sequenceFlow1.waypoints[ 1 ]).to.include({ x: sequenceFlow1Waypoints[ 1 ].x + 100, y: 240 });\n\n        expect(sequenceFlow3.waypoints).to.have.length(4);\n\n        expect(subProcess1).to.have.bounds({\n          x: subProcess1Bounds.x + 100,\n          y: subProcess1Bounds.y,\n          width: subProcess1Bounds.width - 100,\n          height: subProcess1Bounds.height\n        });\n      }));\n\n    });\n\n  });\n\n\n  describe('text annotations', function() {\n\n    var diagramXML = require('./BpmnSpaceTool.text-annotations.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n    beforeEach(inject(function(dragging) {\n      dragging.setOptions({ manual: true });\n    }));\n\n\n    it('should not resize text annotations', inject(function(dragging, elementRegistry, spaceTool) {\n\n      // given\n      var textAnnotation = $element('TextAnnotation_1'),\n          textAnnotationMid = getMid(textAnnotation),\n          textAnnotationWidth = textAnnotation.width;\n\n      // when\n      spaceTool.activateMakeSpace(canvasEvent({ x: textAnnotationMid.x, y: 0 }));\n\n      dragging.move(canvasEvent({ x: textAnnotationMid.x + 100, y: 0 }));\n\n      dragging.end();\n\n      // then\n      expect(textAnnotation.width).to.equal(textAnnotationWidth);\n    }));\n\n  });\n\n\n  describe('boundary events', function() {\n\n    var diagramXML = require('./BpmnSpaceTool.boundary-events.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n    beforeEach(inject(function(dragging) {\n      dragging.setOptions({ manual: true });\n    }));\n\n\n    it('should move boundary event when moving subprocess', inject(function() {\n\n      // given\n      var boundaryEvent = $element('BoundaryEvent_2');\n\n      var boundaryEventMid = getMid(boundaryEvent);\n\n      // when\n      makeSpace({ x: boundaryEventMid.x + 5, y: boundaryEventMid.y }, { dx: -100 }, true);\n\n      // then\n      expect(getMid(boundaryEvent)).to.eql({\n        x: boundaryEventMid.x - 100,\n        y: boundaryEventMid.y,\n      });\n    }));\n\n\n    it('should move boundary event when resizing subprocess', inject(function() {\n\n      // given\n      var boundaryEvent = $element('BoundaryEvent_2');\n\n      var boundaryEventMid = getMid(boundaryEvent);\n\n      // when\n      makeSpace({ x: boundaryEventMid.x - 5, y: boundaryEventMid.y }, { dx: 100 });\n\n      // then\n      expect(getMid(boundaryEvent)).to.eql({\n        x: boundaryEventMid.x + 100,\n        y: boundaryEventMid.y,\n      });\n    }));\n\n\n    it('should not move boundary event if subprocess not moving or resizing', inject(function() {\n\n      // given\n      var boundaryEvent = $element('BoundaryEvent_2');\n\n      var boundaryEventMid = getMid(boundaryEvent);\n\n      // when\n      makeSpace({ x: boundaryEventMid.x + 5, y: boundaryEventMid.y }, { dx: 100 });\n\n      // then\n      expect(getMid(boundaryEvent)).to.eql(boundaryEventMid);\n    }));\n\n  });\n\n\n  describe('participants', function() {\n\n    var diagramXML = require('./BpmnSpaceTool.participants.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n    beforeEach(inject(function(dragging) {\n      dragging.setOptions({ manual: true });\n    }));\n\n\n    it('should resize an expanded pool horizontally', inject(function() {\n\n      // given\n      var participant1 = $element('Participant_1');\n\n      var participant1Bounds = getBounds(participant1);\n\n      // when\n      makeSpace({ x: 200, y: 90 }, { dx: -100 }, true);\n\n      // then\n      expect(participant1).to.have.bounds({\n        x: participant1Bounds.x - 100,\n        y: participant1Bounds.y,\n        width: participant1Bounds.width + 100,\n        height: participant1Bounds.height\n      });\n    }));\n\n\n    it('should resize an expanded pool vertically', inject(function() {\n\n      // given\n      var participant1 = $element('Participant_1');\n\n      var participant1Bounds = getBounds(participant1);\n\n      // when\n      makeSpace({ x: 200, y: 90 }, { dy: -100 }, true);\n\n      // then\n      expect(participant1).to.have.bounds({\n        x: participant1Bounds.x,\n        y: participant1Bounds.y - 100,\n        width: participant1Bounds.width,\n        height: participant1Bounds.height + 100\n      });\n    }));\n\n\n    it('should resize an empty pool horizontally', inject(function() {\n\n      // given\n      var participant2 = $element('Participant_2');\n\n      var participant2Bounds = getBounds(participant2);\n\n      // when\n      makeSpace({ x: 200, y: 180 }, { dx: -100 }, true);\n\n      // then\n      expect(participant2).to.have.bounds({\n        x: participant2Bounds.x - 100,\n        y: participant2Bounds.y,\n        width: participant2Bounds.width + 100,\n        height: participant2Bounds.height\n      });\n    }));\n\n\n    it('should not resize an empty pool vertically', inject(function() {\n\n      // given\n      var participant2 = $element('Participant_2');\n\n      var participant2Bounds = getBounds(participant2);\n\n      // when\n      makeSpace({ x: 200, y: 180 }, { dy: -100 }, true);\n\n      // then\n      expect(participant2).to.have.bounds({\n        x: participant2Bounds.x,\n        y: participant2Bounds.y,\n        width: participant2Bounds.width,\n        height: participant2Bounds.height\n      });\n    }));\n\n  });\n\n\n  describe('artifacts', function() {\n\n    var diagramXML = require('./BpmnSpaceTool.artifacts.bpmn');\n\n    beforeEach(bootstrapModeler(diagramXML, {\n      modules: testModules\n    }));\n\n    beforeEach(inject(function(dragging) {\n      dragging.setOptions({ manual: true });\n    }));\n\n\n    describe('should move visually contained', function() {\n\n      it('in participant', inject(function() {\n\n        // given\n        var textAnnotation = $element('ANNOTATION_1');\n        var textAnnotation_X = textAnnotation.x;\n\n        var group = $element('GROUP_CONTAINED_PARTICIPANT');\n        var group_X = group.x;\n\n        // when\n        makeSpace(leftOf(group), { dx: 100 }, false, 'PARTICIPANT');\n\n        // then\n        expect(textAnnotation.x).to.equal(textAnnotation_X + 100);\n        expect(group.x).to.equal(group_X + 100);\n      }));\n\n\n      it('in subprocess', inject(function() {\n\n        // given\n        var textAnnotation = $element('ANNOTATION_4');\n        var textAnnotation_X = textAnnotation.x;\n\n        var group = $element('GROUP_CONTAINED_SUB');\n        var group_X = group.x;\n\n        // when\n        makeSpace(leftOf(group), { dx: 100 }, false, 'SUB');\n\n        // then\n        expect(textAnnotation.x).to.equal(textAnnotation_X + 100);\n        expect(group.x).to.equal(group_X + 100);\n      }));\n\n\n      it('on root', inject(function() {\n\n        // given\n        var textAnnotation_in_PARTICIPANT = $element('ANNOTATION_1');\n        var textAnnotation_in_PARTICIPANT_X = textAnnotation_in_PARTICIPANT.x;\n\n        var textAnnotation_in_SUB = $element('ANNOTATION_4');\n        var textAnnotation_in_SUB_X = textAnnotation_in_SUB.x;\n\n        var group_in_PARTICIPANT = $element('GROUP_CONTAINED_PARTICIPANT');\n        var group_in_PARTICIPANT_X = group_in_PARTICIPANT.x;\n\n        var group_in_SUB = $element('GROUP_CONTAINED_SUB');\n        var group_in_SUB_X = group_in_SUB.x;\n\n        // when\n        makeSpace(leftOf('PARTICIPANT'), { dx: 100 }, false);\n\n        // then\n        expect(textAnnotation_in_PARTICIPANT.x).to.equal(textAnnotation_in_PARTICIPANT_X + 100);\n        expect(textAnnotation_in_SUB.x).to.equal(textAnnotation_in_SUB_X + 100);\n        expect(group_in_PARTICIPANT.x).to.equal(group_in_PARTICIPANT_X + 100);\n        expect(group_in_SUB.x).to.equal(group_in_SUB_X + 100);\n      }));\n\n    });\n\n\n    describe('should ignore outside of containment', function() {\n\n      it('in participant', inject(function() {\n\n        // given\n        var textAnnotation = $element('ANNOTATION_3');\n        var textAnnotation_X = textAnnotation.x;\n\n        var group = $element('GROUP_OUTSIDE');\n        var group_X = group.x;\n\n        // when\n        makeSpace(leftOf('TASK'), { dx: 100 }, false, 'PARTICIPANT');\n\n        // then\n        expect(textAnnotation.x).to.equal(textAnnotation_X);\n        expect(group.x).to.equal(group_X);\n      }));\n\n\n      it('in subprocess', inject(function() {\n\n        // given\n        var textAnnotation = $element('ANNOTATION_5');\n        var textAnnotation_X = textAnnotation.x;\n\n        var group = $element('GROUP_OUTSIDE_SUB');\n        var group_X = group.x;\n\n        // when\n        makeSpace(leftOf('GROUP_CONTAINED_SUB'), { dx: 100 }, false, 'SUB');\n\n        // then\n        expect(textAnnotation.x).to.equal(textAnnotation_X);\n        expect(group.x).to.equal(group_X);\n      }));\n\n    });\n\n\n    describe('should ignore unaffected inside of containment', function() {\n\n      it('in participant', inject(function() {\n\n        // given\n        var textAnnotation = $element('ANNOTATION_1');\n        var textAnnotation_X = textAnnotation.x;\n\n        var group = $element('GROUP_CONTAINED_PARTICIPANT');\n        var group_X = group.x;\n\n        // when\n        makeSpace(leftOf(group), { dx: -100 }, true, 'PARTICIPANT');\n\n        // then\n        expect(textAnnotation.x).to.equal(textAnnotation_X);\n        expect(group.x).to.equal(group_X);\n      }));\n\n\n      it('in subprocess', inject(function() {\n\n        // given\n        var textAnnotation = $element('ANNOTATION_4');\n        var textAnnotation_X = textAnnotation.x;\n\n        var group = $element('GROUP_CONTAINED_SUB');\n        var group_X = group.x;\n\n        // when\n        makeSpace(leftOf(group), { dx: -100 }, true, 'SUB');\n\n        // then\n        expect(textAnnotation.x).to.equal(textAnnotation_X);\n        expect(group.x).to.equal(group_X);\n      }));\n\n    });\n\n  });\n\n});\n\n\n// helpers //////////\n\nfunction makeSpace(start, delta, invert, target) {\n  var modifier = invert ? invertModifier : {};\n\n  var end = {\n    x: start.x + (delta.dx || 0),\n    y: start.y + (delta.dy || 0)\n  };\n\n  return getBpmnJS().invoke(function(spaceTool, dragging, canvas) {\n    spaceTool.activateMakeSpace(canvasEvent(start));\n\n    if (target) {\n      target = $element(target);\n\n      dragging.hover({\n        element: target,\n        gfx: canvas.getGraphics(target)\n      });\n    }\n\n    dragging.move(canvasEvent(end, modifier));\n\n    dragging.end();\n  });\n}\n\nfunction $element(id) {\n\n  if (!isString(id)) {\n    return id;\n  }\n\n  return getBpmnJS().invoke(function(elementRegistry) {\n\n    const element = elementRegistry.get(id);\n\n    expect(element, `element <#${id}>`).to.exist;\n\n    return element;\n  });\n}\n\nfunction leftOf(element) {\n\n  element = $element(element);\n\n  const mid = getMid(element);\n\n  return {\n    x: element.x - 10,\n    y: mid.y\n  };\n}\n\n// eslint-disable-next-line \"no-unused-vars\"\nfunction rightOf(element) {\n\n  element = $element(element);\n\n  const mid = getMid(element);\n\n  return {\n    x: element.x + element.width + 10,\n    y: mid.y\n  };\n}\n\nfunction getBounds(shape) {\n  return pick(shape, [ 'x', 'y', 'width', 'height' ]);\n}"
  },
  {
    "path": "test/spec/helper/InjectSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport { expect } from 'chai';\n\n\ndescribe('helper - inject', function() {\n\n  var diagramXML = require('../../fixtures/bpmn/simple.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: [\n      coreModule\n    ]\n  }));\n\n\n  it('should work with Promise as return value', function() {\n\n    // given\n    var expected = 'resolved';\n\n    // when\n    var testFn = inject(function(eventBus) {\n\n      expect(eventBus).to.exist;\n\n      return Promise.resolve(expected);\n    });\n\n    // then\n    return testFn().then(function(result) {\n\n      expect(result).to.eql(expected);\n    });\n  });\n\n\n  it('should handle Promise rejection', function() {\n\n    // given\n    var expected = new Error('rejected');\n\n    function onResolved() {\n      throw new Error('should not resolve');\n    }\n\n    function onRejected(error) {\n      expect(error).to.eql(expected);\n    }\n\n    // when\n    var testFn = inject(function(eventBus) {\n      expect(eventBus).to.exist;\n\n      return Promise.reject(expected);\n    });\n\n    // then\n    return testFn().then(onResolved, onRejected);\n  });\n\n});\n"
  },
  {
    "path": "test/spec/i18n/custom-translate/custom-translate.js",
    "content": "import translate from 'diagram-js/lib/i18n/translate/translate';\n\nexport default function customTranslate(template, replacements) {\n  if (template === 'Delete') {\n    template = 'Entfernen';\n  }\n\n  if (template === 'Activate hand tool') {\n    template = 'Hand-Tool aktivieren';\n  }\n\n  return translate(template, replacements);\n}"
  },
  {
    "path": "test/spec/i18n/custom-translate/index.js",
    "content": "import customTranslate from './custom-translate';\n\nexport default {\n  translate: [ 'value', customTranslate ]\n};"
  },
  {
    "path": "test/spec/i18n/translateSpec.js",
    "content": "import {\n  bootstrapModeler,\n  collectTranslations,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport translateModule from 'diagram-js/lib/i18n/translate';\nimport customTranslateModule from './custom-translate';\nimport modelingModule from 'lib/features/modeling';\nimport paletteModule from 'lib/features/palette';\nimport contextPadModule from 'lib/features/context-pad';\n\nvar diagramXML = require('test/fixtures/bpmn/simple.bpmn');\n\n\n// skipping this file during translation extraction\n\ncollectTranslations ? describe.skip : describe('i18n - translate', function() {\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: [\n      coreModule,\n      modelingModule,\n      paletteModule,\n      contextPadModule,\n      translateModule,\n      customTranslateModule\n    ]\n  }));\n\n\n  it('should translate palette', inject(function(palette) {\n\n    // when\n    var handToolEntry = palette.getEntries()['hand-tool'];\n\n    // then\n    expect(handToolEntry.title).to.equal('Hand-Tool aktivieren');\n  }));\n\n\n  it('should translate context pad', inject(function(contextPad) {\n\n    // given\n    contextPad.open('Task_1');\n\n    // when\n    var deleteEntry = contextPad._current.entries.delete;\n\n    // then\n    expect(deleteEntry.title).to.equal('Entfernen');\n  }));\n\n});"
  },
  {
    "path": "test/spec/import/BpmnTreeWalkerSpec.js",
    "content": "import BpmnTreeWalker from 'lib/import/BpmnTreeWalker';\r\n\r\nimport { BpmnModdle } from 'bpmn-moddle';\r\n\r\nimport { find } from 'min-dash';\r\n\r\nimport simpleXML from 'test/fixtures/bpmn/simple.bpmn';\r\nimport collaboration from 'test/fixtures/bpmn/collaboration.bpmn';\r\n\r\n\r\ndescribe('import - BpmnTreeWalker', function() {\r\n\r\n  it('should expose functions', function() {\r\n\r\n    // when\r\n    var walker = createWalker();\r\n\r\n    // then\r\n    expect(walker.handleDeferred).to.exist;\r\n    expect(walker.handleDefinitions).to.exist;\r\n    expect(walker.handleSubProcess).to.exist;\r\n    expect(walker.registerDi).to.exist;\r\n  });\r\n\r\n\r\n  it('should walk bpmn:Definitions', function() {\r\n\r\n    // given\r\n    var elementSpy = sinon.spy(),\r\n        rootSpy = sinon.spy(),\r\n        errorSpy = sinon.spy();\r\n\r\n    var walker = createWalker({\r\n      element: elementSpy,\r\n      root: rootSpy,\r\n      error: errorSpy\r\n    });\r\n\r\n    return createModdle(simpleXML).then(function(result) {\r\n\r\n      var definitions = result.rootElement;\r\n\r\n      // when\r\n      walker.handleDefinitions(definitions);\r\n\r\n      // then\r\n      expect(elementSpy.callCount).to.equal(8);\r\n      expect(rootSpy).to.be.calledOnce;\r\n      expect(errorSpy).not.to.be.called;\r\n    });\r\n  });\r\n\r\n\r\n  it('should always call element visitor with parent', function() {\r\n\r\n    // given\r\n    var elementSpy = sinon.spy(),\r\n        errorSpy = sinon.spy();\r\n\r\n\r\n    var walker = createWalker({\r\n      element: elementSpy,\r\n      root: function() {\r\n        return 'root';\r\n      },\r\n      error: errorSpy\r\n    });\r\n\r\n    return createModdle(collaboration).then(function(result) {\r\n\r\n      var definitions = result.rootElement;\r\n\r\n      // when\r\n      walker.handleDefinitions(definitions);\r\n\r\n      // then\r\n      expect(elementSpy).to.not.be.calledWith(sinon.match.any, sinon.match.typeOf('undefined'));\r\n      expect(errorSpy).to.not.be.called;\r\n    });\r\n  });\r\n\r\n\r\n  it('should walk bpmn:SubProcess', function() {\r\n\r\n    // given\r\n    var elementSpy = sinon.spy(),\r\n        rootSpy = sinon.spy(),\r\n        errorSpy = sinon.spy();\r\n\r\n    var walker = createWalker({\r\n      element: elementSpy,\r\n      root: rootSpy,\r\n      error: errorSpy\r\n    });\r\n\r\n    return createModdle(simpleXML).then(function(result) {\r\n\r\n      var definitions = result.rootElement;\r\n\r\n      var subProcess = findElementWithId(definitions, 'SubProcess_1');\r\n\r\n      var plane = definitions.diagrams[0].plane,\r\n          planeElements = plane.planeElement;\r\n\r\n      // register DI\r\n      planeElements.forEach(walker.registerDi);\r\n\r\n      // when\r\n      walker.handleSubProcess(subProcess);\r\n\r\n      walker.handleDeferred();\r\n\r\n      // then\r\n      expect(elementSpy.callCount).to.equal(3);\r\n      expect(rootSpy).to.not.be.called;\r\n      expect(errorSpy).to.not.be.called;\r\n\r\n    });\r\n  });\r\n\r\n\r\n  it('should error', function() {\r\n\r\n    // given\r\n    var elementSpy = sinon.spy(),\r\n        rootSpy = sinon.spy(),\r\n        errorSpy = sinon.spy();\r\n\r\n    var walker = createWalker({\r\n      element: elementSpy,\r\n      root: rootSpy,\r\n      error: errorSpy\r\n    });\r\n\r\n    return createModdle(simpleXML).then(function(result) {\r\n\r\n      var definitions = result.rootElement;\r\n\r\n      var element = findElementWithId(definitions, 'SubProcess_1');\r\n\r\n      // will error\r\n      definitions.diagrams[0].plane.planeElement.push({ bpmnElement: element });\r\n\r\n      // when\r\n      walker.handleDefinitions(definitions);\r\n\r\n      // then\r\n      expect(elementSpy.callCount).to.equal(8);\r\n      expect(rootSpy.calledOnce).to.be.true;\r\n      expect(errorSpy.calledOnce).to.be.true;\r\n    });\r\n  });\r\n\r\n});\r\n\r\n\r\n// helpers //////////\r\n\r\nfunction createModdle(xml) {\r\n  var moddle = new BpmnModdle();\r\n\r\n  return moddle.fromXML(xml, 'bpmn:Definitions');\r\n}\r\n\r\nfunction createWalker(listeners) {\r\n\r\n  listeners = listeners || {};\r\n\r\n  var visitor = {\r\n    element: function(element, parent) {\r\n      return listeners.element && listeners.element(element, parent);\r\n    },\r\n    root: function(root) {\r\n      return listeners.root && listeners.root(root);\r\n    },\r\n    error: function(message, context) {\r\n      return listeners.error && listeners.error(message, context);\r\n    }\r\n  };\r\n\r\n  return new BpmnTreeWalker(visitor, function() {});\r\n}\r\n\r\nfunction findElementWithId(definitions, id) {\r\n\r\n  function findElement(element) {\r\n    if (element.id === id) {\r\n      return element;\r\n    }\r\n\r\n    if (element.flowElements) {\r\n      return find(element.flowElements, function(flowElement) {\r\n        var foundElement = findElement(flowElement);\r\n\r\n        return foundElement && foundElement.id === id;\r\n      });\r\n    }\r\n  }\r\n\r\n  return definitions.rootElements.reduce(function(foundElement, rootElement) {\r\n    if (rootElement.id === id) {\r\n      return rootElement;\r\n    } else {\r\n      return findElement(rootElement) || foundElement;\r\n    }\r\n  }, null);\r\n}\r\n"
  },
  {
    "path": "test/spec/import/ImporterSpec.js",
    "content": "import TestContainer from 'mocha-test-container-support';\n\nimport Diagram from 'diagram-js/lib/Diagram';\nimport { BpmnModdle } from 'bpmn-moddle';\n\nimport {\n  importBpmnDiagram\n} from 'lib/import/Importer';\n\nimport CoreModule from 'lib/core';\n\nimport {\n  matches as domMatches\n} from 'min-dom';\n\nimport {\n  getChildren as getChildrenGfx\n} from 'diagram-js/lib/util/GraphicsUtil';\n\nimport {\n  find\n} from 'min-dash';\n\nimport { is } from 'lib/util/ModelUtil';\n\n\ndescribe('import - Importer', function() {\n\n  function createDiagram(container, modules) {\n    return new Diagram({\n      canvas: { container: container },\n      modules: modules\n    });\n  }\n\n  var diagram;\n\n  beforeEach(function() {\n    diagram = createDiagram(TestContainer.get(this), [ CoreModule ]);\n  });\n\n\n  function runImport(diagram, xml, diagramId) {\n\n    var moddle = new BpmnModdle();\n\n    return moddle.fromXML(xml).then(function(result) {\n\n      var definitions = result.rootElement;\n\n      var selectedDiagram = find(definitions.diagrams, function(element) {\n        return element.id === diagramId;\n      });\n\n      return importBpmnDiagram(diagram, definitions, selectedDiagram);\n    }).then(function(result) {\n\n      return result;\n    });\n  }\n\n\n  describe('events', function() {\n\n    it('should fire <import.render.start> and <import.render.complete>', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/import/process.bpmn');\n\n      var eventCount = 0;\n\n      var eventBus = diagram.get('eventBus');\n\n      // log events\n      eventBus.on('import.render.start', function(event) {\n        expect(event.definitions).to.exist;\n\n        eventCount++;\n      });\n\n      eventBus.on('import.render.complete', function(event) {\n        expect(event).to.have.property('error');\n        expect(event).to.have.property('warnings');\n\n        eventCount++;\n      });\n\n      // when\n      return runImport(diagram, xml).then(function() {\n\n        // then\n        expect(eventCount).to.equal(2);\n      });\n    });\n\n\n    it('should fire <bpmnElement.added> during import', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/import/process.bpmn');\n\n      var eventCount = 0;\n\n      // log events\n      diagram.get('eventBus').on('bpmnElement.added', function(e) {\n        eventCount++;\n      });\n\n      // when\n      return runImport(diagram, xml).then(function() {\n\n        // then\n        expect(eventCount).to.equal(9);\n      });\n    });\n\n  });\n\n\n  describe('basics', function() {\n\n    it('should import process', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/import/process.bpmn');\n\n      var events = [];\n\n      // log events\n      diagram.get('eventBus').on('bpmnElement.added', function(e) {\n        events.push({\n          type: 'add',\n          semantic: e.element.businessObject.id,\n          di: e.element.di.id,\n          diagramElement: e.element && e.element.id\n        });\n      });\n\n      // when\n      return runImport(diagram, xml).then(function() {\n\n        // then\n        expect(events).to.eql([\n          { type: 'add', semantic: 'Process_1', di: 'BPMNPlane_1', diagramElement: 'Process_1' },\n          { type: 'add', semantic: 'SubProcess_1', di: '_BPMNShape_SubProcess_2', diagramElement: 'SubProcess_1' },\n          { type: 'add', semantic: 'StartEvent_1', di: '_BPMNShape_StartEvent_2', diagramElement: 'StartEvent_1' },\n          { type: 'add', semantic: 'Task_1', di: '_BPMNShape_Task_2', diagramElement: 'Task_1' },\n          { type: 'add', semantic: 'EndEvent_1', di: '_BPMNShape_EndEvent_2', diagramElement: 'EndEvent_1' },\n          { type: 'add', semantic: 'StartEvent_2', di: '_BPMNShape_StartEvent_11', diagramElement: 'StartEvent_2' },\n          { type: 'add', semantic: 'SequenceFlow_1', di: 'BPMNEdge_SequenceFlow_1', diagramElement: 'SequenceFlow_1' },\n          { type: 'add', semantic: 'SequenceFlow_2', di: 'BPMNEdge_SequenceFlow_2', diagramElement: 'SequenceFlow_2' },\n          { type: 'add', semantic: 'SequenceFlow_3', di: 'BPMNEdge_SequenceFlow_3', diagramElement: 'SequenceFlow_3' }\n        ]);\n\n        expect(\n          diagram.get('canvas').getRootElement()\n        ).to.equal(\n          diagram.get('elementRegistry').get('Process_1')\n        );\n      });\n    });\n\n\n    it('should import collaboration', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/import/collaboration.bpmn');\n\n      var events = [];\n\n      // log events\n      diagram.get('eventBus').on('bpmnElement.added', function(e) {\n        events.push({\n          type: 'add',\n          semantic: e.element.businessObject.id,\n          di: e.element.di.id,\n          diagramElement: e.element && e.element.id\n        });\n      });\n\n      // when\n      return runImport(diagram, xml).then(function() {\n\n        // then\n        expect(events).to.eql([\n          { type: 'add', semantic: '_Collaboration_2', di: 'BPMNPlane_1', diagramElement: '_Collaboration_2' },\n          { type: 'add', semantic: 'Participant_2', di: '_BPMNShape_Participant_2', diagramElement: 'Participant_2' },\n          { type: 'add', semantic: 'Task_1', di: '_BPMNShape_Task_3', diagramElement: 'Task_1' },\n          { type: 'add', semantic: 'Participant_1', di: '_BPMNShape_Participant_3', diagramElement: 'Participant_1' },\n          { type: 'add', semantic: 'StartEvent_1', di: '_BPMNShape_StartEvent_3', diagramElement: 'StartEvent_1' },\n          { type: 'add', semantic: 'Lane_1', di: '_BPMNShape_Lane_2', diagramElement: 'Lane_1' },\n          { type: 'add', semantic: 'Lane_2', di: '_BPMNShape_Lane_3', diagramElement: 'Lane_2' },\n          { type: 'add', semantic: 'Lane_3', di: '_BPMNShape_Lane_4', diagramElement: 'Lane_3' }\n        ]);\n\n        expect(\n          diagram.get('canvas').getRootElement()\n        ).to.equal(\n          diagram.get('elementRegistry').get('_Collaboration_2')\n        );\n      });\n\n    });\n\n  });\n\n\n  describe('position', function() {\n\n    var xml = require('../../fixtures/bpmn/import/position/position-testcase.bpmn');\n\n    it('should round shape coordinates', function() {\n\n      // given\n      var events = {};\n\n      // log events\n      diagram.get('eventBus').on('bpmnElement.added', function(e) {\n\n        events[e.element.id] = e.element;\n      });\n\n      return runImport(diagram, xml).then(function() {\n\n        // round up\n        expect(events.ID_End.x).to.equal(Math.round(340.6));\n        expect(events.ID_End.y).to.equal(Math.round(136.6));\n\n        // round down\n        expect(events.ID_Start.x).to.equal(Math.round(120.4));\n        expect(events.ID_Start.y).to.equal(Math.round(135.4));\n      });\n    });\n\n\n    it('should round shape dimensions', function() {\n\n      // given\n      var events = {};\n\n      // log events\n      diagram.get('eventBus').on('bpmnElement.added', function(e) {\n\n        events[e.element.id] = e.element;\n      });\n\n      return runImport(diagram, xml).then(function() {\n\n        // round down\n        expect(events.ID_Start.height).to.equal(Math.round(30.4));\n        expect(events.ID_Start.width).to.equal(Math.round(30.4));\n\n      });\n    });\n\n  });\n\n\n  describe('order', function() {\n\n    it('should import lanes behind other flow nodes', function() {\n\n      var xml = require('./sequenceFlow-ordering.bpmn');\n\n      // given\n      var elementRegistry = diagram.get('elementRegistry');\n\n\n      return runImport(diagram, xml).then(function() {\n\n        // when\n        var processShape = elementRegistry.get('Participant_1jxpy8o');\n\n        var children = processShape.children;\n\n        // lanes\n        // other elements\n        var correctlyOrdered = [].concat(\n          children.filter(function(e) { return is(e, 'bpmn:Lane'); }),\n          children.filter(function(e) { return !is(e, 'bpmn:Lane'); })\n        );\n\n        // then\n        expectChildren(diagram, processShape, correctlyOrdered);\n      });\n    });\n\n\n    it('should import sequence flows in front of other flow nodes', function() {\n\n      var xml = require('./sequenceFlow-ordering.bpmn');\n\n      // given\n      var elementRegistry = diagram.get('elementRegistry');\n\n\n      return runImport(diagram, xml).then(function() {\n\n        // when\n        var processShape = elementRegistry.get('Participant_1jxpy8o');\n\n        var children = processShape.children;\n\n        // lanes\n        // other elements\n        // connections\n        // labels\n        var correctlyOrdered = [].concat(\n          children.filter(function(e) { return !e.waypoints && !e.labelTarget; }),\n          children.filter(function(e) { return e.waypoints; }),\n          children.filter(function(e) { return e.labelTarget; })\n        );\n\n        // then\n        expectChildren(diagram, processShape, correctlyOrdered);\n      });\n    });\n\n\n    it('should import DataAssociations in root', function() {\n\n      // given\n      var xml = require('./data-association.bpmn');\n\n      // given\n      var elementRegistry = diagram.get('elementRegistry');\n\n\n      // when\n      return runImport(diagram, xml).then(function() {\n\n        // then\n        var process = elementRegistry.get('Collaboration'),\n            association = elementRegistry.get('DataAssociation'),\n            dataStore = elementRegistry.get('DataStore');\n\n        expect(association.parent).to.eql(process);\n        expect(dataStore.parent).to.eql(process);\n      });\n    });\n\n  });\n\n\n  describe('elements', function() {\n\n    it('should import boundary events', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/import/boundaryEvent.bpmn');\n\n      var events = [];\n\n      // log events\n      diagram.get('eventBus').on('bpmnElement.added', function(e) {\n        events.push({\n          type: 'add',\n          semantic: e.element.businessObject.id,\n          di: e.element.di.id,\n          diagramElement: e.element && e.element.id\n        });\n      });\n\n      // when\n      return runImport(diagram, xml).then(function() {\n\n        // then\n        expect(events).to.eql([\n          { type: 'add', semantic: 'Process_1', di: 'BPMNPlane_1', diagramElement: 'Process_1' },\n          { type: 'add', semantic: 'Task_1', di: '_BPMNShape_Task_2', diagramElement: 'Task_1' },\n          { type: 'add', semantic: 'Task_2', di: '_BPMNShape_Task_3', diagramElement: 'Task_2' },\n          { type: 'add', semantic: 'BoundaryEvent_1', di: '_BPMNShape_BoundaryEvent_2', diagramElement: 'BoundaryEvent_1' },\n          { type: 'add', semantic: 'SequenceFlow_1', di: 'BPMNEdge_SequenceFlow_1', diagramElement: 'SequenceFlow_1' }\n        ]);\n\n      });\n    });\n\n\n    it('should import data store as child of participant', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/import/data-store.inside-participant.bpmn');\n\n      var events = {};\n\n      // log events\n      diagram.get('eventBus').on('bpmnElement.added', function(e) {\n\n        events[e.element.id] = e.element;\n      });\n\n      return runImport(diagram, xml).then(function() {\n        expect(events.DataStoreReference.parent).to.equal(events.Participant);\n\n      });\n\n    });\n\n\n    it('should import data store in participant as child of collaboration', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/import/data-store.outside-participant.participant.bpmn');\n\n      var events = {};\n\n      // log events\n      diagram.get('eventBus').on('bpmnElement.added', function(e) {\n\n        events[e.element.id] = e.element;\n      });\n\n      return runImport(diagram, xml).then(function() {\n        expect(events.DataStoreReference.parent).to.equal(events.Collaboration);\n\n      });\n    });\n\n\n    it('should import data store in subprocess as child of collaboration', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/import/data-store.outside-participant.subprocess.bpmn');\n\n      var events = {};\n\n      // log events\n      diagram.get('eventBus').on('bpmnElement.added', function(e) {\n\n        events[e.element.id] = e.element;\n      });\n\n      return runImport(diagram, xml).then(function() {\n        expect(events.DataStoreReference.parent).to.equal(events.Collaboration);\n\n      });\n    });\n\n\n    it('should import data store outside of participant without warnings', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/import/data-store.outside-participant.dangling.bpmn');\n\n      // when\n      return runImport(diagram, xml).then(function(result) {\n\n        var warnings = result.warnings;\n\n        // then\n        expect(warnings).to.be.empty;\n\n      });\n    });\n\n\n    it('should import single diagram from multiple diagrams 2', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/import/multiple-diagrams.bpmn');\n\n      var events = [];\n\n      // log events\n      diagram.get('eventBus').on('bpmnElement.added', function(e) {\n        events.push({\n          type: 'add',\n          semantic: e.element.businessObject.id,\n          di: e.element.di.id,\n          diagramElement: e.element && e.element.id\n        });\n      });\n\n      // when\n      return runImport(diagram, xml, 'BPMNDiagram_2').then(function() {\n\n        // then\n        expect(events).to.eql([\n          { type: 'add', semantic: 'Process_2', di: 'BPMNPlane_2', diagramElement: 'Process_2' },\n          { type: 'add', semantic: 'StartEvent_2', di: '_BPMNShape_StartEvent_2', diagramElement: 'StartEvent_2' },\n          { type: 'add', semantic: 'IntermediateThrowEvent_1', di: '_BPMNShape_IntermediateThrowEvent_1', diagramElement: 'IntermediateThrowEvent_1' },\n          { type: 'add', semantic: 'EndEvent_2', di: '_BPMNShape_EndEvent_2', diagramElement: 'EndEvent_2' },\n          { type: 'add', semantic: 'SequenceFlow_4', di: 'BPMNEdge_SequenceFlow_4', diagramElement: 'SequenceFlow_4' },\n          { type: 'add', semantic: 'SequenceFlow_5', di: 'BPMNEdge_SequenceFlow_5', diagramElement: 'SequenceFlow_5' }\n        ]);\n\n        expect(\n          diagram.get('canvas').getRootElement()\n        ).to.equal(\n          diagram.get('elementRegistry').get('Process_2')\n        );\n      });\n    });\n\n\n    it('should import single diagram from multiple diagrams 1', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/import/multiple-diagrams.bpmn');\n\n      var events = [];\n\n      // log events\n      diagram.get('eventBus').on('bpmnElement.added', function(e) {\n        events.push({\n          type: 'add',\n          semantic: e.element.businessObject.id,\n          di: e.element.di.id,\n          diagramElement: e.element && e.element.id\n        });\n      });\n\n      // when\n      return runImport(diagram, xml, 'BPMNDiagram_1').then(function() {\n\n        // then\n        expect(events).to.eql([\n          { type: 'add', semantic: 'Process_1', di: 'BPMNPlane_1', diagramElement: 'Process_1' },\n          { type: 'add', semantic: 'StartEvent_1', di: '_BPMNShape_StartEvent_1', diagramElement: 'StartEvent_1' },\n          { type: 'add', semantic: 'Task_1', di: '_BPMNShape_Task_1', diagramElement: 'Task_1' },\n          { type: 'add', semantic: 'Task_2', di: '_BPMNShape_Task_2', diagramElement: 'Task_2' },\n          { type: 'add', semantic: 'EndEvent_1', di: '_BPMNShape_EndEvent_1', diagramElement: 'EndEvent_1' },\n          { type: 'add', semantic: 'SequenceFlow_1', di: 'BPMNEdge_SequenceFlow_1', diagramElement: 'SequenceFlow_1' },\n          { type: 'add', semantic: 'SequenceFlow_2', di: 'BPMNEdge_SequenceFlow_2', diagramElement: 'SequenceFlow_2' },\n          { type: 'add', semantic: 'SequenceFlow_3', di: 'BPMNEdge_SequenceFlow_3', diagramElement: 'SequenceFlow_3' }\n        ]);\n\n      });\n    });\n\n\n    it('should import groups', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/import/groups.bpmn');\n\n      var events = [];\n\n      // log events\n      diagram.get('eventBus').on('bpmnElement.added', function(e) {\n        events.push({\n          type: 'add',\n          semantic: e.element.businessObject.id,\n          di: e.element.di.id,\n          diagramElement: e.element && e.element.id,\n          isFrame: e.element && e.element.isFrame\n        });\n      });\n\n      // when\n      return runImport(diagram, xml).then(function() {\n\n        // then\n        expect(events).to.eql([\n          { type: 'add', semantic: 'Process_1', di: 'BPMNPlane_1', diagramElement: 'Process_1', isFrame: undefined },\n          { type: 'add', semantic: 'Group_1', di: 'Group_1_di', diagramElement: 'Group_1', isFrame: true }\n        ]);\n\n      });\n    });\n\n  });\n\n\n  describe('forgiveness', function() {\n\n    it('should import invalid flowElement', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/import/error/invalid-flow-element.bpmn');\n\n      // when\n      return runImport(diagram, xml).then(function(result) {\n\n        var warnings = result.warnings;\n\n        // then\n        expect(warnings).to.have.length(0);\n\n      });\n    });\n\n\n    it('should import multiple DIs', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/import/error/multiple-dis.bpmn');\n\n      // when\n      return runImport(diagram, xml).then(function(result) {\n\n        var warnings = result.warnings;\n\n        var expectedMessage =\n          'multiple DI elements defined for <bpmn:InclusiveGateway id=\"InclusiveGateway_1\" />';\n\n        expect(warnings).to.have.length(1);\n        expect(warnings[0].message).to.equal(expectedMessage);\n\n      });\n    });\n\n\n    it('should import with missing BPMNDiagram#plane DI', function() {\n\n      // given\n      var xml = require('./missing-di-plane.bpmn');\n\n      // when\n      return runImport(diagram, xml).then(function(result) {\n\n        var {\n          error,\n          warnings\n        } = result;\n\n        // then\n        expect(warnings).to.be.empty;\n        expect(error).not.to.exist;\n      });\n    });\n\n\n    it('should error import with missing BPMNDiagram#plane DI', function() {\n\n      // given\n      var xml = require('./missing-di-plane-root-element.bpmn');\n\n      // when\n      return runImport(diagram, xml).then(function(result) {\n\n        var {\n          error,\n          warnings\n        } = result;\n\n        // then\n        // warning: no bpmnElement referenced in <bpmndi:BPMNPlane />\n        // warning: correcting missing bpmnElement on <bpmndi:BPMNPlane />\n        expect(warnings).to.have.length(2);\n        expect(error).not.to.exist;\n      });\n    });\n\n\n    it('should import sequence flow without waypoints', function() {\n\n      // given\n      var xml = require('./sequenceFlow-missingWaypoints.bpmn');\n\n      // when\n      return runImport(diagram, xml).then(function(result) {\n\n        var warnings = result.warnings;\n\n        // then\n        expect(warnings).to.be.empty;\n\n      });\n    });\n\n\n    it('should extend attributes with default value', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/import/default-attrs.bpmn');\n\n      // when\n      return runImport(diagram, xml).then(function() {\n\n        var elementRegistry = diagram.get('elementRegistry');\n\n        var element = elementRegistry.get('GATEWAY_1');\n\n        expect(element.businessObject.eventGatewayType).to.equal('Exclusive');\n\n      });\n    });\n\n\n    describe('boundary events', function() {\n\n      it('should handle missing attachToRef', function() {\n\n        // given\n        var xml = require('../../fixtures/bpmn/import/error/boundaryEvent-missingAttachToRef.bpmn');\n\n        // when\n        return runImport(diagram, xml).then(function(result) {\n\n          var warnings = result.warnings;\n\n          // then\n          expect(warnings.length).to.eql(2);\n\n          expect(warnings[0].message).to.eql('missing <bpmn:BoundaryEvent id=\"BoundaryEvent_1\" />#attachedToRef');\n          expect(warnings[1].message).to.eql('element <bpmn:BoundaryEvent id=\"BoundaryEvent_1\" /> referenced by <bpmn:SequenceFlow id=\"SequenceFlow_1\" />#sourceRef not yet drawn');\n\n        });\n      });\n\n\n      it('should handle invalid attachToRef', function() {\n\n        // given\n        var xml = require('../../fixtures/bpmn/import/error/boundaryEvent-invalidAttachToRef.bpmn');\n\n        // when\n        return runImport(diagram, xml).then(function(result) {\n\n          var warnings = result.warnings;\n\n          // then\n          expect(warnings.length).to.eql(2);\n\n          expect(warnings[0].message).to.eql('missing <bpmn:BoundaryEvent id=\"BoundaryEvent_1\" />#attachedToRef');\n          expect(warnings[1].message).to.eql('element <bpmn:BoundaryEvent id=\"BoundaryEvent_1\" /> referenced by <bpmn:SequenceFlow id=\"SequenceFlow_1\" />#sourceRef not yet drawn');\n\n        });\n      });\n\n    });\n\n  });\n\n\n  describe('integration', function() {\n\n    it('should import dangling process message flows', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/import/error/dangling-process-message-flow.bpmn');\n\n      // when\n      return runImport(diagram, xml).then(function(result) {\n\n        var warnings = result.warnings;\n\n        // then\n        expect(warnings).to.have.length(0);\n\n        expect(diagram.get('elementRegistry').get('_b467921a-ef7b-44c5-bf78-fd624c400d17')).to.exist;\n        expect(diagram.get('elementRegistry').get('_c311cc87-677e-47a4-bdb1-8744c4ec3147')).to.exist;\n\n      });\n    });\n\n\n    it('should import text annotations of message flows', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/import/text-annotation-message-flow.bpmn');\n\n      // when\n      return runImport(diagram, xml).then(function() {\n\n        // then\n        var textAnnotation = diagram.get('elementRegistry').get('TextAnnotation_1');\n        var messageFlow = diagram.get('elementRegistry').get('MessageFlow_1');\n        var association = diagram.get('elementRegistry').get('Association_1');\n\n        expect(textAnnotation).to.exist;\n        expect(association.source).to.equal(messageFlow);\n        expect(association.target).to.equal(textAnnotation);\n      });\n    });\n\n  });\n\n\n  describe('hiding', function() {\n\n    it('should hide shapes and connections inside of collapsed subprocess', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/import/collapsed/processWithChildren.bpmn');\n\n      // when\n      return runImport(diagram, xml).then(function() {\n\n        var elementRegistry = diagram.get('elementRegistry');\n\n        var children = elementRegistry.get('SubProcess_1').children;\n        var visible = find(children, function(child) {\n          return !child.hidden;\n        });\n\n        // then\n        expect(visible).to.be.undefined;\n\n      });\n\n    });\n\n  });\n\n\n  describe('multiple bpmndi:BPMNDiagram elements', function() {\n\n    it('should import first bpmndi:BPMNDiagram (default)', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/multiple-diagrams.bpmn');\n\n      // when\n      return runImport(diagram, xml).then(function(result) {\n\n        var warnings = result.warnings;\n\n        // then\n        expect(warnings).to.have.length(0);\n\n        diagram.invoke(function(elementRegistry, canvas) {\n\n          expect(elementRegistry.get('Task_A')).to.exist;\n          expect(elementRegistry.get('Task_B')).not.to.exist;\n\n          expect(canvas.getRootElement()).to.equal(elementRegistry.get('Process_1'));\n        });\n      });\n    });\n\n\n    it('should import second bpmndi:BPMNDiagram (specified)', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/multiple-diagrams.bpmn');\n\n      var selectedDiagram = 'BpmnDiagram_2';\n\n      // when\n      return runImport(diagram, xml, selectedDiagram).then(function(result) {\n\n        var warnings = result.warnings;\n\n        // then\n        expect(warnings).to.have.length(0);\n\n        diagram.invoke(function(elementRegistry, canvas) {\n\n          expect(elementRegistry.get('Task_A')).not.to.exist;\n          expect(elementRegistry.get('Task_B')).to.exist;\n\n          expect(canvas.getRootElement()).to.equal(elementRegistry.get('Process_2'));\n        });\n      });\n    });\n\n\n    it('should add root element for each bpmndi:BPMNDiagram when importing', function() {\n\n      // given\n      var xml = require('../../fixtures/bpmn/multiple-diagrams.bpmn');\n\n      // when\n      return runImport(diagram, xml).then(function() {\n\n        var elementRegistry = diagram.get('elementRegistry'),\n            canvas = diagram.get('canvas'),\n            rootA = elementRegistry.get('Process_1'),\n            rootB = elementRegistry.get('Process_2'),\n            taskA = elementRegistry.get('Task_A'),\n            taskB = elementRegistry.get('Task_B');\n\n        var activeRoot = canvas.getRootElement();\n\n        // then\n        expect(canvas.findRoot(taskA)).to.equal(rootA);\n        expect(canvas.findRoot(taskB)).to.equal(rootB);\n        expect(activeRoot).to.equal(rootA);\n      });\n    });\n\n\n    describe('collapsed sub process', function() {\n\n      it('should import collapsed sub process', function() {\n\n        // given\n        var xml = require('../../fixtures/bpmn/multiple-nested-processes.bpmn');\n\n        var selectedDiagram = 'BpmnDiagram_1';\n\n        // when\n        return runImport(diagram, xml, selectedDiagram).then(function(result) {\n\n          var warnings = result.warnings;\n\n          // then\n          expect(warnings).to.have.length(0);\n\n          diagram.invoke(function(elementRegistry, canvas) {\n\n            expect(elementRegistry.get('SubProcess_1')).to.exist;\n            expect(elementRegistry.get('Task_1A')).to.exist;\n            expect(elementRegistry.get('Task_1B')).to.exist;\n\n            expect(elementRegistry.get('SubProcess_2')).to.not.exist;\n\n            expect(canvas.getRootElement()).to.equal(elementRegistry.get('Process_1'));\n          });\n        });\n      });\n\n\n      it('should import and show collapsed sub process', function() {\n\n        // given\n        var xml = require('../../fixtures/bpmn/multiple-nested-processes.bpmn');\n\n        var selectedDiagram = 'SubProcessDiagram_1';\n\n        // when\n        return runImport(diagram, xml, selectedDiagram).then(function(result) {\n\n          var warnings = result.warnings;\n\n          // then\n          expect(warnings).to.have.length(0);\n\n          diagram.invoke(function(elementRegistry, canvas) {\n\n            expect(elementRegistry.get('SubProcess_1')).to.exist;\n            expect(elementRegistry.get('Task_1A')).to.exist;\n            expect(elementRegistry.get('Task_1B')).to.exist;\n\n            expect(elementRegistry.get('SubProcess_2')).to.not.exist;\n\n            expect(canvas.getRootElement()).to.equal(elementRegistry.get('SubProcess_1_plane'));\n          });\n        });\n      });\n\n\n      it('should import first bpmndi:BPMNDiagram when importing collapsed sub process', function() {\n\n        // given\n        var xml = require('../../fixtures/bpmn/multiple-nested-processes.bpmn');\n\n        var selectedDiagram = 'BpmnDiagram_2';\n\n        // when\n        return runImport(diagram, xml, selectedDiagram).then(function(result) {\n\n          var warnings = result.warnings;\n\n          // then\n          expect(warnings).to.have.length(0);\n\n          diagram.invoke(function(elementRegistry, canvas) {\n\n            expect(elementRegistry.get('SubProcess_2')).to.exist;\n            expect(elementRegistry.get('Task_2A')).to.exist;\n            expect(elementRegistry.get('Task_2B')).to.not.exist;\n\n            expect(elementRegistry.get('SubProcess_1')).to.not.exist;\n\n            expect(canvas.getRootElement()).to.equal(elementRegistry.get('Process_2'));\n          });\n        });\n      });\n\n\n      it('should import specified bpmndi:BPMNDiagram when importing collapsed sub process', function() {\n\n        // given\n        var xml = require('../../fixtures/bpmn/multiple-nested-processes.bpmn');\n\n        var selectedDiagram = 'SubProcess_2_diagram_B';\n\n        // when\n        return runImport(diagram, xml, selectedDiagram).then(function(result) {\n\n          var warnings = result.warnings;\n\n          // then\n          expect(warnings).to.have.length(0);\n\n          diagram.invoke(function(elementRegistry, canvas) {\n\n            expect(elementRegistry.get('SubProcess_2')).to.exist;\n            expect(elementRegistry.get('Task_2A')).to.not.exist;\n            expect(elementRegistry.get('Task_2B')).to.exist;\n\n            expect(elementRegistry.get('SubProcess_1')).to.not.exist;\n\n            expect(canvas.getRootElement()).to.equal(elementRegistry.get('SubProcess_2_plane'));\n          });\n        });\n      });\n\n\n      it('should add root element when importing collapsed sub process', function() {\n\n        // given\n        var xml = require('../../fixtures/bpmn/import/collapsed-subprocess.bpmn');\n\n        // when\n        return runImport(diagram, xml).then(function(result) {\n\n          var warnings = result.warnings;\n\n          // then\n          expect(warnings).to.have.length(0);\n\n          diagram.invoke(function(elementRegistry, canvas) {\n\n            var subProcessRoot = elementRegistry.get('Subprocess_plane');\n            var processRoot = elementRegistry.get('Process_1rjrv55');\n            var subProcessElement = elementRegistry.get('Subprocess');\n            var taskInSubProcessElement = elementRegistry.get('Task_B');\n\n            expect(subProcessRoot).to.exist;\n            expect(subProcessElement).to.exist;\n            expect(taskInSubProcessElement).to.exist;\n\n            expect(canvas.getRootElement()).to.equal(processRoot);\n            expect(subProcessElement.parent).to.equal(processRoot);\n            expect(taskInSubProcessElement.parent).to.equal(subProcessRoot);\n          });\n        });\n      });\n\n    });\n\n  });\n});\n\n\n\n// helpers //////////////////////\n\nfunction expectChildren(diagram, parent, children) {\n\n  return diagram.invoke(function(elementRegistry) {\n\n    // verify model is consistent\n    expect(parent.children).to.eql(children);\n\n    // verify SVG is consistent\n    var parentGfx = elementRegistry.getGraphics(parent);\n\n    var expectedChildrenGfx = children.map(function(c) {\n      return elementRegistry.getGraphics(c);\n    });\n\n    var childrenContainerGfx =\n      domMatches(parentGfx, '[data-element-id=\"Process_1\"]')\n        ? parentGfx\n        : getChildrenGfx(parentGfx);\n\n    var existingChildrenGfx = Array.prototype.map.call(childrenContainerGfx.childNodes, function(c) {\n      return c.querySelector('.djs-element');\n    });\n\n    expect(existingChildrenGfx).to.eql(expectedChildrenGfx);\n  });\n\n}\n"
  },
  {
    "path": "test/spec/import/ModelWiringSpec.js",
    "content": "import {\n  bootstrapViewer,\n  inject\n} from 'test/TestHelper';\n\nimport {\n  is,\n  getDi\n} from 'lib/util/ModelUtil';\n\n\ndescribe('import - model wiring', function() {\n\n\n  describe('basics', function() {\n\n    var xml = require('../../fixtures/bpmn/import/process.bpmn');\n\n    beforeEach(bootstrapViewer(xml));\n\n\n    it('should wire root element', inject(function(elementRegistry, canvas) {\n\n      // when\n      var processElement = elementRegistry.get('Process_1');\n      var subProcessShape = elementRegistry.get('SubProcess_1');\n\n      // then\n      expect(subProcessShape.parent).to.eql(processElement);\n      expect(canvas.getRootElement()).to.eql(processElement);\n\n      expect(is(processElement, 'bpmn:Process')).to.be.true;\n    }));\n\n\n    it('should wire parent child relationship', inject(function(elementRegistry) {\n\n      // when\n      var subProcessShape = elementRegistry.get('SubProcess_1');\n      var startEventShape = elementRegistry.get('StartEvent_1');\n\n      // then\n      expect(startEventShape.type).to.equal('bpmn:StartEvent');\n      expect(startEventShape.parent).to.eql(subProcessShape);\n\n      expect(subProcessShape.children.length).to.equal(4);\n    }));\n\n\n    it('should wire label relationship', inject(function(elementRegistry) {\n\n      // when\n      var startEventShape = elementRegistry.get('StartEvent_1');\n      var label = startEventShape.label;\n\n      // then\n      expect(label).to.exist;\n      expect(label.id).to.equal(startEventShape.id + '_label');\n\n      expect(label.labelTarget).to.eql(startEventShape);\n    }));\n\n\n    it('should wire businessObject', inject(function(elementRegistry) {\n\n      // when\n      var subProcessShape = elementRegistry.get('SubProcess_1');\n      var startEventShape = elementRegistry.get('StartEvent_1');\n\n      var subProcess = subProcessShape.businessObject,\n          startEvent = startEventShape.businessObject;\n\n      // then\n      expect(subProcess).to.exist;\n      expect(is(subProcess, 'bpmn:SubProcess')).to.be.true;\n\n      expect(startEvent).to.exist;\n      expect(is(startEvent, 'bpmn:StartEvent')).to.be.true;\n    }));\n\n\n    it('should wire shape di', inject(function(elementRegistry) {\n\n      // when\n      var subProcessShape = elementRegistry.get('SubProcess_1');\n\n      var subProcess = subProcessShape.businessObject;\n      var subProcessDi = getDi(subProcessShape);\n\n      // then\n      expect(subProcessDi).to.exist;\n      expect(subProcessDi.bpmnElement).to.eql(subProcess);\n    }));\n\n\n    it('should wire connection di', inject(function(elementRegistry) {\n\n      // when\n      var sequenceFlowElement = elementRegistry.get('SequenceFlow_1');\n\n      var sequenceFlow = sequenceFlowElement.businessObject;\n      var sequenceFlowDi = getDi(sequenceFlowElement);\n\n      // then\n      expect(sequenceFlowDi).to.exist;\n      expect(sequenceFlowDi.bpmnElement).to.eql(sequenceFlow);\n    }));\n\n\n    it('should wire label di', inject(function(elementRegistry) {\n\n      // when\n      var eventShape = elementRegistry.get('StartEvent_2');\n      var eventLabel = elementRegistry.get('StartEvent_2_label');\n\n      // assume\n      expect(eventShape).to.exist;\n      expect(eventLabel).to.exist;\n\n      // label relationship wired\n      expect(eventShape.label).to.eql(eventLabel);\n      expect(eventLabel.labelTarget).to.eql(eventShape);\n\n      // moddle relationships wired\n      expect(eventShape.di).to.exist;\n      expect(eventShape.businessObject).to.exist;\n\n      expect(eventShape.di).to.eql(eventLabel.di);\n      expect(eventShape.businessObject).to.eql(eventLabel.businessObject);\n    }));\n\n  });\n\n\n  describe('host attacher relationship', function() {\n\n    var xml = require('../../fixtures/bpmn/import/boundaryEvent.bpmn');\n\n    beforeEach(bootstrapViewer(xml));\n\n\n    it('should wire boundary event', inject(function(elementRegistry) {\n\n      // when\n      var boundaryEventShape = elementRegistry.get('BoundaryEvent_1'),\n          boundaryEvent = boundaryEventShape.businessObject;\n\n      var taskShape = elementRegistry.get('Task_1'),\n          task = taskShape.businessObject;\n\n      // assume\n      expect(boundaryEvent.attachedToRef).to.eql(task);\n\n      // then\n      expect(boundaryEventShape.host).to.eql(taskShape);\n\n      expect(taskShape.attachers).to.exist;\n      expect(taskShape.attachers).to.contain(boundaryEventShape);\n    }));\n\n  });\n\n\n  describe('lanes + flow elements', function() {\n\n    var xml = require('./lane-flowNodes.bpmn');\n\n    beforeEach(bootstrapViewer(xml));\n\n\n    it('should import flowElements as children of Participant', inject(function(elementRegistry) {\n\n      // when\n      var participantShape = elementRegistry.get('Participant_Lane'),\n          taskShape = elementRegistry.get('Task'),\n          sequenceFlowElement = elementRegistry.get('SequenceFlow');\n\n      // then\n      expect(taskShape.parent).to.eql(participantShape);\n      expect(sequenceFlowElement.parent).to.eql(participantShape);\n    }));\n\n\n    it('should wire FlowElement#lanes', inject(function(elementRegistry) {\n\n      // when\n      var taskShape = elementRegistry.get('Task'),\n          task = taskShape.businessObject,\n          laneShape = elementRegistry.get('Lane'),\n          lane = laneShape.businessObject;\n\n      // then\n      expect(task.get('lanes')).to.eql([ lane ]);\n    }));\n\n  });\n\n\n  describe('lanes + flow elements / missing flowNodeRef', function() {\n\n    var xml = require('./lane-missing-flowNodeRef.bpmn');\n\n    beforeEach(bootstrapViewer(xml));\n\n\n    it('should import flowElements as children of Participant', inject(function(elementRegistry) {\n\n      // when\n      var participantShape = elementRegistry.get('Participant_Lane'),\n          taskShape = elementRegistry.get('Task');\n\n      // then\n      // task is part of participant, as no lane was assigned\n      expect(taskShape.parent).to.eql(participantShape);\n    }));\n\n  });\n\n});"
  },
  {
    "path": "test/spec/import/data-association.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_1we2jol\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"4.10.0\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.15.0\">\n  <bpmn:collaboration id=\"Collaboration\">\n    <bpmn:participant id=\"Participant_0fwscxg\" processRef=\"Process_0pshj7s\" />\n    <bpmn:participant id=\"Participant_0kcyhrp\" processRef=\"Process_1swjpet\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_0pshj7s\" isExecutable=\"false\">\n    <bpmn:dataStoreReference id=\"DataStoreReference_1\" />\n  </bpmn:process>\n  <bpmn:process id=\"Process_1swjpet\" isExecutable=\"false\">\n    <bpmn:dataStoreReference id=\"DataStore\" />\n    <bpmn:task id=\"Activity\">\n      <bpmn:property id=\"Property_1eojfva\" name=\"__targetRef_placeholder\" />\n      <bpmn:dataInputAssociation id=\"DataAssociation\">\n        <bpmn:sourceRef>DataStore</bpmn:sourceRef>\n        <bpmn:targetRef>Property_1eojfva</bpmn:targetRef>\n      </bpmn:dataInputAssociation>\n    </bpmn:task>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration\">\n      <bpmndi:BPMNShape id=\"Participant_0fwscxg_di\" bpmnElement=\"Participant_0fwscxg\" isHorizontal=\"true\">\n        <dc:Bounds x=\"160\" y=\"155\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_0kcyhrp_di\" bpmnElement=\"Participant_0kcyhrp\" isHorizontal=\"true\">\n        <dc:Bounds x=\"160\" y=\"440\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_19ilytm_di\" bpmnElement=\"Activity\">\n        <dc:Bounds x=\"240\" y=\"530\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_1mtigs3_di\" bpmnElement=\"DataStore\">\n        <dc:Bounds x=\"235\" y=\"85\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_12byo4m_di\" bpmnElement=\"DataAssociation\">\n        <di:waypoint x=\"260\" y=\"140\" />\n        <di:waypoint x=\"260\" y=\"530\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/import/elements/AssociationSpec.collaboration.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"_c7U8wGD8EeSCE95aAM9ZMQ\" targetNamespace=\"http://activiti.org/bpmn\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"Collaboration_0y2uddj\">\n    <bpmn2:participant id=\"Participant_1m4ccak\" processRef=\"Process_1\" />\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:dataObjectReference id=\"DataObjectReference_1\" name=\"\" dataObjectRef=\"DataObject_1\" />\n    <bpmn2:dataObject id=\"DataObject_1\" name=\"Data Object 1\" />\n    <bpmn2:task id=\"Task_1\">\n      <bpmn2:dataOutputAssociation id=\"DataOutputAssociation\">\n        <bpmn2:targetRef>DataObjectReference_1</bpmn2:targetRef>\n      </bpmn2:dataOutputAssociation>\n    </bpmn2:task>\n    <bpmn2:task id=\"Task_2\">\n      <bpmn2:property id=\"Property_02nwoq1\" name=\"__targetRef_placeholder\" />\n      <bpmn2:dataInputAssociation id=\"DataInputAssociation\">\n        <bpmn2:sourceRef>DataObjectReference_1</bpmn2:sourceRef>\n        <bpmn2:targetRef>Property_02nwoq1</bpmn2:targetRef>\n      </bpmn2:dataInputAssociation>\n    </bpmn2:task>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_0y2uddj\">\n      <bpmndi:BPMNShape id=\"Participant_1m4ccak_di\" bpmnElement=\"Participant_1m4ccak\">\n        <dc:Bounds x=\"72\" y=\"7\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_DataObjectReference_2\" bpmnElement=\"DataObjectReference_1\">\n        <dc:Bounds x=\"341\" y=\"27\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"359\" y=\"77\" width=\"0\" height=\"0\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_1\">\n        <dc:Bounds x=\"122\" y=\"145\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_2\">\n        <dc:Bounds x=\"504\" y=\"145\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_DataOutputAssociation\" bpmnElement=\"DataOutputAssociation\" sourceElement=\"_BPMNShape_Task_2\" targetElement=\"_BPMNShape_DataObjectReference_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"172\" y=\"145\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"172\" y=\"52\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"341\" y=\"52\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_DataInputAssociation\" bpmnElement=\"DataInputAssociation\" sourceElement=\"_BPMNShape_DataObjectReference_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"377\" y=\"52\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"554\" y=\"52\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"554\" y=\"145\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/import/elements/AssociationSpec.compensation.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_l0VD8GDfEeSr3-NpZeAM_A\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:task id=\"Task_1\"/>\n    <bpmn2:boundaryEvent id=\"BoundaryEvent_1\" name=\"\" attachedToRef=\"Task_1\">\n      <bpmn2:compensateEventDefinition id=\"_CompensateEventDefinition_2\" waitForCompletion=\"false\"/>\n    </bpmn2:boundaryEvent>\n    <bpmn2:task id=\"Task_2\" isForCompensation=\"true\"/>\n    <bpmn2:association id=\"Association_1\" sourceRef=\"BoundaryEvent_1\" targetRef=\"Task_2\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"468.0\" y=\"83.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_BoundaryEvent_2\" bpmnElement=\"BoundaryEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"450.0\" y=\"145.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_2\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"536.0\" y=\"223.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_Association_1\" bpmnElement=\"Association_1\" sourceElement=\"_BPMNShape_BoundaryEvent_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"468.0\" y=\"181.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"468.0\" y=\"262.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"536.0\" y=\"263.0\"/>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/spec/import/elements/AssociationSpec.data-association.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_c7U8wGD8EeSCE95aAM9ZMQ\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:dataObject id=\"DataObject_1\" name=\"Data Object 1\"/>\n    <bpmn2:dataObjectReference id=\"DataObjectReference_1\" name=\"\" dataObjectRef=\"DataObject_1\"/>\n    <bpmn2:task id=\"Task_1\">\n      <bpmn2:dataOutputAssociation id=\"DataOutputAssociation\">\n        <bpmn2:targetRef>DataObjectReference_1</bpmn2:targetRef>\n      </bpmn2:dataOutputAssociation>\n    </bpmn2:task>\n    <bpmn2:task id=\"Task_2\">\n      <bpmn2:dataInputAssociation id=\"DataInputAssociation\">\n        <bpmn2:sourceRef>DataObjectReference_1</bpmn2:sourceRef>\n      </bpmn2:dataInputAssociation>\n    </bpmn2:task>\n    <bpmn2:task id=\"Task_3\" />\n    <bpmn2:boundaryEvent id=\"BoundaryEvent\" attachedToRef=\"Task_3\">\n      <bpmn2:dataOutputAssociation id=\"DataOutputAssociation_2\">\n        <bpmn2:targetRef>DataObjectReference_1</bpmn2:targetRef>\n      </bpmn2:dataOutputAssociation>\n    </bpmn2:boundaryEvent>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_1\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"122.0\" y=\"145.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_2\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"504.0\" y=\"145.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_DataObjectReference_1\" bpmnElement=\"DataObjectReference_1\">\n        <dc:Bounds height=\"50.0\" width=\"36.0\" x=\"341.0\" y=\"27.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_DataOutputAssociation\" bpmnElement=\"DataOutputAssociation\" sourceElement=\"_BPMNShape_Task_1\" targetElement=\"_BPMNShape_DataObjectReference_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"172.0\" y=\"145.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"172.0\" y=\"52.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"341.0\" y=\"52.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_DataInputAssociation\" bpmnElement=\"DataInputAssociation\" sourceElement=\"_BPMNShape_DataObjectReference_1\" targetElement=\"_BPMNShape_Task_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"377.0\" y=\"52.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"554.0\" y=\"52.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"554.0\" y=\"145.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task_3\">\n        <dc:Bounds x=\"230\" y=\"150\" width=\"100\" height=\"80\" />      \n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_BoundaryEvent\" bpmnElement=\"BoundaryEvent\">\n        <dc:Bounds x=\"280\" y=\"132\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_DataOutputAssociation_2\" bpmnElement=\"DataOutputAssociation_2\" sourceElement=\"_BPMNShape_BoundaryEvent\" targetElement=\"_BPMNShape_DataObjectReference_1\">\n       <di:waypoint xsi:type=\"dc:Point\" x=\"302\" y=\"132\" />\n       <di:waypoint xsi:type=\"dc:Point\" x=\"350\" y=\"76\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/spec/import/elements/AssociationSpec.data-input-output.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_AupK8GEEEeSt-JfwT49W_w\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn2:ioSpecification id=\"InputOutputSpecification_1\">\n      <bpmn2:dataInput id=\"DataInput_1\"/>\n      <bpmn2:dataOutput id=\"DataOutput_1\"/>\n    </bpmn2:ioSpecification>\n    <bpmn2:task id=\"Task_1\">\n      <bpmn2:dataInputAssociation id=\"DataInputAssociation\">\n        <bpmn2:sourceRef>DataInput_1</bpmn2:sourceRef>\n      </bpmn2:dataInputAssociation>\n      <bpmn2:dataOutputAssociation id=\"DataOutputAssociation\">\n        <bpmn2:targetRef>DataOutput_1</bpmn2:targetRef>\n      </bpmn2:dataOutputAssociation>\n    </bpmn2:task>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_DataInput_2\" bpmnElement=\"DataInput_1\">\n        <dc:Bounds height=\"50.0\" width=\"36.0\" x=\"260.0\" y=\"226.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_DataOutput_2\" bpmnElement=\"DataOutput_1\">\n        <dc:Bounds height=\"50.0\" width=\"36.0\" x=\"462.0\" y=\"226.0\"/>\n        <bpmndi:BPMNLabel>\n          <dc:Bounds height=\"0.0\" width=\"0.0\" x=\"480.0\" y=\"281.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Task_1\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"324.0\" y=\"84.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_DataInputAssociation\" bpmnElement=\"DataInputAssociation\" sourceElement=\"_BPMNShape_DataInput_2\" targetElement=\"_BPMNShape_Task_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"296.0\" y=\"227.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"344.0\" y=\"164.0\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_DataOutputAssociation\" bpmnElement=\"DataOutputAssociation\" sourceElement=\"_BPMNShape_Task_2\" targetElement=\"_BPMNShape_DataOutput_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"407.0\" y=\"164.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"462.0\" y=\"229.0\"/>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/spec/import/elements/AssociationSpec.events.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process\" isExecutable=\"false\">\n    <bpmn:intermediateCatchEvent id=\"CatchEvent\">\n      <bpmn:dataOutputAssociation id=\"DataOutputAssociation\">\n        <bpmn:targetRef>DataObjectReference</bpmn:targetRef>\n      </bpmn:dataOutputAssociation>\n      <bpmn:messageEventDefinition />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:intermediateThrowEvent id=\"ThrowEvent\">\n      <bpmn:property id=\"Property_1vxbjyx\" name=\"__targetRef_placeholder\" />\n      <bpmn:dataInputAssociation id=\"DataInputAssociation\">\n        <bpmn:sourceRef>DataObjectReference</bpmn:sourceRef>\n        <bpmn:targetRef>Property_1vxbjyx</bpmn:targetRef>\n      </bpmn:dataInputAssociation>\n      <bpmn:messageEventDefinition />\n    </bpmn:intermediateThrowEvent>\n    <bpmn:dataObjectReference id=\"DataObjectReference\" dataObjectRef=\"DataObject_1032kkx\" />\n    <bpmn:dataObject id=\"DataObject_1032kkx\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process\">\n      <bpmndi:BPMNShape id=\"CatchEvent_di\" bpmnElement=\"CatchEvent\">\n        <dc:Bounds x=\"44\" y=\"76\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"17\" y=\"112\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_di\" bpmnElement=\"DataOutputAssociation\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"78\" y=\"100\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"164\" y=\"135\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"ThrowEvent_di\" bpmnElement=\"ThrowEvent\">\n        <dc:Bounds x=\"280\" y=\"76\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"253\" y=\"112\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_di\" bpmnElement=\"DataObjectReference\">\n        <dc:Bounds x=\"164\" y=\"117\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"137\" y=\"167\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_di\" bpmnElement=\"DataInputAssociation\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"200\" y=\"135\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"282\" y=\"101\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/import/elements/AssociationSpec.js",
    "content": "import {\n  bootstrapViewer,\n  inject\n} from 'test/TestHelper';\n\n\ndescribe('import - associations', function() {\n\n  describe('should import association', function() {\n\n    it('connecting task -> text annotation', function() {\n\n      var xml = require('./AssociationSpec.text-annotation.bpmn');\n\n      // given\n      return bootstrapViewer(xml)().then(function(result) {\n\n        var err = result.error;\n\n        expect(err).not.to.exist;\n\n        // when\n        inject(function(elementRegistry) {\n\n          var association = elementRegistry.get('Association_1');\n\n          // then\n          expect(association).to.exist;\n        })();\n\n      });\n    });\n\n\n    it('connecting boundary -> compensate task', function() {\n\n      var xml = require('./AssociationSpec.compensation.bpmn');\n\n      // given\n      return bootstrapViewer(xml)().then(function(result) {\n\n        var err = result.error;\n\n        expect(err).not.to.exist;\n\n        // when\n        inject(function(elementRegistry) {\n\n          var association = elementRegistry.get('Association_1');\n\n          // then\n          expect(association).to.exist;\n        })();\n\n      });\n    });\n\n  });\n\n\n  describe('should import data association', function() {\n\n    function expectRendered(elementIds) {\n\n      inject(function(elementRegistry, canvas) {\n\n        elementIds.forEach(function(id) {\n\n          var element = elementRegistry.get(id);\n\n          // then\n          expect(element).to.exist;\n\n          // data associations always rendered on root\n          expect(element.parent).to.eql(canvas.getRootElement());\n        });\n      })();\n    }\n\n\n    it('task -> data object -> task', function() {\n\n      var xml = require('./AssociationSpec.data-association.bpmn');\n\n      // given\n      return bootstrapViewer(xml)().then(function(result) {\n\n        var err = result.error;\n\n        // then\n        expect(err).not.to.exist;\n\n        expectRendered([\n          'DataInputAssociation',\n          'DataOutputAssociation'\n        ]);\n      });\n    });\n\n\n    it('data input -> task -> data output', function() {\n\n      var xml = require('./AssociationSpec.data-input-output.bpmn');\n\n      // given\n      return bootstrapViewer(xml)().then(function(result) {\n\n        var err = result.error;\n\n        // then\n        expect(err).not.to.exist;\n\n        expectRendered([\n          'DataInputAssociation',\n          'DataOutputAssociation'\n        ]);\n      });\n    });\n\n\n    it('in collaboration', function() {\n\n      var xml = require('./AssociationSpec.collaboration.bpmn');\n\n      // given\n      return bootstrapViewer(xml)().then(function(result) {\n\n        var err = result.error;\n\n        // then\n        expect(err).not.to.exist;\n\n        expectRendered([\n          'DataInputAssociation',\n          'DataOutputAssociation'\n        ]);\n      });\n    });\n\n\n    it('catch event -> data object -> throw event', function() {\n\n      var xml = require('./AssociationSpec.events.bpmn');\n\n      // given\n      return bootstrapViewer(xml)().then(function(result) {\n\n        var err = result.error;\n\n        // then\n        expect(err).not.to.exist;\n\n        expectRendered([\n          'DataInputAssociation',\n          'DataOutputAssociation'\n        ]);\n      });\n    });\n\n\n    it('boundary event -> data object', function() {\n\n      var xml = require('./AssociationSpec.data-association.bpmn');\n\n      // given\n      return bootstrapViewer(xml)().then(function(result) {\n\n        var err = result.error;\n\n        // then\n        expect(err).not.to.exist;\n        expectRendered([\n          'DataOutputAssociation_2'\n        ]);\n      });\n\n    });\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/import/elements/AssociationSpec.text-annotation.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:signavio=\"http://www.signavio.com\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" exporter=\"Signavio Process Editor, http://www.signavio.com\" exporterVersion=\"7.9.1\" targetNamespace=\"http://www.signavio.com/bpmn20\">\n  <process id=\"sid-c8371393-9f09-410b-bd7f-b4838b26f391\" isExecutable=\"false\">\n    <task id=\"sid-8F82DC6C-AE16-41F6-9271-229FC57C00F4\" name=\"\">\n    </task>\n    <association id=\"Association_1\" sourceRef=\"sid-8F82DC6C-AE16-41F6-9271-229FC57C00F4\" targetRef=\"sid-A6E3D7E7-B739-4B08-993E-B5CB5F61C69F\">\n    </association>\n    <textAnnotation id=\"sid-A6E3D7E7-B739-4B08-993E-B5CB5F61C69F\">\n      <text>annotation</text>\n    </textAnnotation>\n  </process>\n  <bpmndi:BPMNDiagram id=\"sid-e568f3a9-31ad-4c0c-ab27-ac45c863f186\">\n    <bpmndi:BPMNPlane id=\"sid-e5d306ed-2f42-4263-95b7-d9c187b0d06f\" bpmnElement=\"sid-c8371393-9f09-410b-bd7f-b4838b26f391\">\n      <bpmndi:BPMNShape id=\"sid-8F82DC6C-AE16-41F6-9271-229FC57C00F4_gui\" bpmnElement=\"sid-8F82DC6C-AE16-41F6-9271-229FC57C00F4\">\n        <omgdc:Bounds height=\"80.0\" width=\"100.0\" x=\"110.0\" y=\"15.0\"/>\n        <bpmndi:BPMNLabel labelStyle=\"sid-8b9b9c8e-9479-44ac-bdc1-f690e425822c\">\n          <omgdc:Bounds height=\"12.0\" width=\"82.285706\" x=\"118.85715\" y=\"47.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"sid-A6E3D7E7-B739-4B08-993E-B5CB5F61C69F_gui\" bpmnElement=\"sid-A6E3D7E7-B739-4B08-993E-B5CB5F61C69F\">\n        <omgdc:Bounds height=\"31.0\" width=\"100.0\" x=\"115.0\" y=\"131.0\"/>\n        <bpmndi:BPMNLabel labelStyle=\"sid-08f9dfb8-726a-42d1-b3b6-5a0a9dfcc22e\">\n          <omgdc:Bounds height=\"12.0\" width=\"60.0\" x=\"119.0\" y=\"138.38\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Association_1_gui\" bpmnElement=\"Association_1\">\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"141.0\" y=\"95.0\"/>\n        <omgdi:waypoint xsi:type=\"omgdc:Point\" x=\"123.0\" y=\"131.0\"/>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"sid-08f9dfb8-726a-42d1-b3b6-5a0a9dfcc22e\">\n      <omgdc:Font name=\"Arial\" size=\"11.0\"/>\n    </bpmndi:BPMNLabelStyle>\n    <bpmndi:BPMNLabelStyle id=\"sid-8b9b9c8e-9479-44ac-bdc1-f690e425822c\">\n      <omgdc:Font name=\"Arial\" size=\"12.0\"/>\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n</definitions>"
  },
  {
    "path": "test/spec/import/elements/CollapsedSpec.js",
    "content": "import {\n  bootstrapViewer,\n  inject\n} from 'test/TestHelper';\n\n\ndescribe('import - collapsed container', function() {\n\n  describe('in process', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/import/collapsed/process.bpmn');\n\n    beforeEach(bootstrapViewer(diagramXML));\n\n\n    it('should import collapsed subProcess', inject(function(elementRegistry, canvas) {\n      var collapsedShape = elementRegistry.get('SubProcess_1');\n      var subProcessRoot = canvas.findRoot(collapsedShape);\n      var childShape = elementRegistry.get('IntermediateCatchEvent_1');\n      var childRoot = canvas.findRoot(childShape);\n\n      expect(collapsedShape.collapsed).to.be.true;\n      expect(subProcessRoot).not.to.equal(childRoot);\n    }));\n\n\n    it('should import collapsed transaction', inject(function(elementRegistry, canvas) {\n      var collapsedShape = elementRegistry.get('Transaction_1');\n      var subProcessRoot = canvas.findRoot(collapsedShape);\n      var childShape = elementRegistry.get('UserTask_1');\n      var childRoot = canvas.findRoot(childShape);\n\n      expect(collapsedShape.collapsed).to.be.true;\n      expect(subProcessRoot).not.to.eql(childRoot);\n    }));\n\n\n    it('should import collapsed adhocSubProcess', inject(function(elementRegistry, canvas) {\n      var collapsedShape = elementRegistry.get('AdHocSubProcess_1');\n      var subProcessRoot = canvas.findRoot(collapsedShape);\n      var childShape = elementRegistry.get('StartEvent_1');\n      var childRoot = canvas.findRoot(childShape);\n\n      expect(collapsedShape.collapsed).to.be.true;\n      expect(subProcessRoot).not.to.eql(childRoot);\n    }));\n\n\n    it('should import collapsed with nested elements', inject(function(elementRegistry, canvas) {\n      var collapsedShape = elementRegistry.get('SubProcess_4');\n      var subProcessRoot = canvas.findRoot(collapsedShape);\n      var childShape = elementRegistry.get('SubProcess_5');\n      var childRoot = canvas.findRoot(childShape);\n      var nestedChildShape = elementRegistry.get('Task_3');\n      var nestedChildRoot = canvas.findRoot(nestedChildShape);\n\n      expect(collapsedShape.collapsed).to.be.true;\n      expect(childRoot).not.to.eql(subProcessRoot);\n      expect(nestedChildRoot).not.to.eql(subProcessRoot);\n    }));\n\n\n    it('should import collapsed with nested hidden labels', inject(function(elementRegistry, canvas) {\n      var collapsedShape = elementRegistry.get('SubProcess_2');\n      var subProcessRoot = canvas.findRoot(collapsedShape);\n\n      var hiddenEventShape = elementRegistry.get('StartEvent_2');\n      var hiddenEventRoot = canvas.findRoot(hiddenEventShape);\n      expect(hiddenEventRoot).not.to.eql(subProcessRoot);\n\n      var hiddenDataShape = elementRegistry.get('DataObjectReference_1');\n      var hiddenDataRoot = canvas.findRoot(hiddenDataShape);\n      expect(hiddenDataRoot).not.to.eql(subProcessRoot);\n    }));\n\n\n    it('should import expanded subProcess', inject(function(elementRegistry, canvas) {\n      var expandedShape = elementRegistry.get('SubProcess_3');\n      var expandedRoot = canvas.findRoot(expandedShape);\n      var childShape = elementRegistry.get('Task_2');\n      var childRoot = canvas.findRoot(childShape);\n\n      expect(expandedShape.collapsed).to.be.false;\n      expect(childShape.hidden).to.be.false;\n      expect(expandedRoot).to.eql(childRoot);\n    }));\n\n  });\n\n\n  describe('in collaboration', function() {\n\n    var diagramXML = require('../../../fixtures/bpmn/import/collapsed/collaboration.bpmn');\n\n    beforeEach(bootstrapViewer(diagramXML));\n\n\n    it('should import collapsed subProcess in pool', inject(function(elementRegistry, canvas) {\n      var collapsedShape = elementRegistry.get('SubProcess_1');\n      var subProcessRoot = canvas.findRoot(collapsedShape);\n      var childShape = elementRegistry.get('Task_1');\n      var childRoot = canvas.findRoot(childShape);\n\n      expect(collapsedShape.collapsed).to.be.true;\n      expect(subProcessRoot).not.to.eql(childRoot);\n    }));\n\n\n    it('should import expanded subProcess in pool', inject(function(elementRegistry, canvas) {\n      var expandedShape = elementRegistry.get('SubProcess_2');\n      var expandedRoot = canvas.findRoot(expandedShape);\n      var childShape = elementRegistry.get('StartEvent_1');\n      var childRoot = canvas.findRoot(childShape);\n\n      expect(expandedShape.collapsed).to.be.false;\n      expect(childShape.hidden).to.be.false;\n      expect(expandedRoot).to.eql(childRoot);\n    }));\n\n\n    it('should import collapsed subProcess in lane', inject(function(elementRegistry, canvas) {\n      var expandedShape = elementRegistry.get('SubProcess_4');\n      var subProcessRoot = canvas.findRoot(expandedShape);\n      var childShape = elementRegistry.get('Task_2');\n      var childRoot = canvas.findRoot(childShape);\n\n      expect(expandedShape.collapsed).to.be.true;\n      expect(subProcessRoot).not.to.eql(childRoot);\n    }));\n\n\n    it('should import expanded subProcess in lane', inject(function(elementRegistry, canvas) {\n      var expandedShape = elementRegistry.get('SubProcess_3');\n      var expandedRoot = canvas.findRoot(expandedShape);\n      var childShape = elementRegistry.get('StartEvent_2');\n      var childRoot = canvas.findRoot(childShape);\n\n      expect(expandedShape.collapsed).to.be.false;\n      expect(childShape.hidden).to.be.false;\n      expect(expandedRoot).to.eql(childRoot);\n    }));\n\n  });\n\n});"
  },
  {
    "path": "test/spec/import/elements/DataInputOutput.bpmn",
    "content": "<semantic:definitions xmlns:semantic=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:color=\"http://www.omg.org/spec/BPMN/non-normative/color/1.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"_af3cbf6a-9c69-460b-9a1d-276711d30213\" targetNamespace=\"http://www.trisotech.com/definitions/_af3cbf6a-9c69-460b-9a1d-276711d30213\" expressionLanguage=\"http://www.w3.org/1999/XPath\" exporter=\"BPMN Modeler\" exporterVersion=\"6.1.22\" name=\"Travel Booking with Event Subprocess\">\n  <semantic:process id=\"Process\" name=\"Simple Travel Booking\" isClosed=\"false\">\n    <semantic:ioSpecification>\n      <semantic:dataInput name=\"Input\" isCollection=\"false\" id=\"DataInput\"/>\n      <semantic:dataOutput name=\"Output\" isCollection=\"false\" id=\"DataOutput\"/>\n      <semantic:inputSet id=\"Process_InputSet\">\n        <semantic:dataInputRefs>DataInput</semantic:dataInputRefs>\n      </semantic:inputSet>\n      <semantic:outputSet id=\"Process_OutputSet\">\n        <semantic:dataOutputRefs>DataOutput</semantic:dataOutputRefs>\n      </semantic:outputSet>\n    </semantic:ioSpecification>\n    <semantic:sendTask id=\"Task\" name=\"Process Data\" implementation=\"##WebService\">\n      <semantic:ioSpecification>\n        <semantic:dataInput id=\"Task_DataInput\"/>\n        <semantic:dataOutput id=\"Task_DataOutput\"/>\n        <semantic:inputSet id=\"Task_InputSet\">\n          <semantic:dataInputRefs>Task_DataInput</semantic:dataInputRefs>\n        </semantic:inputSet>\n        <semantic:outputSet id=\"Task_OutputSet\">\n          <semantic:dataOutputRefs>Task_DataOutput</semantic:dataOutputRefs>\n        </semantic:outputSet>\n      </semantic:ioSpecification>\n      <semantic:dataInputAssociation id=\"DataInputAssociation\">\n        <semantic:sourceRef>DataInput</semantic:sourceRef>\n        <semantic:targetRef>Task_DataInput</semantic:targetRef>\n      </semantic:dataInputAssociation>\n      <semantic:dataOutputAssociation id=\"DataOutputAssociation\">\n        <semantic:sourceRef>Task_DataOutput</semantic:sourceRef>\n        <semantic:targetRef>DataOutput</semantic:targetRef>\n      </semantic:dataOutputAssociation>\n    </semantic:sendTask>\n  </semantic:process>\n  <bpmndi:BPMNDiagram id=\"_f1aecfc3-a3da-4bde-bece-87786e25273d\" name=\"Simple Travel Booking\">\n    <bpmndi:BPMNPlane bpmnElement=\"Process\" id=\"_f1aecfc3-a3da-4bde-bece-87786e25273d_plane\">\n      <bpmndi:BPMNShape id=\"DataOutput_di\" bpmnElement=\"DataOutput\">\n        <dc:Bounds x=\"285\" y=\"150\" width=\"34\" height=\"40\"/>\n        <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n          <dc:Bounds height=\"12\" width=\"30\" x=\"285\" y=\"195\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataInput_di\" bpmnElement=\"DataInput\">\n        <dc:Bounds x=\"100\" y=\"100\" width=\"34\" height=\"40\"/>\n        <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n          <dc:Bounds height=\"12\" width=\"30\" x=\"100\" y=\"150\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_di\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"167\" y=\"200\" width=\"96\" height=\"76\"/>\n        <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n          <dc:Bounds height=\"26\" width=\"89\" x=\"170.5\" y=\"261.9739767206677\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"DataInputAssociation_di\" bpmnElement=\"DataInputAssociation\" targetElement=\"Task_di\">\n        <di:waypoint x=\"135\" y=\"113.99809778522484\"/>\n        <di:waypoint x=\"215\" y=\"113.99809778522484\"/>\n        <di:waypoint x=\"215\" y=\"200\"/>\n        <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"DataOutputAssociation_di\" bpmnElement=\"DataOutputAssociation\" sourceElement=\"Task\">\n        <di:waypoint x=\"230\" y=\"200\"/>\n        <di:waypoint x=\"230\" y=\"170\"/>\n        <di:waypoint x=\"285\" y=\"170\"/>\n        <bpmndi:BPMNLabel labelStyle=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\"/>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_0\">\n      <dc:Font name=\"Arial\" size=\"11\" isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\"/>\n    </bpmndi:BPMNLabelStyle>\n    <bpmndi:BPMNLabelStyle id=\"LS_f1aecfc3-a3da-4bde-bece-87786e25273d_1\">\n      <dc:Font name=\"arial,helvetica,sans-serif\" size=\"11\" isBold=\"false\" isItalic=\"false\" isStrikeThrough=\"false\" isUnderline=\"false\"/>\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n</semantic:definitions>"
  },
  {
    "path": "test/spec/import/elements/DataInputOutputSpec.js",
    "content": "import {\n  bootstrapViewer,\n  inject\n} from 'test/TestHelper';\n\n\ndescribe('import - data input/output', function() {\n\n  describe('should import external labels', function() {\n\n    it('with di', function() {\n\n      var xml = require('./DataInputOutput.bpmn');\n\n      // given\n      return bootstrapViewer(xml).call(this).then(function(result) {\n\n        var err = result.error;\n\n        expect(err).not.to.exist;\n\n        // when\n        inject(function(elementRegistry) {\n\n          var inputLabel = elementRegistry.get('DataInput').label,\n              outputLabel = elementRegistry.get('DataOutput').label;\n\n          var inputLabelCenter = getCenter(inputLabel),\n              outputCenter = getCenter(outputLabel);\n\n          // then\n          expect(inputLabelCenter.x).to.be.within(110, 130);\n          expect(inputLabelCenter.y).to.be.within(150, 170);\n          expect(inputLabel.width).to.be.above(20);\n          expect(inputLabel.height).to.be.above(10);\n\n          expect(outputCenter.x).to.be.within(290, 310);\n          expect(outputCenter.y).to.be.within(190, 210);\n          expect(outputLabel.width).to.be.above(20);\n          expect(outputLabel.height).to.be.above(10);\n        })();\n\n      });\n    });\n\n  });\n\n});\n\n\n// helper ////////////////\n\nfunction getCenter(element) {\n  return {\n    x: element.x + Math.ceil(element.width / 2),\n    y: element.y + Math.ceil(element.height / 2)\n  };\n}\n"
  },
  {
    "path": "test/spec/import/elements/Groups.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-0fcc2144-457b-4505-9e44-ff673663e3bc\" targetNamespace=\"http://www.signavio.com/bpmn20\" exporter=\"Camunda Modeler\" exporterVersion=\"3.0.1\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd\">\n  <category id=\"Category_1\">\n    <categoryValue id=\"CategoryValue_1\" value=\"my group\" />\n  </category>\n  <process id=\"Process_1\" processType=\"None\" isExecutable=\"false\">\n    <group id=\"Group_1\" categoryValueRef=\"CategoryValue_1\" />\n    <group id=\"Group_2\" categoryValueRef=\"CategoryValue_1\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Group_1di\" bpmnElement=\"Group_1\">\n        <omgdc:Bounds x=\"180\" y=\"105\" width=\"188\" height=\"154\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"184\" y=\"107\" width=\"58.28571319580078\" height=\"15\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Group_2di\" bpmnElement=\"Group_2\">\n        <omgdc:Bounds x=\"180\" y=\"279\" width=\"188\" height=\"154\" />\n        <bpmndi:BPMNLabel>\n          <omgdc:Bounds x=\"184\" y=\"107\" width=\"58.28571319580078\" height=\"15\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/import/elements/GroupsSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\n\ndescribe('import - groups', function() {\n\n  describe('should import groups', function() {\n\n    it('with frame property set', function() {\n      var xml = require('./Groups.bpmn');\n\n      // given\n      return bootstrapModeler(xml)().then(function(result) {\n\n        var err = result.error;\n\n        expect(err).not.to.exist;\n\n        // when\n        inject(function(elementRegistry) {\n\n          // then\n          var groupElement = elementRegistry.get('Group_1');\n\n          expect(groupElement).to.exist;\n          expect(groupElement.isFrame).to.be.true;\n        })();\n\n      });\n    });\n\n\n  });\n\n});\n"
  },
  {
    "path": "test/spec/import/elements/LabelSpec.js",
    "content": "import {\n  bootstrapViewer,\n  inject\n} from 'test/TestHelper';\n\n\ndescribe('import - labels', function() {\n\n  describe('should import embedded labels', function() {\n\n    it('on flow nodes', function() {\n      var xml = require('../../../fixtures/bpmn/import/labels/embedded.bpmn');\n      return bootstrapViewer(xml)().then(function(result) {\n        expect(result.error).not.to.exist;\n      });\n    });\n\n\n    it('on pools and lanes', function() {\n      var xml = require('../../../fixtures/bpmn/import/labels/collaboration.bpmn');\n      return bootstrapViewer(xml)().then(function(result) {\n        expect(result.error).not.to.exist;\n      });\n    });\n\n\n    it('on message flows', function() {\n      var xml = require('../../../fixtures/bpmn/import/labels/collaboration-message-flows.bpmn');\n      return bootstrapViewer(xml)().then(function(result) {\n        expect(result.error).not.to.exist;\n      });\n    });\n\n  });\n\n\n  describe('should import external labels', function() {\n\n    it('with di', function() {\n      var xml = require('../../../fixtures/bpmn/import/labels/external.bpmn');\n\n      // given\n      return bootstrapViewer(xml)().then(function(result) {\n\n        var err = result.error;\n\n        expect(err).not.to.exist;\n\n        // when\n        inject(function(elementRegistry) {\n\n          var eventLabel = elementRegistry.get('EndEvent_1').label,\n              sequenceFlowLabel = elementRegistry.get('SequenceFlow_1').label;\n\n          var eventLabelCenter = getCenter(eventLabel),\n              sequenceFlowCenter = getCenter(sequenceFlowLabel);\n\n          // then\n          expect(eventLabelCenter.x).to.be.within(270, 272);\n          expect(eventLabelCenter.y).to.be.within(269, 271);\n          expect(eventLabel.width).to.be.above(65);\n          expect(eventLabel.height).to.be.above(20);\n\n          expect(sequenceFlowCenter.x).to.be.within(481, 483);\n          expect(sequenceFlowCenter.y).to.be.within(323, 335);\n          expect(sequenceFlowLabel.width).to.be.above(64);\n          expect(sequenceFlowLabel.height).to.be.above(11);\n        })();\n\n      });\n    });\n\n\n    it('without di', function() {\n      var xml = require('../../../fixtures/bpmn/import/labels/external-no-di.bpmn');\n      return bootstrapViewer(xml)().then(function(result) {\n        expect(result.error).not.to.exist;\n      });\n    });\n\n  });\n\n});\n\n\n// helper ////////////////\n\nfunction getCenter(element) {\n  return {\n    x: element.x + Math.ceil(element.width / 2),\n    y: element.y + Math.ceil(element.height / 2)\n  };\n}\n"
  },
  {
    "path": "test/spec/import/lane-flowNodes.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"_4bAZoD9WEeWLcNBL4nCk1A\" targetNamespace=\"http://activiti.org/bpmn\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"Participant_Lane\" name=\"Participant_Lane\" processRef=\"Process_Lane\" />\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_Lane\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Lane\" name=\"Lane\">\n        <bpmn2:flowNodeRef>Other_Task</bpmn2:flowNodeRef>\n        <bpmn2:flowNodeRef>Task</bpmn2:flowNodeRef>\n      </bpmn2:lane>\n    </bpmn2:laneSet>\n    <bpmn2:task id=\"Other_Task\" name=\"Other_Task\">\n      <bpmn2:outgoing>SequenceFlow</bpmn2:outgoing>\n    </bpmn2:task>\n    <bpmn2:sequenceFlow id=\"SequenceFlow\" name=\"\" sourceRef=\"Other_Task\" targetRef=\"Task\" />\n    <bpmn2:task id=\"Task\" name=\"Task\">\n      <bpmn2:incoming>SequenceFlow</bpmn2:incoming>\n    </bpmn2:task>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"Participant_Lane\" isHorizontal=\"true\">\n        <dc:Bounds x=\"156\" y=\"84\" width=\"540\" height=\"181\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_2\" bpmnElement=\"Other_Task\">\n        <dc:Bounds x=\"348\" y=\"114\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task\">\n        <dc:Bounds x=\"516\" y=\"114\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow\" sourceElement=\"_BPMNShape_Task_2\" targetElement=\"_BPMNShape_Task_3\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"448\" y=\"154\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"516\" y=\"154\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"487\" y=\"154\" width=\"6\" height=\"6\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_3\" bpmnElement=\"Lane\" isHorizontal=\"true\">\n        <dc:Bounds x=\"186\" y=\"84\" width=\"510\" height=\"181\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>\n"
  },
  {
    "path": "test/spec/import/lane-missing-flowNodeRef.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xsi:schemaLocation=\"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\" id=\"_4bAZoD9WEeWLcNBL4nCk1A\" exporter=\"camunda modeler\" exporterVersion=\"2.6.0\" targetNamespace=\"http://activiti.org/bpmn\">\n  <bpmn2:collaboration id=\"_Collaboration_2\">\n    <bpmn2:participant id=\"Participant_Lane\" name=\"Participant_Lane\" processRef=\"Process_Lane\"/>\n  </bpmn2:collaboration>\n  <bpmn2:process id=\"Process_Lane\" isExecutable=\"false\">\n    <bpmn2:laneSet id=\"LaneSet_1\" name=\"Lane Set 1\">\n      <bpmn2:lane id=\"Lane\" name=\"Lane\"/>\n    </bpmn2:laneSet>\n    <bpmn2:task id=\"Task\" name=\"Task\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"_Collaboration_2\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_Participant_2\" bpmnElement=\"Participant_Lane\" isHorizontal=\"true\">\n        <dc:Bounds height=\"181.0\" width=\"540.0\" x=\"156.0\" y=\"84.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Task_3\" bpmnElement=\"Task\">\n        <dc:Bounds height=\"80.0\" width=\"100.0\" x=\"516.0\" y=\"114.0\"/>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_Lane_3\" bpmnElement=\"Lane\" isHorizontal=\"true\">\n        <dc:Bounds height=\"181.0\" width=\"510.0\" x=\"186.0\" y=\"84.0\"/>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "test/spec/import/missing-di-plane-root-element.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_01360mp\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.23.0\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.21.0\">\n  <bpmn:process id=\"PROCESS\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"SUB_PROCESS\">\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\">\n      <bpmndi:BPMNShape id=\"SUB_PROCESS_di\" bpmnElement=\"SUB_PROCESS\" isExpanded=\"false\">\n        <dc:Bounds x=\"355\" y=\"160\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/import/missing-di-plane.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:modeler=\"http://camunda.org/schema/modeler/1.0\" id=\"Definitions_01360mp\" targetNamespace=\"http://bpmn.io/schema/bpmn\" exporter=\"Camunda Modeler\" exporterVersion=\"5.23.0\" modeler:executionPlatform=\"Camunda Platform\" modeler:executionPlatformVersion=\"7.21.0\">\n  <bpmn:process id=\"PROCESS\" isExecutable=\"true\">\n    <bpmn:subProcess id=\"SUB_PROCESS\">\n      <bpmn:subProcess id=\"SUB_PROCESS_MISSING_DI\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"PROCESS\">\n      <bpmndi:BPMNShape id=\"SUB_PROCESS_di\" bpmnElement=\"SUB_PROCESS\" isExpanded=\"false\">\n        <dc:Bounds x=\"355\" y=\"160\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n  <!-- missing plane element -->\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_2\">\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/import/sequenceFlow-missingWaypoints.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" id=\"sid-38422fae-e03e-43a3-bef4-bd33b32041b2\" targetNamespace=\"http://bpmn.io/bpmn\" exporter=\"bpmn-js (https://demo.bpmn.io)\" exporterVersion=\"3.2.1\">\n  <process id=\"Process_1\" isExecutable=\"false\">\n    <startEvent id=\"Event\">\n      <outgoing>SequenceFlow</outgoing>\n    </startEvent>\n    <task id=\"Task\">\n      <incoming>SequenceFlow</incoming>\n    </task>\n    <sequenceFlow id=\"SequenceFlow\" sourceRef=\"Event\" targetRef=\"Task\" />\n  </process>\n  <bpmndi:BPMNDiagram id=\"BpmnDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BpmnPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Event_di\" bpmnElement=\"Event\">\n        <omgdc:Bounds x=\"163\" y=\"151\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_di\" bpmnElement=\"Task\">\n        <omgdc:Bounds x=\"249\" y=\"129\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_di\" bpmnElement=\"SequenceFlow\">\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</definitions>\n"
  },
  {
    "path": "test/spec/import/sequenceFlow-ordering.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:collaboration id=\"Collaboration_0mfxch0\">\n    <bpmn:participant id=\"Participant_1jxpy8o\" processRef=\"Process_1\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:laneSet>\n      <bpmn:lane id=\"Lane_0p1e6ph\">\n        <bpmn:flowNodeRef>Task_16z77et</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>StartEvent_1</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>Task_14uuigv</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>EndEvent_0exo24i</bpmn:flowNodeRef>\n      </bpmn:lane>\n      <bpmn:lane id=\"Lane_1onrzg4\">\n        <bpmn:flowNodeRef>Task_1y8k07l</bpmn:flowNodeRef>\n        <bpmn:flowNodeRef>ExclusiveGateway_0xyt6ot</bpmn:flowNodeRef>\n      </bpmn:lane>\n    </bpmn:laneSet>\n    <bpmn:task id=\"Task_16z77et\">\n      <bpmn:incoming>SequenceFlow_1q8max9</bpmn:incoming>\n    </bpmn:task>\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>SequenceFlow_1q8max9</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:task id=\"Task_14uuigv\" />\n    <bpmn:endEvent id=\"EndEvent_0exo24i\">\n      <bpmn:incoming>SequenceFlow_01mqkl9</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:task id=\"Task_1y8k07l\">\n      <bpmn:outgoing>SequenceFlow_01mqkl9</bpmn:outgoing>\n    </bpmn:task>\n    <bpmn:exclusiveGateway id=\"ExclusiveGateway_0xyt6ot\" />\n    <bpmn:dataObjectReference id=\"DataObjectReference_0wub6uo\" dataObjectRef=\"DataObject_06ep7y5\" />\n    <bpmn:dataObject id=\"DataObject_06ep7y5\" />\n    <bpmn:dataStoreReference id=\"DataStoreReference_1ioqvkf\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_1q8max9\" sourceRef=\"StartEvent_1\" targetRef=\"Task_16z77et\" />\n    <bpmn:sequenceFlow id=\"SequenceFlow_01mqkl9\" sourceRef=\"Task_1y8k07l\" targetRef=\"EndEvent_0exo24i\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_0mfxch0\">\n      <bpmndi:BPMNShape id=\"Participant_1jxpy8o_di\" bpmnElement=\"Participant_1jxpy8o\">\n        <dc:Bounds x=\"90\" y=\"65.5\" width=\"600\" height=\"323\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_16z77et_di\" bpmnElement=\"Task_16z77et\">\n        <dc:Bounds x=\"473\" y=\"88\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"140\" y=\"206\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"113\" y=\"176\" width=\"90\" height=\"20\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_14uuigv_di\" bpmnElement=\"Task_14uuigv\">\n        <dc:Bounds x=\"280\" y=\"157\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"EndEvent_0exo24i_di\" bpmnElement=\"EndEvent_0exo24i\">\n        <dc:Bounds x=\"181\" y=\"86\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"154\" y=\"64\" width=\"90\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Task_1y8k07l_di\" bpmnElement=\"Task_1y8k07l\">\n        <dc:Bounds x=\"321\" y=\"289\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"ExclusiveGateway_0xyt6ot_di\" bpmnElement=\"ExclusiveGateway_0xyt6ot\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"182\" y=\"242\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"162\" y=\"296\" width=\"90\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataObjectReference_0wub6uo_di\" bpmnElement=\"DataObjectReference_0wub6uo\">\n        <dc:Bounds x=\"461\" y=\"242\" width=\"36\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"434\" y=\"296\" width=\"90\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"DataStoreReference_1ioqvkf_di\" bpmnElement=\"DataStoreReference_1ioqvkf\">\n        <dc:Bounds x=\"542\" y=\"242\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"522\" y=\"296\" width=\"90\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_1q8max9_di\" bpmnElement=\"SequenceFlow_1q8max9\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"158\" y=\"242\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"158\" y=\"265\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"617\" y=\"265\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"617\" y=\"128\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"573\" y=\"128\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"343\" y=\"244\" width=\"90\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"SequenceFlow_01mqkl9_di\" bpmnElement=\"SequenceFlow_01mqkl9\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"371\" y=\"289\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"371\" y=\"190\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"199\" y=\"190\" />\n        <di:waypoint xsi:type=\"dc:Point\" x=\"199\" y=\"122\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"240\" y=\"169\" width=\"90\" height=\"12\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Lane_0p1e6ph_di\" bpmnElement=\"Lane_0p1e6ph\">\n        <dc:Bounds x=\"120\" y=\"65.5\" width=\"570\" height=\"162\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Lane_1onrzg4_di\" bpmnElement=\"Lane_1onrzg4\">\n        <dc:Bounds x=\"120\" y=\"227.5\" width=\"570\" height=\"161\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "test/spec/util/ModelUtilSpec.js",
    "content": "import {\n  bootstrapModeler,\n  inject\n} from 'test/TestHelper';\n\nimport coreModule from 'lib/core';\nimport modelingModule from 'lib/features/modeling';\n\nimport {\n  is,\n  isAny,\n  getDi\n} from 'lib/util/ModelUtil';\n\n\ndescribe('util/ModelUtil', function() {\n\n  var diagramXML = require('../../fixtures/bpmn/simple.bpmn');\n\n  beforeEach(bootstrapModeler(diagramXML, {\n    modules: [\n      coreModule,\n      modelingModule\n    ]\n  }));\n\n\n  describe('#is', function() {\n\n    it('should work with diagram element', inject(function(elementFactory) {\n\n      // given\n      var messageFlowConnection = elementFactory.createConnection({ type: 'bpmn:MessageFlow' });\n\n      // then\n      expect(is(messageFlowConnection, 'bpmn:MessageFlow')).to.be.true;\n      expect(is(messageFlowConnection, 'bpmn:BaseElement')).to.be.true;\n\n      expect(is(messageFlowConnection, 'bpmn:SequenceFlow')).to.be.false;\n      expect(is(messageFlowConnection, 'bpmn:Task')).to.be.false;\n    }));\n\n\n    it('should work with business object', inject(function(bpmnFactory) {\n\n      // given\n      var gateway = bpmnFactory.create('bpmn:Gateway');\n\n      // then\n      expect(is(gateway, 'bpmn:Gateway')).to.be.true;\n      expect(is(gateway, 'bpmn:BaseElement')).to.be.true;\n\n      expect(is(gateway, 'bpmn:SequenceFlow')).to.be.false;\n    }));\n\n\n    it('should work with untyped business object', inject(function() {\n\n      // given\n      var foo = { businessObject: 'BAR' };\n\n      // then\n      expect(is(foo, 'FOO')).to.be.false;\n    }));\n\n\n    it('should work with untyped diagram element', inject(function() {\n\n      // given\n      var foo = { };\n\n      // then\n      expect(is(foo, 'FOO')).to.be.false;\n    }));\n\n  });\n\n\n  describe('isAny', function() {\n\n    it('should work on shape', inject(function(bpmnFactory, elementFactory) {\n\n      // given\n      var element = elementFactory.createShape({ type: 'bpmn:Gateway' });\n\n      // then\n      expect(isAny(element, [ 'bpmn:Gateway' ])).to.be.true;\n      expect(isAny(element, [ 'bpmn:SequenceFlow', 'bpmn:Gateway' ])).to.be.true;\n      expect(isAny(element, [ 'bpmn:BaseElement' ])).to.be.true;\n      expect(isAny(element, [ 'bpmn:SequenceFlow' ])).to.be.false;\n    }));\n\n\n    it('should work on businessObject', inject(function(bpmnFactory, elementFactory) {\n\n      // given\n      var businessObject = bpmnFactory.create('bpmn:Gateway');\n\n      // then\n      expect(isAny(businessObject, [ 'bpmn:Gateway' ])).to.be.true;\n      expect(isAny(businessObject, [ 'bpmn:SequenceFlow', 'bpmn:Gateway' ])).to.be.true;\n      expect(isAny(businessObject, [ 'bpmn:BaseElement' ])).to.be.true;\n      expect(isAny(businessObject, [ 'bpmn:SequenceFlow' ])).to.be.false;\n    }));\n\n  });\n\n\n  describe('#getDi', function() {\n\n    it('return a di', inject(function() {\n\n      // given\n      var element = { di: 'foo' };\n\n      // then\n      expect(getDi(element)).to.equal('foo');\n    }));\n\n\n    it('should ignore element without di', inject(function() {\n\n      // given\n      var element = { };\n\n      // then\n      expect(getDi(element)).to.be.undefined;\n    }));\n\n  });\n\n});"
  },
  {
    "path": "test/spec/util/svgHelpersSpec.js",
    "content": "import { expectSvgPath, compareSvgPaths, pathToNumbers } from '../../util/svgHelpers';\n\n\ndescribe('test helpers - svgHelpers', function() {\n\n  describe('expectSvgPath', function() {\n\n    it('should return true for equal paths', function() {\n\n      // given\n      const pathA = 'M10,20L30,40';\n      const pathB = 'M10,20L30,40';\n\n      // then\n      expectSvgPath(pathA, pathB);\n    });\n\n\n    it('should return true for approximately equal paths', function() {\n\n      // given\n      const pathA = 'M187,263m0,-18a18,18,0,1,1,0,36a18,18,0,1,1,0,-36z';\n      const pathB = 'M186,262m0,-18a18,18,0,1,1,0,36a18,18,0,1,1,0,-34z';\n\n      // then\n      expectSvgPath(pathA, pathB, 3);\n    });\n  });\n\n\n  describe('compareSvgPaths', function() {\n\n    it('should return false for different paths', function() {\n\n      // given\n      const pathA = 'M187,263m0,-18a13,13,0,1,1,0,36a18,18,0,1,1,0,-36z';\n      const pathB = 'M181,262m0,-18a13,13,0,1,1,0,36a18,18,0,1,1,0,-34z';\n\n      // when\n      const equal = compareSvgPaths(pathA, pathB, 3);\n\n      // then\n      expect(equal).to.be.false;\n    });\n\n\n    it('should return false for paths of different length', function() {\n\n      // given\n      const pathA = 'M10,20L30,40';\n      const pathB = 'M10,20L30,40L50,60';\n\n      // when\n      const equal = compareSvgPaths(pathA, pathB, 3);\n\n      // then\n      expect(equal).to.be.false;\n    });\n  });\n\n  describe('pathToNumbers', function() {\n\n    it('should extract numbers from path', function() {\n\n      // when\n      const numbers = pathToNumbers('M10,20L30,40');\n\n      // then\n      expect(numbers).to.eql([ 10, 20, 30, 40 ]);\n    });\n\n  });\n\n});"
  },
  {
    "path": "test/testBundle.js",
    "content": "var allTests = require.context('.', true, /(spec|integration).*Spec\\.js$/);\n\nallTests.keys().forEach(allTests);"
  },
  {
    "path": "test/util/KeyEvents.js",
    "content": "import {\n  isString,\n  assign\n} from 'min-dash';\n\n/**\n * Create a fake key event for testing purposes.\n *\n * @param {string|number} key the key or keyCode/charCode\n * @param {Object} [attrs]\n *\n * @return {Event}\n */\nexport function createKeyEvent(key, attrs) {\n  var event = document.createEvent('Events') || new document.defaultView.CustomEvent('keyEvent');\n\n  // init and mark as bubbles / cancelable\n  event.initEvent('keydown', false, true);\n\n  var keyAttrs = isString(key) ? { key: key } : { keyCode: key, which: key };\n\n  return assign(event, keyAttrs, attrs || {});\n}"
  },
  {
    "path": "test/util/MockEvents.js",
    "content": "import {\n  assign\n} from 'min-dash';\n\nimport {\n  getBpmnJS\n} from 'test/TestHelper';\n\n\n/**\n * Create an event with global coordinates\n * computed based on the loaded diagrams canvas position and the\n * specified canvas local coordinates.\n *\n * @param {Point} point of the event local the canvas (closure)\n * @param {Object} [data]\n *\n * @return {Event} event, scoped to the given canvas\n */\nexport function createCanvasEvent(position, data) {\n\n  return getBpmnJS().invoke(function(canvas) {\n\n    var target = canvas._svg;\n\n    var clientRect = canvas._container.getBoundingClientRect();\n\n    var absolutePosition = {\n      x: position.x + clientRect.left,\n      y: position.y + clientRect.top\n    };\n\n    return createEvent(target, absolutePosition, data);\n  });\n}\n\n/**\n * Create an Event\n *\n * @param  {Element} target\n * @param  { { x: number, y: number } } position\n * @param  {any} [data]\n *\n * @return {Event}\n */\nexport function createEvent(target, position, data) {\n\n  return getBpmnJS().invoke(function(eventBus) {\n    data = assign({\n      target: target,\n      x: position.x,\n      y: position.y,\n      clientX: position.x,\n      clientY: position.y,\n      offsetX: position.x,\n      offsetY: position.y,\n      button: 0\n    }, data || {});\n\n    return eventBus.createEvent(data);\n  });\n}"
  },
  {
    "path": "test/util/custom-rules/CustomRules.js",
    "content": "import inherits from 'inherits-browser';\n\nimport RuleProvider from 'diagram-js/lib/features/rules/RuleProvider';\n\n\nexport default function CustomRules(eventBus) {\n  RuleProvider.call(this, eventBus);\n}\n\nCustomRules.$inject = [ 'eventBus' ];\n\ninherits(CustomRules, RuleProvider);\n\nCustomRules.prototype.init = function() {\n\n  // placeholder\n};"
  },
  {
    "path": "test/util/custom-rules/index.js",
    "content": "import CustomRules from './CustomRules';\n\nexport default {\n  __init__: [ 'customRules' ],\n  customRules: [ 'type', CustomRules ]\n};\n"
  },
  {
    "path": "test/util/svgHelpers.js",
    "content": "/**\n * Assert if two SVG paths are approximately equal within a given tolerance.\n *\n * @param {string} actual\n * @param {string} expected\n * @param {number} [tolerance=2]\n */\nexport function expectSvgPath(actual, expected, tolerance = 2) {\n  const result = compareSvgPaths(actual, expected, tolerance);\n  expect(result).to.equal(true, `expected SVG path \"${actual}\" to approximately equal \"${expected}\"`);\n}\n\n/**\n * Returns true if two SVG paths are approximately equal within a given tolerance.\n *\n * @param {string} pathA\n * @param {string} pathB\n * @param {number} [tolerance=2]\n * @returns {boolean}\n */\nexport function compareSvgPaths(pathA, pathB, tolerance = 2) {\n  const actualNumbers = pathToNumbers(pathA);\n  const expectedNumbers = pathToNumbers(pathB);\n\n  if (actualNumbers.length !== expectedNumbers.length) {\n    return false;\n  }\n\n  for (let i = 0; i < actualNumbers.length; i++) {\n    if (Math.abs(actualNumbers[i] - expectedNumbers[i]) > tolerance) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n/**\n * Get an array of numeric values from an SVG path string.\n *\n * @example\n * `pathToNumber('M10,20L30,40')` => `[10, 20, 30, 40]`\n *\n * @param {string} path\n * @returns {number[]}\n */\nexport function pathToNumbers(path) {\n  const normalized = path.toLowerCase();\n  const parts = normalized.split(/[a-z,]/g).filter(s => s !== '');\n\n  return parts.map(parseFloat);\n}"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"lib\": [\n      \"DOM\",\n      \"ES2018\"\n    ],\n    \"strict\": true\n  },\n  \"include\": [\n    \"./lib/**/*.d.ts\",\n    \"./lib/**/*.spec.ts\"\n  ]\n}"
  }
]