@kern0x1b/penstock-cli 26.10.0 → 26.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/THIRD-PARTY-NOTICES.md +1647 -0
  2. package/dist/grammars/tree-sitter-c-sharp.wasm +0 -0
  3. package/dist/grammars/tree-sitter-go.wasm +0 -0
  4. package/dist/grammars/tree-sitter-groovy.wasm +0 -0
  5. package/dist/grammars/tree-sitter-java.wasm +0 -0
  6. package/dist/grammars/tree-sitter-javascript.wasm +0 -0
  7. package/dist/grammars/tree-sitter-kotlin.wasm +0 -0
  8. package/dist/grammars/tree-sitter-python.wasm +0 -0
  9. package/dist/grammars/tree-sitter-scala.wasm +0 -0
  10. package/dist/grammars/tree-sitter-typescript.wasm +0 -0
  11. package/dist/grammars/web-tree-sitter.wasm +0 -0
  12. package/dist/penstock.js +1077 -419
  13. package/dist/syntax-worker.js +5 -0
  14. package/dist/web/assets/AgentSettings-Iy9ZaTGR.js +1 -0
  15. package/dist/web/assets/AgentsDialog-Dt09_TEw.js +1 -0
  16. package/dist/web/assets/BpmnCanvas-CCRBnGIV.js +1905 -0
  17. package/dist/web/assets/BpmnDocument-D2lXXcnN.js +24 -0
  18. package/dist/web/assets/ConflictDialog-CaBNoJST.js +1 -0
  19. package/dist/web/assets/DiffDocument-BjLzoDLL.js +1 -0
  20. package/dist/web/assets/DmnDocument-BSGTyR3r.js +41 -0
  21. package/dist/web/assets/DmnDocument-DdjhA8he.css +1 -0
  22. package/dist/web/assets/FormDocument-BdCKvI-7.js +32 -0
  23. package/dist/web/assets/FormDocument-URLcKn84.css +1 -0
  24. package/dist/web/assets/FormStepView-BEDXMPef.js +1 -0
  25. package/dist/web/assets/GraphAwareLayoutService-CZCVRb9X.js +21 -0
  26. package/dist/web/assets/NewFileDialog-D9nTKDOT.js +34 -0
  27. package/dist/web/assets/QuickOpen-D3AkwBdF.js +1 -0
  28. package/dist/web/assets/ScriptPane-4TG-1RyI.js +2 -0
  29. package/dist/web/assets/ScriptRunDialog-C2n9cLcf.js +1 -0
  30. package/dist/web/assets/SettingsDialog-BUft2ulJ.js +1 -0
  31. package/dist/web/assets/ShortcutsDialog-Naoea994.js +1 -0
  32. package/dist/web/assets/SourceDocument-PMA1dm6T.js +1 -0
  33. package/dist/web/assets/TextDocument-D4fl42FV.js +1 -0
  34. package/dist/web/assets/UnreadableFileLayer-DuWtY1bx.js +1 -0
  35. package/dist/web/assets/UploadDialog-CEnwtJ3T.js +1 -0
  36. package/dist/web/assets/Viewer-CZiVl0t6.js +4 -0
  37. package/dist/web/assets/apply-DwO6xN9h.js +1 -0
  38. package/dist/web/assets/array-move-Bc4mVEdq.js +1 -0
  39. package/dist/web/assets/bpmn-0HrGCizt.svg +228 -0
  40. package/dist/web/assets/bpmn-Cyvp-fAH.eot +0 -0
  41. package/dist/web/assets/bpmnTheme-iB2hl29R.js +1687 -0
  42. package/dist/web/assets/bridgeInstance-CJkr34d9.js +600 -0
  43. package/dist/web/assets/clike-DaHM3zHz.js +1 -0
  44. package/dist/web/assets/colors-dark-C7vOziWz.css +1 -0
  45. package/dist/web/assets/colors-dracula-CXhMcc1Z.css +1 -0
  46. package/dist/web/assets/colors-light-CyT40N4M.css +1 -0
  47. package/dist/web/assets/commands-BMjdyegc.js +1 -0
  48. package/dist/web/assets/de-BDwOyJ4E.js +1 -0
  49. package/dist/web/assets/dialog-wo7dFa5A.js +1 -0
  50. package/dist/web/assets/diff-BmEImmS0.js +1 -0
  51. package/dist/web/assets/dist--PmHUHDp.js +1 -0
  52. package/dist/web/assets/dist-B163CX7G.js +57 -0
  53. package/dist/web/assets/dist-BBuLDp9u.js +2 -0
  54. package/dist/web/assets/dist-B_V0lTcO.js +1 -0
  55. package/dist/web/assets/dist-BaEGn3tp.js +6 -0
  56. package/dist/web/assets/dist-BqwyxNP3.js +1 -0
  57. package/dist/web/assets/dist-CAxViutc.js +5 -0
  58. package/dist/web/assets/dist-CBRIhX1e.js +1 -0
  59. package/dist/web/assets/dist-CHluRwHI.js +2 -0
  60. package/dist/web/assets/dist-COW2iVt-.js +1 -0
  61. package/dist/web/assets/dist-CRJyslwo.js +1 -0
  62. package/dist/web/assets/dist-CnDXCEJ_.js +23 -0
  63. package/dist/web/assets/dist-CsBP6QjA.js +13 -0
  64. package/dist/web/assets/dist-CxyFqsL2.js +6 -0
  65. package/dist/web/assets/dist-D6gjpLLN.js +1 -0
  66. package/dist/web/assets/dist-DUkRqvKl.js +1 -0
  67. package/dist/web/assets/dist-DgvQWhKm.js +6 -0
  68. package/dist/web/assets/dist-DvFyMwGd.js +1 -0
  69. package/dist/web/assets/dist-Gx7P7Pk_.js +1 -0
  70. package/dist/web/assets/dist-Km3QNqlU.js +2 -0
  71. package/dist/web/assets/dist-TNwbKIWT.js +1 -0
  72. package/dist/web/assets/dist-sl8LIbwu.js +1 -0
  73. package/dist/web/assets/dmn-2EwrEScy.eot +0 -0
  74. package/dist/web/assets/dmn-eH1_eUsy.svg +90 -0
  75. package/dist/web/assets/dockLayout-CxOMo-Nl.js +1 -0
  76. package/dist/web/assets/documentBridge-uW6vNrY3.js +240 -0
  77. package/dist/web/assets/documents-BwU2MdUd.js +1 -0
  78. package/dist/web/assets/duplicate-rWDlHiZr.js +342 -0
  79. package/dist/web/assets/ed25519-DTYhEcYX.js +1 -0
  80. package/dist/web/assets/engine-BPUfS3r2.js +1 -0
  81. package/dist/web/assets/engines-C3gTrVWJ.js +5 -0
  82. package/dist/web/assets/es-B4wrlqk9.js +1 -0
  83. package/dist/web/assets/files-Chpd_QD0.js +1 -0
  84. package/dist/web/assets/formChecks-DXIRZuhX.js +1 -0
  85. package/dist/web/assets/fr-BqtYruiB.js +1 -0
  86. package/dist/web/assets/frontend-By89859W.js +1 -0
  87. package/dist/web/assets/go-C1TRUqzB.js +1 -0
  88. package/dist/web/assets/groovy-DASguM_i.js +1 -0
  89. package/dist/web/assets/html2canvas-BNKOpkjM.js +5 -0
  90. package/dist/web/assets/httpHost-_QDw41Ka.js +1 -0
  91. package/dist/web/assets/index.es-CVOua_f9.js +4 -0
  92. package/dist/web/assets/index.es-DHW5-gbr.js +78 -0
  93. package/dist/web/assets/index.esm-CTLpq4ik.js +3 -0
  94. package/dist/web/assets/intelligence-BnJILPl7.js +3 -0
  95. package/dist/web/assets/ja-B6eG6Wld.js +1 -0
  96. package/dist/web/assets/jspdf.es.min-Yw43YJzU.js +79 -0
  97. package/dist/web/assets/ko-Le3hTKqP.js +1 -0
  98. package/dist/web/assets/lib-D6xZQFAF.js +1 -0
  99. package/dist/web/assets/libavoid-BRQRZjmQ.wasm +0 -0
  100. package/dist/web/assets/libavoid.wasm +0 -0
  101. package/dist/web/assets/platform-PXoldsjF.js +2 -0
  102. package/dist/web/assets/preferences-C7SSy7Wf.js +1 -0
  103. package/dist/web/assets/preload-helper-VRuDKI9K.js +1 -0
  104. package/dist/web/assets/properties-C3HzGRE2.js +1 -0
  105. package/dist/web/assets/pt-BR-aDlgSu84.js +1 -0
  106. package/dist/web/assets/purify.es-DBLk-NVl.js +3 -0
  107. package/dist/web/assets/python-CvnBFxgv.js +1 -0
  108. package/dist/web/assets/resource/ArchitectsDaughter-OFL.txt +93 -0
  109. package/dist/web/assets/resource/ArchitectsDaughter-Regular.ttf +0 -0
  110. package/dist/web/assets/resource/JetBrainsMono-Italic.woff2 +0 -0
  111. package/dist/web/assets/resource/JetBrainsMono-Medium.woff2 +0 -0
  112. package/dist/web/assets/resource/JetBrainsMono-OFL.txt +52 -0
  113. package/dist/web/assets/resource/JetBrainsMono-Regular.woff2 +0 -0
  114. package/dist/web/assets/resource/JetBrainsMono-SemiBold.woff2 +0 -0
  115. package/dist/web/assets/rolldown-runtime-B8BYMn-z.js +1 -0
  116. package/dist/web/assets/ru-DJl9EFpu.js +1 -0
  117. package/dist/web/assets/run-Dd_PjDF8.js +1 -0
  118. package/dist/web/assets/samples-DfOV2cQu.js +1 -0
  119. package/dist/web/assets/shortcut-DONH578b.js +1 -0
  120. package/dist/web/assets/source-frame-q4WXS_Md.js +2 -0
  121. package/dist/web/assets/stackblur-es-Djj-lnDR.js +2 -0
  122. package/dist/web/assets/syntax-DBcQvmbn.js +6 -0
  123. package/dist/web/assets/testCaseRuns-6x2pl8U_.js +1 -0
  124. package/dist/web/assets/translator-CTBxdhz9.js +1 -0
  125. package/dist/web/assets/typing-CXvbBSPr.js +1 -0
  126. package/dist/web/assets/ui-B2q39Bca.js +1 -0
  127. package/dist/web/assets/useTrace-BbcYW5PF.js +1 -0
  128. package/dist/web/assets/vendor-NJP34MHU.js +1 -0
  129. package/dist/web/assets/web-BTVzb1W6.css +1 -0
  130. package/dist/web/assets/web-D7xTiPek.js +148 -0
  131. package/dist/web/assets/zh-CaEk-YOk.js +1 -0
  132. package/dist/web/icon.svg +9 -0
  133. package/dist/web/index.html +64 -0
  134. package/dist/web/manifest.webmanifest +14 -0
  135. package/package.json +13 -8
@@ -0,0 +1,600 @@
1
+ import{i as e}from"./rolldown-runtime-B8BYMn-z.js";import{i as t,n,s as r}from"./translator-CTBxdhz9.js";import{M as i,_ as a,h as o,m as s,x as c}from"./dist-CRJyslwo.js";import{a as l}from"./dist-DgvQWhKm.js";import{E as u,_ as d,b as f,c as p,d as m,f as h,h as g,i as _,l as v,m as y,n as b,o as x,p as S,r as C,s as ee,t as te,v as w,y as T}from"./engine-BPUfS3r2.js";import{t as ne}from"./dist-BqwyxNP3.js";import{a as E,c as D,d as O,l as re,n as k,o as A,r as j,t as M}from"./engines-C3gTrVWJ.js";var N=/(?<![\w.$#])([A-Za-z_]\w*)/g,ie=/[$#]\{([\s\S]*?)}/g,P=/"(?:\\.|[^"\\])*"/g,F=/'(?:\\.|[^'\\])*'/g,I=/^\.\s*\w+\s*\(/,ae=/\b(?:for|some|every)\s+([A-Za-z_]\w*)\s+in\b/g,oe=new Set([`true`,`false`,`null`,`and`,`or`,`not`,`if`,`then`,`else`,`for`,`in`,`return`,`some`,`every`,`satisfies`,`instance`,`of`,`between`,`function`,`external`,`item`]),se=new Set([`true`,`false`,`null`,`empty`,`not`,`and`,`or`,`eq`,`ne`,`lt`,`gt`,`le`,`ge`,`div`,`mod`,`instanceof`,`execution`,`task`,`variableScope`,`authenticatedUserId`]);function identifiers$1(e,t,n){let r=new Set;for(let i of e.matchAll(N)){let a=i[1],o=e.slice((i.index??0)+a.length).trimStart();t.has(a)||o.startsWith(`(`)||!n&&o.startsWith(`:`)&&!o.startsWith(`::`)||n&&I.test(o)||r.add(a)}return r}e(identifiers$1,`identifiers`);function feel(e){let t=e?.trim().replace(/^=/,``);if(!t)return new Set;let n=t.replace(P,`""`),r=new Set([...n.matchAll(ae)].map(e=>e[1]));return new Set([...identifiers$1(n,oe,!1)].filter(e=>!r.has(e)))}function feelIfExpression(e){return e?.trimStart().startsWith(`=`)?feel(e):new Set}function juel(e){if(!e?.trim())return new Set;let t=new Set;for(let n of e.matchAll(ie))identifiers$1(n[1].replace(P,`""`).replace(F,`''`),se,!0).forEach(e=>t.add(e));return t}function anyExpression(e){return new Set([...feelIfExpression(e),...juel(e)])}var ce=/(?<![\w.$#\]])([A-Za-z_]\w*)/g,le=/^\s*(\[[^[\]]*\]|\.\s*([A-Za-z_]\w*))/,ue=/^\s*\(/;function chainsIn(e,t,n){let r=e.replace(P,`""`).replace(F,`''`),i=[];for(let e of r.matchAll(ce)){let a=e[1];if(t.has(a)||n.has(a))continue;let o=(e.index??0)+a.length,s=a,c=0;for(let e=le.exec(r.slice(o));e&&!(e[2]!==void 0&&ue.test(r.slice(o+e[0].length)));e=le.exec(r.slice(o)))s+=e[2]===void 0?e[1].replace(/\s+/g,``):`.${e[2]}`,o+=e[0].length,c+=1;c>0&&!ue.test(r.slice(o))&&i.push(s)}return i}function juelPaths(e){return e?[...e.matchAll(ie)].flatMap(e=>chainsIn(e[1],se,new Set)):[]}function feelPaths(e){let t=e?.trim().replace(/^=/,``)??``;return t?chainsIn(t,oe,new Set([...t.replace(P,`""`).matchAll(ae)].map(e=>e[1]))):[]}function pathsOf(e){let t=e?.trim()??``;return/[$#]\{/.test(t)?juelPaths(t):t.startsWith(`=`)?feelPaths(t):[]}function chainOf(e){let t=/^[A-Za-z_]\w*/.exec(e)?.[0]??``,n=[];for(let r of e.slice(t.length).matchAll(/\[[^\]]*\]|\.([A-Za-z_]\w*)/g))n.push(r[1]===void 0?{kind:`index`}:{kind:`field`,name:r[1]});return{root:t,steps:n}}function escapeRegExp(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}var de=new Map([[`string`,`String`],[`boolean`,`Boolean`],[`integer`,`Integer`],[`long`,`Long`],[`double`,`Double`],[`float`,`Float`]]);function typed(e){let t=de.get(e);if(t===void 0)throw Error(`no Java type is named for ${e}`);return t}var fe=2147483647,pe=-2147483648,me=`9223372036854775807`,he=`9223372036854775808`,ge=/\b(?:execution|task)\s*\.\s*setVariable\s*\(\s*(["'])/g,_e=/^[^"'\\\r\n]+$/,ve=/^[A-Za-z_$][\w$]*$/,ye=/^\s*,\s*/,be=/^(?:'(?:[^'\\\r\n]|\\.)*'|"(?:[^"\\\r\n]|\\.)*")/,xe=/^(?:true|false)(?![\w$])/,Se=/^(-?)(\d+)(\.\d+)?([dDfFlL])?(?![\w$.])/,Ce=/^new\s+((?:[a-z]\w*\.)*[A-Z]\w*(?:\.[A-Z]\w*)*)\s*(?:<[^()\n]*>)?\s*\(/,we=/^(-?\d+(?:\.\d+)?)(?![\w$.])/,Te={"\\":`\\`,"'":`'`,'"':`"`,$:`$`,n:`
2
+ `,r:`\r`,t:` `},L=/^\s*[),;\n]|^\s*$/,Ee=[`return`,`throw`,`new`,`else`,`case`,`in`,`is`,`as`,`instanceof`,`assert`,`yield`];function scriptLanguageOf(e){let t=e?.trim().toLowerCase();return t===`groovy`?`groovy`:t===`javascript`||t===`js`||t===`ecmascript`?`javascript`:null}function skeletonOf(e){let t=``,n=null;for(let r=0;r<e.length;r+=1){let i=e[r];if(n)i===`\\`&&r+1<e.length?(t+=e[r+1]===`
3
+ `?`
4
+ `:` `,r+=1):i===n||i===`
5
+ `?(n=null,t+=i):t+=` `;else if(i===`"`||i===`'`)n=i,t+=i;else if(i===`/`&&e[r+1]===`/`){let n=e.indexOf(`
6
+ `,r),i=n<0?e.length:n;t+=` `.repeat(i-r),r=i-1}else if(i===`/`&&e[r+1]===`*`){let n=e.indexOf(`*/`,r+2),i=n<0?e.length:n+2;t+=e.slice(r,i).replace(/[^\n]/g,` `),r=i-1}else t+=i}return t}function fitsLong(e,t){let n=t?he:me,r=e.replace(/^0+(?=\d)/,``);return r.length<n.length||r.length===n.length&&r<=n}function groovyNumberType(e){let[,t,n,r,i]=e,a=t===`-`;if(i){let e=i.toLowerCase();return e===`l`?r===void 0&&fitsLong(n,a)?typed(`long`):null:e===`d`?typed(`double`):e===`f`?typed(`float`):null}if(r!==void 0)return null;let o=Number(`${t}${n}`);return o>=pe&&o<=fe?typed(`integer`):fitsLong(n,a)?typed(`long`):null}function closingIndex(e,t){let n=0;for(let r=t;r<e.length;r+=1)if(e[r]===`(`)n+=1;else if(e[r]===`)`&&(--n,n===0))return r;return-1}function decodedString(e){let t=e.slice(1,-1),n=``;for(let e=0;e<t.length;e+=1){if(t[e]!==`\\`){n+=t[e];continue}let r=Te[t[e+1]];if(r===void 0)return null;n+=r,e+=1}return n}function stringLiteral(e,t){let n=be.exec(e);if(!n)return null;let r=n[0];if(t===`groovy`&&r.startsWith(`"`)&&r.includes(`$`)||!L.test(e.slice(r.length)))return null;let i=decodedString(r);return{type:typed(`string`),sample:i===null?null:JSON.stringify(i)}}function numberLiteral(e,t,n){return L.test(t)?{type:n,sample:e}:null}function literalAt(e,t,n,r){let i=e.slice(n),a=stringLiteral(i,r);if(a)return a;let o=xe.exec(i);if(o)return L.test(i.slice(o[0].length))?{type:typed(`boolean`),sample:o[0]}:null;if(r===`groovy`){let r=Se.exec(i);if(r)return numberLiteral(`${r[1]}${r[2]}${r[3]??``}`,i.slice(r[0].length),groovyNumberType(r));let a=Ce.exec(i);if(a){let r=closingIndex(t,n+a[0].length-1);return r>=0&&L.test(e.slice(r+1))?{type:a[1],sample:null}:null}return null}let s=we.exec(i);return s?numberLiteral(s[1],i.slice(s[0].length),null):null}function scriptWritesOf(e,t){let n=scriptLanguageOf(t);if(!e||!n)return[];let r=skeletonOf(e),i=[];for(let t of r.matchAll(ge)){let a=(t.index??0)+t[0].length,o=r.indexOf(t[1],a);if(o<0)continue;let s=e.slice(a,o);if(!_e.test(s))continue;let c=ye.exec(r.slice(o+1));if(!c)continue;let l=literalAt(e,r,o+1+c[0].length,n);i.push({name:s,type:l?.type??null,sample:l?.sample??null})}return i}function declaresName(e,t){if(!e||!ve.test(t))return!1;let n=Ee.join(`|`);return RegExp(`(?:^|[^\\w$.])(?!(?:${n})\\b)(?:(?:def|var|let|const|final)|[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*)*(?:<[^>\\n]*>)?(?:\\[\\])?)\\s+${escapeRegExp(t)}\\s*[=;]`,`m`).test(skeletonOf(e))}var De=/^[A-Za-z_]\w*$/,Oe={"camunda:assignee":`assignment`,"camunda:candidateUsers":`assignment`,"camunda:candidateGroups":`assignment`,"camunda:dueDate":`assignment`,"camunda:followUpDate":`assignment`,"camunda:priority":`assignment`,"camunda:expression":`expression`},ke={"camunda:resultVariable":`result`,"camunda:initiator":`initiator`,"camunda:errorCodeVariable":`error`,"camunda:errorMessageVariable":`error`,"camunda:elementVariable":`loop element`},Collector$1=class{static{e(this,`Collector`)}uses=[];forms=[];reads(e,t,n,r){r(n).forEach(n=>this.uses.push({name:n,writes:!1,elementId:e,where:t}))}writes(e,t,n){n&&De.test(n)&&this.uses.push({name:n,writes:!0,elementId:e,where:t})}scripts(e,t,n){scriptWritesOf(n,t).forEach(({name:t,type:n,sample:r})=>this.uses.push({name:t,writes:!0,elementId:e,where:`script`,type:n,sample:r}))}};function attribute$2(e,t){let n=e?.get?.(t)??e?.$attrs?.[t];return typeof n==`string`&&n.trim()?n:void 0}e(attribute$2,`attribute`);function body(e){return typeof e?.body==`string`?e.body:void 0}function extensions$1(e){return e?.extensionElements?.values??[]}e(extensions$1,`extensions`);function camundaAttributes(e,t,n){Object.entries(Oe).forEach(([r,i])=>e.reads(t,i,attribute$2(n,r),juel)),Object.entries(ke).forEach(([r,i])=>e.writes(t,i,attribute$2(n,r)))}function extension$1(e,t,n){switch(n.$type){case`zeebe:IoMapping`:(n.inputParameters??[]).forEach(n=>{e.reads(t,`input`,n.source,feel),e.writes(t,`input`,n.target)}),(n.outputParameters??[]).forEach(n=>{e.reads(t,`output`,n.source,feel),e.writes(t,`output`,n.target)});break;case`zeebe:LoopCharacteristics`:e.reads(t,`loop collection`,n.inputCollection,feel),e.writes(t,`loop element`,n.inputElement),e.writes(t,`loop output`,n.outputCollection),e.reads(t,`loop output`,n.outputElement,feel);break;case`zeebe:AssignmentDefinition`:[`assignee`,`candidateGroups`,`candidateUsers`].forEach(r=>e.reads(t,`assignment`,n[r],feelIfExpression));break;case`zeebe:CalledDecision`:e.writes(t,`decision result`,n.resultVariable);break;case`zeebe:Script`:e.reads(t,`script`,n.expression,feel),e.writes(t,`script result`,n.resultVariable);break;case`zeebe:CalledElement`:e.reads(t,`called process`,n.processId,feelIfExpression);break;case`zeebe:TaskDefinition`:e.reads(t,`job type`,n.type,feelIfExpression);break;case`zeebe:FormDefinition`:n.formId&&e.forms.push({elementId:t,formId:n.formId});break;case`camunda:InputOutput`:(n.inputParameters??[]).forEach(n=>{e.writes(t,`input`,n.name),e.reads(t,`input`,n.value,juel)}),(n.outputParameters??[]).forEach(n=>{e.writes(t,`output`,n.name),e.reads(t,`output`,n.value,juel)});break;case`camunda:FormData`:(n.fields??[]).forEach(n=>e.writes(t,`form field`,n.id));break;case`camunda:In`:e.reads(t,`call input`,n.source,e=>new Set(e?[e]:[])),e.reads(t,`call input`,n.sourceExpression,juel);break;case`camunda:Out`:e.writes(t,`call output`,n.target)}}e(extension$1,`extension`);function eventDefinitions(e,t,n){(n.eventDefinitions??[]).forEach(n=>{[`timeDuration`,`timeDate`,`timeCycle`].forEach(r=>e.reads(t,`timer`,body(n[r]),anyExpression)),e.reads(t,`condition`,body(n.condition),anyExpression),camundaAttributes(e,t,n);let r=n.messageRef;extensions$1(r).filter(e=>e.$type===`zeebe:Subscription`).forEach(n=>e.reads(t,`correlation key`,n.correlationKey,feel))})}function loop(e,t,n){let r=n.loopCharacteristics;if(!r)return;e.reads(t,`completion condition`,body(r.completionCondition),anyExpression),e.reads(t,`loop cardinality`,body(r.loopCardinality),anyExpression);let i=attribute$2(r,`camunda:collection`);e.reads(t,`loop collection`,i,e=>e&&De.test(e)?new Set([e]):juel(e)),camundaAttributes(e,t,r),extensions$1(r).forEach(n=>extension$1(e,t,n))}function scripts(e,t,n){n.$type===`bpmn:ScriptTask`&&e.scripts(t,n.scriptFormat,n.script),extensions$1(n).filter(e=>e.$type===`camunda:ExecutionListener`||e.$type===`camunda:TaskListener`).forEach(n=>e.scripts(t,n.script?.scriptFormat,n.script?.value))}function flowElement(e,t){let n=t.id;if(!n)return;e.reads(n,`condition`,body(t.conditionExpression),anyExpression),camundaAttributes(e,n,t),extensions$1(t).forEach(t=>extension$1(e,n,t)),scripts(e,n,t),eventDefinitions(e,n,t),loop(e,n,t),extensions$1(t.messageRef).filter(e=>e.$type===`zeebe:Subscription`).forEach(t=>e.reads(n,`correlation key`,t.correlationKey,feel));let r=attribute$2(t,`camunda:formRef`);r&&e.forms.push({elementId:n,formId:r}),(t.flowElements??[]).forEach(t=>flowElement(e,t))}var Ae=/^[A-Za-z_]\w*$/,je=[`timeDuration`,`timeDate`,`timeCycle`];function isExpression(e){let t=e?.trim();return t?t.startsWith(`=`)||t.includes("${")||t.includes(`#{`)||Ae.test(t):!1}function labelOf$3(e){return(typeof e?.name==`string`?e.name.trim():``)||(e?.$type===`bpmn:SequenceFlow`?`Flow ${e.id}`:String(e?.id??``))}e(labelOf$3,`labelOf`);var ExpressionCollector=class{found=[];add(e,t,n){isExpression(n)&&this.found.push({elementId:String(e.id),label:labelOf$3(e),where:t,expression:n.trim()})}};function expressionExtension(e,t,n){switch(n.$type){case`zeebe:IoMapping`:(n.inputParameters??[]).forEach(n=>e.add(t,`input`,n.source)),(n.outputParameters??[]).forEach(n=>e.add(t,`output`,n.source));break;case`zeebe:Script`:e.add(t,`script`,n.expression);break;case`zeebe:TaskDefinition`:e.add(t,`job type`,n.type);break;case`zeebe:AssignmentDefinition`:[`assignee`,`candidateGroups`,`candidateUsers`].forEach(r=>e.add(t,`assignment`,n[r]));break;case`zeebe:LoopCharacteristics`:e.add(t,`loop collection`,n.inputCollection),e.add(t,`loop output`,n.outputElement);break;case`zeebe:Subscription`:e.add(t,`correlation key`,n.correlationKey);break;case`camunda:InputOutput`:(n.inputParameters??[]).forEach(n=>e.add(t,`input`,n.value)),(n.outputParameters??[]).forEach(n=>e.add(t,`output`,n.value));break;case`camunda:In`:e.add(t,`call input`,n.source)}}function expressionLoop(e,t){let n=t.loopCharacteristics;n&&(e.add(t,`completion condition`,body(n.completionCondition)),e.add(t,`loop cardinality`,body(n.loopCardinality)),extensions$1(n).forEach(t=>expressionExtension(e,n,t)))}function expressionElement(e,t){e.add(t,`condition`,body(t.conditionExpression)),extensions$1(t).forEach(n=>expressionExtension(e,t,n)),(t.eventDefinitions??[]).forEach(n=>{je.forEach(r=>e.add(t,`timer`,body(n[r]))),e.add(t,`condition`,body(n.condition)),extensions$1(n.messageRef).filter(e=>e.$type===`zeebe:Subscription`).forEach(n=>expressionExtension(e,t,n))}),extensions$1(t.messageRef).filter(e=>e.$type===`zeebe:Subscription`).forEach(n=>expressionExtension(e,t,n)),expressionLoop(e,t)}function expressionsOf(e){let t=new ExpressionCollector,n=new Set,visit=(e,r)=>{let i=e?.id;i&&!n.has(i)&&(n.add(i),expressionElement(t,e),[...e.outgoing??[],...e.incoming??[]].forEach(e=>visit(e,!1)),r&&(e.flowElements??[]).forEach(e=>visit(e,!0)))};return(e?.rootElements??[]).filter(e=>e.$type===`bpmn:Process`).forEach(e=>(e.flowElements??[]).forEach(e=>visit(e,!0))),t.found}function variablesOf$1(e){let t=new Collector$1;return(e?.rootElements??[]).filter(e=>e.$type===`bpmn:Process`).forEach(e=>(e.flowElements??[]).forEach(e=>flowElement(t,e))),{uses:t.uses,forms:t.forms}}e(variablesOf$1,`variablesOf`);var FormKey=class{name;constructor(e){this.name=e}};function formKeys(e){let t=new Set,n=new Set,r=[e];for(;r.length>0;){let e=r.pop();if(e instanceof FormKey)t.add(e.name);else if(e&&typeof e==`object`&&!n.has(e)){n.add(e);let t=Array.isArray(e)?e.map((e,t)=>[String(t),e]):Object.entries(e);for(let n=t.length-1;n>=0;--n){let[i,a]=t[n];r.push(!Array.isArray(e)&&i===`key`&&typeof a==`string`&&a.trim()?new FormKey(a):a)}}}return[...t]}function formIdOf(e){let t=e?.id;return typeof t==`string`?t:void 0}s();var Me={name:`bpmn.io DI for DMN`,uri:`http://bpmn.io/schema/dmn/biodi/1.0`,prefix:`biodi`,xml:{tagAlias:`lowerCase`},types:[{name:`Bounds`,superClass:[`dc:Bounds`,`Element`]},{name:`Edge`,superClass:[`Element`],properties:[{name:`source`,type:`String`,isAttr:!0},{name:`waypoints`,type:`Waypoint`,isMany:!0,xml:{serialize:`property`}}]},{name:`Waypoint`,superClass:[`dc:Point`]}]},Ne=new ne([32,36,1]),Pe=new u({biodi:Me}),Fe=`"http://www.omg.org/spec/DMN/20151101/dmn.xsd"`,Ie=`"http://www.omg.org/spec/DMN/20180521/MODEL/"`,Le=`"https://www.omg.org/spec/DMN/20191111/MODEL/"`;async function migrateDiagram(e){return c(e)?hasNamespace(Fe,e)?migrateFrom11To13(e):hasNamespace(Ie,e)?migrateFrom12To13(e):(hasNamespace(Le,e),e):e}function hasNamespace(e,t){return t.includes(e)}async function migrateFrom12To13(e){return e.replace(Ie,Le).replace(`"http://www.omg.org/spec/DMN/20180521/DMNDI/"`,`"https://www.omg.org/spec/DMN/20191111/DMNDI/"`)}async function parse13Defininitions(e){return Pe.fromXML(e,`dmn:Definitions`).then(e=>[e.rootElement,null],e=>[null,e])}async function migrateFrom11To13(e){let[t,n]=await parse13Defininitions(e.replace(Fe,Le));if(n)return e;addIds(t),addNames(t),migrateDI(t,Pe);let{xml:r}=await Pe.toXML(t,{format:!0});return r}function addId(e){e.id||isAny(e,[`dmn:DMNElement`,`dmndi:DMNDiagram`,`dmndi:DMNDiagramElement`])&&(e.id=Ne.nextPrefixed(e.$type.split(`:`)[1]+`_`,e))}function addIds(e){addId(e),Object.values(e).forEach(e=>{e.$type&&(addId(e),addIds(e)),o(e)&&e.forEach(addIds)})}function addName(e){is(e,`dmn:NamedElement`)&&!e.name&&(e.name=e.id)}function addNames(e){addName(e),Object.values(e).forEach(e=>{e.$type&&(addName(e),addNames(e)),o(e)&&e.forEach(addNames)})}function createDMNDI(e){let t=e.create(`dmndi:DMNDiagram`,{diagramElements:[]});addId(t);let n=e.create(`dmndi:DMNDI`,{diagrams:[t]});return t.$parent=n,n}function is(e,t){return a(e.$instanceOf)&&e.$instanceOf(t)}function isAny(e,t){return i(t,t=>is(e,t))}function getDMNElementRef(e,t){return is(e,`dmn:Association`)?e:Object.values(e).reduce((e,n)=>o(n)?e||n.find(e=>{if(is(e,`dmn:DMNElement`))return Object.values(e).find(e=>{if(is(e,`dmn:DMNElementReference`)){let{href:n}=e;return n.replace(`#`,``).includes(t)}})}):e,null)}function migrateDI(e,t){let n=[];if([].concat(e.get(`drgElement`),e.get(`artifact`)).forEach(e=>{let r=e.get(`extensionElements`);r&&(r.get(`values`).forEach(r=>{if(is(r,`biodi:Bounds`)){let i=t.create(`dc:Bounds`,{height:r.get(`height`),width:r.get(`width`),x:r.get(`x`),y:r.get(`y`)}),a=t.create(`dmndi:DMNShape`,{bounds:i,dmnElementRef:e});i.$parent=a,addId(a),n.push(a),a.$parent=n}if(is(r,`biodi:Edge`)){let i=getDMNElementRef(e,r.get(`source`));if(!i)return;let a=r.get(`waypoints`).map(e=>t.create(`dc:Point`,{x:e.get(`x`),y:e.get(`y`)})),o=t.create(`dmndi:DMNEdge`,{dmnElementRef:i,waypoint:a});i.$parent=o,addId(o),a.forEach(e=>e.$parent=o),n.push(o),o.$parent=n}}),r.set(`values`,r.get(`values`).filter(e=>!isAny(e,[`biodi:Bounds`,`biodi:Edge`]))),r.get(`values`).length||e.set(`extensionElements`,void 0))}),n.length){let r=createDMNDI(t);e.set(`dmnDI`,r),r.$parent=e;let i=r.get(`diagrams`)[0];i.set(`diagramElements`,n),n.forEach(e=>e.$parent=i)}return e}var Re=[[/spec\/DMN\/20151101\//,`1.1`],[/spec\/DMN\/20180521\//,`1.2`],[/spec\/DMN\/20191111\//,`1.3`],[/spec\/DMN\/20211108\//,`1.4`],[/spec\/DMN\/20230324\//,`1.5`]],ze=/<((?:\w+:)?)definitions\b([^>]*)>/;function dmnVersionOf(e){let t=ze.exec(e);if(!t)return null;let n=t[1].slice(0,-1),r=RegExp(`\\sxmlns${n?`:${n}`:``}\\s*=\\s*["']([^"']*)["']`).exec(t[2]);return r?Re.find(([e])=>e.test(r[1]))?.[1]??null:null}async function migrateDmn$1(e){let t=dmnVersionOf(e);if(t!==`1.1`&&t!==`1.2`)return{xml:e,from:null};try{let n=await migrateDiagram(e);return dmnVersionOf(n)===`1.3`?{xml:n,from:t}:{xml:e,from:null}}catch{return{xml:e,from:null}}}e(migrateDmn$1,`migrateDmn`);function savedAsNotice(e,n){return t(`app.migration.dmn.savedAsNotice`,{name:n,from:e})}var Be=[[/^unclosed tag$/i,`unclosedTag`,[]],[/^closing tag mismatch$/i,`closingTagMismatch`,[]],[/^close tag$/i,`closeTag`,[]],[/^missing start tag$/i,`missingStartTag`,[]],[/^missing open tag$/i,`missingOpenTag`,[]],[/^unexpected end of file$/i,`unexpectedEndOfFile`,[]],[/^unclosed cdata$/i,`unclosedCdata`,[]],[/^unclosed comment$/i,`unclosedComment`,[]],[/^unclosed question$/i,`unclosedQuestion`,[]],[/^illegal first char nodeName$/i,`illegalFirstCharNodeName`,[]],[/^illegal value of xmlns:xml$/i,`illegalValueOfXmlnsXml`,[]],[/^invalid nodeName$/i,`invalidNodeName`,[]],[/^missing namespace on <(.+)>$/i,`missingNamespaceOn`,[`element`]],[/^unparsable content <(.+)> detected$/i,`unparsableContent`,[`element`]],[/^unparsable content <(.+)> detected; this may indicate an invalid BPMN 2\.0 diagram file/i,`unparsableContentHinted`,[`element`]],[/^no diagram to display$/i,`noDiagramToDisplay`,[]],[/^element (.+) referenced by (.+)#(\w+) not yet drawn$/i,`notYetDrawn`,[`element`,`reference`,`property`]]],Ve=/nested error:\s*(.+)/,He=/line:\s*(\d+)/;function sayReason(e,n){return t(`app.unreadable.reason.${e}`,n)}function parserReason(e){for(let[t,n,r]of Be){let i=t.exec(e);if(!i)continue;let a={};return r.forEach((e,t)=>{a[e]=i[t+1]}),sayReason(n,Object.keys(a).length>0?a:void 0)}return e}function emptyUnreadable(){return{reason:sayReason(`empty`),line:null}}function describeUnreadable(e){let t=e.message,n=Ve.exec(t)?.[1]?.trim(),r=He.exec(t)?.[1],i=t.split(`
7
+ `)[0]?.trim()??``;return{reason:parserReason((n||i).replace(/^Error:\s*/,``)),line:r===void 0?null:Number(r)+1}}function unreadableSentence({reason:e,line:n}){let r=e.charAt(0).toUpperCase()+e.slice(1);return n===null?`${r}.`:t(`app.unreadable.atLine`,{reason:r,line:n})}var DmnReadError=class extends Error{line;constructor(e,n){super(n===void 0?e:t(`app.dmn.readErrorAtLine`,{reason:e,line:n})),this.name=`DmnReadError`,this.line=n}};function failureOf$1(e){let n=String(e?.warnings?.[0]?.message??e?.message??e),r=/line:\s*(\d+)/.exec(n)?.[1],i=/nested error:\s*(.+)$/m.exec(n)?.[1]?.trim();return i?new DmnReadError(t(`app.dmn.notValid`,{reason:parserReason(i)}),r===void 0?void 0:Number(r)+1):new DmnReadError(t(`app.dmn.notADocument`))}e(failureOf$1,`failureOf`);var Ue=/\sid\s*=\s*(["'])(.*?)\1/g;function duplicateIdProblem(e){let n=new Set;for(let r of e.matchAll(Ue)){let i=r[2];if(i!==``){if(n.has(i))return new DmnReadError(t(`app.dmn.duplicateId`,{id:i}),e.slice(0,r.index).split(`
8
+ `).length);n.add(i)}}return null}async function readDmn(e){let t=d(`plain`),{xml:n,from:r}=await migrateDmn$1(e),i=duplicateIdProblem(n);if(i)throw i;try{let{rootElement:e}=await t.fromXML(n,`dmn:Definitions`);return{rootElement:e,xml:n,from:r}}catch(e){throw failureOf$1(e)}}var We={"bpmn:MessageEventDefinition":`message`,"bpmn:TimerEventDefinition":`timer`,"bpmn:ErrorEventDefinition":`error`,"bpmn:SignalEventDefinition":`signal`,"bpmn:EscalationEventDefinition":`escalation`,"bpmn:ConditionalEventDefinition":`conditional`};function extension(e,t){return e?.extensionElements?.values?.find(e=>e.$type===t)}function attribute$1(e,t){try{return e.get?.(t)}catch{return}}e(attribute$1,`attribute`);function text$3(e){return typeof e==`string`&&e!==``?e:void 0}e(text$3,`text`);function stepOf(e){let t={id:e.id??``,type:e.$type};text$3(e.name)&&(t.name=e.name);let n=e.eventDefinitions?.[0];if(n){t.event=We[n.$type]??n.$type.replace(`bpmn:`,``),t.message=n.messageRef?.name,t.correlationKey=n.messageRef?extension(n.messageRef,`zeebe:Subscription`)?.correlationKey:void 0,t.signal=n.signalRef?.name,t.errorCode=n.errorRef?.errorCode;let e=n.timeDuration?`duration`:n.timeCycle?`cycle`:n.timeDate?`date`:void 0;e&&(t.timerKind=e,t.timer=(n.timeDuration??n.timeCycle??n.timeDate)?.body)}if(e.$type===`bpmn:ReceiveTask`){let n=e.messageRef;t.event=`message`,t.message=n?.name,t.correlationKey=n?extension(n,`zeebe:Subscription`)?.correlationKey:void 0}e.attachedToRef&&(t.host=e.attachedToRef.id,t.interrupting=e.cancelActivity!==!1);let r=(e.outgoing??[]).map(e=>e.targetRef?.id).filter(e=>typeof e==`string`);r.length>0&&(t.follows=r),e.loopCharacteristics&&(t.repeats=!0),t.job=extension(e,`zeebe:TaskDefinition`)?.type,t.zeebeUserTask=!!extension(e,`zeebe:UserTask`),t.calledProcess=extension(e,`zeebe:CalledElement`)?.processId??e.calledElement,t.decision=extension(e,`zeebe:CalledDecision`)?.decisionId??attribute$1(e,`camunda:decisionRef`),t.form=extension(e,`zeebe:FormDefinition`)?.formId;let i=text$3(extension(e,`zeebe:CalledDecision`)?.resultVariable)??text$3(attribute$1(e,`camunda:resultVariable`));i&&(t.resultVariable=i);let a=text$3(attribute$1(e,`camunda:formRef`))??text$3(attribute$1(e,`camunda:formKey`))??text$3(extension(e,`zeebe:FormDefinition`)?.formKey);return a&&(t.formKey=a),attribute$1(e,`camunda:type`)===`external`&&(t.external=String(attribute$1(e,`camunda:topic`)??``)),t.delegateClass=text$3(attribute$1(e,`camunda:class`)),t.delegateExpression=text$3(attribute$1(e,`camunda:delegateExpression`)),t.expression=text$3(attribute$1(e,`camunda:expression`)),t.delegateExpression&&(t.delegateBean=/^[$#]\{\s*([A-Za-z_]\w*)\s*\}$/.exec(t.delegateExpression)?.[1]),t.asyncBefore=attribute$1(e,`camunda:asyncBefore`)===!0,t.asyncAfter=attribute$1(e,`camunda:asyncAfter`)===!0,t}function walk(e,t,n){for(let r of e??[])r?.id&&(n.set(r.id,{...stepOf(r),processId:t}),r.flowElements&&walk(r.flowElements,t,n))}function stepsOf(e){let t=new Map,n=new Map;for(let t of e?.rootElements??[])if(t.$type===`bpmn:Process`&&n.set(t.id,t),t.$type===`bpmn:Collaboration`)for(let e of t.participants??[])e.processRef?.id&&n.set(e.processRef.id,e.processRef);return n.forEach((e,n)=>walk(e.flowElements,n,t)),t}function indexOf(e){let t=new Map,n=new Map,r=[];for(let t of e?.rootElements??[])if(t.$type===`bpmn:Process`&&r.push(t),t.$type===`bpmn:Collaboration`)for(let e of t.participants??[])e.processRef&&r.push(e.processRef);let walk=(e,r,i)=>{for(let a of e??[])a.id&&(a.$type===`bpmn:SequenceFlow`?n.set(a.id,{id:a.id,name:a.name?.replace(/\s+/g,` `).trim()??``,condition:a.conditionExpression?.body?.trim()||void 0,source:a.sourceRef?.id??``,target:a.targetRef?.id??``}):(t.set(a.id,{id:a.id,name:a.name?.replace(/\s+/g,` `).trim()??``,type:a.$type,outgoing:[],incoming:[],defaultFlow:a.default?.id??null,process:r,parent:i}),a.flowElements&&walk(a.flowElements,r,a.id)))};for(let e of r)walk(e.flowElements,e.id??``,null);for(let e of n.values())t.get(e.source)?.outgoing.push(e.id),t.get(e.target)?.incoming.push(e.id);return{nodes:t,flows:n,steps:stepsOf(e)}}function nameOf$2(e,t){return e.nodes.get(t)?.name||e.flows.get(t)?.name||t}e(nameOf$2,`nameOf`);function flowInputs(e,t){let n=e.nodes.get(t);return n?n.outgoing.map(t=>{let r=e.flows.get(t),i=r.name||`to "${nameOf$2(e,r.target)}"`;return{id:t,name:i,label:r.name?`"${r.name}"`:i,condition:r.condition,isDefault:n.defaultFlow===t}}):[]}function isGateway(e){return e.endsWith(`Gateway`)}function gatewayKind(e){return e===`bpmn:InclusiveGateway`||!isGateway(e)?`inclusive`:`exclusive`}var LazyOrder=class extends Map{index;constructor(e){super(),this.index=e}has(e){return this.index.nodes.has(e)}get(e){let t=super.get(e);if(t||!this.index.nodes.has(e))return t;let n=reachableFrom(this.index,e);return this.set(e,n),n}};function afterOf(e){return new LazyOrder(indexOf(e))}function reachableFrom(e,t){let n=new Set,r=[t];for(let t=0;t<r.length;t+=1)e.nodes.get(r[t])?.outgoing.forEach(t=>{let i=e.flows.get(t)?.target;i&&!n.has(i)&&(n.add(i),r.push(i))});return n}function flowOrderOf(e){let t=new Map;return e.nodes.forEach(e=>{let n=t.get(e.process)??[];n.push(e.id),t.set(e.process,n)}),[...t.values()].flatMap(t=>orderWithin(e,t))}function orderWithin(e,t){let n=[],r=new Set;return t.filter(t=>e.nodes.get(t)?.incoming.length===0).forEach(t=>{r.has(t)||breadthFirst(e,t,r,n)}),t.forEach(e=>{r.has(e)||(r.add(e),n.push(e))}),n}function breadthFirst(e,t,n,r){n.add(t),r.push(t);let i=[t];for(let t=0;t<i.length;t+=1)e.nodes.get(i[t])?.outgoing.forEach(t=>{let a=e.flows.get(t)?.target;a&&e.nodes.has(a)&&!n.has(a)&&(n.add(a),r.push(a),i.push(a))})}function reaches(e,t,n){return t===n?!1:e.get(t)?.has(n)??!1}var Ge={"camunda:ExecutionListener":`EXECUTION_LISTENER`,"camunda:TaskListener":`TASK_LISTENER`},Ke=`bpmn:ScriptTask`,qe=`bpmn:SequenceFlow`,Je=`camunda:InputOutput`,Ye=`zeebe:IoMapping`,Xe=`=`,Ze=2**53-1;function localName$1(e){let t=e.split(`:`).pop()??e;return t.charAt(0).toLowerCase()+t.slice(1)}e(localName$1,`localName`);function nameOf$1(e){return typeof e.name==`string`?e.name.replace(/\s+/g,` `).trim():``}e(nameOf$1,`nameOf`);function attributeOf$1(e,t){let n=e?.get?.(t)??e?.$attrs?.[t];return typeof n==`string`?n:void 0}e(attributeOf$1,`attributeOf`);function feelTextOf(e){let t=e.slice(1);return t.startsWith(` `)?t.slice(1):t}function feelSourceOf(e){return`${Xe} ${e}`}function scriptOf(e){if(!e||e.resource)return null;let t=scriptLanguageOf(e.scriptFormat);return t?{language:t,value:e.value??``}:null}var Collector=class{drafts=[];names=new Map;seq=0;process(e){this.elements(e.flowElements,e.id??``,[])}elements(e,t,n){(e??[]).forEach(e=>{e.id&&(this.names.set(e.id,nameOf$1(e)),e.$type===qe?this.flow(e,t,n):(this.element(e,t,n),this.elements(e.flowElements,t,[...n,e.id])))})}element(e,t,n){let r=e.id??``,i=localName$1(e.$type);if(e.$type===Ke){let a=scriptLanguageOf(e.scriptFormat);a&&this.add(r,`TASK_BODY`,0,{processId:t,containers:n,type:i,language:a,value:typeof e.script==`string`?e.script:``})}let a={};(e.extensionElements?.values??[]).forEach(e=>{let o=Ge[e.$type];if(!o)return;let s=a[o]??0;a[o]=s+1;let c=scriptOf(e.script);c&&this.add(r,o,s,{processId:t,containers:n,type:i,...c,event:e.event})});let o=e.extensionElements?.values?.find(e=>e.$type===Je);[...(o?.inputParameters??[]).map(e=>[e,`input`]),...(o?.outputParameters??[]).map(e=>[e,`output`])].forEach(([e,a],o)=>{let s=scriptOf(e.definition);s&&this.add(r,`PARAMETER`,o,{processId:t,containers:n,type:i,...s,parameter:{name:e.name??``,direction:a}})});let s=e.extensionElements?.values?.find(e=>e.$type===Ye),c={processId:t,containers:n,type:i};(s?.inputParameters??[]).forEach((e,t)=>this.mapping(r,`INPUT_MAPPING`,t,e,`input`,c)),(s?.outputParameters??[]).forEach((e,t)=>this.mapping(r,`OUTPUT_MAPPING`,t,e,`output`,c))}mapping(e,t,n,r,i,a){let o=attributeOf$1(r,`source`);o?.startsWith(Xe)&&this.add(e,t,n,{...a,language:`feel`,value:feelTextOf(o),parameter:{name:attributeOf$1(r,`target`)??``,direction:i}})}flow(e,t,n){let r=e.id??``,i=e.conditionExpression;if(!i)return;let a={source:e.sourceRef?.id??``,target:e.targetRef?.id??``},o={processId:t,containers:n,type:localName$1(e.$type)},s=attributeOf$1(i,`language`);if(s===void 0&&i.body?.startsWith(Xe)){this.add(r,`FEEL_CONDITION`,0,{...o,language:`feel`,value:feelTextOf(i.body)},a);return}let c=scriptLanguageOf(s);c&&this.add(r,`CONDITION`,0,{...o,language:c,value:i.body??``},a)}add(e,t,n,r,i=null){this.drafts.push({site:{slot:{elementId:e,owner:t,index:n},...r},ends:i,seq:this.seq+=1})}};function rankOf(e,t){return e.get(t)??Ze}function pathOf(e,t){let n=e.site.containers.map(e=>[rankOf(t,e),0]);return e.ends?[...n,[rankOf(t,e.ends.source),1]]:[...n,[rankOf(t,e.site.slot.elementId),0]]}function comparePaths(e,t){for(let n=0;n<Math.min(e.length,t.length);n+=1){let[r,i]=e[n],[a,o]=t[n];if(r!==a)return r<a?-1:1;if(i!==o)return i<o?-1:1}return e.length-t.length}function countNames(e){let t=new Map;return e.forEach(e=>{e&&t.set(e,(t.get(e)??0)+1)}),t}function finish(e,t,n){let r=e.site.slot.elementId,label=e=>t.get(e)||e,i=t.get(r)??``,a=e.ends?i||`${label(e.ends.source)} -> ${label(e.ends.target)}`:label(r),o=i!==``&&(n.get(i)??0)>1;return{...e.site,name:a,shared:o}}function processesOf(e){return(e?.rootElements??[]).filter(e=>e.$type===`bpmn:Process`)}function scriptSitesOf(e){let t=new Map(flowOrderOf(indexOf(e)).map((e,t)=>[e,t])),n=new Collector;processesOf(e).forEach(e=>n.process(e));let r=countNames(n.names);return n.drafts.map(e=>({draft:e,path:pathOf(e,t)})).sort((e,t)=>comparePaths(e.path,t.path)||e.draft.seq-t.draft.seq).map(({draft:e})=>finish(e,n.names,r))}var Qe=new Set([`startEvent`,`intermediateCatchEvent`,`boundaryEvent`,`receiveTask`]),$e=/^=|\$\{|#\{/,et=`camunda-forms:bpmn:`,tt={"zeebe:ExecutionListeners":`execution`,"zeebe:TaskListeners":`task`};function beanOf$1(e){let t=/^[$#]\{\s*([A-Za-z_][A-Za-z0-9_]*)/.exec(e.trim());return t?t[1]:null}e(beanOf$1,`beanOf`);function emptyModel(){return{processes:[],elements:[],workers:[],calls:[],messages:[],messageUses:[],decisions:[],decisionUses:[],formKeys:[],formUses:[],variables:[],variableForms:[],dynamic:[],embeddedForms:[],errors:[],scripts:[]}}function localName(e){let t=e.split(`:`).pop()??e;return t.charAt(0).toLowerCase()+t.slice(1)}function labelOf$2(e,t){return typeof t==`string`&&t.trim()?t:e}e(labelOf$2,`labelOf`);function attribute(e,t){let n=e?.get?.(t)??e?.$attrs?.[t];return typeof n==`string`&&n.trim()?n:void 0}function extensions(e){return e?.extensionElements?.values??[]}function collect(e,t,n){if(!t?.id)return;let r=localName(t.$type),i=t.id;e.elements.push({id:i,name:t.name,type:r,processId:n,label:labelOf$2(i,t.name)});let refer=(t,n)=>{t&&($e.test(t)?e.dynamic.push(t):n(t))};refer(attribute(t,`camunda:topic`),t=>e.workers.push({kind:`TOPIC`,value:t,elementId:i})),refer(attribute(t,`camunda:class`),t=>e.workers.push({kind:`JAVA_CLASS`,value:t,elementId:i}));let a=beanOf$1(attribute(t,`camunda:delegateExpression`)??``);a&&e.workers.push({kind:`BEAN`,value:a,elementId:i}),refer(attribute(t,`camunda:decisionRef`),t=>e.decisionUses.push({decisionId:t,elementId:i})),refer(attribute(t,`camunda:formRef`),t=>e.formUses.push({formId:t,linked:!0,elementId:i})),refer(attribute(t,`camunda:formKey`),t=>e.formUses.push({formId:t,linked:!1,elementId:i})),refer(typeof t.calledElement==`string`?t.calledElement:void 0,t=>e.calls.push({calledProcessId:t,elementId:i})),extensions(t).forEach(t=>{switch(t.$type){case`zeebe:TaskDefinition`:refer(t.type,t=>e.workers.push({kind:`JOB_TYPE`,value:t,elementId:i}));break;case`zeebe:CalledElement`:refer(t.processId,t=>e.calls.push({calledProcessId:t,elementId:i}));break;case`zeebe:CalledDecision`:refer(t.decisionId,t=>e.decisionUses.push({decisionId:t,elementId:i}));break;case`zeebe:FormDefinition`:refer(t.formId,t=>e.formUses.push({formId:t,linked:!0,elementId:i})),refer(t.formKey,t=>e.formUses.push(t.startsWith(et)?{formId:t.slice(19),linked:!1,embedded:!0,elementId:i}:{formId:t,linked:!1,elementId:i}));break;case`zeebe:ExecutionListeners`:case`zeebe:TaskListeners`:(t.listeners??[]).forEach(n=>refer(n.type,n=>{e.workers.push({kind:`JOB_TYPE`,value:n,elementId:i,listener:tt[t.$type]})}))}}),(t.eventDefinitions??[]).filter(e=>e.$type===`bpmn:ErrorEventDefinition`).forEach(t=>{let n=typeof t.errorRef?.errorCode==`string`&&t.errorRef.errorCode.trim()?t.errorRef.errorCode:null;n&&$e.test(n)?e.dynamic.push(n):e.errors.push({code:n,catches:Qe.has(r),elementId:i})}),[t.messageRef,...(t.eventDefinitions??[]).map(e=>e.messageRef)].filter(e=>e?.id).forEach(t=>{e.messageUses.push({messageId:t.id,catches:Qe.has(r),elementId:i})}),(t.flowElements??[]).forEach(t=>collect(e,t,n))}async function bpmn(e){let t=emptyModel(),n=await T(e);if(!n)return t;let r=new Map;(n.rootElements??[]).filter(e=>e.$type===`bpmn:Collaboration`).forEach(e=>{(e.participants??[]).forEach(e=>{e.processRef?.id&&e.name&&r.set(e.processRef.id,e.name)})}),(n.rootElements??[]).forEach(e=>{if(e.$type===`bpmn:Message`&&t.messages.push({id:e.id,name:e.name,label:labelOf$2(e.id,e.name)}),e.$type!==`bpmn:Process`)return;let n=e.name?.trim()?e.name:r.get(e.id);t.processes.push({id:e.id,name:n,executable:e.isExecutable===!0,label:labelOf$2(e.id,n)}),extensions(e).filter(e=>e.$type===`zeebe:UserTaskForm`&&e.id).forEach(e=>t.embeddedForms.push(e.id)),(e.flowElements??[]).forEach(n=>collect(t,n,e.id))});let{uses:i,forms:a}=variablesOf$1(n);return t.variables=i,t.variableForms=a,t.scripts=scriptSitesOf(n),t}function outputNamesOf(e){return e.decisionLogic?.$type===`dmn:DecisionTable`?(e.decisionLogic.output??[]).map(e=>typeof e.name==`string`?e.name.trim():``).filter(e=>e!==``):[]}async function dmn(e){let t=emptyModel();try{let{rootElement:n}=await readDmn(e);(n?.drgElement??[]).filter(e=>e.$type===`dmn:Decision`).forEach(e=>{t.decisions.push({id:e.id,name:e.name,type:`decision`,label:labelOf$2(e.id,e.name),outputs:outputNamesOf(e)})})}catch{return t}return t}function form(e){let t=emptyModel();try{let n=JSON.parse(e);t.formId=formIdOf(n),t.formKeys=formKeys(n)}catch{return t}return t}function kindOf$4(e){let t=e.toLowerCase();return t.endsWith(`.bpmn`)||t.endsWith(`.bpmn.xml`)?`bpmn`:t.endsWith(`.dmn`)?`dmn`:t.endsWith(`.form`)?`form`:null}e(kindOf$4,`kindOf`);var nt={bpmn:`BPMN XML`,dmn:`DMN`,form:`JSON`};function formatNameOf(e){return nt[kindOf$4(e)??`bpmn`]}async function readModel(e,t){switch(kindOf$4(e)){case`bpmn`:return bpmn(t);case`dmn`:return dmn(t);case`form`:return form(t);default:return emptyModel()}}var rt=/[\\/]/,it=/[\\/]+$/,ot=/\.(bpmn\.xml|bpmn|dmn|form)$/i;function fileName(e){return e.split(rt).pop()??e}function baseName$1(e){return fileName(e).replace(ot,``)}e(baseName$1,`baseName`);function relative(e,t){let n=e.replace(it,``);return n!==``&&t.slice(0,n.length)!==n||!rt.test(t[n.length]??``)?t:t.slice(n.length+1).replace(/\\/g,`/`)}function targetKindOf(e){switch(e){case`JOB_TYPE`:return`JOB_TYPE`;case`TOPIC`:return`TOPIC`;case`JAVA_CLASS`:return`CLASS`;case`BEAN`:return`BEAN`}}function targetsOf(e){let n=new Map;return e.forEach(({model:e})=>{e.formId&&n.set(e.formId,e.formKeys)}),e.flatMap(({path:e,model:r})=>{let i=new Map(r.elements.map(e=>[e.id,e])),element=e=>i.get(e),at=(t,n,r,i={})=>({kind:t,value:n,path:e,label:element(r)?.label??r,elementId:r,elementType:element(r)?.type,...i});return[...r.processes.map(t=>({kind:`PROCESS`,value:t.id,path:e,label:t.label,elementId:t.id,elementType:`process`})),...r.elements.map(e=>at(`ELEMENT`,e.id,e.id)),...r.workers.map(e=>at(targetKindOf(e.kind),e.value,e.elementId)),...r.messages.filter(e=>e.name).map(t=>({kind:`MESSAGE`,value:t.name,path:e,label:t.name,elementType:`message`})),...r.decisions.map(t=>({kind:`DECISION`,value:t.id,path:e,label:t.label,elementId:t.id,elementType:`decision`})),...r.formId?[{kind:`FORM`,value:r.formId,path:e,label:baseName$1(e),elementType:`form`}]:[],...r.variables.map(e=>at(`VARIABLE`,e.name,e.elementId,{writes:e.writes,where:e.where})),...r.errors.filter(e=>e.catches).map(e=>at(`ERROR`,e.code??``,e.elementId)),...r.variableForms.flatMap(e=>(n.get(e.formId)??[]).map(n=>at(`VARIABLE`,n,e.elementId,{writes:!0,where:t(`app.targets.onForm`,{form:e.formId})})))]})}var st={variables:[],fetches:[],implicitJobTypes:[]};function baseName(e){return e.split(/[\\/]/).pop()??e}function codeUses(e){return(e??st).variables.map(e=>({name:e.name,writes:e.writes,elementId:e.elementId,where:`${e.where} in ${baseName(e.path)}:${e.line}`,type:e.type??null,path:e.path,line:e.line,offset:e.offset}))}function withCodeVariables(e,t){let n=codeUses(t);return n.length===0?e:{...e,variables:[...e.variables,...n]}}function fetchesOf(e,t){return(e??st).fetches.filter(e=>e.elementId===t)}var ProjectCore=class{parsed=new Map;async snapshot(e,t=null){let n=new Set(e.map(e=>e.path));[...this.parsed.keys()].filter(e=>!n.has(e)).forEach(e=>this.parsed.delete(e));let r=await Promise.all(e.map(async e=>({path:e.path,model:withCodeVariables(await this.parse(e),t)})));return{files:r,targets:targetsOf(r)}}async variables(e){let{targets:t}=await this.snapshot(e),n=new Map;return t.filter(e=>e.kind===`VARIABLE`).forEach(e=>{let t=n.get(e.path)??[];t.push({name:e.value,writes:e.writes===!0,elementId:e.elementId??``,where:e.where??``}),n.set(e.path,t)}),e.filter(e=>kindOf$4(e.path)===`bpmn`).map(e=>({path:e.path,uses:n.get(e.path)??[]}))}async parse(e){let t=this.parsed.get(e.path);if(t?.text===e.text)return t.model;let n=await readModel(e.path,e.text);return this.parsed.set(e.path,{text:e.text,model:n}),n}},ct=b[`camunda-7`].platform,R=`Camunda Cloud`;function atLeast(e,t){let[n,r]=t.split(`.`).map(Number),[i,a]=e.split(`.`).map(Number);return i>n||i===n&&a>=r}var lt={ASSERT_DECISION:{required:[`decisionSelector`],allowed:[`decisionSelector`,`output`,`matchedRules`,`notMatchedRules`,`noMatchedRules`]},ASSERT_ELEMENT_INSTANCE:{required:[`processInstanceSelector`,`elementSelector`,`state`],allowed:[`processInstanceSelector`,`elementSelector`,`state`,`amount`]},ASSERT_ELEMENT_INSTANCES:{required:[`processInstanceSelector`,`elementSelectors`,`state`],allowed:[`processInstanceSelector`,`elementSelectors`,`state`]},ASSERT_PROCESS_INSTANCE:{required:[`processInstanceSelector`],allowed:[`processInstanceSelector`,`state`,`hasActiveIncidents`]},ASSERT_PROCESS_INSTANCE_MESSAGE_SUBSCRIPTION:{required:[`processInstanceSelector`,`messageSelector`,`state`],allowed:[`processInstanceSelector`,`messageSelector`,`state`]},ASSERT_USER_TASK:{required:[`userTaskSelector`],allowed:[`userTaskSelector`,`state`,`assignee`,`candidateGroups`,`priority`,`elementId`,`name`,`dueDate`,`followUpDate`]},ASSERT_VARIABLES:{required:[`processInstanceSelector`],allowed:[`processInstanceSelector`,`elementSelector`,`variableNames`,`variables`]},BROADCAST_SIGNAL:{required:[`signalName`],allowed:[`signalName`,`variables`]},COMPLETE_JOB:{required:[`jobSelector`],allowed:[`jobSelector`,`variables`,`useExampleData`]},COMPLETE_JOB_AD_HOC_SUB_PROCESS:{required:[`jobSelector`],allowed:[`jobSelector`,`variables`,`activateElements`,`cancelRemainingInstances`,`completionConditionFulfilled`]},COMPLETE_JOB_USER_TASK_LISTENER:{required:[`jobSelector`],allowed:[`jobSelector`,`denied`,`deniedReason`,`corrections`]},COMPLETE_USER_TASK:{required:[`userTaskSelector`],allowed:[`userTaskSelector`,`variables`,`useExampleData`]},CORRELATE_MESSAGE:{required:[`name`],allowed:[`name`,`correlationKey`,`variables`]},CREATE_PROCESS_INSTANCE:{required:[`processDefinitionSelector`],allowed:[`processDefinitionSelector`,`variables`,`startInstructions`,`runtimeInstructions`]},EVALUATE_CONDITIONAL_START_EVENT:{required:[`variables`],allowed:[`variables`]},EVALUATE_DECISION:{required:[`decisionDefinitionSelector`],allowed:[`decisionDefinitionSelector`,`variables`]},INCREASE_TIME:{required:[`duration`],allowed:[`duration`]},MOCK_CHILD_PROCESS:{required:[`processDefinitionId`],allowed:[`processDefinitionId`,`variables`]},MOCK_DMN_DECISION:{required:[`decisionDefinitionId`],allowed:[`decisionDefinitionId`,`variables`]},MOCK_JOB_WORKER_COMPLETE_JOB:{required:[`jobType`],allowed:[`jobType`,`variables`,`useExampleData`]},MOCK_JOB_WORKER_THROW_BPMN_ERROR:{required:[`jobType`,`errorCode`],allowed:[`jobType`,`errorCode`,`errorMessage`,`variables`]},PUBLISH_MESSAGE:{required:[`name`],allowed:[`name`,`correlationKey`,`variables`,`timeToLive`,`messageId`]},RESOLVE_INCIDENT:{required:[`incidentSelector`],allowed:[`incidentSelector`]},SET_TIME:{required:[`time`],allowed:[`time`]},THROW_BPMN_ERROR_FROM_JOB:{required:[`jobSelector`,`errorCode`],allowed:[`jobSelector`,`errorCode`,`errorMessage`,`variables`]},UPDATE_VARIABLES:{required:[`processInstanceSelector`,`variables`],allowed:[`processInstanceSelector`,`variables`,`elementSelector`]}},ut=`https://camunda.com/json-schema/cpt-test-cases/8.9/schema.json`,dt=new Set([`CREATE_PROCESS_INSTANCE`,`MOCK_JOB_WORKER_COMPLETE_JOB`,`MOCK_JOB_WORKER_THROW_BPMN_ERROR`,`COMPLETE_JOB`,`THROW_BPMN_ERROR_FROM_JOB`,`COMPLETE_USER_TASK`,`CORRELATE_MESSAGE`,`PUBLISH_MESSAGE`,`BROADCAST_SIGNAL`,`UPDATE_VARIABLES`,`ASSERT_PROCESS_INSTANCE`,`ASSERT_ELEMENT_INSTANCE`,`ASSERT_ELEMENT_INSTANCES`,`ASSERT_VARIABLES`,`ASSERT_USER_TASK`]),ft=new Set([`MOCK_CHILD_PROCESS`,`MOCK_DMN_DECISION`,`ASSERT_DECISION`,`ASSERT_PROCESS_INSTANCE_MESSAGE_SUBSCRIPTION`,`COMPLETE_JOB_AD_HOC_SUB_PROCESS`,`COMPLETE_JOB_USER_TASK_LISTENER`,`EVALUATE_CONDITIONAL_START_EVENT`,`EVALUATE_DECISION`,`RESOLVE_INCIDENT`,`SET_TIME`,`INCREASE_TIME`,`ASSERT_VARIABLE`,`CONDITIONAL_BEHAVIOR`]),pt=new Set([...dt,...ft]);function isObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function parseTestCases(e){let n;try{n=JSON.parse(e)}catch(e){return{file:null,problems:[t(`app.testCases.problem.notJson`,{reason:e instanceof Error?e.message:String(e)})],notJson:!0}}if(!isObject(n)||!Array.isArray(n.testCases))return{file:null,problems:[t(`app.testCases.problem.noTestCasesList`)]};let r=[];return n.testCases.forEach((e,n)=>{isObject(e)&&typeof e.name==`string`&&e.name.trim()!==``?!Array.isArray(e.instructions)||e.instructions.length===0?r.push(t(`app.testCases.problem.caseHasNoInstructions`,{name:e.name})):r.push(...problemsIn(e).map(n=>t(`app.testCases.problem.inCase`,{name:e.name,problem:n}))):r.push(t(`app.testCases.problem.caseHasNoName`,{number:n+1}))}),{file:n,problems:r}}var z=e(e=>typeof e==`string`&&e.trim()!==``,`TEXT`),mt={CREATE_PROCESS_INSTANCE:[[`processDefinitionSelector.processDefinitionId`,e=>isObject(e.processDefinitionSelector)&&z(e.processDefinitionSelector.processDefinitionId)]],MOCK_JOB_WORKER_COMPLETE_JOB:[[`jobType`,e=>z(e.jobType)]],MOCK_JOB_WORKER_THROW_BPMN_ERROR:[[`jobType`,e=>z(e.jobType)],[`errorCode`,e=>z(e.errorCode)]],MOCK_CHILD_PROCESS:[[`processDefinitionId`,e=>z(e.processDefinitionId)]],MOCK_DMN_DECISION:[[`decisionDefinitionId`,e=>z(e.decisionDefinitionId)]],COMPLETE_JOB:[[`jobSelector`,e=>isObject(e.jobSelector)]],THROW_BPMN_ERROR_FROM_JOB:[[`jobSelector`,e=>isObject(e.jobSelector)],[`errorCode`,e=>z(e.errorCode)]],COMPLETE_USER_TASK:[[`userTaskSelector`,e=>isObject(e.userTaskSelector)]],CORRELATE_MESSAGE:[[`name`,e=>z(e.name)]],PUBLISH_MESSAGE:[[`name`,e=>z(e.name)]],BROADCAST_SIGNAL:[[`signalName`,e=>z(e.signalName)]],UPDATE_VARIABLES:[[`variables`,e=>isObject(e.variables)]],INCREASE_TIME:[[`duration`,e=>z(e.duration)]],ASSERT_ELEMENT_INSTANCES:[[`elementSelectors`,e=>Array.isArray(e.elementSelectors)&&e.elementSelectors.every(isObject)],[`state`,e=>z(e.state)]],ASSERT_ELEMENT_INSTANCE:[[`elementSelector`,e=>isObject(e.elementSelector)],[`state`,e=>z(e.state)]],ASSERT_USER_TASK:[[`userTaskSelector`,e=>isObject(e.userTaskSelector)]]},ht=new Set(C.filter(e=>e!==`classic`)),gt=new Set([`complete`,`error`,`fire`,`hold`]);function caseProblems(e){if(!isObject(e))return[t(`app.testCases.problem.notAnObject`)];let n=typeof e.name==`string`&&e.name.trim()!==``?[]:[t(`app.testCases.problem.hasNoName`)];return!Array.isArray(e.instructions)||e.instructions.length===0?[...n,t(`app.testCases.problem.hasNoInstructions`)]:[...n,...problemsIn(e)]}function problemsIn(e){let n=[];e.instructions.forEach((e,r)=>{if(!isObject(e)||!z(e.type)){n.push(t(`app.testCases.problem.shapelessInstruction`,{number:r+1}));return}let i=e.type,a=(Object.hasOwn(mt,i)?mt[i]:[]).find(([,t])=>!t(e));if(a){n.push(t(`app.testCases.problem.instructionNeeds`,{number:r+1,type:i,property:a[0]}));return}let o=Object.hasOwn(lt,i)?lt[i]:void 0;if(!o)return;let s=o.required.find(t=>e[t]===void 0);if(s){n.push(t(`app.testCases.problem.instructionNeeds`,{number:r+1,type:i,property:s}));return}let c=Object.keys(e).find(e=>e!==`type`&&!o.allowed.includes(e));c&&n.push(t(`app.testCases.problem.instructionNotAllowed`,{number:r+1,type:i,property:c}))});let r=e[`x-penstock`];return r===void 0?n:isObject(r)?(r.engines!==void 0&&!(Array.isArray(r.engines)&&r.engines.every(e=>ht.has(e)))&&n.push(t(`app.testCases.problem.enginesList`,{engines:[...ht].join(`, `)})),r.behaviours!==void 0&&!isObject(r.behaviours)?n.push(t(`app.testCases.problem.behavioursNotAnObject`)):Object.entries(r.behaviours??{}).forEach(([e,r])=>{!isObject(r)||!gt.has(r.then)?n.push(t(`app.testCases.problem.behaviourNeedsThen`,{element:e})):r.then===`error`&&!z(r.errorCode)&&n.push(t(`app.testCases.problem.behaviourNeedsErrorCode`,{element:e}))}),n):[...n,t(`app.testCases.problem.blockNotAnObject`)]}function serialiseTestCases(e){let{$schema:t,...n}=e;return`${JSON.stringify({$schema:t??`https://camunda.com/json-schema/cpt-test-cases/8.9/schema.json`,...n},null,2)}\n`}function withTestCase(e,t){let n=e??{$schema:`https://camunda.com/json-schema/cpt-test-cases/8.9/schema.json`,testCases:[]},r=n.testCases.findIndex(e=>e?.name===t.name),i=r<0?[...n.testCases,t]:n.testCases.map((e,n)=>n===r?t:e);return{...n,$schema:n.$schema??`https://camunda.com/json-schema/cpt-test-cases/8.9/schema.json`,testCases:i}}function mergeTestCases(e,n){let r=null;if(e!==null&&e.trim()!==``){let n=parseTestCases(e);if(!n.file)return{problem:n.notJson?t(`app.testCases.problem.fileNotValidJson`):t(`app.testCases.problem.fileLeftAsItIs`,{problems:n.problems.join(`; `)})};r=n.file}let i=new Set((r?.testCases??[]).map(e=>e?.name)),a=[],o=[],s=r;for(let e of n)i.has(e.name)?o.push(e.name):(i.add(e.name),a.push(e.name),s=withTestCase(s,e));return{file:s??{$schema:`https://camunda.com/json-schema/cpt-test-cases/8.9/schema.json`,testCases:[]},added:a,kept:o}}function penstockOnly(e){return Object.keys(e[`x-penstock`]?.behaviours??{}).length>0}var _t=/\.(bpmn20\.xml|bpmn\.xml|bpmn)$/i,vt=`/src/main/resources/`;function testCaseFileFor(e,t){let n=e.replace(/\\/g,`/`),r=`${(n.split(`/`).pop()??n).replace(_t,``)}.json`,i=n.indexOf(vt);if(i>=0)return`${n.slice(0,i)}/src/test/resources/test-cases/${r}`;let a=n.lastIndexOf(`/`),o=a>=0?n.slice(0,a):null,beside=e=>o===null?e:`${o}/${e}`;if(!t)return beside(`test-cases/${r}`);let s=t.replace(/\\/g,`/`).replace(/\/+$/,``);return`${s.startsWith(`/`)||/^[A-Za-z]:\//.test(s)?s:beside(s)}/${r}`}var yt=`https://raw.githubusercontent.com/kern0x1b/penstock-release/main/docs/schema/penstock.schema.json`;function platformOf(e){return e===`camunda-8`?{name:R,version:`8.9.0`,namespaces:`xmlns:zeebe="http://camunda.org/schema/zeebe/1.0"`}:{name:b[e].platform,version:_[e].version,namespaces:`xmlns:${v(e)}="${b[e].bpmn}"`}}var bt={approve:{attributes:``,extension:`
9
+ <bpmn:extensionElements>
10
+ <zeebe:userTask />
11
+ <zeebe:formDefinition formId="approve-order" />
12
+ </bpmn:extensionElements>`},charge:{attributes:``,extension:`
13
+ <bpmn:extensionElements>
14
+ <zeebe:taskDefinition type="charge-card" />
15
+ </bpmn:extensionElements>`},decide:{attributes:``,extension:`
16
+ <bpmn:extensionElements>
17
+ <zeebe:calledDecision decisionId="shipping-method" resultVariable="shipping" />
18
+ </bpmn:extensionElements>`},receipt:{attributes:``,extension:`
19
+ <bpmn:extensionElements>
20
+ <zeebe:taskDefinition type="send-receipt" />
21
+ </bpmn:extensionElements>`},message:`<bpmn:message id="Message_shipment" name="shipment-confirmed">
22
+ <bpmn:extensionElements>
23
+ <zeebe:subscription correlationKey="=orderId" />
24
+ </bpmn:extensionElements>
25
+ </bpmn:message>`,process:``};function attributesOf(e){if(e===`camunda-8`)return bt;let t=v(e);return{approve:{attributes:` ${t}:formRef="approve-order" ${t}:formRefBinding="latest"`,extension:``},charge:{attributes:` ${t}:type="external" ${t}:topic="charge-card"`,extension:``},decide:{attributes:` ${t}:decisionRef="shipping-method" ${t}:decisionRefBinding="latest" ${t}:resultVariable="shipping" ${t}:mapDecisionResult="singleEntry"`,extension:``},receipt:{attributes:` ${t}:delegateExpression="\${sendReceipt}"`,extension:``},message:`<bpmn:message id="Message_shipment" name="shipment-confirmed" />`,process:` ${t}:historyTimeToLive="P30D"`}}function processXml(e){let t=platformOf(e),n=attributesOf(e);return`<?xml version="1.0" encoding="UTF-8"?>
26
+ <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" ${t.namespaces} xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_order" targetNamespace="http://bpmn.io/schema/bpmn" modeler:executionPlatform="${t.name}" modeler:executionPlatformVersion="${t.version}">
27
+ <bpmn:process id="order-process" name="Order" isExecutable="true"${n.process}>
28
+ <bpmn:startEvent id="order_received" name="Order received">
29
+ <bpmn:outgoing>Flow_1</bpmn:outgoing>
30
+ </bpmn:startEvent>
31
+ <bpmn:userTask id="approve_order" name="Approve order"${n.approve.attributes}>${n.approve.extension}
32
+ <bpmn:incoming>Flow_1</bpmn:incoming>
33
+ <bpmn:outgoing>Flow_2</bpmn:outgoing>
34
+ </bpmn:userTask>
35
+ <bpmn:serviceTask id="charge_card" name="Charge card"${n.charge.attributes}>${n.charge.extension}
36
+ <bpmn:incoming>Flow_2</bpmn:incoming>
37
+ <bpmn:outgoing>Flow_3</bpmn:outgoing>
38
+ </bpmn:serviceTask>
39
+ <bpmn:boundaryEvent id="card_declined" name="Card declined" attachedToRef="charge_card">
40
+ <bpmn:outgoing>Flow_7</bpmn:outgoing>
41
+ <bpmn:errorEventDefinition id="ErrorEventDefinition_declined" errorRef="Error_declined" />
42
+ </bpmn:boundaryEvent>
43
+ <bpmn:businessRuleTask id="decide_shipping" name="Decide shipping method"${n.decide.attributes}>${n.decide.extension}
44
+ <bpmn:incoming>Flow_3</bpmn:incoming>
45
+ <bpmn:outgoing>Flow_4</bpmn:outgoing>
46
+ </bpmn:businessRuleTask>
47
+ <bpmn:intermediateCatchEvent id="shipment_confirmed" name="Shipment confirmed">
48
+ <bpmn:incoming>Flow_4</bpmn:incoming>
49
+ <bpmn:outgoing>Flow_5</bpmn:outgoing>
50
+ <bpmn:messageEventDefinition id="MessageEventDefinition_shipment" messageRef="Message_shipment" />
51
+ </bpmn:intermediateCatchEvent>
52
+ <bpmn:serviceTask id="send_receipt" name="Send receipt"${n.receipt.attributes}>${n.receipt.extension}
53
+ <bpmn:incoming>Flow_5</bpmn:incoming>
54
+ <bpmn:outgoing>Flow_6</bpmn:outgoing>
55
+ </bpmn:serviceTask>
56
+ <bpmn:endEvent id="order_completed" name="Order completed">
57
+ <bpmn:incoming>Flow_6</bpmn:incoming>
58
+ </bpmn:endEvent>
59
+ <bpmn:endEvent id="payment_declined" name="Payment declined">
60
+ <bpmn:incoming>Flow_7</bpmn:incoming>
61
+ </bpmn:endEvent>
62
+ <bpmn:sequenceFlow id="Flow_1" sourceRef="order_received" targetRef="approve_order" />
63
+ <bpmn:sequenceFlow id="Flow_2" sourceRef="approve_order" targetRef="charge_card" />
64
+ <bpmn:sequenceFlow id="Flow_3" sourceRef="charge_card" targetRef="decide_shipping" />
65
+ <bpmn:sequenceFlow id="Flow_4" sourceRef="decide_shipping" targetRef="shipment_confirmed" />
66
+ <bpmn:sequenceFlow id="Flow_5" sourceRef="shipment_confirmed" targetRef="send_receipt" />
67
+ <bpmn:sequenceFlow id="Flow_6" sourceRef="send_receipt" targetRef="order_completed" />
68
+ <bpmn:sequenceFlow id="Flow_7" sourceRef="card_declined" targetRef="payment_declined" />
69
+ </bpmn:process>
70
+ <bpmn:error id="Error_declined" name="Card declined" errorCode="CARD_DECLINED" />
71
+ ${n.message}
72
+ <bpmndi:BPMNDiagram id="BPMNDiagram_1">
73
+ <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="order-process">
74
+ <bpmndi:BPMNShape id="order_received_di" bpmnElement="order_received">
75
+ <dc:Bounds x="152" y="102" width="36" height="36" />
76
+ <bpmndi:BPMNLabel>
77
+ <dc:Bounds x="132" y="145" width="76" height="27" />
78
+ </bpmndi:BPMNLabel>
79
+ </bpmndi:BPMNShape>
80
+ <bpmndi:BPMNShape id="approve_order_di" bpmnElement="approve_order">
81
+ <dc:Bounds x="240" y="80" width="100" height="80" />
82
+ </bpmndi:BPMNShape>
83
+ <bpmndi:BPMNShape id="charge_card_di" bpmnElement="charge_card">
84
+ <dc:Bounds x="400" y="80" width="100" height="80" />
85
+ </bpmndi:BPMNShape>
86
+ <bpmndi:BPMNShape id="decide_shipping_di" bpmnElement="decide_shipping">
87
+ <dc:Bounds x="560" y="80" width="100" height="80" />
88
+ </bpmndi:BPMNShape>
89
+ <bpmndi:BPMNShape id="shipment_confirmed_di" bpmnElement="shipment_confirmed">
90
+ <dc:Bounds x="712" y="102" width="36" height="36" />
91
+ <bpmndi:BPMNLabel>
92
+ <dc:Bounds x="691" y="145" width="78" height="27" />
93
+ </bpmndi:BPMNLabel>
94
+ </bpmndi:BPMNShape>
95
+ <bpmndi:BPMNShape id="send_receipt_di" bpmnElement="send_receipt">
96
+ <dc:Bounds x="800" y="80" width="100" height="80" />
97
+ </bpmndi:BPMNShape>
98
+ <bpmndi:BPMNShape id="order_completed_di" bpmnElement="order_completed">
99
+ <dc:Bounds x="952" y="102" width="36" height="36" />
100
+ <bpmndi:BPMNLabel>
101
+ <dc:Bounds x="930" y="145" width="80" height="27" />
102
+ </bpmndi:BPMNLabel>
103
+ </bpmndi:BPMNShape>
104
+ <bpmndi:BPMNShape id="payment_declined_di" bpmnElement="payment_declined">
105
+ <dc:Bounds x="432" y="232" width="36" height="36" />
106
+ <bpmndi:BPMNLabel>
107
+ <dc:Bounds x="410" y="275" width="80" height="27" />
108
+ </bpmndi:BPMNLabel>
109
+ </bpmndi:BPMNShape>
110
+ <bpmndi:BPMNShape id="card_declined_di" bpmnElement="card_declined">
111
+ <dc:Bounds x="432" y="142" width="36" height="36" />
112
+ <bpmndi:BPMNLabel>
113
+ <dc:Bounds x="474" y="185" width="52" height="27" />
114
+ </bpmndi:BPMNLabel>
115
+ </bpmndi:BPMNShape>
116
+ <bpmndi:BPMNEdge id="Flow_1_di" bpmnElement="Flow_1">
117
+ <di:waypoint x="188" y="120" />
118
+ <di:waypoint x="240" y="120" />
119
+ </bpmndi:BPMNEdge>
120
+ <bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2">
121
+ <di:waypoint x="340" y="120" />
122
+ <di:waypoint x="400" y="120" />
123
+ </bpmndi:BPMNEdge>
124
+ <bpmndi:BPMNEdge id="Flow_3_di" bpmnElement="Flow_3">
125
+ <di:waypoint x="500" y="120" />
126
+ <di:waypoint x="560" y="120" />
127
+ </bpmndi:BPMNEdge>
128
+ <bpmndi:BPMNEdge id="Flow_4_di" bpmnElement="Flow_4">
129
+ <di:waypoint x="660" y="120" />
130
+ <di:waypoint x="712" y="120" />
131
+ </bpmndi:BPMNEdge>
132
+ <bpmndi:BPMNEdge id="Flow_5_di" bpmnElement="Flow_5">
133
+ <di:waypoint x="748" y="120" />
134
+ <di:waypoint x="800" y="120" />
135
+ </bpmndi:BPMNEdge>
136
+ <bpmndi:BPMNEdge id="Flow_6_di" bpmnElement="Flow_6">
137
+ <di:waypoint x="900" y="120" />
138
+ <di:waypoint x="952" y="120" />
139
+ </bpmndi:BPMNEdge>
140
+ <bpmndi:BPMNEdge id="Flow_7_di" bpmnElement="Flow_7">
141
+ <di:waypoint x="450" y="178" />
142
+ <di:waypoint x="450" y="232" />
143
+ </bpmndi:BPMNEdge>
144
+ </bpmndi:BPMNPlane>
145
+ </bpmndi:BPMNDiagram>
146
+ </bpmn:definitions>
147
+ `}function dmnNamespaceOf(e){return b[e===`camunda-8`?`camunda-7`:e].dmn}function ttlOf(e){if(e===`camunda-8`)return{namespace:``,attribute:``};let t=v(e);return{namespace:` xmlns:${t}="${dmnNamespaceOf(e)}"`,attribute:` ${t}:historyTimeToLive="P30D"`}}function decisionXml(e){let t=platformOf(e),n=ttlOf(e);return`<?xml version="1.0" encoding="UTF-8"?>
148
+ <definitions xmlns="https://www.omg.org/spec/DMN/20191111/MODEL/" xmlns:dmndi="https://www.omg.org/spec/DMN/20191111/DMNDI/" xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/"${n.namespace} xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_shipping" name="Shipping" namespace="${dmnNamespaceOf(e)}" modeler:executionPlatform="${t.name}" modeler:executionPlatformVersion="${t.version}">
149
+ <decision id="shipping-method" name="Shipping method"${n.attribute}>
150
+ <decisionTable id="DecisionTable_shipping" hitPolicy="FIRST">
151
+ <input id="Input_country" label="Country">
152
+ <inputExpression id="InputExpression_country" typeRef="string">
153
+ <text>country</text>
154
+ </inputExpression>
155
+ </input>
156
+ <input id="Input_amount" label="Amount">
157
+ <inputExpression id="InputExpression_amount" typeRef="number">
158
+ <text>amount</text>
159
+ </inputExpression>
160
+ </input>
161
+ <output id="Output_shipping" label="Shipping" name="shipping" typeRef="string" />
162
+ <rule id="Rule_express">
163
+ <description>Big orders always go express</description>
164
+ <inputEntry id="Rule_express_country">
165
+ <text></text>
166
+ </inputEntry>
167
+ <inputEntry id="Rule_express_amount">
168
+ <text>&gt;= 100</text>
169
+ </inputEntry>
170
+ <outputEntry id="Rule_express_shipping">
171
+ <text>"express"</text>
172
+ </outputEntry>
173
+ </rule>
174
+ <rule id="Rule_standard">
175
+ <description>Home market</description>
176
+ <inputEntry id="Rule_standard_country">
177
+ <text>"DE"</text>
178
+ </inputEntry>
179
+ <inputEntry id="Rule_standard_amount">
180
+ <text></text>
181
+ </inputEntry>
182
+ <outputEntry id="Rule_standard_shipping">
183
+ <text>"standard"</text>
184
+ </outputEntry>
185
+ </rule>
186
+ <rule id="Rule_international">
187
+ <description>Everything else</description>
188
+ <inputEntry id="Rule_international_country">
189
+ <text></text>
190
+ </inputEntry>
191
+ <inputEntry id="Rule_international_amount">
192
+ <text></text>
193
+ </inputEntry>
194
+ <outputEntry id="Rule_international_shipping">
195
+ <text>"international"</text>
196
+ </outputEntry>
197
+ </rule>
198
+ </decisionTable>
199
+ </decision>
200
+ <dmndi:DMNDI>
201
+ <dmndi:DMNDiagram id="DMNDiagram_shipping">
202
+ <dmndi:DMNShape id="DMNShape_shipping" dmnElementRef="shipping-method">
203
+ <dc:Bounds height="80" width="180" x="160" y="100" />
204
+ </dmndi:DMNShape>
205
+ </dmndi:DMNDiagram>
206
+ </dmndi:DMNDI>
207
+ </definitions>
208
+ `}function formJson(e){let t=platformOf(e);return`${JSON.stringify({components:[{text:`# Approve order
209
+ Check the order and decide whether it goes ahead.`,type:`text`,id:`Field_intro`},{label:`Order`,type:`textfield`,id:`Field_order`,key:`orderId`,readonly:!0},{label:`Amount`,type:`number`,id:`Field_amount`,key:`amount`,readonly:!0},{label:`Approved`,type:`checkbox`,id:`Field_approved`,key:`approved`}],type:`default`,id:`approve-order`,executionPlatform:t.name,executionPlatformVersion:t.version,schemaVersion:18},null,2)}\n`}var xt={orderId:`A-1001`,amount:40,country:`DE`};function testCasesJson(e){let t={processDefinitionId:`order-process`},instance=e=>({type:`CREATE_PROCESS_INSTANCE`,processDefinitionSelector:t,variables:e}),n={type:`COMPLETE_USER_TASK`,userTaskSelector:{elementId:`approve_order`},variables:{approved:!0}},r={type:`MOCK_JOB_WORKER_COMPLETE_JOB`,jobType:`charge-card`,variables:{paymentId:`pay-1`}},i={type:`CORRELATE_MESSAGE`,name:`shipment-confirmed`,...e===`camunda-8`?{correlationKey:`A-1001`}:{}},a={type:`MOCK_JOB_WORKER_COMPLETE_JOB`,jobType:`send-receipt`},finished=e=>({type:`ASSERT_PROCESS_INSTANCE`,processInstanceSelector:t,state:e}),shipping=e=>({type:`ASSERT_VARIABLES`,processInstanceSelector:t,variables:{shipping:e}}),o=e===`camunda-8`?[a]:[];return`${JSON.stringify({$schema:ut,testCases:[{name:`A home order is approved, paid, shipped standard and completed`,description:`The whole way through, with the workers mocked`,instructions:[instance(xt),n,r,i,...o,shipping(`standard`),finished(`IS_COMPLETED`)]},{name:`An order from abroad ships internationally`,instructions:[instance({...xt,country:`US`}),n,r,i,...o,shipping(`international`),finished(`IS_COMPLETED`)]},{name:`A declined card ends the order without a shipment`,instructions:[instance({...xt,amount:5e3}),n,{type:`MOCK_JOB_WORKER_THROW_BPMN_ERROR`,jobType:`charge-card`,errorCode:`CARD_DECLINED`,errorMessage:`The card was declined`},{type:`ASSERT_ELEMENT_INSTANCE`,processInstanceSelector:t,elementSelector:{elementId:`payment_declined`},state:`IS_COMPLETED`},{type:`ASSERT_ELEMENT_INSTANCES`,processInstanceSelector:t,elementSelectors:[{elementId:`decide_shipping`}],state:`IS_NOT_ACTIVATED`},finished(`IS_COMPLETED`)]}]},null,2)}\n`}var St=`# yaml-language-server: $schema=${yt}
210
+ # What this project is. Commit it.
211
+
212
+ engine: camunda-8
213
+
214
+ deployment:
215
+ url: http://localhost:8080/v2
216
+ name: order-example
217
+ `,Ct=`<?xml version="1.0" encoding="UTF-8"?>
218
+ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
219
+ <modelVersion>4.0.0</modelVersion>
220
+ <parent>
221
+ <groupId>org.springframework.boot</groupId>
222
+ <artifactId>spring-boot-starter-parent</artifactId>
223
+ <version>4.0.8</version>
224
+ <relativePath/>
225
+ </parent>
226
+ <groupId>io.penstock.example</groupId>
227
+ <artifactId>order-workers</artifactId>
228
+ <version>1.0.0</version>
229
+ <properties>
230
+ <java.version>17</java.version>
231
+ <camunda.version>8.9.21</camunda.version>
232
+ </properties>
233
+ <dependencies>
234
+ <dependency>
235
+ <groupId>io.camunda</groupId>
236
+ <artifactId>camunda-spring-boot-starter</artifactId>
237
+ <version>\${camunda.version}</version>
238
+ </dependency>
239
+ <dependency>
240
+ <groupId>org.springframework.boot</groupId>
241
+ <artifactId>spring-boot-starter</artifactId>
242
+ </dependency>
243
+ </dependencies>
244
+ <build>
245
+ <plugins>
246
+ <plugin>
247
+ <groupId>org.springframework.boot</groupId>
248
+ <artifactId>spring-boot-maven-plugin</artifactId>
249
+ </plugin>
250
+ </plugins>
251
+ </build>
252
+ </project>
253
+ `,wt=`camunda:
254
+ client:
255
+ mode: self-managed
256
+ rest-address: http://localhost:8080
257
+ grpc-address: http://localhost:26500
258
+ `,Tt=`package io.penstock.example;
259
+
260
+ import org.springframework.boot.SpringApplication;
261
+ import org.springframework.boot.autoconfigure.SpringBootApplication;
262
+
263
+ @SpringBootApplication
264
+ public class OrderWorkersApplication {
265
+
266
+ public static void main(String[] args) {
267
+ SpringApplication.run(OrderWorkersApplication.class, args);
268
+ }
269
+ }
270
+ `,Et=`package io.penstock.example;
271
+
272
+ import io.camunda.client.annotation.JobWorker;
273
+ import io.camunda.client.annotation.Variable;
274
+ import io.camunda.client.exception.BpmnError;
275
+ import java.util.Map;
276
+ import java.util.UUID;
277
+ import org.springframework.stereotype.Component;
278
+
279
+ @Component
280
+ public class ChargeCardWorker {
281
+
282
+ private static final double CARD_LIMIT = 1000;
283
+
284
+ @JobWorker(type = "charge-card")
285
+ public Map<String, Object> chargeCard(@Variable String orderId, @Variable Number amount) {
286
+ if (amount.doubleValue() > CARD_LIMIT) {
287
+ throw new BpmnError("CARD_DECLINED", "Order " + orderId + " is over the card limit");
288
+ }
289
+ return Map.of("paymentId", "pay-" + UUID.randomUUID());
290
+ }
291
+ }
292
+ `,Dt=`${JSON.stringify({name:`order-node-worker`,version:`1.0.0`,private:!0,type:`module`,scripts:{start:`node index.js`},engines:{node:`>=20`},dependencies:{"@camunda8/sdk":`8.8.13`}},null,2)}\n`,Ot=`import { Camunda8 } from '@camunda8/sdk';
293
+
294
+ const camunda = new Camunda8({
295
+ CAMUNDA_AUTH_STRATEGY: 'NONE',
296
+ ZEEBE_REST_ADDRESS: process.env.ZEEBE_REST_ADDRESS ?? 'http://localhost:8080',
297
+ });
298
+
299
+ camunda.getCamundaRestClient().createJobWorker({
300
+ type: 'send-receipt',
301
+ worker: 'order-node-worker',
302
+ timeout: 30000,
303
+ maxJobsToActivate: 5,
304
+ jobHandler: async (job) => {
305
+ console.log(\`Receipt for order \${job.variables.orderId}, shipped \${job.variables.shipping}\`);
306
+ return job.complete({ receiptSentAt: new Date().toISOString() });
307
+ },
308
+ });
309
+ `,kt=`target/
310
+ node_modules/
311
+ `,At=`# Order process on Camunda 8
312
+
313
+ A small order process that runs from the first minute: a user task with a Camunda Form approves the order, a service task
314
+ charges the card (and ends the order when the card is declined), a decision picks the shipping method, the process waits for
315
+ a message that the parcel has shipped, and a second service task sends the receipt.
316
+
317
+ | File | What it is |
318
+ |---|---|
319
+ | \`src/main/resources/order-process.bpmn\` | the process |
320
+ | \`src/main/resources/shipping-method.dmn\` | the decision |
321
+ | \`src/main/resources/approve-order.form\` | the Camunda Form of the user task |
322
+ | \`src/main/java/io/penstock/example/ChargeCardWorker.java\` | the \`charge-card\` job worker, Spring Boot |
323
+ | \`node-worker/index.js\` | the \`send-receipt\` job worker, Node |
324
+ | \`src/test/resources/test-cases/order-process.json\` | test cases in the Camunda test-case format |
325
+ | \`penstock.yaml\` | what Penstock needs to know: the engine and where to deploy |
326
+
327
+ ## You need
328
+
329
+ - Java 17 or newer and Maven 3.9 or newer for the Spring Boot worker, Node 20 or newer for the Node worker
330
+ - a local Camunda 8, for example [Camunda 8 Run](https://github.com/camunda/camunda/tree/main/c8run) (it needs a JDK 21 or newer)
331
+ - Penstock: the plugin in your IDE, or the \`penstock\` command line
332
+
333
+ ## Run it
334
+
335
+ 1. Start Camunda 8 Run and leave it running: \`./start.sh\` in its folder (\`c8run.exe start\` on Windows). Operate and Tasklist
336
+ open at http://localhost:8080, the login is demo / demo.
337
+ 2. Look at the diagrams in the editor, or check them from the terminal: \`penstock check .\`
338
+ 3. Deploy the process, the decision and the form: \`penstock deploy .\`
339
+ 4. Start the workers, each in its own terminal:
340
+ - \`mvn spring-boot:run\`
341
+ - \`cd node-worker && npm install && npm start\`
342
+ 5. Start an order. A home order under 1000 is paid and ships standard; use \`"amount": 5000\` to see the card declined:
343
+
344
+ \`\`\`
345
+ curl -X POST http://localhost:8080/v2/process-instances -H 'Content-Type: application/json' \\
346
+ -d '{"processDefinitionId":"order-process","variables":{"orderId":"A-1001","amount":40,"country":"DE"}}'
347
+ \`\`\`
348
+
349
+ 6. Open Tasklist, approve the order, then tell the process the parcel has shipped:
350
+
351
+ \`\`\`
352
+ curl -X POST http://localhost:8080/v2/messages/correlation -H 'Content-Type: application/json' \\
353
+ -d '{"name":"shipment-confirmed","correlationKey":"A-1001"}'
354
+ \`\`\`
355
+
356
+ ## Run the test cases
357
+
358
+ \`penstock scenarios run .\` deploys a test build of the process, mocks the job workers and runs the three cases in
359
+ \`src/test/resources/test-cases/order-process.json\` against your local engine. The first run on a local engine asks once
360
+ whether it may. Test-case runs are a Penstock Pro feature and every machine starts with a 30 day Pro trial.
361
+
362
+ ## Where the versions come from
363
+
364
+ - Spring Boot worker: \`io.camunda:camunda-spring-boot-starter\` 8.9.21 on Spring Boot 4.0.8,
365
+ see [Camunda Spring Boot Starter](https://docs.camunda.io/docs/apis-tools/camunda-spring-boot-starter/getting-started/).
366
+ Before 8.10 it was published as \`spring-boot-starter-camunda-sdk\`.
367
+ - Node worker: \`@camunda8/sdk\` 8.8.13, see [the Camunda 8 JavaScript SDK](https://github.com/camunda/camunda-8-js-sdk).
368
+ - Local engine: [Camunda 8 Run](https://docs.camunda.io/docs/8.7/self-managed/setup/deploy/local/c8run/) and its
369
+ [readme](https://github.com/camunda/camunda/blob/main/c8run/README.md).
370
+ `;function camunda8Files(){return{"penstock.yaml":St,"README.md":At,".gitignore":kt,"pom.xml":Ct,"src/main/resources/application.yaml":wt,"src/main/resources/order-process.bpmn":processXml(`camunda-8`),"src/main/resources/shipping-method.dmn":decisionXml(`camunda-8`),"src/main/resources/approve-order.form":formJson(`camunda-8`),"src/main/java/io/penstock/example/OrderWorkersApplication.java":Tt,"src/main/java/io/penstock/example/ChargeCardWorker.java":Et,"src/test/resources/test-cases/order-process.json":testCasesJson(`camunda-8`),"node-worker/package.json":Dt,"node-worker/index.js":Ot}}function penstockYaml(e){return`# yaml-language-server: $schema=${yt}
371
+ # What this project is. Commit it.
372
+
373
+ engine: ${e}
374
+
375
+ deployment:
376
+ url: http://localhost:8080/engine-rest
377
+ name: order-example
378
+ `}function pom(e,t){return`<?xml version="1.0" encoding="UTF-8"?>
379
+ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
380
+ <modelVersion>4.0.0</modelVersion>
381
+ <parent>
382
+ <groupId>org.springframework.boot</groupId>
383
+ <artifactId>spring-boot-starter-parent</artifactId>
384
+ <version>${e.springBoot}</version>
385
+ <relativePath/>
386
+ </parent>
387
+ <groupId>io.penstock.example</groupId>
388
+ <artifactId>order-engine</artifactId>
389
+ <version>1.0.0</version>
390
+ <properties>
391
+ <java.version>17</java.version>
392
+ <${t}.version>${e.version}</${t}.version>
393
+ </properties>
394
+ <dependencies>
395
+ <dependency>
396
+ <groupId>${e.springBootGroup}</groupId>
397
+ <artifactId>${e.rest}</artifactId>
398
+ <version>\${${t}.version}</version>
399
+ </dependency>
400
+ <dependency>
401
+ <groupId>${e.springBootGroup}</groupId>
402
+ <artifactId>${e.webapp}</artifactId>
403
+ <version>\${${t}.version}</version>
404
+ </dependency>
405
+ <dependency>
406
+ <groupId>com.h2database</groupId>
407
+ <artifactId>h2</artifactId>
408
+ <scope>runtime</scope>
409
+ </dependency>
410
+ </dependencies>
411
+ <build>
412
+ <plugins>
413
+ <plugin>
414
+ <groupId>org.springframework.boot</groupId>
415
+ <artifactId>spring-boot-maven-plugin</artifactId>
416
+ </plugin>
417
+ </plugins>
418
+ </build>
419
+ </project>
420
+ `}function workerPom(e,t){return`<?xml version="1.0" encoding="UTF-8"?>
421
+ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
422
+ <modelVersion>4.0.0</modelVersion>
423
+ <groupId>io.penstock.example</groupId>
424
+ <artifactId>order-worker</artifactId>
425
+ <version>1.0.0</version>
426
+ <properties>
427
+ <maven.compiler.release>17</maven.compiler.release>
428
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
429
+ <${t}.version>${e.version}</${t}.version>
430
+ </properties>
431
+ <dependencies>
432
+ <dependency>
433
+ <groupId>${e.bpmGroup}</groupId>
434
+ <artifactId>${e.client}</artifactId>
435
+ <version>\${${t}.version}</version>
436
+ </dependency>
437
+ <dependency>
438
+ <groupId>org.slf4j</groupId>
439
+ <artifactId>slf4j-simple</artifactId>
440
+ <version>2.0.17</version>
441
+ </dependency>
442
+ </dependencies>
443
+ <build>
444
+ <plugins>
445
+ <plugin>
446
+ <groupId>org.codehaus.mojo</groupId>
447
+ <artifactId>exec-maven-plugin</artifactId>
448
+ <version>3.5.0</version>
449
+ <configuration>
450
+ <mainClass>io.penstock.example.worker.ChargeCardWorker</mainClass>
451
+ </configuration>
452
+ </plugin>
453
+ </plugins>
454
+ </build>
455
+ </project>
456
+ `}function applicationYaml(e){return`server:
457
+ port: 8080
458
+
459
+ ${e}:
460
+ bpm:
461
+ admin-user:
462
+ id: demo
463
+ password: demo
464
+ filter:
465
+ create: All tasks
466
+ `}var jt=`package io.penstock.example;
467
+
468
+ import org.springframework.boot.SpringApplication;
469
+ import org.springframework.boot.autoconfigure.SpringBootApplication;
470
+
471
+ @SpringBootApplication
472
+ public class OrderApplication {
473
+
474
+ public static void main(String[] args) {
475
+ SpringApplication.run(OrderApplication.class, args);
476
+ }
477
+ }
478
+ `;function delegate(e){return`package io.penstock.example;
479
+
480
+ import java.time.Instant;
481
+ import ${e}.bpm.engine.delegate.DelegateExecution;
482
+ import ${e}.bpm.engine.delegate.JavaDelegate;
483
+ import org.slf4j.Logger;
484
+ import org.slf4j.LoggerFactory;
485
+ import org.springframework.stereotype.Component;
486
+
487
+ @Component("sendReceipt")
488
+ public class SendReceiptDelegate implements JavaDelegate {
489
+
490
+ private static final Logger LOG = LoggerFactory.getLogger(SendReceiptDelegate.class);
491
+
492
+ @Override
493
+ public void execute(DelegateExecution execution) {
494
+ LOG.info("Receipt for order {}, shipped {}", execution.getVariable("orderId"), execution.getVariable("shipping"));
495
+ execution.setVariable("receiptSentAt", Instant.now().toString());
496
+ }
497
+ }
498
+ `}function worker(e){return`package io.penstock.example.worker;
499
+
500
+ import java.util.Map;
501
+ import java.util.UUID;
502
+ import ${e}.bpm.client.ExternalTaskClient;
503
+ import ${e}.bpm.client.task.ExternalTask;
504
+ import ${e}.bpm.client.task.ExternalTaskService;
505
+
506
+ public class ChargeCardWorker {
507
+
508
+ private static final double CARD_LIMIT = 1000;
509
+
510
+ public static void main(String[] args) {
511
+ String engine = System.getenv().getOrDefault("ENGINE_REST_URL", "http://localhost:8080/engine-rest");
512
+ ExternalTaskClient client = ExternalTaskClient.create()
513
+ .baseUrl(engine)
514
+ .asyncResponseTimeout(10000)
515
+ .build();
516
+ client.subscribe("charge-card")
517
+ .lockDuration(30000)
518
+ .handler(ChargeCardWorker::chargeCard)
519
+ .open();
520
+ }
521
+
522
+ private static void chargeCard(ExternalTask task, ExternalTaskService service) {
523
+ String orderId = task.getVariable("orderId");
524
+ Number amount = task.getVariable("amount");
525
+ if (amount.doubleValue() > CARD_LIMIT) {
526
+ service.handleBpmnError(task, "CARD_DECLINED", "Order " + orderId + " is over the card limit");
527
+ return;
528
+ }
529
+ service.complete(task, Map.of("paymentId", "pay-" + UUID.randomUUID()));
530
+ }
531
+ }
532
+ `}var Mt=`target/
533
+ `,Nt=`See the [Spring Boot integration](https://docs.camunda.org/manual/latest/user-guide/spring-boot-integration/) and the
534
+ [External Task Client](https://docs.camunda.org/manual/latest/user-guide/ext-client/) in the Camunda documentation.
535
+ 7.24.0 is the last community release on Maven Central.
536
+ `;function readme(e,t){let n=ee(e);return`# Order process on ${n}
537
+
538
+ A small order process that runs from the first minute: a user task with a form approves the order, an external task
539
+ charges the card (and ends the order when the card is declined), a decision picks the shipping method, the process waits for
540
+ a message that the parcel has shipped, and a Java delegate sends the receipt.
541
+
542
+ | File | What it is |
543
+ |---|---|
544
+ | \`src/main/resources/order-process.bpmn\` | the process |
545
+ | \`src/main/resources/shipping-method.dmn\` | the decision |
546
+ | \`src/main/resources/approve-order.form\` | the form of the user task |
547
+ | \`src/main/java/io/penstock/example/SendReceiptDelegate.java\` | the Java delegate behind \`send_receipt\` |
548
+ | \`worker/\` | the external task worker for the topic \`charge-card\`, a plain Java client |
549
+ | \`src/test/resources/test-cases/order-process.json\` | test cases in the Camunda test-case format |
550
+ | \`penstock.yaml\` | what Penstock needs to know: the engine and where to deploy |
551
+
552
+ ## You need
553
+
554
+ - Java 17 or newer and Maven 3.9 or newer
555
+ - Penstock: the plugin in your IDE, or the \`penstock\` command line
556
+
557
+ The engine is part of the example: a Spring Boot application with the ${n} engine, its REST API and the web apps,
558
+ on an in-memory H2 database.
559
+
560
+ ## Run it
561
+
562
+ 1. Start the engine and leave it running: \`mvn spring-boot:run\`. Cockpit and Tasklist are at http://localhost:8080,
563
+ the login is demo / demo. The process, the decision and the form are deployed when it starts.
564
+ 2. Look at the diagrams in the editor, or check them from the terminal: \`penstock check .\`
565
+ 3. After you change a diagram, deploy it again: \`penstock deploy .\`
566
+ 4. Start the external task worker in a second terminal: \`mvn -f worker/pom.xml compile exec:java\`
567
+ 5. Start an order. A home order under 1000 is paid and ships standard; use \`"amount": 5000\` to see the card declined:
568
+
569
+ \`\`\`
570
+ curl -X POST http://localhost:8080/engine-rest/process-definition/key/order-process/start -H 'Content-Type: application/json' \\
571
+ -d '{"businessKey":"A-1001","variables":{"orderId":{"value":"A-1001"},"amount":{"value":40},"country":{"value":"DE"}}}'
572
+ \`\`\`
573
+
574
+ 6. Open Tasklist, approve the order, then tell the process the parcel has shipped:
575
+
576
+ \`\`\`
577
+ curl -X POST http://localhost:8080/engine-rest/message -H 'Content-Type: application/json' \\
578
+ -d '{"messageName":"shipment-confirmed","businessKey":"A-1001"}'
579
+ \`\`\`
580
+
581
+ ## Run the test cases
582
+
583
+ \`penstock scenarios run .\` deploys a test build of the process, mocks the external task and runs the three cases in
584
+ \`src/test/resources/test-cases/order-process.json\` against the running engine. The delegate runs for real, so keep the
585
+ engine from step 1 running. The first run on a local engine asks once whether it may. Test-case runs are a Penstock Pro
586
+ feature and every machine starts with a 30 day Pro trial.
587
+
588
+ ## Where the versions come from
589
+
590
+ ${[`- Engine: \`${t.rest}\` and \`${t.webapp}\` ${t.version} on Spring Boot ${t.springBoot}, from \`${t.springBootGroup}\`.`,`- Worker: \`${t.client}\` ${t.version}, from \`${t.bpmGroup}\`.`].join(`
591
+ `)}
592
+ ${e===`camunda-7`?`\n${Nt}`:``}`}function sevenFamilyFiles(e,t=`3`){let n=y(e,t);if(!n)throw Error(`${ee(e)} has no Spring Boot ${t} starters`);let r=n.client.replace(/-external-task-client$/,``),i=S(e);return{"penstock.yaml":penstockYaml(e),"README.md":readme(e,n),".gitignore":Mt,"pom.xml":pom(n,r),"src/main/resources/application.yaml":applicationYaml(b[e].settings),"src/main/resources/order-process.bpmn":processXml(e),"src/main/resources/shipping-method.dmn":decisionXml(e),"src/main/resources/approve-order.form":formJson(e),"src/main/java/io/penstock/example/OrderApplication.java":jt,"src/main/java/io/penstock/example/SendReceiptDelegate.java":delegate(i),"src/test/resources/test-cases/order-process.json":testCasesJson(e),"worker/pom.xml":workerPom(n,r),"worker/src/main/java/io/penstock/example/worker/ChargeCardWorker.java":worker(i)}}var Pt=[`camunda-8`,`camunda-7`,`operaton`,`cib-seven`];function isExample(e){return Pt.includes(e)}function exampleFiles(e,t=`3`){return e===`camunda-8`?camunda8Files():sevenFamilyFiles(e,t)}function own$1(e,t){return Object.hasOwn(e,t)?e[t]:void 0}e(own$1,`own`);function words$2(e){return e.replace(/([a-z0-9])([A-Z])/g,`$1 $2`).split(/[^A-Za-z0-9]+/).filter(Boolean)}e(words$2,`words`);function camel(e){let t=words$2(e).map(e=>e.toLowerCase()).map((e,t)=>t===0?e:e[0].toUpperCase()+e.slice(1)).join(``);return/^[A-Za-z_]/.test(t)?t:`worker${t}`}function pascal(e){let t=camel(e);return t[0].toUpperCase()+t.slice(1)}function snake(e){let t=words$2(e).map(e=>e.toLowerCase()).join(`_`);return/^[a-z_]/.test(t)?t:`worker_${t}`}function kebab(e){return words$2(e).map(e=>e.toLowerCase()).join(`-`)||`worker`}function javaString(e){return JSON.stringify(e)}function javaIdentifier(e){let t=e.replace(/[^A-Za-z0-9_]/g,`_`);return/^[A-Za-z_]/.test(t)?t:`_${t}`}function errorFactory(e){return camel(e.toLowerCase())}function spring(e,t,n){let r=atLeast(n,`8.8`),i=`${t?.className||pascal(e.jobType)}Worker`,a=camel(e.jobType),o=t?.reads??[],s=t?.writes??[],c=t?.errors??[],l=r?`CamundaBpmnError`:`ZeebeBpmnError`,u=[r?`io.camunda.client.annotation.JobWorker`:`io.camunda.zeebe.spring.client.annotation.JobWorker`,...o.length>0?[r?`io.camunda.client.annotation.Variable`:`io.camunda.zeebe.spring.client.annotation.Variable`]:[],...c.length>0?[r?`io.camunda.client.exception.CamundaBpmnError`:`io.camunda.zeebe.spring.client.exception.ZeebeBpmnError`]:[],`java.util.HashMap`,`java.util.Map`,`org.springframework.stereotype.Component`].sort(),d=o.map(e=>` @Variable(name = ${javaString(e)}) Object ${javaIdentifier(e)}`).join(`,
593
+ `),f=[...t?.packageName?[`package ${t.packageName};`,``]:[],...u.map(e=>`import ${e};`),``,`@Component`,`public class ${i} {`,``,` @JobWorker(type = ${javaString(e.jobType)})`,` public Map<String, Object> ${a}(${d?`\n${d}`:``}) {`,` Map<String, Object> result = new HashMap<>();`,...s.map(e=>` result.put(${javaString(e)}, null);`),` return result;`,` }`,...c.flatMap(e=>[``,` private static ${l} ${errorFactory(e.code)}(String message) {`,` return new ${l}(${javaString(e.code)}, message);`,` }`]),`}`];return{fileName:`${i}.java`,content:`${f.join(`
594
+ `)}\n`,language:`spring`}}function node(e,t){let n=t?.reads??[],r=t?.writes??[],i=t?.errors??[],a=r.length>0?`{ ${r.map(e=>`${/^[A-Za-z_$][\w$]*$/.test(e)?e:JSON.stringify(e)}: undefined`).join(`, `)} }`:`{}`,o=[`import { Camunda8 } from '@camunda8/sdk';`,``,`const camunda = new Camunda8();`,`const zeebe = camunda.getZeebeGrpcApiClient();`,``,`zeebe.createWorker({`,` taskType: ${JSON.stringify(e.jobType).replace(/^"|"$/g,`'`)},`,` taskHandler: async (job) => {`,...n.length>0?[` const { ${n.join(`, `)} } = job.variables;`]:[],...i.map(e=>` // return job.error('${e.code}', ${JSON.stringify(e.message??`TODO`)});`),` return job.complete(${a});`,` },`,`});`];return{fileName:`${kebab(e.jobType)}.worker.ts`,content:`${o.join(`
595
+ `)}\n`,language:`node`}}function python(e,t){let n=t?.reads??[],r=t?.writes??[],i=t?.errors??[],a=snake(e.jobType),o=[`from pyzeebe import ZeebeTaskRouter`,...i.length>0?[`from pyzeebe.errors import BusinessError`]:[],``,`router = ZeebeTaskRouter()`,``,``,`@router.task(task_type="${e.jobType}")`,`async def ${a}(${n.map(e=>e.replace(/[^A-Za-z0-9_]/g,`_`)).join(`, `)}):`,...i.map(e=>` # raise BusinessError("${e.code}")`),` return {${r.map(e=>`"${e}": None`).join(`, `)}}`];return{fileName:`${a}_worker.py`,content:`${o.join(`
596
+ `)}\n`,language:`python`}}function workerSkeleton(e,t,n,r=`8.8`){switch(n){case`node`:return node(e,t);case`python`:return python(e,t);default:return spring(e,t,r)}}function readsOf(e){return e.properties.filter(e=>e.binding?.type===`zeebe:input`||e.binding?.type===`camunda:inputOutput`).map(e=>e.binding?.name).filter(e=>!!e)}function writesOf(e){return e.properties.filter(e=>e.binding?.type===`zeebe:output`).map(e=>e.binding?.name).filter(e=>!!e)}function valueOf$1(e){let t=e.elementType??{};return t[`zeebe:taskDefinition`]??t[`camunda:topic`]??e.id}e(valueOf$1,`valueOf`);function factsFor(e){return{className:``,packageName:null,shape:`unknown`,reads:readsOf(e),writes:writesOf(e),errors:[],usesBusinessKey:!1,usesEngineServices:[],readsAllVariables:!1,line:1}}function workerFromTemplate(e,t,n=`8.8`){let r=valueOf$1(e);return workerSkeleton({kind:`class`,value:r,role:`task`,elementId:``,where:``,jobType:r},factsFor(e),t,n)}var Placement=class{placed;constructor(e,t){this.placed=e.map((e,n)=>({item:e,order:n,start:t(e)})).sort((e,t)=>e.start-t.start||e.order-t.order)}inOrder(e,t){return this.between(e,t).sort((e,t)=>e.order-t.order).map(e=>e.item)}byPosition(e,t){return this.between(e,t).map(e=>e.item)}between(e,t){let n=[];for(let r=this.firstFrom(e);r<this.placed.length&&this.placed[r].start<=t;r+=1)n.push(this.placed[r]);return n}firstFrom(e){let t=0,n=this.placed.length;for(;t<n;){let r=t+n>>>1;this.placed[r].start<e?t=r+1:n=r}return t}},Ft=new WeakMap;function factIndexOf(e){let t=Ft.get(e);return t===void 0&&(t=buildIndex(e),Ft.set(e,t)),t}function firstByKey(e,t){let n=new Map;for(let r of e){let e=t(r);n.has(e)||n.set(e,r)}return n}function spanIs(e,t){return e.from===t.from&&e.to===t.to}function buildIndex(e){let t=[...e.accesses,...e.innerAccesses];return{callsBySpan:new Placement(e.calls,e=>e.span.from),callsAt:new Placement(e.calls,e=>e.at),constructionsBySpan:new Placement(e.constructions,e=>e.span.from),callablesBySpan:new Placement(e.callables,e=>e.span.from),callablesAt:new Placement(e.callables,e=>e.at),parametersAt:new Placement(e.callables.flatMap(e=>e.parameters),e=>e.at),localsAt:new Placement(e.locals,e=>e.at),membersAt:new Placement(e.declarations.flatMap(e=>e.members),e=>e.at),accessesAt:new Placement(t,e=>e.at),accessesBySpan:new Placement(t,e=>e.span.from),returnsAt:new Placement(e.returns,e=>e.at),pairsByObject:groupByKey(e.pairs,e=>e.object),callableNamed:firstByKey(e.callables,e=>e.name),enclosingCall:innermostOwners(e.calls.flatMap(e=>e.arguments.map(t=>({owner:e,span:t.span}))),e.calls),enclosingReturn:innermostOwners(e.returns.map(e=>({owner:e,span:e.span})),e.calls)}}function groupByKey(e,t){let n=new Map;for(let r of e){let e=t(r),i=n.get(e);i===void 0?n.set(e,[r]):i.push(r)}return n}function innermostOwners(e,t){let n=[...e].sort((e,t)=>e.span.from-t.span.from||t.span.to-e.span.to),r=[...t].sort((e,t)=>e.span.from-t.span.from),i=[],a=new Map,o=0;for(let e of r){let t=e.span.from;for(;o<n.length&&n[o].span.from<=t;){let e=n[o];for(;i.length>0&&i[i.length-1].span.to<=e.span.from;)i.pop();i.push(e),o+=1}for(;i.length>0&&i[i.length-1].span.to<=t;)i.pop();for(let t=i.length-1;t>=0;--t){let n=i[t].span;if(n.from<=e.span.from&&e.span.to<=n.to){a.set(e,i[t].owner);break}}}return a}var B={from:0,to:1/0};[...new Set([`Component`,`Service`,`Named`,`Repository`,`Controller`])];var It=`jobType`,Lt=`handler`,Rt=`fetchVariables`,zt=new Set([`worker`,`task`]),Bt=new Map([[`SubscribeJobType`,`JOB_TYPE`],[`JobType`,`JOB_TYPE`],[`TopicName`,`TOPIC`]]),Vt=new Map([[`TopicName`,`TOPIC`],[`TaskType`,`JOB_TYPE`],[`JobType`,`JOB_TYPE`]]),Ht=new Set([`Variables`]),key=(e,t)=>`${e}:${t}`,lastSegment=e=>e.split(`.`).pop()??e,byPosition=e=>[...e].sort((e,t)=>e.at-t.at),callSpanning=(e,t)=>factIndexOf(e).callsBySpan.inOrder(t.from,t.from).find(e=>spanIs(e.span,t));function stringsOf(e,t){return t.values===null?t.value===null?callSpanning(e,t.span)?.arguments.flatMap(e=>e.value??[])??[]:[t.value]:t.values}function chainedCalls(e,t,n){return factIndexOf(e).callsBySpan.inOrder(t.span.from,t.span.from).filter(e=>e.name===n&&e.span.from===t.span.from&&e.span.to>t.span.to)}function handlerNameOf(e){return e?.identifier??e?.reference??null}function handlerSpan(e,t,n){let r=handlerNameOf(t),i=r===null?void 0:factIndexOf(e).callableNamed.get(r);return i===void 0?n===void 0?t?.span??null:n.span:i.span}function pythonSites(e){return e.callables.flatMap(t=>t.annotations.flatMap(n=>{if(!zt.has(lastSegment(n.name)))return[];let r=n.arguments.find(e=>(e.name===`task_type`||e.name===`topic_name`)&&e.value!==null),i=r?.value??null;if(r===void 0||i===null)return[];let a=n.arguments.find(e=>e.name?.includes(`variables`)??!1);return[{kind:r.name===`task_type`?`JOB_TYPE`:`TOPIC`,value:i,valueAt:r.span.from,at:n.at,end:t.span.to,span:t.span,fetch:a===void 0?null:stringsOf(e,a),contract:!0,handler:t.name}]}))}function pythonCallSites(e){return byPosition(e.calls).flatMap(t=>{if(!zt.has(t.name))return[];let n=t.arguments.find(e=>(e.name===`task_type`||e.name===`topic_name`)&&e.value!==null),r=chainedCalls(e,t,t.name)[0];if(n===void 0||n.value===null||r===void 0)return[];let i=t.arguments.find(e=>e.name?.includes(`variables`)??!1),a=r.arguments[0];return[{kind:n.name===`task_type`?`JOB_TYPE`:`TOPIC`,value:n.value,valueAt:n.span.from,at:t.at,end:r.span.to,span:handlerSpan(e,a,r)??B,fetch:i===void 0?null:stringsOf(e,i),contract:!0,handler:handlerNameOf(a)}]})}function goFetch(e){let t=e.arguments.slice(1),n=t.map(e=>e.constructs!==null).lastIndexOf(!0),r=t.slice(n+1).flatMap(e=>e.value??[]);return r.length>0?r:null}function goSites(e){return byPosition(e.calls).flatMap(t=>{let n=Bt.get(t.name),r=t.arguments[0],i=r?.value??null;if(n===void 0||r===void 0||i===null)return[];let a=chainedCalls(e,t,`Handler`)[0],o=t.name===`SubscribeJobType`?t.arguments[1]:a?.arguments[0];return[{kind:n,value:i,valueAt:r.span.from,at:t.at,end:t.span.to,span:handlerSpan(e,o,a)??B,fetch:goFetch(t),contract:!0,handler:handlerNameOf(o)}]})}function csharpFetch(e,t){let n=byPosition(factIndexOf(e).callsBySpan.inOrder(t.span.from,t.span.from)).filter(e=>Ht.has(e.name)&&e.span.from===t.span.from&&e.span.to>t.span.to);return n.length===0?null:n.flatMap(e=>e.arguments.flatMap(e=>e.value??[]))}function csharpSites(e){let t=byPosition(e.calls),n=[...e.declarations,...e.callables].flatMap(e=>e.annotations.flatMap(e=>e.arguments)),assigned=(t,r)=>byPosition([...n.flatMap(e=>e.name===t&&e.value!==null?[{kind:r,value:e.value,valueAt:e.span.from,at:e.at,end:e.span.to,span:B,fetch:null,contract:!1,handler:null}]:[]),...e.pairs.flatMap(e=>e.key===t&&e.value.value!==null?[{kind:r,value:e.value.value,valueAt:e.value.span.from,at:e.at,end:e.value.span.to,span:B,fetch:null,contract:!1,handler:null}]:[])]),called=(n,r)=>t.flatMap(t=>{let i=t.arguments[0],a=i?.value??null;if(t.name!==n||i===void 0||a===null)return[];let o=chainedCalls(e,t,`Handler`)[0];return[{kind:r,value:a,valueAt:i.span.from,at:t.at,end:t.span.to,span:handlerSpan(e,o?.arguments[0],o)??B,fetch:csharpFetch(e,t),contract:!0,handler:handlerNameOf(o?.arguments[0])}]});return[...Vt].flatMap(([e,t])=>[...assigned(e,t),...called(e,t)])}function chainSites(e){return byPosition(e.calls).flatMap(t=>{let n=t.arguments[0],r=n?.value??null;if(t.name!==It||t.receiver===null||n===void 0||r===null)return[];let i=chainedCalls(e,t,Lt)[0],a=chainedCalls(e,t,Rt);return[{kind:`JOB_TYPE`,value:r,valueAt:n.span.from,at:t.at,end:t.span.to,span:handlerSpan(e,i?.arguments[0],i)??t.span,fetch:a.length===0?null:a.flatMap(e=>e.arguments.flatMap(e=>e.value??[])),contract:!0,handler:handlerNameOf(i?.arguments[0])}]})}var Ut={java:chainSites,kotlin:chainSites,groovy:chainSites,scala:chainSites,typescript:()=>[],javascript:()=>[],python:e=>[...pythonSites(e),...pythonCallSites(e)],go:goSites,csharp:csharpSites};function workerSitesOf(e){return Ut[e.language](e)}function regionOf(e){return{kind:e.kind,value:e.value,span:e.span,fetch:e.fetch??[],fetchAt:e.at,declared:e.fetch!==null,implicitAt:0}}function siteRegions(e,t){let n=new Set;return workerSitesOf(e).flatMap(e=>{let r=key(e.kind,e.value);return!t.has(r)||n.has(r)?[]:(n.add(r),[regionOf(e)])})}var Wt={regions:siteRegions};({...Wt}),{...Wt},{...Wt};var Gt=new Set([`setVariable`,`setVariableLocal`,`putValue`,`putValueTyped`,`variable`]);new Map([...[`startProcessInstanceByKey`,`createProcessInstanceByKey`,`startProcessInstanceByKeyAndTenantId`,`processDefinitionKey`,`bpmnProcessId`].map(e=>[e,{kind:`PROCESS`}]),...[`isWaitingAt`,`isNotWaitingAt`,`hasPassed`,`hasNotPassed`,`hasPassedInOrder`,`hasPassedElement`,`hasNotPassedElement`,`hasPassedElementsInOrder`,`hasCompletedElements`,`hasCompletedElementsInOrder`,`hasActiveElements`,`hasTerminatedElements`,`hasNotActivatedElements`,`hasActivatedElements`,`isActiveAt`,`byId`,`startBeforeActivity`,`startAfterActivity`,`cancelAllForActivity`,`activityId`,`taskDefinitionKey`,`elementId`,`hasActiveElement`].map(e=>[e,{kind:`ELEMENT`}]),...[`correlateMessage`,`createMessageCorrelation`,`messageName`,`correlateMessageAsync`].map(e=>[e,{kind:`MESSAGE`}]),...[`evaluateDecisionByKey`,`evaluateDecisionTableByKey`,`decisionKey`,`decisionId`,`decisionDefinitionKey`].map(e=>[e,{kind:`DECISION`}]),...[`getVariable`,`getVariableLocal`,`getVariableTyped`,`getVariableLocalTyped`,`setVariable`,`setVariableLocal`,`removeVariable`,`removeVariableLocal`,`hasVariable`,`hasVariableLocal`,`putValue`,`putValueTyped`,`variable`,`hasVariableNames`,`hasLocalVariable`,`hasLocalVariableNames`,`hasVariableWithValue`,`hasVariableSatisfies`].map(e=>[e,{kind:`VARIABLE`,writes:Gt.has(e)}]),[`handleBpmnError`,{kind:`ERROR`,at:1}],[`errorCode`,{kind:`ERROR`}],[`bpmnError`,{kind:`ERROR`}]]);var XmlError=class extends Error{},Kt=`http://www.w3.org/XML/1998/namespace`;function split(e){let t=e.indexOf(`:`);return t<0?{prefix:``,local:e}:{prefix:e.slice(0,t),local:e.slice(t+1)}}function parseXml(e){let n=new l,r=[],i=null,a=null;n.on(`openTag`,(e,t,n)=>{let a={},o=t();for(let[e,t]of Object.entries(o))a[e]=n(t);let s=new Map(r.length>0?r[r.length-1].scope:[[`xml`,Kt]]);for(let[e,t]of Object.entries(a))e===`xmlns`?s.set(``,t):e.startsWith(`xmlns:`)&&s.set(e.slice(6),t);let{prefix:c,local:l}=split(e),u={name:e,local:l,prefix:c,ns:s.get(c)??``,attrs:a,children:[],text:``,scope:s};r.length>0?r[r.length-1].node.children.push(u):i||=u,r.push({node:u,scope:s})}),n.on(`closeTag`,()=>{r.pop()}),n.on(`text`,(e,t)=>{r.length>0&&(r[r.length-1].node.text+=t(e))}),n.on(`cdata`,e=>{r.length>0&&(r[r.length-1].node.text+=e)}),n.on(`error`,e=>{a??=e.message});try{n.parse(e)}catch(e){a??=e instanceof Error?e.message:String(e)}if(a)throw new XmlError(t(`app.xml.notWellFormed`,{reason:a}));if(!i||r.length>0)throw new XmlError(t(`app.xml.emptyOrNotClosed`));return i}function findAll(e,t){let n=[],r=[...e.children].reverse();for(let e=r.pop();e;e=r.pop()){e.local===t&&n.push(e);for(let t=e.children.length-1;t>=0;--t)r.push(e.children[t])}return n}function escapeText(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`)}function escapeXml(e){return escapeText(e).replace(/"/g,`&quot;`)}function serializeXml(e){let t=[],n=[e];for(let e=n.pop();e!==void 0;e=n.pop()){if(typeof e==`string`){t.push(e);continue}let r=Object.entries(e.attrs).map(([e,t])=>` ${e}="${escapeXml(t)}"`).join(``);if(e.children.length===0&&e.text.trim()===``)t.push(`<${e.name}${r}/>`);else if(t.push(`<${e.name}${r}>`),n.push(`</${e.name}>`),e.children.length>0)for(let t=e.children.length-1;t>=0;--t)n.push(e.children[t]);else t.push(escapeXml(e.text))}return t.join(``)}function declaredIds(e,t){try{if(e===`form`){let e=JSON.parse(t).id;return typeof e==`string`?[e]:[]}return findAll(parseXml(t),e).map(e=>e.attrs.id).filter(e=>typeof e==`string`&&e!==``)}catch{return[]}}var qt=/\.(bpmn20\.xml|bpmn\.xml|bpmn)$/i,Jt=[`camunda:class`,`camunda:delegateExpression`,`camunda:expression`],Yt=`P1D`,Xt=`PT1S`,Zt=`Penstock test build`,Qt=/(<(?:[\w-]+:)?decision\b[^>]*\sid=")([^"]+)(")/g,$t=/(<(?:[\w-]+:)?definitions\b[^>]*?\sid=")([^"]+)(")/;function idsOf(e){let t={processes:new Set,decisions:new Set,forms:new Set};for(let n of e)qt.test(n.name)?declaredIds(`process`,n.content).forEach(e=>t.processes.add(e)):/\.dmn$/i.test(n.name)?declaredIds(`decision`,n.content).forEach(e=>t.decisions.add(e)):/\.form$/i.test(n.name)&&declaredIds(`form`,n.content).forEach(e=>t.forms.add(e));return t}function own(e,t,n){let renamed=(e,t)=>t.has(e)?`${n}${e}`:e;if(/\.dmn$/i.test(t.name)){let r=t.content.replace(Qt,(t,n,r,i)=>`${n}${renamed(r,e.decisions)}${i}`).replace(/(href="#)([^"]+)(")/g,(t,n,r,i)=>`${n}${renamed(r,e.decisions)}${i}`).replace(/(dmnElementRef=")([^"]+)(")/g,(t,n,r,i)=>`${n}${renamed(r,e.decisions)}${i}`).replace($t,(e,t,r,i)=>`${t}${n}${r}${i}`);return{...t,content:r}}if(/\.form$/i.test(t.name))try{let n=JSON.parse(t.content);return{...t,content:JSON.stringify({...n,id:renamed(String(n.id),e.forms)})}}catch{return t}return t}function marked(e,t){if(/\.form$/i.test(e.name))try{let n=JSON.parse(e.content);return{...e,content:JSON.stringify({...n,exporter:{name:Zt,version:t}})}}catch{return{...e,content:`${e.content}\n`}}return{...e,content:`${e.content.trimEnd()}\n<!-- ${Zt} ${t} -->\n`}}function extensionOf(e,t){return e?.extensionElements?.values?.find(e=>e.$type===t)}function attributeOf(e,t){try{return e.get?.(t)}catch{return}}function pointAtBuild(e,t,n){let rename=(e,t,r)=>{let i=e?.[t];typeof i==`string`&&r.has(i)&&(e[t]=`${n}${i}`)};rename(extensionOf(e,`zeebe:CalledElement`),`processId`,t.processes),rename(extensionOf(e,`zeebe:CalledDecision`),`decisionId`,t.decisions),rename(extensionOf(e,`zeebe:FormDefinition`),`formId`,t.forms),e.$type===`bpmn:CallActivity`&&rename(e,`calledElement`,t.processes);let r=attributeOf(e,`camunda:decisionRef`);typeof r==`string`&&t.decisions.has(r)&&e.set(`camunda:decisionRef`,`${n}${r}`);let i=attributeOf(e,`camunda:formRef`);typeof i==`string`&&t.forms.has(i)&&e.set(`camunda:formRef`,`${n}${i}`)}function mockedJobTypes(e){let t=new Set;for(let n of e.instructions){let e=n.type;if((e===`MOCK_JOB_WORKER_COMPLETE_JOB`||e===`MOCK_JOB_WORKER_THROW_BPMN_ERROR`)&&typeof n.jobType==`string`&&t.add(n.jobType),e===`COMPLETE_JOB`||e===`THROW_BPMN_ERROR_FROM_JOB`){let e=n.jobSelector?.jobType;typeof e==`string`&&t.add(e)}}return t}function answeredElements(e){let t=new Set(Object.keys(e[`x-penstock`]?.behaviours??{}));for(let n of e.instructions){if(n.type!==`COMPLETE_JOB`&&n.type!==`THROW_BPMN_ERROR_FROM_JOB`)continue;let e=n.jobSelector?.elementId;typeof e==`string`&&t.add(e)}return t}function flowElementsOf(e){let t=[],n=[],walk=e=>(e??[]).forEach(e=>{n.push(e),e.flowElements&&walk(e.flowElements)});for(let n of e?.rootElements??[])n.$type===`bpmn:Process`&&(t.push(n),walk(n.flowElements));return{processes:t,elements:n}}function taskDefinitionOf(e){return e?.extensionElements?.values?.find(e=>e.$type===`zeebe:TaskDefinition`)}function fireAtOnce(e,t){let n=t.eventDefinitions?.find(e=>e.$type===`bpmn:TimerEventDefinition`);n&&(n.timeDate=void 0,n.timeCycle=void 0,n.timeDuration=e.create(`bpmn:FormalExpression`,{body:Xt}))}function camunda8$1(e,t,n,r,i){let a=taskDefinitionOf(e),o=typeof a?.type==`string`?a.type:null;if(!o)return;let s=r.has(o);if(!s&&!t&&!n)return;let c=`${i.prefix}${o}`;a.type=c,s&&i.jobTypes.set(o,c),(t||n)&&i.elements.set(e.id,c)}e(camunda8$1,`camunda8`);function camunda7$1(e,t,n,r,i){let a=e.get?.(`camunda:type`)===`external`?e.get(`camunda:topic`):null;if(typeof a==`string`&&a!==``){let o=r.has(a);if(!o&&!t&&!n)return;let s=`${i.prefix}${a}`;e.set(`camunda:topic`,s),o&&i.jobTypes.set(a,s),(t||n)&&i.elements.set(e.id,s);return}if(!t&&!n||!Jt.some(t=>typeof e.get?.(t)==`string`))return;Jt.forEach(t=>e.set(t,void 0));let o=`${i.prefix}${e.id}`;e.set(`camunda:type`,`external`),e.set(`camunda:topic`,o),i.elements.set(e.id,o)}e(camunda7$1,`camunda7`);async function testBuild(e,t,n,r){let i={resources:[],processes:new Map,jobTypes:new Map,elements:new Map,prefix:`penstock.${r}.`},a=idsOf(t),o=mockedJobTypes(n),s=answeredElements(n),c=n[`x-penstock`]?.behaviours??{};for(let n of t){if(!qt.test(n.name)){i.resources.push(marked(own(a,n,i.prefix),r));continue}let t=await T(n.content,g(e));if(!t)throw Error(`${n.name} is not a BPMN diagram that can be read`);let l=w(t),{processes:u,elements:d}=flowElementsOf(t);u.forEach(e=>{i.processes.set(e.id,`${i.prefix}${e.id}`),e.id=`${i.prefix}${e.id}`});for(let t of d){pointAtBuild(t,a,i.prefix);let n=c[t.id];n?.then===`fire`&&fireAtOnce(l,t),(h(e)?camunda8$1:camunda7$1)(t,n?.then===`fire`?void 0:n,s.has(t.id),o,i)}m(e)&&u.forEach(e=>{e.get(`camunda:historyTimeToLive`)||e.set(`camunda:historyTimeToLive`,Yt)}),t.set(`exporter`,Zt),t.set(`exporterVersion`,r),i.resources.push({name:n.name,content:await f(t)})}return i}var Unread=class extends Error{};function list$1(e){return Array.isArray(e)?e.filter(e=>typeof e==`object`&&!!e):[]}e(list$1,`list`);function sameValue(e,t){if(e===t)return!0;if(typeof e!=`object`||typeof t!=`object`||e===null||t===null||Array.isArray(e)!==Array.isArray(t))return!1;let n=Object.keys(e),r=Object.keys(t);return n.length===r.length&&n.every(n=>sameValue(e[n],t[n]))}function parsed(e){if(typeof e!=`string`)return e;try{return JSON.parse(e)}catch{return e}}function timeOf(e){return e?Date.parse(e.replace(/([+-]\d\d)(\d\d)$/,`$1:$2`)):NaN}function now(){return new Date().toISOString()}async function read(e,n,r){let i=await e(n);if(i.status>=200&&i.status<300)return parsed(i.body);let a=typeof i.body==`string`?i.body:``,o=a.slice(0,300);try{let e=JSON.parse(a);o=String([e.message,e.detail,e.title].find(e=>typeof e==`string`)??o)}catch{o=a.slice(0,300)}throw r.push({at:now(),text:t(`app.testCases.trace.couldNotRead`,{path:n.path,status:i.status,reason:o?t(`app.testCases.trace.reason`,{reason:o}):``}),error:!0}),new Unread}async function optional(e,t){try{return await e}catch(e){if(e instanceof Unread)return t;throw e}}function appendValue(e,t){let n=e.findIndex(e=>e.name===t.name);n>=0?e.splice(n,1,t):e.push(t)}async function camunda7(e,t,n,r){let i=encodeURIComponent(t),[a,o,s,c]=await Promise.all([optional(read(e,{method:`GET`,path:`/history/process-instance/${i}`},r),null),optional(read(e,{method:`GET`,path:`/history/activity-instance?processInstanceId=${i}&sortBy=occurrence&sortOrder=asc`},r),[]),optional(read(e,{method:`GET`,path:`/history/detail?processInstanceId=${i}&variableUpdates=true&deserializeValues=false&sortBy=occurrence&sortOrder=asc`},r),[]),optional(read(e,{method:`GET`,path:`/incident?processInstanceId=${i}`},r),[])]),l=new Set(list$1(c).map(e=>String(e.activityId??``))),u=list$1(s).map(e=>({name:String(e.variableName),value:e.variableType===`Object`||e.variableType===`Json`?parsed(e.value):e.value,scope:String(e.activityInstanceId??``),time:timeOf(e.time)})),d=list$1(o).map(e=>{let t=String(e.id),r=timeOf(e.startTime),i=[],a=[],o=[],s=new Map;for(let e of u){if(e.scope===t){let t={name:e.name,value:e.value,source:`history`};appendValue(a,t),appendValue(o,s.has(e.name)?{...t,before:s.get(e.name)}:t)}else e.time<=r&&appendValue(i,{name:e.name,value:e.value,source:`history`});s.set(e.name,e.value)}let c=!!e.endTime,d=e.canceled?`TERMINATED`:c?`COMPLETED`:l.has(String(e.activityId))?`FAILED`:`ACTIVE`;return{elementId:String(e.activityId),elementType:String(e.activityType??``),...t?{instance:t}:{},...e.parentActivityInstanceId?{parent:String(e.parentActivityInstanceId)}:{},state:d,startedAt:String(e.startTime??``),endedAt:c?String(e.endTime):null,mocked:n.mocked?.has(String(e.activityId))??!1,in:i,out:a,changed:o}}),f=String(a?.state??`ACTIVE`),p=list$1(c).map(e=>({elementId:String(e.activityId??``),message:String(e.incidentMessage??e.incidentType??``)}));return{state:f===`COMPLETED`?`COMPLETED`:f===`ACTIVE`||f===`SUSPENDED`?p.length>0?`FAILED`:`ACTIVE`:`TERMINATED`,steps:d,incidents:p}}function valuesOf$1(e,t){return Object.entries(e).map(([e,n])=>({name:e,value:n,source:t}))}e(valuesOf$1,`valuesOf`);function difference(e,t,n){return Object.entries(t).filter(([t,n])=>!Object.hasOwn(e,t)||!sameValue(e[t],n)).map(([t,r])=>Object.hasOwn(e,t)?{name:t,value:r,before:e[t],source:n}:{name:t,value:r,source:n})}async function camunda8(e,t,n,r){let post=(e,t)=>({method:`POST`,path:e,body:JSON.stringify(t)}),[i,a,o,s]=await Promise.all([optional(read(e,{method:`GET`,path:`/process-instances/${encodeURIComponent(t)}`},r),null),optional(read(e,post(`/element-instances/search`,{filter:{processInstanceKey:t},sort:[{field:`startDate`,order:`asc`}],page:{limit:500}}),r),null),optional(read(e,post(`/incidents/search`,{filter:{processInstanceKey:t,state:`ACTIVE`},page:{limit:500}}),r),null),optional(read(e,post(`/decision-instances/search`,{filter:{processInstanceKey:t},page:{limit:100}}),r),null)]),c=new Map;for(let t of list$1(s?.items)){let n=await optional(read(e,{method:`GET`,path:`/decision-instances/${encodeURIComponent(String(t.decisionEvaluationInstanceKey))}`},r),null);if(!n)continue;let i=String(n.elementInstanceKey??t.elementInstanceKey??``),a=c.get(i)??{in:[],out:[]};list$1(n.evaluatedInputs).forEach(e=>a.in.push({name:String(e.inputName??e.inputId),value:parsed(e.inputValue),source:`decision`})),list$1(n.matchedRules).forEach(e=>list$1(e.evaluatedOutputs).forEach(e=>a.out.push({name:String(e.outputName??e.outputId),value:parsed(e.outputValue),source:`decision`}))),c.set(i,a)}let l=new Map((n.mockCalls??[]).map(e=>[e.elementInstance,e])),u=new Set(list$1(o?.items).map(e=>String(e.elementId??``))),d=n.snapshots??[],f=new Map;for(let e=1;e<d.length;e+=1){let t=d[e].completed.find(e=>!l.has(e)&&!c.has(e));if(!t||f.has(t))continue;let n=d[e].completed.flatMap(e=>Object.entries(l.get(e)?.sent??{})),explained=e=>n.some(([t,n])=>t===e.name&&sameValue(n,e.value));f.set(t,difference(d[e-1].variables,d[e].variables,`diff`).filter(e=>!explained(e)))}let p=list$1(a?.items).filter(j).map(e=>{let t=String(e.elementInstanceKey),r=e.state===`COMPLETED`?`COMPLETED`:e.state===`TERMINATED`?`TERMINATED`:e.hasIncident||u.has(String(e.elementId))?`FAILED`:`ACTIVE`,i={elementId:String(e.elementId),elementType:String(e.type??``),...t?{instance:t}:{},...e.flowScopeKey?{parent:String(e.flowScopeKey)}:{},state:r,startedAt:String(e.startDate??``),endedAt:e.endDate?String(e.endDate):null,mocked:n.mocked?.has(String(e.elementId))??!1,in:[],out:[],changed:[]},a=l.get(t),o=c.get(t);return a?(i.in=valuesOf$1(a.received,`mock`),i.out=valuesOf$1(a.sent,`mock`),i.changed=difference(a.received,a.sent,`mock`)):o?(i.in=o.in,i.out=o.out):i.changed=f.get(t)??[],i}),m=String(i?.state??`ACTIVE`),h=list$1(o?.items).map(e=>({elementId:String(e.elementId??``),message:String(e.errorMessage??e.errorType??``)}));return{state:m===`COMPLETED`?`COMPLETED`:m===`ACTIVE`?h.length>0?`FAILED`:`ACTIVE`:`TERMINATED`,steps:p,incidents:h}}async function readTrace(e,t,n,r={}){let i=[...r.log??[]],a=e===`CAMUNDA_8`?await camunda8(t,n,r,i):await camunda7(t,n,r,i);return{version:1,runId:r.runId??``,engine:e,testCase:r.testCase??null,instance:n,...a,log:i}}function two(e){return String(e).padStart(2,`0`)}function runId(e){return`${`${e.getUTCFullYear()}${two(e.getUTCMonth()+1)}${two(e.getUTCDate())}`}-${`${two(e.getUTCHours())}${two(e.getUTCMinutes())}${two(e.getUTCSeconds())}`}-${Math.floor(Math.random()*65536).toString(16).padStart(4,`0`)}`}var en=100;function hashOf(e){let t=2166136261;for(let n of e)t^=n.codePointAt(0)??0,t=Math.imul(t,16777619)>>>0;return t.toString(16).padStart(8,`0`)}function slugOf$1(e){let t=e.normalize(`NFKD`).replace(/[\u0300-\u036f]/g,``),n=t.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``);return n?n===`run`?`run-case`:/[^\x20-\x7e]/.test(t)||n.length>en?`${n.slice(0,en).replace(/-+$/,``)}-${hashOf(e)}`:n:`case-${hashOf(e)}`}e(slugOf$1,`slugOf`);function traceName(e,t){let n=slugOf$1(e),r=n;for(let e=2;t.has(r);e+=1)r=`${n}-${e}`;return t.add(r),r}var tn=5e3,RunFailure=class extends Error{},Mismatch=class extends RunFailure{comparison;constructor(e,t){super(e),this.comparison=t}},Stopped=class extends Error{},nn=[`assignee`,`candidateGroups`,`priority`,`name`,`dueDate`,`followUpDate`];function listed$1(e){return e.length<2?e.join(``):`${e.slice(0,-1).join(`, `)}${t(`app.testCases.listSeparator`)}${e[e.length-1]}`}e(listed$1,`listed`);var rn=10,an=2e4,on=new Set([`MOCK_JOB_WORKER_COMPLETE_JOB`,`MOCK_JOB_WORKER_THROW_BPMN_ERROR`,`MOCK_CHILD_PROCESS`,`MOCK_DMN_DECISION`]),sn=ft,cn=/\.(bpmn20\.xml|bpmn\.xml|bpmn)$/i;function startOf$1(e){let t=e.instructions.findIndex(e=>!on.has(String(e.type)));return t>=0&&e.instructions[t].type===`CREATE_PROCESS_INSTANCE`?t:-1}e(startOf$1,`startOf`);function foreignProcess(e,t){for(let n of[`processInstanceSelector`,`jobSelector`,`userTaskSelector`,`elementSelector`]){let r=e[n]?.processDefinitionId;if(typeof r==`string`&&r!==t)return r}return null}function unrunnable(e){let n=e.instructions.findIndex(e=>typeof e!=`object`||!e||typeof e.type!=`string`);if(n>=0)return t(`app.testCases.unrunnable.shapelessInstruction`,{number:n+1});let r=e.instructions[startOf$1(e)]?.processDefinitionSelector?.processDefinitionId;if(e.instructions.filter(e=>e.type===`CREATE_PROCESS_INSTANCE`).length>1)return t(`app.testCases.unrunnable.oneInstancePerTestCase`);for(let n of e.instructions){let e=String(n.type);if(sn.has(e))return t(`app.testCases.unrunnable.notYet`,{type:e});if(!pt.has(e))return t(`app.testCases.unrunnable.unknown`,{type:e});let i=e===`ASSERT_USER_TASK`?nn.filter(e=>e in n):[];if(i.length)return t(`app.testCases.unrunnable.userTaskFields`,{fields:listed$1(i)});if(n.useExampleData===!0)return t(`app.testCases.unrunnable.exampleData`,{type:e});let a=n.runtimeInstructions;if(Array.isArray(a)&&a.length>0)return t(`app.testCases.unrunnable.runtimeInstructions`,{type:e});let o=foreignProcess(n,r);if(o&&r)return t(`app.testCases.unrunnable.foreignProcess`,{type:e,foreign:o,root:r})}return null}function json(e){return JSON.stringify(e)??`undefined`}function fingerprint(e){return json({state:e.state,elements:e.elements.map(e=>[e.key,e.state,e.incident]),variables:e.variables})}function correlationKeyOf(e,t){let n=e?.correlationKey?.trim();if(!n)return;if(!n.startsWith(`=`))return n;let r=/^=\s*([A-Za-z_]\w*)\s*$/.exec(n)?.[1];return r&&t[r]!==void 0&&t[r]!==null?String(t[r]):void 0}async function stepsIn(e){let t=new Map;for(let n of e)cn.test(n.name)&&stepsOf(await T(n.content)).forEach((e,n)=>t.set(n,e));return t}async function runTestCase(e,n){let r=n.now??Date.now,i=r();try{return await runOne(e,n)}catch(a){let o=t(`app.testCases.penstockFailed`,{reason:a instanceof Error?a.message:String(a)});return n.emit?.({kind:`testFinished`,testCase:e.name,outcome:`failed`,message:o,durationMs:r()-i,trace:null}),{outcome:`failed`,message:o,trace:null,recorded:[]}}}async function runOne(e,n){let{engine:r,runId:i}=n,a=e.name,o=n.stepTimeoutMs??3e4,s=n.pollMs??500,c=Math.max(n.settleReads??3,1),l=n.sleep??(e=>new Promise(t=>setTimeout(t,e))),u=n.now??Date.now,d=n.emit??(()=>void 0),f=`${Math.round(o/1e3)} s`,m=u(),h=[],g=[],_=[],v=[],say=(e,t)=>{h.push({at:new Date().toISOString(),text:e,...t?{error:t}:{}}),d({kind:`log`,testCase:a,text:e,...t?{error:t}:{}})},finish=(e,t,n,r)=>(d({kind:`testFinished`,testCase:a,outcome:e,...t?{message:t}:{},...r?{comparison:r}:{},durationMs:u()-m,trace:n}),{outcome:e,...t?{message:t}:{},...r?{comparison:r}:{},trace:n,recorded:g});d({kind:`testStarted`,testCase:a});let y=e[`x-penstock`]?.engines;if(y?.length&&!p(y,r.kind))return finish(`skipped`,t(`app.testCases.forOtherEngines`,{engines:listed$1(y.map(e=>ee(e)))}),null);let b=unrunnable(e);if(b)return finish(`failed`,b,null);let x=startOf$1(e);if(x<0)return finish(`failed`,t(`app.testCases.needsCreateProcessInstance`),null);let S=e.instructions[x],C=await stepsIn(n.resources),labelOf=e=>C.get(e)?.name??e,te=e[`x-penstock`]?.behaviours??{},w;try{w=await testBuild(r.kind,n.resources,e,i)}catch(e){return finish(`failed`,e instanceof Error?e.message:String(e),null)}let T=new Set;C.forEach((e,t)=>{let n=e.job??e.external;(n&&w.jobTypes.has(n)||w.elements.has(t))&&T.add(t)});let ne=[...new Set([...w.jobTypes.values(),...w.elements.values()])],E=new Map;for(let n of e.instructions)if(n.type===`MOCK_JOB_WORKER_COMPLETE_JOB`||n.type===`MOCK_JOB_WORKER_THROW_BPMN_ERROR`){let e=n,r=w.jobTypes.get(e.jobType);if(!r){say(t(`app.testCases.log.noElementWithJobType`,{jobType:e.jobType}));continue}E.set(r,e.type===`MOCK_JOB_WORKER_THROW_BPMN_ERROR`?{kind:`error`,variables:e.variables??{},errorCode:e.errorCode,errorMessage:e.errorMessage}:{kind:`complete`,variables:e.variables??{}})}let D=new Map,O=new Map,refreshLocks=async e=>{for(let t of[...D.values()])!e&&u()-(O.get(t.key)??0)<an||(await r.extend(t).catch(()=>void 0),O.set(t.key,u()))},parkedAt=e=>[...D.values()].find(t=>t.elementId===e)??null,re=new Map,k=new Map,A=``,j=``,N=null,stopIfAsked=()=>{if(n.signal?.aborted)throw new Stopped},answerJob=async(e,n,i,a,o)=>{n===`error`?await r.error(e,a??`ERROR`,o??``,i):await r.complete(e,i),_.push({elementId:e.elementId,elementInstance:e.elementInstance,received:e.variables,sent:i}),T.add(e.elementId),say(n===`error`?t(`app.testCases.log.mockThrew`,{label:labelOf(e.elementId),code:a}):t(`app.testCases.log.mockCompleted`,{label:labelOf(e.elementId)}))},answerJobs=async()=>{if(ne.length===0)return 0;let e=0;for(let n of await r.jobs(ne)){if(n.root&&n.root!==A)continue;let i=te[n.elementId];if(i&&i.then!==`fire`){if(i.then===`hold`){D.set(n.key,n),O.set(n.key,u());continue}let a=re.get(n.elementInstance)??0;if(a<(i.fail??0)){re.set(n.elementInstance,a+1),await r.fail(n,t(`app.testCases.failingOnPurpose`,{tried:a+1,total:i.fail}),Math.max(n.retries,1)),say(t(`app.testCases.log.failedOnPurpose`,{label:labelOf(n.elementId),tried:a+1,total:i.fail})),e+=1;continue}await answerJob(n,i.then===`error`?`error`:`complete`,i.variables??{},i.errorCode,i.errorMessage),e+=1;continue}let a=E.get(n.type);a?(await answerJob(n,a.kind,a.variables,a.errorCode,a.errorMessage),e+=1):(D.set(n.key,n),O.set(n.key,u()))}return e},report=e=>{for(let t of e.elements){let e=t.state===`ACTIVE`&&t.incident?`FAILED`:t.state;k.get(t.key)!==e&&(k.set(t.key,e),d({kind:`step`,testCase:a,elementId:t.elementId,state:e,mocked:T.has(t.elementId)}))}},busy=e=>{for(let n of e.elements){if(n.state!==`ACTIVE`||n.incident)continue;let e=C.get(n.elementId);if(!e)continue;let r=labelOf(n.elementId),i=e.job??e.external;if(i){if(parkedAt(n.elementId))continue;return w.jobTypes.has(i)||w.elements.has(n.elementId)?t(`app.testCases.waiting.jobNotHandedOut`,{label:r,seconds:f}):t(`app.testCases.waiting.noWorkerTook`,{type:i,seconds:f})}if(e.event===`timer`&&te[n.elementId]?.then===`fire`)return t(`app.testCases.waiting.timerDidNotFire`,{label:r,seconds:f});if((e.delegateClass||e.delegateExpression||e.expression)&&(e.asyncBefore||e.asyncAfter))return t(`app.testCases.waiting.engineDidNotRun`,{label:r,seconds:f})}return null},settle=async e=>{let n=u(),i=``,a=0,d=e===void 0;for(;;){stopIfAsked();let p=await answerJobs(),m=null;try{m=await r.snapshot(A)}catch(e){if(!(e instanceof M&&e.status===404))throw e}if(m){N=m;let t=m.elements.filter(e=>e.state===`COMPLETED`&&k.get(e.key)!==`COMPLETED`).map(e=>e.key);v.push({at:new Date().toISOString(),variables:m.variables,completed:t}),report(m);let r=fingerprint(m);r!==e&&(d=!0),p>0||r!==i||!d?(a=0,i=r):a+=1;let s=m.state===`ACTIVE`?busy(m):null;if(a>=c-1&&!s)return m;if(u()-n>o){if(s)throw new RunFailure(s);return m}}else if(u()-n>o)throw new RunFailure(t(`app.testCases.waiting.instanceNotShown`,{seconds:f}));await l(s)}},until=async(e,t,r)=>{let i=u();for(;;){stopIfAsked(),await answerJobs();let a=await e();if(a!==null)return a;let c=n.onWait?[...D.values()].find(e=>e.elementId!==r):void 0;if(c)await ask(heldWait(c)),i=u();else{if(u()-i>o)throw new RunFailure(t);await refreshLocks(!1),await l(s)}}},heldWait=e=>{let t=C.get(e.elementId);return{kind:`job`,elementId:e.elementId,jobType:t?.job??t?.external??e.type,variables:e.variables}},printOf=()=>N?fingerprint(N):void 0,activeAt=e=>e.elements.filter(e=>e.state===`ACTIVE`).map(e=>labelOf(e.elementId)),inDiagram=e=>{let n=[...new Set(e)].filter(e=>!C.has(e));if(n.length)throw new RunFailure(t(`app.testCases.notInDiagram`,{ids:n.join(`, `),count:n.length}))},resolve=e=>{if(e.elementId)return e.elementId;if(e.elementName!==void 0){for(let[t,n]of C)if(n.name===e.elementName)return t}throw new RunFailure(t(`app.testCases.noElementNamed`,{name:e.elementName??t(`app.testCases.unknownName`)}))},parkedFor=e=>{if(e.elementId)return parkedAt(e.elementId);let t=e.jobType?w.jobTypes.get(e.jobType):void 0;for(let e of D.values())if(e.type===t)return e;return null},correlate=async(e,n,i)=>{let a=printOf();return await until(async()=>{try{return await r.correlate(e,n,A,i),!0}catch(e){if(e instanceof M&&e.status===404)return null;throw e}},t(`app.testCases.waiting.messageFoundNothing`,{message:e,seconds:f})),say(t(`app.testCases.log.correlated`,{message:e})),settle(a)},ask=async e=>{let i=n.onWait;d({kind:`waiting`,testCase:a,wait:e});let o=setInterval(()=>void refreshLocks(!0),n.keepAliveMs??an),s=await i(e).finally(()=>clearInterval(o));if(stopIfAsked(),s.kind===`stop`)throw new Stopped;let c=printOf(),l=s.variables;if(e.kind===`job`){let t=parkedAt(e.elementId);return D.delete(t.key),s.kind===`error`?(await answerJob(t,`error`,l,s.errorCode,s.errorMessage),g.push({type:`THROW_BPMN_ERROR_FROM_JOB`,jobSelector:{elementId:e.elementId},errorCode:s.errorCode,...s.errorMessage?{errorMessage:s.errorMessage}:{},variables:l})):(await answerJob(t,`complete`,l),g.push({type:`COMPLETE_JOB`,jobSelector:{elementId:e.elementId},variables:l})),settle(c)}if(e.kind===`userTask`){let n=(await r.userTasks(A)).find(t=>t.elementId===e.elementId);return n?(await r.completeTask(n,l),say(t(`app.testCases.log.completed`,{label:labelOf(e.elementId)})),g.push({type:`COMPLETE_USER_TASK`,userTaskSelector:{elementId:e.elementId},variables:l}),settle(c)):settle()}if(e.kind===`message`){let t=correlationKeyOf(C.get(e.elementId),N?.variables??{});return g.push({type:`CORRELATE_MESSAGE`,name:e.name,...t===void 0?{}:{correlationKey:t},variables:l}),correlate(e.name,t,l)}return await r.signal(e.name,l),g.push({type:`BROADCAST_SIGNAL`,signalName:e.name,variables:l}),settle(c)},nextWait=async e=>{for(let t of e.elements){if(t.state!==`ACTIVE`)continue;let e=C.get(t.elementId),n=parkedAt(t.elementId);if(n)return heldWait(n);if(e?.type===`bpmn:UserTask`&&(await r.userTasks(A)).some(e=>e.elementId===t.elementId))return{kind:`userTask`,elementId:t.elementId,name:e.name??null};if(e?.event===`message`&&e.message)return{kind:`message`,elementId:t.elementId,name:e.message};if(e?.event===`signal`&&e.signal)return{kind:`signal`,elementId:t.elementId,name:e.signal}}return null},check=(e,n)=>{let instancesOf=e=>n.elements.filter(t=>t.elementId===e),r=n.state===`ACTIVE`&&activeAt(n).length?t(`app.testCases.whereAt`,{elements:activeAt(n).join(`, `)}):``;switch(e.type){case`ASSERT_PROCESS_INSTANCE`:{let i=e.state&&e.state!==`IS_CREATED`?{IS_COMPLETED:`COMPLETED`,IS_ACTIVE:`ACTIVE`,IS_TERMINATED:`TERMINATED`}[e.state]:null;if(i&&n.state!==i)throw new Mismatch(t(`app.testCases.mismatch.instanceState`,{expected:i.toLowerCase(),actual:n.state.toLowerCase(),where:r}),{expected:i.toLowerCase(),actual:n.state.toLowerCase()});if(e.hasActiveIncidents!==void 0&&e.hasActiveIncidents!==n.incidents.length>0)throw new Mismatch(e.hasActiveIncidents?t(`app.testCases.mismatch.incidentExpected`):t(`app.testCases.mismatch.incidentUnexpected`,{elements:n.incidents.map(e=>labelOf(e.elementId)).join(`, `)}));return}case`ASSERT_ELEMENT_INSTANCES`:{let i=e.elementSelectors.map(resolve);inDiagram(i);let has=(e,t)=>instancesOf(e).some(e=>e.state===t),failing=(e,t)=>{let n=i.filter(e);if(n.length)throw new Mismatch(`${n.map(labelOf).join(`, `)} ${t}${r}`)};if(e.state===`IS_ACTIVE`&&failing(e=>!has(e,`ACTIVE`),t(`app.testCases.mismatch.isNotActive`)),(e.state===`IS_COMPLETED`||e.state===`IS_COMPLETED_IN_ORDER`)&&failing(e=>!has(e,`COMPLETED`),t(`app.testCases.mismatch.hasNotCompleted`)),e.state===`IS_TERMINATED`&&failing(e=>!has(e,`TERMINATED`),t(`app.testCases.mismatch.wasNotTerminated`)),e.state===`IS_NOT_ACTIVE`&&failing(e=>has(e,`ACTIVE`),t(`app.testCases.mismatch.isActive`)),e.state===`IS_NOT_ACTIVATED`&&failing(e=>instancesOf(e).length>0,t(`app.testCases.mismatch.wasReached`)),e.state===`IS_ACTIVE_EXACTLY`){let e=[...new Set(n.elements.filter(e=>e.state===`ACTIVE`).map(e=>e.elementId))].sort();if(json(e)!==json([...new Set(i)].sort()))throw new Mismatch(t(`app.testCases.mismatch.activeExactly`,{active:e.map(labelOf).join(`, `)||t(`app.testCases.nothing`),expected:i.map(labelOf).join(`, `)}))}if(e.state===`IS_COMPLETED_IN_ORDER`){let e=new Set,r=i.map(t=>{let r=n.elements.findIndex((n,r)=>!e.has(r)&&n.elementId===t&&n.state===`COMPLETED`);return e.add(r),{id:t,at:Date.parse(n.elements[r]?.endedAt??``)||0,index:r}}).sort((e,t)=>e.at-t.at||e.index-t.index).map(e=>e.id);if(json(r)!==json(i))throw new Mismatch(t(`app.testCases.mismatch.completedInOrder`,{order:r.map(labelOf).join(`, `),expected:i.map(labelOf).join(`, `)}))}return}case`ASSERT_ELEMENT_INSTANCE`:{let n=resolve(e.elementSelector);inDiagram([n]);let i=e.state.replace(`IS_`,``),a=instancesOf(n).filter(e=>e.state===i).length;if(e.amount===void 0?a===0:a!==e.amount)throw new Mismatch(t(`app.testCases.mismatch.instanceCount`,{label:labelOf(n),count:t(`app.testCases.count.instances`,{count:a,state:i.toLowerCase()}),expected:e.amount??t(`app.testCases.one`),where:r}));return}case`ASSERT_VARIABLES`:{let r=n.variables;if(e.elementSelector){let t=resolve(e.elementSelector);r=Object.assign({},...instancesOf(t).map(e=>n.local.get(e.key)??{}))}let i=[],a=[];for(let n of e.variableNames??[])n in r||i.push(t(`app.testCases.mismatch.variableNotSet`,{name:n}));for(let[n,o]of Object.entries(e.variables??{}))n in r?sameValue(r[n],o)||(i.push(t(`app.testCases.mismatch.variableValue`,{name:n,actual:json(r[n]),expected:json(o)})),a.push({expected:json(o),actual:json(r[n])})):i.push(t(`app.testCases.mismatch.variableNotSet`,{name:n}));if(i.length)throw new Mismatch(i.join(`; `),i.length===1&&a.length===1?a[0]:void 0);return}case`ASSERT_USER_TASK`:{let n=e.userTaskSelector,i=resolve(n.elementId?{elementId:n.elementId}:{elementName:n.taskName});if(inDiagram([i]),e.elementId!==void 0&&e.elementId!==i)throw new RunFailure(t(`app.testCases.elementIdMismatch`,{label:labelOf(i),actual:i,expected:e.elementId}));let a=instancesOf(i);if(e.state===`IS_CREATED`&&!a.some(e=>e.state===`ACTIVE`))throw new Mismatch(t(`app.testCases.mismatch.notWaitingForAUser`,{label:labelOf(i),where:r}));if(e.state===`IS_COMPLETED`&&!a.some(e=>e.state===`COMPLETED`))throw new Mismatch(t(`app.testCases.mismatch.userTaskNotCompleted`,{label:labelOf(i),where:r}));if(e.state===`IS_CANCELED`&&!a.some(e=>e.state===`TERMINATED`))throw new Mismatch(t(`app.testCases.mismatch.wasNotCanceled`,{label:labelOf(i),where:r}));if(e.state===`IS_FAILED`&&!a.some(e=>e.incident))throw new Mismatch(t(`app.testCases.mismatch.hasNotFailed`,{label:labelOf(i),where:r}));if(e.state===void 0&&a.length===0)throw new Mismatch(t(`app.testCases.mismatch.wasNotReached`,{label:labelOf(i),where:r}));return}default:throw new RunFailure(t(`app.testCases.unrunnable.notYet`,{type:e.type}))}},read=async()=>{try{let e=await r.snapshot(A);return N=e,report(e),e}catch(e){if(e instanceof M&&e.status===404)return N;throw e}},holds=async(e,t)=>{let n=u(),r=Math.min(tn,o/4),i=t,a=null,d=fingerprint(i),f=0;for(;;){try{return check(e,i),i}catch(e){if(!(e instanceof Mismatch)||u()-n>o)throw e;if(i.state===`ACTIVE`)a=null,f=0;else if(a??=u(),f>=c&&u()-a>=r)throw e}stopIfAsked(),await l(s),await answerJobs(),i=await read();let t=fingerprint(i);t===d?f+=1:(d=t,f=0,a=i.state===`ACTIVE`?null:u())}},removeBuild=async e=>{for(let t=1;;t+=1)try{await r.remove(e);return}catch(e){if(!(e instanceof M&&(e.status===409||e.status===400))||t>=rn)throw e;await l(s)}},ie=null,P,F=`passed`,I;try{let a=await r.deploy(w.resources,`penstock-test ${i}`);if(!a.ok)throw new RunFailure(a.message);j=a.deployment;let o=u();await n.builds?.add({deployment:j,at:o}),say(t(`app.testCases.log.deployedTheBuild`));let s=S;A=await r.start(w.processes.get(s.processDefinitionSelector.processDefinitionId)??s.processDefinitionSelector.processDefinitionId,s.variables??{},i,s.startInstructions?.map(e=>e.elementId)),await n.builds?.add({deployment:j,at:o,instance:A}),say(t(`app.testCases.log.startedInstance`,{instance:A}));let c=await settle();for(let n of e.instructions.slice(x+1)){stopIfAsked();let e=n;switch(e.type){case`MOCK_JOB_WORKER_COMPLETE_JOB`:case`MOCK_JOB_WORKER_THROW_BPMN_ERROR`:break;case`COMPLETE_JOB`:case`THROW_BPMN_ERROR_FROM_JOB`:{let n=e.jobSelector,r=await until(async()=>parkedFor(n),t(`app.testCases.waiting.noJobAt`,{where:n.elementId?labelOf(n.elementId):n.jobType,seconds:f}),n.elementId);D.delete(r.key);let i=printOf();e.type===`THROW_BPMN_ERROR_FROM_JOB`?await answerJob(r,`error`,e.variables??{},e.errorCode,e.errorMessage):await answerJob(r,`complete`,e.variables??{}),c=await settle(i);break}case`COMPLETE_USER_TASK`:{let n=e.userTaskSelector,i=await until(async()=>(await r.userTasks(A)).find(e=>n.elementId?e.elementId===n.elementId:e.name===n.taskName)??null,t(`app.testCases.waiting.noUserTaskAt`,{where:n.elementId?labelOf(n.elementId):n.taskName,seconds:f})),a=printOf();await r.completeTask(i,e.variables??{}),say(t(`app.testCases.log.completed`,{label:labelOf(i.elementId)})),c=await settle(a);break}case`CORRELATE_MESSAGE`:case`PUBLISH_MESSAGE`:c=await correlate(e.name,e.correlationKey,e.variables??{});break;case`BROADCAST_SIGNAL`:{let n=printOf();await r.signal(e.signalName,e.variables??{}),say(t(`app.testCases.log.broadcast`,{signal:e.signalName})),c=await settle(n);break}case`UPDATE_VARIABLES`:{let n=e.elementSelector?c.elements.find(t=>t.elementId===resolve(e.elementSelector)&&t.state===`ACTIVE`)?.key:void 0;if(e.elementSelector&&!n)throw new RunFailure(t(`app.testCases.notActiveSoNoVariables`,{label:labelOf(resolve(e.elementSelector))}));let i=printOf();await r.setVariables(A,e.variables,n),c=await settle(i);break}default:if(sn.has(e.type))throw new RunFailure(t(`app.testCases.unrunnable.notYet`,{type:e.type}));c=await holds(e,c)}}for(;n.onWait&&c.state===`ACTIVE`;){let e=await nextWait(c);if(!e)break;c=await ask(e)}}catch(e){e instanceof Stopped?(F=`skipped`,I=`stopped`):(F=`failed`,I=e instanceof Error?e.message:String(e),e instanceof Mismatch&&(P=e.comparison),!(e instanceof RunFailure)&&!(e instanceof M)&&(I=t(`app.testCases.penstockFailed`,{reason:I})))}finally{if(A){try{ie=await readTrace(r.kind,r.ask,A,{runId:i,testCase:a,mocked:T,mockCalls:_,snapshots:v,log:h})}catch(e){say(t(`app.testCases.log.couldNotReadTheTrace`,{reason:e instanceof Error?e.message:String(e)}),!0)}let e=N?.state;e!==`COMPLETED`&&e!==`TERMINATED`&&await r.cancel(A).catch(e=>say(t(`app.testCases.log.couldNotCancel`,{reason:e instanceof Error?e.message:String(e)}),!0))}j&&await removeBuild(j).then(()=>n.builds?.drop(j)).catch(e=>say(t(`app.testCases.log.couldNotRemoveTheBuild`,{reason:e instanceof Error?e.message:String(e)}),!0))}return finish(F,I,ie,P)}var ln=new Map;function formatter(e,t){let n=`${e}:${t}`,r=ln.get(n);if(!r){try{r=new Intl.ListFormat(e,{style:`long`,type:t})}catch{r=new Intl.ListFormat(`en`,{style:`long`,type:t})}ln.set(n,r)}return r}function listOf$1(e,t=`conjunction`){return e.length>0?formatter(n(),t).format(e):``}e(listOf$1,`listOf`);var error=(e,t,n)=>({title:e,severity:`error`,why:t,fix:n}),warning=(e,t,n)=>({title:e,severity:`warning`,why:t,fix:n}),off=(e,t,n)=>({title:e,severity:`off`,why:t,fix:n}),un={"DANGLING-CONNECTION":error(`Connection without both ends`,`A connection that starts or ends on nothing is drawn but connects nothing, so the picture and the process disagree.`,`Reconnect both ends of the connection to a shape, or delete it.`),"LOST-CONNECTION":error(`Connection in the file but not on the canvas`,`The file describes a connection that the editor did not draw, so it is invisible and cannot be selected.`,`Connect the two elements again on the canvas; the stray connection is dropped when the file is saved.`),CONTAINMENT:error(`Element outside the container it belongs to`,`An element that belongs to a pool, lane or sub-process but is drawn beyond its edge reads as belonging to something else.`,`Drag the element back inside its container, or enlarge the container.`),OVERLAP:error(`Shapes sit on top of each other`,`Shapes drawn over each other hide one another, and the one underneath cannot be selected.`,`Move one of the shapes, or lay the diagram out again.`),"EDGE-THROUGH-NODE":error(`Connection runs through a shape`,`A connection drawn through a shape it does not touch looks like it connects to that shape.`,`Move a bend of the connection, or the shape, so the line goes around.`),"EDGE-THROUGH-BOUNDARY":error(`Connection runs through a boundary event`,`A connection drawn through a boundary event it does not start or end at looks like it leaves the task through that event.`,`Move the boundary event along the border of its task, away from where the connection meets the task.`),CROSSING:warning(`Connections cross`,`Every crossing is a place where the eye can follow the wrong line.`,`Move a shape so fewer connections have to cross, or lay the diagram out again.`),"DETACHED-EDGE":error(`Connection does not reach the shape it connects`,`A connection that stops short of its shape looks unfinished and does not move with the shape.`,`Drag the loose end of the connection onto the shape.`),"BOUNDARY-OFF-HOST":error(`Boundary event is off its host`,`A boundary event that is not on the border of the task it is attached to looks like a free-standing event.`,`Drag the boundary event back onto the border of its task.`),"LABEL-ADRIFT":warning(`Label sits far from what it names`,`A label far from its element is read as the label of something nearer.`,`Drag the label next to its element.`),"DIAGONAL-EDGE":warning(`Connection is not drawn at right angles`,`A BPMN diagram reads as horizontal and vertical lines; a slanted one stands out as a mistake.`,`Straighten the segment, or lay the diagram out again.`),"LABEL-OVERLAP":error(`Labels cover each other`,`Overlapping labels cannot be read.`,`Drag one of the labels aside.`),"MERGED-EDGE":warning(`Connections run along the same line`,`Two connections drawn on top of each other read as one, so a reader loses one of them.`,`Move one of the connections a few pixels aside, or lay the diagram out again.`),"NOTE-ADRIFT":warning(`Annotation sits far from what it describes`,`An annotation far from its element is hard to tie to it.`,`Drag the annotation next to the element it describes.`),"SEMANTIC-DRIFT":error(`The diagram means something different`,`Laying out must move things and change nothing else; an element with a different parent, source or target is a different process.`,`Undo the change and report it: no layout should ever do this.`),BACKTRACK:error(`Connection doubles back along itself`,`A line that overshoots and returns along itself reads as one line and hides its own bend.`,`Delete the extra bend of the connection.`),"EDGE-THROUGH-LABEL":warning(`Connection crosses a label`,`A line through a label makes both harder to read.`,`Drag the label off the line.`),"EDGE-ALONG-SHAPE":warning(`Connection runs along the border of a shape`,`A line lying on the edge of a shape it does not belong to looks like part of that shape.`,`Move the run of the connection a few pixels away from the shape.`),DETOUR:warning(`Connection takes a long way round`,`A connection more than twice as long as the distance it covers makes the reader search for its end.`,`Move the shapes closer, or give the connection a shorter route.`),JOG:warning(`Connection sidesteps for no reason`,`A small sidestep between two parallel runs, with nothing in the way, looks like a slip of the hand.`,`Delete the two bends of the sidestep.`)},dn={DEADLOCK:error(`The process can get stuck`,`A token can reach a point where nothing can move it on, so the instance never ends and sits in the engine forever.`,`Follow the path shown in the finding and give the stuck join a way to continue, for example by joining only what was split.`),"NO-SYNCHRONIZATION":error(`A part of the process can run twice`,`Two paths that reach the same step without a joining gateway start it once for each, so the step runs twice.`,`Join the paths with a gateway of the matching kind before the step.`),"DEAD-ELEMENT":error(`An element can never run`,`No path from the start reaches the element, so whatever it does is dead weight in the diagram.`,`Connect it to a path that can reach it, or delete it.`),"NEVER-FINISHES":error(`The process may never finish`,`A loop with no way out keeps its instance alive until someone cancels it.`,`Give the loop an exit: a condition that ends it, or a flow that leaves it.`),"TOO-COMPLEX":warning(`Only part of the process was analysed`,`The process has too many states to check them all, so what the check says is true only of the part it reached.`,`Split the process into sub-processes or call activities so each can be checked whole.`),"NO-WAY-OUT":error(`A decision has no way out for some values`,`When no condition of a gateway holds and there is no default flow, the instance stops there with an incident.`,`Add a default flow, or a condition for the values named in the finding.`),OVERLAP:error(`Two ways out of a decision can both hold`,`When two conditions of an exclusive gateway can both be true the engine takes whichever it checks first, and which one that is depends on the order in the file.`,`Make the conditions exclusive, or turn one of them into the default flow.`),"NO-DEFAULT":warning(`A decision may have no way out`,`A gateway with conditions and no default flow stops the instance with an incident when none of them holds.`,`Mark one outgoing flow as the default.`),LOOKALIKE:warning(`Two variables look like one`,`Two variable names that differ by a letter or its case are usually one name spelled twice, and one of them never holds the value the other does.`,`Use one spelling everywhere, or make the names differ clearly.`)},fn={"RULE-OVERLAP":error(`Two rules match the same input`,`When the hit policy expects one match, two rules matching the same input make the decision fail or depend on their order.`,`Narrow one of the two rules so they no longer match the same input, or change the hit policy.`),"RULE-GAP":warning(`No rule matches some input`,`An input no rule matches gives the decision no result, and the process that asked for it stops.`,`Add a rule for the input named in the finding, or a catch-all rule at the end.`),"TABLE-UNREAD":warning(`A decision table could not be checked`,`A table with an expression the check cannot read is left out of it, so its problems are not found.`,`Simplify the expression in the cell named in the finding, or accept that this table is not checked.`)},pn={"KEY-CLASH":error(`Two fields write the same variable`,`Tasklist and the form editor refuse to open a form in which two fields, or a field and a group, use the same key.`,`Give each field its own key.`),"NO-KEY":error(`A field writes no variable`,`A field with no key is shown to the user, but what they enter is not passed to the process.`,`Give the field a key, the name of the process variable it should fill.`),"REPEATED-OPTION":error(`An option list repeats a value`,`Two choices with the same value submit the same thing, though the user can tell them apart.`,`Give every option its own value.`),"NO-LABEL":warning(`A field has no label`,`An input with no label leaves the user guessing what it is for.`,`Give the field a label.`)},mn={"ad-hoc-sub-process":error(`Ad-hoc sub-process with a start or end event`,`An ad-hoc sub-process has no defined start or end: its activities run when someone chooses, so an event marking either is meaningless.`,`Delete the start and end events inside the ad-hoc sub-process.`),"conditional-event":off(`Conditional event without a condition`,`A conditional event with no condition can never fire.`,`Give the event a condition expression.`),"conditional-flows":error(`Conditional flow without a condition`,`A flow that leaves a task or event marked as conditional but has no condition either always or never fires; the engine cannot tell.`,`Give the flow a condition, or make it an ordinary flow.`),"end-event-required":error(`Process or sub-process without an end event`,`Without an end event the reader cannot see where the process ends, and some engines refuse to run it.`,`Add an end event at the end of every path.`),"event-based-gateway":error(`Event-based gateway used wrongly`,`An event-based gateway waits for the first of several events, so it needs at least two ways out and none of them may be conditional.`,`Give the gateway two or more outgoing flows to events, and remove their conditions.`),"event-sub-process-typed-start-event":error(`Event sub-process start without an event`,`An event sub-process starts when its event happens, so a blank start event says nothing about when.`,`Give the start event a type: message, timer, error, signal or another.`),"fake-join":warning(`Several flows enter a task that does not join them`,`Only a gateway joins flows; several flows into a task start the task once for each token, which is rarely what the drawing suggests.`,`Join the flows with a gateway of the matching kind before the task.`),global:warning(`Global element without a name, unused or not unique`,`A message, signal or error that is unnamed, never used or named twice cannot be told apart from another.`,`Name the element, use it, or delete it.`),"label-required":error(`Element without a label`,`An unlabelled task, event or gateway tells the reader nothing about what happens there.`,`Give the element a name.`),"link-event":error(`Link event without a name or without its counterpart`,`A link throw event jumps to the link catch event of the same name in the same scope, so both need that name.`,`Name the link events and make each throw match one catch.`),"no-bpmndi":error(`Element without a place in the diagram`,`An element that is in the process but not on the canvas cannot be seen, selected or fixed in the editor.`,`Add the element to the diagram, or delete it from the file.`),"no-complex-gateway":error(`Complex gateway`,`A complex gateway holds logic that is written nowhere a reader can see, and few engines support it.`,`Replace it with exclusive, inclusive or parallel gateways.`),"no-disconnected":error(`Element with no incoming or outgoing flow`,`An element nothing leads to or from is either forgotten or dead.`,`Connect the element to the flow, or delete it.`),"no-duplicate-sequence-flows":error(`Two identical flows between the same elements`,`Two flows from the same source to the same target either do the same twice or say nothing the first one did not.`,`Delete the duplicate flow.`),"no-gateway-join-fork":error(`Gateway that joins and forks`,`A gateway that joins flows and forks again in one shape is read as one of the two, and the other is missed.`,`Split it into one gateway that joins and one that forks.`),"no-implicit-end":error(`Path that ends without an end event`,`A path that just stops leaves the reader to guess whether it was meant to.`,`Add an end event after the last element of the path.`),"no-implicit-split":error(`Task that forks the flow without a gateway`,`Several flows out of a task start all of them at once, or none of them, depending on conditions nobody can see.`,`Add a gateway after the task and fork there.`),"no-implicit-start":error(`Path that starts without a start event`,`An element with no incoming flow starts on its own, which is easy to mistake for a forgotten connection.`,`Add a start event before the element, or connect it to the path it belongs to.`),"no-inclusive-gateway":warning(`Inclusive gateway`,`An inclusive gateway can take any number of ways out, which is hard to read and easy to get wrong.`,`Use exclusive or parallel gateways, or keep it and check the conditions with care.`),"no-overlapping-elements":warning(`Element overlaps another or leaves its parent`,`Elements drawn over each other hide one another.`,`Move the elements apart, or lay the diagram out again.`),"single-blank-start-event":error(`More than one blank start event`,`Two blank start events mean two ways to start the same process with no way to tell them apart.`,`Keep one blank start event; give the others a type, or split the process.`),"single-event-definition":error(`Event with several event definitions`,`An event with several definitions is a multiple event, which few engines support and few readers expect.`,`Keep one event definition, or use one event for each.`),"standard-size":off(`Element not in its standard size`,`Elements of the standard size make a diagram look even.`,`Resize the element to the standard size of its type.`),"start-event-required":error(`Process or sub-process without a start event`,`Without a start event there is no way to start the process.`,`Add a start event.`),"sub-process-blank-start-event":error(`Sub-process start event with a type`,`A sub-process starts when the flow reaches it, so its start event has no event to wait for.`,`Make the start event blank.`),"superfluous-gateway":warning(`Gateway with one way in and one way out`,`A gateway with one flow in and one out does nothing but sit in the way.`,`Delete the gateway and connect its neighbours.`),"superfluous-label":warning(`Label on a flow that needs none`,`Only the flows out of a decision, the conditional flows and the default flow say something with a label; on any other it repeats the picture.`,`Delete the label.`),"superfluous-termination":warning(`Terminate end event that terminates nothing`,`A terminate end event outside a parallel path ends the same as an ordinary end event, and suggests something more.`,`Use an ordinary end event.`)},hn={"ad-hoc-sub-process":error(`Ad-hoc sub-process without an activity`,`An ad-hoc sub-process with nothing in it has nothing for the engine to run, so the instance can never complete it.`,`Add at least one activity to the ad-hoc sub-process, or delete it.`),"agent-fromai-contract":error(`fromAi() key that is not a plain name under toolCall`,`The agent fills a tool parameter through fromAi(toolCall.name); a key written any other way is not found, so the parameter stays empty.`,`Write the key as toolCall.name: a single name, with dots, and no quotes, brackets or arithmetic.`),"agent-tool-documentation":warning(`Tool of an AI agent without documentation`,`The agent picks its tools by their documentation, so a tool with none is hard to choose and easy to misuse.`,`Describe what the tool does in its documentation.`),"agent-tool-output-key":warning(`Tool of an AI agent that returns nothing to it`,`The agent only sees what a tool puts in toolCallResult; without it, or with another spelling or a second writer, the answer is lost.`,`Map the result to toolCallResult, spelled exactly like that, once.`),"before-all-execution-listener":error(`beforeAll listener outside a multi-instance element`,`A beforeAll execution listener runs before the instances of a multi-instance element are created, so on any other element it has nothing to run before.`,`Move the listener to a multi-instance element, or give it another event type.`),"element-type":error(`Element the engine version cannot run`,`Each version of Camunda supports a fixed set of elements, and one it does not know is skipped or refused when the process is deployed.`,`Replace the element with one the version supports, or raise the platform version of the diagram.`),"cancel-execution-listener":error(`cancel listener on an element that cannot be cancelled`,`A cancel execution listener runs when an element is terminated, which only some elements can be, so on the others it never fires.`,`Use the listener on an element that supports it, or give it another event type.`),"called-element":error(`Call activity without a process to call`,`A call activity that names no process id, or a wrong kind of expression, fails when the instance reaches it.`,`Set the called process id, a static one or a FEEL expression.`),"collapsed-subprocess":error(`Collapsed sub-process`,`This version of Camunda 8 cannot run a sub-process drawn collapsed on its own diagram, because it has no plane to read it from.`,`Expand the sub-process, or raise the platform version of the diagram.`),"connector-properties":warning(`Connector with a property this version does not have`,`A property of a connector that the engine version does not support yet is ignored, so the connector behaves differently than configured.`,`Remove the property, or raise the platform version of the diagram.`),"duplicate-execution-listener-headers":error(`Two headers of a listener with the same key`,`A listener that reads a header by its key gets one of the two values, and which one is not defined.`,`Give each header of the listener its own key.`),"duplicate-execution-listeners":error(`Two execution listeners that are the same`,`Two listeners with the same event type and job type run the same job twice.`,`Delete the duplicate listener.`),"duplicate-task-headers":error(`Two task headers with the same key`,`A worker that reads a header by its key gets one of the two values, and which one is not defined.`,`Give each task header its own key.`),"error-reference":error(`Error event without an error or an error code`,`An error event that refers to no error, or to one with no code, catches or throws nothing the engine can match.`,`Choose an error for the event and give the error a code.`),"escalation-boundary-event-attached-to-ref":error(`Escalation boundary event on the wrong element`,`Escalations are raised inside a sub-process or a call activity, so a boundary event on any other element never catches one.`,`Attach the escalation boundary event to a sub-process or call activity.`),"escalation-reference":error(`Escalation event without an escalation or a code`,`An escalation event that refers to no escalation, or to one without a code, catches or throws nothing the engine can match.`,`Choose an escalation for the event and give it an escalation code.`),"event-based-gateway-target":error(`Receive task after an event-based gateway`,`The engine does not accept a receive task as the target of an event-based gateway, so the process is refused when it is deployed.`,`Use a message intermediate catch event instead of the receive task.`),"executable-process":error(`No executable process`,`Camunda 8 only deploys processes marked executable, so a file in which none is has nothing to run.`,`Mark the process, or one of the pools, as executable.`),"execution-listener":error(`Execution listener without an event type or a job type`,`A listener needs to know when it runs and which worker handles it; without either the engine refuses it.`,`Set the event type and the job type of the listener.`),"feel-compatibility":error(`FEEL function the engine version does not have`,`A built-in function newer than the engine fails the expression at runtime with an incident.`,`Use a function the version has, or raise the platform version of the diagram.`),feel:error(`FEEL expression that is not valid`,`An expression the engine cannot parse fails as soon as the process reaches it, and stops the instance with an incident.`,`Correct the expression named in the finding; the editor of the field shows where it goes wrong.`),"history-time-to-live":warning(`Process without a history time to live`,`Without a time to live the engine keeps the history of every finished instance for ever unless it is set for the whole engine, and the database grows.`,`Set the history time to live of the process, for example P30D, or set it once for the engine.`),implementation:error(`Task or event that has nothing to run`,`A service task, business rule task, script task, send task or message event that names no job type, decision, script or message does nothing when reached.`,`Set what the element runs: a job type, a called decision, a script or a message name.`),"inclusive-gateway":error(`Inclusive gateway with more than one way in`,`Camunda 8 before 8.6 can take an inclusive gateway only as a fork, so one that also joins is refused.`,`Use one gateway to fork and another to join, or raise the platform version of the diagram.`),"link-event":error(`Link events that do not match`,`A link throw event jumps to the catch event with the same name in the same scope, so a name used twice or by no catch event leads nowhere.`,`Give every link catch event a unique name and let each throw event use one of them.`),"loop-characteristics":error(`Multi-instance without what it needs`,`A multi-instance element with no input collection, or with an output collection but no output element, has nothing to iterate over or to gather.`,`Set the input collection, and the output element when there is an output collection.`),"io-mapping":error(`Input or output mapping that is incomplete`,`A mapping needs both the source and the target it maps to; one without either is refused by the engine.`,`Fill in the source and the target of every input and output mapping.`),"message-reference":error(`Message event without a message or its name`,`A message event that refers to no message, or to one without a name, can never be correlated with anything.`,`Choose a message for the event and give the message a name.`),"no-binding-type":error(`Binding type that this version does not have`,`A called process, decision or form bound to anything but the latest version needs Camunda 8.6 or newer; on an older one the binding is ignored.`,`Bind to the latest version, or raise the platform version of the diagram.`),"no-business-id":error(`Business id that this version does not have`,`A business id on a call activity needs Camunda 8.10 or newer; on an older version it is ignored.`,`Remove the business id, or raise the platform version of the diagram.`),"no-before-all-execution-listener":error(`beforeAll listener that this version does not have`,`The beforeAll event type of an execution listener needs Camunda 8.10 or newer.`,`Use another event type, or raise the platform version of the diagram.`),"no-candidate-users":error(`Candidate users that this version does not have`,`Candidate users on a user task need Camunda 8.2 or newer; on an older version they are ignored.`,`Remove the candidate users, or raise the platform version of the diagram.`),"no-cancel-execution-listener":error(`cancel listener that this version does not have`,`The cancel event type of an execution listener needs Camunda 8.10 or newer.`,`Use another event type, or raise the platform version of the diagram.`),"no-execution-listener-headers":error(`Listener headers that this version does not have`,`Task headers on an execution listener are not supported by this version of Camunda 8 and are ignored.`,`Remove the headers, or raise the platform version of the diagram.`),"no-execution-listeners":error(`Execution listeners that this version does not have`,`Execution listeners need Camunda 8.6 or newer; on an older version they are ignored.`,`Remove the listeners, or raise the platform version of the diagram.`),"no-expression":error(`Expression this version does not support`,`A FEEL expression in a property the engine version reads only as a fixed value is taken as text, not evaluated.`,`Write a static value, or raise the platform version of the diagram.`),"no-interrupting-event-subprocess":error(`Interrupting event sub-process in an ad-hoc sub-process`,`An event sub-process inside an ad-hoc sub-process cannot interrupt it, so an interrupting start event is refused.`,`Make the start event of the event sub-process non-interrupting.`),"no-job-priority-definition":error(`Job priority that this version does not have`,`A job priority needs Camunda 8.10 or newer; on an older version it is ignored.`,`Remove the job priority, or raise the platform version of the diagram.`),"no-loop":error(`Loop that never waits`,`A cycle made only of tasks and gateways that run at once never waits for anything, so the instance spins in it and never stops.`,`Put an element that waits into the loop, such as a user task or a timer, or give it a gateway condition that leaves it.`),"no-multiple-none-start-events":error(`More than one blank start event`,`Camunda 8 accepts only one blank start event in a process, so a second one makes the deployment fail.`,`Keep one blank start event and give the others an event type, or split the process.`),"no-priority-definition":error(`Priority that this version does not have`,`A priority on a user task needs Camunda 8.6 or newer; on an older version it is ignored.`,`Remove the priority, or raise the platform version of the diagram.`),"no-propagate-all-parent-variables":error(`Propagate all parent variables that this version does not have`,`Turning off the propagation of the parent variables of a call activity needs Camunda 8.2 or newer.`,`Keep propagation on, or raise the platform version of the diagram.`),"no-signal-event-sub-process":error(`Signal event sub-process that this version does not have`,`A signal start event in an event sub-process needs a newer version of Camunda 8 than the diagram declares.`,`Use another kind of start event, or raise the platform version of the diagram.`),"no-task-schedule":error(`Task schedule that this version does not have`,`A due date or follow-up date on a user task needs Camunda 8.2 or newer; on an older version it is ignored.`,`Remove the dates, or raise the platform version of the diagram.`),"no-task-listeners":error(`Task listeners that this version does not have`,`Task listeners on a user task need Camunda 8.8 or newer; on an older version they are ignored.`,`Remove the task listeners, or raise the platform version of the diagram.`),"no-template":error(`Element template that this version does not have`,`Element templates need Camunda 8.0 or newer; on an older version the properties they set are ignored.`,`Remove the template, or raise the platform version of the diagram.`),"no-version-tag":error(`Version tag that this version does not have`,`A version tag needs Camunda 8.6 or newer; on an older version it is ignored.`,`Remove the version tag, or raise the platform version of the diagram.`),"no-zeebe-properties":error(`Zeebe properties that this version does not have`,`Custom zeebe:properties need Camunda 8.1 or newer; on an older version they are dropped when the process is deployed.`,`Remove the properties, or raise the platform version of the diagram.`),"no-zeebe-user-task":error(`Camunda user task that this version does not have`,`A user task implemented by Camunda itself needs Camunda 8.5 or newer.`,`Use a job worker user task, or raise the platform version of the diagram.`),"priority-definition":error(`User task priority that is not valid`,`The priority of a user task has to be a whole number from 0 to 100, or an expression; anything else is refused.`,`Write the priority as a number from 0 to 100, or as an expression.`),"zeebe-user-task":warning(`Job worker user task`,`A user task run by a job worker is the deprecated way; a Camunda user task is the supported one from this version on.`,`Switch the user task to the Camunda user task implementation.`),secrets:warning(`Secret written in a form the engine no longer reads`,`A secret referenced as {{secrets.NAME}} or in the old connector syntax is deprecated and is dropped in a later version.`,`Write the secret as a FEEL expression, camunda.secrets.NAME.`),"sequence-flow-condition":error(`Condition on a flow that cannot have one`,`Only the flows that leave an exclusive or an inclusive gateway are conditional; on any other flow the condition is refused.`,`Delete the condition, or draw a gateway in front of the flow.`),"signal-reference":error(`Signal event without a signal or its name`,`A signal event that refers to no signal, or to one without a name, can never be raised or caught.`,`Choose a signal for the event and give the signal a name.`),"start-event-form":error(`Start event form that this version cannot show`,`Before Camunda 8.3 a start event has no form, and from 8.3 the form needs a form id or a linked form that exists.`,`Set the form id or the form key of the start event, or raise the platform version of the diagram.`),"start-event-form-embedded":warning(`Embedded form on a start event`,`Embedded forms on a start event are deprecated in this version and stop working in a later one.`,`Move the form to a .form file and link it from the start event.`),subscription:error(`Message without a correlation key`,`A message that a process waits for needs a correlation key, or the engine cannot tell which instance it is meant for.`,`Set the correlation key of the message subscription, usually a FEEL expression.`),"task-listener":error(`Task listener without an event type or a job type`,`A task listener needs to know when it runs and which worker handles it; without either the engine refuses it.`,`Set the event type and the job type of the listener.`),"task-schedule":error(`Task schedule that is not a date`,`The due date and the follow-up date of a user task have to be an ISO 8601 date, or an expression that gives one.`,`Write the date in ISO 8601, or use an expression.`),timer:error(`Timer that is not valid`,`A timer with a date, duration or cycle the engine cannot read fails when the process is deployed or reached.`,`Write the timer as an ISO 8601 date, duration or cycle, or as an expression.`),"timer-past-date":warning(`Start timer set in the past`,`A timer start event whose date, or whose cycle start, is already past fires right after deployment, and a cycle then runs from the deployment time.`,`Use a future date, or a cron expression to run on a fixed schedule.`),"unresolvable-secret-reference":error(`Secret used in a way the engine cannot resolve`,`A secret can only be read as an expression; written as a plain string, in a list or in a branch of an if it is never replaced.`,`Use =camunda.secrets.NAME directly as the value of the property.`),"user-task-definition":warning(`User task without a form`,`A user task with no form opens in Tasklist with nothing for the person to read or fill in.`,`Link a form to the user task, or accept a task without one.`),"user-task-form":error(`User task form that is not filled in`,`A form on a user task needs the form id, or the linked form, in the form the chosen binding expects; without it the task opens with no form.`,`Set the form id, or the form key, the way its binding says.`),"variable-name":error(`Variable name that is not valid`,`A name that starts with a digit or holds a space or a dash cannot be used in a FEEL expression, so it can never be read again.`,`Use a name of letters, digits and underscores that does not start with a digit.`),"version-tag":error(`Version tag that is empty`,`A version tag that is set with no value, or a binding to a version tag with none, gives the engine nothing to look up.`,`Give the version tag a value, or choose another binding.`),"wait-for-completion":error(`Compensation that does not wait`,`A compensation throw event that does not wait for completion is not supported by Camunda 8, which always waits.`,`Turn on waiting for completion of the compensation event.`)},gn={"missing-implementation":warning(`Nothing in the code runs a step`,`A service task, send task or listener that names a job type, topic, class or bean nothing implements waits for a worker that does not exist.`,`Write the worker, delegate or bean, or correct the name in the diagram.`),"never-thrown":warning(`Nothing in the code throws the error a step catches`,`An error boundary or error event catches a code that no BpmnError or error command in the project throws, so it never fires.`,`Throw the error code from the worker, or correct the code on the event.`),"variable-typo":warning(`A variable is read, but only a similar one is set`,`A read of a name that is never written, when a name a letter away is, is almost always a typo, and the read gives nothing.`,`Use the spelling that is set.`),"worker-fetch":warning(`A worker reads a variable it does not fetch`,`A Camunda 8 worker is given only the variables it asks for, so a name its code reads but its fetch list leaves out is null at runtime, and a name a fetch list holds under a different spelling is null as well.`,`Add the variable to the worker's fetchVariables, or use the name it fetches.`),"writer-unread":warning(`A worker sets a variable no step after it reads`,`A variable the worker writes and nothing downstream reads is written for nothing; often the name is not the one the next step looks for.`,`Read it in a later step, or drop it from the worker.`),"lost-update":warning(`Every parallel instance writes the same result collection`,`A parallel multi-instance step that sets an output collection without an output element has each instance write the same collection, so only the last one that finishes is left.`,`Set an output element, or collect the results in one instance after the join.`),"late-read":warning(`A worker reads a variable no step before it sets`,`The worker is handed only the variables the process set before it, so a name it reads that nothing set before it is null at runtime.`,`Set the variable in an earlier step, or drop it from the worker.`),"near-name":warning(`A job type, topic, bean, message or error code is one letter off the code`,`A name that does not match the one in the code leaves the step with nothing running it, and a name that differs only in case is the same trap with a quieter error.`,`Use the name the code has, or rename the worker to the one the diagram uses.`),"mapping-order":warning(`A mapping line reads a value an earlier line was meant to set`,`The engine evaluates the source of every mapping line before it writes any target, so a later line that reads what an earlier one sets gets null - camunda#11789.`,`Move the value into the earlier line, or compute both from the same source.`),"implicit-job-type":warning(`A job worker takes its job type from the method name`,`A @JobWorker without a type answers to its method name, so renaming the method changes the contract with the diagram without anything saying so.`,`Name the type in the annotation, so the method can be renamed freely.`),"no-worker":error(`No worker handles a job type`,`A Camunda 8 service task creates a job that waits for a worker with its job type; with none, the instance waits forever.`,`Write a worker for the job type, or correct the job type in the diagram.`),"no-topic-worker":error(`No external task worker subscribes to a topic`,`A Camunda 7 external task waits for a client that subscribes to its topic; with none, the instance waits forever.`,`Subscribe a worker to the topic, or correct the topic in the diagram.`),"class-missing":error(`A class named in the diagram is not in the project`,`A delegate or listener class the engine cannot load fails the instance at that step.`,`Add the class, or correct the class name in the diagram.`),"bean-missing":error(`No Spring bean has the name a diagram uses`,`A delegate expression naming a bean that does not exist fails the instance at that step.`,`Name the bean the diagram uses, or correct the expression.`),"unknown-process":error(`A call activity calls a process no diagram defines`,`A call to a process that is not deployed fails the instance at the call.`,`Add the called process to the project, or correct the id of the call.`),"unknown-decision":error(`A business rule task calls a decision no file defines`,`A call to a decision that is not deployed fails the instance at the task.`,`Add the decision to the project, or correct its id in the task.`),"unknown-form":error(`A user task shows a form no file defines`,`A user task that refers to a form that is not deployed opens with no form.`,`Add the .form file, or correct the form id in the task.`),"unknown-embedded-form":error(`A user task shows an embedded form the diagram does not contain`,`A user task that refers to an embedded form that is not in the diagram opens with no form.`,`Add the form to the diagram, or correct the reference.`),"unused-worker":warning(`A worker for a job type no diagram uses`,`A worker that nothing calls is code to keep for nothing, and hides that a diagram lost its step.`,`Delete the worker, or add the step that uses its job type.`),"unused-subscription":warning(`A subscription to a topic no diagram uses`,`A subscription nothing feeds is code to keep for nothing, and hides that a diagram lost its step.`,`Delete the subscription, or add the step that uses its topic.`),"variable-field":warning(`A step reads a field the variable does not have`,`A field the type of a variable does not have is null at runtime, and a misspelt field name is the usual cause. Only a variable whose type is known from the code that sets it is checked, so a field of a type the project does not declare is never reported.`,`Use a field the type has, or correct the name; a field the code adds later is named in its class.`),"variable-unknown":warning(`A step reads a variable nothing sets`,`A name no step of the diagram or the code sets, and that the process is not declared to start with under variables.inputs, is null unless something outside starts the process with it.`,`Set the variable in an earlier step, declare it under variables.inputs in penstock.yaml, or correct the name.`)},_n={"id-from-name":off(`Ids follow names`,`Ids that read as names make diffs, logs, test cases and worker code readable, and stay right when a step is renamed.`,"Set `conventions.ids.fromName: true` in `penstock.yaml`; `conventions.ids.pattern` shapes the id, `{Type}_{Name}` by default."),defaults:off(`Defaults for new elements`,`Attributes every service task or data input of a project needs, set once, are never forgotten on one of them.`,"Set them under `conventions.defaults` in `penstock.yaml`, keyed by BPMN type such as `bpmn:ServiceTask`.")};function definitions(e,t,n){return Object.entries(t).map(([t,r])=>({...r,id:`${e}/${n(t)}`,family:e,name:e===`bpmnlint`?`bpmnlint/${t}`:e===`compat`?`compat/${t}`:t}))}var lower=e=>e.toLowerCase(),vn=[...definitions(`bpmnlint`,mn,e=>e),...definitions(`compat`,hn,e=>e),...definitions(`drawing`,un,lower),...definitions(`flow`,dn,lower),...definitions(`table`,fn,lower),...definitions(`form`,pn,lower),...definitions(`code`,gn,e=>e),...definitions(`convention`,_n,e=>e)],yn=`https://kern0x1b.github.io/penstock-release/`,bn=`${yn}rules`;function ruleSlug(e){return e.replace(`/`,`-`)}function ruleUrl(e){return`${bn}/${ruleSlug(e)}`}function ruleFor(e,t){let n=`${e}/${t.toLowerCase().replace(/^(?:bpmnlint|camunda-compat|compat)\//,``)}`;return vn.find(e=>e.id===n)}function kindName$1(e){let n=e.includes(`:`)?e.slice(e.indexOf(`:`)+1):e,r=`app.element.kind.${n.charAt(0).toLowerCase()}${n.slice(1)}`,i=t(r,{count:1});return i===r?n.toLowerCase():i}e(kindName$1,`kindName`);function ruleText(e,n,r){let i=ruleFor(e,n);return i?t(`app.rules.${i.id}.${r}`):n}function ruleTitle(e,t){return ruleText(e,t,`title`)}function ruleWhy(e,t){return ruleText(e,t,`why`)}function ruleFix(e,t){return ruleText(e,t,`fix`)}var xn=new Set(`and.or.not.true.false.null.if.then.else.for.in.return.some.every.satisfies.instance.of.between.function.execution.task.string.number.date.time.duration.count.sum.min.max.contains.is.defined.now.today.list.context.get.value.length.size.substring.upper.lower.case.matches.replace.split.append.concatenate.flatten.distinct.values.entries.abs.floor.ceiling.round.decimal.odd.even.mean.median.all.any`.split(`.`)),Sn=e(e=>e.replace(`bpmn:`,``).replace(/([a-z])([A-Z])/g,`$1 $2`).toLowerCase(),`words`);function label$1(e){let n=e.name?.replace(/\s+/g,` `).trim();return n?`"${n}"`:t(`app.rules.flow.theNode`,{node:Sn(e.$type)})}e(label$1,`label`);function bodyOf$1(e){let t=(e?.body??e?.$body??``).trim();if(!t)return null;if(t.startsWith(`=`))return t.slice(1).trim();let n=/^[$#]\{([\s\S]*)\}$/.exec(t);return n?n[1].trim():t}e(bodyOf$1,`bodyOf`);function splitTop$1(e,t){let n=[],r=0,i=null,a=0;for(let o=0;o<e.length;o+=1){let s=e[o];if(i)s===i&&(i=null);else if(s===`"`||s===`'`)i=s;else if(s===`(`)r+=1;else if(s===`)`)--r;else if(r===0){let r=e.slice(o),i=t.exec(r);i&&i.index===0&&(n.push(e.slice(a,o)),o+=i[0].length-1,a=o+1)}}return n.push(e.slice(a)),n.map(e=>e.trim()).filter(Boolean)}e(splitTop$1,`splitTop`);function unwrap(e){let t=e.trim();for(;t.startsWith(`(`)&&t.endsWith(`)`);){let e=0,n=-1;for(let r=0;r<t.length;r+=1)if(t[r]===`(`&&(e+=1),t[r]===`)`&&--e,e===0){n=r;break}if(n!==t.length-1)break;t=t.slice(1,-1).trim()}return t}var Cn=e(e=>e&&e[0].toUpperCase()+e.slice(1),`capitalize`),wn={lo:null,hi:null};function intersect(e,t){let n=e.lo?t.lo?e.lo.value>t.lo.value||e.lo.value===t.lo.value&&e.lo.open?e.lo:t.lo:e.lo:t.lo,r=e.hi?t.hi?e.hi.value<t.hi.value||e.hi.value===t.hi.value&&e.hi.open?e.hi:t.hi:e.hi:t.hi;return n&&r&&(n.value>r.value||n.value===r.value&&(n.open||r.open))?null:{lo:n,hi:r}}function complement(e){let t=[...e].sort((e,t)=>!e.lo||!t.lo?e.lo?1:t.lo?-1:0:e.lo.value-t.lo.value||Number(e.lo.open)-Number(t.lo.open)),n=[],r=null,i=!1;for(let e of t){if(!i){if(e.lo&&n.push({lo:null,hi:{value:e.lo.value,open:!e.lo.open}}),i=!0,!e.hi)return n;r=e.hi;continue}let t=r,a=e.lo;if((a.value>t.value||a.value===t.value&&t.open&&a.open)&&n.push({lo:{value:t.value,open:!t.open},hi:{value:a.value,open:!a.open}}),!e.hi)return n;(e.hi.value>t.value||e.hi.value===t.value&&t.open&&!e.hi.open)&&(r=e.hi)}if(!i)return[wn];let a=r;return n.push({lo:{value:a.value,open:!a.open},hi:null}),n}function comparison(e){let t=/^([A-Za-z_][\w.]*)\s*(<=|>=|!=|==|=|<|>)\s*(-?\d+(?:\.\d+)?|"[^"]*"|'[^']*'|true|false)$/.exec(e)??/^(-?\d+(?:\.\d+)?|"[^"]*"|'[^']*')\s*(<=|>=|!=|==|=|<|>)\s*([A-Za-z_][\w.]*)$/.exec(e);if(!t)return null;let n=/^-?\d|^["']/.test(t[1]),r=n?t[3]:t[1],i=n?t[1]:t[3],a=n?{"<":`>`,">":`<`,"<=":`>=`,">=":`<=`}[t[2]]??t[2]:t[2];if(i===`true`||i===`false`){let e=i===`true`;return a===`=`||a===`==`?{kind:`boolean`,variable:r,values:new Set([e])}:a===`!=`?{kind:`boolean`,variable:r,values:new Set([!e])}:null}if(/^["']/.test(i)){let e=i.slice(1,-1);return a===`=`||a===`==`?{kind:`string`,variable:r,values:new Set([e]),others:!1}:a===`!=`?{kind:`string`,variable:r,values:new Set([e]),others:!0}:null}let o=Number(i);return{kind:`number`,variable:r,intervals:{"<":[{lo:null,hi:{value:o,open:!0}}],"<=":[{lo:null,hi:{value:o,open:!1}}],">":[{lo:{value:o,open:!0},hi:null}],">=":[{lo:{value:o,open:!1},hi:null}],"=":[{lo:{value:o,open:!1},hi:{value:o,open:!1}}],"==":[{lo:{value:o,open:!1},hi:{value:o,open:!1}}],"!=":[{lo:null,hi:{value:o,open:!0}},{lo:{value:o,open:!0},hi:null}]}[a]}}function parseCondition(e){let t=unwrap(e),n=splitTop$1(t,/^(\s+or\s+|\s*\|\|\s*)/);if(n.length>1){let e=n.map(parseCondition);return e.some(e=>!e)||new Set(e.map(e=>`${e?.kind}:${e?.variable}`)).size!==1?null:e.reduce((e,t)=>union(e,t))}let r=splitTop$1(t,/^(\s+and\s+|\s*&&\s*)/);if(r.length>1){let e=r.map(parseCondition);return e.some(e=>!e)||new Set(e.map(e=>`${e?.kind}:${e?.variable}`)).size!==1?null:e.reduce((e,t)=>both(e,t))}let i=/^(?:not\s*\(([\s\S]*)\)|!\s*([A-Za-z_][\w.]*))$/.exec(t);if(i){let e=parseCondition(i[1]??i[2]);return e?invert(e):null}return/^[A-Za-z_][\w.]*$/.test(t)&&!xn.has(t)?{kind:`boolean`,variable:t,values:new Set([!0])}:comparison(t)}function union(e,t){if(e.kind===`number`&&t.kind===`number`)return{...e,intervals:[...e.intervals,...t.intervals]};if(e.kind===`boolean`&&t.kind===`boolean`)return{...e,values:new Set([...e.values,...t.values])};let n=e,r=t;if(n.others&&r.others)return{...n,values:new Set([...n.values].filter(e=>r.values.has(e))),others:!0};if(n.others||r.others){let[e,t]=n.others?[n,r]:[r,n];return{...e,values:new Set([...e.values].filter(e=>!t.values.has(e))),others:!0}}return{...n,values:new Set([...n.values,...r.values]),others:!1}}function both(e,t){if(e.kind===`number`&&t.kind===`number`){let n=e.intervals.flatMap(e=>t.intervals.map(t=>intersect(e,t)).filter(e=>!!e));return{...e,intervals:n}}return e.kind===`boolean`&&t.kind===`boolean`?{...e,values:new Set([...e.values].filter(e=>t.values.has(e)))}:invert(union(invert(e),invert(t)))}function invert(e){return e.kind===`number`?{...e,intervals:complement(e.intervals)}:e.kind===`boolean`?{...e,values:new Set([!0,!1].filter(t=>!e.values.has(t)))}:{...e,others:!e.others}}function bound(e){return String(e.value)}function describeInterval(e,n){let{lo:r,hi:i}=n;return r&&i&&r.value===i.value?t(`app.rules.flow.isValue`,{variable:e,bound:bound(r)}):!r&&i?t(`app.rules.flow.isBound`,{variable:e,side:i.open?t(`app.rules.flow.below`):t(`app.rules.flow.atMost`),bound:bound(i)}):r&&!i?t(`app.rules.flow.isBound`,{variable:e,side:r.open?t(`app.rules.flow.above`):t(`app.rules.flow.atLeast`),bound:bound(r)}):r&&i?t(`app.rules.flow.isBetween`,{variable:e,lo:bound(r),hi:bound(i),exclusive:r.open||i.open?t(`app.rules.flow.exclusive`):``}):t(`app.rules.flow.hasAnyValue`,{variable:e})}function gapsOf(e){let n=e[0];if(n.kind===`number`)return complement(e.flatMap(e=>e.intervals)).map(e=>describeInterval(n.variable,e));if(n.kind===`boolean`){let r=new Set(e.flatMap(e=>[...e.values]));return[!0,!1].filter(e=>!r.has(e)).map(e=>t(`app.rules.flow.isValue`,{variable:n.variable,bound:e}))}let r=e.reduce((e,t)=>union(e,t));return r.kind===`string`?r.others?[...r.values].map(e=>t(`app.rules.flow.isValue`,{variable:n.variable,bound:`"${e}"`})):[t(`app.rules.flow.isAnythingBut`,{variable:n.variable,values:[...r.values].map(e=>`"${e}"`).join(t(`app.rules.flow.comma`))})]:[]}function overlapOf(e,n){let r=both(e,n);return r.kind===`number`?r.intervals[0]?describeInterval(e.variable,r.intervals[0]):null:r.kind===`boolean`?r.values.size>0?t(`app.rules.flow.isValue`,{variable:e.variable,bound:[...r.values][0]}):null:r.others?t(`app.rules.flow.isSomeOtherValue`,{variable:e.variable}):r.values.size>0?t(`app.rules.flow.isValue`,{variable:e.variable,bound:`"${[...r.values][0]}"`}):null}function*elementsOf(e){let t=new Set,n=[];for(let t of e.rootElements??[])t.$type===`bpmn:Process`&&n.push(t),t.$type===`bpmn:Collaboration`&&t.participants?.forEach(e=>e.processRef&&n.push(e.processRef));for(;n.length>0;){let e=n.pop();if(!t.has(e)){t.add(e);for(let t of e.flowElements??[])yield t,t.flowElements&&n.push(t)}}}function checkGateway(e,n){if(n.length<2||e.default)return[];let r=n.map(e=>({flow:e,body:bodyOf$1(e.conditionExpression)}));if(r.some(e=>e.body===null))return[];let i=e.$type===`bpmn:ExclusiveGateway`,a=r.map(e=>parseCondition(e.body)),o=a.every(e=>e&&e.kind===a[0]?.kind&&e.variable===a[0]?.variable),s=e.id??``;if(!o)return[{kind:`NO-DEFAULT`,title:ruleTitle(`flow`,`NO-DEFAULT`),detail:t(`app.rules.flow.noDefaultFlow`,{gateway:Cn(label$1(e))}),elements:[s],trace:[]}];let c=a,l=[],u=gapsOf(c);if(u.length>0&&l.push({kind:`NO-WAY-OUT`,title:ruleTitle(`flow`,`NO-WAY-OUT`),detail:t(`app.rules.flow.noWayOut`,{gateway:Cn(label$1(e)),gaps:u.join(t(`app.rules.flow.orWhen`))}),elements:[s],trace:[]}),i)for(let r=0;r<c.length;r+=1)for(let i=r+1;i<c.length;i+=1){let a=overlapOf(c[r],c[i]);if(!a)continue;let flowName=e=>e.name?.trim()?`"${e.name.trim()}"`:t(`app.rules.flow.theFlowTo`,{target:e.targetRef?label$1(e.targetRef):t(`app.rules.flow.theNextStep`)});l.push({kind:`OVERLAP`,title:ruleTitle(`flow`,`OVERLAP`),detail:t(`app.rules.flow.bothConditionsHold`,{shared:a,first:flowName(n[r]),second:flowName(n[i]),gateway:label$1(e)}),elements:[s,n[r].id??``,n[i].id??``],trace:[]})}return l}function identifiers(e){return[...e.replace(/"[^"]*"|'[^']*'/g,` `).matchAll(/[A-Za-z_][\w]*/g)].map(e=>e[0]).filter(e=>!xn.has(e))}function variablesOf(e){let t=[],n=bodyOf$1(e.conditionExpression);n&&t.push(...identifiers(n));let r=e.$attrs??{},i=e.resultVariable??r[`camunda:resultVariable`];typeof i==`string`&&t.push(i);let visit=e=>{if(!e)return;let n=e.$type??``;if(/zeebe:(input|output)$/.test(n)&&(typeof e.target==`string`&&t.push(e.target),typeof e.source==`string`&&e.source.trim().startsWith(`=`)&&t.push(...identifiers(e.source.trim().slice(1)))),/camunda:(inputParameter|outputParameter)$/.test(n)){typeof e.name==`string`&&t.push(e.name);let n=e.$body??e.value;if(typeof n==`string`)for(let e of n.matchAll(/[$#]\{([^}]*)\}/g))t.push(...identifiers(e[1]))}for(let t of[`$children`,`values`,`inputParameters`,`outputParameters`,`inputParameter`,`outputParameter`]){let n=e[t];Array.isArray(n)&&n.forEach(e=>visit(e))}};return(e.extensionElements?.values??[]).forEach(visit),t.map(t=>({name:t.split(`.`)[0],element:e.id??``}))}function oneEditApart(e,t){if(e===t||Math.abs(e.length-t.length)>1)return!1;let n=0;for(;n<e.length&&n<t.length&&e[n]===t[n];)n+=1;let rest=(e,t)=>e.slice(t);return e.length===t.length?rest(e,n+1)===rest(t,n+1)||e[n]===t[n+1]&&e[n+1]===t[n]&&rest(e,n+2)===rest(t,n+2):e.length>t.length?rest(e,n+1)===rest(t,n):rest(e,n)===rest(t,n+1)}function lookalikes(e){let n=new Map;e.forEach(e=>n.set(e.name,new Set([...n.get(e.name)??[],e.element])));let r=[...n.keys()].sort(),i=[];for(let e=0;e<r.length;e+=1)for(let a=e+1;a<r.length;a+=1){let[o,s]=[r[e],r[a]];if(/\d$/.test(o)&&/\d$/.test(s))continue;let c=o.toLowerCase()===s.toLowerCase(),l=Math.min(o.length,s.length)>=5&&oneEditApart(o,s);(c||l)&&i.push({kind:`LOOKALIKE`,title:ruleTitle(`flow`,`LOOKALIKE`),detail:t(`app.rules.flow.lookalikeNames`,{first:o,second:s,difference:t(c?`app.rules.flow.letterCaseOnly`:`app.rules.flow.oneCharacter`)}),elements:[...new Set([...n.get(o)??[],...n.get(s)??[]])].filter(Boolean),trace:[]})}return i}function analyzeDecisions(e){let t=e,n=[],r=[],i=[...elementsOf(t)],a=new Map;for(let e of i)e.$type===`bpmn:SequenceFlow`&&e.sourceRef&&a.set(e.sourceRef,[...a.get(e.sourceRef)??[],e]);for(let e of i)(e.$type===`bpmn:ExclusiveGateway`||e.$type===`bpmn:InclusiveGateway`)&&n.push(...checkGateway(e,a.get(e)??[])),r.push(...variablesOf(e));return n.push(...lookalikes(r)),n}function conditionBody(e){let t=e.trim();if(t.startsWith(`=`))return t.slice(1).trim();let n=/^[$#]\{([\s\S]*)\}$/.exec(t);return n?n[1].trim():t}function inside(e,t){let n=!e.lo||(e.lo.open?t>e.lo.value:t>=e.lo.value),r=!e.hi||(e.hi.open?t<e.hi.value:t<=e.hi.value);return n&&r}function pick$1(e){if(e.kind===`boolean`)return[...e.values][0];if(e.kind===`string`){if(!e.others)return[...e.values][0];let t=`other`;for(let n=2;e.values.has(t);n+=1)t=`other${n}`;return t}for(let t of e.intervals){let e=[t.lo?t.lo.open?Math.floor(t.lo.value)+1:t.lo.value:null,t.hi?t.hi.open?Math.ceil(t.hi.value)-1:t.hi.value:null,t.lo&&t.hi?(t.lo.value+t.hi.value)/2:null,0].find(e=>e!==null&&inside(t,e));if(e!==void 0)return e}}e(pick$1,`pick`);function empty(e){return e.kind===`number`?e.intervals.length===0:(e.kind===`boolean`||!e.others)&&e.values.size===0}function valuesFor(e){let t=new Map,n=[],r=[],narrow=(e,r,i,a=n)=>{let o=t.get(e.variable);if(o&&o.kind!==e.kind){i&&a.push(r);return}let s=o?both(o,e):e;empty(s)?i&&a.push(r):t.set(e.variable,s)};for(let t of e)for(let e of t.takes){let t=parseCondition(conditionBody(e));t?narrow(t,e,!0):n.push(e)}for(let t of e)for(let e of t.avoids){let n=parseCondition(conditionBody(e));n?narrow(invert(n),e,t.takes.length===0,r):t.takes.length===0&&r.push(e)}let i={};for(let[e,r]of t){let t=pick$1(r);t===void 0?n.push(e):i[e]=t}return{values:i,unresolved:n,avoided:r}}var Tn=2e4,En=4,V=e(e=>ruleTitle(`flow`,e),`title`),capitalize=e=>e&&e[0].toUpperCase()+e.slice(1);function kindOf$3(e){switch(e.$type){case`bpmn:StartEvent`:return`start`;case`bpmn:EndEvent`:return`end`;case`bpmn:ExclusiveGateway`:case`bpmn:EventBasedGateway`:case`bpmn:ComplexGateway`:return`xor`;case`bpmn:ParallelGateway`:return`and`;case`bpmn:InclusiveGateway`:return`or`;case`bpmn:BoundaryEvent`:return`boundary`;default:return`activity`}}e(kindOf$3,`kindOf`);var Dn=new Set([`bpmn:SequenceFlow`,`bpmn:DataObject`,`bpmn:DataObjectReference`,`bpmn:DataStoreReference`]);function scopesOf(e){let t=[],n=[],r=new Set,add=e=>{e&&!r.has(e)&&(r.add(e),n.push(e))};for(let t of e.rootElements??[])t.$type===`bpmn:Process`&&add(t),t.$type===`bpmn:Collaboration`&&t.participants?.forEach(e=>add(e.processRef));for(let e=0;e<n.length;e+=1){let r=n[e],i=r.flowElements??[],a=new Map;for(let e of i){if(Dn.has(e.$type)||!e.id||(e.$type===`bpmn:SubProcess`||e.$type===`bpmn:Transaction`||e.$type===`bpmn:AdHocSubProcess`)&&(add(e),e.triggeredByEvent))continue;let t=kindOf$3(e);a.set(e,{id:e.id,named:!!e.name?.trim(),name:e.name?.replace(/\s+/g,` `).trim()||kindName$1(e.$type),kind:t,incoming:[],outgoing:[],defaultFlow:null,terminate:(e.eventDefinitions??[]).some(e=>e.$type===`bpmn:TerminateEventDefinition`),boundaries:[],interrupting:e.cancelActivity!==!1,outgoingNodes:[],host:null,plain:(e.eventDefinitions??[]).length===0})}let o=[];for(let e of i){if(e.$type!==`bpmn:SequenceFlow`)continue;let t=e.sourceRef&&a.get(e.sourceRef),n=e.targetRef&&a.get(e.targetRef);if(!t||!n||!e.id)continue;let r=o.length;o.push({id:e.id,name:e.name?.replace(/\s+/g,` `).trim()??``,source:t,target:n,conditional:!!e.conditionExpression,condition:e.conditionExpression?.body?.trim()??``}),t.outgoing.push(r),t.outgoingNodes.push(n),n.incoming.push(r)}for(let[e,t]of a){e.default&&(t.defaultFlow=o.findIndex(t=>t.id===e.default?.id)),t.defaultFlow===-1&&(t.defaultFlow=null);let n=t.kind===`boundary`&&e.attachedToRef?a.get(e.attachedToRef):void 0;n&&(n.boundaries.push(t),t.host=n)}a.size>0&&t.push({id:r.id??`scope-${e}`,nodes:[...a.values()],flows:o})}return t}function subsets(e){if(e.length===0)return[];if(e.length>En)return[...e.map(e=>[e]),e];let t=[];for(let n=1;n<1<<e.length;n+=1)t.push(e.filter((e,t)=>n&1<<t));return t}function choices(e,t){let n=e.outgoing;if(n.length===0)return[[]];if(e.kind===`xor`)return n.map(e=>[e]);if(e.kind===`and`)return[n];let r=n.filter(n=>n!==e.defaultFlow&&(e.kind===`or`||t[n].conditional)),i=e.kind===`or`?[]:n.filter(t=>!r.includes(t)&&t!==e.defaultFlow),a=subsets(r).map(e=>[...i,...e]);return e.defaultFlow!==null&&a.push([...i,e.defaultFlow]),r.length===0&&e.defaultFlow===null?[i]:a.length>0?a:[i]}function reachability(e){let t=e.flows.length,n=e.flows.map(()=>Array(t).fill(!1));return e.flows.forEach((t,r)=>{let i=[...t.target.outgoing];for(;i.length>0;){let t=i.pop();n[r][t]||(n[r][t]=!0,i.push(...e.flows[t].target.outgoing))}}),n}function label(e){if(e.named)return`"${e.name}"`;let n=e.outgoingNodes.find(e=>e.named);return n?t(`app.rules.flow.nodeBefore`,{node:e.name,next:n.name}):t(`app.rules.flow.theNode`,{node:e.name})}function sourceLabel(e){return e.source.named?`"${e.source.name}"`:t(`app.rules.flow.theBranchThrough`,{node:e.source.name})}function downstream(e){let t=new Set,n=[...e];for(;n.length>0;){let e=n.pop();if(!t.has(e.id)){t.add(e.id);for(let t of e.boundaries)n.push(t);n.push(...e.outgoingNodes)}}return t}function explore(e,n){let r=reachability(e),i=new Set(n.fired),a=[],key=e=>e.join(`,`),o=new Map([[key(n.tokens),0]]),s=[n.tokens],c=[{from:-1,fired:n.fired}],l=[],u=[],d=!1,f=new Set,p=new Set,m=new Set,doubledAt=t=>p.has(t.id)||m.has(t.id)?!0:(p.add(t.id),m=downstream([...p].map(t=>e.nodes.find(e=>e.id===t))),!1),traceTo=e=>{let t=[];for(let n=e;n>=0;n=c[n].from)t.unshift(...c[n].fired);return t};for(let n=0;n<s.length;n+=1){let p=s[n],m=[],h=[],push=(r,l,u,g=!1,_=null)=>{let v=g?p.map(()=>0):[...p];g||(r.forEach(e=>--v[e]),l.forEach(e=>v[e]+=1)),u.forEach(e=>i.add(e));let y=v.findIndex(e=>e>1);if(y>=0){let r=e.flows[y].target;if(doubledAt(r))return;a.push({kind:`NO-SYNCHRONIZATION`,title:V(`NO-SYNCHRONIZATION`),detail:t(`app.rules.flow.twoTokensAtOnce`,{node:label(r)}),elements:[r.id],trace:[...traceTo(n),...u,r.id]});return}let b=key(v),x=o.get(b);if(x===void 0){if(s.length>=Tn){d=!0,f.add(n);return}x=s.length,o.set(b,x),s.push(v),c.push({from:n,fired:u})}m.push(x),h.push({to:x,fired:u,choice:_,produced:g?[]:l.map(t=>e.flows[t].id)})};for(let i of e.nodes){if(i.kind===`boundary`||i.kind===`start`)continue;let o=i.incoming.filter(e=>p[e]>0);if(o.length!==0){if(i.kind===`and`)o.length===i.incoming.length&&push(i.incoming,i.outgoing,[i.id]);else if((i.kind===`activity`||i.kind===`xor`)&&o.length>1&&!doubledAt(i)&&a.push({kind:`NO-SYNCHRONIZATION`,title:V(`NO-SYNCHRONIZATION`),detail:t(`app.rules.flow.twoBranchesAtOnce`,{node:label(i)}),elements:[i.id],trace:traceTo(n)}),i.kind===`or`){if(i.incoming.filter(e=>p[e]===0).some(e=>p.some((t,n)=>t>0&&!i.incoming.includes(n)&&r[n][e])))continue;let t=choices(i,e.flows);for(let e of t)push(o,e,[i.id],!1,t.length>1?{node:i.id,ways:e,boundary:null}:null)}else for(let t of o){if(i.kind===`end`){push([t],[],[i.id],i.terminate);continue}let n=choices(i,e.flows);for(let e of n){push([t],e,[i.id],!1,n.length>1?{node:i.id,ways:e,boundary:null}:null);for(let n of i.boundaries){let r=n.interrupting?n.outgoing:[...e,...n.outgoing];push([t],r,[i.id,n.id],!1,{node:i.id,ways:e,boundary:n.id})}}}}}l.push(m),u.push(h)}let h=s.map(()=>[]);l.forEach((e,t)=>e.forEach(e=>h[e].push(t)));let backwards=e=>{let t=Array(s.length).fill(!1),n=[...e];for(n.forEach(e=>t[e]=!0);n.length>0;){let e=n.pop();for(let r of h[e])t[r]||(t[r]=!0,n.push(r))}return t},explored=e=>l[e]!==void 0,busy=e=>s[e].some(e=>e>0),g=s.map((e,t)=>t).filter(e=>!busy(e)),_=s.map((e,t)=>t).filter(e=>busy(e)&&explored(e)&&l[e].length===0&&!f.has(e)),v=backwards([...g,...f]),y=backwards(_),waitingAt=t=>[...new Set(t.flatMap((t,n)=>t>0?[e.flows[n].target]:[]))],b=_.find(e=>!v[e]);if(b!==void 0){let n=s[b],r=waitingAt(n),i=traceTo(b),o=new Map(e.nodes.map(e=>[e.id,e])),c=[...i].reverse().map(e=>o.get(e)).find(e=>e&&(e.kind===`xor`||e.kind===`or`||e.kind===`boundary`)),l=c?c.kind===`boundary`?t(`app.rules.flow.leftThroughBoundary`,{host:c.host?label(c.host):t(`app.rules.flow.anActivity`),event:c.named?` ${label(c)}`:``}):t(`app.rules.flow.sentDownAnotherBranch`,{turn:capitalize(label(c))}):``,u=r.map(r=>{let i=r.incoming.filter(e=>n[e]===0).map(t=>sourceLabel(e.flows[t])),a=label(r);return i.length>0?t(`app.rules.flow.waitsFor`,{who:capitalize(a),missing:i.join(t(`app.rules.flow.and`)),arrives:i.length===1?t(`app.rules.flow.arrives`):t(`app.rules.flow.arrive`)}):t(`app.rules.flow.waitsAndCannotContinue`,{who:capitalize(a)})}).join(` `)+l;a.push({kind:`DEADLOCK`,title:V(`DEADLOCK`),detail:u,elements:r.map(e=>e.id),trace:i})}let x=s.findIndex((e,t)=>busy(t)&&explored(t)&&!v[t]&&!y[t]);if(x>=0&&!d){let e=waitingAt(s[x]);a.push({kind:`NEVER-FINISHES`,title:V(`NEVER-FINISHES`),detail:t(`app.rules.flow.noPathToAnEnd`,{nodes:e.map(label).join(t(`app.rules.flow.and`))}),elements:e.map(e=>e.id),trace:traceTo(x)})}d&&a.push({kind:`TOO-COMPLEX`,title:V(`TOO-COMPLEX`),detail:t(`app.rules.flow.tooManyStates`,{states:Tn}),elements:[],trace:[]});let S=a.filter(e=>e.kind===`DEADLOCK`).flatMap(e=>e.elements),C=downstream(e.nodes.filter(e=>S.includes(e.id)));return m.forEach(e=>C.add(e)),{problems:a,fired:i,states:s.length,consequences:C,graph:{tokens:s,edges:u}}}function initialsOf(e){let t=e.nodes.filter(e=>e.kind===`start`),n=e.nodes.filter(e=>e.kind===`activity`&&e.incoming.length===0);return t.length>0?t.map(t=>{let n=e.flows.map(()=>0);return t.outgoing.forEach(e=>n[e]+=1),{fired:[t.id],tokens:n,flows:t.outgoing.map(t=>e.flows[t].id)}}):[{fired:n.map(e=>e.id),tokens:e.flows.map((e,t)=>+!!n.some(e=>e.outgoing.includes(t))),flows:e.flows.filter((e,t)=>n.some(e=>e.outgoing.includes(t))).map(e=>e.id)}]}function analyzeScope(e){let n=initialsOf(e),r=new Set,i=new Set,a=[],o=0;for(let t of n){let n=explore(e,t);n.fired.forEach(e=>r.add(e)),n.consequences.forEach(e=>i.add(e)),a.push(...n.problems),o+=n.states}for(let n of e.nodes){if(r.has(n.id)||n.kind===`start`||i.has(n.id))continue;let e=n.incoming.length===0&&n.kind!==`boundary`?t(`app.rules.flow.nothingLeadsToIt`):t(`app.rules.flow.noPathReachesIt`);a.push({kind:`DEAD-ELEMENT`,title:V(`DEAD-ELEMENT`),detail:t(`app.rules.flow.neverRuns`,{node:capitalize(label(n)),cause:e}),elements:[n.id],trace:[]})}return{problems:a,fired:r,states:o,consequences:i}}function analyzeFlow(e){let t=scopesOf(e),n=[...analyzeDecisions(e)],r=0;for(let e of t){let t=analyzeScope(e);r+=t.states;for(let e of t.problems)n.some(t=>t.kind===e.kind&&t.elements.join()===e.elements.join())||n.push(e)}return{problems:n,scopes:t.length,states:r}}var On=2e5;function decisionOf(e,t,n){let nameOf=e=>t.get(e)?.name??e;return{decision:nameOf(n.node),way:listOf$1(n.ways.map(t=>e.flows[t].name||`to "${e.flows[t].target.name}"`)),condition:listOf$1(n.ways.map(t=>e.flows[t].condition).filter(Boolean)),boundary:n.boundary?nameOf(n.boundary):null,decisionId:n.node,flowIds:n.ways.map(t=>e.flows[t].id),takes:n.ways.map(t=>e.flows[t].condition).filter(Boolean),avoids:(t.get(n.node)?.outgoing??[]).filter(e=>!n.ways.includes(e)).map(t=>e.flows[t].condition).filter(Boolean),boundaryId:n.boundary}}function scenarioOf(e,t,n,r,i,a){let nameOf=e=>t.get(e)?.name??e,o=r.filter((e,t)=>r.indexOf(e)===t);return{process:e.id,start:nameOf(n.fired[0]),decisions:a.map(n=>decisionOf(e,t,n)),steps:o.filter(e=>t.get(e)?.kind===`activity`||t.get(e)?.kind===`boundary`).map(nameOf),ends:o.filter(e=>t.get(e)?.kind===`end`).map(nameOf),startId:n.fired[0],stepIds:o.filter(e=>t.get(e)?.kind===`activity`||t.get(e)?.kind===`boundary`),endIds:o.filter(e=>t.get(e)?.kind===`end`),firedIds:r,flowIds:i}}function enumerate(e,t,n,r,i){let a=[],o=new Set,s=new Set,c=On,l=!1,walk=(u,d,f,p,m)=>{if(a.length>=i||c--<=0){l=!0;return}let h=m.map(e=>`${e.node}:${e.ways.join(`+`)}:${e.boundary??``}`).join(`|`),g=`${u}#${h}`;if(!o.has(g)){if(o.add(g),r.tokens[u].every(e=>e===0)){if(s.has(h))return;s.add(h),a.push(scenarioOf(e,t,n,f,p,m))}else for(let e of r.edges[u]??[])d.has(e.to)||(d.add(e.to),walk(e.to,d,[...f,...e.fired],[...p,...e.produced],e.choice?[...m,e.choice]:m),d.delete(e.to))}};return walk(0,new Set([0]),[...n.fired],[...n.flows],[]),{list:a,capped:l}}function cover(e,t,n,r){let{tokens:i,edges:a}=r,finished=e=>i[e].every(e=>e===0),o=i.map(()=>[]);a.forEach((e,t)=>e.forEach(e=>o[e.to].push({from:t,edge:e})));let s=i.map(()=>null),c=i.map((e,t)=>finished(t)),l=c.flatMap((e,t)=>e?[t]:[]);for(let e=0;e<l.length;e+=1)for(let{from:t,edge:n}of o[l[e]])c[t]||(c[t]=!0,s[t]=n,l.push(t));let u=i.map(()=>null),d=[0],f=new Set([0]);for(let e=0;e<d.length;e+=1)for(let t of a[d[e]]??[])f.has(t.to)||(f.add(t.to),u[t.to]={from:d[e],edge:t},d.push(t.to));let p=new Set([...n.fired,...n.flows]),m=new Set,h=[];for(let r of d)for(let i of a[r]??[]){if(!c[i.to]||[...i.fired,...i.produced].every(e=>p.has(e)))continue;let a=[];for(let e=r;u[e];e=u[e].from)a.unshift(u[e].edge);a.push(i);for(let e=i.to;!finished(e)&&s[e];e=s[e].to)a.push(s[e]);let o=a.filter(e=>e.choice).map(e=>`${e.choice?.node}:${e.choice?.ways.join(`+`)}:${e.choice?.boundary??``}`).join(`|`);a.forEach(e=>[...e.fired,...e.produced].forEach(e=>p.add(e))),!m.has(o)&&(m.add(o),h.push(scenarioOf(e,t,n,[...n.fired,...a.flatMap(e=>e.fired)],[...n.flows,...a.flatMap(e=>e.produced)],a.flatMap(e=>e.choice?[e.choice]:[]))))}return h}function scenarioSet(e,t=64){let n=[],r=!1;for(let i of scopesOf(e)){let e=new Map(i.nodes.map(e=>[e.id,e]));for(let a of initialsOf(i)){let{graph:o}=explore(i,a),s=enumerate(i,e,a,o,t);s.capped?(r=!0,n.push(...cover(i,e,a,o))):n.push(...s.list)}}return{scenarios:n,capped:r}}function rootProcesses(e){let t=[];for(let n of e?.rootElements??[])if(n.$type===`bpmn:Process`&&t.push(n),n.$type===`bpmn:Collaboration`)for(let e of n.participants??[])e.processRef&&t.push(e.processRef);return[...new Set(t)]}function executableProcessIds(e){return rootProcesses(e).filter(e=>e.isExecutable!==!1&&e.id).map(e=>e.id)}function startEventsOf(e,t){return(scopesOf(e).find(e=>e.id===t)?.nodes??[]).filter(e=>e.kind===`start`).map(e=>({id:e.id,name:e.named?e.name:``,plain:e.plain}))}var kn=5e3;function walkScenario(e,t,n={}){let r=scopesOf(e),i=executableProcessIds(e),a=n.process?r.find(e=>e.id===n.process):r.filter(e=>i.includes(e.id)).length===1?r.find(e=>i.includes(e.id)):void 0;if(!a)return null;let o=initialsOf(a),plainStart=e=>a.nodes.find(t=>t.id===e.fired[0])?.plain!==!1,s=o.find(e=>e.fired[0]===n.startId)??(n.startId?void 0:o.find(plainStart)??o[0]);if(!s||s.fired.length===0)return null;let c=new Map(a.nodes.map(e=>[e.id,e])),{graph:l}=explore(a,s),u=[...s.fired],d=[...s.flows],f=[],p=new Set([0]),m=0,h=!1,g;for(let e=0;e<kn;e+=1){if(l.tokens[m].every(e=>e===0)){h=!0;break}let e=l.edges[m]??[];if(e.length===0)break;let n=e[0].fired[0],r=e.filter(e=>e.fired[0]===n),i=r.length===1?0:t(r.map(e=>({nodeId:n,flowIds:e.produced,boundaryId:e.choice?.boundary??null})),u);if(i<0){g=n,u.push(n);break}let a=r[Math.min(i,r.length-1)];if(p.has(a.to))break;p.add(a.to),u.push(...a.fired),d.push(...a.produced),a.choice&&f.push(a.choice),m=a.to}return{scenario:scenarioOf(a,c,s,u,d,f),complete:h,...g?{blockedAt:g}:{}}}var An=new Set([`bpmn:SubProcess`,`bpmn:Transaction`]),jn=new Map([[`bpmn:AdHocSubProcess`,`adhoc`],[`bpmn:CallActivity`,`callActivity`]]);function notFollowedWhy(e){let n=jn.get(e);return n?t(`app.scenarios.notFollowed.${n}`):void 0}function containersOf(e){let t=new Map,walk=e=>{for(let n of e??[])n.id&&(An.has(n.$type)||jn.has(n.$type))&&t.set(n.id,{id:n.id,name:n.name?.replace(/\s+/g,` `).trim()??``,type:n.$type,followed:An.has(n.$type)&&!n.triggeredByEvent,why:notFollowedWhy(n.$type),repeats:!!n.loopCharacteristics}),n.flowElements&&walk(n.flowElements)},n=e?.rootElements??[];for(let e of n)if(e.$type===`bpmn:Process`&&walk(e.flowElements),e.$type===`bpmn:Collaboration`)for(let t of e.participants??[])walk(t.processRef?.flowElements);return t}function unique(e){return[...new Set(e)]}function mergeInner(e,t,n){let r=e.firedIds.indexOf(t);if(r<0)return e;let i=[...e.firedIds.slice(0,r+1),...n.firedIds,...e.firedIds.slice(r+1)],a=new Map;[e,n].forEach(e=>{e.stepIds.forEach((t,n)=>a.set(t,e.steps[n])),e.endIds.forEach((t,n)=>a.set(t,e.ends[n]))});let o=new Set([...e.stepIds,...n.stepIds]),s=new Set([...e.endIds,...n.endIds]),c=unique(i.filter(e=>o.has(e))),l=unique(i.filter(e=>s.has(e)));return{...e,decisions:[...e.decisions,...n.decisions],stepIds:c,steps:c.map(e=>a.get(e)??e),endIds:l,ends:l.map(e=>a.get(e)??e),firedIds:i,flowIds:[...e.flowIds,...n.flowIds]}}function expandEnumerated(e,t,n){let r=containersOf(e);if(![...r.values()].some(e=>e.followed))return t;let i=n??scenarioSet(e).scenarios,a=new Map,innerOf=e=>{let t=a.get(e);if(t)return t;a.set(e,[]);let n=expandList(i.filter(t=>t.process===e));return a.set(e,n),n},expandList=e=>{let t=[],n=new Set;for(let i of e){let e=unique(i.firedIds).filter(e=>r.get(e)?.followed&&innerOf(e).length>0),a=i;for(let t of e)a=mergeInner(a,t,innerOf(t)[0]);t.push(a);for(let r of e)n.has(r)||(n.add(r),innerOf(r).slice(1).forEach(n=>{let a=i;for(let t of e)a=mergeInner(a,t,t===r?n:innerOf(t)[0]);t.push(a)}))}return t};return expandList(t)}function expandWalked(e,t,n){let r=containersOf(e),i=t;for(let a of unique(t.firedIds)){if(!r.get(a)?.followed)continue;let t=n(a,i.firedIds.slice(0,i.firedIds.indexOf(a)+1));t&&(i=mergeInner(i,a,expandWalked(e,t,(e,t)=>n(e,[...i.firedIds.slice(0,i.firedIds.indexOf(a)+1),...t]))))}return i}function nestValues(e){let t={};for(let[n,r]of Object.entries(e)){let e=n.split(`.`);if(e.includes(`__proto__`))continue;let i=t;e.slice(0,-1).forEach(e=>{Object.hasOwn(i,e)&&typeof i[e]==`object`&&i[e]!==null||(i[e]={}),i=i[e]}),i[e[e.length-1]]=r}return t}function describeScenario(e){let n=e.decisions.map(e=>e.boundary?t(`app.testCases.scenarioName.boundaryFires`,{boundary:e.boundary}):t(`app.testCases.scenarioName.way`,{decision:e.decision,way:e.way}));return[e.start,...n,...e.ends].join(` → `)}function scenarioValues(e,n){let r=valuesFor(e.decisions.map(e=>({takes:e.takes,avoids:e.avoids}))),i=r.values,a=[...r.unresolved.map(e=>t(`app.testCases.unresolved.chooseVariables`,{condition:e})),...r.avoided.map(e=>t(`app.testCases.unresolved.chooseVariablesWithout`,{condition:e}))];e.decisions.filter(e=>!e.boundaryId&&e.takes.length===0&&e.avoids.length===0).forEach(e=>a.push(t(`app.testCases.unresolved.noConditionForTheWay`,{decision:e.decision,way:e.way})));for(let t of[e.startId,...e.stepIds]){let e=n.get(t)?.correlationKey?.replace(/^=/,``).trim();e&&/^[A-Za-z_]\w*$/.test(e)&&i[e]===void 0&&(i[e]=`${e}-1`)}return{values:i,unresolved:a}}function correlationValue(e,t){let n=e.correlationKey?.replace(/^=/,``).trim()??``;return/^[A-Za-z_]\w*$/.test(n)&&t[n]!==void 0?String(t[n]):/^"[^"]*"$/.test(n)?n.slice(1,-1):`correlation-key`}var Mn=`ANY_ERROR`;function isJob(e){return!!(e.job||e.external)}function delegated(e){return!!(e.delegateClass||e.delegateExpression||e.expression)}function closure(e,t){let n=new Set,r=[...t];for(;r.length>0;){let t=r.pop();n.has(t)||(n.add(t),r.push(...e.get(t)?.follows??[]))}return n}function whileWaiting(e,t){let n=[...e.stepIds];for(let r of e.stepIds){let e=t.get(r);if(!e?.host||e.interrupting!==!1)continue;let i=e.host,a=closure(t,t.get(i)?.follows??[]),o=[...closure(t,e.follows??[])].filter(e=>!a.has(e)&&n.includes(e));if(o.length===0)continue;let s=Math.max(...o.map(e=>n.indexOf(e))),c=n.indexOf(i);c<0||c>s||(n.splice(c,1),n.splice(s,0,i))}return n}var Nn=new Set([`message`,`timer`,`signal`]);function article(e){return/^[aeiou]/i.test(e)?`an`:`a`}function startEventPhrase(e){let n=`app.testCases.kind.${e}`,r=t(n);return r===n?`${article(e)} ${e} event`:r}function testCaseOf(e,n,r){let i=n.get(e.startId),a=!!i?.event&&i.event!==`none`;if(a&&!Nn.has(i.event)){let e=i.event;return{problem:t(`app.testCases.startsOnAnEvent`,{kind:startEventPhrase(e)})}}let{values:o,unresolved:s}=r?{values:r,unresolved:[]}:scenarioValues(e,n),c=new Map(e.decisions.filter(e=>e.boundaryId).map(e=>[e.decisionId,n.get(e.boundaryId)])),l=[{type:`CREATE_PROCESS_INSTANCE`,processDefinitionSelector:{processDefinitionId:e.process},variables:nestValues(o),...a?{startInstructions:[{elementId:e.startId}]}:{}}],u={},d=[],f=new Set(e.stepIds.map(e=>n.get(e)?.host).filter(e=>!!e)),typeOf=e=>e.job??e.external,shared=e=>[...n.values()].filter(t=>typeOf(t)===typeOf(e)).length>1,holdHost=e=>{let t=e?n.get(e):void 0;t&&isJob(t)&&(u[t.id]={then:`hold`})};for(let r of whileWaiting(e,n)){let e=n.get(r);if(!e)continue;if(e.host){e.event===`error`&&l.push({type:`THROW_BPMN_ERROR_FROM_JOB`,jobSelector:{elementId:e.host},errorCode:e.errorCode||Mn}),e.event===`timer`&&(u[r]={then:`fire`},e.interrupting!==!1&&holdHost(e.host)),e.event===`message`&&e.message&&(l.push({type:`CORRELATE_MESSAGE`,name:e.message,correlationKey:correlationValue(e,o)}),e.interrupting!==!1&&holdHost(e.host)),e.event===`signal`&&e.signal&&(l.push({type:`BROADCAST_SIGNAL`,signalName:e.signal}),e.interrupting!==!1&&holdHost(e.host)),d.push(r);continue}let i=c.get(r);i&&i.interrupting!==!1||(e.type===`bpmn:UserTask`&&!e.job&&!e.external?l.push({type:`COMPLETE_USER_TASK`,userTaskSelector:{elementId:r}}):isJob(e)&&e.repeats&&!f.has(r)&&!shared(e)?l.push({type:`MOCK_JOB_WORKER_COMPLETE_JOB`,jobType:typeOf(e)}):isJob(e)?(e.repeats&&s.push(t(`app.testCases.unresolved.runsOncePerItem`,{name:e.name??r})),l.push({type:`COMPLETE_JOB`,jobSelector:{elementId:r}})):delegated(e)?u[r]={then:`complete`}:e.event===`message`&&e.message?l.push({type:`CORRELATE_MESSAGE`,name:e.message,correlationKey:correlationValue(e,o)}):e.event===`timer`?u[r]={then:`fire`}:e.event===`signal`&&e.type.includes(`Catch`)&&e.signal&&l.push({type:`BROADCAST_SIGNAL`,signalName:e.signal}),d.push(r))}d.push(...e.endIds);let p={processDefinitionId:e.process};l.push({type:`ASSERT_ELEMENT_INSTANCES`,processInstanceSelector:p,elementSelectors:d.map(e=>({elementId:e})),state:`IS_COMPLETED`},{type:`ASSERT_PROCESS_INSTANCE`,processInstanceSelector:p,state:`IS_COMPLETED`});let m={name:describeScenario(e),instructions:l};return s.length&&(m.description=t(`app.testCases.toFillIn`,{unresolved:s.join(`; `)})),Object.keys(u).length&&(m[`x-penstock`]={behaviours:u}),{testCase:m}}function generateScenarioSet(e,n){let r=stepsOf(e),i=new Map,a=new Set((e?.rootElements??[]).filter(e=>e.$type===`bpmn:Process`&&e.isExecutable!==!1).map(e=>e.id)),o=scenarioSet(e),s=expandEnumerated(e,o.scenarios.filter(e=>a.has(e.process)),o.scenarios).filter(e=>!n||e.process===n).map(e=>({scenario:e,outcome:testCaseOf(e,r)})),c=s.filter(e=>`problem`in e.outcome).map(({scenario:e,outcome:t})=>({scenario:e,problem:t.problem}));return{items:s.filter(e=>`testCase`in e.outcome).map(({scenario:e,outcome:n})=>{let r=(i.get(n.testCase.name)??0)+1;return i.set(n.testCase.name,r),{scenario:e,testCase:r===1?n.testCase:{...n.testCase,name:t(`app.testCases.numberedCaseName`,{name:n.testCase.name,seen:r})}}}),unplannable:c,capped:o.capped}}function jobTypeOf$1(e){return e.job??e.external??null}e(jobTypeOf$1,`jobTypeOf`);function waitingSteps(e){let t=[];for(let n of e.values()){let e=n.name??n.id,r=jobTypeOf$1(n);r?t.push({id:n.id,name:e,kind:`job`,jobType:r}):n.delegateClass||n.delegateExpression||n.expression?t.push({id:n.id,name:e,kind:`delegate`,jobType:null}):n.event===`timer`&&t.push({id:n.id,name:e,kind:`timer`,jobType:null})}return t}function adHocTestCase(e,t,n,r,i){let a=[{type:`CREATE_PROCESS_INSTANCE`,processDefinitionSelector:{processDefinitionId:e},variables:t}],o={},s=new Map;r.forEach(e=>{let t=jobTypeOf$1(e);t&&s.set(t,(s.get(t)??0)+1)});for(let[e,t]of n){let n=r.get(e);if(!n||t.kind===`real`)continue;let i=jobTypeOf$1(n),c=!!i&&s.get(i)===1;t.kind===`fire`?o[e]={then:`fire`}:t.kind===`ask`?o[e]={then:`hold`}:t.kind===`fail`?o[e]={then:`complete`,fail:t.times,variables:t.variables}:t.kind===`error`?c?a.push({type:`MOCK_JOB_WORKER_THROW_BPMN_ERROR`,jobType:i,errorCode:t.errorCode,variables:t.variables}):o[e]={then:`error`,errorCode:t.errorCode,variables:t.variables}:c?a.push({type:`MOCK_JOB_WORKER_COMPLETE_JOB`,jobType:i,variables:t.variables}):o[e]={then:`complete`,variables:t.variables}}let c={name:i,instructions:a};return Object.keys(o).length&&(c[`x-penstock`]={behaviours:o}),c}function writtenVariables(e){let t=new Map;for(let n of e.steps)for(let e of n.changed)t.set(e.name,e.value);return[...t].map(([e,t])=>({name:e,value:t}))}function recordedTestCase(e,t,n,r){let[i,...a]=e.testCase.instructions,o=[i,...a.filter(e=>e.type===`MOCK_JOB_WORKER_COMPLETE_JOB`||e.type===`MOCK_JOB_WORKER_THROW_BPMN_ERROR`),...e.recorded],s=e.trace,c={processDefinitionId:i.processDefinitionSelector.processDefinitionId};if(s){let e=s.steps.filter(e=>e.state===`COMPLETED`).map(e=>({elementId:e.elementId})),t=s.steps.filter(e=>e.state===`ACTIVE`).map(e=>({elementId:e.elementId}));e.length&&o.push({type:`ASSERT_ELEMENT_INSTANCES`,processInstanceSelector:c,elementSelectors:e,state:`IS_COMPLETED`}),t.length&&o.push({type:`ASSERT_ELEMENT_INSTANCES`,processInstanceSelector:c,elementSelectors:t,state:`IS_ACTIVE`});let r=new Map(writtenVariables(s).map(e=>[e.name,e.value])),i=Object.fromEntries(n.filter(e=>r.has(e)).map(e=>[e,r.get(e)]));Object.keys(i).length&&o.push({type:`ASSERT_VARIABLES`,processInstanceSelector:c,variables:i}),o.push({type:`ASSERT_PROCESS_INSTANCE`,processInstanceSelector:c,state:s.state===`COMPLETED`?`IS_COMPLETED`:s.state===`TERMINATED`?`IS_TERMINATED`:`IS_ACTIVE`})}let l=Object.fromEntries(Object.entries(e.testCase[`x-penstock`]?.behaviours??{}).filter(([,e])=>e.then!==`hold`)),u={};Object.keys(l).length&&(u.behaviours=l),s&&(u.recorded={from:`run`,instance:s.instance,engine:x(s.engine)??`camunda-7`,at:r.toISOString()});let d={name:t,instructions:o};return Object.keys(u).length&&(d[`x-penstock`]=u),d}async function sweepLeftovers(e,t,n){let r=[],i=[];for(let a of await t.list())if(!(n-a.at<=9e5)){a.instance&&await e.cancel(a.instance).catch(()=>void 0);try{await e.remove(a.deployment)}catch(e){if(!(e instanceof M&&e.status===404)){i.push(a.deployment);continue}}await t.drop(a.deployment),r.push(a.deployment)}return{removed:r,kept:i}}function storageLedger(e,t,n){let read=()=>{try{let n=JSON.parse(e.getItem(t)??`{}`);return n&&typeof n==`object`&&!Array.isArray(n)?n:{}}catch{return{}}},list=()=>{let e=read()[n];return Array.isArray(e)?e:[]},write=r=>{let i=read();r.length?i[n]=r:delete i[n],e.setItem(t,JSON.stringify(i))};return{list:async()=>list(),add:async e=>write([...list().filter(t=>t.deployment!==e.deployment),e]),drop:async e=>write(list().filter(t=>t.deployment!==e))}}function builds(e){return t(`app.testCases.count.testBuilds`,{count:e})}function leftoverLines(e){return[...e.removed.length?[t(`app.testCases.leftovers.removed`,{builds:builds(e.removed.length)})]:[],...e.kept.length?[t(`app.testCases.leftovers.kept`,{builds:builds(e.kept.length)})]:[]]}var Pn=/\.(bpmn20\.xml|bpmn\.xml|bpmn)$/i,Fn=[`process`,`decision`,`form`];function normal(e){return e.replace(/\\/g,`/`)}function nameOf(e){return normal(e).split(`/`).pop()??e}function kindOf$2(e){return Pn.test(e)?`process`:/\.dmn$/i.test(e)?`decision`:/\.form$/i.test(e)?`form`:null}e(kindOf$2,`kindOf`);function nearness(e,t){let n=normal(e).split(`/`).slice(0,-1),r=normal(t).split(`/`).slice(0,-1),i=0;for(;i<n.length&&i<r.length&&n[i]===r[i];)i+=1;return i}async function usedBy(e){let t=[...stepsOf(await T(e)).values()],ids=e=>[...new Set(t.map(e).filter(e=>!!e))];return{process:ids(e=>e.calledProcess),decision:ids(e=>e.decision),form:ids(e=>e.form)}}async function testBuildResources(e,t){let n=[{path:e.path,name:nameOf(e.path),content:e.content}],r=new Set([normal(e.path)]),i={process:new Set,decision:new Set,form:new Set},a=await usedBy(e.content);declaredIds(`process`,e.content).forEach(e=>i.process.add(e));let o=new Map,scan=async e=>{let n=[];for(let i of t){if(kindOf$2(i.path)!==e||r.has(normal(i.path)))continue;let t=o.get(i.path);if(!t){let n=await i.read().catch(()=>``);t={content:n,ids:declaredIds(e,n)},o.set(i.path,t)}n.push({path:i.path,...t})}return n};for(;Fn.some(e=>a[e].some(t=>!i[e].has(t)));)for(let t of Fn){let o=a[t].filter(e=>!i[t].has(e));if(a[t]=[],o.length===0)continue;let s=await scan(t);for(let c of o){i[t].add(c);let o=s.filter(e=>e.ids.includes(c)&&!r.has(normal(e.path))).sort((t,n)=>nearness(e.path,n.path)-nearness(e.path,t.path))[0];if(o&&(r.add(normal(o.path)),n.push({path:o.path,name:nameOf(o.path),content:o.content}),o.ids.forEach(e=>i[t].add(e)),t===`process`)){let e=await usedBy(o.content);Fn.forEach(t=>a[t].push(...e[t]))}}}return n}function testCaseFileByProcessId(e,t){if(e.length===0)return null;let n=new Set(e),starts=e=>Array.isArray(e?.instructions)&&e.instructions.some(e=>e?.type===`CREATE_PROCESS_INSTANCE`&&n.has(e.processDefinitionSelector?.processDefinitionId??``));return t.find(e=>(parseTestCases(e.content).file?.testCases??[]).some(starts))?.path??null}async function withLinkedResources(e,t){let n=[],r=new Set,take=e=>{let t=normal(e.path);r.has(t)||(r.add(t),n.push(e))};for(let n of e)Pn.test(n.path)?(await testBuildResources(n,t)).forEach(take):take({path:n.path,name:nameOf(n.path),content:n.content});return n}function inProject(e){let t=e.replace(/\\/g,`/`).lastIndexOf(`/.penstock/runs/`);return t>=0?e.replace(/\\/g,`/`).slice(t+1):e}function newSession(){return{swept:new Set,names:new Set}}function refusedCase(e,t,n){let r=t.join(`; `);return n?.({kind:`testStarted`,testCase:e}),n?.({kind:`testFinished`,testCase:e,outcome:`failed`,message:r,durationMs:0,trace:null}),{result:{outcome:`failed`,message:r,trace:null,recorded:[]},kept:null,durationMs:0}}async function runCase(e,t){let n=caseProblems(e);if(n.length>0)return refusedCase(e.name,n,t.emit);if(!t.session.swept.has(t.key)){t.session.swept.add(t.key);for(let e of leftoverLines(await sweepLeftovers(t.engine,t.builds,Date.now())))await t.note?.(e)}let r=0,i=await runTestCase(e,{engine:t.engine,resources:t.resources,runId:t.runId,signal:t.signal,builds:t.builds,onWait:t.onWait,stepTimeoutMs:t.stepTimeoutMs,pollMs:t.pollMs,settleReads:t.settleReads,emit:e=>{e.kind===`testFinished`&&(r=e.durationMs),t.emit?.(e)}});return{result:i,kept:i.trace&&t.keep?await t.keep(i.trace,traceName(e.name,t.session.names)):null,durationMs:r}}var In=`__debug`,Ln=`penstock-debug-`,Rn=`element`,zn=`penstockElement`,Bn=`P1D`,Vn=`Penstock debugger`,Hn=new Set([`bpmn:ParallelGateway`,`bpmn:InclusiveGateway`,`bpmn:ComplexGateway`]),Un=/\sid="([^"]*)"/g,InstrumentError=class extends Error{};function debugProcessId(e){return`${e}${In}`}function debugTopic(e){return`${Ln}${safeSession(e)}`}function safeSession(e){let t=e.replace(/[^A-Za-z0-9-]+/g,`-`).replace(/^-+|-+$/g,``);return t===``?`session`:t}function canHaveBreakpoint(e){let t=e?.$type;return typeof t!=`string`||typeof e?.id!=`string`||e.id===``||e.isForCompensation===!0||t===`bpmn:SubProcess`&&e.triggeredByEvent===!0?!1:t.endsWith(`Task`)||t.endsWith(`SubProcess`)||t===`bpmn:Transaction`||t===`bpmn:CallActivity`||t.endsWith(`Gateway`)||t===`bpmn:IntermediateCatchEvent`||t===`bpmn:IntermediateThrowEvent`}function hasFlowElements(e){return Array.isArray(e?.flowElements)}function idsIn(e){let t=new Set;for(let n of e.matchAll(Un))t.add(n[1]);return t}function fresh(e,t){let n=t;for(let r=2;e.has(n);r+=1)n=`${t}_${r}`;return e.add(n),n}function removeFrom(e,t){if(!e)return;let n=e.indexOf(t);n>=0&&e.splice(n,1)}function executable(e){return e.isExecutable!==!1}function planes(e){return(e.diagrams??[]).map(e=>e?.plane).filter(Boolean)}function dropFromDiagrams(e,t){if(t.size!==0)for(let n of planes(e))Array.isArray(n.planeElement)&&(n.planeElement=n.planeElement.filter(e=>!t.has(e?.bpmnElement)))}function dropTriggers(e){let t=new Set,n=[],r=e.flowElements??[],i=r.filter(e=>e.$type===`bpmn:StartEvent`),typed=e=>Array.isArray(e.eventDefinitions)&&e.eventDefinitions.length>0,a=i.find(e=>!typed(e))??i[0];if(!a)return{dropped:n,removed:t};typed(a)&&(a.set(`eventDefinitions`,void 0),n.push(a.id));for(let e of i)if(e!==a&&typed(e)){n.push(e.id),t.add(e);for(let n of r)n.$type===`bpmn:SequenceFlow`&&n.sourceRef===e&&(t.add(n),removeFrom(n.targetRef?.incoming,n))}return t.size>0&&(e.flowElements=r.filter(e=>!t.has(e))),{dropped:n,removed:t}}function breakpointTask(e,t,n){let{moddle:r}=e;if(e.camunda8){let i=r.create(`zeebe:TaskDefinition`,{type:e.topic}),a=r.create(`zeebe:Header`,{key:Rn,value:n.id}),o=r.create(`zeebe:TaskHeaders`,{values:[a]}),s=r.create(`bpmn:ExtensionElements`,{values:[i,o]});return r.create(`bpmn:ServiceTask`,{id:t,extensionElements:s})}let i=r.create(`camunda:InputParameter`,{name:zn,value:n.id}),a=r.create(`camunda:InputOutput`,{inputParameters:[i]}),o=r.create(`bpmn:ExtensionElements`,{values:[a]}),s=r.create(`bpmn:ServiceTask`,{id:t,extensionElements:o});return s.set(`camunda:type`,`external`),s.set(`camunda:topic`,e.topic),s}function guard(e,t,n,r,i,a){let o=fresh(e.used,`${n.id}__breakpoint${i}`),s=breakpointTask(e,o,n),c=e.moddle.create(`bpmn:SequenceFlow`,{id:fresh(e.used,`${o}__flow`),sourceRef:s,targetRef:n});s.$parent=t,c.$parent=t;let l=s.get(`incoming`);for(let e of r)e.targetRef=s,l.push(e);return s.get(`outgoing`).push(c),a.push(s,c),e.breakpoints.set(o,n.id),c}function instrumentScope(e,t,n){let r=t.flowElements??=[],i=new Map;for(let e of r){if(e.$type!==`bpmn:SequenceFlow`||!e.targetRef)continue;let t=i.get(e.targetRef);t?t.push(e):i.set(e.targetRef,[e])}let a=[];for(let o of r){if(hasFlowElements(o)&&n.push(o),!canHaveBreakpoint(o)||e.only&&!e.only.has(o.id))continue;let r=i.get(o);if(!r||r.length===0||r.some(e=>e.sourceRef?.$type===`bpmn:EventBasedGateway`))continue;e.elements.push(o.id);let s=Hn.has(o.$type)&&r.length>1?r.map((n,r)=>guard(e,t,o,[n],`_${r+1}`,a)):[guard(e,t,o,r,``,a)],c=new Set(r);o.incoming=[...(o.incoming??[]).filter(e=>!c.has(e)),...s]}for(let e of a)r.push(e)}function pointCallsAtCopies(e,t){let n=[...e];for(;n.length>0;){let e=n.pop();for(let r of e.flowElements??[]){if(hasFlowElements(r)&&n.push(r),r.$type!==`bpmn:CallActivity`)continue;let e=r.calledElement;typeof e==`string`&&t.has(e)&&(r.calledElement=t.get(e));let i=r.extensionElements?.values?.find(e=>e.$type===`zeebe:CalledElement`);i&&typeof i.processId==`string`&&t.has(i.processId)&&(i.processId=t.get(i.processId))}}}function copyIds(e,t){let n=new Set(e.map(e=>e.id)),r=new Map,i=new Set;for(let a of e){let e=debugProcessId(a.id);for(;t.has(e)&&!n.has(e)||i.has(e);)e=`${e}_`;i.add(e),r.set(a.id,e)}return i.forEach(e=>t.add(e)),r}async function instrument(e,n){let r=await T(e,g(n.engine));if(!r)throw new InstrumentError(t(`app.processDebug.problem.unreadable`));let i=(r.rootElements??[]).filter(e=>e.$type===`bpmn:Process`),a=i.filter(executable);if(a.length===0)throw new InstrumentError(t(`app.processDebug.problem.noProcess`));let o=n.processId===void 0?a[0]:a.find(e=>e.id===n.processId);if(!o)throw new InstrumentError(t(`app.processDebug.problem.unknownProcess`,{process:n.processId??``}));let s=idsIn(e),c=copyIds(i,s),l=o.id,u=debugTopic(n.sessionId),d={moddle:w(r),topic:u,used:s,only:n.only,breakpoints:new Map,elements:[],camunda8:h(n.engine)},p=[];for(let e of i){if(!executable(e))continue;let{dropped:t,removed:n}=dropTriggers(e);p.push(...t),dropFromDiagrams(r,n);let i=[e];for(;i.length>0;)instrumentScope(d,i.pop(),i);!d.camunda8&&!e.get(`camunda:historyTimeToLive`)&&e.set(`camunda:historyTimeToLive`,Bn)}pointCallsAtCopies(i,c);for(let e of i)e.id=c.get(e.id);return r.set(`exporter`,Vn),r.set(`exporterVersion`,safeSession(n.sessionId)),{xml:await f(r),sourceProcessId:l,processId:c.get(l),topic:u,breakpoints:d.breakpoints,elements:d.elements,triggersRemoved:p}}function cancelInstanceCall(e,t){return e===`CAMUNDA_8`?{method:`POST`,path:`/process-instances/${encodeURIComponent(t)}/cancellation`,body:`{}`}:{method:`DELETE`,path:`/process-instance/${encodeURIComponent(t)}`}}function retryIncidentCall(e,t){return{method:`POST`,path:`/incidents/${encodeURIComponent(t??e)}/resolution`,body:`{}`}}function publishMessageCall(e,t){if(e===`CAMUNDA_8`){let e={name:t.name};return t.correlationKey!==void 0&&(e.correlationKey=t.correlationKey),t.variables!==void 0&&(e.variables=t.variables),t.timeToLive!==void 0&&(e.timeToLive=t.timeToLive),{method:`POST`,path:`/messages/publication`,body:JSON.stringify(e)}}let n={messageName:t.name};return t.correlationKey!==void 0&&(n.businessKey=t.correlationKey),t.variables!==void 0&&(n.processVariables=E(t.variables)),{method:`POST`,path:`/message`,body:JSON.stringify(n)}}function broadcastSignalCall(e,t){if(e===`CAMUNDA_8`){let e={signalName:t.name};return t.variables!==void 0&&(e.variables=t.variables),{method:`POST`,path:`/signals/broadcast`,body:JSON.stringify(e)}}let n={name:t.name};return t.variables!==void 0&&(n.variables=E(t.variables)),{method:`POST`,path:`/signal`,body:JSON.stringify(n)}}function parseBody(e){if(!e)return null;try{return JSON.parse(e)}catch{return e}}function reasonOf$2(e){if(e.status===0)return e.body;try{let t=JSON.parse(e.body),n=[t.message,t.detail,t.title,t.errorMessage].find(e=>typeof e==`string`);if(typeof n==`string`)return n}catch{return e.body.slice(0,300)}return e.body.slice(0,300)}e(reasonOf$2,`reasonOf`);function parseEngineAnswer(e){if(e.status>=200&&e.status<300)return{ok:!0,status:e.status,data:parseBody(e.body)};let n=reasonOf$2(e),r=e.status===401||e.status===403?t(`app.live.credentialsMayNotAllow`,{status:e.status}):n||t(`app.live.answeredStatus`,{status:e.status});return{ok:!1,status:e.status,problem:r}}var Wn=`penstock-debug`,Gn=432e5,DebugEngineError=class extends Error{status;constructor(e,t){super(e),this.status=t}},H=encodeURIComponent;function reasonOf$1(e){if(e.status===0)return e.body;try{let t=JSON.parse(e.body),n=[t.message,t.detail,t.title].find(e=>typeof e==`string`);if(typeof n==`string`&&n!==``)return n}catch{return e.body.slice(0,200)}return e.body.slice(0,200)}e(reasonOf$1,`reasonOf`);function refusal(e){if(e.status===0)return new DebugEngineError(e.body||t(`app.processDebug.problem.unreachable`),0);if(e.status===401||e.status===403)return new DebugEngineError(t(`app.live.credentialsMayNotAllow`,{status:e.status}),e.status);let n=reasonOf$1(e);return new DebugEngineError(n?t(`app.live.answeredStatus`,{status:e.status})+`: ${n}`:t(`app.live.answeredStatus`,{status:e.status}),e.status)}function succeeded(e){if(e.status<200||e.status>=300)throw refusal(e);return e}function bodyOf(e){if(succeeded(e),e.body.trim()===``)return null;try{return JSON.parse(e.body)}catch{throw new DebugEngineError(t(`app.live.answeredNotJson`),e.status)}}function list(e){return Array.isArray(e)?e:[]}function text$2(e){return e==null?``:String(e)}e(text$2,`text`);function debugDeployCall(e,t,n,r){return O({engine:e,name:t,source:`penstock-debug`,changedOnly:!1,tenantId:r??null},[{name:`${t}.bpmn`,content:n}])}function parseDebugDeployment(e,n,r){succeeded(r);let i=re(e,r.body).filter(e=>e.kind===`process`),a=i.find(e=>e.key===n);if(!a||a.id===``)throw new DebugEngineError(t(`app.processDebug.problem.notDeployed`,{process:n}),r.status);if(e===`CAMUNDA_8`)return{deployment:i.map(e=>e.id).filter(Boolean).join(`,`),definition:a.id};let o=``;try{o=text$2(JSON.parse(r.body).id)}catch{o=``}if(o===``)throw new DebugEngineError(t(`app.live.answeredNotJson`),r.status);return{deployment:o,definition:a.id}}function debugStartCall(e,t,n){return D(e,t,n)}function parseDebugStart(e,t){succeeded(t);try{return A(e,t)}catch(e){throw new DebugEngineError(e instanceof Error?e.message:String(e),t.status)}}function fetchBreakpointsCall(e,t,n=10){return e===`CAMUNDA_8`?{method:`POST`,path:`/jobs/activation`,body:JSON.stringify({type:t,worker:Wn,timeout:Gn,maxJobsToActivate:n,requestTimeout:-1})}:{method:`POST`,path:`/external-task/fetchAndLock`,body:JSON.stringify({workerId:Wn,maxTasks:n,topics:[{topicName:t,lockDuration:Gn,deserializeValues:!1}]})}}function parseBreakpoints(e,t,n){let r=bodyOf(t);return e===`CAMUNDA_8`?(r&&typeof r==`object`?list(r.jobs):[]).map(e=>{let t=text$2(e?.elementId),r=e?.customHeaders?.[Rn],i=e?.variables&&typeof e.variables==`object`&&!Array.isArray(e.variables)?{...e.variables}:{};return{key:text$2(e?.jobKey),element:typeof r==`string`&&r!==``?r:n.get(t)??``,breakpoint:t,instance:text$2(e?.processInstanceKey),variables:i}}).filter(e=>e.key!==``):list(r).map(e=>{let t=k(e?.variables),r=t[zn];delete t[zn];let i=text$2(e?.activityId);return{key:text$2(e?.id),element:n.get(i)??(typeof r==`string`?r:``),breakpoint:i,instance:text$2(e?.processInstanceId),variables:t}}).filter(e=>e.key!==``)}function completeBreakpointCall(e,t,n){return e===`CAMUNDA_8`?{method:`POST`,path:`/jobs/${H(t.key)}/completion`,body:JSON.stringify(Object.keys(n).length>0?{variables:n}:{})}:{method:`POST`,path:`/external-task/${H(t.key)}/complete`,body:JSON.stringify({workerId:Wn,variables:E(n)})}}function changedVariables(e,t){let n={};for(let r of Object.keys(t))Object.hasOwn(e,r)&&JSON.stringify(e[r])===JSON.stringify(t[r])||Object.defineProperty(n,r,{value:t[r],enumerable:!0,writable:!0,configurable:!0});return n}function instanceStatusCall(e,t){return e===`CAMUNDA_8`?{method:`GET`,path:`/process-instances/${H(t)}`}:{method:`GET`,path:`/process-instance/${H(t)}`}}function parseInstanceStatus(e,t){if(e!==`CAMUNDA_8`&&t.status===404)return{state:`finished`};let n=bodyOf(t);if(e===`CAMUNDA_8`){let e=text$2(n?.state);return e===`COMPLETED`||e===`TERMINATED`||e===`CANCELED`?{state:`finished`}:n?.hasIncident===!0?{state:`incident`}:{state:`active`}}return n?.ended===!0?{state:`finished`}:{state:`active`}}function incidentCall(e,t){return e===`CAMUNDA_8`?{method:`POST`,path:`/incidents/search`,body:JSON.stringify({filter:{processInstanceKey:t,state:`ACTIVE`},page:{limit:1}})}:{method:`GET`,path:`/incident?processInstanceId=${H(t)}&maxResults=1`}}function parseIncident(e,n){let r=bodyOf(n),i=e===`CAMUNDA_8`?list(r?.items)[0]:list(r)[0];if(!i)return null;let a=e===`CAMUNDA_8`?i.errorMessage??i.errorType:i.incidentMessage??i.incidentType;return typeof a==`string`&&a!==``?a:t(`app.processDebug.problem.incident`)}function findInstancesCall(e,t){return e===`CAMUNDA_8`?{method:`POST`,path:`/process-instances/search`,body:JSON.stringify({filter:{processDefinitionKey:t,state:`ACTIVE`},page:{limit:100}})}:{method:`GET`,path:`/process-instance?processDefinitionId=${H(t)}&maxResults=100`}}function parseInstances(e,t){let n=bodyOf(t);return(e===`CAMUNDA_8`?list(n?.items).map(e=>e?.processInstanceKey):list(n).map(e=>e?.id)).map(text$2).filter(e=>e!==``)}function cancelDebugInstanceCall(e,t){return cancelInstanceCall(e,t)}function deleteDebugDeploymentCalls(e,t){return e===`CAMUNDA_8`?t.split(`,`).filter(Boolean).map(e=>({method:`POST`,path:`/resources/${H(e)}/deletion`,body:`{}`})):t===``?[]:[{method:`DELETE`,path:`/deployment/${H(t)}?cascade=true`}]}var Kn=new Set([404,409]);function reasonOf(e){return refusal(e).message}async function removeCopy(e,n){let r=[],i=new Set(n.instances.filter(Boolean)),a=h(e.engine)?n.definition?[n.definition]:n.deployment.split(`,`):n.definition?[n.definition]:[];for(let n of a.filter(Boolean)){let a=await e.call(findInstancesCall(e.engine,n));if(a.status!==404)try{parseInstances(e.engine,a).forEach(e=>i.add(e))}catch(e){r.push(t(`app.processDebug.cleanup.searchFailed`,{reason:e instanceof Error?e.message:String(e)}))}}let o=[];for(let n of i){let r=await e.call(cancelDebugInstanceCall(e.engine,n));r.status>=200&&r.status<300||Kn.has(r.status)||o.push(t(`app.processDebug.cleanup.cancelFailed`,{instance:n,reason:reasonOf(r)}))}let s=e.attempts??3,c=deleteDebugDeploymentCalls(e.engine,n.deployment),l=null;for(let r=1;r<=s;r+=1){l=null;for(let r of c){let i=await e.call(r);if(!(i.status>=200&&i.status<300)&&i.status!==404){l=t(`app.processDebug.cleanup.deleteFailed`,{deployment:n.deployment,reason:reasonOf(i)});break}}if(l===null)break;r<s&&await e.sleep((e.backoffMs??500)*r)}return(h(e.engine)||l!==null)&&r.push(...o),l!==null&&r.push(l),r}async function sweepDebugLeftovers(e,t,n){let r=[],i=[];for(let a of await t.list())n-a.at<=3e5||((await removeCopy(e,{deployment:a.deployment,instances:a.instance?[a.instance]:[]})).length===0?(await t.drop(a.deployment),r.push(a.deployment)):i.push(a.deployment));return{removed:r,kept:i}}var qn={now:()=>Date.now(),sleep:(e,t)=>new Promise(n=>{if(t?.aborted){n();return}let r=setTimeout(done,e);function done(){clearTimeout(r),t?.removeEventListener(`abort`,done),n()}t?.addEventListener(`abort`,done,{once:!0})})},Jn={minMs:300,maxMs:2e3,factor:1.5,requestMs:2e4,pausedMs:3e3,touchMs:6e4,failures:3,waitingAfter:5};function newSessionId(){return`${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`}function messageOf$1(e){return e instanceof Error?e.message:String(e)}e(messageOf$1,`messageOf`);function transient(e){return e instanceof DebugEngineError&&(e.status===0||e.status>=500||e.status===429)}var DebugSession=class{sessionId;options;clock;pace;abort=new AbortController;user;listeners=new Set;settledWaiters=[];state;plan=null;deployment=null;definition=null;instance=null;mode;current=null;queue=[];command=null;wake=null;loop=null;cleaning=null;starting=!1;starter=null;touched=0;passed=0;constructor(e){this.options=e,this.sessionId=safeSession(e.sessionId??newSessionId()),this.clock=e.clock??qn,this.pace={...Jn,...e.pace},this.user=new Set(e.breakpoints??[]),this.mode=e.mode??`continue`,this.state={phase:`idle`,processId:e.processId,debugProcessId:null,instance:null,element:null,variables:{},atBreakpoint:!1,waiting:!1,message:null,cleanup:`none`,cleanupProblems:[],leftover:null,visited:0}}get snapshot(){return this.state}get processId(){return this.options.processId}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}setBreakpoints(e){this.user.clear();for(let t of e)this.user.add(t)}settled(){return this.isSettled()?Promise.resolve(this.state):new Promise(e=>this.settledWaiters.push(e))}async start(){return this.starting||this.state.phase!==`idle`||(this.starting=!0,this.update({phase:`deploying`,message:null}),this.starter=this.begin().catch(e=>this.fail(e instanceof InstrumentError?e.message:messageOf$1(e))),await this.starter),this.state}continue(e){return this.resume(`continue`,e)}step(e){return this.resume(`step`,e)}async stop(){return this.abort.abort(),this.release(),await this.starter?.catch(()=>void 0),await this.loop?.catch(()=>void 0),this.terminal()||this.update({phase:`stopped`,message:t(`app.processDebug.message.stopped`),element:null,variables:{},atBreakpoint:!1,waiting:!1,visited:this.passed}),await this.cleanup(),this.state}async retryCleanup(){return this.state.cleanup===`failed`&&(this.cleaning=null,await this.cleanup()),this.state}terminal(){return this.state.phase===`finished`||this.state.phase===`failed`||this.state.phase===`stopped`}isSettled(){return this.state.phase===`paused`||this.terminal()}update(e){let t={...this.state,...e};if(!Object.keys(e).every(e=>JSON.stringify(this.state[e])===JSON.stringify(t[e]))){this.state=t;for(let e of[...this.listeners])try{e(t)}catch{this.listeners.delete(e)}this.isSettled()&&this.settledWaiters.splice(0).forEach(e=>e(t))}}release(){let e=this.wake;this.wake=null,e?.()}async call(e){let n=Promise.resolve().then(()=>this.options.ask(e)).catch(e=>({status:0,body:messageOf$1(e)})),r=new AbortController,i=this.clock.sleep(this.pace.requestMs,r.signal).then(()=>r.signal.aborted?new Promise(()=>void 0):{status:0,body:t(`app.processDebug.problem.timedOut`,{seconds:Math.round(this.pace.requestMs/1e3)})});try{return await Promise.race([n,i])}finally{r.abort()}}async begin(){let{engine:e,processId:t,xml:n}=this.options,r=await instrument(n,{engine:e,sessionId:this.sessionId,processId:t});if(this.plan=r,this.update({debugProcessId:r.processId}),this.abort.signal.aborted)return;let i=parseDebugDeployment(e,r.processId,await this.call(debugDeployCall(e,r.processId,r.xml,this.options.tenantId)));this.deployment=i.deployment,this.definition=i.definition,await this.remember(),this.update({leftover:{deployment:i.deployment,instance:null}}),!this.abort.signal.aborted&&(this.instance=parseDebugStart(e,await this.call(debugStartCall(e,r.processId,this.options.variables??{}))),await this.remember(),this.update({instance:this.instance,leftover:{deployment:i.deployment,instance:this.instance}}),!this.abort.signal.aborted&&(this.update({phase:`running`}),this.loop=this.run()))}async remember(){this.options.ledger&&this.deployment&&(this.touched=this.clock.now(),await this.options.ledger.add({deployment:this.deployment,at:this.touched,...this.instance?{instance:this.instance}:{}}).catch(()=>void 0))}async touch(){this.clock.now()-this.touched>=this.pace.touchMs&&await this.remember()}resume(e,t){return this.state.phase!==`paused`||this.command?Promise.resolve(this.state):(this.command={mode:e,variables:t??null},this.release(),this.settledAfter())}settledAfter(){return new Promise(e=>{this.settledWaiters.push(e)})}async fail(e){this.terminal()||this.update({phase:`failed`,message:e,element:null,variables:{},atBreakpoint:!1,waiting:!1,visited:this.passed}),await this.cleanup()}async finish(e){this.terminal()||this.update({phase:`finished`,message:e,element:null,variables:{},atBreakpoint:!1,waiting:!1,visited:this.passed}),await this.cleanup()}cleanup(){return this.cleaning??=this.removeCopy(),this.cleaning}async removeCopy(){if(!this.deployment){this.update({cleanup:`none`});return}this.update({cleanup:`pending`,cleanupProblems:[]});let e=this.deployment,t;try{t=await removeCopy({engine:this.options.engine,call:e=>this.call(e),sleep:e=>this.clock.sleep(e)},{deployment:e,definition:this.definition??void 0,instances:this.instance?[this.instance]:[]})}catch(e){t=[messageOf$1(e)]}t.length===0?(await this.options.ledger?.drop(e).catch(()=>void 0),this.update({cleanup:`done`,cleanupProblems:[],leftover:null})):this.update({cleanup:`failed`,cleanupProblems:t})}async run(){let e=this.pace.minMs,n=0,r=0;for(;!this.abort.signal.aborted&&!this.terminal();)try{let t=await this.tick();if(n=0,t===`ended`)return;t===`idle`?(r+=1,r>=this.pace.waitingAfter&&this.update({waiting:!0}),e=Math.min(Math.round(e*this.pace.factor),this.pace.maxMs),await this.touch(),await this.clock.sleep(e,this.abort.signal)):(r=0,e=this.pace.minMs,this.state.waiting&&this.update({waiting:!1}))}catch(r){if(this.abort.signal.aborted)return;if(transient(r)&&n+1<this.pace.failures){n+=1,await this.clock.sleep(e,this.abort.signal);continue}let i=transient(r)?t(`app.processDebug.problem.unreachableAfter`,{attempts:n+1,reason:messageOf$1(r)}):messageOf$1(r);await this.fail(i);return}}async tick(){let{engine:e}=this.options,n=this.instance;if(this.state.phase===`paused`)return this.whilePaused();if(this.queue.length===0){let t=parseBreakpoints(e,await this.call(fetchBreakpointsCall(e,this.plan.topic)),this.plan.breakpoints);if(this.abort.signal.aborted)return`ended`;this.queue.push(...t)}if(this.queue.length>0)return this.reach(this.queue[0]);let r=parseInstanceStatus(e,await this.call(instanceStatusCall(e,n)));if(this.abort.signal.aborted)return`ended`;if(r.state===`finished`)return await this.finish(t(`app.processDebug.message.finished`)),`ended`;if(r.state===`incident`||e!==`CAMUNDA_8`){let r=parseIncident(e,await this.call(incidentCall(e,n)));if(this.abort.signal.aborted)return`ended`;if(r!==null)return await this.fail(t(`app.processDebug.message.incident`,{reason:r})),`ended`}return`idle`}async reach(e){return e.element===``||this.mode!==`step`&&!this.user.has(e.element)?(await this.complete(e,{}),this.abort.signal.aborted?`ended`:(this.queue.shift(),this.passed+=1,`worked`)):(this.queue.shift(),this.passed+=1,this.current=e,this.update({phase:`paused`,element:e.element,variables:e.variables,atBreakpoint:this.user.has(e.element),waiting:!1,message:null,visited:this.passed}),`paused`)}async complete(e,t){let n=await this.call(completeBreakpointCall(this.options.engine,e,t));n.status!==404&&succeeded(n)}async whilePaused(){let{engine:e}=this.options;for(;!this.abort.signal.aborted;){if(!this.command){let e=new AbortController;await new Promise(t=>{this.wake=t,this.clock.sleep(this.pace.pausedMs,e.signal).then(()=>t())}),e.abort(),this.wake=null}if(this.abort.signal.aborted)return`ended`;let n=this.command;if(n){let e=this.current,t=n.variables?changedVariables(e.variables,n.variables):{};return await this.complete(e,t),this.abort.signal.aborted?`ended`:(this.command=null,this.mode=n.mode,this.current=null,this.update({phase:`running`,element:null,variables:{},atBreakpoint:!1}),`worked`)}await this.touch();let r=parseInstanceStatus(e,await this.call(instanceStatusCall(e,this.instance)));if(this.abort.signal.aborted)return`ended`;if(r.state===`finished`)return await this.finish(t(`app.processDebug.message.endedElsewhere`)),`ended`}return`ended`}},DebugSessions=class{sessions=new Map;async begin(e){let t=this.sessions.get(e.processId);t&&await t.stop();let n=new DebugSession(e);return this.sessions.set(e.processId,n),n}get(e){return this.sessions.get(e)}async disposeAll(){let e=[...this.sessions.values()];this.sessions.clear(),await Promise.all(e.map(e=>e.stop().catch(()=>void 0)))}},Yn=`https://api.github.com/repos/camunda/connectors/releases?per_page=100`,U=/^[A-Za-z0-9_-][A-Za-z0-9._-]{0,127}$/,Xn=/^[A-Za-z0-9._-]+$/,Zn=/^(\d+)\.(\d+)\.(\d+)$/,Qn=/^[A-Za-z0-9_-][A-Za-z0-9._-]{0,127}$/,$n=/^[^/]+\/(connectors\/(?:[^/]+\/)+element-templates\/(?:[^/]+\/)*[^/]+\.json)$/,er=new Set([`src`,`test`,`tests`,`test-resources`,`testdata`,`fixtures`]),tr=/^data:image\/(?:png|jpe?g|gif|webp|svg\+xml|x-icon|vnd\.microsoft\.icon)[;,]/i,nr=/^\.tmp-(.+)-(\d{13})-[a-z0-9]+$/,rr=36e5,ir=24*rr,ar=6e4,or=536870912,sr=8388608,cr=1048576,lr=262144,ur=2,dr=`.index.json`,fr=`.state.json`,W=new TextDecoder,pr=new TextEncoder;function archiveUrl(e){if(!U.test(e))throw Error(`Not a release tag: ${e}`);return`https://codeload.github.com/camunda/connectors/tar.gz/refs/tags/${e}`}function pickReleaseTag(e){if(!Array.isArray(e))throw Error(`GitHub did not return a list of releases`);let t=null;for(let n of e){if(!n||typeof n!=`object`)continue;let{tag_name:e,draft:r,prerelease:i}=n;if(r!==!1||i!==!1||typeof e!=`string`||!Xn.test(e))continue;let a=Zn.exec(e);if(!a)continue;let o=a.slice(1).map(Number);(!t||compareParts(o,t.parts)>0)&&(t={tag:e,parts:o})}if(!t)throw Error(`GitHub lists no final camunda/connectors release`);return t.tag}function compareParts(e,t){for(let n=0;n<Math.max(e.length,t.length);n++){let r=(e[n]??0)-(t[n]??0);if(r!==0)return r}return 0}function templatePathOf(e){let t=$n.exec(e);if(!t)return null;let n=t[1];return n.split(`/`).some(e=>!Qn.test(e)||er.has(e.toLowerCase()))?null:n}function pastTime(e,t){if(!e)return null;let n=Date.parse(e);return Number.isNaN(n)||n>t+ar?null:n}function retryDelay(e){return e<=1?rr:ir}function refreshDue(e,t){let n=pastTime(e.checkedAt,t),r=pastTime(e.failedAt,t);return r!==null&&e.failures>0&&(n===null||r>=n)?t-r>=retryDelay(e.failures):n===null||t-n>=ir}function nextAttemptOf(e,t){let n=pastTime(e.failedAt,t);return n===null||e.failures===0?null:new Date(n+retryDelay(e.failures)).toISOString()}var mr={ref:null,previousRef:null,checkedAt:null,failedAt:null,failures:0,lastError:null};function stringOrNull(e){return typeof e==`string`?e:null}function refOrNull(e){return typeof e==`string`&&U.test(e)?e:null}async function readState(e){try{let t=(await e.file(`read`,fr)).content;if(!t)return{...mr};let n=JSON.parse(W.decode(t));return{ref:refOrNull(n.ref),previousRef:refOrNull(n.previousRef),checkedAt:stringOrNull(n.checkedAt),failedAt:stringOrNull(n.failedAt),failures:typeof n.failures==`number`&&Number.isInteger(n.failures)&&n.failures>0?n.failures:0,lastError:stringOrNull(n.lastError)}}catch{return{...mr}}}async function writeState(e,t){await e.file(`write`,fr,pr.encode(JSON.stringify(t,null,2)))}function isTemplate(e){if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return!(typeof t.id!=`string`||!t.id||t.id.length>256||typeof t.name!=`string`||!t.name||t.version!==void 0&&!(Number.isInteger(t.version)&&t.version>=0)||t.appliesTo!==void 0&&!(Array.isArray(t.appliesTo)&&t.appliesTo.every(e=>typeof e==`string`)))}function templatesIn(e){try{let t=JSON.parse(W.decode(e));return(Array.isArray(t)?t:[t]).filter(isTemplate)}catch{return[]}}function variantOf(e){return(typeof e.elementType==`string`?e.elementType:e.elementType?.value)||(e.appliesTo??[]).join(`|`)}function keyOf$1(e,t,n){return`${e}@${t??`_`}#${n}`}e(keyOf$1,`keyOf`);function strings(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function summarize(e,t,n){let r=e.version??null,i=typeof e.elementType?.value==`string`?e.elementType.value:null,a={},o=e.engines,s=typeof o==`object`&&o&&!Array.isArray(o)?o:{};for(let[e,t]of Object.entries(s))typeof t==`string`&&(a[e]=t);let c=e.icon?.contents,l=e.documentationRef;return{key:keyOf$1(e.id,r,variantOf(e)),ref:n,path:t,id:e.id,version:r,name:e.name,description:typeof e.description==`string`?e.description:null,appliesTo:strings(e.appliesTo),elementType:i,engines:a,category:typeof e.category?.name==`string`?e.category.name:null,keywords:[...new Set([...strings(e.keywords),...strings(e.metadata?.keywords)])],icon:typeof c==`string`&&c.length<=lr&&tr.test(c)?c:null,documentationRef:typeof l==`string`&&l.startsWith(`https://`)?l:null,deprecated:e.deprecated!==void 0&&e.deprecated!==!1,deprecatedMessage:typeof e.deprecated==`object`&&e.deprecated!==null&&typeof e.deprecated.message==`string`?e.deprecated.message:null}}function isSummary(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.key==`string`&&typeof t.id==`string`&&typeof t.name==`string`&&typeof t.path==`string`&&templatePathOf(`x/${t.path}`)===t.path&&Array.isArray(t.appliesTo)&&Array.isArray(t.keywords)}async function loadIndex(e,t){if(!U.test(t))return null;try{let n=(await e.file(`read`,`${t}/${dr}`)).content;if(!n)return null;let r=JSON.parse(W.decode(n));if(r.format!==ur||r.ref!==t||!Array.isArray(r.templates))return null;let i=r.templates.filter(isSummary).map(e=>({...e,ref:t}));return i.length>0?i:null}catch{return null}}function newestOf(e){let t=new Map;for(let n of e){let e=`${n.id}#${variantOf(n)}`,r=t.get(e);(!r||(r.version??-1)<(n.version??-1))&&t.set(e,n)}return[...t.values()].sort((e,t)=>e.name.localeCompare(t.name)||(e.elementType??``).localeCompare(t.elementType??``))}function buildCatalog(e,t,n){return{ref:e,checkedAt:n,templates:t,newest:newestOf(t)}}var hr=new WeakMap,G=new WeakMap;async function cachedCatalog(e,t){if(!t.ref)return null;let n=hr.get(e);if(n&&n.ref===t.ref)return n;let r=await loadIndex(e,t.ref);if(!r)return null;let i=buildCatalog(t.ref,r,t.checkedAt);return hr.set(e,i),i}function messageOf(e){return e instanceof Error?e.message:String(e)}async function fetchChecked(e,n){let r=await e.fetch(n);if(r.failure)throw Error(r.failure);if(r.status===403||r.status===429)throw Error(t(`app.connectors.githubRefused`,{status:r.status}));if(r.status!==200)throw Error(t(`app.connectors.githubAnswered`,{status:r.status}));if(r.body.byteLength>67108864)throw Error(t(`app.connectors.responseTooLarge`));return r.body}async function*gunzip(e,n){let r=new ReadableStream({start(t){t.enqueue(e),t.close()}}).pipeThrough(new DecompressionStream(`gzip`)).getReader(),i=0;try{for(;;){let e;try{e=await r.read()}catch{throw Error(t(`app.connectors.archiveDamaged`))}if(e.done)return;if(i+=e.value.byteLength,i>n)throw Error(t(`app.connectors.archiveTooLarge`));yield e.value}}finally{await r.cancel().catch(()=>void 0)}}var ByteQueue=class{chunks=[];offset=0;length=0;push(e){e.byteLength!==0&&(this.chunks.push(e),this.length+=e.byteLength)}take(e){let t=new Uint8Array(e),n=0;for(;n<e;){let r=this.chunks[0],i=r.byteLength-this.offset,a=Math.min(i,e-n);t.set(r.subarray(this.offset,this.offset+a),n),n+=a,this.consume(a,i)}return t}drop(e){let t=0;for(;t<e&&this.chunks.length>0;){let n=this.chunks[0].byteLength-this.offset,r=Math.min(n,e-t);t+=r,this.consume(r,n)}return t}consume(e,t){this.length-=e,e===t?(this.chunks.shift(),this.offset=0):this.offset+=e}};function field(e,t,n){let r=e.subarray(t,t+n),i=r.indexOf(0);return W.decode(i<0?r:r.subarray(0,i))}function octal(e,t,n){let r=field(e,t,n).trim();return/^[0-7]+$/.test(r)?parseInt(r,8):NaN}function checksumMatches(e){let t=0;for(let n=0;n<512;n++)t+=n>=148&&n<156?32:e[n];return octal(e,148,8)===t}function paxPath(e){let t=null;for(let n of W.decode(e).split(`
597
+ `)){let e=/^\d+ path=(.*)$/.exec(n);e&&(t=e[1])}return t}async function*tarEntries(e,n){let r=e[Symbol.asyncIterator](),i=new ByteQueue,damaged=()=>Error(t(`app.connectors.archiveDamaged`)),fill=async e=>{for(;i.length<e;){let e=await r.next();if(e.done)return!1;i.push(e.value)}return!0},skip=async e=>{let t=e;for(;t>0;){if(i.length===0&&!await fill(1))throw damaged();t-=i.drop(t)}},read=async e=>{if(!await fill(e))throw damaged();return i.take(e)},a=null;try{for(;;){if(!await fill(512))throw damaged();let e=i.take(512);if(e.every(e=>e===0))return;if(!checksumMatches(e))throw damaged();let t=octal(e,124,12);if(!Number.isSafeInteger(t))throw damaged();let r=Math.ceil(t/512)*512,o=String.fromCharCode(e[156]);if(o===`x`||o===`L`){if(t>cr)throw damaged();let e=await read(t);a=o===`x`?paxPath(e)??a:W.decode(e).replace(/\0.*$/s,``),await skip(r-t);continue}if(o===`g`){await skip(r);continue}let s=field(e,345,155),c=field(e,0,100),l=a??(s?`${s}/${c}`:c);if(a=null,(o===`0`||o===`\0`||o===`7`)&&t<=sr&&n(l)){let e=await read(t);await skip(r-t),yield{path:l,data:e}}else await skip(r)}}finally{await r.return?.(void 0)}}async function exists(e,t){return(await e.file(`exists`,t)).pathExists===!0}async function commit(e,t,n){try{await e.file(`rename`,t,void 0,n);return}catch(r){if(await loadIndex(e,n)){await e.file(`delete`,t).catch(()=>void 0);return}if(!await exists(e,n))throw r}await e.file(`delete`,n),await e.file(`rename`,t,void 0,n)}async function download(e,n,r){let i=await fetchChecked(e,archiveUrl(n)),a=`.tmp-${n}-${r()}-${Math.random().toString(36).slice(2,10)||`x`}`;await e.file(`mkdirs`,a);try{let r=new Map,o=tarEntries(gunzip(i,or),e=>templatePathOf(e)!==null);for await(let t of o){let i=templatePathOf(t.path),o=templatesIn(t.data);if(i&&o.length!==0){await e.file(`write`,`${a}/${i}`,t.data);for(let e of o){let t=summarize(e,i,n);r.has(t.key)||r.set(t.key,t)}}}if(r.size===0)throw Error(t(`app.connectors.archiveHasNoTemplates`));let s=[...r.values()],c={format:ur,ref:n,templates:s.map(e=>({...e,ref:void 0}))};return await e.file(`write`,`${a}/${dr}`,pr.encode(JSON.stringify(c))),await commit(e,a,n),s}catch(t){throw await e.file(`delete`,a).catch(()=>void 0),t}}async function prune(e,t,n){let r=(await e.file(`list`,``)).entries??[];for(let i of r){let r=nr.exec(i);(i.startsWith(`.tmp-`)?!r||n-Number(r[2])>rr:!i.startsWith(`.`)&&U.test(i)&&i!==t.ref&&i!==t.previousRef)&&await e.file(`delete`,i).catch(()=>void 0)}}async function refresh(e,t,n){let r=await fetchChecked(e,Yn),i;try{i=JSON.parse(W.decode(r))}catch{throw Error(`GitHub returned something that is not JSON`)}let a=pickReleaseTag(i),o=await loadIndex(e,a)??await download(e,a,n),s=t.previousRef===a?null:t.previousRef;t.ref&&t.ref!==a&&(s=t.ref);let c={ref:a,previousRef:s,checkedAt:new Date(n()).toISOString(),failedAt:null,failures:0,lastError:null};await writeState(e,c),await prune(e,c,n()).catch(()=>void 0);let l=buildCatalog(a,o,c.checkedAt);return hr.set(e,l),l}async function load(e,n,r){let i=await readState(e);if(!n&&!refreshDue(i,r())){let n=await cachedCatalog(e,i);if(n)return{catalog:n,error:null,nextAttempt:null};if(i.failures>0)return{catalog:null,error:i.lastError??t(`app.connectors.couldNotBeDownloaded`),nextAttempt:nextAttemptOf(i,r())}}try{return{catalog:await refresh(e,i,r),error:null,nextAttempt:null}}catch(t){let n={...i,failedAt:new Date(r()).toISOString(),failures:i.failures+1,lastError:messageOf(t)};return await writeState(e,n).catch(()=>void 0),{catalog:await cachedCatalog(e,i).catch(()=>null),error:n.lastError,nextAttempt:nextAttemptOf(n,r())}}}function getCatalog(e,t={}){let n=G.get(e);if(n)return n;let r=load(e,t.forceRefresh===!0,t.now??Date.now).finally(()=>{G.get(e)===r&&G.delete(e)});return G.set(e,r),r}function pick(e,t){return e.length===0?null:t?e.find(e=>e.elementType===t)??e.find(e=>e.appliesTo.includes(t))??e[0]:e[0]}async function loadTemplate(e,t){if(!U.test(t.ref)||templatePathOf(`x/${t.path}`)!==t.path)return null;let n=(await e.file(`read`,`${t.ref}/${t.path}`)).content;return n?templatesIn(n).find(e=>keyOf$1(e.id,e.version??null,variantOf(e))===t.key)??null:null}async function resolveTemplates(e,t){let n=await readState(e),r=[],i=await cachedCatalog(e,n).catch(()=>null);i&&r.push(i.templates);let a=n.previousRef?await loadIndex(e,n.previousRef):null;a&&r.push(a);let o=new Map,s=[];for(let n of t){let t=null;for(let i of r){let r=pick(i.filter(e=>e.id===n.id&&e.version===n.version),n.elementType);if(r&&(t=o.get(r.key)??await loadTemplate(e,r).catch(()=>null),t)){o.set(r.key,t);break}}t||s.push(n)}return{templates:[...o.values()],missing:s}}function versionOf(e){let t=/^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:[-+].*)?$/.exec(e.trim());return t?[Number(t[1]),Number(t[2]??0),Number(t[3]??0)]:null}function comparator(e,t){if(e===`*`||e.toLowerCase()===`x`)return!0;let n=/^(\^|~|>=|<=|>|<|=)?v?(\d+)(?:\.(\d+|x|\*))?(?:\.(\d+|x|\*))?(?:-[0-9A-Za-z.-]+)?$/i.exec(e);if(!n)return null;let[,r=`=`,i,a,o]=n,numeric=e=>e===void 0||!/^\d+$/.test(e)?void 0:Number(e),s=Number(i),c=numeric(a),l=c===void 0?void 0:numeric(o),u=[s,c??0,l??0],nextOf=()=>c===void 0?[s+1,0,0]:l===void 0?[s,c+1,0]:[s,c,l+1],at=e=>compareParts(t,e);switch(r){case`^`:{let e=s>0?[s+1,0,0]:c!==void 0&&c>0?[0,c+1,0]:nextOf();return at(u)>=0&&at(e)<0}case`~`:return at(u)>=0&&at(c===void 0?[s+1,0,0]:[s,c+1,0])<0;case`>=`:return at(u)>=0;case`>`:return at(nextOf())>=0;case`<`:return at(u)<0;case`<=`:return at(nextOf())<0;default:return at(u)>=0&&at(nextOf())<0}}function satisfiesEngine(e,t){let n=versionOf(t);if(!n)return null;let r=!1;for(let t of e.split(`||`).map(e=>e.trim()).filter(Boolean)){let e=t.split(/\s+/).map(e=>comparator(e,n));if(!e.some(e=>e===null)&&(r=!0,e.every(e=>e===!0)))return!0}return!r&&null}var gr=`https://docs.camunda.io/docs/guides/migrating-from-camunda-7/`,K=`${gr}migration-journey/migrate/`,_r=`${gr}code-conversion/`,vr=`https://docs.camunda.io/docs/components/modeler/bpmn/bpmn-coverage/`,q=`https://docs.camunda.io/docs/components/concepts/job-workers/`,J=`https://docs.camunda.io/docs/components/modeler/feel/what-is-feel/`,yr=`https://docs.camunda.io/docs/components/concepts/execution-listeners/`,br=`https://docs.camunda.io/docs/components/concepts/user-task-listeners/`,Y=`https://docs.camunda.io/docs/components/modeler/forms/camunda-forms-reference/`,xr=`https://docs.camunda.io/docs/components/modeler/bpmn/user-tasks/`,Sr=`https://docs.camunda.io/docs/components/concepts/messages/`,Cr=`https://docs.camunda.io/docs/components/concepts/variables/`,X=`https://docs.camunda.io/docs/components/modeler/dmn/`,wr=`https://docs.camunda.io/docs/guides/migrating-from-camunda-7/migration-tooling/data-migrator/`,Tr={"java-class":{severity:`error`,conversion:`automatic`,title:`Java class {className} becomes the job type {jobType}`,detail:`Camunda 8 does not run Java inside the engine. A service task creates a job, and a job worker in your application picks it up.`,action:`Write a job worker for {jobType}; Penstock generates one from the class.`,link:q},"delegate-expression":{severity:`error`,conversion:`automatic`,title:`Delegate {delegate} becomes the job type {jobType}`,detail:`Camunda 8 cannot look up a Spring bean. The task creates a job, and a job worker picks it up.`,action:`Write a job worker for {jobType}; Penstock generates one from the bean.`,link:q},"delegate-expression-dynamic":{severity:`error`,conversion:`manual`,title:`The delegate is chosen by the expression {expression}`,detail:`The bean is decided while the process runs, and a Camunda 8 job type is fixed or a FEEL expression over variables.`,action:`Give the task a job type, or a FEEL expression that picks one from a variable.`,link:q},expression:{severity:`error`,conversion:`automatic`,title:`The expression {expression} becomes the job type {jobType}`,detail:`Camunda 8 cannot call a bean method from the diagram. The call moves into a job worker.`,action:`Write a job worker for {jobType} that makes the call {expression} made.`,link:q},"expression-unknown":{severity:`error`,conversion:`manual`,title:`The expression {expression} runs code inside the engine`,detail:`Camunda 8 evaluates FEEL and nothing else in the diagram, so this expression has no counterpart.`,action:`Move what it does into a job worker, or into a FEEL output mapping if it only computes a value.`,link:q},"external-task":{severity:`warning`,conversion:`automatic`,title:`The external task topic {topic} becomes the job type {jobType}`,detail:`External tasks and jobs are the same idea. The worker changes client: the Camunda 7 external task client becomes a Camunda 8 job worker.`,action:`Move the handler for {topic} to a job worker; Penstock generates one from the handler.`,link:_r},"external-task-priority":{severity:`info`,conversion:`automatic`,title:`The external task priority is dropped`,detail:`Camunda 8 jobs of one type are handed out in the order they are created.`,action:`Nothing to do, unless the order mattered; then give urgent work its own job type.`},connector:{severity:`error`,conversion:`manual`,title:`The Camunda 7 connector {connector} has no Camunda 8 counterpart`,detail:`Camunda 7 connectors (http-connector, soap-http-connector) are not part of Camunda 8. Camunda 8 has its own connectors, configured through element templates.`,action:`Apply the Camunda 8 REST or SOAP connector template to the task, or write a job worker.`,link:`https://docs.camunda.io/docs/components/connectors/protocol/rest/`},"field-injection":{severity:`warning`,conversion:`review`,title:`The injected fields {fields} become task headers`,detail:`Camunda 8 has no field injection. Fixed values travel with the job as custom headers, which the worker reads.`,action:`Read them in the worker from the job's custom headers.`,link:q},"field-injection-expression":{severity:`error`,conversion:`manual`,title:`The injected field {field} is an expression`,detail:`A task header is a fixed text; it cannot be evaluated while the process runs.`,action:`Pass the value as an input mapping with a FEEL expression, and read it in the worker as a variable.`,link:q},async:{severity:`info`,conversion:`automatic`,title:`Asynchronous continuation is dropped`,detail:`Camunda 8 has no transactions spanning steps: every job and every wait is its own unit, so asyncBefore and asyncAfter mean nothing there.`,action:`Nothing to do.`,link:K},retries:{severity:`warning`,conversion:`review`,title:`The retry cycle {cycle} becomes {retries} retries`,detail:`Camunda 8 counts retries on the task; how long to wait between them is decided by the worker when it fails the job.`,action:`Set the back-off in the worker's fail command if the interval mattered.`,link:q},"retries-dropped":{severity:`warning`,conversion:`automatic`,title:`The retry cycle {cycle} is dropped`,detail:`Only tasks that create a job carry retries in Camunda 8.`,action:`Nothing to do, unless this element relied on retrying; then check how it fails on Camunda 8.`},"job-priority":{severity:`info`,conversion:`automatic`,title:`The job priority {priority} is carried over`,detail:`Camunda 8 has job priorities from 8.8.`,action:`Nothing to do.`,since:`8.8`},"job-priority-dropped":{severity:`warning`,conversion:`automatic`,title:`The job priority {priority} is dropped`,detail:`The Camunda 8 version this converts for has no job priorities.`,action:`Nothing to do, unless the order mattered; then give urgent work its own job type.`},"input-output":{severity:`info`,conversion:`automatic`,title:`The input and output mapping becomes a FEEL mapping`,detail:`Camunda 8 maps variables with FEEL expressions; each Camunda 7 parameter becomes one.`,action:`Nothing to do.`,link:Cr},"input-output-manual":{severity:`error`,conversion:`manual`,title:`The mapping of {name} cannot be converted`,detail:`{reason}`,action:`Write the mapping as a FEEL expression.`,link:J},"input-output-script":{severity:`error`,conversion:`manual`,title:`The mapping of {name} runs a {format} script`,detail:`Camunda 8 maps variables with FEEL only.`,action:`Write the mapping as a FEEL expression, or compute the value in a job worker.`,link:J},condition:{severity:`info`,conversion:`automatic`,title:`The condition {expression} becomes {feel}`,detail:`Camunda 8 conditions are FEEL expressions.`,action:`Nothing to do.`,link:J},"expression-review":{severity:`warning`,conversion:`review`,title:`{expression} became {feel}`,detail:`{reason}`,action:`Check the FEEL expression means the same with the values this process sees.`,link:J},"expression-manual":{severity:`error`,conversion:`manual`,title:`The expression {expression} cannot be converted`,detail:`The converter stopped because {reason}.`,action:`Write it as a FEEL expression.`,link:J},"script-condition":{severity:`error`,conversion:`manual`,title:`The condition is a {format} script`,detail:`Camunda 8 conditions are FEEL expressions only.`,action:`Write the condition in FEEL.`,link:J},"script-task":{severity:`error`,conversion:`manual`,title:`The {format} script cannot run in Camunda 8`,detail:`Camunda 8 runs a script task as a FEEL expression or as a job. Groovy, JavaScript and Python scripts have no engine to run in.`,action:`Rewrite the script as a FEEL expression, or turn the task into a job worker that runs the code.`,link:`https://docs.camunda.io/docs/components/modeler/bpmn/script-tasks/`},"script-task-feel":{severity:`info`,conversion:`automatic`,title:`The FEEL script becomes a FEEL expression`,detail:`Camunda 8 runs a FEEL script task inside the engine, with its result in {variable}.`,action:`Nothing to do.`,link:`https://docs.camunda.io/docs/components/modeler/bpmn/script-tasks/`},"script-resource":{severity:`error`,conversion:`manual`,title:`The script is read from {resource}`,detail:`Camunda 8 does not load scripts from resources.`,action:`Rewrite the script as a FEEL expression, or turn the task into a job worker.`,link:`https://docs.camunda.io/docs/components/modeler/bpmn/script-tasks/`},"execution-listener":{severity:`error`,conversion:`automatic`,title:`The {event} listener {name} becomes the job type {jobType}`,detail:`Camunda 8 execution listeners are jobs as well: the process waits until a worker completes them.`,action:`Write a job worker for {jobType}; it runs before the element continues, so keep it quick.`,since:`8.6`,link:yr},"execution-listener-unsupported":{severity:`error`,conversion:`manual`,title:`The {event} listener {name} has no Camunda 8 counterpart`,detail:`{reason}`,action:`Move what the listener does into a task of its own or into the worker before it.`,link:yr},"task-listener":{severity:`error`,conversion:`automatic`,title:`The {event} task listener {name} becomes the job type {jobType}`,detail:`Camunda 8 task listeners are jobs that the user task waits for, and they can correct or deny what happens.`,action:`Write a job worker for {jobType}.`,since:`8.8`,link:br},"task-listener-unsupported":{severity:`error`,conversion:`manual`,title:`The {event} task listener {name} has no Camunda 8 counterpart`,detail:`{reason}`,action:`Move what the listener does into a job worker around the task, or into the application that works the task.`,link:br},"user-task":{severity:`info`,conversion:`automatic`,title:`The user task becomes a Camunda user task`,detail:`Camunda 8 manages the task in the engine, with its assignee, candidates, dates and priority.`,action:`Nothing to do in the diagram; the task list application changes to Tasklist or to the Camunda 8 user task API.`,link:xr},"user-task-expression":{severity:`warning`,conversion:`review`,title:`The {name} {expression} became {feel}`,detail:`{reason}`,action:`Check the value on Camunda 8.`,link:xr},"user-task-priority-range":{severity:`warning`,conversion:`review`,title:`The priority {priority} is outside 0 to 100`,detail:`Camunda 8 user task priorities run from 0 to 100.`,action:`Rescale the priority.`,link:xr},"user-task-priority-dropped":{severity:`warning`,conversion:`automatic`,title:`The priority {priority} is dropped`,detail:`The Camunda 8 version this converts for has no user task priority.`,action:`Nothing to do, unless the task list sorted by it.`},"form-embedded":{severity:`error`,conversion:`manual`,title:`The embedded form {formKey} has no Camunda 8 counterpart`,detail:`Camunda 8 Tasklist shows Camunda Forms only; HTML forms and their JavaScript do not carry over.`,action:`Rebuild the form as a Camunda Form and link it, or keep your own task list application and pass the key as an external reference.`,link:Y},"form-generated":{severity:`warning`,conversion:`review`,title:`The generated form becomes the Camunda Form {form}`,detail:`Penstock writes a Camunda Form with one field per form field, and links it. Validation and properties the form fields had are carried over where Camunda Forms have them.`,action:`Open {form} and check it looks and validates as the old one did.`,link:Y},"form-generated-partly":{severity:`warning`,conversion:`review`,title:`Part of the generated form did not carry over: {lost}`,detail:`Camunda Forms have no counterpart for it.`,action:`Rebuild that part in the form editor.`,link:Y},"form-camunda":{severity:`info`,conversion:`automatic`,title:`The Camunda Form {form} is linked by its id`,detail:`Camunda 8 links a form by its id and deploys it with the diagram.`,action:`Deploy the form with the diagram.`,link:Y},"form-camunda-unknown":{severity:`warning`,conversion:`review`,title:`The Camunda Form {form} was not found in the project`,detail:`Camunda 8 links a form by the id inside it, and Penstock could not read that id. The file name was used instead.`,action:`Check the form id in the diagram matches the id inside the form.`,link:Y},"form-binding-version":{severity:`error`,conversion:`manual`,title:`The form is bound to version {version}`,detail:`Camunda 8 binds a form by latest, by deployment or by version tag, not by version number.`,action:`Bind it by deployment or give the form a version tag.`,link:Y},"form-external":{severity:`warning`,conversion:`review`,title:`The form key {formKey} becomes an external reference`,detail:`Camunda 8 passes an external reference through to the task list, as Camunda 7 passed the form key.`,action:`Check your task list application reads the external reference.`,since:`8.4`,link:Y},"assignment-review":{severity:`warning`,conversion:`review`,title:`The {name} {expression} is a list in Camunda 7`,detail:`Camunda 8 wants candidates as a FEEL list or a comma-separated text.`,action:`Check the expression gives a list or a comma-separated text.`,link:xr},initiator:{severity:`warning`,conversion:`manual`,title:`The starter is kept in {variable} only in Camunda 7`,detail:`Camunda 8 does not record who started an instance in a variable.`,action:`Set {variable} as a variable when the process is started.`,link:K},"multi-instance":{severity:`info`,conversion:`automatic`,title:`The multi-instance loop over {collection} becomes an input collection`,detail:`Camunda 8 loops over an input collection, with each item in the input element.`,action:`Nothing to do.`,link:`https://docs.camunda.io/docs/components/modeler/bpmn/multi-instance/`},"multi-instance-cardinality":{severity:`warning`,conversion:`review`,title:`The loop cardinality {cardinality} becomes a collection of numbers`,detail:`Camunda 8 has no loop cardinality: it loops over a collection. The converter loops over the numbers 1 to {cardinality}.`,action:`Check the loop runs as often as it did.`,link:`https://docs.camunda.io/docs/components/modeler/bpmn/multi-instance/`},"multi-instance-missing":{severity:`error`,conversion:`manual`,title:`The multi-instance loop has neither a collection nor a cardinality`,detail:`Camunda 8 needs an input collection to loop over.`,action:`Give the loop an input collection.`,link:`https://docs.camunda.io/docs/components/modeler/bpmn/multi-instance/`},"call-activity":{severity:`info`,conversion:`automatic`,title:`The call of {process} carries over`,detail:`Camunda 8 calls the process by its id; the variables passed in and out become mappings.`,action:`Nothing to do.`,link:`https://docs.camunda.io/docs/components/modeler/bpmn/call-activities/`},"call-activity-business-key":{severity:`error`,conversion:`manual`,title:`The business key is passed to {process}`,detail:`Camunda 8 has no business key.`,action:`Pass the value as a variable, and correlate messages on it.`,link:K},"call-activity-local":{severity:`warning`,conversion:`review`,title:`Only local variables were passed to or from {process}`,detail:`Camunda 8 passes the variables its mappings name; it has no local-only mode.`,action:`Check the mappings pass exactly what the called process needs.`,link:`https://docs.camunda.io/docs/components/modeler/bpmn/call-activities/`},"call-activity-mapping-class":{severity:`error`,conversion:`manual`,title:`Variables for {process} are mapped by Java code`,detail:`Camunda 8 maps variables with FEEL only.`,action:`Write the mapping as FEEL input and output mappings.`,link:J},"binding-version":{severity:`error`,conversion:`manual`,title:`{what} is bound to version {version}`,detail:`Camunda 8 binds by latest, by deployment or by version tag, not by version number.`,action:`Bind it by deployment, or give the target a version tag and bind by that.`,since:`8.6`,link:`https://docs.camunda.io/docs/components/best-practices/modeling/choosing-the-resource-binding-type/`},"binding-dropped":{severity:`warning`,conversion:`automatic`,title:`The binding {binding} of {target} is dropped`,detail:`The Camunda 8 version this converts for always takes the latest version.`,action:`Convert for 8.6 or later to keep the binding.`,since:`8.6`},tenant:{severity:`warning`,conversion:`manual`,title:`The tenant {tenant} is fixed in the diagram`,detail:`Camunda 8 decides the tenant from the deployment, not from the diagram.`,action:`Deploy the diagram to the tenant instead.`,link:`https://docs.camunda.io/docs/components/concepts/multi-tenancy/`},cmmn:{severity:`error`,conversion:`manual`,title:`The case {case} is called`,detail:`Camunda 8 has no CMMN.`,action:`Model the case as a process, an ad-hoc subprocess or a set of user tasks.`,link:gr},decision:{severity:`info`,conversion:`automatic`,title:`The decision {decision} is called, its result in {result}`,detail:`Camunda 8 evaluates the decision in the engine and stores the whole result in one variable.`,action:`Nothing to do.`,link:X},"decision-result":{severity:`warning`,conversion:`review`,title:`The decision result was mapped as {mapping}`,detail:`Camunda 8 stores the result the way the decision gives it: one value for one output of one rule, a context for several outputs, a list for several rules. The Camunda 7 mapping {mapping} may have a different shape.`,action:`Check what reads {result} expects the Camunda 8 shape.`,link:X},"decision-result-variable":{severity:`warning`,conversion:`review`,title:`The decision result goes to {result}`,detail:`Camunda 8 needs a result variable, and the Camunda 7 task had none.`,action:`Rename {result} if something else should read the result.`,link:X},"message-catch":{severity:`error`,conversion:`manual`,title:`The message {message} needs a correlation key`,detail:`Camunda 8 correlates a message to a waiting instance by a key the instance computes from its variables. Camunda 7 correlated through the API, with the business key or variables.`,action:`Add a correlation key to the message: a FEEL expression over a variable the sender also knows, such as =orderId.`,link:Sr},"message-name-expression":{severity:`info`,conversion:`automatic`,title:`The message name {name} becomes {feel}`,detail:`Camunda 8 message names can be FEEL expressions.`,action:`Nothing to do.`,link:Sr},"message-throw":{severity:`error`,conversion:`automatic`,title:`The message is sent by {implementation}, which becomes the job type {jobType}`,detail:`Camunda 8 sends a message from a throw event through a job worker, like a send task.`,action:`Write a job worker for {jobType} that publishes the message.`,link:Sr},"message-throw-empty":{severity:`error`,conversion:`manual`,title:`The message throw event has no implementation`,detail:`Camunda 8 needs a job type on a message throw event; a worker sends the message.`,action:`Give the event a job type and write the worker that publishes the message.`,link:Sr},"signal-variables":{severity:`warning`,conversion:`review`,title:`Variables passed with the signal {signal}`,detail:`Camunda 8 broadcasts a signal with the variables its input mappings give it.`,action:`Check the signal carries the variables its catchers read.`,link:`https://docs.camunda.io/docs/components/modeler/bpmn/signal-events/`},timer:{severity:`info`,conversion:`automatic`,title:`The timer {timer} carries over`,detail:`Camunda 8 reads the same ISO 8601 dates, durations and cycles.`,action:`Nothing to do.`,link:`https://docs.camunda.io/docs/components/modeler/bpmn/timer-events/`},"timer-cron":{severity:`warning`,conversion:`review`,title:`The timer cycle {cycle} is a cron expression`,detail:`Camunda 8 reads cron expressions in the Spring format; Camunda 7 read them in the Quartz format, which allows fields Spring does not.`,action:`Check the cron expression is valid Spring cron.`,link:`https://docs.camunda.io/docs/components/modeler/bpmn/timer-events/`},"error-code-variable":{severity:`info`,conversion:`automatic`,title:`The caught error code goes to {variable} through an output mapping`,detail:`Camunda 8 gives a caught error to the output mappings as errorCode and errorMessage.`,action:`Nothing to do.`,link:`https://docs.camunda.io/docs/components/modeler/bpmn/error-events/`},"error-message":{severity:`info`,conversion:`automatic`,title:`The error message {message} is dropped`,detail:`In Camunda 8 the worker that throws the error gives its message.`,action:`Give the message in the worker when it throws the error.`,link:`https://docs.camunda.io/docs/components/modeler/bpmn/error-events/`},"external-error":{severity:`error`,conversion:`manual`,title:`The external task decides errors by the expression {expression}`,detail:`Camunda 8 has no error event definitions on a task; the job worker throws the error itself.`,action:`Throw the BPMN error from the job worker when the condition holds.`,link:q},"escalation-code-variable":{severity:`warning`,conversion:`manual`,title:`The escalation code was kept in {variable}`,detail:`Camunda 8 does not store a caught escalation code in a variable.`,action:`Pass the value as a variable when the escalation is thrown.`,link:`https://docs.camunda.io/docs/components/modeler/bpmn/escalation-events/`},"unsupported-element":{severity:`error`,conversion:`manual`,title:`Camunda 8 cannot run a {what}`,detail:`{reason}`,action:`{action}`,link:vr},"element-since":{severity:`error`,conversion:`manual`,title:`A {what} needs Camunda {version} or later`,detail:`The Camunda 8 version this converts for, {target}, cannot run it.`,action:`Convert for Camunda {version} or later, or remodel it.`,link:vr},"conditional-event":{severity:`warning`,conversion:`review`,title:`The conditional event waits for {variables}`,detail:`Camunda 8 evaluates a condition when the variables it names change, like Camunda 7 did when variableName was set.`,action:`Check the condition is triggered by the variables you expect.`,since:`8.9`,link:`https://docs.camunda.io/docs/components/modeler/bpmn/conditional-events/`},properties:{severity:`info`,conversion:`automatic`,title:`The extension properties carry over`,detail:`Camunda 8 keeps them as zeebe properties, read the same way by tools.`,action:`Nothing to do.`},"version-tag":{severity:`info`,conversion:`automatic`,title:`The version tag {tag} carries over`,detail:`Camunda 8 keeps version tags from 8.6.`,action:`Nothing to do.`,since:`8.6`},"history-time-to-live":{severity:`info`,conversion:`automatic`,title:`The history time to live {ttl} is dropped`,detail:`Camunda 8 keeps history in its secondary storage, cleaned up by retention settings of the cluster, not of the diagram.`,action:`Set the retention in the cluster configuration if it mattered.`,link:wr},"starter-groups":{severity:`warning`,conversion:`manual`,title:`Who may start the process ({groups}) is dropped`,detail:`Camunda 8 decides who may start a process through authorizations, not the diagram.`,action:`Grant the start permission to {groups} in Camunda 8 identity.`,link:`https://docs.camunda.io/docs/components/concepts/access-control/authorizations/`},"startable-in-tasklist":{severity:`info`,conversion:`automatic`,title:`Whether Tasklist may start the process is dropped`,detail:`Camunda 8 Tasklist offers every process a user may start.`,action:`Nothing to do.`},template:{severity:`warning`,conversion:`review`,title:`The element template {template} is a Camunda 7 template`,detail:`The template no longer applies; the converted properties stay.`,action:`Apply the Camunda 8 version of the template, if there is one.`,link:`https://docs.camunda.io/docs/components/modeler/desktop-modeler/element-templates/about-templates/`},"unknown-attribute":{severity:`warning`,conversion:`manual`,title:`The Camunda 7 setting {attribute} is left as it is`,detail:`Penstock does not know what Camunda 8 should do with it, so it stays in the diagram, where Camunda 8 ignores it.`,action:`Check whether anything depended on it, then remove it.`,link:K},"dmn-version":{severity:`warning`,conversion:`manual`,title:`The decisions are DMN {version}`,detail:`Camunda 8 reads DMN 1.3. Penstock and the DMN editor move an older file to 1.3.`,action:`Open the file in the DMN editor and save it, then convert it.`,link:X},"dmn-expression-language":{severity:`error`,conversion:`manual`,title:`{what} is written in {language}`,detail:`Camunda 8 evaluates DMN in FEEL only.`,action:`Write it in FEEL.`,link:X},"dmn-juel":{severity:`info`,conversion:`automatic`,title:`{what} becomes the FEEL expression {feel}`,detail:`Camunda 8 evaluates DMN in FEEL only.`,action:`Nothing to do.`,link:X},"dmn-input-variable":{severity:`error`,conversion:`manual`,title:`The input {input} names its value {variable}`,detail:`Camunda 8 refers to the input value in a rule as ?, not by a name.`,action:`Replace {variable} with ? in the rules of this input, then remove the name.`,link:`https://docs.camunda.io/docs/components/modeler/feel/language-guide/feel-unary-tests/`},"dmn-history-time-to-live":{severity:`info`,conversion:`automatic`,title:`The history time to live of {decision} is dropped`,detail:`Camunda 8 keeps history in its secondary storage, cleaned up by retention settings of the cluster.`,action:`Nothing to do.`},"dmn-carries-over":{severity:`info`,conversion:`automatic`,title:`The decisions carry over`,detail:`Camunda 8 evaluates DMN 1.3 in FEEL, and these decisions use nothing else.`,action:`Nothing to do.`,link:X},"form-platform":{severity:`info`,conversion:`automatic`,title:`The form carries over`,detail:`Camunda Forms have the same format on both; only the platform it names changes.`,action:`Nothing to do.`,link:Y},platform:{severity:`info`,conversion:`automatic`,title:`The diagram names Camunda {target} as its platform`,detail:`Camunda Modeler and Penstock read the platform from the file.`,action:`Nothing to do.`},"data-migration":{severity:`warning`,conversion:`manual`,title:`Running instances and history stay on Camunda 7`,detail:`Converting a diagram does not move its instances. Instances can finish on Camunda 7, or be moved with Camunda's Data Migrator, which needs the element ids to stay as they are; the converter keeps them.`,action:`Decide whether to drain Camunda 7 or to run the Data Migrator.`,link:wr}},Er=[`title`,`detail`,`action`];function ruleKey(e,t,n){return`app.migration.rules.${e}${n?`.${n}`:``}.${t}`}function describeRule(e,n,i={},a){let o={},s={};for(let c of Er){s[c]=r(n[c],i);let l=a?ruleKey(e,c,a):``,u=l?t(l,i):``;o[c]=l&&u!==l?u:t(ruleKey(e,c),i)}return{text:o,english:s}}var Dr=2e4,Refusal=class extends Error{};function refused(e,n){return t(`app.migration.juel.${e}`,n)}var Or={and:`&&`,or:`||`,not:`!`,eq:`==`,ne:`!=`,lt:`<`,gt:`>`,le:`<=`,ge:`>=`,div:`/`,mod:`%`,empty:`empty`},wordOf=e=>Object.hasOwn(Or,e)?Or[e]:void 0,kr=[`==`,`!=`,`<=`,`>=`,`&&`,`||`,`<`,`>`,`+`,`-`,`*`,`/`,`%`,`!`,`?`,`:`,`(`,`)`,`[`,`]`,`.`,`,`],Ar=new Set([`true`,`false`,`null`,`and`,`or`,`not`,`if`,`then`,`else`,`for`,`in`,`return`,`some`,`every`,`satisfies`,`instance`,`of`,`between`,`function`,`external`]),jr={nrOfInstances:`numberOfInstances`,nrOfActiveInstances:`numberOfActiveInstances`,nrOfCompletedInstances:`numberOfCompletedInstances`},Mr=new Set([`execution`,`task`,`variableScope`,`externalTask`,`authenticatedUserId`,`dateTime`,`currentUser`,`currentUserGroups`]),Nr=/[$#]\{/;function tokenize(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(/\s/.test(r)){n+=1;continue}if(r===`"`||r===`'`){let i=``,a=n+1;for(;a<e.length&&e[a]!==r;)e[a]===`\\`&&a+1<e.length?(i+=e[a+1],a+=2):(i+=e[a],a+=1);if(a>=e.length)throw new Refusal(refused(`stringOpen`));t.push({type:`string`,value:i}),n=a+1;continue}let i=/^(?:\d+\.\d*|\.\d+|\d+)(?:[eE][+-]?\d+)?[lLfFdD]?/.exec(e.slice(n));if(i&&/[\d.]/.test(r)&&(r!==`.`||/\d/.test(e[n+1]??``))){t.push({type:`number`,value:i[0]}),n+=i[0].length;continue}let a=/^[A-Za-z_$][\w$]*/.exec(e.slice(n));if(a){t.push({type:`name`,value:a[0]}),n+=a[0].length;continue}let o=kr.find(t=>e.startsWith(t,n));if(!o)throw new Refusal(refused(`character`,{what:r}));t.push({type:`op`,value:o}),n+=o.length}return t.push({type:`end`,value:``}),t}var Parser=class{at=0;tokens;constructor(e){this.tokens=e}parse(){let e=this.ternary();if(this.peek().type!==`end`)throw new Refusal(refused(`trailing`,{what:this.peek().value}));return e}peek(){return this.tokens[this.at]}operator(){let e=this.peek();return e.type===`op`?e.value:e.type===`name`?wordOf(e.value)??null:null}take(){let e=this.tokens[this.at];return this.at+=1,e}expect(e){if(this.operator()!==e)throw new Refusal(refused(`expected`,{what:e,found:this.peek().value||`the end`}));this.take()}ternary(){let e=this.or();if(this.operator()!==`?`)return e;this.take();let t=this.ternary();return this.expect(`:`),{kind:`ternary`,test:e,then:t,otherwise:this.ternary()}}binary(e,t){let n=e();for(let r=this.operator();r!==null&&t.includes(r);r=this.operator())this.take(),n={kind:`binary`,op:r,left:n,right:e()};return n}or(){return this.binary(()=>this.and(),[`||`])}and(){return this.binary(()=>this.equality(),[`&&`])}equality(){return this.binary(()=>this.relational(),[`==`,`!=`])}relational(){return this.binary(()=>this.additive(),[`<`,`>`,`<=`,`>=`])}additive(){return this.binary(()=>this.multiplicative(),[`+`,`-`])}multiplicative(){return this.binary(()=>this.unary(),[`*`,`/`,`%`])}unary(){let e=this.operator();return e===`!`?(this.take(),{kind:`unary`,op:`not`,operand:this.unary()}):e===`-`?(this.take(),{kind:`unary`,op:`minus`,operand:this.unary()}):e===`empty`?(this.take(),{kind:`unary`,op:`empty`,operand:this.unary()}):this.postfix(this.primary())}args(){this.expect(`(`);let e=[];if(this.operator()!==`)`)for(e.push(this.ternary());this.operator()===`,`;)this.take(),e.push(this.ternary());return this.expect(`)`),e}postfix(e){let t=e;for(;;){let e=this.operator();if(e===`.`){this.take();let e=this.take();if(e.type!==`name`)throw new Refusal(refused(`propertyName`));t=this.operator()===`(`?{kind:`call`,target:t,name:e.value,args:this.args()}:{kind:`path`,target:t,name:e.value}}else if(e===`[`){this.take();let e=this.ternary();this.expect(`]`),t={kind:`index`,target:t,index:e}}else return t}}primary(){let e=this.take();if(e.type===`number`)return{kind:`literal`,text:e.value};if(e.type===`string`)return{kind:`literal`,text:JSON.stringify(e.value)};if(e.type===`op`&&e.value===`(`){let e=this.ternary();return this.expect(`)`),e}if(e.type===`name`){if(e.value===`true`||e.value===`false`||e.value===`null`)return{kind:`literal`,text:e.value};if(wordOf(e.value))throw new Refusal(refused(`wordAsValue`,{what:e.value}));if(this.operator()===`:`&&this.tokens[this.at+1]?.type===`name`&&this.tokens[this.at+2]?.value===`(`){this.take();let t=this.take().value;return{kind:`function`,prefix:e.value,name:t,args:this.args()}}return this.operator()===`(`?{kind:`call`,target:null,name:e.value,args:this.args()}:{kind:`name`,name:e.value}}throw new Refusal(e.type===`end`?refused(`endsEarly`):refused(`tokenAsValue`,{what:e.value}))}},Z={ternary:1,"||":2,"&&":3,compare:4,"+":5,"-":5,"*":6,"/":6,unary:7},Printer=class{review=[];context;constructor(e){this.context=e}note(e){this.review.includes(e)||this.review.push(e)}precedence(e){switch(e.kind){case`ternary`:return Z.ternary;case`binary`:return[`==`,`!=`,`<`,`>`,`<=`,`>=`].includes(e.op)?Z.compare:Z[e.op]??8;case`unary`:return e.op===`minus`?Z.unary:8;default:return 8}}wrap(e,t){let n=this.print(e);return this.precedence(e)<t?`(${n})`:n}name(e){if(this.context.multiInstance&&Object.hasOwn(jr,e))return jr[e];if(Mr.has(e))throw new Refusal(refused(`contextObject`,{what:e}));if(e.includes(`$`))throw new Refusal(refused(`dollarInName`,{what:e}));if(Ar.has(e))throw new Refusal(refused(`reservedWord`,{what:e}));return e}variableName(e){if(e.kind!==`literal`||!e.text.startsWith(`"`))return null;let t=JSON.parse(e.text);return/^[A-Za-z_][A-Za-z0-9_]*$/.test(t)&&!Ar.has(t)?t:null}executionCall(e,t){let n=t.length===1?this.variableName(t[0]):null;switch(e){case`getVariable`:case`getVariableTyped`:if(n)return n;break;case`getVariableLocal`:case`getVariableLocalTyped`:if(n)return this.note(refused(`localVariable`)),n;break;case`hasVariable`:if(n)return`is defined(${n})`;break;case`getProcessBusinessKey`:case`getBusinessKey`:throw new Refusal(refused(`businessKey`));case`getProcessInstanceId`:case`getId`:case`getActivityInstanceId`:throw new Refusal(refused(`engineId`))}throw new Refusal(refused(`executionCall`,{what:e}))}method(e,t,n){if(e.kind===`name`&&(e.name===`execution`||e.name===`task`||e.name===`variableScope`))return this.executionCall(t,n);let r=this.print(e),subject=()=>r,one=()=>{if(n.length!==1)throw new Refusal(refused(`takesOne`,{what:t}));return this.print(n[0])},none=()=>{if(n.length!==0)throw new Refusal(refused(`takesNone`,{what:t}))};switch(t){case`equals`:if(n.length!==1)throw new Refusal(refused(`equalsTakesOne`));return`${this.wrap(e,5)} = ${this.wrap(n[0],5)}`;case`equalsIgnoreCase`:return`lower case(${subject()}) = lower case(${one()})`;case`startsWith`:return`starts with(${subject()}, ${one()})`;case`endsWith`:return`ends with(${subject()}, ${one()})`;case`toUpperCase`:return none(),`upper case(${subject()})`;case`toLowerCase`:return none(),`lower case(${subject()})`;case`trim`:return none(),`trim(${subject()})`;case`length`:return none(),`string length(${subject()})`;case`size`:return none(),this.note(refused(`size`,{target:this.print(e)})),`count(${subject()})`;case`toString`:return none(),`string(${subject()})`}throw new Refusal(refused(`javaCall`,{what:t}))}print(e){switch(e.kind){case`literal`:if(/^\d/.test(e.text)||e.text.startsWith(`.`)){if(/[eE]/.test(e.text))throw new Refusal(refused(`exponent`));let t=e.text.replace(/[lLfFdD]$/,``);return t.startsWith(`.`)?`0${t}`:t.endsWith(`.`)?t.slice(0,-1):t}return e.text;case`name`:return this.name(e.name);case`path`:if(e.target.kind===`name`&&Mr.has(e.target.name))throw new Refusal(refused(`enginePath`,{target:e.target.name,what:e.name}));return`${this.wrap(e.target,8)}.${this.name(e.name)}`;case`index`:{let t=this.variableName(e.index);if(t)return`${this.wrap(e.target,8)}.${t}`;if(e.index.kind===`literal`&&/^\d+$/.test(e.index.text))return this.note(refused(`indexShifted`)),`${this.wrap(e.target,8)}[${Number(e.index.text)+1}]`;throw new Refusal(refused(`computedIndex`))}case`call`:if(e.target===null)throw new Refusal(refused(`juelFunction`,{what:e.name}));return this.method(e.target,e.name,e.args);case`function`:throw new Refusal(refused(`namespacedFunction`,{prefix:e.prefix,what:e.name}));case`unary`:if(e.op===`not`)return`not(${this.print(e.operand)})`;if(e.op===`minus`)return`-${this.wrap(e.operand,7)}`;throw new Refusal(refused(`empty`));case`ternary`:return`if ${this.print(e.test)} then ${this.print(e.then)} else ${this.print(e.otherwise)}`;case`binary`:return this.binary(e.op,e.left,e.right)}}binary(e,t,n){if(e===`||`)return`${this.wrap(t,2)} or ${this.wrap(n,3)}`;if(e===`&&`)return`${this.wrap(t,3)} and ${this.wrap(n,4)}`;if([`==`,`!=`,`<`,`>`,`<=`,`>=`].includes(e)){let r=e===`==`?`=`:e;return`${this.wrap(t,5)} ${r} ${this.wrap(n,5)}`}if(e===`%`)return`modulo(${this.print(t)}, ${this.print(n)})`;if(e===`+`&&(this.isString(t)||this.isString(n)))throw new Refusal(refused(`textPlus`));let r=Z[e];return`${this.wrap(t,r)} ${e} ${this.wrap(n,r+1)}`}isString(e){return e.kind===`literal`&&e.text.startsWith(`"`)}};function hasJuel(e){return!!e&&Nr.test(e)}function blocks(e){let t=[],n=0;for(;n<e.length;){let r=e.slice(n).search(Nr);if(r<0){t.push({literal:e.slice(n),expression:null});break}let i=n+r,a=0,o=null,s=-1;for(let t=i+2;t<e.length;t+=1){let n=e[t];if(o)n===`\\`?t+=1:n===o&&(o=null);else if(n===`"`||n===`'`)o=n;else if(n===`{`)a+=1;else if(n===`}`){if(a===0){s=t;break}--a}}if(s<0)throw new Refusal(refused(`expressionOpen`));t.push({literal:e.slice(n,i),expression:e.slice(i+2,s)}),n=s+1}return t}function expression(e,t){return t.print(new Parser(tokenize(e)).parse())}function juelToFeel(e,t={}){let n=new Printer(t);try{if(e.length>Dr)throw new Refusal(refused(`tooComplex`));let t=blocks(e);if(t.length===1&&t[0].literal===``&&t[0].expression!==null)return{ok:!0,feel:`=${expression(t[0].expression,n)}`,review:n.review};if(t.every(e=>e.expression===null))return{ok:!0,feel:e,review:[]};let r=t.flatMap(e=>[...e.literal?[JSON.stringify(e.literal)]:[],...e.expression===null?[]:[`string(${expression(e.expression,n)})`]]);return n.review.push(refused(`joinedStrings`)),{ok:!0,feel:`=${r.join(` + `)}`,review:n.review}}catch(e){if(e instanceof Refusal)return{ok:!1,reason:e.message};if(e instanceof RangeError)return{ok:!1,reason:refused(`tooComplex`)};throw e}}var Pr={ref:`reference`,id:`id`},Fr=[[/\bsub process\b/g,`sub-process`],[/\bad hoc\b/g,`ad-hoc`],[/\bmulti instance\b/g,`multi-instance`],[/\bevent based\b/g,`event-based`]];function wordsOf(e,t=!1){let n=(e.includes(`:`)?e.slice(e.indexOf(`:`)+1):e).replace(/([a-z0-9])([A-Z])/g,`$1 $2`).toLowerCase().split(/[\s_-]+/).filter(Boolean).map(e=>t?Pr[e]??e:e).join(` `);return Fr.reduce((e,[t,n])=>e.replace(t,n),n)}function plural(e){return/[^aeiou]y$/.test(e)?`${e.slice(0,-1)}ies`:/(s|x|ch|sh)$/.test(e)?`${e}es`:`${e}s`}function slugOf(e){let t=e.includes(`:`)?e.slice(e.indexOf(`:`)+1):e;return t&&t[0].toLowerCase()+t.slice(1)}function kindWords(e,n){let r=`app.element.kind.${slugOf(e)}`,i=t(r,{count:n===`one`?1:2});if(i!==r)return i;let a=wordsOf(e);return n===`one`?a:plural(a)}function elementWords(e){return kindWords(e,`one`)}var Ir=new Set([`checkbox`,`checklist`,`datetime`,`number`,`radio`,`select`,`taglist`,`expression`,`textfield`,`textarea`,`filepicker`]),Lr={DecisionTable:`app.dmn.view.decisionTable`,LiteralExpression:`app.dmn.view.literalExpression`,BoxedExpression:`app.dmn.view.boxedExpression`,RequirementsDiagram:`app.dmn.view.drd`};function formKind(e){let n=`app.sections.formKind.${e??``}`,r=t(n);return r===n?e??``:r}function words(e){return elementWords(e)}function logicKind(e){if(!e)return t(`app.sections.noLogic`);let n=Lr[e.$type.replace(`dmn:`,``)];return n?t(n):words(e.$type)}var Rr={UNIQUE:`unique`,FIRST:`first`,PRIORITY:`priority`,ANY:`any`,COLLECT:`collect`,"RULE ORDER":`ruleOrder`,"OUTPUT ORDER":`outputOrder`};function hitPolicyOf(e){let n=(e.hitPolicy??`UNIQUE`).toUpperCase(),r=Rr[n],i=r?t(`app.sections.hitPolicy.${r}`):n,a=e.aggregation?t(`app.sections.resultsCombinedBy`,{how:e.aggregation.toLowerCase()}):``;return t(`app.sections.hitPolicyText`,{policy:i,aggregation:a})}function decisionSections(e){let nameOf=t=>{let n=(t??``).replace(/^#/,``);return e.find(e=>e.id===n)?.name?.trim()||n},n=e.filter(e=>e.$type===`dmn:Decision`),r=n.map(e=>{let n=e.name?.trim()||e.id||t(`app.sections.decision`),r=e.decisionLogic;if(r?.$type===`dmn:DecisionTable`){let i=r.input??[],a=r.output??[],o=r.rule??[],s=o.some(e=>e.description?.trim());return{title:n,description:e.description?.trim()||void 0,note:hitPolicyOf(r),head:[`#`,...i.map((e,n)=>t(`app.sections.whenInput`,{input:e.label?.trim()||e.inputExpression?.text?.trim()||t(`app.sections.inputOf`,{number:n+1})})),...a.map((e,n)=>t(`app.sections.thenOutput`,{output:e.label?.trim()||e.name?.trim()||t(`app.sections.outputOf`,{number:n+1})})),...s?[t(`app.sections.notes`)]:[]],rows:o.map((e,t)=>[String(t+1),...i.map((t,n)=>e.inputEntry?.[n]?.text?.trim()||`-`),...a.map((t,n)=>e.outputEntry?.[n]?.text?.trim()??``),...s?[e.description?.trim()??``]:[]])}}return r?.$type===`dmn:LiteralExpression`?{title:n,description:e.description?.trim()||void 0,head:[t(`app.sections.result`),t(`app.sections.expression`)],rows:[[e.variable?.name??n,r.text?.trim()??``]]}:{title:n,head:[t(`app.sections.logic`)],rows:[[logicKind(r)]]}}),i=n.map(e=>[e.name?.trim()||e.id||``,[...(e.informationRequirement??[]).map(e=>nameOf(e.requiredDecision?.href??e.requiredInput?.href)),...(e.knowledgeRequirement??[]).map(e=>nameOf(e.requiredKnowledge?.href))].join(`, `)]).filter(([,e])=>e);return[{title:t(`app.dmn.requirements`),head:[t(`app.sections.decision`),t(`app.sections.needs`)],rows:i},...r]}function fieldSection(e){return{title:t(`app.sections.fieldTable`),head:[t(`app.sections.field`),t(`app.sections.kind`),t(`app.sections.writes`),t(`app.sections.required`),t(`app.sections.options`),t(`app.sections.hiddenWhen`)],rows:e}}var zr=200,Br=e(e=>typeof e==`string`?e.trim():``,`trimmed`),isField=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function formRows(e,n,r=0){return!Array.isArray(e)||r>zr?[]:e.filter(isField).flatMap(e=>{if(Array.isArray(e.components)){let t=Br(e.path),i=t?t.split(`.`):[];return formRows(e.components,e.type===`dynamiclist`?[...n,...i,`[]`]:[...n,...i],r+1)}let i=typeof e.type==`string`?e.type:``;if(!Ir.has(i))return[];let a=typeof e.valuesKey==`string`&&e.valuesKey?e.valuesKey:typeof e.valuesExpression==`string`&&e.valuesExpression?e.valuesExpression:``,o=a?t(`app.sections.optionsFrom`,{source:a}):(Array.isArray(e.values)?e.values.filter(e=>typeof e==`object`&&!!e):[]).map(e=>`${typeof e.label==`string`?e.label:``} = ${JSON.stringify(e.value)}`).join(`, `),s=typeof e.key==`string`?e.key:``,c=isField(e.validate)?e.validate:void 0,l=isField(e.conditional)?e.conditional:void 0;return[[Br(e.label),formKind(i),s?[...n,s].join(`.`).replace(/\.\[\]\./g,`[].`):``,c?.required?t(`app.sections.yes`):``,o,typeof l?.hide==`string`?l.hide:``]]})}var Vr=`textfield`;function text$1(e){return typeof e==`string`&&e!==``?e:void 0}e(text$1,`text`);function whole(e){let t=Number(e);return e!==void 0&&e.trim()!==``&&Number.isFinite(t)?t:void 0}function componentOf(e,n){let r=text$1(e.id)??`field`,i=text$1(e.type)??`string`,a={id:`Field_${r}`,key:r,label:text$1(e.label)??r},o={};(e.validation?.constraints??[]).forEach(e=>{let i=text$1(e.name)??``,a=whole(text$1(e.config));i===`required`?o.required=!0:i===`minlength`&&a!==void 0?o.minLength=a:i===`maxlength`&&a!==void 0?o.maxLength=a:i===`min`&&a!==void 0?o.min=a:i===`max`&&a!==void 0?o.max=a:i===`readonly`?o.readonly=!0:n.push(t(`app.migration.form.keptOut`,{name:i,id:r}))});let s=o.readonly===!0;delete o.readonly;let c={...Object.keys(o).length>0?{validate:o}:{},...s?{readonly:!0}:{}},l=text$1(e.defaultValue),u=Object.fromEntries((e.properties?.values??[]).filter(e=>text$1(e.name)).map(e=>[e.name,e.value??``]));switch(Object.keys(u).length>0&&(c.properties=u),i){case`string`:return{...a,type:Vr,...l?{defaultValue:l}:{},...c};case`long`:return{...a,type:`number`,...whole(l)===void 0?{}:{defaultValue:whole(l)},...c};case`boolean`:return{...a,type:`checkbox`,...l?{defaultValue:l===`true`}:{},...c};case`date`:return{...a,type:`datetime`,subtype:`date`,dateLabel:a.label,...c};case`enum`:return{...a,type:`select`,values:(e.values??[]).map(e=>({label:text$1(e.name)??text$1(e.id)??``,value:text$1(e.id)??``})),...l?{defaultValue:l}:{},...c};default:return n.push(t(`app.migration.form.lostType`,{type:i,id:r})),{...a,type:Vr,...c}}}function generatedForm(e,t){let n=[],r={components:(t.fields??[]).map(e=>componentOf(e,n)),type:`default`,id:e,executionPlatform:R,executionPlatformVersion:`8.8.0`,schemaVersion:16};return{json:`${JSON.stringify(r,null,2)}\n`,lost:n}}function jobTypeFor(e,t){if(e===`class`){let e=t.slice(t.lastIndexOf(`.`)+1);return e.charAt(0).toLowerCase()+e.slice(1)}return t}var Hr=`http://camunda.org/schema/1.0/bpmn`,Ur=`http://operaton.org/schema/1.0/bpmn`,Wr=`http://camunda.org/schema/zeebe/1.0`,Gr=`http://camunda.org/schema/modeler/1.0`,Kr=`http://camunda.org/schema/conversion/1.0`,qr=new Set([`bpmn:IntermediateCatchEvent`,`bpmn:BoundaryEvent`,`bpmn:ReceiveTask`]),Jr=new Set([`bpmn:ServiceTask`,`bpmn:SendTask`,`bpmn:BusinessRuleTask`,`bpmn:ScriptTask`,`bpmn:EndEvent`,`bpmn:IntermediateThrowEvent`]),Yr=new Set([...Jr,`bpmn:CallActivity`,`bpmn:SubProcess`,`bpmn:UserTask`]),Xr=new Set([...Yr,`bpmn:IntermediateCatchEvent`,`bpmn:BoundaryEvent`,`bpmn:StartEvent`,`bpmn:ReceiveTask`]),Zr=/^bpmn:(?:\w*Task|SubProcess|CallActivity|Transaction|\w*Event|ExclusiveGateway|InclusiveGateway|ParallelGateway|EventBasedGateway|Process)$/,Qr={create:`creating`,assignment:`assigning`,update:`updating`,complete:`completing`,delete:`canceling`},$r=new Set([`camunda:InputOutput`,`camunda:ExecutionListener`,`camunda:TaskListener`,`camunda:Properties`,`camunda:In`,`camunda:Out`,`camunda:FailedJobRetryTimeCycle`,`camunda:Field`,`camunda:FormData`]);function detail(e,n){return t(`app.migration.detail.${e}`,n)}function localType(e){return(e.split(`:`).pop()??e).replace(/([a-z])([A-Z])/g,`$1 $2`).toLowerCase()}function labelOf$1(e){return(typeof e?.name==`string`?e.name.replace(/\s+/g,` `).trim():``)||e?.id||localType(e?.$type??`element`)}e(labelOf$1,`labelOf`);function text(e){if(typeof e==`string`)return e.trim()?e:void 0;if(typeof e==`boolean`||typeof e==`number`)return String(e)}function retriesOf(e){let t=/^\s*R(\d+)\//.exec(e);if(t)return t[1];let n=e.split(`,`).map(e=>e.trim()).filter(Boolean);return n.length>0&&n.every(e=>/^P/.test(e))?String(n.length):null}function looksLikeCron(e){let t=e.trim().split(/\s+/);return t.length>=5&&t.length<=7&&!e.trim().startsWith(`R`)&&!e.trim().startsWith(`P`)}var BpmnMigration=class{findings=[];changes=[];extraFiles=[];delegates=[];definitions;moddle;target;options;kept=new WeakMap;keptCount=0;keptValues=new WeakSet;marks=new Map;process=null;constructor(e,t={}){this.definitions=e,this.moddle=w(e),this.options=t,this.target=t.target??`8.8`}run(){this.removeMarkers(this.definitions),this.take(this.definitions,`camunda:diagramRelationId`);let e=this.definitions.rootElements??[];e.filter(e=>e.$type===`bpmn:Error`).forEach(e=>this.error(e)),e.filter(e=>e.$type===`bpmn:Message`).forEach(e=>this.messageName(e)),e.filter(e=>e.$type===`bpmn:Process`).forEach(e=>{this.process=e,this.processAttributes(e),this.common(e),(e.flowElements??[]).forEach(e=>this.flowElement(e)),(e.laneSets??[]).forEach(e=>this.common(e))}),this.process=null,this.leftovers(),this.writeMarkers(),this.platform()}found(e,t,n={},r={}){let{variant:i,...a}=r,o=this.anchor(e),s={...Tr[t],...a},{text:c,english:l}=describeRule(t,s,n,i),u={rule:`migration/${t}`,severity:s.severity,conversion:s.conversion,title:c.title,detail:c.detail,action:c.action,elements:o?.id?[o.id]:[],where:labelOf$1(o),...s.since?{since:s.since}:{},...s.link?{link:s.link}:{}};return this.findings.push(u),u.conversion!==`automatic`&&o&&this.marks.set(o,[...this.marks.get(o)??[],{conversion:u.conversion,...l}]),u}changed(e,t,n,r){this.changes.push({elementId:e?.id??``,where:labelOf$1(e),before:t,after:n,...r?{plain:r}:{}})}get(e,t){return text(e?.get?.(t))??text(e?.$attrs?.[t])}take(e,t){let n=this.get(e,t);if(n!==void 0)return e.$attrs&&t in e.$attrs?delete e.$attrs[t]:e.set(t,void 0),n}keep(e,t){let n=this.kept.get(e)??new Set;n.add(t),this.kept.set(e,n),this.keptCount+=1}isKept(e,t){return this.kept.get(e)?.has(t)===!0}anchor(e){let t=e;for(;t?.$parent&&(!t.id||/EventDefinition$|LoopCharacteristics$|^bpmn:(?:Formal)?Expression$|^bpmn:ExtensionElements$/.test(t.$type));)t=t.$parent;return t}values(e){return e?.extensionElements?.values??[]}extensions(e,t){return this.values(e).filter(e=>e.$type===t)}remove(e,t){e.extensionElements&&(e.extensionElements.values=this.values(e).filter(e=>e!==t),e.extensionElements.values.length===0&&(e.extensionElements=void 0))}add(e,t,n={}){e.extensionElements||(e.extensionElements=this.moddle.create(`bpmn:ExtensionElements`,{values:[]}),e.extensionElements.$parent=e);let r=this.moddle.create(t,n);return r.$parent=e.extensionElements,e.extensionElements.values=[...this.values(e),r],r}single(e,t){return this.extensions(e,t)[0]??this.add(e,t)}feel(e,t,n,r={}){if(!hasJuel(n))return n;let i=juelToFeel(n,r);return i.ok?(i.review.length>0?this.found(e,`expression-review`,{expression:n,feel:i.feel,reason:i.review.join(`; `)}):t===`condition`&&this.found(e,`condition`,{expression:n,feel:i.feel}),i.feel):(this.found(e,`expression-manual`,{expression:n,reason:i.reason}),null)}feelOrLiteral(e,t,n){return n===void 0?`=null`:hasJuel(n)?this.feel(e,t,n):`=${JSON.stringify(n)}`}since(e,t,n,r){return atLeast(this.target,n)?!0:(this.found(e,`element-since`,{what:t,version:n,target:this.target},r?{detail:r,variant:`withDetail`}:{}),!1)}delegate(e,t){this.delegates.push({...t,elementId:e.id,where:labelOf$1(e)})}common(e){let n=[`camunda:asyncBefore`,`camunda:asyncAfter`,`camunda:async`].map(t=>this.take(e,t)).some(e=>e===`true`);this.take(e,`camunda:exclusive`),n&&(this.found(e,`async`),this.changed(e,t(`app.migration.change.asyncBefore`),t(`app.migration.change.removed`),t(`app.migration.change.async`)));let r=this.take(e,`camunda:modelerTemplate`);this.take(e,`camunda:modelerTemplateVersion`),r&&this.found(e,`template`,{template:r}),this.executionListeners(e),this.properties(e)}processAttributes(e){let n=this.take(e,`camunda:versionTag`);n&&(atLeast(this.target,`8.6`)?(this.single(e,`zeebe:VersionTag`).value=n,this.found(e,`version-tag`,{tag:n}),this.changed(e,`camunda:versionTag="${n}"`,`zeebe:versionTag value="${n}"`,t(`app.migration.change.versionTag`,{tag:n}))):this.found(e,`version-tag`,{tag:n},{severity:`warning`,variant:`dropped`,title:`The version tag {tag} is dropped`,detail:`Camunda 8 keeps version tags from 8.6.`}));let r=this.take(e,`camunda:historyTimeToLive`);r&&this.found(e,`history-time-to-live`,{ttl:r}),this.take(e,`camunda:isStartableInTasklist`)!==void 0&&this.found(e,`startable-in-tasklist`),[`camunda:candidateStarterGroups`,`camunda:candidateStarterUsers`].forEach(t=>{let n=this.get(e,t);n&&(this.keep(e,t),this.found(e,`starter-groups`,{groups:n}))}),this.priority(e),this.take(e,`camunda:taskPriority`)&&this.found(e,`external-task-priority`)}priority(e){let t=this.take(e,`camunda:jobPriority`);if(t){if(atLeast(this.target,`8.8`)&&(e.$type===`bpmn:Process`||Jr.has(e.$type))){let n=this.feelOrLiteral(e,`job priority`,t);if(n===null)return;this.single(e,`zeebe:JobPriorityDefinition`).priority=n.startsWith(`="`)?JSON.parse(n.slice(1)):n,this.found(e,`job-priority`,{priority:t})}else this.found(e,`job-priority-dropped`,{priority:t})}}properties(e){this.extensions(e,`camunda:Properties`).forEach(t=>{let n=this.single(e,`zeebe:Properties`),r=(t.values??[]).map(e=>this.moddle.create(`zeebe:Property`,{name:e.name,value:e.value}));n.properties=[...n.properties??[],...r],this.remove(e,t),this.found(e,`properties`)})}flowElement(e){let t=e.$type;switch(this.common(e),t){case`bpmn:ServiceTask`:case`bpmn:SendTask`:this.implementation(e,e);break;case`bpmn:BusinessRuleTask`:this.get(e,`camunda:decisionRef`)?this.decision(e):this.implementation(e,e);break;case`bpmn:ScriptTask`:this.script(e);break;case`bpmn:UserTask`:this.userTask(e);break;case`bpmn:CallActivity`:this.callActivity(e);break;case`bpmn:ReceiveTask`:e.messageRef&&this.found(e,`message-catch`,{message:labelOf$1(e.messageRef)});break;case`bpmn:ComplexGateway`:this.found(e,`unsupported-element`,{what:words(`bpmn:ComplexGateway`),reason:detail(`complexGateway`),action:detail(`complexGatewayAction`)});break;case`bpmn:InclusiveGateway`:(e.incoming??[]).length>1&&this.since(e,`joining inclusive gateway`,`8.6`);break;case`bpmn:Transaction`:this.found(e,`unsupported-element`,{what:words(`bpmn:Transaction`),reason:detail(`transaction`),action:detail(`transactionAction`)});break;case`bpmn:AdHocSubProcess`:this.since(e,words(`bpmn:AdHocSubProcess`),`8.7`);break;case`bpmn:SequenceFlow`:this.condition(e);break;case`bpmn:StartEvent`:this.startEvent(e)}t.endsWith(`Event`)&&this.event(e),this.loop(e),this.inputOutput(e),this.retries(e),this.fields(e),this.priority(e),this.taskListeners(e),(e.flowElements??[]).forEach(e=>this.flowElement(e))}implementation(e,n){let r=this.values(n).find(e=>e.$type===`camunda:Connector`);if(r)return this.keptValues.add(r),this.found(e,`connector`,{connector:text(r.connectorId)??`connector`}),!1;let i=this.get(n,`camunda:topic`),a=this.get(n,`camunda:type`)===`external`||i!==void 0;this.values(n).filter(e=>e.$type===`camunda:ErrorEventDefinition`).forEach(t=>{this.keptValues.add(t),this.found(e,`external-error`,{expression:text(t.expression)??``})});let o=null;if(a){if(!i)return!1;if(hasJuel(i)){let t=this.feel(e,`topic`,i);if(t===null)return this.keep(n,`camunda:topic`),!1;o=t}else o=i;this.take(n,`camunda:type`),this.take(n,`camunda:topic`),this.found(e,`external-task`,{topic:i,jobType:o}),this.delegate(e,{kind:`topic`,value:i,role:`task`,jobType:o}),this.take(n,`camunda:taskPriority`)&&this.found(e,`external-task-priority`)}else{let t=this.get(n,`camunda:class`),r=this.get(n,`camunda:delegateExpression`),i=this.get(n,`camunda:expression`),a=this.get(n,`camunda:resultVariable`);if(t)o=jobTypeFor(`class`,t),this.take(n,`camunda:class`),this.found(e,`java-class`,{className:t,jobType:o}),this.delegate(e,{kind:`class`,value:t,role:`task`,jobType:o});else if(r){let t=/^[$#]\{\s*([A-Za-z_][\w]*)\s*\}$/.exec(r.trim())?.[1];if(!t)return this.keep(n,`camunda:delegateExpression`),this.found(e,`delegate-expression-dynamic`,{expression:r}),!1;o=jobTypeFor(`bean`,t),this.take(n,`camunda:delegateExpression`),this.found(e,`delegate-expression`,{delegate:r,jobType:o}),this.delegate(e,{kind:`bean`,value:t,role:`task`,jobType:o})}else if(i){let t=/^[$#]\{\s*([A-Za-z_]\w*)\s*\.\s*([A-Za-z_]\w*)\s*\([^]*\)\s*\}$/.exec(i.trim());if(!t||t[1]===`execution`)return this.keep(n,`camunda:expression`),a&&this.keep(n,`camunda:resultVariable`),this.found(e,`expression-unknown`,{expression:i}),!1;o=jobTypeFor(`expression`,`${t[1]}.${t[2]}`),this.take(n,`camunda:expression`),this.take(n,`camunda:resultVariable`),this.found(e,`expression`,{expression:i,jobType:o},a?{variant:`withResult`,action:`Write a job worker for {jobType} that makes the call {expression} made and completes the job with the variable {result}.`}:{}),this.delegate(e,{kind:`expression`,value:i,role:`task`,jobType:o})}a&&this.get(n,`camunda:resultVariable`)&&this.take(n,`camunda:resultVariable`)}if(!o)return!1;let s=this.single(e,`zeebe:TaskDefinition`);return s.type=o,this.changed(e,t(`app.migration.change.camunda7Implementation`),`zeebe:taskDefinition type="${o}"`,t(`app.migration.change.jobWorkerTask`,{jobType:o})),!0}retries(e){[e,e.loopCharacteristics].filter(Boolean).forEach(n=>{this.extensions(n,`camunda:FailedJobRetryTimeCycle`).forEach(r=>{let i=text(r.body)??``;this.remove(n,r);let a=this.extensions(e,`zeebe:TaskDefinition`)[0],o=retriesOf(i);a&&o&&n===e?(a.retries=o,this.found(e,`retries`,{cycle:i,retries:o}),this.changed(e,`camunda:failedJobRetryTimeCycle ${i}`,`retries="${o}"`,t(`app.migration.change.retries`,{retries:o}))):this.found(e,`retries-dropped`,{cycle:i})})})}fields(e){let n=this.extensions(e,`camunda:Field`);if(n.length===0)return;let r=this.extensions(e,`zeebe:TaskDefinition`)[0],i=[];n.forEach(t=>{let n=text(t.stringValue)??text(t.string),a=text(t.expression);if(!r||a!==void 0||n===void 0){this.keptValues.add(t),this.found(e,`field-injection-expression`,{field:t.name});return}let o=this.single(e,`zeebe:TaskHeaders`);o.values=[...o.values??[],this.moddle.create(`zeebe:Header`,{key:t.name,value:n})],this.remove(e,t),i.push(t.name)}),i.length>0&&(this.found(e,`field-injection`,{fields:i.join(`, `)}),this.changed(e,`camunda:field ${i.join(`, `)}`,`zeebe:taskHeaders ${i.join(`, `)}`,t(`app.migration.change.fieldHeaders`,{fields:i.join(`, `)})))}parameter(e,t){let n=t.definition;return n?this.definitionValue(e,t.name,n):this.feelOrLiteral(e,`mapping`,text(t.value))}definitionValue(e,t,n){switch(n.$type){case`camunda:Script`:return this.found(e,`input-output-script`,{name:t,format:text(n.scriptFormat)??`script`}),null;case`camunda:List`:{let r=(n.items??[]).map(n=>this.item(e,t,n));return r.some(e=>e===null)?null:`=[${r.join(`, `)}]`}case`camunda:Map`:{let r=(n.entries??[]).map(n=>{let r=n.definition?this.definitionValue(e,t,n.definition):this.feelOrLiteral(e,`mapping`,text(n.value));return r===null?null:`${JSON.stringify(n.key??``)}: ${r.slice(1)}`});return r.some(e=>e===null)?null:`={${r.join(`, `)}}`}default:return this.found(e,`input-output-manual`,{name:t,reason:detail(`mappingValue`,{type:localType(n.$type)})}),null}}item(e,t,n){if(n.$type===`camunda:Value`){let t=this.feelOrLiteral(e,`mapping`,text(n.value));return t===null?null:t.slice(1)}let r=this.definitionValue(e,t,n);return r===null?null:r.slice(1)}inputOutput(e){this.extensions(e,`camunda:InputOutput`).forEach(n=>{let convert=(t,n,r)=>t.filter(t=>{if(!r)return this.found(e,`input-output-manual`,{name:t.name,reason:detail(`noMapping`,{kind:n,element:localType(e.$type)})}),!0;let i=this.parameter(e,t);if(i===null)return!0;let a=this.single(e,`zeebe:IoMapping`),o=this.moddle.create(n===`input`?`zeebe:Input`:`zeebe:Output`,{source:i,target:t.name});return n===`input`?a.inputParameters=[...a.inputParameters??[],o]:a.outputParameters=[...a.outputParameters??[],o],!1}),r=convert(n.inputParameters??[],`input`,Yr.has(e.$type)),i=convert(n.outputParameters??[],`output`,Xr.has(e.$type)),a=(n.inputParameters?.length??0)+(n.outputParameters?.length??0)-r.length-i.length;a>0&&(this.found(e,`input-output`),this.changed(e,`camunda:inputOutput`,`zeebe:ioMapping, ${a} parameter${a===1?``:`s`}`,t(`app.migration.change.ioMapping`,{count:a}))),r.length+i.length===0?this.remove(e,n):(n.inputParameters=r,n.outputParameters=i,this.keptValues.add(n))})}condition(e){let n=e.conditionExpression;if(!n)return;let r=text(n.language),i=this.get(n,`camunda:resource`);if(i){this.keep(n,`camunda:resource`),this.found(e,`script-resource`,{resource:i});return}if(r&&!/^(juel|feel)$/i.test(r)){this.found(e,`script-condition`,{format:r});return}let a=text(n.body);if(!a)return;if(r?.toLowerCase()===`feel`){n.body=a.startsWith(`=`)?a:`=${a}`,n.language=void 0,this.changed(e,a,n.body,t(`app.migration.change.conditionFeel`));return}let o=this.feel(e,`condition`,a);o!==null&&(n.body=o,n.language=void 0,this.changed(e,a,o,t(`app.migration.change.conditionRewritten`)))}loop(e){let n=e.loopCharacteristics;if(n?.$type!==`bpmn:MultiInstanceLoopCharacteristics`){n?.$type===`bpmn:StandardLoopCharacteristics`&&this.found(e,`unsupported-element`,{what:`standard loop`,reason:detail(`standardLoop`),action:detail(`standardLoopAction`)});return}this.common(n);let r=this.get(n,`camunda:collection`),i=this.get(n,`camunda:elementVariable`),a=text(n.loopCardinality?.body),zeebeLoop=()=>this.single(n,`zeebe:LoopCharacteristics`);if(r){let a=hasJuel(r)?this.feel(e,`collection`,r,{multiInstance:!0}):`=${r}`;if(a===null)this.keep(n,`camunda:collection`),i&&this.keep(n,`camunda:elementVariable`);else{this.take(n,`camunda:collection`),this.take(n,`camunda:elementVariable`);let o=zeebeLoop();o.inputCollection=a,i&&(o.inputElement=i),this.found(e,`multi-instance`,{collection:r}),this.changed(e,`camunda:collection="${r}"`,`inputCollection="${a}"`,t(`app.migration.change.collection`,{collection:r}))}}else if(a){let r=hasJuel(a)?this.feel(e,`cardinality`,a,{multiInstance:!0}):`=${a.trim()}`;if(r!==null){n.loopCardinality=void 0;let i=/^[\w.]+$/.test(r.slice(1))?r.slice(1):`(${r.slice(1)})`;zeebeLoop().inputCollection=`=for i in 1..${i} return i`,this.found(e,`multi-instance-cardinality`,{cardinality:a}),this.changed(e,`loopCardinality ${a}`,`inputCollection="=for i in 1..${i} return i"`,t(`app.migration.change.loopCount`,{cardinality:a}))}}else this.extensions(n,`zeebe:LoopCharacteristics`)[0]?.inputCollection||this.found(e,`multi-instance-missing`);let o=text(n.completionCondition?.body);if(o&&hasJuel(o)){let r=this.feel(e,`completion condition`,o,{multiInstance:!0});r!==null&&(n.completionCondition.body=r,n.completionCondition.language=void 0,this.changed(e,o,r,t(`app.migration.change.completionCondition`)))}}startEvent(e){let t=this.get(e,`camunda:initiator`);t&&(this.keep(e,`camunda:initiator`),this.found(e,`initiator`,{variable:t})),this.form(e)}event(e){(e.eventDefinitions??[]).forEach(t=>{switch(this.common(t),t.$type){case`bpmn:MessageEventDefinition`:this.messageEvent(e,t);break;case`bpmn:TimerEventDefinition`:this.timer(e,t);break;case`bpmn:ErrorEventDefinition`:this.errorEvent(e,t);break;case`bpmn:EscalationEventDefinition`:{let n=this.get(t,`camunda:escalationCodeVariable`);n&&(this.keep(t,`camunda:escalationCodeVariable`),this.found(e,`escalation-code-variable`,{variable:n}));break}case`bpmn:SignalEventDefinition`:this.signal(e,t);break;case`bpmn:ConditionalEventDefinition`:this.conditional(e,t);break;case`bpmn:CompensateEventDefinition`:this.since(e,`compensation event`,`8.5`);break;case`bpmn:CancelEventDefinition`:this.found(e,`unsupported-element`,{what:`cancel event`,reason:detail(`cancelEvent`),action:detail(`cancelEventAction`)})}})}messageEvent(e,t){if(e.$type===`bpmn:EndEvent`||e.$type===`bpmn:IntermediateThrowEvent`){if(![`camunda:class`,`camunda:delegateExpression`,`camunda:expression`,`camunda:topic`].some(e=>this.get(t,e))){this.found(e,`message-throw-empty`);return}let n=this.findings.length;if(this.implementation(e,t)){let t=this.extensions(e,`zeebe:TaskDefinition`)[0]?.type,r=new Set([`migration/java-class`,`migration/delegate-expression`,`migration/expression`,`migration/external-task`]),i=this.findings.findIndex((e,t)=>t>=n&&r.has(e.rule));i>=0&&this.findings.splice(i,1);let a=this.delegates[this.delegates.length-1];this.found(e,`message-throw`,{implementation:a?.value??`the implementation`,jobType:t??``})}}else(qr.has(e.$type)||e.$type===`bpmn:StartEvent`&&e.$parent?.$type===`bpmn:SubProcess`)&&t.messageRef&&this.found(e,`message-catch`,{message:labelOf$1(t.messageRef)})}messageName(e){let n=text(e.name);if(!n||!hasJuel(n))return;let r=juelToFeel(n);r.ok?(r.review.length>0?this.found(e,`expression-review`,{expression:n,feel:r.feel,reason:r.review.join(`; `)}):this.found(e,`message-name-expression`,{name:n,feel:r.feel}),this.changed(e,n,r.feel,t(`app.migration.change.messageName`,{name:n})),e.name=r.feel):this.found(e,`expression-manual`,{expression:n,reason:r.reason})}timer(e,n){[`timeDate`,`timeDuration`,`timeCycle`].forEach(r=>{let i=n[r],a=text(i?.body);if(a){if(hasJuel(a)){let n=this.feel(e,`timer`,a);if(n===null)return;i.body=n,this.found(e,`timer`,{timer:a}),this.changed(e,a,n,t(`app.migration.change.timer`))}else r===`timeCycle`&&looksLikeCron(a)&&this.found(e,`timer-cron`,{cycle:a})}})}errorEvent(e,n){let r=this.take(n,`camunda:errorCodeVariable`),i=this.take(n,`camunda:errorMessageVariable`);[[r,`errorCode`],[i,`errorMessage`]].forEach(([n,r])=>{if(!n||!r)return;let i=this.single(e,`zeebe:IoMapping`);i.outputParameters=[...i.outputParameters??[],this.moddle.create(`zeebe:Output`,{source:`=${r}`,target:n})],this.found(e,`error-code-variable`,{variable:n}),this.changed(e,`camunda:${r}Variable="${n}"`,`zeebe:output source="=${r}" target="${n}"`,t(`app.migration.change.errorVariable`,{source:r,variable:n}))})}error(e){let t=this.take(e,`camunda:errorMessage`);t&&this.found(e,`error-message`,{message:t});let n=text(e.errorCode);n&&hasJuel(n)&&this.found(e,`expression-manual`,{expression:n,reason:detail(`errorCode`)})}signal(e,t){let n=this.extensions(t,`camunda:In`);if(n.length===0)return;let r=e.$type===`bpmn:EndEvent`||e.$type===`bpmn:IntermediateThrowEvent`,i=labelOf$1(t.signalRef);n.forEach(n=>{let i=text(n.source)??text(n.sourceExpression),a=text(n.target);if(!r||!i||!a||text(n.variables)){this.keptValues.add(n);return}let o=text(n.sourceExpression)?this.feel(e,`signal variable`,i):`=${i}`;if(o===null){this.keptValues.add(n);return}let s=this.single(e,`zeebe:IoMapping`);s.inputParameters=[...s.inputParameters??[],this.moddle.create(`zeebe:Input`,{source:o,target:a})],this.remove(t,n)}),this.found(e,`signal-variables`,{signal:i})}conditional(e,t){if(!this.since(e,`conditional event`,`8.9`)){this.keep(t,`camunda:variableName`),this.keep(t,`camunda:variableEvents`);return}let n=text(t.condition?.body),r=this.take(t,`camunda:variableName`),i=this.take(t,`camunda:variableEvents`);if(n){let r=this.feel(e,`condition`,n);r!==null&&(t.condition.body=r,t.condition.language=void 0)}if(r||i){let e=this.single(t,`zeebe:ConditionalFilter`);r&&(e.variableNames=r),i&&(e.variableEvents=i)}this.found(e,`conditional-event`,{variables:r??`any variable`})}script(e){let n=text(e.scriptFormat)?.toLowerCase(),r=this.get(e,`camunda:resource`),i=this.get(e,`camunda:resultVariable`);if(r){this.keep(e,`camunda:resource`),i&&this.keep(e,`camunda:resultVariable`),this.found(e,`script-resource`,{resource:r});return}let a=text(e.script);if(n===`feel`&&a){let r=i??`result`;e.scriptFormat=void 0,e.script=void 0,this.take(e,`camunda:resultVariable`);let o=this.single(e,`zeebe:Script`);o.expression=a.trim().startsWith(`=`)?a.trim():`=${a.trim()}`,o.resultVariable=r,this.found(e,`script-task-feel`,{variable:r},i?{}:{severity:`warning`,conversion:`review`,variant:`noResult`,title:`The FEEL script's result goes to {variable}`,detail:`Camunda 8 needs a result variable for a FEEL script task, and the Camunda 7 task had none.`,action:`Rename {variable} if something should read the result.`}),this.changed(e,`${n} script`,`zeebe:script expression`,t(`app.migration.change.feelScript`))}else i&&this.keep(e,`camunda:resultVariable`),this.found(e,`script-task`,{format:n??`script`})}userTask(e){atLeast(this.target,`8.5`)&&this.extensions(e,`zeebe:UserTask`).length===0&&(this.add(e,`zeebe:UserTask`),this.found(e,`user-task`),this.changed(e,t(`app.migration.change.userTaskBefore`),`zeebe:userTask`,t(`app.migration.change.userTask`)));let n={};[`assignee`,`candidateUsers`,`candidateGroups`].forEach(t=>{let r=this.get(e,`camunda:${t}`);if(!r)return;let i=this.userTaskValue(e,t,r,t!==`assignee`);i===null?this.keep(e,`camunda:${t}`):(this.take(e,`camunda:${t}`),n[t]=i)}),Object.keys(n).length>0&&(Object.assign(this.single(e,`zeebe:AssignmentDefinition`),n),this.changed(e,`camunda assignment`,`zeebe:assignmentDefinition ${Object.keys(n).join(`, `)}`,t(`app.migration.change.assignment`)));let r={};[`dueDate`,`followUpDate`].forEach(t=>{let n=this.get(e,`camunda:${t}`);if(!n)return;let i=this.userTaskValue(e,t,n,!1);i===null?this.keep(e,`camunda:${t}`):(this.take(e,`camunda:${t}`),r[t]=i)}),Object.keys(r).length>0&&Object.assign(this.single(e,`zeebe:TaskSchedule`),r);let i=this.get(e,`camunda:priority`);if(i){if(!atLeast(this.target,`8.6`))this.take(e,`camunda:priority`),this.found(e,`user-task-priority-dropped`,{priority:i});else{let t=this.userTaskValue(e,`priority`,i,!1);if(t===null)this.keep(e,`camunda:priority`);else{this.take(e,`camunda:priority`),this.single(e,`zeebe:PriorityDefinition`).priority=t;let n=Number(t);!hasJuel(i)&&(!Number.isInteger(n)||n<0||n>100)&&this.found(e,`user-task-priority-range`,{priority:i})}}}this.form(e)}userTaskValue(e,t,n,r){if(!hasJuel(n))return n;let i=juelToFeel(n);return i.ok?(i.review.length>0?this.found(e,`user-task-expression`,{name:t,expression:n,feel:i.feel,reason:i.review.join(`; `)}):r&&this.found(e,`assignment-review`,{name:t,expression:n}),i.feel):(this.found(e,`expression-manual`,{expression:n,reason:i.reason}),null)}form(e){let n=this.get(e,`camunda:formKey`),r=this.get(e,`camunda:formRef`),i=this.get(e,`camunda:formRefBinding`),a=this.get(e,`camunda:formRefVersion`),o=this.extensions(e,`camunda:FormData`)[0];this.get(e,`camunda:formHandlerClass`)&&this.keep(e,`camunda:formHandlerClass`);let s=e.$type===`bpmn:StartEvent`;if(r){if(i===`version`){this.keep(e,`camunda:formRef`),this.keep(e,`camunda:formRefBinding`),this.keep(e,`camunda:formRefVersion`),this.found(e,`form-binding-version`,{version:a??``});return}let n=this.single(e,`zeebe:FormDefinition`);n.formId=r,i&&i!==`latest`&&atLeast(this.target,`8.6`)&&(n.bindingType=i,i===`versionTag`&&a&&(n.versionTag=a)),[`camunda:formRef`,`camunda:formRefBinding`,`camunda:formRefVersion`].forEach(t=>this.take(e,t)),this.found(e,`form-camunda`,{form:r}),this.changed(e,`camunda:formRef="${r}"`,`zeebe:formDefinition formId="${r}"`,t(`app.migration.change.formRef`,{form:r}))}else if(n){let r=/^camunda-forms:(deployment|app):(.+)$/.exec(n);if(r){let i=r[2],a=i.split(`/`).pop()??i,o=this.options.forms?.get(a)??this.options.forms?.get(i),s=o??a.replace(/\.form$/,``),c=this.single(e,`zeebe:FormDefinition`);c.formId=s,r[1]===`deployment`&&atLeast(this.target,`8.6`)&&(c.bindingType=`deployment`),this.take(e,`camunda:formKey`),this.found(e,o?`form-camunda`:`form-camunda-unknown`,{form:o?s:i}),this.changed(e,`camunda:formKey="${n}"`,`zeebe:formDefinition formId="${s}"`,t(`app.migration.change.formRef`,{form:s}));return}if(/^embedded:/.test(n)){this.keep(e,`camunda:formKey`),this.found(e,`form-embedded`,{formKey:n});return}if(s||!atLeast(this.target,`8.4`)){this.keep(e,`camunda:formKey`),this.found(e,`form-embedded`,{formKey:n},{variant:`here`,title:`The form key {formKey} has no Camunda 8 counterpart here`});return}this.single(e,`zeebe:FormDefinition`).externalReference=n,this.take(e,`camunda:formKey`),this.found(e,`form-external`,{formKey:n}),this.changed(e,`camunda:formKey="${n}"`,`zeebe:formDefinition externalReference="${n}"`,t(`app.migration.change.externalForm`,{formKey:n}))}else if(o){let n=`${this.process?.id??`process`}-${e.id}`,r=generatedForm(n,o);this.extraFiles.push({name:`${n}.form`,content:r.json,reason:t(`app.migration.extraFile.form`,{where:labelOf$1(e)})}),this.single(e,`zeebe:FormDefinition`).formId=n,this.remove(e,o),this.found(e,`form-generated`,{form:`${n}.form`}),r.lost.length>0&&this.found(e,`form-generated-partly`,{lost:r.lost.join(`, `)}),this.changed(e,`camunda:formData`,`zeebe:formDefinition formId="${n}" and ${n}.form`,t(`app.migration.change.generatedForm`,{form:n}))}}decision(e){let n=this.get(e,`camunda:decisionRef`)??``,r=this.get(e,`camunda:decisionRefBinding`),i=this.get(e,`camunda:decisionRefVersion`),a=this.get(e,`camunda:decisionRefTenantId`),o=this.get(e,`camunda:resultVariable`),s=this.get(e,`camunda:mapDecisionResult`);if(r===`version`){this.keep(e,`camunda:decisionRefBinding`),this.keep(e,`camunda:decisionRefVersion`),this.keep(e,`camunda:decisionRef`),this.found(e,`binding-version`,{what:detail(`decisionBound`,{name:n}),version:i??``});return}let c=hasJuel(n)?this.feel(e,`decision`,n):n;if(c===null){this.keep(e,`camunda:decisionRef`);return}let l=this.single(e,`zeebe:CalledDecision`);l.decisionId=c,l.resultVariable=o??`result`,r&&r!==`latest`&&(atLeast(this.target,`8.6`)?(l.bindingType=r,r===`versionTag`&&i&&(l.versionTag=i)):this.found(e,`binding-dropped`,{binding:r,target:n})),[`camunda:decisionRef`,`camunda:decisionRefBinding`,`camunda:decisionRefVersion`,`camunda:resultVariable`,`camunda:mapDecisionResult`].forEach(t=>this.take(e,t)),this.found(e,`decision`,{decision:n,result:l.resultVariable}),o||this.found(e,`decision-result-variable`,{result:`result`}),s!==`singleEntry`&&o&&this.found(e,`decision-result`,{mapping:s??`resultList`,result:o}),a&&(this.keep(e,`camunda:decisionRefTenantId`),this.found(e,`tenant`,{tenant:a})),this.changed(e,`camunda:decisionRef="${n}"`,`zeebe:calledDecision decisionId="${c}" resultVariable="${l.resultVariable}"`,t(`app.migration.change.calledDecision`,{decision:c,result:l.resultVariable}))}callActivity(e){let n=text(e.calledElement),r=this.get(e,`camunda:calledElementBinding`),i=this.get(e,`camunda:calledElementVersion`),a=this.get(e,`camunda:calledElementVersionTag`),o=this.get(e,`camunda:calledElementTenantId`),s=this.get(e,`camunda:caseRef`);s&&([`camunda:caseRef`,`camunda:caseBinding`,`camunda:caseVersion`,`camunda:caseTenantId`].forEach(t=>this.keep(e,t)),this.found(e,`cmmn`,{case:s})),[`camunda:variableMappingClass`,`camunda:variableMappingDelegateExpression`].forEach(t=>{this.get(e,t)&&(this.keep(e,t),this.found(e,`call-activity-mapping-class`,{process:n??`the called process`}))}),o&&(this.keep(e,`camunda:calledElementTenantId`),this.found(e,`tenant`,{tenant:o}));let c=n??this.extensions(e,`zeebe:CalledElement`)[0]?.processId??`the called process`;if(this.extensions(e,`camunda:In`).filter(e=>text(e.businessKey)).forEach(t=>{this.keptValues.add(t),this.found(e,`call-activity-business-key`,{process:c})}),!n)return;if(r===`version`){this.keep(e,`camunda:calledElementBinding`),this.keep(e,`camunda:calledElementVersion`),this.found(e,`binding-version`,{what:detail(`callBound`,{name:n}),version:i??``});return}let l=hasJuel(n)?this.feel(e,`called element`,n):n;if(l===null)return;let u=this.single(e,`zeebe:CalledElement`);u.processId=l,e.calledElement=void 0,r&&r!==`latest`&&(atLeast(this.target,`8.6`)?(u.bindingType=r,r===`versionTag`&&a&&(u.versionTag=a)):this.found(e,`binding-dropped`,{binding:r,target:n})),[`camunda:calledElementBinding`,`camunda:calledElementVersion`,`camunda:calledElementVersionTag`].forEach(t=>this.take(e,t)),this.variables(e,u,n),this.found(e,`call-activity`,{process:n}),this.changed(e,`calledElement="${n}"`,`zeebe:calledElement processId="${l}"`,t(`app.migration.change.calledProcess`,{process:l}))}variables(e,t,n){let r=this.extensions(e,`camunda:In`),i=this.extensions(e,`camunda:Out`),all=e=>e.some(e=>text(e.variables)===`all`);t.propagateAllParentVariables=all(r),t.propagateAllChildVariables=all(i);let map=(t,r)=>t.forEach(t=>{if(text(t.variables)===`all`){t.local===!0&&this.found(e,`call-activity-local`,{process:n}),this.remove(e,t);return}if(text(t.businessKey))return;let i=text(t.target),a=text(t.sourceExpression),o=a?this.feel(e,`variable`,a):text(t.source)?`=${text(t.source)}`:`=null`;if(!i||o===null){this.keptValues.add(t),i||this.found(e,`input-output-manual`,{name:n,reason:detail(`noTarget`)});return}t.local===!0&&this.found(e,`call-activity-local`,{process:n});let s=this.single(e,`zeebe:IoMapping`),c=this.moddle.create(r===`input`?`zeebe:Input`:`zeebe:Output`,{source:o,target:i});r===`input`?s.inputParameters=[...s.inputParameters??[],c]:s.outputParameters=[...s.outputParameters??[],c],this.remove(e,t)});map(r,`input`),map(i,`output`)}executionListeners(e){let n=this.extensions(e,`camunda:ExecutionListener`);n.length!==0&&n.forEach(n=>{let r=text(n.event)??`start`,i=text(n.class)??text(n.delegateExpression)??text(n.expression)??(n.script?`${text(n.script.scriptFormat)??``} script`:`listener`),refuse=(t,a)=>{this.keptValues.add(n),this.found(e,`execution-listener-unsupported`,{event:r,name:i,reason:detail(t,a)})};if(!atLeast(this.target,`8.6`))return refuse(`listenersOldTarget`,{target:this.target});if(r===`take`||e.$type===`bpmn:SequenceFlow`)return refuse(`listenersNoSequenceFlow`);if(!Zr.test(e.$type))return refuse(`listenersNoOn`,{element:localType(e.$type)});if(r===`start`&&(e.$type===`bpmn:BoundaryEvent`||e.$type===`bpmn:StartEvent`&&e.$parent?.$type!==`bpmn:SubProcess`))return refuse(`listenersEndOnly`,{element:localType(e.$type)});if((n.fields??[]).length>0)return refuse(`listenersFields`);let a=this.listenerJob(e,n,`executionListener`,r);if(!a)return refuse(`listenersExpression`);let o=this.single(e,`zeebe:ExecutionListeners`);o.listeners=[...o.listeners??[],this.moddle.create(`zeebe:ExecutionListener`,{eventType:r,type:a})],this.remove(e,n),this.found(e,`execution-listener`,{event:r,name:i,jobType:a}),this.changed(e,`camunda:executionListener ${r} ${i}`,`zeebe:executionListener ${r} type="${a}"`,t(`app.migration.change.listener`,{event:r,name:i,jobType:a}))})}taskListeners(e){this.extensions(e,`camunda:TaskListener`).forEach(n=>{let r=text(n.event)??`create`,i=text(n.class)??text(n.delegateExpression)??text(n.expression)??(n.script?`${text(n.script.scriptFormat)??``} script`:`listener`),refuse=(t,a)=>{this.keptValues.add(n),this.found(e,`task-listener-unsupported`,{event:r,name:i,reason:detail(t,a)})},a=own$1(Qr,r);if(!atLeast(this.target,`8.8`))return refuse(`taskListenersOldTarget`,{target:this.target});if(!a)return refuse(`taskListenersNoEvent`,{event:r});if((n.fields??[]).length>0)return refuse(`listenersFields`);let o=this.listenerJob(e,n,`taskListener`,r);if(!o)return refuse(`listenersExpression`);let s=this.single(e,`zeebe:TaskListeners`);s.listeners=[...s.listeners??[],this.moddle.create(`zeebe:TaskListener`,{eventType:a,type:o})],this.remove(e,n),this.found(e,`task-listener`,{event:r,name:i,jobType:o}),this.changed(e,`camunda:taskListener ${r} ${i}`,`zeebe:taskListener ${a} type="${o}"`,t(`app.migration.change.listener`,{event:r,name:i,jobType:o}))})}listenerJob(e,t,n,r){let i=text(t.class);if(i){let t=jobTypeFor(`class`,i);return this.delegate(e,{kind:`class`,value:i,role:n,jobType:t,event:r}),t}let a=/^[$#]\{\s*([A-Za-z_]\w*)\s*\}$/.exec(text(t.delegateExpression)?.trim()??``)?.[1];if(a){let t=jobTypeFor(`bean`,a);return this.delegate(e,{kind:`bean`,value:a,role:n,jobType:t,event:r}),t}return null}removeMarkers(e){let walk=(e,t)=>{e&&typeof e==`object`&&!t.has(e)&&(t.add(e),e.extensionElements?.values&&(e.extensionElements.values=e.extensionElements.values.filter(e=>e.$type!==`conversion:message`),e.extensionElements.values.length===0&&(e.extensionElements=void 0)),[`rootElements`,`flowElements`,`eventDefinitions`,`laneSets`,`lanes`,`artifacts`].forEach(n=>(e[n]??[]).forEach(e=>walk(e,t))),e.loopCharacteristics&&walk(e.loopCharacteristics,t))};walk(e,new Set)}leftovers(){let e=new Set,walk=t=>{t&&typeof t==`object`&&!e.has(t)&&t.$descriptor&&(e.add(t),(t.$descriptor.properties??[]).forEach(e=>{if(e.ns?.prefix!==`camunda`||!e.isAttr)return;let n=t.get(e.name);n==null||n===``||this.isKept(t,e.ns.name)||(e.default===void 0||n!==e.default)&&(this.found(t,`unknown-attribute`,{attribute:`${e.ns.name}="${String(n)}"`}),this.keep(t,e.ns.name))}),Object.keys(t.$attrs??{}).filter(e=>e.startsWith(`camunda:`)).forEach(e=>{this.isKept(t,e)||(this.found(t,`unknown-attribute`,{attribute:`${e}="${t.$attrs[e]}"`}),this.keep(t,e))}),(t.extensionElements?.values??[]).forEach(e=>{if(typeof e.$type==`string`&&e.$type.startsWith(`camunda:`)&&!this.keptValues.has(e)){let n=$r.has(e.$type)?`left after conversion`:localType(e.$type);this.found(t,`unknown-attribute`,{attribute:`camunda:${e.$type.slice(8).replace(/^./,e=>e.toLowerCase())} (${n})`}),this.keptValues.add(e)}}),[`rootElements`,`flowElements`,`eventDefinitions`,`laneSets`,`lanes`,`artifacts`].forEach(e=>(t[e]??[]).forEach(walk)),[`loopCharacteristics`,`conditionExpression`,`completionCondition`,`loopCardinality`,`timeDate`,`timeDuration`,`timeCycle`,`condition`].forEach(e=>walk(t[e])))};walk(this.definitions)}writeMarkers(){this.marks.size!==0&&(this.marks.forEach((e,t)=>{t.extensionElements||(t.extensionElements=this.moddle.create(`bpmn:ExtensionElements`,{values:[]}),t.extensionElements.$parent=t);let n=e.map(e=>{let n=this.moddle.createAny(`conversion:message`,Kr,{severity:e.conversion===`manual`?`TASK`:`REVIEW`,$body:`${e.title}. ${e.action}`});return n.$parent=t.extensionElements,n});t.extensionElements.values=[...this.values(t),...n]}),this.definitions.$attrs[`xmlns:conversion`]=Kr)}platform(){let e=this.definitions.$attrs??(this.definitions.$attrs={}),n=e[`modeler:executionPlatform`];e[`xmlns:modeler`]=Gr,e[`modeler:executionPlatform`]=R,e[`modeler:executionPlatformVersion`]=`${this.target}.0`,e[`xmlns:zeebe`]=Wr,this.findings.some(e=>e.conversion===`manual`)||this.keptCount>0||delete e[`xmlns:camunda`],this.found(this.definitions,`platform`,{target:this.target}),this.changed(this.definitions,`executionPlatform ${n??`unset`}`,`${R} ${this.target}.0`,t(`app.migration.change.platform`,{target:this.target}))}};function isCamunda7Bpmn(e){return e.includes(`executionPlatform="Camunda Cloud"`)?!1:e.includes(`http://camunda.org/schema/1.0/bpmn`)||e.includes(`http://operaton.org/schema/1.0/bpmn`)||e.includes(`executionPlatform="${ct}"`)}function asCamunda7(e){return e.includes(`http://operaton.org/schema/1.0/bpmn`)?e.split(Ur).join(Hr).replace(/<[^>]*>/g,e=>e.replace(/(^<\/?|\s)operaton:(?=[A-Za-z])/g,`$1camunda:`).replace(/xmlns:operaton=/g,`xmlns:camunda=`)):e}async function migrateBpmn(e,n={}){if(!isCamunda7Bpmn(e)&&/<(?:\w+:)?definitions\b/.test(e))return{ok:!0,source:!1,text:e,changes:[],open:[],extraFiles:[],findings:[],delegates:[]};let r=await T(asCamunda7(e),`migration`);if(!r)return{ok:!1,source:!1,text:e,changes:[],open:[],extraFiles:[],findings:[],delegates:[],failure:t(`app.migration.failure.notBpmn`)};if(!isCamunda7Bpmn(e))return{ok:!0,source:!1,text:e,changes:[],open:[],extraFiles:[],findings:[],delegates:[]};let i=new BpmnMigration(r,n);return i.run(),{ok:!0,source:!0,text:await f(r),changes:i.changes,open:i.findings.filter(e=>e.conversion!==`automatic`),extraFiles:i.extraFiles,findings:i.findings,delegates:i.delegates}}var ei=`https://www.omg.org/spec/DMN/20191111/MODEL/`,ti={"http://www.omg.org/spec/DMN/20151101/dmn.xsd":`1.1`,"http://www.omg.org/spec/DMN/20180521/MODEL/":`1.2`,"https://www.omg.org/spec/DMN/20180521/MODEL/":`1.2`},ni=`http://camunda.org/schema/modeler/1.0`;function finding(e,t,n,r,i){let{variant:a,...o}=n,s={...Tr[e],...o};return{rule:`migration/${e}`,severity:s.severity,conversion:s.conversion,...describeRule(e,s,t,a).text,elements:i?[i]:[],where:r,...s.link?{link:s.link}:{}}}function labelOf(e){let t=typeof e?.name==`string`?e.name.replace(/\s+/g,` `).trim():``,n=typeof e?.label==`string`?e.label.trim():``;return t||n||e?.id||`the decisions`}function isFeel(e){return typeof e!=`string`||e===``||/feel/i.test(e)}function definitionsHeader(e){try{let t=parseXml(e);return t.local===`definitions`?t.attrs:{}}catch{return{}}}async function migrateDmn(e,n={}){let r=n.target??`8.8`,i=d(`migration`),{xml:a,from:o}=await migrateDmn$1(e),s=definitionsHeader(a),c=s.xmlns??``;if(!o&&c&&c!==ei){let t={id:s.id,name:s.name},n=[];return n.push(finding(`dmn-version`,{version:own$1(ti,c)??c},{},t.name??t.id??`the decisions`,t.id)),{ok:!0,source:!0,text:e,findings:n,changes:[]}}let l;try{({rootElement:l}=await i.fromXML(a,`dmn:Definitions`))}catch{l=null}if(!l)return{ok:!1,source:!1,text:e,findings:[],changes:[],failure:t(`app.migration.failure.notDmn`)};let u=l.$attrs??{},f=u[`modeler:executionPlatform`];if(f!==ct)return{ok:!0,source:!1,text:e,findings:[],changes:[]};let p=[],m=[];o&&(p.push(finding(`dmn-version`,{version:o},{severity:`info`,conversion:`automatic`,variant:`converted`,detail:`Camunda 8 reads DMN 1.3, so the file is written as DMN 1.3.`,action:`Nothing to do.`},labelOf(l),l.id)),m.push({elementId:l.id??``,where:labelOf(l),before:`DMN ${o}`,after:`DMN 1.3`,plain:t(`app.migration.change.dmnVersion`)}));let found=(e,t,n={})=>{p.push(finding(t,n,{},labelOf(e),e?.id))},changed=(e,t,n,r)=>{m.push({elementId:e?.id??``,where:labelOf(e),before:t,after:n,...r?{plain:r}:{}})};isFeel(l.expressionLanguage)||found(l,`dmn-expression-language`,{what:`The decision file`,language:String(l.expressionLanguage)});let literal=(e,n,r,i)=>{let a=n?.expressionLanguage;if(isFeel(a))return;let o=n.text??``;if(i||!/^juel$/i.test(String(a))||!hasJuel(o)){found(e,`dmn-expression-language`,{what:r,language:String(a)});return}let s=juelToFeel(o);if(!s.ok){found(e,`expression-manual`,{expression:o,reason:s.reason});return}let c=s.feel.replace(/^=/,``);n.text=c,n.expressionLanguage=void 0,found(e,`dmn-juel`,{what:r,feel:c}),changed(e,o,c,t(`app.migration.change.expressionRewritten`))};(l.drgElement??[]).filter(e=>e.$type===`dmn:Decision`).forEach(e=>{let n=e.get(`camunda:historyTimeToLive`);n!==void 0&&(e.set(`camunda:historyTimeToLive`,void 0),found(e,`dmn-history-time-to-live`,{decision:labelOf(e)}),changed(e,`camunda:historyTimeToLive="${n}"`,t(`app.migration.change.removed`),t(`app.migration.change.dmnHistoryTimeToLive`)));let r=e.decisionLogic;r?.$type===`dmn:LiteralExpression`&&literal(e,r,t(`app.migration.detail.decisionNamed`,{name:labelOf(e)}),!1),r?.$type===`dmn:DecisionTable`&&((r.input??[]).forEach(e=>{let n=e.get(`camunda:inputVariable`);n&&found(e,`dmn-input-variable`,{input:labelOf(e),variable:n}),e.inputExpression&&literal(e,e.inputExpression,t(`app.migration.detail.inputNamed`,{name:labelOf(e)}),!1)}),(r.rule??[]).forEach(e=>{(e.inputEntry??[]).forEach(n=>literal(e,n,t(`app.migration.detail.ruleCondition`,{rule:e.id}),!0)),(e.outputEntry??[]).forEach(n=>literal(e,n,t(`app.migration.detail.ruleOutput`,{rule:e.id}),!1))}))});let h=p.some(e=>e.conversion===`manual`);p.every(e=>e.rule===`migration/dmn-version`)&&found(l,`dmn-carries-over`),u[`xmlns:modeler`]=u[`xmlns:modeler`]??ni,changed(l,`executionPlatform ${f}`,`Camunda Cloud ${r}.0`,t(`app.migration.change.dmnPlatform`,{target:r})),u[`modeler:executionPlatform`]=R,u[`modeler:executionPlatformVersion`]=`${r}.0`,!h&&l.$attrs?.[`xmlns:camunda`]&&delete l.$attrs[`xmlns:camunda`];let{xml:g}=await i.toXML(l,{format:!0});return{ok:!0,source:!0,text:g,findings:p,changes:m}}function migrateForm(e,n={}){let r=n.target??`8.8`,i;try{let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`not a form`);i=t}catch{return{ok:!1,source:!1,text:e,findings:[],changes:[],failure:t(`app.migration.failure.notForm`)}}if(i.executionPlatform!==ct)return{ok:!0,source:!1,text:e,findings:[],changes:[]};let a=Tr[`form-platform`],o=typeof i.id==`string`?i.id:``,s={rule:`migration/form-platform`,severity:a.severity,conversion:a.conversion,...describeRule(`form-platform`,a).text,elements:o?[o]:[],where:o||`the form`,link:a.link},c=/^\{\n( +)"/.exec(e)?.[1].length??2,l={...i,executionPlatform:R,executionPlatformVersion:`${r}.0`};return{ok:!0,source:!0,text:`${JSON.stringify(l,null,c)}${e.endsWith(`
598
+ `)?`
599
+ `:``}`,findings:[s],changes:[{elementId:o,where:o||`the form`,before:`executionPlatform ${String(i.executionPlatform)}`,after:`Camunda Cloud ${r}.0`,plain:t(`app.migration.change.formPlatform`,{target:r})}]}}function migrationKind(e){return kindOf$4(e)}async function migrateFile(e,t,n={}){let r=migrationKind(e);switch(r){case`bpmn`:{let i=await migrateBpmn(t,n);return{path:e,kind:r,ok:i.ok,source:i.source,text:i.text,changes:i.changes,findings:i.findings,open:i.open,delegates:i.delegates,extraFiles:i.extraFiles,failure:i.failure}}case`dmn`:{let i=await migrateDmn(t,n);return{path:e,kind:r,ok:i.ok,source:i.source,text:i.text,changes:i.changes,findings:i.findings,open:i.findings.filter(e=>e.conversion!==`automatic`),delegates:[],extraFiles:[],failure:i.failure}}case`form`:{let i=migrateForm(t,n);return{path:e,kind:r,ok:i.ok,source:i.source,text:i.text,changes:i.changes,findings:i.findings,open:i.findings.filter(e=>e.conversion!==`automatic`),delegates:[],extraFiles:[],failure:i.failure}}default:return null}}function copyPathFor(e){let t=/^(.*?)((?:\.bpmn(?:20)?\.xml)|\.bpmn|\.dmn|\.form)$/i.exec(e);return t?`${t[1]}.c8${t[2]}`:`${e}.c8`}function folderOf(e){let t=Math.max(e.lastIndexOf(`/`),e.lastIndexOf(`\\`));return t<0?``:e.slice(0,t)}function siblingPath(e,t){let n=folderOf(e);return n?`${n}/${t}`:t}async function convertFile(e,t,n={}){let r=await migrateFile(e,t,n);return r?{...r,changed:r.ok&&r.source&&r.text!==t,copy:copyPathFor(e),files:r.extraFiles.map(t=>({path:siblingPath(e,t.name),content:t.content,reason:t.reason}))}:null}function formIdsOf(e){let t=new Map;return e.filter(e=>/\.form$/i.test(e.path)).forEach(e=>{try{let n=JSON.parse(e.text).id;typeof n==`string`&&n&&t.set(e.path.split(/[\\/]/).pop()??e.path,n)}catch{return}}),t}te.map(e=>S(e));var ri=`https://raw.githubusercontent.com/kern0x1b/penstock-release/main/docs/schema/penstock.schema.json`,ii=`camunda-8`;function trimmed(e){return e.replace(/[\\/]+$/,``)}function convertedFolder(e,t){let n=trimmed(e);return`${t?n:folderOf(n)}/${ii}`}function convertedFilePath(e,t,n){let r=trimmed(e),i=n.startsWith(`${r}/`)||n.startsWith(`${r}\\`)?n.slice(r.length+1):n.split(/[\\/]/).pop()??n;return`${trimmed(t)}/${i.replace(/\\/g,`/`)}`}function keyOf(e){return/^[A-Za-z0-9_][A-Za-z0-9_.-]*$/.test(e)&&!/^(null|true|false|yes|no|on|off|y|n|~)$/i.test(e)&&!/^[0-9.eE+-]+$/.test(e)?e:JSON.stringify(e)}function deploymentLines(e,t){return[[`name`,e?.name?JSON.stringify(e.name):void 0],[`source`,e?.source?JSON.stringify(e.source):void 0],[`tenantId`,e?.tenantId?JSON.stringify(e.tenantId):void 0],[`changedOnly`,e?.changedOnly]].filter(([,e])=>e!==void 0).map(([e,n])=>`${t}${e}: ${n}`)}function convertedConfig(e){let t=deploymentLines(e.deployment,` `),n=[`# yaml-language-server: $schema=${ri}`,`# The Camunda 8 version of a Camunda 7 folder, written by penstock migrate. Commit it.`,`# Files here open and are checked as Camunda 8; the folder they came from is untouched.`,``,`engine: camunda-8`,``];t.length>0?n.push(`deployment:`,...t):n.push(`# deployment:`,`# url: http://localhost:8080/v2`),t.length>0&&n.push(` # url: http://localhost:8080/v2`);let r=e.profiles??[];if(r.length>0){n.push(``,`profiles:`);for(let e of r){let t=deploymentLines(e.deployment,` `);t.length===0?n.push(` ${keyOf(e.name)}: {}`):n.push(` ${keyOf(e.name)}:`,` deployment:`,...t)}}return`${n.join(`
600
+ `)}\n`}var ai={id:`palette`,title:`Find action`,shortcut:`Mod+Alt+,`},oi={",":`Comma`,".":`Period`,";":`Semicolon`,"'":`Quote`,"/":`Slash`,"\\":`Backslash`},si=`Mod+Alt+'`,ci=`Mod+Alt+Shift+M`;function matchesShortcut(e,t,n){let r=t.split(`+`),i=(r.pop()??``).toLowerCase(),wants=e=>r.includes(e),a=wants(`Mod`);if(e.metaKey!==(n&&a)||e.ctrlKey!==(!n&&a||wants(`Ctrl`))||e.altKey!==wants(`Alt`)||e.shiftKey!==wants(`Shift`))return!1;let o=/^[a-z]$/.test(i)?`Key${i.toUpperCase()}`:/^[0-9]$/.test(i)?`Digit${i}`:oi[i]??i;return e.code?e.code.toLowerCase()===o.toLowerCase():e.key?.toLowerCase()===i}function toggleSidebarDef(){return{id:`toggle-sidebar`,title:`Sidebar`,section:`View`,icon:`panel-toggle`,keywords:[`inspector`,`properties`,`side panel`,`panel`],place:`bar`,slot:`end`,shortcut:si,keymap:!0,tooltip:`Sidebar`,run:e=>e.commands.toggleSidebar()}}function focusCanvasDef(){return{id:`focus-canvas`,title:`Focus canvas`,section:`View`,icon:`focus-canvas`,keywords:[`focus`,`canvas`,`hide`,`sidebars`,`full`,`zen`,`distraction`],place:`menu`,shortcut:ci,keymap:!0,tooltip:`Hide the sidebars and show only the canvas; press again to show them`,run:e=>e.commands.focusCanvas()}}function undoDef(e){return{id:`undo`,l10n:`undo-long`,title:`Undo`,section:`Edit`,icon:`undo`,keywords:[],place:`bar`,listed:!1,slot:`lead`,tooltip:`Undo Last Operation`,enabled:e,run:e=>e.commands.undo()}}function redoDef(e){return{id:`redo`,l10n:`redo-long`,title:`Redo`,section:`Edit`,icon:`redo`,keywords:[],place:`bar`,listed:!1,slot:`lead`,tooltip:`Redo Last Operation`,enabled:e,run:e=>e.commands.redo()}}function shareDef(e){return{id:`share`,title:`Share as HTML…`,section:`Deploy & share`,icon:`share`,keywords:[`html`,`send`,`publish`,`offline`,`browser`,`export`],place:`menu`,tooltip:`One file that opens offline in any browser`,enabled:e,run:e=>e.commands.share()}}function tooltipOf(e){let n=e.targets.find(t=>(t.profile??null)===e.active);return n?.url?t(`app.actions.deploy.tooltipTo`,{url:n.url}):t(`app.actions.deploy.tooltipEngine`)}function deployDef(e){return{id:`deploy`,title:`Deploy`,section:`Deploy & share`,icon:`deploy`,keywords:[`publish`,`upload`,`zeebe`,`release`],place:`bar`,slot:`end`,presentation:`primary`,available:e=>e.deploy!==null,enabled:t=>e(t),disabledReason:n=>e(n)?void 0:t(`app.actions.deploy.noEngine`),tooltip:e=>e.deploy?tooltipOf(e.deploy):``,popup:e=>e.deploy?.popover??!1,run:e=>e.deploy?.open()}}var li=`Mod+Shift+;`,ui=`Mod+Alt+\\`;function chatDef(){return{id:`chat`,title:`AI chat`,section:`View`,icon:`chat`,keywords:[`ai`,`agent`,`assistant`,`ask`,`claude`,`conversation`,`chat`],place:`pinned`,shortcut:ui,keymap:!0,tooltip:`AI chat`,available:e=>e.chat.available,checked:e=>e.chat.open,status:e=>e.chat.status,run:e=>e.commands.chat()}}var di={properties:`guide/properties-panel`,scenarios:`guide/scenarios`,problems:`guide/diagram-check`,comments:`guide/comments`,monitor:`guide/monitor`,code:`guide/code-links`,try:`guide/dmn-editor#try`,preview:`guide/form-editor#preview`,sidebar:`guide/sidebar`};Object.keys(di);function guideUrl(e){return e?`${yn}${di[e]}`:yn}var fi=null;function openDocumentation(e){fi?.(guideUrl(e))}function onOpenDocumentation(e){return fi=e,()=>{fi===e&&(fi=null)}}function documentationDef(){return{id:`open-documentation`,title:`Documentation`,section:`Help`,icon:`documentation`,keywords:[`docs`,`guide`,`help`,`manual`,`learn`,`website`],place:`menu`,tooltip:`Open the guide in your browser`,run:()=>openDocumentation()}}var Q=null;function showThemeChoice(){Q?.()}function onShowThemeChoice(e){return Q=e,()=>{Q===e&&(Q=null)}}function themeChoiceDef(){return{id:`editor-theme`,title:`Editor theme`,section:`View`,icon:`sun`,keywords:[`theme`,`light`,`dark`,`dracula`,`colours`,`colors`,`appearance`,`follow ide`],place:`menu`,tooltip:`Follow the IDE, or use Light, Dark or Dracula`,available:e=>!!e.commands?.chooseTheme,run:()=>showThemeChoice()}}var pi=null;function showKeyboardShortcuts(){pi?.()}function onShowKeyboardShortcuts(e){return pi=e,()=>{pi===e&&(pi=null)}}var mi=`Shift+/`;function keyboardShortcutsDef(){return{id:`keyboard-shortcuts`,title:`Keyboard shortcuts`,section:`Help`,icon:`keyboard`,keywords:[`keys`,`shortcuts`,`bindings`,`key bindings`,`keyboard`,`hotkeys`,`help`,`cheat sheet`],place:`menu`,shortcut:mi,tooltip:`Every shortcut in this editor`,run:()=>showKeyboardShortcuts()}}function tasklistUrl(e,t,n){if(!t||typeof t!=`string`||!t.trim()||!e||typeof e!=`string`||!e.trim())return null;let r=t.trim(),i;try{i=new URL(r)}catch{return null}if(i.protocol!==`http:`&&i.protocol!==`https:`)return null;if(m(e)){let e=i.pathname.replace(/\/app\/tasklist\/?.*$/,``).replace(/\/deployment\/create\/?$/,``).replace(/\/engine-rest\/?$/,``).replace(/\/camunda\/?$/,``).replace(/\/+$/,``),t=`${i.origin}${e}`.replace(/\/+$/,``);return n?.taskId?`${t}/camunda/app/tasklist/default/#/?task=${encodeURIComponent(n.taskId)}`:n?.instanceId?`${t}/camunda/app/tasklist/default/#/?processInstance=${encodeURIComponent(n.instanceId)}`:`${t}/camunda/app/tasklist/`}if(h(e)){let e=i.hostname.toLowerCase();if(e.endsWith(`.camunda.io`)){let t=e.split(`.`),n=t.indexOf(`zeebe`);if(n<1||t.length!==n+3)return null;let r=t[n-1],a=n>=2?t.slice(0,n-1).join(`.`):/^\/([0-9a-zA-Z_-]+)/.exec(i.pathname)?.[1];return a?`https://${r}.tasklist.camunda.io/${a}`:null}let t=i.pathname.replace(/\/tasklist\/?.*$/,``).replace(/\/v2\/deployments\/?$/,``).replace(/\/v2\/?$/,``).replace(/\/deployments\/?$/,``).replace(/\/+$/,``),r=`${i.origin}${t}/tasklist`;return n?.taskId?`${r}/${encodeURIComponent(n.taskId)}`:r}return null}function tasklistDef(e){return{id:`open-tasklist`,title:`Open in Tasklist`,section:`Check & run`,icon:`share`,keywords:[`tasklist`,`tasks`,`user tasks`,`camunda`,`work`],place:`menu`,tooltip:`Open Tasklist in your browser`,available:t=>!(!t.commands?.openTasklist||e&&!e(t)),run:e=>e.commands.openTasklist?.()}}function compareDef(e){return{id:`compare-with-head`,title:`Compare with last commit`,section:`Check & run`,icon:`compare`,keywords:[`diff`,`git`,`changes`,`commit`,`head`,`versions`,`history`],place:`menu`,tooltip:`Show what changed since the last commit`,available:t=>!(!t.commands?.compareWithHead||e&&!e(t)),run:e=>e.commands.compareWithHead?.()}}function licenceDef(){return{id:`show-licence`,title:`Licence`,section:`Help`,icon:`licence`,keywords:[`license`,`pro`,`team`,`trial`,`activate`,`key`,`buy`,`plan`],place:`menu`,tooltip:`See the plan, enter a licence key or buy one`,available:e=>!!e.commands?.showLicence,run:e=>e.commands.showLicence?.()}}var hi=[undoDef(e=>e.drawn),redoDef(e=>e.drawn),{id:`auto-layout`,title:`Auto layout`,section:`Layout & convert`,icon:`auto-layout`,keywords:[`arrange`,`reflow`,`tidy`,`align`,`organise`,`organize`,`left to right`],place:`pinned`,presentation:`text`,tier:`Pro`,tooltip:`Lay the diagram out again`,enabled:e=>e.drawn,run:e=>e.commands.autoLayout()},{id:`diagram-check`,title:`Check`,section:`Check & run`,icon:`diagram-check`,keywords:[`bpmnlint`,`lint`,`validate`,`problems`,`errors`,`warnings`,`conventions`,`analyze`],place:`pinned`,presentation:`text`,tooltip:`Check the diagram for problems`,enabled:e=>e.drawn,checked:e=>e.open.check,run:e=>e.commands.openProblems()},{id:`token-simulation`,title:`Simulate`,section:`Check & run`,icon:`token-simulation`,keywords:[`tokens`,`play`,`run through`,`simulation`,`walk`],place:`pinned`,presentation:`text`,tooltip:`Run tokens through the process`,enabled:e=>e.drawn,checked:e=>e.open.simulation,run:e=>e.commands.toggleSimulation()},{id:`coverage`,title:`Coverage`,section:`Check & run`,icon:`coverage`,keywords:[`tests`,`reached`,`paths`],place:`pinned`,presentation:`text`,tooltip:`Show what the process tests reach`,enabled:e=>e.drawn,available:e=>e.coverageShown||e.open.coverage,checked:e=>e.open.coverage,run:e=>e.commands.toggleCoverage()},{id:`live`,title:`Monitor`,section:`Check & run`,icon:`live`,keywords:[`instances`,`incidents`,`live`,`running`],place:`pinned`,presentation:`text`,tooltip:`What the engine is doing with this diagram now: instances waiting at each step and incidents`,checked:e=>e.open.monitor,run:e=>e.commands.openMonitor()},{id:`timeline`,title:`Timeline`,section:`Check & run`,icon:`runs`,keywords:[`history`,`trace`,`playhead`,`replay`,`steps`,`gantt`,`time machine`],place:`menu`,tooltip:`Scrub through the steps of a run: an engine instance chosen in Monitor, or a scenario run`,available:e=>e.camunda7||e.camunda8,checked:e=>e.open.timeline,run:e=>e.commands.toggleTimeline()},{id:`debug-process`,title:`Debug process`,section:`Check & run`,icon:`debug`,keywords:[`breakpoint`,`step`,`pause`,`debugger`,`variables`,`stop`],place:`menu`,tooltip:`Run a copy of this process on a local engine and stop at breakpoints to read and change its variables`,available:e=>e.camunda7||e.camunda8,checked:e=>e.open.debug,run:e=>e.commands.openDebug()},{id:`toggle-breakpoint`,title:`Toggle breakpoint`,section:`Check & run`,icon:`breakpoint`,keywords:[`breakpoint`,`stop here`,`pause`,`debugger`],place:`menu`,tooltip:`Stop the debugger before the selected step`,available:e=>e.camunda7||e.camunda8,enabled:e=>e.breakpointable,run:e=>e.commands.toggleBreakpoint()},{id:`runs`,title:`Scenarios`,section:`Check & run`,icon:`runs`,keywords:[`test cases`,`junit`,`trace`],place:`pinned`,presentation:`text`,tooltip:`Run this diagram's scenarios on a local engine and see every step`,available:e=>e.camunda7||e.camunda8,checked:e=>e.open.scenarios,run:e=>e.commands.openScenarios()},{id:`migration`,title:`Migrate to Camunda 8`,section:`Layout & convert`,icon:`migration`,keywords:[`c8`,`camunda 8`,`convert`,`upgrade`,`zeebe`,`c7`,`migration`],place:`pinned`,presentation:`text`,tooltip:`What does not carry over to Camunda 8, and converting it`,available:e=>e.camunda7,checked:e=>e.open.migration&&e.open.check,run:e=>e.commands.toggleMigration()},{id:`convert-operaton`,title:`Convert to Operaton`,section:`Layout & convert`,icon:`migration`,keywords:[`operaton`,`convert`,`namespace`,`cib seven`,`cibseven`,`camunda 7`],place:`menu`,tooltip:`Move a Camunda 7 or CIB seven diagram to the operaton: namespace`,available:e=>e.convertible,run:e=>e.commands.convertToOperaton()},deployDef(e=>e.camunda7||e.camunda8),tasklistDef(),compareDef(e=>e.drawn),{id:`start-instance`,title:`Start instance…`,section:`Check & run`,icon:`live`,keywords:[`start`,`run`,`instance`,`process`,`trigger`,`launch`],place:`menu`,tooltip:`Start a process instance on the connected engine`,available:e=>!!e.commands?.startInstance,run:e=>e.commands.startInstance?.()},toggleSidebarDef(),focusCanvasDef(),{id:`fit-diagram`,title:`Fit diagram`,section:`View`,icon:`fit`,keywords:[`zoom`,`reset`,`whole`,`center`,`centre`],place:`menu`,shortcut:`Mod+0`,tooltip:`Show the whole diagram in the canvas`,enabled:e=>e.drawn,run:e=>e.commands.fit()},{id:`zoom-in`,title:`Zoom in`,section:`View`,icon:`zoom-in`,keywords:[`bigger`,`magnify`,`closer`],place:`menu`,enabled:e=>e.drawn,run:e=>e.commands.zoomIn()},{id:`zoom-out`,title:`Zoom out`,section:`View`,icon:`zoom-out`,keywords:[`smaller`,`farther`,`further`],place:`menu`,enabled:e=>e.drawn,run:e=>e.commands.zoomOut()},{id:`transaction-boundaries`,title:`Transaction boundaries`,section:`View`,icon:`transaction`,keywords:[`commit`,`wait state`,`async`,`asynchronous`,`continuation`],place:`menu`,tooltip:`Show where the engine commits a transaction: wait states and asynchronous continuations`,enabled:e=>e.drawn,available:e=>e.camunda7,checked:e=>e.open.boundaries,run:e=>e.commands.toggleBoundaries()},{id:`minimap`,title:`Minimap`,section:`View`,icon:`minimap`,keywords:[`overview`,`navigator`,`map`],place:`menu`,enabled:e=>e.drawn,checked:e=>e.open.minimap,run:e=>e.commands.toggleMinimap()},{id:`trace-paths`,title:`Trace paths`,section:`View`,icon:`trace-paths`,keywords:[`reachability`,`reachable`,`before`,`after`,`upstream`,`downstream`,`highlight`,`what leads here`,`what follows`],place:`menu`,shortcut:li,keymap:!0,tooltip:e=>e.open.traceable?t(`app.actions.trace-paths.tooltipOn`):t(`app.actions.trace-paths.tooltipOff`),enabled:e=>e.open.traceable,checked:e=>e.open.trace,run:e=>e.commands.toggleTrace()},{id:`sketchy`,title:`Sketchy drawing`,section:`View`,icon:`sketchy`,keywords:[`hand drawn`,`rough`,`style`,`rendering`],place:`menu`,enabled:e=>e.drawn,checked:e=>e.open.sketchy,run:e=>e.commands.toggleSketchy()},{id:`show-comment-badges`,title:`Show comment badges`,section:`View`,icon:`comments`,keywords:[`comments`,`notes`,`badge`,`count`,`annotations`],place:`menu`,tooltip:`Draw the number of open comments on each element that has some`,checked:e=>e.open.commentBadges,run:e=>e.commands.toggleCommentBadges()},{id:`show-code-badges`,title:`Show code badges`,section:`View`,icon:`code`,keywords:[`code`,`worker`,`delegate`,`bean`,`badge`,`missing`],place:`menu`,tooltip:`Draw a mark on each task that says whether its code was found in the project`,checked:e=>e.open.codeBadges,run:e=>e.commands.toggleCodeBadges()},{id:`export`,title:`Export…`,section:`File`,icon:`export`,keywords:[`png`,`svg`,`pdf`,`image`,`picture`,`copy as image`],place:`menu`,shortcut:`Mod+Shift+C`,keymap:!0,tooltip:`Save the diagram as SVG, PNG or PDF, or copy it as a picture`,enabled:e=>e.drawn,run:e=>e.commands.exportDialog()},{id:`marketplace`,title:`Templates…`,section:`File`,icon:`marketplace`,keywords:[`connectors`,`element templates`,`marketplace`,`catalogue`,`catalog`],place:`menu`,available:e=>e.camunda8,run:e=>e.commands.templates()},{id:`import`,title:`Import diagram…`,section:`File`,icon:`import`,keywords:[`draw.io`,`drawio`,`visio`,`signavio`,`bizagi`,`convert`],place:`menu`,tooltip:`Turn a draw.io, Visio, Signavio or Bizagi diagram into BPMN`,run:e=>e.commands.importDiagram()},shareDef(e=>e.drawn),{id:`copy`,title:`Copy`,section:`Edit`,icon:`copy`,keywords:[`duplicate`],place:`menu`,enabled:e=>e.drawn,run:e=>e.commands.copy()},{id:`paste`,title:`Paste`,section:`Edit`,icon:`paste`,keywords:[],place:`menu`,enabled:e=>e.drawn,run:e=>e.commands.paste()},{id:`tour`,title:`Show the tour again`,section:`Help`,icon:`tour`,keywords:[`welcome`,`introduction`,`guide`,`onboarding`,`first run`],place:`menu`,run:e=>e.commands.tour()},chatDef(),themeChoiceDef(),keyboardShortcutsDef(),documentationDef(),licenceDef()],gi=[undoDef(e=>e.history.undo),redoDef(e=>e.history.redo),{id:`diagram-check`,l10n:`dmn-check`,title:`Check`,section:`Check & run`,icon:`diagram-check`,keywords:[`lint`,`validate`,`problems`,`errors`,`warnings`,`decisions`],place:`pinned`,presentation:`text`,tooltip:`Check decisions`,checked:e=>e.open.check,run:e=>e.commands.check()},deployDef(e=>e.hasEngine),{id:`export-table-workbook`,title:`Export decision table as a workbook…`,section:`File`,icon:`export`,keywords:[`xlsx`,`excel`,`spreadsheet`,`decision table`,`rules`,`save`],place:`menu`,available:e=>e.hasTable,tooltip:`Save the inputs, the outputs and every rule as an Excel workbook`,run:e=>e.commands.exportTable(`xlsx`)},{id:`export-table-csv`,title:`Export decision table as CSV…`,section:`File`,icon:`export`,keywords:[`csv`,`comma`,`spreadsheet`,`decision table`,`rules`,`save`],place:`menu`,available:e=>e.hasTable,tooltip:`Save the inputs, the outputs and every rule as comma separated values`,run:e=>e.commands.exportTable(`csv`)},{id:`import-table`,title:`Import decision table…`,section:`File`,icon:`import`,keywords:[`xlsx`,`csv`,`excel`,`spreadsheet`,`rules`,`read`],place:`menu`,available:e=>e.hasTable,tooltip:`Replace the rules of the selected table with those in a workbook or CSV`,run:e=>e.commands.importTable()},{id:`import-table-new`,title:`Add rules from spreadsheet…`,section:`File`,icon:`import`,keywords:[`xlsx`,`csv`,`excel`,`spreadsheet`,`new table`,`rules`],place:`menu`,tooltip:`Fill the open decision table with the rules in a workbook or CSV`,run:e=>e.commands.importTableAsNew()},toggleSidebarDef(),focusCanvasDef(),{id:`trace-paths`,l10n:`dmn-trace-paths`,title:`Trace paths`,section:`View`,icon:`trace-paths`,keywords:[`requirements`,`needs`,`depends on`,`information requirements`,`upstream`,`downstream`,`highlight`],place:`menu`,shortcut:li,keymap:!0,tooltip:e=>e.open.traceable?t(`app.actions.dmn-trace-paths.tooltipOn`):t(`app.actions.dmn-trace-paths.tooltipOff`),enabled:e=>e.open.traceable,checked:e=>e.open.trace,run:e=>e.commands.toggleTrace()},shareDef(),{id:`copy`,title:`Copy`,section:`Edit`,icon:`copy`,keywords:[`duplicate`],place:`menu`,enabled:e=>e.drd,run:e=>e.commands.copy()},{id:`paste`,title:`Paste`,section:`Edit`,icon:`paste`,keywords:[],place:`menu`,enabled:e=>e.drd,run:e=>e.commands.paste()},chatDef(),themeChoiceDef(),keyboardShortcutsDef(),documentationDef(),licenceDef()],_i=[undoDef(e=>e.history.undo),redoDef(e=>e.history.redo),{id:`preview`,title:`Preview`,section:`View`,icon:`preview`,keywords:[`try`,`sample data`,`render`,`test the form`],place:`pinned`,slot:`view`,presentation:`text`,tooltip:`Try the form with sample data`,checked:e=>e.open.preview,run:e=>e.commands.preview()},{id:`diagram-check`,l10n:`form-check`,title:`Check`,section:`Check & run`,icon:`diagram-check`,keywords:[`lint`,`validate`,`problems`,`errors`,`warnings`,`form`],place:`pinned`,presentation:`text`,tooltip:e=>e.unreadable?t(`app.actions.form-check.tooltipUnreadable`):t(`app.actions.form-check.tooltip`),enabled:e=>!e.unreadable,checked:e=>e.open.check,run:e=>e.commands.check()},deployDef(e=>e.hasEngine),toggleSidebarDef(),focusCanvasDef(),shareDef(),chatDef(),themeChoiceDef(),keyboardShortcutsDef(),documentationDef(),licenceDef()];function isPlain(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function flattenValues(e,t=``){let n={};for(let[r,i]of Object.entries(e??{})){let e=t?`${t}.${r}`:r;isPlain(i)&&Object.keys(i).length>0?Object.assign(n,flattenValues(i,e)):n[e]=i}return n}function unflattenValues(e){return nestValues(e)}function readValue(e,t){if(Object.hasOwn(e,t))return e[t];let n=e;for(let e of t.split(`.`)){if(!isPlain(n)||!Object.hasOwn(n,e))return;n=n[e]}return n}function parseValue(e){let t=e.trim();if(t===``)return``;if(t===`true`)return!0;if(t===`false`)return!1;if(t===`null`)return null;if(/^-?\d+(\.\d+)?([eE][+-]?\d+)?$/.test(t))return Number(t);if(/^["[{]/.test(t))try{return JSON.parse(t)}catch{return e}return e}function formatValue(e){return typeof e==`string`?parseValue(e)===e?e:JSON.stringify(e):e===void 0?``:JSON.stringify(e)}function showValue(e){return typeof e==`string`?`"${e}"`:e===void 0?`not set`:JSON.stringify(e)}function patchValues(e,t){let n={};for(let[r,i]of Object.entries(t))Object.hasOwn(e,r)&&JSON.stringify(e[r])===JSON.stringify(i)||(n[r]=i);return{set:n,unset:Object.keys(e).filter(e=>!Object.hasOwn(t,e))}}function applyPatch(e,t){if(!t)return{...e};let n={};for(let[r,i]of Object.entries(e))t.unset.includes(r)||(n[r]=Object.hasOwn(t.set,r)?t.set[r]:i);for(let[e,r]of Object.entries(t.set))Object.hasOwn(n,e)||(n[e]=r);return n}function isEmptyPatch(e){return!e||Object.keys(e.set).length===0&&e.unset.length===0}function clone(e){return JSON.parse(JSON.stringify(e))}function applyPatchNested(e,t){let n=clone(e);if(!t)return n;let parts=e=>Object.hasOwn(n,e)?[e]:e.split(`.`);for(let e of t.unset){let t=parts(e);if(t.includes(`__proto__`))continue;let r=n;for(let e of t.slice(0,-1))r=isPlain(r)&&Object.hasOwn(r,e)?r[e]:void 0;isPlain(r)&&delete r[t[t.length-1]]}for(let[e,r]of Object.entries(t.set)){let t=parts(e);if(t.includes(`__proto__`))continue;let i=n;for(let e of t.slice(0,-1))Object.hasOwn(i,e)&&isPlain(i[e])||(i[e]={}),i=i[e];i[t[t.length-1]]=r}return n}var vi=[`<=`,`>=`,`!=`,`==`,`&&`,`||`,`<`,`>`,`=`,`(`,`)`,`!`];function tokenise(e){let t=[],n=0;for(;n<e.length;){let r=e.slice(n),i=/^\s+/.exec(r);if(i){n+=i[0].length;continue}let a=/^"((?:[^"\\]|\\.)*)"|^'((?:[^'\\]|\\.)*)'/.exec(r);if(a){t.push({kind:`string`,value:(a[1]??a[2]).replace(/\\(.)/g,`$1`)}),n+=a[0].length;continue}let o=/^-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?/.exec(r);if(o){t.push({kind:`number`,value:Number(o[0])}),n+=o[0].length;continue}let s=/^[A-Za-z_][\w.]*/.exec(r);if(s){t.push({kind:`word`,value:s[0]}),n+=s[0].length;continue}let c=vi.find(e=>r.startsWith(e));if(!c)return null;t.push({kind:`op`,value:c}),n+=c.length}return t}var yi=new Set([`<=`,`>=`,`!=`,`==`,`=`,`<`,`>`]),bi=new Set([`and`,`or`,`not`]),Unreadable=class extends Error{};function kindOf$1(e){return e===null?`null`:Array.isArray(e)?`list`:typeof e}e(kindOf$1,`kindOf`);function shown(e){return typeof e==`string`?`"${e}"`:JSON.stringify(e)}function kindName(e){let n=kindOf$1(e);return n===`string`?t(`app.scenarios.valueKind.text`):n===`number`?t(`app.scenarios.valueKind.number`):n===`boolean`?t(`app.scenarios.valueKind.boolean`):n===`null`?t(`app.scenarios.valueKind.null`):t(`app.scenarios.valueKind.other`,{kind:n})}function withValue(e){return typeof e==`string`?t(`app.scenarios.value.text`,{value:shown(e)}):kindName(e)}function compare(e,n,r,i){let a=n===`=`||n===`==`||n===`!=`,o=[kindOf$1(e.value),kindOf$1(r.value)];if(a&&(o[0]===`null`||o[1]===`null`)){let e=o[0]===o[1];return n===`!=`?!e:e}if(o[0]!==o[1]||o[0]===`null`){let[n,a]=e.variable||!r.variable?[e,r]:[r,e];return i.push(t(`app.scenarios.note.otherKind`,{name:n.variable??shown(n.value),value:withValue(n.value),other:kindName(a.value)})),null}if(a){let t=e.value===r.value;return n===`!=`?!t:t}if(o[0]!==`number`)return i.push(o[0]===`string`?t(`app.scenarios.note.noTextOrder`):t(`app.scenarios.note.noOrder`,{kind:o[0]})),null;let s=e.value,c=r.value;return n===`<`?s<c:n===`<=`?s<=c:n===`>`?s>c:s>=c}var Reader=class{at=0;tokens;values;used=new Map;missing=new Set;notes=[];constructor(e,t){this.tokens=e,this.values=t}isOp(...e){let t=this.tokens[this.at];return t?.kind===`op`&&e.includes(t.value)}isWord(...e){let t=this.tokens[this.at];return t?.kind===`word`&&e.includes(t.value)}done(){return this.at>=this.tokens.length}or(){let e=this.and();for(;this.isOp(`||`)||this.isWord(`or`);){this.at+=1;let t=this.and();e=e===!0||t===!0?!0:e===null||t===null?null:!1}return e}and(){let e=this.unary();for(;this.isOp(`&&`)||this.isWord(`and`);){this.at+=1;let t=this.unary();e=e===!1||t===!1?!1:e===null||t===null?null:!0}return e}unary(){if(this.isOp(`!`)){this.at+=1;let e=this.unary();return e===null?null:!e}if(this.isWord(`not`)){if(this.at+=1,!this.isOp(`(`))throw new Unreadable;let e=this.unary();return e===null?null:!e}if(this.isOp(`(`)){this.at+=1;let e=this.or();if(!this.isOp(`)`))throw new Unreadable;return this.at+=1,e}return this.comparison()}operand(){let e=this.tokens[this.at];if(!e)throw new Unreadable;if(this.at+=1,e.kind===`number`||e.kind===`string`)return{value:e.value,known:!0,variable:null};if(e.kind!==`word`||bi.has(e.value))throw new Unreadable;if(e.value===`true`)return{value:!0,known:!0,variable:null};if(e.value===`false`)return{value:!1,known:!0,variable:null};if(e.value===`null`)return{value:null,known:!0,variable:null};let t=readValue(this.values,e.value);return t===void 0?(this.missing.add(e.value),{value:void 0,known:!1,variable:e.value}):(this.used.set(e.value,t),{value:t,known:!0,variable:e.value})}comparison(){let e=this.operand(),n=this.tokens[this.at];if(!(n?.kind===`op`&&yi.has(n.value))){if(!e.variable&&typeof e.value!=`boolean`)throw new Unreadable;return e.known?typeof e.value==`boolean`?e.value:(this.notes.push(t(`app.scenarios.note.notBoolean`,{name:e.variable,value:withValue(e.value)})),null):null}this.at+=1;let r=this.operand();return!e.known||!r.known?null:compare(e,n.value,r,this.notes)}};function conditionText(e){if(!e)return``;let t=``,n=``;for(let r of conditionBody(e).trim())n?(t+=r,r===n&&(n=``)):r===`"`||r===`'`?(n=r,t+=r):t+=/\s/.test(r)?t.endsWith(` `)?``:` `:r;return t}function evaluateCondition(e,t){let n=conditionText(e),r={result:null,text:n,used:[],missing:[],notes:[],readable:!1};if(!n)return r;let i=tokenise(n);if(!i||i.length===0)return r;let a=new Reader(i,t);try{let e=a.or();return a.done()?{result:e,text:n,used:[...a.used].map(([e,t])=>({name:e,value:t})),missing:[...a.missing],notes:a.notes,readable:!0}:r}catch(e){if(e instanceof Unreadable||e instanceof RangeError)return r;throw e}}function usedText(e){return e.length>0?` (${e.map(e=>`${e.name} = ${showValue(e.value)}`).join(`, `)})`:``}function hintOf(e,n){return e.isDefault?t(`app.scenarios.gatewayHint.default`):n?n.readable?n.result===!0?t(`app.scenarios.gatewayHint.isTrue`,{text:n.text,used:usedText(n.used)}):n.result===!1?t(`app.scenarios.gatewayHint.isFalse`,{text:n.text,used:usedText(n.used)}):n.missing.length===0&&n.notes.length>0?t(`app.scenarios.gatewayHint.undecided`,{text:n.text,notes:n.notes.join(`; `)}):t(`app.scenarios.gatewayHint.chooseVariables`,{text:n.text}):t(`app.scenarios.gatewayHint.cannotCheck`,{text:n.text}):t(`app.scenarios.gatewayHint.noCondition`)}function readGateway(e,t,n){let r=t.map(e=>{let t=!e.isDefault&&e.condition?.trim()?evaluateCondition(e.condition,n):null,r=e.isDefault?null:!t||t.result;return{flowId:e.id,name:e.name,label:e.label,condition:t?.text??``,isDefault:e.isDefault,result:r,used:t?.used??[],hint:hintOf(e,t)}}),i=r.filter(e=>!e.isDefault),a=r.find(e=>e.isDefault),o=i.find(e=>e.result===null),s=[],c=null,l=[];if(e===`exclusive`){let e=i.find(e=>e.result!==!1);if(e?.result===!0){s.push(e.flowId);let t=i.filter(e=>e.result===!0);t.length>1&&(l=t.map(e=>e.label))}else e&&(c=e.hint)}else s.push(...i.filter(e=>e.result===!0).map(e=>e.flowId)),o&&(c=o.hint);s.length===0&&!c&&a&&s.push(a.flowId);let u=s.length===0&&!c&&i.length>0&&i.every(e=>e.result===!1);return{flows:r,takes:s,unresolved:c,noWay:u,overlap:l}}function scenarioPath(e){let t=new Map;return e.firedIds.forEach((e,n)=>t.set(e,[...t.get(e)??[],n+1])),{elementIds:[...t.keys()],flowIds:[...new Set(e.flowIds)],numbers:t,order:e.firedIds}}function numberLabel(e){return(e??[]).join(`, `)}function scenarioKey(e){let t=e.decisions.map(e=>`${e.decisionId}:${e.flowIds.join(`+`)}:${e.boundaryId??``}`);return[e.process,e.startId,...t,e.endIds.join(`+`)].join(`|`)}function scenarioCoverage(e,t){let n=[],r=[],i=[],a=containersOf(e),visit=e=>{for(let t of e??[]){if(!t.id)continue;t.$type===`bpmn:SequenceFlow`?n.push(t.id):t.$type===`bpmn:EndEvent`&&r.push(t.id);let e=a.get(t.id);t.flowElements&&e&&(e.followed?visit(t.flowElements):e.type!==`bpmn:CallActivity`&&i.push({id:e.id,name:e.name,why:e.why??`this kind of sub-process`}))}};for(let t of e?.rootElements??[])t.$type===`bpmn:Process`&&t.isExecutable!==!1&&visit(t.flowElements);let o=new Set(t.flatMap(e=>e.flowIds)),s=new Set(t.flatMap(e=>e.elementIds)),c=new Set(i.map(e=>e.id)),inside=e=>c.has(e);return{flows:n.length,ends:r.length,unreachedFlows:n.filter(e=>!o.has(e)&&!inside(e)),unreachedEnds:r.filter(e=>!s.has(e)&&!inside(e)),unfollowed:i}}function coverageLine(e,n=!1){let r=[],i=[];e.unreachedFlows.length>0&&i.push(t(`app.scenarios.coverage.flows`,{unreached:e.unreachedFlows.length,total:e.flows})),e.unreachedEnds.length>0&&i.push(t(`app.scenarios.coverage.endEvents`,{unreached:e.unreachedEnds.length,total:e.ends})),i.length>0?r.push(t(`app.scenarios.coverage.noScenarioReaches`,{parts:listOf$1(i)})):n&&r.push(t(`app.scenarios.coverage.capped`,{cap:64}));for(let n of e.unfollowed)r.push(t(`app.scenarios.coverage.doesNotFollow`,{name:n.name||n.id,why:n.why}));return r.length>0?r.join(`. `).replace(/\.\.$/,`.`):null}function fields(e){return e}function plain(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function soundCase(e){let t=(Array.isArray(e.instructions)?e.instructions:[]).filter(e=>plain(e)&&typeof e.type==`string`),n={...e,name:typeof e.name==`string`?e.name:``,instructions:t},r=e[`x-penstock`];return r!==void 0&&!plain(r)?delete n[`x-penstock`]:plain(r)&&r.behaviours!==void 0&&!plain(r.behaviours)&&(n[`x-penstock`]={...r,behaviours:void 0}),n}function selectorId(e,t){return fields(e)[t]?.elementId}function selectorType(e){return fields(e).jobSelector?.jobType}function jobTypeOf(e){return e.job??e.external}function throwsFor(e,t){let n=jobTypeOf(t);return e.type===`THROW_BPMN_ERROR_FROM_JOB`?selectorId(e,`jobSelector`)===t.id||!!n&&selectorType(e)===n:e.type===`MOCK_JOB_WORKER_THROW_BPMN_ERROR`&&!!n&&fields(e).jobType===n}function failureOf(e,t){let n=e.instructions.find(e=>throwsFor(e,t));if(n)return String(fields(n).errorCode??``);let r=e[`x-penstock`]?.behaviours?.[t.id];if(r?.then===`error`)return r.errorCode??r.errorMessage??`error`;if(r?.errorMessage)return r.errorMessage}function selectorTaskName(e){return fields(e).userTaskSelector?.taskName}function answerIndex(e,t,n){let at=t=>e.instructions.findIndex(t),r=jobTypeOf(t);if(t.host){if(t.event===`error`){let e=at(e=>e.type===`THROW_BPMN_ERROR_FROM_JOB`&&selectorId(e,`jobSelector`)===t.host);return e>=0||!n?e:at(e=>throwsFor(e,n)&&(!t.errorCode||!fields(e).errorCode||fields(e).errorCode===t.errorCode))}return t.event===`timer`?at(e=>e.type===`INCREASE_TIME`):t.event===`message`&&t.message?at(e=>(e.type===`CORRELATE_MESSAGE`||e.type===`PUBLISH_MESSAGE`)&&fields(e).name===t.message):t.event===`signal`&&t.signal?at(e=>e.type===`BROADCAST_SIGNAL`&&fields(e).signalName===t.signal):-1}if(t.event===`timer`)return at(e=>e.type===`INCREASE_TIME`);if(r){let e=at(e=>e.type===`COMPLETE_JOB`&&selectorId(e,`jobSelector`)===t.id);if(e>=0)return e;let n=at(e=>e.type===`COMPLETE_JOB`&&selectorType(e)===r);if(n>=0)return n;let i=at(e=>e.type===`MOCK_JOB_WORKER_COMPLETE_JOB`&&fields(e).jobType===r);if(i>=0)return i;let a=at(e=>(e.type===`MOCK_JOB_WORKER_THROW_BPMN_ERROR`||e.type===`THROW_BPMN_ERROR_FROM_JOB`)&&throwsFor(e,t));return a>=0?a:-1}return t.type===`bpmn:UserTask`?at(e=>e.type===`COMPLETE_USER_TASK`&&(selectorId(e,`userTaskSelector`)===t.id||!!t.name&&selectorTaskName(e)===t.name)):t.event===`message`&&t.message?at(e=>(e.type===`CORRELATE_MESSAGE`||e.type===`PUBLISH_MESSAGE`)&&fields(e).name===t.message):t.event===`signal`&&t.signal?at(e=>e.type===`BROADCAST_SIGNAL`&&fields(e).signalName===t.signal):-1}function returnsOf(e,t){let n=answerIndex(e,t);return n>=0?fields(e.instructions[n]).variables:e[`x-penstock`]?.behaviours?.[t.id]?.variables}function canAnswer(e,t){return answerIndex(e,t)>=0||!!e[`x-penstock`]?.behaviours?.[t.id]||t.type===`bpmn:UserTask`||t.event===`timer`||!!jobTypeOf(t)}function insertBeforeAssertions(e,t){let n=e.findIndex(e=>typeof e.type==`string`&&e.type.startsWith(`ASSERT_`));return n>=0?[...e.slice(0,n),t,...e.slice(n)]:[...e,t]}function withReturns(e,t,n){let r=!n||Object.keys(n).length===0,i=answerIndex(e,t);if(i>=0){let t=e.instructions.map((e,t)=>{if(t!==i)return e;let{variables:a,...o}=fields(e);return r?o:{...o,variables:n}});return{...e,instructions:t}}if(t.type===`bpmn:UserTask`)return{...e,instructions:insertBeforeAssertions(e.instructions,{type:`COMPLETE_USER_TASK`,userTaskSelector:{elementId:t.id},...r?{}:{variables:n}})};let a=jobTypeOf(t);if(a)return{...e,instructions:insertBeforeAssertions(e.instructions,{type:`MOCK_JOB_WORKER_COMPLETE_JOB`,jobType:a,...r?{}:{variables:n}})};let o=e[`x-penstock`]?.behaviours?.[t.id];if(!o)return e;let{variables:s,...c}=o,l=r?c:{...c,variables:n};return{...e,"x-penstock":{...e[`x-penstock`],behaviours:{...e[`x-penstock`]?.behaviours,[t.id]:l}}}}function startOf(e){let t=e.instructions.find(e=>e.type===`CREATE_PROCESS_INSTANCE`),n=t&&fields(t).variables;return plain(n)?n:{}}function withStart(e,t){let n=Object.keys(t).length===0;return{...e,instructions:e.instructions.map(e=>{if(e.type!==`CREATE_PROCESS_INSTANCE`)return e;let{variables:r,...i}=fields(e);return n?i:{...i,variables:t}})}}function expectedOf(e){let t={};for(let n of e.instructions)if(n.type===`ASSERT_VARIABLES`&&!fields(n).elementSelector){let e=fields(n).variables;plain(e)&&Object.assign(t,e)}return t}function withExpected(e,t){let n=e.instructions.filter(e=>!(e.type===`ASSERT_VARIABLES`&&!fields(e).elementSelector));if(Object.keys(t).length===0)return{...e,instructions:n};let r=e.instructions.find(e=>e.type===`CREATE_PROCESS_INSTANCE`)?.processDefinitionSelector?.processDefinitionId,i={type:`ASSERT_VARIABLES`,...r?{processInstanceSelector:{processDefinitionId:r}}:{},variables:t},a=n.length-1,o=a>=0&&n[a].type===`ASSERT_PROCESS_INSTANCE`;return{...e,instructions:o?[...n.slice(0,a),i,n[a]]:[...n,i]}}function assertedElements(e){let t=[];for(let n of e.instructions){let e=fields(n);if(n.type===`ASSERT_ELEMENT_INSTANCES`&&e.state===`IS_COMPLETED`)for(let n of Array.isArray(e.elementSelectors)?e.elementSelectors:[])n?.elementId&&t.push(n.elementId);if(n.type===`ASSERT_ELEMENT_INSTANCE`&&e.state===`IS_COMPLETED`){let n=e.elementSelector?.elementId;n&&t.push(n)}}return[...new Set(t)]}function firesBoundary(e,t,n){return e[`x-penstock`]?.behaviours?.[t.id]?.then===`fire`||answerIndex(e,t,n)>=0}function scopeAlong(e,t,n,r){let i={...startOf(e)};for(let a of n){let n=t.get(a);n&&Object.assign(i,returnsOf(e,n)??{},r?.(a,i)??{})}return i}function firesTimer(e,t){return e[`x-penstock`]?.behaviours?.[t.id]?.then===`fire`||e.instructions.some(e=>e.type===`INCREASE_TIME`)}var xi=/^-?P(?=\d|T\d)(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+(\.\d+)?S)?)?$/;function isDuration(e){return xi.test(e.trim())}function timerDuration(e,t){let n=e.instructions.find(e=>e.type===`INCREASE_TIME`);return n?String(fields(n).duration??``):t.timer}function withTimerFires(e,t,n){let r=n||t.timer||`PT1S`,i=e.instructions.findIndex(e=>e.type===`INCREASE_TIME`);if(i>=0){let t=e.instructions.map((e,t)=>t===i?{...fields(e),duration:r}:e);return{...e,instructions:t}}return{...e,instructions:insertBeforeAssertions(e.instructions,{type:`INCREASE_TIME`,duration:r})}}function withoutTimerFires(e,t){let n=e.instructions.filter(e=>e.type!==`INCREASE_TIME`),r=e[`x-penstock`];if(r?.behaviours?.[t.id]){let{[t.id]:e,...n}=r.behaviours;r=Object.keys(n).length>0?{...r,behaviours:n}:{...r,behaviours:void 0}}return{...e,instructions:n,...r?{"x-penstock":r}:{}}}function workerMockOf(e,t){let n=jobTypeOf(t);if(n){let r=e.instructions.find(e=>e.type===`MOCK_JOB_WORKER_COMPLETE_JOB`&&fields(e).jobType===n||e.type===`COMPLETE_JOB`&&(selectorId(e,`jobSelector`)===t.id||selectorType(e)===n));if(r)return{kind:`complete`,variables:fields(r).variables};let i=e.instructions.find(e=>(e.type===`MOCK_JOB_WORKER_THROW_BPMN_ERROR`||e.type===`THROW_BPMN_ERROR_FROM_JOB`)&&throwsFor(e,t));if(i)return{kind:`error`,errorCode:String(fields(i).errorCode??``),errorMessage:fields(i).errorMessage,variables:fields(i).variables}}let r=e[`x-penstock`]?.behaviours?.[t.id];if(r){if(r.then===`error`)return{kind:`error`,errorCode:r.errorCode??`error`,errorMessage:r.errorMessage,variables:r.variables};if(r.fail!==void 0||r.errorMessage)return{kind:`fail`,errorMessage:r.errorMessage,retries:r.fail};if(r.then===`complete`)return{kind:`complete`,variables:r.variables}}}function withWorkerMock(e,t,n){let r=jobTypeOf(t),i=withoutWorkerMock(e,t);if(r&&n.kind!==`fail`){let e;return e=n.kind===`complete`?{type:`MOCK_JOB_WORKER_COMPLETE_JOB`,jobType:r,...n.variables&&Object.keys(n.variables).length>0?{variables:n.variables}:{}}:{type:`MOCK_JOB_WORKER_THROW_BPMN_ERROR`,jobType:r,errorCode:n.errorCode||`error`,...n.errorMessage?{errorMessage:n.errorMessage}:{},...n.variables&&Object.keys(n.variables).length>0?{variables:n.variables}:{}},{...i,instructions:insertBeforeAssertions(i.instructions,e)}}let a=n.kind===`complete`?{then:`complete`,...n.variables?{variables:n.variables}:{}}:n.kind===`error`?{then:`error`,errorCode:n.errorCode||`error`,...n.errorMessage?{errorMessage:n.errorMessage}:{},...n.variables?{variables:n.variables}:{}}:{then:`complete`,fail:n.retries??1,...n.errorMessage?{errorMessage:n.errorMessage}:{}};return{...i,"x-penstock":{...i[`x-penstock`],behaviours:{...i[`x-penstock`]?.behaviours,[t.id]:a}}}}function withoutWorkerMock(e,t){let n=jobTypeOf(t),r=e.instructions.filter(e=>!n||!(e.type===`MOCK_JOB_WORKER_COMPLETE_JOB`&&fields(e).jobType===n||e.type===`COMPLETE_JOB`&&(selectorId(e,`jobSelector`)===t.id||selectorType(e)===n)||(e.type===`MOCK_JOB_WORKER_THROW_BPMN_ERROR`||e.type===`THROW_BPMN_ERROR_FROM_JOB`)&&throwsFor(e,t))),i=e[`x-penstock`];if(i?.behaviours?.[t.id]){let{[t.id]:e,...n}=i.behaviours;i=Object.keys(n).length>0?{...i,behaviours:n}:{...i,behaviours:void 0}}return{...e,instructions:r,...i?{"x-penstock":i}:{}}}var title=e=>ruleTitle(`table`,e),Si=`\0other`;function splitTop(e){let t=[],n=0,r=!1,i=0;for(let a=0;a<e.length;a+=1){let o=e[a];r&&o===`\\`?a+=1:(o===`"`&&(r=!r),!r&&((o===`(`||o===`[`)&&(n+=1),(o===`)`||o===`]`)&&--n,o===`,`&&n===0&&(t.push(e.slice(i,a)),i=a+1)))}return t.push(e.slice(i)),t.map(e=>e.trim()).filter(Boolean)}function number(e){return/^-?\d+(\.\d+)?$/.test(e.trim())?Number(e.trim()):null}var Ci=864e5,wi=/^\d{4}-\d{2}-\d{2}(?:T[\d:.]+(?:Z|[+-]\d{2}:?\d{2})?)?$/,Ti=/^(?:date\s*\(\s*"([^"]+)"\s*\)|date\s+and\s+time\s*\(\s*"([^"]+)"\s*\)|time\s*\(\s*"([^"]+)"\s*\)|@"([^"]+)"|@([\d:.+\-TZ]+))$/;function realDay(e){let t=e.slice(0,10),n=new Date(`${t}T00:00:00Z`);return!Number.isNaN(n.getTime())&&n.toISOString().slice(0,10)===t}function moment(e){let t=Ti.exec(e.trim());if(!t)return null;let n=t[1]??t[2]??t[3]??t[4]??t[5]??``;return wi.test(n)&&realDay(n)?n:null}function isMoment(e){return typeof e==`string`&&wi.test(e)}function dayBefore(e){return new Date(Date.parse(`${e.slice(0,10)}T00:00:00Z`)-Ci).toISOString().slice(0,10)}function dayAfter(e){return new Date(Date.parse(`${e.slice(0,10)}T00:00:00Z`)+Ci).toISOString().slice(0,10)}function halfway(e,t){let n=Date.parse(`${e.slice(0,10)}T00:00:00Z`)+(Date.parse(`${t.slice(0,10)}T00:00:00Z`)-Date.parse(`${e.slice(0,10)}T00:00:00Z`))/2;return new Date(n).toISOString().slice(0,10)}function momentCell(e){return{kind:`date`,test:t=>isMoment(t)&&t===e,numbers:[],strings:[],moments:[e]}}function parseOne(e){let t=e.trim(),n=/^not\s*\(([\s\S]*)\)$/.exec(t);if(n){if(n[1].trim()===``)return null;let e=parseCell(n[1]);return e?{...e,test:t=>!e.test(t)}:null}if(t===`true`||t===`false`){let e=t===`true`;return{kind:`boolean`,test:t=>t===e,numbers:[],strings:[],moments:[]}}if(t===`null`)return{kind:`null`,test:e=>e===`null`,numbers:[],strings:[],moments:[]};let r=/^"((?:[^"\\]|\\.)*)"$/.exec(t);if(r)return{kind:`string`,test:e=>e===r[1],numbers:[],strings:[r[1]],moments:[]};let i=number(t);if(i!==null)return{kind:`number`,test:e=>e===i,numbers:[i],strings:[],moments:[]};let a=moment(t);if(a)return momentCell(a);let o=/^(<=|>=|<|>|=)\s*(-?\d+(?:\.\d+)?)$/.exec(t);if(o){let e=Number(o[2]);return{kind:`number`,test:{"<":t=>typeof t==`number`&&t<e,"<=":t=>typeof t==`number`&&t<=e,">":t=>typeof t==`number`&&t>e,">=":t=>typeof t==`number`&&t>=e,"=":t=>t===e}[o[1]],numbers:[e],strings:[],moments:[]}}let s=/^(<=|>=|<|>|=)\s*((?:date\s*\(\s*"[^"]+"\s*\)|date\s+and\s+time\s*\(\s*"[^"]+"\s*\)|time\s*\(\s*"[^"]+"\s*\)|@"[^"]+"))$/.exec(t);if(s){let e=moment(s[2]);return e===null?null:{kind:`date`,test:{"<":t=>isMoment(t)&&t<e,"<=":t=>isMoment(t)&&t<=e,">":t=>isMoment(t)&&t>e,">=":t=>isMoment(t)&&t>=e,"=":t=>isMoment(t)&&t===e}[s[1]],numbers:[],strings:[],moments:[e]}}let c=/^([[\](])\s*(-?\d+(?:\.\d+)?)\s*\.\.\s*(-?\d+(?:\.\d+)?)\s*([[\])])$/.exec(t);if(c){let[e,t]=[Number(c[2]),Number(c[3])],n=c[1]!==`[`,r=c[4]!==`]`;return{kind:`number`,test:i=>typeof i==`number`&&(n?i>e:i>=e)&&(r?i<t:i<=t),numbers:[e,t],strings:[],moments:[]}}let l=/^([[\]()])\s*((?:date\s*\(\s*"[^"]+"\s*\)|date\s+and\s+time\s*\(\s*"[^"]+"\s*\)|time\s*\(\s*"[^"]+"\s*\)|@"[^"]+"))\s*\.\.\s*((?:date\s*\(\s*"[^"]+"\s*\)|date\s+and\s+time\s*\(\s*"[^"]+"\s*\)|time\s*\(\s*"[^"]+"\s*\)|@"[^"]+"))\s*([[\])])$/.exec(t);if(l){let[e,t]=[moment(l[2]),moment(l[3])];if(e===null||t===null)return null;let n=l[1]!==`[`,r=l[4]!==`]`;return{kind:`date`,test:i=>isMoment(i)&&(n?i>e:i>=e)&&(r?i<t:i<=t),numbers:[],strings:[],moments:[e,t]}}return null}function parseCell(e){let t=(e??``).trim();if(t===``||t===`-`)return{kind:`any`,test:()=>!0,numbers:[],strings:[],moments:[]};let n=splitTop(t);if(n.length>1){let e=n.map(parseOne);if(e.some(e=>!e))return null;let t=e;return{kind:t.find(e=>e.kind!==`any`)?.kind??`any`,test:e=>t.some(t=>t.test(e)),numbers:t.flatMap(e=>e.numbers),strings:t.flatMap(e=>e.strings),moments:t.flatMap(e=>e.moments)}}return parseOne(t)}function representatives(e,t){let n=new Set(e.map(e=>e.kind).filter(e=>e!==`any`)),r=(t??``).toLowerCase();if(n.size>1)return null;let i=n.size===1?[...n][0]:r===`boolean`?`boolean`:r===`string`?`string`:/int|long|double|number|decimal/.test(r)?`number`:`any`;if(i===`any`)return[Si];if(i===`boolean`)return[!0,!1];if(i===`string`)return[...new Set(e.flatMap(e=>e.strings)),Si];if(i===`date`){let t=[...new Set(e.flatMap(e=>e.moments))].sort();if(t.length===0)return[Si];let n=t.slice(1).map((e,n)=>halfway(t[n],e));return[...new Set([dayBefore(t[0]),...t.flatMap((e,r)=>[e,...r+1<t.length?[n[r]]:[]]),dayAfter(t[t.length-1])])]}let a=/int|long/.test(r),o=[...new Set(e.flatMap(e=>e.numbers))].sort((e,t)=>e-t);if(o.length===0)return[0];let s=[o[0]-1];return o.forEach((e,t)=>{s.push(e);let n=o[t+1];n!==void 0&&(a?n-e>1&&s.push(e+1):s.push((e+n)/2))}),s.push(o[o.length-1]+1),s}function show(e){return e===Si?t(`app.rules.table.someOtherValue`):typeof e==`string`?`"${e}"`:String(e)}var Ei=2e5;function checkTable(e,n){let r=e.name?.trim()||e.id||t(`app.rules.table.aDecision`),i=n.input??[],a=n.rule??[];if(a.length===0||i.length===0)return[];let o=a.map(e=>i.map((t,n)=>parseCell(e.inputEntry?.[n]?.text)));if(o.some(e=>e.some(e=>!e)))return[{kind:`TABLE-UNREAD`,decision:r,title:title(`TABLE-UNREAD`),detail:t(`app.rules.table.unread`,{decision:r}),rules:[]}];let s=o,c=i.map((e,t)=>representatives(s.map(e=>e[t]),e.inputExpression?.typeRef));if(c.some(e=>!e))return[];let l=c,u=i.map((e,n)=>e.label?.trim()||e.inputExpression?.text?.trim()||t(`app.rules.table.input`,{number:n+1})),d=[],f=(n.hitPolicy??`UNIQUE`).toUpperCase(),outputsOf=e=>(a[e].outputEntry??[]).map(e=>(e.text??``).trim()).join(`|`);if(f===`UNIQUE`||f===`ANY`)for(let e=0;e<a.length;e+=1)for(let n=e+1;n<a.length;n+=1){if(f===`ANY`&&outputsOf(e)===outputsOf(n))continue;let i=l.map((t,r)=>t.find(t=>s[e][r].test(t)&&s[n][r].test(t)));if(i.some(e=>e===void 0))continue;let a=i.map((e,n)=>t(`app.rules.table.whenIs`,{label:u[n],value:show(e)})).join(t(`app.rules.table.and`));d.push({kind:`RULE-OVERLAP`,decision:r,title:title(`RULE-OVERLAP`),detail:t(`app.rules.table.ruleOverlap`,{decision:r,first:e+1,second:n+1,when:a,different:f===`ANY`?t(`app.rules.table.differentResults`):``,policy:f===`ANY`?`Any`:`Unique`}),rules:[e+1,n+1]})}let p=[],m=0,search=(e,t,n)=>{if(!(p.length>=3||m>Ei)){if(m+=1,n.length===0)p.push(t);else if(e!==l.length){for(let r of l[e])if(search(e+1,[...t,r],n.filter(t=>s[t][e].test(r))),p.length>=3)return}}};if(search(0,[],a.map((e,t)=>t)),p.length>0){let e=p.map(e=>e.map((e,n)=>t(`app.rules.table.whenIs`,{label:u[n],value:show(e)})).join(t(`app.rules.table.and`))).join(t(`app.rules.table.orWhen`));d.push({kind:`RULE-GAP`,decision:r,title:title(`RULE-GAP`),detail:t(`app.rules.table.ruleGap`,{decision:r,cases:e}),rules:[]})}return d}function analyzeDecisionTables(e){let t=e,n=[];for(let e of t.drgElement??[])e.$type===`dmn:Decision`&&e.decisionLogic?.$type===`dmn:DecisionTable`&&n.push(...checkTable(e,e.decisionLogic));return n}async function readDmnTables(e,n){let r;try{r=(await d(`plain`).fromXML(e)).rootElement}catch{return[]}let i=[];for(let e of r?.drgElement??[]){let r=e.decisionLogic;e.$type===`dmn:Decision`&&r?.$type===`dmn:DecisionTable`&&e.id&&i.push({decisionId:e.id,name:e.name?.trim()||e.id,hitPolicy:(r.hitPolicy??`UNIQUE`).toUpperCase(),aggregation:r.aggregation?.toUpperCase(),file:n,inputs:(r.input??[]).map((e,n)=>({label:e.label?.trim()||e.inputExpression?.text?.trim()||t(`app.scenarios.dmn.unnamedInput`,{number:n+1}),expression:e.inputExpression?.text?.trim()??``,...e.inputExpression?.typeRef?{type:e.inputExpression.typeRef}:{}})),outputs:(r.output??[]).map((e,n)=>({name:e.name?.trim()||e.label?.trim()||t(`app.scenarios.dmn.unnamedOutput`,{number:n+1}),typeRef:e.typeRef,...e.outputValues?.text?{values:valuesOf(e.outputValues.text)}:{}})),rules:(r.rule??[]).map((e,t)=>({id:e.id??`rule-${t+1}`,inputs:(e.inputEntry??[]).map(e=>(e.text??``).trim()),outputs:(e.outputEntry??[]).map(e=>(e.text??``).trim())}))})}return i}function outputValue(e,t){if(e===`true`)return!0;if(e===`false`)return!1;if(e===`null`)return null;let n=/^"((?:[^"\\]|\\.)*)"$/.exec(e);return n?n[1]:/^-?\d+(\.\d+)?$/.test(e)?Number(e):t&&/int|long|double|number|decimal/i.test(t)?Number.isNaN(Number(e))?e:Number(e):e}function valuesOf(e){return[...e.matchAll(/"(?:[^"\\]|\\.)*"|[^,\s][^,]*/g)].map(e=>e[0].trim())}var Di=new Set([`COLLECT`,`RULE ORDER`,`OUTPUT ORDER`]),Oi=new Set([`COLLECT`,`RULE ORDER`,`OUTPUT ORDER`]),ki={SUM:e=>e.reduce((e,t)=>e+t,0),COUNT:e=>e.length,MIN:e=>e.reduce((e,t)=>Math.min(e,t),1/0),MAX:e=>e.reduce((e,t)=>Math.max(e,t),-1/0),MEAN:e=>e.length===0?NaN:e.reduce((e,t)=>e+t,0)/e.length,MEDIAN:e=>{let t=[...e].sort((e,t)=>e-t),n=Math.floor(t.length/2);return t.length%2==0?(t[n-1]+t[n])/2:t[n]},MODE:e=>{let t=new Map,n=e[0]??NaN,r=0;for(let i of e){let e=(t.get(i)??0)+1;t.set(i,e),e>r&&(n=i,r=e)}return n}};function rowOf(e,t){let n=e.rules[t],r={};return e.outputs.forEach((e,t)=>{r[e.name]=outputValue(n.outputs[t]??``,e.typeRef)}),r}function rank(e,t){return(e.outputs[0]?.values??[]).indexOf((e.rules[t].outputs[0]??``).trim())}function dmnMatch(e,n){let r=new Set,i=[],a=[],o=[],s=!1,c=[],l=e.inputs.map(e=>/^[A-Za-z_][\w.]*$/.test(e.expression)?readValue(n,e.expression):Symbol.for(`unreadable`));if(e.inputs.forEach((e,t)=>{l[t]===Symbol.for(`unreadable`)?i.push(e.expression):l[t]===void 0&&r.add(e.expression)}),i.length>0)return{rules:[],matching:[],outputs:{},why:t(`app.scenarios.dmn.cannotReadInput`,{inputs:i.join(`, `)}),missing:[],unread:!0,unreadInputs:i,unreadCells:o,problems:[]};e.rules.forEach((t,n)=>{e.inputs.every((e,n)=>{let r=t.inputs[n],i=parseCell(r);if(!i){s=!0;let e=(r??``).trim()||`-`;return o.includes(e)||o.push(e),!1}if(i.kind===`any`)return!0;let c=l[n];if(c===void 0)return!1;if(typeof c==`string`&&i.kind===`number`)return a.includes(e.expression)||a.push(e.expression),!1;let u=typeof c==`number`||typeof c==`string`||typeof c==`boolean`?c:String(c);return i.test(u)})&&c.push(n+1)});let u=[],d=e.hitPolicy;if(c.length===0){let c=a.map(e=>t(`app.scenarios.dmn.textAsNumber`,{name:e,value:JSON.stringify(readValue(n,e))})),l=r.size>0?t(`app.scenarios.dmn.chooseVariablesFor`,{names:[...r].join(`, `)}):c.length>0?c.join(`; `):t(`app.scenarios.dmn.noRuleMatches`);return{rules:[],matching:[],outputs:{},why:t(`app.scenarios.dmn.tableBecause`,{table:e.name,because:l}),missing:[...r],unread:s,unreadInputs:i,unreadCells:o,problems:u}}let f=c;if(d===`UNIQUE`&&c.length>1&&u.push(t(`app.scenarios.dmn.hitPolicyUnique`,{first:c.slice(0,-1).join(`, `),last:c[c.length-1]})),d===`ANY`&&new Set(c.map(t=>JSON.stringify(rowOf(e,t-1)))).size>1&&u.push(t(`app.scenarios.dmn.hitPolicyAny`,{rules:c.join(`, `)})),d===`PRIORITY`||d===`OUTPUT ORDER`){if((e.outputs[0]?.values??[]).length===0)u.push(t(`app.scenarios.dmn.hitPolicyNeedsValues`,{policy:t(d===`PRIORITY`?`app.scenarios.dmn.hitPolicy.priority`:`app.scenarios.dmn.hitPolicy.outputOrder`)}));else{let t=[...c].sort((t,n)=>rank(e,t-1)-rank(e,n-1));f=d===`PRIORITY`?t.slice(0,1):t}}else!Di.has(d)&&d!==`UNIQUE`&&d!==`ANY`&&(f=c.slice(0,1));let p=f.map(t=>rowOf(e,t-1)),m=Di.has(d)||d===`OUTPUT ORDER`?Object.fromEntries(e.outputs.map(e=>[e.name,p.map(t=>t[e.name])])):p[0],h=e.aggregation?ki[e.aggregation]:void 0;if(Oi.has(d)&&h&&e.outputs.length>0){let t=e.outputs[0].name,n=m[t].filter(e=>typeof e==`number`);m={[t]:h(n)}}u.length>0&&(m={});let g=e.rules[f[0]-1],_=e.inputs.flatMap((e,r)=>{let i=g.inputs[r];return!i||i===`-`?[]:[t(`app.scenarios.dmn.inputFits`,{input:e.label,value:showValue(readValue(n,e.expression)),cell:i})]}),v=u.length>0?t(`app.scenarios.dmn.raisesAnError`):t(`app.scenarios.dmn.returnsOutputs`,{outputs:e.outputs.map(e=>`${e.name} = ${showValue(m[e.name])}`).join(`, `)}),y=f.length>1?t(`app.scenarios.dmn.rulesMatch`,{rules:f.join(`, `)}):t(`app.scenarios.dmn.ruleMatches`,{rule:f[0]});return{rules:f,matching:c,outputs:m,why:_.length>0?t(`app.scenarios.dmn.whyWithReasons`,{which:y,reasons:_.join(`, `),returns:v}):t(`app.scenarios.dmn.why`,{which:y,returns:v}),missing:[...r],unread:s,unreadInputs:i,unreadCells:o,problems:u}}function resultOf(e,t,n){return!n||t.rules.length===0||Object.keys(t.outputs).length===0?{}:e.outputs.length===1?{[n]:t.outputs[e.outputs[0].name]}:{[n]:t.outputs}}function sampleOf(e){if(e.kind===`any`)return;if(e.kind===`boolean`)return[!0,!1].find(t=>e.test(t));if(e.kind===`string`)return e.strings.find(t=>e.test(t));let t=[...new Set(e.numbers)].sort((e,t)=>e-t),n=t.flatMap(e=>[e,e+1,e-1]),r=t.slice(1).map((e,n)=>(t[n]+e)/2);return[...n,...r,0].find(t=>e.test(t))}function ruleInputs(e,t){let n={};for(let r=0;r<e.inputs.length;r+=1){let i=parseCell(e.rules[t]?.inputs[r]);if(!i)return null;let a=sampleOf(i);if(a===void 0){if(i.kind!==`any`)return null}else{if(!/^[A-Za-z_][\w.]*$/.test(e.inputs[r].expression))return null;n[e.inputs[r].expression]=a}}return n}function contextOf(e,t=new Map){return{definitions:e,index:indexOf(e),tables:t}}function producedBy(e){return(t,n)=>{let r=e.index.steps.get(t),i=r?.decision?e.tables.get(r.decision):void 0;if(r&&i)return resultOf(i,dmnMatch(i,n),r.resultVariable)}}function eventFired(e,t,n){let r=e.index.steps.get(n);return r?t[`x-penstock`]?.behaviours?.[n]?.then===`fire`||answerIndex(t,r,r.host?e.index.steps.get(r.host):void 0)>=0:!1}function deciderFor(e,t,n=[]){let r=producedBy(e);return(i,a)=>{let o=[...n,...a],s=e.index.nodes.get(i[0].nodeId),c=i.findIndex(n=>{let r=n.boundaryId?e.index.steps.get(n.boundaryId):void 0;return!!r&&firesBoundary(t,r,r.host?e.index.steps.get(r.host):void 0)});if(c>=0)return c;let l=i.findIndex(e=>!e.boundaryId);if(!s)return Math.max(l,0);if(s.type===`bpmn:EventBasedGateway`){let n=i.findIndex(n=>n.flowIds.some(n=>eventFired(e,t,e.index.flows.get(n)?.target??``)));return n>=0?n:Math.max(l,0)}let u=scopeAlong(t,e.index.steps,o,r),d=readGateway(isGateway(s.type)?gatewayKind(s.type):`inclusive`,flowInputs(e.index,s.id),u);if(d.noWay)return-1;let f=new Set(d.takes),p=f.size===0?-1:i.findIndex(e=>!e.boundaryId&&e.flowIds.length===f.size&&e.flowIds.every(e=>f.has(e)));return p>=0?p:Math.max(l,0)}}function createOf(e){return e.instructions.find(e=>e.type===`CREATE_PROCESS_INSTANCE`)}function withVariables(e,t){return{...e,instructions:e.instructions.map(e=>e.type===`CREATE_PROCESS_INSTANCE`?{...e,variables:t}:e)}}function withDecisionInputs(e,t){if(e.tables.size===0)return t;let n=t.testCase;for(let r of t.scenario.stepIds){let i=e.index.steps.get(r),a=i?.decision?e.tables.get(i.decision):void 0,o=i?.resultVariable;if(!a||!o)continue;let s=flattenValues(createOf(n)?.variables),c=Object.fromEntries(Object.entries(s).filter(([e])=>e!==o&&!e.startsWith(`${o}.`)));if(Object.keys(c).length===Object.keys(s).length)continue;let l=[c];for(let e=0;e<a.rules.length;e+=1){let t=ruleInputs(a,e);t&&l.push({...c,...t})}for(let r of l){if(dmnMatch(a,unflattenValues(r)).rules.length===0)continue;let i=withVariables(n,unflattenValues(r)),o=resolveCase(e,i,`generated`);if(`planned`in o&&o.planned.key===t.key&&o.planned.complete&&o.planned.notes.length===0){n=i;break}}}return n===t.testCase?t:{...t,testCase:n}}function generatedSet(e,t){let n=generateScenarioSet(e.definitions,t);return{capped:n.capped,unplannable:n.unplannable,planned:n.items.map(({scenario:t,testCase:n})=>withDecisionInputs(e,{key:scenarioKey(t),name:n.name,origin:`generated`,scenario:t,testCase:n,complete:!0,notes:[]}))}}function listed(e){return e.join(`, `)}function chooseProcess(e,n,r){let i=executableProcessIds(e.definitions);return n?[...e.index.nodes.values()].some(e=>e.process===n)?i.includes(n)?{process:n}:{problem:t(`app.scenarios.processNotExecutable`,{process:n})}:{problem:t(`app.scenarios.processNotInDiagram`,{process:n})}:i.length===1?{process:i[0]}:i.length===0?{problem:t(`app.scenarios.noExecutableProcess`)}:{problem:r??t(`app.scenarios.chooseAProcess`,{processes:listed(i)})}}function walkAll(e,t,n,r){let i=walkScenario(e.definitions,deciderFor(e,t),{process:n,startId:r});if(!i)return null;let a=expandWalked(e.definitions,i.scenario,(n,r)=>walkScenario(e.definitions,deciderFor(e,t,r),{process:n})?.scenario??null);return{...i,scenario:a}}function blockedNote(e,n){if(!n)return[];let r=e.index.nodes.get(n);return[t(`app.scenarios.noConditionAtGateway`,{where:r?.name?t(`app.scenarios.quoted`,{name:r.name}):t(`app.scenarios.aGateway`)})]}function reached(e){return new Set([...e.stepIds,...e.endIds])}function resolveCase(e,n,r=`file`,i){let a=soundCase(n),o=a.instructions.find(e=>e.type===`CREATE_PROCESS_INSTANCE`)?.processDefinitionSelector?.processDefinitionId,s=chooseProcess(e,o||void 0,t(`app.scenarios.namesNoProcess`,{processes:listed(executableProcessIds(e.definitions))}));if(`problem`in s)return s;let c=walkAll(e,a,s.process);if(!c)return{problem:t(`app.scenarios.cannotFollow`,{process:s.process})};let l=assertedElements(a),u=c.scenario,d=c.complete,f=[...blockedNote(e,c.blockedAt)];if(l.length>0){let covers=e=>l.every(t=>reached(e).has(t));if(!covers(u)){let n=(i??generateScenarioSet(e.definitions).items.map(e=>e.scenario)).filter(e=>e.process===u.process&&covers(e)).sort((e,t)=>reached(e).size-reached(t).size)[0];n?(u=n,d=!0,f.length=0,f.push(t(`app.scenarios.takesAnotherWay`))):f.push(t(`app.scenarios.checksUnreachedElements`))}}return{planned:{key:scenarioKey(u),name:a.name,origin:r,scenario:u,testCase:a,complete:d,notes:f}}}function resolveValues(e,n,r,i={}){let a=chooseProcess(e,i.process,null);if(`problem`in a)return a;let o=walkAll(e,{name:n,instructions:[{type:`CREATE_PROCESS_INSTANCE`,processDefinitionSelector:{processDefinitionId:a.process},variables:r}]},a.process,i.startId);if(!o)return{problem:t(`app.scenarios.cannotFollow`,{process:a.process})};let s=testCaseOf(o.scenario,e.index.steps,r);if(`problem`in s)return{problem:s.problem};let c=o.complete?[]:o.blockedAt?blockedNote(e,o.blockedAt):[t(`app.scenarios.doesNotReachAnEnd`)],l=n.trim()||describeScenario(o.scenario);return{planned:{key:scenarioKey(o.scenario),name:l,origin:`added`,scenario:o.scenario,testCase:{...s.testCase,name:l},complete:o.complete,notes:c}}}function isEdited(e){return e?!!e.name||!isEmptyPatch(e.start)||!isEmptyPatch(e.expected)||Object.values(e.returns??{}).some(e=>!isEmptyPatch(e))||Object.keys(e.mocks??{}).length>0:!1}function applyEdits(e,t,n){if(!t)return e;let r=soundCase(e);isEmptyPatch(t.start)||(r=withStart(r,applyPatchNested(startOf(r),t.start)));for(let[e,i]of Object.entries(t.returns??{})){let t=n.get(e);t&&!isEmptyPatch(i)&&(r=withReturns(r,t,applyPatchNested(returnsOf(r,t)??{},i)))}for(let[e,i]of Object.entries(t.mocks??{})){let t=n.get(e);t&&(r=i===null?t.event===`timer`?withoutTimerFires(r,t):withoutWorkerMock(r,t):i.kind===`timer`?withTimerFires(r,t,i.duration):withWorkerMock(r,t,i))}return isEmptyPatch(t.expected)||(r=withExpected(r,applyPatch(expectedOf(r),t.expected))),t.name?{...r,name:t.name}:r}function valuesOfRows(e){let t={};for(let n of e)n.name.trim()!==``&&(t[n.name.trim()]=n.value);return t}function editsForRows(e,t,n,r){let i=valuesOfRows(r.rows);if(r.role===`start`)return{...n,start:patchValues(flattenValues(startOf(e)),i)};if(r.role===`expected`)return{...n,expected:patchValues(expectedOf(e),i)};let a=t.get(r.elementId),o=flattenValues(a?returnsOf(e,a):void 0);return{...n,returns:{...n.returns,[r.elementId]:patchValues(o,i)}}}function quoted(e,n){return e?t(`app.scenarios.quoted`,{name:e}):n}function humanType(e){return e.replace(`bpmn:`,``).replace(/([a-z])([A-Z])/g,`$1 $2`).toLowerCase()}function elementOf(e){return t(`app.scenarios.theElement`,{type:humanType(e?.type??`element`)})}function rowsOf(e,t=!0){return Object.entries(t?flattenValues(e):e??{}).map(([e,t])=>({name:e,value:t}))}function listOf(e){return e.map(e=>`${e.name} = ${showValue(e.value)}`).join(`, `)}function kindOf(e,t,n){let r=e?.type??t?.type??``;return r===`bpmn:StartEvent`||n&&!r?`start`:r===`bpmn:EndEvent`?`end`:r===`bpmn:EventBasedGateway`?(e?.outgoing.length??0)>1?`eventGateway`:`join`:/^bpmn:(SubProcess|Transaction|AdHocSubProcess)$/.test(r)?`subprocess`:r===`bpmn:ParallelGateway`?(e?.outgoing.length??0)>1?`parallel`:`join`:isGateway(r)?(e?.outgoing.length??0)>1?`gateway`:`join`:t?.host&&t.event===`error`?`error`:t?.event===`timer`?`timer`:t?.event===`signal`?`signal`:t?.event===`message`?`message`:r===`bpmn:BusinessRuleTask`||t?.decision?`decision`:r===`bpmn:CallActivity`||t?.calledProcess?`call`:r===`bpmn:UserTask`&&!t?.job&&!t?.external?`user`:t?.job||t?.external?`worker`:t?.delegateClass||t?.delegateExpression||t?.expression?`delegate`:`task`}function depthOf(e,t){let n=0;for(let r=e.nodes.get(t)?.parent??null;r;r=e.nodes.get(r)?.parent??null)n+=1;return n}function describeEvent(e,n){let r=e.nodes.get(n),i=e.steps.get(n),a=r?.name?t(`app.scenarios.quoted`,{name:r.name}):t(`app.scenarios.theType`,{type:humanType(r?.type??`bpmn:Event`)});return i?.event===`message`?t(`app.scenarios.event.message`,{name:a,message:i.message??``}).replace(` )`,`)`):i?.event===`timer`?t(`app.scenarios.event.timer`,{name:a,timer:i.timer??``}).replace(` )`,`)`):i?.event===`signal`?t(`app.scenarios.event.signal`,{name:a,signal:i.signal??``}).replace(` )`,`)`):a}function joined(e){return e.length<3?e.join(t(`app.scenarios.listSeparator.two`)):`${e.slice(0,-1).join(`, `)}${t(`app.scenarios.listSeparator.many`)}${e[e.length-1]}`}function describeSteps(e,n,r){let i=soundCase(r),{index:a}=e,o=containersOf(e.definitions),s=[],c={...startOf(i)},l=new Map;for(let e of n.decisions)l.set(e.decisionId,[...l.get(e.decisionId)??[],e]);let u=new Map,d=n.firedIds.length-1;return n.firedIds.forEach((r,f)=>{let p=a.nodes.get(r),m=a.steps.get(r),h=p?.name??``,g=kindOf(p,m,f===0),_=[],v={},y={number:f+1,depth:depthOf(a,r),elementId:r,name:h||humanType(p?.type??`element`),kind:g,text:``,issues:_,links:v,scope:{}},b=quoted(h,elementOf(p)),slotOf=(e,t,n,i)=>({role:e,elementId:r,title:t,rows:rowsOf(n,e!==`expected`),empty:i}),x=m?returnsOf(i,m):void 0;if(g===`start`&&y.depth>0)y.text=t(`app.scenarios.step.subProcessStartsAt`,{label:b});else if(g===`start`){let e=startOf(i);y.text=Object.keys(e).length>0?t(`app.scenarios.step.startsWithVariables`,{label:b}):t(`app.scenarios.step.startsWithoutVariables`,{label:b}),y.values=slotOf(`start`,t(`app.scenarios.slot.startVariables`),e,t(`app.scenarios.slot.noVariablesAdd`))}else if(g===`gateway`){let e=u.get(r)??0;u.set(r,e+1);let n=l.get(r)?.[e],i=readGateway(gatewayKind(p?.type??``),flowInputs(a,r),c),o=n?.flowIds??[],s=new Map(i.flows.map(e=>[e.flowId,e])),d=new Set(i.takes);y.branches=i.flows.map(e=>({flowId:e.flowId,name:e.name,condition:e.condition,hint:e.hint,planned:o.includes(e.flowId),wouldTake:d.has(e.flowId),isDefault:e.isDefault}));let f=o.map(e=>s.get(e)).filter(e=>!!e),m=f.map(e=>e.label).join(t(`app.scenarios.listSeparator.two`)),g=o.length===d.size&&o.every(e=>d.has(e));if(f.length===0&&i.noWay)y.text=t(`app.scenarios.step.noConditionNoDefault`),_.push({kind:`stuck`,text:t(`app.scenarios.issue.stuckAtGateway`)});else if(f.length===0)y.text=h?t(`app.scenarios.step.labelSendsOn`,{label:b}):t(`app.scenarios.step.gatewaySendsOn`);else if(i.unresolved&&i.takes.length===0)y.text=t(`app.scenarios.step.takesBecause`,{names:m,because:i.unresolved}),_.push({kind:`unresolved`,text:i.unresolved});else if(g)y.text=t(`app.scenarios.step.takesBecause`,{names:m,because:f.map(e=>e.hint).join(`; `)});else{let e=i.takes.map(e=>s.get(e)?.label??e).join(t(`app.scenarios.listSeparator.two`))||t(`app.scenarios.step.noBranch`);y.text=t(`app.scenarios.step.takesButValues`,{names:m,other:e});let n=f.filter(e=>!d.has(e.flowId));if(n.length>0)_.push({kind:`mismatch`,text:t(`app.scenarios.issue.valuesDoNotTake`,{hints:n.map(e=>e.hint).join(`; `),names:n.map(e=>e.label).join(t(`app.scenarios.listSeparator.two`))})});else{let e=i.flows.filter(e=>d.has(e.flowId)&&!o.includes(e.flowId));_.push({kind:`mismatch`,text:t(`app.scenarios.issue.valuesTakeMore`,{hints:e.map(e=>e.hint).join(`; `),names:e.map(e=>e.label).join(t(`app.scenarios.listSeparator.two`))})})}}if(i.overlap.length>1){let e=[...new Map(i.flows.filter(e=>i.overlap.includes(e.label)).flatMap(e=>e.used.map(e=>[e.name,e]))).values()].map(e=>`${e.name} = ${showValue(e.value)}`).join(`, `),[n,...r]=i.overlap,a=r.length===1?t(`app.scenarios.step.neverTakenOne`,{name:r[0]}):t(`app.scenarios.step.neverTakenMany`,{names:r.join(`, `)});_.push({kind:`mismatch`,text:t(`app.scenarios.issue.overlap`,{first:i.overlap.slice(0,-1).join(`, `),last:i.overlap[i.overlap.length-1],values:e?` (${e})`:``,taken:n,never:a})})}}else if(g===`eventGateway`){let e=u.get(r)??0;u.set(r,e+1);let n=l.get(r)?.[e],i=(p?.outgoing??[]).map(e=>a.flows.get(e)?.target??``);y.text=t(`app.scenarios.step.waitsForFirst`,{targets:joined(i.map(e=>describeEvent(a,e)))});let o=n?.flowIds[0]?a.flows.get(n.flowIds[0])?.target:void 0;o&&(y.text+=t(`app.scenarios.step.comesFirst`,{target:describeEvent(a,o).replace(/ \(.*\)$/,``)}))}else if(g===`subprocess`){let e=o.get(r),i=n.firedIds[f+1]!==void 0&&a.nodes.get(n.firedIds[f+1])?.parent===r;if(e&&!e.followed){y.text=t(`app.scenarios.step.runs`,{label:b});let n=e.why??t(`app.scenarios.thisKindOfSubProcess`);_.push({kind:`unfollowed`,text:t(`app.scenarios.issue.doesNotFollowInside`,{label:b,why:n})})}else y.text=i?t(`app.scenarios.step.runsStepsFollow`,{label:b,repeats:e?.repeats?t(`app.scenarios.step.repeatsPerItem`):``}):t(`app.scenarios.step.runs`,{label:b})}else if(g===`parallel`)y.text=t(`app.scenarios.step.splitsInto`,{number:p?.outgoing.length??0});else if(g===`join`)y.text=(p?.incoming.length??0)>1&&/^bpmn:(Parallel|Inclusive)Gateway$/.test(p?.type??``)?t(`app.scenarios.step.waitsForBranches`,{number:p?.incoming.length}):t(`app.scenarios.step.passesThrough`,{label:b});else if(g===`worker`&&m){let e=m.job??m.external??``,n=failureOf(i,m),a=n===void 0?Object.keys(x??{}).length>0?t(`app.scenarios.step.returns`,{values:listOf(rowsOf(x))}):t(`app.scenarios.step.returnsNothing`):t(`app.scenarios.step.failsWithError`,{code:n});y.text=t(`app.scenarios.step.workerOf`,{label:b,kind:m.external?t(`app.scenarios.workerKind.topic`):t(`app.scenarios.workerKind.jobType`),type:e,what:a}),canAnswer(i,m)&&(y.values=slotOf(`returns`,t(`app.scenarios.slot.workerReturns`),x,t(`app.scenarios.slot.returnsNothingAdd`))),v.worker=r}else if(g===`delegate`&&m){let e=m.delegateClass??m.delegateBean??m.expression??m.delegateExpression??``;y.text=t(`app.scenarios.step.runsAndCompletes`,{label:b,which:e}),canAnswer(i,m)&&(y.values=slotOf(`returns`,t(`app.scenarios.slot.itReturns`),x,t(`app.scenarios.slot.returnsNothingAdd`))),v.worker=r}else if(g===`user`&&m)y.text=t(`app.scenarios.step.personCompletes`,{label:b,with:Object.keys(x??{}).length>0?t(`app.scenarios.step.with`,{values:listOf(rowsOf(x))}):``}),canAnswer(i,m)&&(y.values=slotOf(`returns`,t(`app.scenarios.slot.theyCompleteWith`),x,t(`app.scenarios.slot.completesWithNothing`))),(m.form||m.formKey)&&(v.form=m.form??m.formKey);else if(g===`decision`&&m){let n=m.decision?e.tables.get(m.decision):void 0;if(n){let e=dmnMatch(n,c);y.decision={why:e.why,rules:e.rules},y.text=e.why,e.unreadInputs.length>0?_.push({kind:`unreadable`,text:e.why}):e.rules.length===0&&_.push({kind:e.missing.length>0?`unresolved`:`mismatch`,text:e.why}),e.problems.forEach(e=>_.push({kind:`mismatch`,text:e})),Object.assign(c,resultOf(n,e,m.resultVariable)),v.decision={id:n.decisionId,name:n.name,file:n.file}}else y.text=t(`app.scenarios.step.evaluatesTheDecision`,{decision:m.decision?t(`app.scenarios.quoted`,{name:m.decision}):b}),m.decision&&(v.decision={id:m.decision,name:m.decision})}else if(g===`call`&&m)y.text=t(`app.scenarios.step.callsTheProcess`,{process:m.calledProcess?t(`app.scenarios.quoted`,{name:m.calledProcess}):b}),m.calledProcess&&(v.called=m.calledProcess);else if(g===`message`&&m){let e=m.correlationKey?t(`app.scenarios.step.correlationKey`,{key:m.correlationKey.replace(/^=/,``)}):``;y.text=m.host?t(`app.scenarios.step.messageCaught`,{message:m.message??h,label:b,key:e}):t(`app.scenarios.step.messageArrives`,{message:m.message??h,key:e}),canAnswer(i,m)&&(y.values=slotOf(`returns`,t(`app.scenarios.slot.messageCarries`),x,t(`app.scenarios.slot.carriesNothing`)))}else g===`signal`&&m?(y.text=t(`app.scenarios.step.signalIsBroadcast`,{signal:m.signal??h,caught:m.host?t(`app.scenarios.step.labelCatchesIt`,{label:b}):``}),canAnswer(i,m)&&(y.values=slotOf(`returns`,t(`app.scenarios.slot.signalCarries`),x,t(`app.scenarios.slot.carriesNothing`)))):y.text=g===`timer`&&m?t(`app.scenarios.step.timerFires`,{label:b,when:m.timer?` (${m.timer})`:``}):g===`error`&&m?t(`app.scenarios.step.taskFailsWithError`,{code:m.errorCode??t(`app.scenarios.step.code`),label:b}):g===`end`?y.depth>0?t(`app.scenarios.step.subProcessEndsAt`,{label:b}):t(`app.scenarios.step.processEndsAt`,{label:b}):t(`app.scenarios.step.runs`,{label:b});g===`end`&&f===d&&(y.values=slotOf(`expected`,t(`app.scenarios.slot.expectedAtTheEnd`),expectedOf(i),t(`app.scenarios.slot.nothingChecked`))),m?.host&&!firesBoundary(i,m,a.steps.get(m.host))&&(g===`timer`||g===`message`||g===`signal`||g===`error`)&&_.push({kind:`stuck`,text:t(`app.scenarios.issue.nothingMakesTheEventHappen`)});let S=n.firedIds.some(e=>a.steps.get(e)?.host===r);m&&!m.host&&!S&&!canAnswer(i,m)&&((g===`worker`||g===`user`||g===`message`||g===`signal`)&&_.push({kind:`stuck`,text:t(`app.scenarios.issue.nothingCompletesTheStep`)}),g===`timer`&&_.push({kind:`stuck`,text:t(`app.scenarios.issue.timerNeverFires`)})),m&&Object.assign(c,x??{}),y.scope={...c},s.push(y)}),s}var Ai=10;function at(e){if(!e)return null;let t=Date.parse(e);return Number.isNaN(t)?null:t}function departuresOf(e){let t=[],n=0;for(let{step:r,index:i}of e){if(r.state!==`COMPLETED`)continue;let e=at(r.endedAt);e===null?n+=1:t.push({left:e,index:i})}return t.sort((e,t)=>e.left-t.left||e.index-t.index),{lefts:t.map(e=>e.left),indexes:t.map(e=>e.index),unknown:n}}function gapFrom(e,t){let n=at(t.startedAt);if(n===null)return e.lefts.length+e.unknown>0?{gap:null,from:null}:null;let r=0,i=e.lefts.length;for(;r<i;){let t=r+i>>1;e.lefts[t]<=n+Ai?r=t+1:i=t}return r>0?{gap:n-e.lefts[r-1],from:e.indexes[r-1]}:e.unknown>0?{gap:null,from:null}:null}function handedOver(e){if(e.length===0)return[];if(e.every(e=>e.flow.joins))return e;if(e.length===1)return[e[0]];if(e.some(e=>e.gap===null))return[];let t=[...e].sort((e,t)=>e.gap-t.gap);return t[1].gap-t[0].gap>Ai?[t[0]]:[]}function answeredAny(e,t){let n=departuresOf(e),r=departuresOf(t);return n.lefts.length+n.unknown===0||r.lefts.length+r.unknown===0?!1:n.unknown>0||r.unknown>0||r.lefts[r.lefts.length-1]+Ai>=n.lefts[0]}function indexed(e){let t=new Map;return e.forEach((e,n)=>{let r=t.get(e.elementId);r?r.push({step:e,index:n}):t.set(e.elementId,[{step:e,index:n}])}),t}function handovers(e,t){let n=indexed(e),r=t.filter(e=>!e.message),i=new Map;for(let e of r){let t=i.get(e.targetId);t?t.push(e):i.set(e.targetId,[e])}let a=new Map,departuresFrom=e=>{let t=a.get(e);return t||(t=departuresOf(n.get(e)??[]),a.set(e,t)),t},o=[];for(let[e,t]of i)for(let{step:r,index:i}of n.get(e)??[]){let e=t.flatMap(e=>{let t=gapFrom(departuresFrom(e.sourceId),r);return t?[{flow:e,gap:t.gap,from:t.from}]:[]});for(let t of handedOver(e))o.push({arrival:i,flow:t.flow,from:t.from})}return o}function takenFlows(e,t){let n=indexed(e),r=new Set;for(let e of t)n.has(e.id)&&r.add(e.id);for(let n of handovers(e,t))r.add(n.flow.id);let i=new Map;for(let e of t.filter(e=>e.message)){let t=`${e.sourceId}\u0000${e.targetId}`,n=i.get(t);n?n.push(e):i.set(t,[e])}for(let e of i.values()){if(e.length!==1)continue;let[t]=e;answeredAny(n.get(t.sourceId)??[],n.get(t.targetId)??[])&&r.add(t.id)}return t.filter(e=>r.has(e.id)).map(e=>e.id)}function isGatewayStep(e){return/gateway/i.test(e.elementType)}function finalValues(e){let t=new Map,n=[...e.steps].sort((e,t)=>Date.parse(e.endedAt??e.startedAt)-Date.parse(t.endedAt??t.startedAt));for(let e of n)for(let n of[...e.out,...e.changed])t.set(n.name,{value:n.value,elementId:e.elementId});return t}function comparePlan(e,n,r,i){if(!i)return null;let a=[],add=(e,t,n)=>{a.some(r=>r.kind===e&&r.elementId===t&&r.text===n)||a.push({kind:e,elementId:t,text:n})},o=new Set(i.steps.map(e=>e.elementId)),s=new Set(takenFlows(i.steps.map(e=>({elementId:e.elementId,state:e.state,startedAt:e.startedAt,endedAt:e.endedAt})),[...e.index.flows.values()].map(t=>({id:t.id,sourceId:t.source,targetId:t.target,message:!1,joins:/^bpmn:(Parallel|Inclusive)Gateway$/.test(e.index.nodes.get(t.target)?.type??``)})))),c=new Set(n.firedIds),l=i.steps.some(isGatewayStep);for(let n of c){let r=e.index.nodes.get(n);o.has(n)||r&&/Gateway$/.test(r.type)&&!l||add(`unreached`,n,t(`app.scenarios.difference.plannedButNotRun`))}for(let n of o){let r=e.index.nodes.get(n);c.has(n)||!r||/Gateway$/.test(r.type)||add(`unexpected`,n,t(`app.scenarios.difference.ranButNotPlanned`))}for(let e of r){if(e.kind!==`gateway`||!e.branches)continue;let n=e.branches.filter(e=>e.planned);if(n.length===0)continue;let r=e.branches.filter(e=>s.has(e.flowId));r.length!==0&&(r.length===n.length&&r.every(e=>e.planned)||add(`branch`,e.elementId,t(`app.scenarios.difference.branch`,{expected:n.map(e=>t(`app.scenarios.quoted`,{name:e.name})).join(t(`app.scenarios.listSeparator.two`)),took:r.map(e=>t(`app.scenarios.quoted`,{name:e.name})).join(t(`app.scenarios.listSeparator.two`))})))}let u=finalValues(i),d=new Set;for(let e of r)if(e.values?.role===`returns`)for(let n of e.values.rows){let r=i.steps.find(t=>t.elementId===e.elementId)?.out.find(e=>e.name===n.name);r&&!sameValue(r.value,n.value)&&(add(`value`,e.elementId,t(`app.scenarios.difference.value`,{name:n.name,expected:showValue(n.value),got:showValue(r.value)})),d.add(n.name))}let f=r[r.length-1];for(let e of f?.values?.role===`expected`?f.values.rows:[]){let n=u.get(e.name);if(n&&sameValue(n.value,e.value))continue;let r=t(`app.scenarios.difference.value`,{name:e.name,expected:showValue(e.value),got:n?showValue(n.value):t(`app.scenarios.difference.notSet`)});add(`value`,n&&c.has(n.elementId)?n.elementId:f.elementId,r),n&&n.elementId!==f.elementId&&c.has(n.elementId)&&add(`value`,f.elementId,r)}for(let e of i.incidents)add(`incident`,e.elementId,e.message);let p=new Map;for(let e of a)p.set(e.elementId,[...p.get(e.elementId)??[],e]);let m=f?.values?.role===`expected`&&f.values.rows.length>0;return{matches:a.length===0,against:t(m?`app.scenarios.difference.againstStepsAndVariables`:`app.scenarios.difference.againstSteps`),differences:a,byElement:p}}function withUniqueName(e,t){let n=uniqueName(e.planned.name,t);return n===e.planned.name?e:{planned:{...e.planned,name:n,testCase:{...e.planned.testCase,name:n}}}}function uniqueName(e,t){if(!t.has(e))return e;let n=2;for(;t.has(`${e} (${n})`);)n+=1;return`${e} (${n})`}var ji={elementIds:[],flowIds:[],numbers:new Map,order:[]};function itemOf(e,t,n,r,i,a){let o=applyEdits(t.testCase,r,e.index.steps),s=describeSteps(e,t.scenario,o),c=s.filter(e=>e.issues.length>0).length+ +!t.complete;return{id:n,origin:t.origin,name:o.name,ticked:i&&!a,inFile:a,edited:isEdited(r),planned:t,unplannable:null,baseCase:t.testCase,testCase:o,steps:s,path:scenarioPath(t.scenario),problems:c,notes:t.notes}}function unplannable(e,t,n,r,i){return{id:t,origin:r,name:e.name,ticked:!1,inFile:i,edited:!1,planned:null,unplannable:n,baseCase:e,testCase:e,steps:[],path:ji,problems:1,notes:[n]}}function fileIds(e){let t=new Map;return e.map(e=>{let n=(t.get(e.name)??0)+1;return t.set(e.name,n),n===1?`file:${e.name}`:`file:${e.name}#${n}`})}function reviewOf(e,n){let r=new Set(n.unticked),i=n.existing.filter(e=>typeof e==`object`&&!!e&&!Array.isArray(e)).map(soundCase);if(n.mode===`file`){let t=fileIds(i);return{items:i.map((i,a)=>{let o=resolveCase(e,i,`file`);return`planned`in o?itemOf(e,o.planned,t[a],n.edits[t[a]],!r.has(t[a]),!1):unplannable(i,t[a],o.problem,`file`,!1)}),capped:!1}}let a=new Map(i.map(e=>[e.name,e])),o=generatedSet(e),s=o.planned.map(t=>{let i=n.edits[t.key],o=i?.name||t.name,s=a.get(o);if(!s)return itemOf(e,t,t.key,i,!r.has(t.key),!1);let c=resolveCase(e,s,`file`);return`planned`in c?itemOf(e,c.planned,t.key,void 0,!1,!0):unplannable(s,t.key,c.problem,`generated`,!0)});for(let e of o.unplannable){let t=scenarioKey(e.scenario);s.push(unplannable({name:describeScenario(e.scenario),instructions:[]},t,e.problem,`generated`,!1))}let c=new Set([...a.keys(),...s.map(e=>e.name)]);for(let i of n.added){let a=`added:${i.id}`,o=resolveValues(e,i.name,i.values,{process:i.process,startId:i.startId}),l=`planned`in o?withUniqueName(o,c):o;`planned`in l?(c.add(l.planned.name),s.push(itemOf(e,l.planned,a,n.edits[a],!r.has(a)&&l.planned.complete,!1))):s.push(unplannable({name:i.name||t(`app.scenarios.addedScenario`),instructions:[]},a,l.problem,`added`,!1))}return{items:s,capped:o.capped}}function toWrite(e){return e.filter(e=>e.ticked&&!e.inFile&&!e.unplannable).map(e=>e.testCase)}function reviewCoverage(e,t){return scenarioCoverage(e,t.filter(e=>(e.ticked||e.inFile)&&!e.unplannable).map(e=>e.path))}function conditionStyleOf(e,t){for(let t of e.flows.values()){let e=t.condition?.trim()??``;if(e.startsWith(`=`))return`feel`;if(/^[$#]\{/.test(e))return`juel`}return t}function writeCondition(e,t){let n=e.trim();if(n!==``)return t===`feel`?n.startsWith(`=`)?n:`=${n}`:/^[$#]\{[\s\S]*\}$/.test(n)?n:`\${${n}}`}function conditionVariables(e){let t=new Set,n=new Set([...e.steps.values()].flatMap(e=>e.resultVariable?[e.resultVariable]:[]));for(let r of e.flows.values())if(r.condition)for(let e of evaluateCondition(r.condition,{}).missing)n.has(e)||t.add(e);return[...t]}function sameCondition(e,t){return conditionText(e)===conditionText(t)}function conditionEditProblem(e,n,r,i){if(r.trim()!==``||i!==`feel`)return null;let a=e.flows.get(n),o=a?e.nodes.get(a.source):void 0;return!a||o?.type!==`bpmn:ExclusiveGateway`||o.defaultFlow===n?null:t(`app.scenarios.gatewayNeedsCondition`)}var Mi=300;function apart(e,t){let n=e.split(`/`),r=t.split(`/`),i=0;for(;i<n.length-1&&i<r.length-1&&n[i]===r[i];)i+=1;return[n.slice(i).join(`/`),r.slice(i).join(`/`)]}async function parse(e,t){let n=await t(e).catch(()=>null);if(!n)return{tables:[],form:null};if(/\.dmn$/i.test(e))return{tables:await readDmnTables(n,e),form:null};try{let e=JSON.parse(n).id;return{tables:[],form:typeof e==`string`?e:null}}catch{return{tables:[],form:null}}}async function collectTargets(e,n,r=new Map){let i=e.filter(e=>/\.(dmn|form)$/i.test(e.path)).sort((e,t)=>e.path.localeCompare(t.path)).slice(0,Mi),a=await Promise.all(i.map(async e=>{let t=`${e.path}#${e.stamp}`,i=r.get(t);if(i)return i;let a=await parse(e.path,n);return r.set(t,a),a})),o={tables:new Map,forms:new Map,duplicates:[]};return a.forEach((e,n)=>{for(let r of e.tables){let e=o.tables.get(r.decisionId);if(e){let[a,s]=apart(e.file??``,i[n].path);o.duplicates.push(t(`app.scenarios.duplicateDecision`,{id:r.decisionId,used:a,other:s}))}else o.tables.set(r.decisionId,r)}e.form&&!o.forms.has(e.form)&&o.forms.set(e.form,i[n].path)}),o}var $=null,Ni=null;function setDefaultBridgeFactory(e){Ni=e}function setPlatformBridge(e){$=e}function getPlatformBridge(){if(!$){try{$=(typeof window<`u`?window.__platformBridge:void 0)??Ni?.()??null}catch{$=null}if(!$)throw Error(`PlatformBridge is not initialized`)}return $}export{convertedFolder as $,parseXml as $t,evaluateCondition as A,feelTextOf as An,withLinkedResources as At,onShowKeyboardShortcuts as B,unreadableSentence as Bn,kindName$1 as Bt,firesTimer as C,targetKindOf as Cn,canHaveBreakpoint as Ct,coverageLine as D,kindOf$4 as Dn,runCase as Dt,workerMockOf as E,formatNameOf as En,newSession as Et,_i as F,stepsOf as Fn,writtenVariables as Ft,guideUrl as G,declaresName as Gn,ruleUrl as Gt,showThemeChoice as H,savedAsNotice as Hn,ruleTitle as Ht,gi as I,duplicateIdProblem as In,describeScenario as It,ai as J,pathsOf as Jn,runId as Jt,li as K,scriptLanguageOf as Kn,listOf$1 as Kt,hi as L,readDmn as Ln,analyzeFlow as Lt,parseValue as M,afterOf as Mn,adHocTestCase as Mt,readValue as N,reaches as Nn,recordedTestCase as Nt,numberLabel as O,readModel as On,testBuildResources as Ot,showValue as P,indexOf as Pn,waitingSteps as Pt,convertedFilePath as Q,findAll as Qt,tasklistUrl as R,describeUnreadable as Rn,executableProcessIds as Rt,parseCell as S,withCodeVariables as Sn,retryIncidentCall as St,timerDuration as T,beanOf$1 as Tn,inProject as Tt,onOpenDocumentation as U,expressionsOf as Un,ruleWhy as Ut,onShowThemeChoice as V,migrateDmn$1 as Vn,ruleFix as Vt,openDocumentation as W,variablesOf$1 as Wn,ruleFor as Wt,matchesShortcut as X,escapeText as Xt,si as Y,XmlError as Yt,convertedConfig as Z,escapeXml as Zt,valuesOfRows as _,withTestCase as _n,sweepDebugLeftovers as _t,conditionEditProblem as a,attributesOf as an,decisionSections as at,dmnMatch as b,codeUses as bn,parseEngineAnswer as bt,sameCondition as c,formJson as cn,elementWords as ct,reviewOf as d,ttlOf as dn,getCatalog as dt,serializeXml as en,convertFile as et,toWrite as f,mergeTestCases as fn,loadTemplate as ft,editsForRows as g,testCaseFileFor as gn,qn as gt,takenFlows as h,serialiseTestCases as hn,DebugSessions as ht,collectTargets as i,isExample as in,Ir as it,formatValue as j,scriptSitesOf as jn,storageLedger as jt,scenarioPath as k,feelSourceOf as kn,testCaseFileByProcessId as kt,writeCondition as l,platformOf as ln,kindWords as lt,handovers as m,penstockOnly as mn,satisfiesEngine as mt,setDefaultBridgeFactory as n,own$1 as nn,formIdsOf as nt,conditionStyleOf as o,decisionXml as on,fieldSection as ot,comparePlan as p,parseTestCases as pn,resolveTemplates as pt,ci as q,chainOf as qn,readTrace as qt,setPlatformBridge as r,exampleFiles as rn,migrateBpmn as rt,conditionVariables as s,dmnNamespaceOf as sn,formRows as st,getPlatformBridge as t,workerFromTemplate as tn,folderOf as tt,reviewCoverage as u,processXml as un,wordsOf as ut,contextOf as v,ProjectCore as vn,broadcastSignalCall as vt,isDuration as w,relative as wn,debugProcessId as wt,analyzeDecisionTables as x,fetchesOf as xn,publishMessageCall as xt,resolveValues as y,baseName as yn,cancelInstanceCall as yt,mi as z,emptyUnreadable as zn,startEventsOf as zt};