const regExpFileID=/[A-Z0-9]{8}-([A-Z0-9]{4}-){3}[A-Z0-9]{12}/m,eDiagram=document.getElementById("diagram"),eUpload=document.getElementById("upload"),fileInput=document.getElementById("fileInput");let sSolutionName="",sMode="diagram",sDiagram,oRawData={},sLists;function resetUploadArea(){fileInput.value="",uploadArea.className="upload-area";uploadArea.querySelector(".upload-content").innerHTML=`

Drag & Drop Files Here

or Click to Upload

`}async function handleFiles(e){let t=e.target.files;if(t.length>0)for(let a of(console.log("Files uploaded:",t),t))a.name.toLowerCase().endsWith(".zip")&&await processZipFile(a)}async function processZipFile(e){oRawData={flows:[],environment:[],solution:{},customization:{},assets:[],connectionRefs:[],tables:[],securityProfile:[],canvasApps:[],customControls:[],roles:[],solFlows:[],agents:[],functions:[],connectors:[],icons:[],agentVariables:[],agentConnections:[],agentFlows:"",agentConnections:[],agentVariables:[],languageCode:"",webResources:[],aiModels:[]};let t=!1;try{uploadArea.className="upload-area processing";uploadArea.querySelector(".upload-content").innerHTML=`

Processing Zip File...

Extracting solution

`;let a=new zip.ZipReader(new zip.BlobReader(e)),i=await a.getEntries();for(let n of(console.log("Zip entries:",i),i)){let l=await n.getData(new zip.TextWriter);if(n.filename.toLowerCase().endsWith("solution.xml"))oRawData.solution=xmlToJson.parse(l);else if(n.filename.toLowerCase().endsWith("customizations.xml"))oRawData.customization=xmlToJson.parse(l),t=!0;else if(n.filename.includes("environmentvariabledefinition.xml"))oRawData.environment.push(xmlToJson.parse(l));else if(n.filename.includes("bot.xml"))oRawData.agents.push(xmlToJson.parse(l));else if(n.filename.includes("Assets/"))oRawData.assets.push(xmlToJson.parse(l));else if(n.filename.toLowerCase().includes("iconblob.png"))try{let o=await blobToBase64(await n.getData(new zip.BlobWriter("image/png")));oRawData.icons.push({name:n.filename.split("/").pop(),mime:"image/png",base64:o})}catch(s){console.warn("Failed to extract icon blob as Base64",n.filename,s)}else if(n.filename.includes("WebResources/"));else if(n.filename.includes("definition.json")&&!n.filename.includes("Connector/")||n.filename.includes("Workflows/")&&!n.filename.includes("apisMap")&&!n.filename.includes("connectionsMap")){let r="";n.filename.match(regExpFileID)&&(r=n.filename.match(regExpFileID)[0]);let d=CreateReview(l,"unknown",r,aComplexityTemplate,oNamingTemplate,aConnectionTierBackup.value,"");d&&oRawData.flows.push(d)}}if(await a.close(),t)solutionDiagram();else{uploadArea.className="upload-area error";uploadArea.querySelector(".upload-content").innerHTML=`

Error Processing File

Not a valid solution

Click to try again `}}catch(c){console.error("Error processing zip file:",c),uploadArea.className="upload-area error";uploadArea.querySelector(".upload-content").innerHTML=`

Error Processing File

${c.message}

Click to try again `}}function downloadFile(e,t){let a=URL.createObjectURL(e),i=document.createElement("a");i.href=a,i.download=t,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(a)}document.getElementById("download-components-csv").addEventListener("click",()=>downloadComponentsCsv()),uploadArea.addEventListener("click",()=>{(uploadArea.classList.contains("success")||uploadArea.classList.contains("error"))&&resetUploadArea(),fileInput.click()}),fileInput.addEventListener("change",handleFiles),uploadArea.addEventListener("dragover",e=>{e.preventDefault(),uploadArea.classList.add("dragover")}),uploadArea.addEventListener("dragleave",e=>{e.preventDefault(),uploadArea.classList.remove("dragover")}),uploadArea.addEventListener("drop",e=>{e.preventDefault(),uploadArea.classList.remove("dragover");handleFiles({target:{files:e.dataTransfer.files}})}),"launchQueue"in window&&launchQueue.setConsumer(async e=>{for(let t of e.files)processZipFile(await t.getFile())});let gCategoryVisibility={flow:!0,agent:!0,environmentVar:!0,connectionRef:!0,table:!0,app:!0,roles:!0,functions:!0,model:!0,connector:!0,dataflow:!0,aibuilder:!0,webResource:!0,dependency:!1},gFlowFilter="",gZoom=1;const ZOOM_STEP=.1,ZOOM_MIN=.2,ZOOM_MAX=3;function setZoom(e){gZoom=Math.min(3,Math.max(.2,e)),applyZoom()}function applyZoom(){let e=eDiagram.querySelector("svg");if(!e)return;let t=eDiagram.querySelector(".diagram-zoom-wrapper");if(!t){for((t=document.createElement("div")).className="diagram-zoom-wrapper";eDiagram.firstChild;)t.appendChild(eDiagram.firstChild);eDiagram.appendChild(t)}t.style.transformOrigin="0 0",t.style.transform="scale("+gZoom+")";let a=parseFloat(e.getAttribute("width"))||e.viewBox.baseVal.width,i=parseFloat(e.getAttribute("height"))||e.viewBox.baseVal.height;t.style.width=a+"px",t.style.height=i+"px"}window.addEventListener("DOMContentLoaded",()=>{let e=document.getElementById("diagram-close"),t=document.getElementById("diagram-menu-btn"),a=document.getElementById("diagram-menu"),i=document.getElementById("diagram-overlay"),n=document.getElementById("flow-filter"),l=document.getElementById("diagram-zoom-in"),o=document.getElementById("diagram-zoom-out"),s=document.getElementById("diagram-download-btn"),r=document.getElementById("diagram-download-menu"),d=document.getElementById("diagram-mode-check");function c(){if(!s||!r)return;let e=s.getBoundingClientRect(),t=r.offsetWidth||226,a=Math.max(10,window.innerWidth-t-10),i=Math.min(e.left,a);r.style.left=i+"px",r.style.top=e.bottom+6+"px"}e&&e.addEventListener("click",()=>{resetUploadArea(),eDiagram.style.display="none",i.style.display="none",eUpload.style.display="flex"}),t&&a&&(t.addEventListener("click",e=>{e.stopPropagation();let i="block"===a.style.display;a.style.display=i?"none":"block",r.style.display="none",t.setAttribute("aria-expanded",(!i).toString())}),document.addEventListener("click",e=>{"block"!==a.style.display||a.contains(e.target)||e.target===t||(a.style.display="none",t.setAttribute("aria-expanded","false"))})),s&&r&&(s.addEventListener("click",e=>{e.stopPropagation();let t="block"===r.style.display;t||c(),r.style.display=t?"none":"block",a.style.display="none",s.setAttribute("aria-expanded",(!t).toString())}),document.addEventListener("click",e=>{"block"!==r.style.display||r.contains(e.target)||e.target===s||(r.style.display="none",s.setAttribute("aria-expanded","false"))}),window.addEventListener("resize",()=>{"block"===r.style.display&&c()}),window.addEventListener("scroll",()=>{"block"===r.style.display&&c()},!0),r.querySelectorAll(".download-option").forEach(e=>{"download-components-csv"!==e.id&&e.addEventListener("click",async t=>{t.stopPropagation();let a=e.getAttribute("data-type"),i=e.getAttribute("data-size"),n=i?parseInt(i,10):null;try{await downloadDiagram(a,n)}finally{r.style.display="none",s.setAttribute("aria-expanded","false")}})})),n&&n.addEventListener("input",e=>{gFlowFilter=e.target.value.trim().toUpperCase(),solutionDiagram()}),document.querySelectorAll(".diagram-toggle").forEach(e=>{e.addEventListener("change",()=>{gCategoryVisibility[e.dataset.type]=e.checked,solutionDiagram()})}),d&&(d.checked="diagram"===sMode,d.addEventListener("change",()=>{sMode=d.checked?"diagram":"list",solutionDiagram()})),l&&l.addEventListener("click",()=>{setZoom(gZoom+.1)}),o&&o.addEventListener("click",()=>{setZoom(gZoom-.1)})});let gPanInit=!1;function ensurePanHandlers(){if(gPanInit)return;gPanInit=!0;let e=!1,t=!1,a=0,i=0,n=0,l=0,o=0,s="diagram-pan-style";if(!document.getElementById(s)){let r=document.createElement("style");r.id=s,r.textContent="#diagram.pan-active { cursor: grabbing !important; } #diagram { cursor: grab; }",document.head.appendChild(r)}function d(){e&&(e=!1,eDiagram.classList.remove("pan-active"))}eDiagram.addEventListener("mousedown",function s(r){if(!(0!==r.button&&1!==r.button||0===r.button&&r.target.closest("g[data-connector]")))(r.target===eDiagram||null!==r.target.closest("#diagram"))&&(e=!0,t=!1,o=r.button,a=r.clientX,i=r.clientY,n=eDiagram.scrollLeft,l=eDiagram.scrollTop,eDiagram.classList.add("pan-active"),r.preventDefault())}),window.addEventListener("mousemove",function o(s){if(!e)return;let r=s.clientX-a,d=s.clientY-i;!t&&Math.abs(r)+Math.abs(d)>3&&(t=!0),t&&(eDiagram.scrollLeft=n-r,eDiagram.scrollTop=l-d,s.preventDefault())},{passive:!1}),window.addEventListener("mouseup",d),window.addEventListener("keydown",e=>{"Escape"===e.key&&d()}),eDiagram.addEventListener("touchstart",s=>{if(1!==s.touches.length)return;let r=s.touches[0];r.target.closest("g[data-connector]")||(e=!0,t=!1,o=-1,a=r.clientX,i=r.clientY,n=eDiagram.scrollLeft,l=eDiagram.scrollTop,eDiagram.classList.add("pan-active"))},{passive:!0}),eDiagram.addEventListener("touchmove",o=>{if(!e||1!==o.touches.length)return;let s=o.touches[0],r=s.clientX-a,d=s.clientY-i;!t&&Math.abs(r)+Math.abs(d)>3&&(t=!0),t&&(eDiagram.scrollLeft=n-r,eDiagram.scrollTop=l-d,o.preventDefault())},{passive:!1}),eDiagram.addEventListener("touchend",d,{passive:!0}),eDiagram.addEventListener("touchcancel",d,{passive:!0})}function getUniqueValues(e,t){return[...new Set(e.map(e=>e[t]))]}function getDiagramSvgElement(){return(eDiagram?eDiagram.querySelector("svg"):null)||null}async function downloadDiagram(e,t){let a=getDiagramSvgElement();if(!a){let i=eDiagram?eDiagram.querySelector("canvas"):null;i?i.toBlob(e=>{e&&downloadFile(e,sSolutionName+"-diagram.png")},"image/png"):console.warn("No SVG or Canvas diagram found to download");return}if("svg"===e){let n=await getSerializedSvg(a,null,null,!0);downloadFile(new Blob([n],{type:"image/svg+xml;charset=utf-8"}),sSolutionName+"-diagram.svg");return}let{width:l,height:o}=getSvgIntrinsicSize(a),s=t&&l?t/l:1,r=Math.round(l*s)||t||1024,d=Math.round(o*s)||Math.round(.6*r),c=document.createElement("canvas");c.width=r,c.height=d;let g=c.getContext("2d"),m=new Image;m.crossOrigin="anonymous",m.onload=()=>{g.clearRect(0,0,r,d),g.drawImage(m,0,0,r,d),c.toBlob(e=>{e&&downloadFile(e,sSolutionName+`-diagram-${r}.png`)},"image/png")},m.onerror=e=>{console.error("Failed to load SVG data for rasterization",e)};let u=await getSerializedSvg(a,r,d,!0),p="data:image/svg+xml;charset=utf-8,"+encodeURIComponent(u);m.src=p}async function getSerializedSvg(e,t,a,i){let n=e.cloneNode(!0);return n.getAttribute("xmlns")||n.setAttribute("xmlns","http://www.w3.org/2000/svg"),n.getAttribute("xmlns:xlink")||n.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink"),t&&a&&(n.setAttribute("width",String(t)),n.setAttribute("height",String(a))),i&&await inlineImagesOnSvg(n),new XMLSerializer().serializeToString(n)}async function inlineImagesOnSvg(e){let t=e.querySelectorAll("image"),a=[];t.forEach(e=>{let t=e.getAttribute("href")||e.getAttributeNS("http://www.w3.org/1999/xlink","href");if(!t||t.startsWith("data:"))return;let i=new URL(t,document.baseURI).href,n=fetch(i).then(e=>e.ok?e.blob():Promise.reject(Error("Failed to fetch "+i))).then(e=>new Promise(t=>{let a=new FileReader;a.onload=()=>t(a.result),a.readAsDataURL(e)})).then(t=>{e.setAttribute("href",t),e.setAttributeNS("http://www.w3.org/1999/xlink","href",t)}).catch(e=>console.warn("Inline image failed:",e));a.push(n)}),await Promise.all(a)}function getSvgIntrinsicSize(e){let t=parseFloat(e.getAttribute("width")),a=parseFloat(e.getAttribute("height"));if(!(t&&a)&&e.viewBox&&e.viewBox.baseVal&&(t=e.viewBox.baseVal.width,a=e.viewBox.baseVal.height),!(t&&a)){let i=e.getBBox?e.getBBox():{width:1e3,height:600};t=i.width||1e3,a=i.height||600}return{width:t,height:a}}async function blobToBase64(e){return new Promise((t,a)=>{try{let i=new FileReader;i.onload=()=>{let e=i.result,a=e.indexOf(",");t(a>=0?e.substring(a+1):e)},i.onerror=e=>a(e),i.readAsDataURL(e)}catch(n){a(n)}})}