CVE-2023-3975: Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection') (CWE-78)
value: OS Command Injection in GitHub repository jgraph/drawio prior to 21.5.0.
CWE description: The product constructs all or part of an OS command using externally-influenced input from an upstream component, but it does not neutralize or incorrectly neutralizes special elements that could modify the intended OS command when it is sent to a downstream component.
CVSS v3 base score: 9.8
Published: 2023-07-27T15:15Z
Repository: https://github.com/jgraph/drawio
Language: JavaScript
Files changed: ChangeLog, VERSION, src/main/webapp/index.html, src/main/webapp/js/app.min.js, src/main/webapp/js/diagramly/App.js, src/main/webapp/js/diagramly/Devel.js, src/main/webapp/js/export.js, src/main/webapp/js/integrate.min.js, src/main/webapp/js/viewer-static.min.js, src/main/webapp/js/viewer.min.js, src/main/webapp/js/vsdxImporter.js, src/main/webapp/mxgraph/mxClient.js, src/main/webapp/resources/dia_ca.txt, src/main/webapp/resources/dia_id.txt, src/main/webapp/service-worker.js, src/main/webapp/service-worker.js.map, src/main/webapp/teams.html, src/main/webapp/vsdxImporter.html
Commit date: 2023-06-18 15:05:59 +0100
Commit message: 21.5.0 release

Diff: diff --git a/ChangeLog b/ChangeLog
index aea9a22b8a..85f30379d2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
+17-JUN-2023: 21.5.0
+
+- Moves electron.js out of drawio project into desktop
+
 16-JUN-2023: 21.4.1
 
 - Fixes misalignment of arrow labels [drawio-3668]
 - [conf cloud] Fixes NPE in theming code 
 - Updates stage sub domain to preprod
diff --git a/VERSION b/VERSION
index a47122b928..8ab91f750e 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-21.4.1
\ No newline at end of file
+21.5.0
\ No newline at end of file
diff --git a/src/main/webapp/disableUpdate.js b/src/main/webapp/disableUpdate.js
deleted file mode 100644
index 98989918bf..0000000000
--- a/src/main/webapp/disableUpdate.js
+++ /dev/null
@@ -1,6 +0,0 @@
-module.exports = {
-	disableUpdate: function() 
-	{
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/src/main/webapp/electron-preload.js b/src/main/webapp/electron-preload.js
deleted file mode 100644
index 59deaac0f1..0000000000
--- a/src/main/webapp/electron-preload.js
+++ /dev/null
@@ -1,79 +0,0 @@
-const {
-    contextBridge,
-    ipcRenderer
-} = require("electron");
-
-let reqId = 1;
-let reqInfo = {};
-let fileChangedListeners = {};
-
-ipcRenderer.on('mainResp', (event, resp) => 
-{
-	var callbacks = reqInfo[resp.reqId];
-	
-	if (resp.error)
-	{
-		callbacks.error(resp.msg, resp.e);
-	}
-	else
-	{
-		callbacks.callback(resp.data);
-	}
-	
-	delete reqInfo[resp.reqId];
-});
-
-ipcRenderer.on('fileChanged', (event, resp) => 
-{
-	var listener = fileChangedListeners[resp.path];
-	
-	if (listener)
-	{
-		listener(resp.curr, resp.prev);
-	}
-});
-
-contextBridge.exposeInMainWorld(
-    'electron', {
-        request: (msg, callback, error) => 
-		{
-			msg.reqId = reqId++;
-			reqInfo[msg.reqId] = {callback: callback, error: error};
-
-			//TODO Maybe a special function for this better than this hack?
-			//File watch special case where the callback is called multiple times
-			if (msg.action == 'watchFile')
-			{
-				fileChangedListeners[msg.path] = msg.listener;
-				delete msg.listener;
-			}
-
-			ipcRenderer.send('rendererReq', msg);
-        },
-		registerMsgListener: function(action, callback)
-		{
-			ipcRenderer.on(action, function(event, args)
-			{
-				callback(args);
-			});
-		},
-		sendMessage: function(action, args)
-		{
-			ipcRenderer.send(action, args);
-		},
-		listenOnce: function(action, callback)
-		{
-			ipcRenderer.once(action, function(event, args)
-			{
-				callback(args);
-			});
-		}
-    }
-);
-
-contextBridge.exposeInMainWorld(
-    'process', {
-		type: process.type,
-		versions: process.versions
-	}
-);
diff --git a/src/main/webapp/electron.js b/src/main/webapp/electron.js
deleted file mode 100644
index e2a2c29441..0000000000
--- a/src/main/webapp/electron.js
+++ /dev/null
@@ -1,2454 +0,0 @@
-const fs = require('fs')
-const fsProm = require('fs/promises');
-const os = require('os');
-const path = require('path')
-const url = require('url')
-const {Menu: menu, shell, dialog, session,
-		clipboard, nativeImage, ipcMain, app, BrowserWindow} = require('electron')
-const crc = require('crc');
-const zlib = require('zlib');
-const log = require('electron-log')
-const program = require('commander')
-const {autoUpdater} = require("electron-updater")
-const PDFDocument = require('pdf-lib').PDFDocument;
-const Store = require('electron-store');
-const store = new Store();
-const ProgressBar = require('electron-progressbar');
-const spawn = require('child_process').spawn;
-const disableUpdate = require('./disableUpdate').disableUpdate() || 
-						process.env.DRAWIO_DISABLE_UPDATE === 'true' || 
-						fs.existsSync('/.flatpak-info'); //This file indicates running in flatpak sandbox
-autoUpdater.logger = log
-autoUpdater.logger.transports.file.level = 'info'
-autoUpdater.autoDownload = false
-
-//Command option to disable hardware acceleration
-if (process.argv.indexOf('--disable-acceleration') !== -1)
-{
-	app.disableHardwareAcceleration();
-}
-
-const __DEV__ = process.env.DRAWIO_ENV === 'dev'
-		
-let windowsRegistry = []
-let cmdQPressed = false
-let firstWinLoaded = false
-let firstWinFilePath = null
-const isMac = process.platform === 'darwin'
-const isWin = process.platform === 'win32'
-let enableSpellCheck = store.get('enableSpellCheck');
-enableSpellCheck = enableSpellCheck != null? enableSpellCheck : isMac;
-let enableStoreBkp = store.get('enableStoreBkp') != null? store.get('enableStoreBkp') : true;
-let dialogOpen = false;
-let enablePlugins = false;
-
-//Read config file
-var queryObj = {
-	'dev': __DEV__ ? 1 : 0,
-	'test': __DEV__ ? 1 : 0,
-	'gapi': 0,
-	'db': 0,
-	'od': 0,
-	'gh': 0,
-	'gl': 0,
-	'tr': 0,
-	'browser': 0,
-	'picker': 0,
-	'mode': 'device',
-	'export': 'https://convert.diagrams.net/node/export',
-	'disableUpdate': disableUpdate? 1 : 0,
-	'enableSpellCheck': enableSpellCheck? 1 : 0,
-	'enableStoreBkp': enableStoreBkp? 1 : 0
-};
-
-try
-{
-	if (fs.existsSync(process.cwd() + '/urlParams.json'))
-	{
-		let urlParams = JSON.parse(fs.readFileSync(process.cwd() + '/urlParams.json'));
-		
-		for (var param in urlParams)
-		{
-			queryObj[param] = urlParams[param];
-		}
-	}
-}
-catch(e)
-{
-	console.log('Error in urlParams.json file: ' + e.message);
-}
-
-// Trying sandboxing the renderer for more protection
-//app.enableSandbox(); // This maybe the reason snap stopped working
-
-// Only allow request from the app code itself
-function validateSender (frame) 
-{
-	return frame.url.startsWith(url.pathToFileURL(__dirname).href);
-}
-
-function createWindow (opt = {})
-{
-	let lastWinSizeStr = store.get('lastWinSize');
-	let lastWinSize = lastWinSizeStr ? lastWinSizeStr.split(',') : [1600, 1200];
-
-	// TODO On some Mac OS, double click the titlebar set incorrect window size
-	if (lastWinSize[0] < 500)
-	{
-		lastWinSize[0] = 500;
-	}
-
-	if (lastWinSize[1] < 500)
-	{
-		lastWinSize[1] = 500;
-	}
-
-	let options = Object.assign(
-	{
-		backgroundColor: '#FFF',
-		width: parseInt(lastWinSize[0]),
-		height: parseInt(lastWinSize[1]),
-		icon: `${__dirname}/images/drawlogo256.png`,
-		webviewTag: false,
-		webSecurity: true,
-		webPreferences: {
-			preload: `${__dirname}/electron-preload.js`,
-			spellcheck: enableSpellCheck,
-			contextIsolation: true,
-			disableBlinkFeatures: 'Auxclick' // Is this needed?
-		}
-	}, opt)
-
-	let mainWindow = new BrowserWindow(options)
-	windowsRegistry.push(mainWindow)
-
-	if (__DEV__) 
-	{
-		console.log('createWindow', opt)
-	}
-
-	//Cannot be read before app is ready
-	queryObj['appLang'] = app.getLocale();
-
-	let ourl = url.format(
-	{
-		pathname: `${__dirname}/index.html`,
-		protocol: 'file:',
-		query: queryObj,
-		slashes: true
-	})
-	
-	mainWindow.loadURL(ourl)
-
-	// Open the DevTools.
-	if (__DEV__)
-	{
-		mainWindow.webContents.openDevTools()
-	}
-
-	ipcMain.on('openDevTools', function(e)
-	{
-		if (!validateSender(e.senderFrame)) return null;
-
-		mainWindow.webContents.openDevTools();
-	});
-
-	mainWindow.on('maximize', function()
-	{
-		mainWindow.webContents.send('maximize')
-	});
-
-	mainWindow.on('unmaximize', function()
-	{
-		mainWindow.webContents.send('unmaximize')
-	});
-
-	mainWindow.on('resize', function()
-	{
-		const size = mainWindow.getSize();
-		store.set('lastWinSize', size[0] + ',' + size[1]);
-
-		mainWindow.webContents.send('resize')
-	});
-
-	mainWindow.on('close', (event) =>
-	{
-		const win = event.sender
-		const index = windowsRegistry.indexOf(win)
-		
-		if (__DEV__) 
-		{
-			console.log('Window on close', index)
-		}
-		
-		const contents = win.webContents
-
-		if (contents != null)
-		{
-	        ipcMain.once('isModified-result', async (e, data) =>
-			{
-				if (!validateSender(e.senderFrame)) return null;
-
-				if (data.isModified)
-				{
-					// Can't use async function here because it crashes on Linux when win.destroy is called
-					let response = dialog.showMessageBoxSync(
-						win,
-						{
-							type: 'question',
-							buttons: ['Cancel', 'Discard Changes'],
-							title: 'Confirm',
-							message: 'The document has unsaved changes. Do you really want to quit without saving?' //mxResources.get('allChangesLost')
-						});
-
-					if (response === 1)
-					{
-						//If user chose not to save, remove the draft
-						if (data.draftPath != null)
-						{
-							await deleteFile(data.draftPath);
-							win.destroy();
-						}
-						else
-						{
-							contents.send('removeDraft');
-
-							ipcMain.once('draftRemoved', (e) =>
-							{
-								if (!validateSender(e.senderFrame)) return null;
-
-								win.destroy();
-							});
-						}
-					}
-					else
-					{
-						cmdQPressed = false;
-					}
-				}
-				else
-				{
-					win.destroy();
-				}
-			});
-
-			contents.send('isModified');
-			event.preventDefault();
-		}
-	})
-
-	// Emitted when the window is closed.
-	mainWindow.on('closed', (event/*:WindowEvent*/) =>
-	{
-		const index = windowsRegistry.indexOf(event.sender)
-		
-		if (__DEV__) 
-		{
-			console.log('Window closed idx:%d', index)
-		}
-		
-		windowsRegistry.splice(index, 1)
-	})
-	
-	return mainWindow
-}
-
-// This method will be called when Electron has finished
-// initialization and is ready to create browser windows.
-// Some APIs can only be used after this event occurs.
-app.on('ready', e =>
-{
-	// Enforce our CSP on all contents
-	session.defaultSession.webRequest.onHeadersReceived((details, callback) => 
-	{
-		callback({
-			responseHeaders: {
-				...details.responseHeaders,
-				'Content-Security-Policy': ['default-src \'self\'; script-src \'self\' \'sha256-6g514VrT/cZFZltSaKxIVNFF46+MFaTSDTPB8WfYK+c=\' \'sha256-3SkDBaLE+ouvAOfTmG2TGwmQ2EE9AT0F2YcHvZmEMeo=\'; connect-src \'self\' https://*.draw.io https://*.diagrams.net https://fonts.googleapis.com https://fonts.gstatic.com; img-src * data:; media-src *; font-src *; frame-src \'none\'; style-src \'self\' \'unsafe-inline\' https://fonts.googleapis.com; base-uri \'none\';child-src \'self\';object-src \'none\';']
-			}
-		})
-	});
-
-	// Enforce loading file only from our app directory
-	session.defaultSession.webRequest.onBeforeRequest({urls: ['file://*']}, (details, callback) =>
-	{
-		if (!details.url.startsWith(url.pathToFileURL(__dirname).href))
-		{
-			callback({cancel: true});
-		}
-		else
-		{
-			callback({});
-		}
-	});
-
-	ipcMain.on('newfile', (e, arg) =>
-	{
-		if (!validateSender(e.senderFrame)) return null;
-
-		let opts = {};
-
-		if (arg)
-		{
-			if (arg.width)
-			{
-				opts.width = arg.width;
-			}
-
-			if (arg.height)
-			{
-				opts.height = arg.height;
-			}
-		}
-
-		createWindow(opts);
-	})
-	
-    let argv = process.argv
-    
-    // https://github.com/electron/electron/issues/4690#issuecomment-217435222
-    if (process.defaultApp != true)
-    {
-        argv.unshift(null)
-    }
-
-	var validFormatRegExp = /^(pdf|svg|png|jpeg|jpg|vsdx|xml)$/;
-	
-	function argsRange(val) 
-	{
-	  return val.split('..').map(Number);
-	}
-	
-	try
-	{
-		program
-	        .version(app.getVersion())
-	        .usage('[options] [input file/folder]')
-	        .allowUnknownOption() //-h and --help are considered unknown!!
-	        .option('-c, --create', 'creates a new empty file if no file is passed')
-	        .option('-k, --check', 'does not overwrite existing files')
-	        .option('-x, --export', 'export the input file/folder based on the given options')
-	        .option('-r, --recursive', 'for a folder input, recursively convert all files in sub-folders also')
-	        .option('-o, --output <output file/folder>', 'specify the output file/folder. If omitted, the input file name is used for output with the specified format as extension')
-	        .option('-f, --format <format>',
-			    'if output file name extension is specified, this option is ignored (file type is determined from output extension, possible export formats are pdf, png, jpg, svg, vsdx, and xml)',
-			    validFormatRegExp, 'pdf')
-			.option('-q, --quality <quality>',
-				'output image quality for JPEG (default: 90)', parseInt)
-			.option('-t, --transparent',
-				'set transparent background for PNG')
-			.option('-e, --embed-diagram',
-				'includes a copy of the diagram (for PNG, SVG and PDF formats only)')
-			.option('--embed-svg-images',
-				'Embed Images in SVG file (for SVG format only)')
-			.option('-b, --border <border>',
-				'sets the border width around the diagram (default: 0)', parseInt)
-			.option('-s, --scale <scale>',
-				'scales the diagram size', parseFloat)
-			.option('--width <width>',
-				'fits the generated image/pdf into the specified width, preserves aspect ratio.', parseInt)
-			.option('--height <height>',
-				'fits the generated image/pdf into the specified height, preserves aspect ratio.', parseInt)
-			.option('--crop',
-				'crops PDF to diagram size')
-			.option('-a, --all-pages',
-				'export all pages (for PDF format only)')
-			.option('-p, --page-index <pageIndex>',
-				'selects a specific page, if not specified and the format is an image, the first page is selected', parseInt)
-			.option('-l, --layers <comma separated layer indexes>',
-				'selects which layers to export (applies to all pages), if not specified, all layers are selected')
-			.option('-g, --page-range <from>..<to>',
-				'selects a page range (for PDF format only)', argsRange)
-			.option('-u, --uncompressed',
-				'Uncompressed XML output (for XML format only)')
-			.option('--enable-plugins',
-				'Enable Plugins')
-	        .parse(argv)
-	}
-	catch(e)
-	{
-		//On parse error, return [exit and commander will show the error message]
-		return;
-	}
-	
-	var options = program.opts();
-	enablePlugins = options.enablePlugins;
-
-    //Start export mode?
-    if (options.export)
-	{
-    	var dummyWin = new BrowserWindow({
-			show : false,
-			webPreferences: {
-				preload: `${__dirname}/electron-preload.js`,
-				contextIsolation: true,
-				disableBlinkFeatures: 'Auxclick' // Is this needed?
-			}
-		});
-    	
-    	windowsRegistry.push(dummyWin);
-    	
-		/*ipcMain.on('log', function(event, msg)
-		{
-			console.log(msg);
-		});*/
-	
-    	try
-    	{
-	    	//Prepare arguments and confirm it's valid
-	    	var format = null;
-	    	var outType = null;
-	    	
-	    	//Format & Output
-	    	if (options.output)
-			{
-	    		try
-	    		{
-	    			var outStat = fs.statSync(options.output);
-	    			
-	    			if (outStat.isDirectory())
-					{
-	    				outType = {isDir: true};
-					}
-	    			else //If we can get file stat, then it exists
-					{
-	    				throw 'Error: Output file already exists';
-					}
-	    		}
-	    		catch(e) //on error, file doesn't exist and it is not a dir
-	    		{
-	    			outType = {isFile: true};
-	    			
-	    			format = path.extname(options.output).substr(1);
-					
-					if (!validFormatRegExp.test(format))
-					{
-						format = null;
-					}
-	    		}
-			}
-	    	
-	    	if (format == null)
-			{
-	    		format = options.format;
-			}
-	    	
-	    	var from = null, to = null;
-	    	
-	    	if (options.pageIndex != null && options.pageIndex >= 0)
-			{
-	    		from = options.pageIndex;
-				to = options.pageIndex;
-				options.allPages = false;
-			}
-	    	else if (options.pageRange && options.pageRange.length == 2)
-			{
-	    		from = options.pageRange[0] >= 0 ? options.pageRange[0] : null;
-	    		to = options.pageRange[1] >= 0 ? options.pageRange[1] : null;
-				options.allPages = false;
-			}
-
-			var expArgs = {
-				format: format,
-				w: options.width > 0 ? options.width : null,
-				h: options.height > 0 ? options.height : null,
-				border: options.border > 0 ? options.border : 0,
-				bg: options.transparent ? 'none' : '#ffffff',
-				from: from,
-				to: to,
-				allPages: format == 'pdf' && options.allPages,
-				scale: (options.crop && (options.scale == null || options.scale == 1)) ? 1.00001: (options.scale || 1), //any value other than 1 crops the pdf
-				embedXml: options.embedDiagram? '1' : '0',
-				embedImages: options.embedSvgImages? '1' : '0',
-				jpegQuality: options.quality,
-				uncompressed: options.uncompressed
-			};
-
-			if (options.layers)
-			{
-				expArgs.extras = JSON.stringify({layers: options.layers.split(',')});
-			}
-
-			var paths = program.args;
-			
-			// If a file is passed 
-			if (paths !== undefined && paths[0] != null)
-			{
-				var inStat = null;
-				
-				try
-				{
-					inStat = fs.statSync(paths[0]);
-				}
-				catch(e)
-				{
-					throw 'Error: input file/directory not found';	
-				}
-				
-				var files = [];
-				
-				function addDirectoryFiles(dir, isRecursive)
-				{
-					fs.readdirSync(dir).forEach(function(file) 
-					{
-						var filePath = path.join(dir, file);
-						stat = fs.statSync(filePath);
-						
-						if (stat.isFile() && path.basename(filePath).charAt(0) != '.')
-						{
-							files.push(filePath);
-						}
-						if (stat.isDirectory() && isRecursive)
-					    {
-							addDirectoryFiles(filePath, isRecursive)
-					    }
-					});
-				}
-				
-				if (inStat.isFile())
-				{
-					files.push(paths[0]);
-				}
-				else if (inStat.isDirectory())
-				{
-					addDirectoryFiles(paths[0], options.recursive);
-				}
-
-				if (files.length > 0)
-				{
-					var fileIndex = 0;
-					
-					function processOneFile()
-					{
-						var curFile = files[fileIndex];
-						
-						try
-						{
-							var ext = path.extname(curFile);
-							
-							let fileContent = fs.readFileSync(curFile, ext === '.png' || ext === '.vsdx' ? null : 'utf-8');
-							
-							if (ext === '.vsdx')
-							{
-								dummyWin.loadURL(`file://${__dirname}/vsdxImporter.html`);
-								
-								const contents = dummyWin.webContents;
-
-								contents.on('did-finish-load', function()
-							    {
-									contents.send('import', fileContent);
-
-									ipcMain.once('import-success', function(e, xml)
-						    	    {
-										if (!validateSender(e.senderFrame)) return null;
-
-										expArgs.xml = xml;
-										startExport();
-						    	    });
-						    	    
-						    	    ipcMain.once('import-error', function(e)
-						    	    {
-										if (!validateSender(e.senderFrame)) return null;
-
-						    	    	console.error('Error: cannot import VSDX file: ' + curFile);
-						    	    	next();
-						    	    });
-							    });
-							}
-							else
-							{
-								if (ext === '.csv')
-								{
-									expArgs.csv = fileContent;
-								}
-								else if (ext === '.png')
-								{
-									expArgs.xml = Buffer.from(fileContent).toString('base64');
-								}
-								else
-								{
-									expArgs.xml = fileContent;
-								}
-
-								startExport();
-							}
-							
-							function next()
-							{
-								fileIndex++;
-								
-								if (fileIndex < files.length)
-								{
-									processOneFile();
-								}
-								else
-								{
-									cmdQPressed = true;
-									dummyWin.destroy();
-								}
-							};
-							
-							function startExport()
-							{
-								var mockEvent = {
-									reply: function(msg, data)
-									{
-										try
-										{
-											if (data == null || data.length == 0)
-											{
-												console.error('Error: Export failed: ' + curFile);
-											}
-											else if (msg == 'export-success')
-											{
-												var outFileName = null;
-												
-												if (outType != null)
-												{
-													if (outType.isDir)
-													{
-														outFileName = path.join(options.output, path.basename(curFile,
-															path.extname(curFile))) + '.' + format;
-													}
-													else
-													{
-														outFileName = options.output;
-													}
-												}
-												else if (inStat.isFile())
-												{
-													outFileName = path.join(path.dirname(paths[0]), path.basename(paths[0],
-														path.extname(paths[0]))) + '.' + format;
-													
-												}
-												else //dir
-												{
-													outFileName = path.join(path.dirname(curFile), path.basename(curFile,
-														path.extname(curFile))) + '.' + format;
-												}
-												
-												try
-												{
-													var counter = 0;
-													var realFileName = outFileName;
-													
-													if (program.rawArgs.indexOf('-k') > -1 || program.rawArgs.indexOf('--check') > -1)
-													{
-														while (fs.existsSync(realFileName))
-														{
-															counter++;
-															realFileName = path.join(path.dirname(outFileName), path.basename(outFileName,
-																path.extname(outFileName))) + '-' + counter + path.extname(outFileName);
-														}
-													}
-													
-													fs.writeFileSync(realFileName, data, format == 'vsdx'? 'base64' : null, { flag: 'wx' });
-													console.log(curFile + ' -> ' + realFileName);
-												}
-												catch(e)
-												{
-													console.error('Error writing to file: ' + outFileName);
-												}
-											}
-											else
-											{
-												console.error('Error: ' + data + ': ' + curFile);
-											}
-											
-											next();
-										}
-										finally
-										{
-											mockEvent.finalize();
-										}
-							    	}
-								};
-
-								exportDiagram(mockEvent, expArgs, true);
-							};
-						}
-						catch(e)
-						{
-							console.error('Error reading file: ' + curFile);
-							next();
-						}
-					}
-					
-					processOneFile();
-				}
-				else
-				{
-					throw 'Error: input file/directory not found or directory is empty';
-				}
-			}
-			else
-			{
-				throw 'Error: An input file must be specified';
-			}
-    	}
-    	catch(e)
-    	{
-    		console.error(e);
-    		
-    		cmdQPressed = true;
-			dummyWin.destroy();
-    	}
-    	
-    	return;
-	}
-    else if (program.rawArgs.indexOf('-h') > -1 || program.rawArgs.indexOf('--help') > -1 || program.rawArgs.indexOf('-V') > -1 || program.rawArgs.indexOf('--version') > -1) //To prevent execution when help/version arg is used
-	{
-		app.quit();
-    	return;
-	}
-    
-    //Prevent multiple instances of the application (casuses issues with configuration)
-    const gotTheLock = app.requestSingleInstanceLock()
-
-    if (!gotTheLock) 
-    {
-    	app.quit()
-    } 
-    else 
-    {
-    	app.on('second-instance', (event, commandLine, workingDirectory) => {
-			// Creating a new window while a save/open dialog is open crashes the app
-			if (dialogOpen) return;
-
-    		//Create another window
-    		let win = createWindow()
-
-			let loadEvtCount = 0;
-			
-			function loadFinished(e)
-			{
-				if (e != null && !validateSender(e.senderFrame)) return null;
-
-				loadEvtCount++;
-				
-				if (loadEvtCount == 2)
-				{
-	    	    	//Open the file if new app request is from opening a file
-	    	    	var potFile = commandLine.pop();
-	    	    	
-	    	    	if (fs.existsSync(potFile))
-	    	    	{
-	    	    		win.webContents.send('args-obj', {args: [potFile]});
-	    	    	}
-				}
-			}
-			
-			//Order of these two events is not guaranteed, so wait for them async.
-			//TOOD There is still a chance we catch another window 'app-load-finished' if user created multiple windows quickly 
-	    	ipcMain.once('app-load-finished', loadFinished);
-    	    
-    	    win.webContents.on('did-finish-load', function()
-    	    {    			
-    	        win.webContents.zoomFactor = 1;
-    	        win.webContents.setVisualZoomLevelLimits(1, 1);
-				loadFinished();
-    	    });
-    	})
-    }
-
-    let win = createWindow()
-    
-	let loadEvtCount = 0;
-			
-	function loadFinished(e)
-	{
-		if (e != null && !validateSender(e.senderFrame)) return null;
-
-		loadEvtCount++;
-		
-		if (loadEvtCount == 2)
-		{
-			//Sending entire program is not allowed in Electron 9 as it is not native JS object
-			win.webContents.send('args-obj', {args: program.args, create: options.create});
-		}
-	}
-	
-	//Order of these two events is not guaranteed, so wait for them async.
-	//TOOD There is still a chance we catch another window 'app-load-finished' if user created multiple windows quickly 
-	ipcMain.once('app-load-finished', loadFinished);
-
-    win.webContents.on('did-finish-load', function()
-    {
-    	if (firstWinFilePath != null)
-		{
-    		if (program.args != null)
-    		{
-    			program.args.push(firstWinFilePath);
-    		}
-    		else
-			{
-    			program.args = [firstWinFilePath];
-			}
-		}
-    	
-    	firstWinLoaded = true;
-    	
-        win.webContents.zoomFactor = 1;
-        win.webContents.setVisualZoomLevelLimits(1, 1);
-		loadFinished();
-    });
-	
-	function toggleSpellCheck(e)
-	{
-		if (e != null && !validateSender(e.senderFrame)) return null;
-
-		enableSpellCheck = !enableSpellCheck;
-		store.set('enableSpellCheck', enableSpellCheck);
-	};
-
-	ipcMain.on('toggleSpellCheck', toggleSpellCheck);
-
-	function toggleStoreBkp(e)
-	{
-		if (e != null && !validateSender(e.senderFrame)) return null;
-
-		enableStoreBkp = !enableStoreBkp;
-		store.set('enableStoreBkp', enableStoreBkp);
-	};
-
-	ipcMain.on('toggleStoreBkp', toggleStoreBkp);
-
-    let updateNoAvailAdded = false;
-    
-	function checkForUpdatesFn(e) 
-	{ 
-		if (e != null && e.senderFrame != null && 
-			!validateSender(e.senderFrame)) return null;
-
-		autoUpdater.checkForUpdates();
-		store.set('dontCheckUpdates', false);
-		
-		if (!updateNoAvailAdded) 
-		{
-			updateNoAvailAdded = true;
-			autoUpdater.on('update-not-available', (info) => {
-				dialog.showMessageBox(
-					{
-						type: 'info',
-						title: 'No updates found',
-						message: 'Your application is up-to-date',
-					})
-			})
-		}
-	};
-	
-	let checkForUpdates = {
-		label: 'Check for updates',
-		click: checkForUpdatesFn
-	}
-
-	ipcMain.on('checkForUpdates', checkForUpdatesFn);
-
-	if (isMac)
-	{
-	    let template = [{
-	      label: app.name,
-	      submenu: [
-	        {
-	          label: 'About ' + app.name,
-	          click() { shell.openExternal('https://www.drawio.com'); }
-	        },
-	        {
-	          label: 'Support',
-	          click() { shell.openExternal('https://github.com/jgraph/drawio-desktop/issues'); }
-			},
-			checkForUpdates,
-			{ type: 'separator' },
-	        { role: 'hide' },
-	        { role: 'hideothers' },
-	        { role: 'unhide' },
-	        { type: 'separator' },
-	        { role: 'quit' }
-	      ]
-	    }, {
-	      label: 'Edit',
-	      submenu: [
-			{ role: 'undo' },
-			{ role: 'redo' },
-			{ type: 'separator' },
-			{ role: 'cut' },
-			{ role: 'copy' },
-			{ role: 'paste' },
-			{ role: 'pasteAndMatchStyle' },
-			{ role: 'selectAll' }
-	      ]
-	    }]
-	    
-	    if (disableUpdate)
-		{
-			template[0].submenu.splice(2, 1);
-		}
-		
-		const menuBar = menu.buildFromTemplate(template)
-		menu.setApplicationMenu(menuBar)
-	}
-	else //hide  menubar in win/linux
-	{
-		menu.setApplicationMenu(null)
-	}
-	
-	autoUpdater.setFeedURL({
-		provider: 'github',
-		repo: 'drawio-desktop',
-		owner: 'jgraph'
-	})
-	
-	if (!disableUpdate && !store.get('dontCheckUpdates'))
-	{
-		autoUpdater.checkForUpdates()
-	}
-})
-
-//Quit from the dock context menu should quit the application directly
-if (isMac) 
-{
-	app.on('before-quit', function() {
-		cmdQPressed = true;
-	});	
-}
-
-// Quit when all windows are closed.
-app.on('window-all-closed', function ()
-{
-	if (__DEV__) 
-	{
-		console.log('window-all-closed', windowsRegistry.length)
-	}
-	
-	// On OS X it is common for applications and their menu bar
-	// to stay active until the user quits explicitly with Cmd + Q
-	if (cmdQPressed || !isMac)
-	{
-		app.quit()
-	}
-})
-
-app.on('activate', function ()
-{
-	if (__DEV__) 
-	{
-		console.log('app on activate', windowsRegistry.length)
-	}
-	
-	// On OS X it's common to re-create a window in the app when the
-	// dock icon is clicked and there are no other windows open.
-	if (windowsRegistry.length === 0)
-	{
-		createWindow()
-	}
-})
-
-app.on('will-finish-launching', function()
-{
-	app.on("open-file", function(event, filePath) 
-	{
-	    event.preventDefault();
-		// Creating a new window while a save/open dialog is open crashes the app
-		if (dialogOpen) return;
-
-	    if (firstWinLoaded)
-	    {
-		    let win = createWindow();
-		    
-			let loadEvtCount = 0;
-			
-			function loadFinished(e)
-			{
-				if (e != null && !validateSender(e.senderFrame)) return null;
-
-				loadEvtCount++;
-				
-				if (loadEvtCount == 2)
-				{
-	    	    	win.webContents.send('args-obj', {args: [filePath]});
-				}
-			}
-			
-			//Order of these two events is not guaranteed, so wait for them async.
-			//TOOD There is still a chance we catch another window 'app-load-finished' if user created multiple windows quickly 
-	    	ipcMain.once('app-load-finished', loadFinished);
-    	    
-		    win.webContents.on('did-finish-load', function()
-		    {
-		        win.webContents.zoomFactor = 1;
-		        win.webContents.setVisualZoomLevelLimits(1, 1);
-				loadFinished();
-		    });
-	    }
-	    else
-		{
-	    	firstWinFilePath = filePath
-		}
-	});
-});
- 
-app.on('web-contents-created', (event, contents) => {
-	// Disable navigation
-	contents.on('will-navigate', (event, navigationUrl) => {
-		event.preventDefault()
-	})
-
-	// Limit creation of new windows (we also override window.open)
-	contents.setWindowOpenHandler(({ url }) => {
-		// We allow external absolute URLs to be open externally (check openExternal for details) and also empty windows (url -> about:blank)
-		if (url.startsWith('about:blank'))
-		{
-			return {
-				action: 'allow',
-				overrideBrowserWindowOptions: {
-					fullscreenable: false,
-					webPreferences: {
-						contextIsolation: true
-					}
-				}
-			}
-		} 
-		else if (!openExternal(url))
-		{
-			return {action: 'deny'}
-		}
-	})
-
-	// Disable all webviews
-	contents.on('will-attach-webview', (event, webPreferences, params) => {
-		event.preventDefault()
-	})
-})
-
-autoUpdater.on('error', e => log.error('@error@\n', e))
-
-autoUpdater.on('update-available', (a, b) =>
-{
-	log.info('@update-available@\n', a, b)
-	
-	dialog.showMessageBox(
-	{
-		type: 'question',
-		buttons: ['Ok', 'Cancel', 'Don\'t Ask Again'],
-		title: 'Confirm Update',
-		message: 'Update available.\n\nWould you like to download and install new version?',
-		detail: 'Application will automatically restart to apply update after download',
-	}).then( result =>
-	{
-		if (result.response === 0)
-		{
-			autoUpdater.downloadUpdate()
-			
-			var progressBar = new ProgressBar({
-				title: 'draw.io Update',
-			    text: 'Downloading draw.io update...'
-			});
-			
-			function reportUpdateError(e)
-			{
-				progressBar.detail = 'Error occurred while fetching updates. ' + (e && e.message? e.message : e)
-				progressBar._window.setClosable(true);
-			}
-
-			autoUpdater.on('error', e => {
-				if (progressBar._window != null)
-				{
-					reportUpdateError(e);
-				}
-				else
-				{
-					progressBar.on('ready', function() {
-						reportUpdateError(e);
-					});
-				}
-			})
-
-			var firstTimeProg = true;
-			
-			autoUpdater.on('download-progress', (d) => {
-				//On mac, download-progress event is not called, so the indeterminate progress will continue until download is finished
-				log.info('@update-progress@\n', d);
-				
-				var percent = d.percent;
-				
-				if (percent)
-				{
-					percent = Math.round(percent * 100)/100;
-				}
-				
-				if (firstTimeProg)
-				{
-					firstTimeProg = false;
-					progressBar.close();
-
-					progressBar = new ProgressBar({
-						indeterminate: false,
-						title: 'draw.io Update',
-						text: 'Downloading draw.io update...',
-						detail: `${percent}% ...`,
-						initialValue: percent
-					});
-				
-					progressBar
-							.on('completed', function() {
-								progressBar.detail = 'Download completed.';
-							})
-							.on('aborted', function(value) {
-								log.info(`progress aborted... ${value}`);
-							})
-							.on('progress', function(value) {
-								progressBar.detail = `${value}% ...`;
-							})
-							.on('ready', function() {
-								//InitialValue doesn't set the UI! so this is needed to render it correctly
-								progressBar.value = percent;
-							});
-				}
-				else 
-				{
-					progressBar.value = percent;
-				}
-			});
-
-		    autoUpdater.on('update-downloaded', (info) => {
-				if (!progressBar.isCompleted())
-				{
-					progressBar.close()
-				}
-		
-				log.info('@update-downloaded@\n', info)
-				// Ask user to update the app
-				dialog.showMessageBox(
-				{
-					type: 'question',
-					buttons: ['Install', 'Later'],
-					defaultId: 0,
-					message: 'A new version of ' + app.name + ' has been downloaded',
-					detail: 'It will be installed the next time you restart the application',
-				}).then(result =>
-				{
-					if (result.response === 0)
-					{
-						setTimeout(() => autoUpdater.quitAndInstall(), 1)
-					}
-				})
-		    });
-		}
-		else if (result.response === 2)
-		{
-			//save in settings don't check for updates
-			log.info('@dont check for updates!@')
-			store.set('dontCheckUpdates', true)
-		}
-	})
-})
-
-//Pdf export
-const MICRON_TO_PIXEL = 264.58 		//264.58 micron = 1 pixel
-const PIXELS_PER_INCH = 100.117		// Usually it is 100 pixels per inch but this give better results
-const PNG_CHUNK_IDAT = 1229209940;
-const LARGE_IMAGE_AREA = 30000000;
-
-//NOTE: Key length must not be longer than 79 bytes (not checked)
-function writePngWithText(origBuff, key, text, compressed, base64encoded)
-{
-	var isDpi = key == 'dpi';
-	var inOffset = 0;
-	var outOffset = 0;
-	var data = text;
-	var dataLen = isDpi? 9 : key.length + data.length + 1; //we add 1 zeros with non-compressed data, for pHYs it's 2 of 4-byte-int + 1 byte
-	
-	//prepare compressed data to get its size
-	if (compressed)
-	{
-		data = zlib.deflateRawSync(encodeURIComponent(text));
-		dataLen = key.length + data.length + 2; //we add 2 zeros with compressed data
-	}
-	
-	var outBuff = Buffer.allocUnsafe(origBuff.length + dataLen + 4); //4 is the header size "zTXt", "tEXt" or "pHYs"
-	
-	try
-	{
-		var magic1 = origBuff.readUInt32BE(inOffset);
-		inOffset += 4;
-		var magic2 = origBuff.readUInt32BE(inOffset);
-		inOffset += 4;
-		
-		if (magic1 != 0x89504e47 && magic2 != 0x0d0a1a0a)
-		{
-			throw new Error("PNGImageDecoder0");
-		}
-		
-		outBuff.writeUInt32BE(magic1, outOffset);
-		outOffset += 4;
-		outBuff.writeUInt32BE(magic2, outOffset);
-		outOffset += 4;
-	}
-	catch (e)
-	{
-		log.error(e.message, {stack: e.stack});
-		throw new Error("PNGImageDecoder1");
-	}
-
-	try
-	{
-		while (inOffset < origBuff.length)
-		{
-			var length = origBuff.readInt32BE(inOffset);
-			inOffset += 4;
-			var type = origBuff.readInt32BE(inOffset)
-			inOffset += 4;
-
-			if (type == PNG_CHUNK_IDAT)
-			{
-				// Insert zTXt chunk before IDAT chunk
-				outBuff.writeInt32BE(dataLen, outOffset);
-				outOffset += 4;
-				
-				var typeSignature = isDpi? 'pHYs' : (compressed ? "zTXt" : "tEXt");
-				outBuff.write(typeSignature, outOffset);
-				
-				outOffset += 4;
-
-				if (isDpi)
-				{
-					var dpm = Math.round(parseInt(text) / 0.0254) || 3937; //One inch is equal to exactly 0.0254 meters. 3937 is 100dpi
-
-					outBuff.writeInt32BE(dpm, outOffset);
-					outBuff.writeInt32BE(dpm, outOffset + 4);
-					outBuff.writeInt8(1, outOffset + 8);
-					outOffset += 9;
-
-					data = Buffer.allocUnsafe(9);
-					data.writeInt32BE(dpm, 0);
-					data.writeInt32BE(dpm, 4);
-					data.writeInt8(1, 8);
-				}
-				else
-				{
-					outBuff.write(key, outOffset);
-					outOffset += key.length;
-					outBuff.writeInt8(0, outOffset);
-					outOffset ++;
-
-					if (compressed)
-					{
-						outBuff.writeInt8(0, outOffset);
-						outOffset ++;
-						data.copy(outBuff, outOffset);
-					}
-					else
-					{
-						outBuff.write(data, outOffset);	
-					}
-
-					outOffset += data.length;				
-				}
-
-				var crcVal = 0xffffffff;
-				crcVal = crc.crcjam(typeSignature, crcVal);
-				crcVal = crc.crcjam(data, crcVal);
-
-				// CRC
-				outBuff.writeInt32BE(crcVal ^ 0xffffffff, outOffset);
-				outOffset += 4;
-
-				// Writes the IDAT chunk after the zTXt
-				outBuff.writeInt32BE(length, outOffset);
-				outOffset += 4;
-				outBuff.writeInt32BE(type, outOffset);
-				outOffset += 4;
-
-				origBuff.copy(outBuff, outOffset, inOffset);
-
-				// Encodes the buffer using base64 if requested
-				return base64encoded? outBuff.toString('base64') : outBuff;
-			}
-
-			outBuff.writeInt32BE(length, outOffset);
-			outOffset += 4;
-			outBuff.writeInt32BE(type, outOffset);
-			outOffset += 4;
-
-			origBuff.copy(outBuff, outOffset, inOffset, inOffset + length + 4);// +4 to move past the crc
-			
-			inOffset += length + 4;
-			outOffset += length + 4;
-		}
-	}
-	catch (e)
-	{
-		log.error(e.message, {stack: e.stack});
-		throw e;
-	}
-}
-
-//TODO Create a lightweight html file similar to export3.html for exporting to vsdx
-function exportVsdx(event, args, directFinalize)
-{
-	let win = createWindow({
-		show : false
-	});
-
-	let loadEvtCount = 0;
-			
-	function loadFinished(e)
-	{
-		if (e != null && e.senderFrame != null &&
-			!validateSender(e.senderFrame)) return null;
-
-		loadEvtCount++;
-		
-		if (loadEvtCount == 2)
-		{
-	    	win.webContents.send('export-vsdx', args);
-	    	
-	        ipcMain.once('export-vsdx-finished', (e, data) =>
-			{
-				if (!validateSender(e.senderFrame)) return null;
-
-				var hasError = false;
-				
-				if (data == null)
-				{
-					hasError = true;
-				}
-				
-				//Set finalize here since it is call in the reply below
-				function finalize()
-				{
-					win.destroy();
-				};
-				
-				if (directFinalize === true)
-				{
-					event.finalize = finalize;
-				}
-				else
-				{
-					//Destroy the window after response being received by caller
-					ipcMain.once('export-finalize', finalize);
-				}
-				
-				if (hasError)
-				{
-					event.reply('export-error');
-				}
-				else
-				{
-					event.reply('export-success', data);
-				}
-			});
-		}
-	}
-	
-	//Order of these two events is not guaranteed, so wait for them async.
-	//TOOD There is still a chance we catch another window 'app-load-finished' if user created multiple windows quickly 
-	ipcMain.once('app-load-finished', loadFinished);
-    win.webContents.on('did-finish-load', loadFinished);
-};
-
-async function mergePdfs(pdfFiles, xml)
-{
-	//Pass throgh single files
-	if (pdfFiles.length == 1 && xml == null)
-	{
-		return pdfFiles[0];
-	}
-
-	try 
-	{
-		const pdfDoc = await PDFDocument.create();
-		pdfDoc.setCreator('diagrams.net');
-
-		if (xml != null)
-		{	
-			//Embed diagram XML as file attachment
-			await pdfDoc.attach(Buffer.from(xml).toString('base64'), 'diagram.xml', {
-				mimeType: 'application/vnd.jgraph.mxfile',
-				description: 'Diagram Content'
-			  });
-		}
-
-		for (var i = 0; i < pdfFiles.length; i++)
-		{
-			const pdfFile = await PDFDocument.load(pdfFiles[i].buffer);
-			const pages = await pdfDoc.copyPages(pdfFile, pdfFile.getPageIndices());
-			pages.forEach(p => pdfDoc.addPage(p));
-		}
-
-		const pdfBytes = await pdfDoc.save();
-        return Buffer.from(pdfBytes);
-    }
-	catch(e)
-	{
-        throw new Error('Error during PDF combination: ' + e.message);
-    }
-}
-
-//TODO Use canvas to export images if math is not used to speedup export (no capturePage). Requires change to export3.html also
-function exportDiagram(event, args, directFinalize)
-{
-	if (event != null && event.senderFrame != null &&
-		!validateSender(event.senderFrame)) return null;
-
-	if (args.format == 'vsdx')
-	{
-		exportVsdx(event, args, directFinalize);
-		return;
-	}
-	
-	var browser = null;
-	
-	try
-	{
-		browser = new BrowserWindow({
-			webPreferences: {
-				preload: `${__dirname}/electron-preload.js`,
-				backgroundThrottling: false,
-				contextIsolation: true,
-				disableBlinkFeatures: 'Auxclick' // Is this needed?
-			},
-			show : false,
-			frame: false,
-			enableLargerThanScreen: true,
-			transparent: args.format == 'png' && (args.bg == null || args.bg == 'none'),
-			parent: windowsRegistry[0] //set parent to first opened window. Not very accurate, but useful when all visible windows are closed
-		});
-
-		browser.loadURL(`file://${__dirname}/export3.html`);
-
-		const contents = browser.webContents;
-		var pageByPage = (args.format == 'pdf' && !args.print), from, pdfs;
-
-		if (pageByPage)
-		{
-			from = args.allPages? 0 : parseInt(args.from || 0);
-			to = args.allPages? 1000 : parseInt(args.to || 1000) + 1; //The 'to' will be corrected later
-			pdfs = [];
-
-			args.from = from;
-			args.to = from;
-			args.allPages = false;
-		}
-			
-		contents.on('did-finish-load', function()
-	    {
-			//Set finalize here since it is call in the reply below
-			function finalize()
-			{
-				browser.destroy();
-			};
-			
-			if (directFinalize === true)
-			{
-				event.finalize = finalize;
-			}
-			else
-			{
-				//Destroy the window after response being received by caller
-				ipcMain.once('export-finalize', finalize);
-			}
-
-			function renderingFinishHandler(e, renderInfo)
-			{
-				if (!validateSender(e.senderFrame)) return null;
-
-				if (renderInfo == null)
-				{
-					event.reply('export-error');
-					return;
-				}
-
-				var pageCount = renderInfo.pageCount, bounds = null;
-				//For some reason, Electron 9 doesn't send this object as is without stringifying. Usually when variable is external to function own scope
-				try
-				{
-					bounds = JSON.parse(renderInfo.bounds);
-				}
-				catch(e)
-				{
-					bounds = null;
-				}
-				
-				var pdfOptions = {pageSize: 'A4'};
-				var hasError = false;
-				
-				if (bounds == null || bounds.width < 5 || bounds.height < 5) //very small page size never return from printToPDF
-				{
-					//A workaround to detect errors in the input file or being empty file
-					hasError = true;
-				}
-				else
-				{
-					pdfOptions = {
-						printBackground: true,
-						pageSize : {
-							width: bounds.width / PIXELS_PER_INCH,
-							height: (bounds.height + 2) / PIXELS_PER_INCH //the extra 2 pixels to prevent adding an extra empty page						
-						},
-						margins: {
-							top: 0,
-							bottom: 0,
-							left: 0,
-							right: 0
-						} // no margin
-					}
-				}
-				
-				var base64encoded = args.base64 == '1';
-				
-				if (hasError)
-				{
-					event.reply('export-error');
-				}
-				else if (args.format == 'png' || args.format == 'jpg' || args.format == 'jpeg')
-				{
-					//Adds an extra pixel to prevent scrollbars from showing
-					var newBounds = {width: Math.ceil(bounds.width + bounds.x) + 1, height: Math.ceil(bounds.height + bounds.y) + 1};
-					browser.setBounds(newBounds);
-					
-					//TODO The browser takes sometime to show the graph (also after resize it takes some time to render)
-					//	 	1 sec is most probably enough (for small images, 5 for large ones) BUT not a stable solution
-					setTimeout(function()
-					{
-						browser.capturePage().then(function(img)
-						{
-							//Image is double the given bounds, so resize is needed!
-							var tScale = 1;
-
-							//If user defined width and/or height, enforce it precisely here. Height override width
-							if (args.h)
-							{
-								tScale = args.h / newBounds.height;
-							}
-							else if (args.w)
-							{
-								tScale = args.w / newBounds.width;
-							}
-							
-							newBounds.width *= tScale;
-							newBounds.height *= tScale;
-							img = img.resize(newBounds);
-
-							var data = args.format == 'png'? img.toPNG() : img.toJPEG(args.jpegQuality || 90);
-							
-							if (args.dpi != null && args.format == 'png')
-							{
-								data = writePngWithText(data, 'dpi', args.dpi);
-							}
-							
-							if (args.embedXml == "1" && args.format == 'png')
-							{
-								data = writePngWithText(data, "mxGraphModel", args.xml, true,
-										base64encoded);
-							}
-							else
-							{
-								if (base64encoded)
-								{
-									data = data.toString('base64');
-								}
-							}
-							
-							event.reply('export-success', data);
-						});
-					}, bounds.width * bounds.height < LARGE_IMAGE_AREA? 1000 : 5000);
-				}
-				else if (args.format == 'pdf')
-				{
-					if (args.print)
-					{
-						pdfOptions = {
-							scaleFactor: args.pageScale,
-							printBackground: true,
-							pageSize : {
-								width: args.pageWidth * MICRON_TO_PIXEL,
-								//This height adjustment fixes the output. TODO Test more cases
-								height: (args.pageHeight * 1.025) * MICRON_TO_PIXEL
-							},
-							marginsType: 1 // no margin
-						};
-						 
-						contents.print(pdfOptions, (success, errorType) => 
-						{
-							//Consider all as success
-							event.reply('export-success', {});
-						});
-					}
-					else
-					{
-						contents.printToPDF(pdfOptions).then(async (data) => 
-						{
-							pdfs.push(data);
-							to = to > pageCount? pageCount : to;
-							from++;
-							
-							if (from < to)
-							{
-								args.from = from;
-								args.to = from;
-								ipcMain.once('render-finished', renderingFinishHandler);
-								contents.send('render', args);
-							}
-							else
-							{
-								data = await mergePdfs(pdfs, args.embedXml == '1' ? args.xml : null);
-								event.reply('export-success', data);
-							}
-						})
-						.catch((error) => 
-						{
-							event.reply('export-error', error);
-						});
-					}
-				}
-				else if (args.format == 'svg')
-				{
-					contents.send('get-svg-data');
-					
-					ipcMain.once('svg-data', (e, data) =>
-					{
-						if (!validateSender(e.senderFrame)) return null;
-
-						event.reply('export-success', data);
-					});
-				}
-				else
-				{
-					event.reply('export-error', 'Error: Unsupported format');
-				}
-			};
-			
-			ipcMain.once('render-finished', renderingFinishHandler);
-
-			if (args.format == 'xml')
-			{
-				ipcMain.once('xml-data', (e, data) =>
-				{
-					if (!validateSender(e.senderFrame)) return null;
-
-					event.reply('export-success', data);
-				});
-				
-				ipcMain.once('xml-data-error', (e) =>
-				{
-					if (!validateSender(e.senderFrame)) return null;
-
-					event.reply('export-error');
-				});
-			}
-			
-			args.border = args.border || 0;
-			args.scale = args.scale || 1;
-			
-			contents.send('render', args);
-	    });
-	}
-	catch (e)
-	{
-		if (browser != null)
-		{
-			browser.destroy();
-		}
-
-		event.reply('export-error', e);
-		console.log('export-error', e);
-	}
-};
-
-ipcMain.on('export', exportDiagram);
-
-//================================================================
-// Renderer Helper functions
-//================================================================
-
-const { O_SYNC, O_CREAT, O_WRONLY, O_TRUNC, O_RDONLY } = fs.constants;
-const DRAFT_PREFEX = '.$';
-const OLD_DRAFT_PREFEX = '~$';
-const DRAFT_EXT = '.dtmp';
-const BKP_PREFEX = '.$';
-const OLD_BKP_PREFEX = '~$';
-const BKP_EXT = '.bkp';
-
-/**
- * Checks the file content type
- * Confirm content is xml, pdf, png, jpg, svg, vsdx ...
- */
-function checkFileContent(body, enc)
-{
-	if (body != null)
-	{
-		let head, headBinay;
-		
-		if (typeof body === 'string')
-		{
-			if (enc === 'base64')
-			{
-				headBinay = Buffer.from(body.substring(0, 22), 'base64');
-				head = headBinay.toString();
-			}
-			else
-			{
-				head = body.substring(0, 16);
-				headBinay = Buffer.from(head);
-			}
-		}
-		else
-		{
-			head = new TextDecoder("utf-8").decode(body.subarray(0, 16));
-			headBinay = body;
-		}
-		
-		let c1 = head[0],
-		c2 = head[1],
-		c3 = head[2],
-		c4 = head[3],
-		c5 = head[4],
-		c6 = head[5],
-		c7 = head[6],
-		c8 = head[7],
-		c9 = head[8],
-		c10 = head[9],
-		c11 = head[10],
-		c12 = head[11],
-		c13 = head[12],
-		c14 = head[13],
-		c15 = head[14],
-		c16 = head[15];
-
-		let cc1 = headBinay[0],
-		cc2 = headBinay[1],
-		cc3 = headBinay[2],
-		cc4 = headBinay[3],
-		cc5 = headBinay[4],
-		cc6 = headBinay[5],
-		cc7 = headBinay[6],
-		cc8 = headBinay[7],
-		cc9 = headBinay[8],
-		cc10 = headBinay[9],
-		cc11 = headBinay[10],
-		cc12 = headBinay[11],
-		cc13 = headBinay[12],
-		cc14 = headBinay[13],
-		cc15 = headBinay[14],
-		cc16 = headBinay[15];
-
-		if (c1 == '<')
-		{
-			// text/html
-			if (c2 == '!'
-					|| ((c2 == 'h'
-							&& (c3 == 't' && c4 == 'm' && c5 == 'l'
-									|| c3 == 'e' && c4 == 'a' && c5 == 'd')
-							|| (c2 == 'b' && c3 == 'o' && c4 == 'd'
-									&& c5 == 'y')))
-					|| ((c2 == 'H'
-							&& (c3 == 'T' && c4 == 'M' && c5 == 'L'
-									|| c3 == 'E' && c4 == 'A' && c5 == 'D')
-							|| (c2 == 'B' && c3 == 'O' && c4 == 'D'
-									&& c5 == 'Y'))))
-			{
-				return true;
-			}
-
-			// application/xml
-			if (c2 == '?' && c3 == 'x' && c4 == 'm' && c5 == 'l'
-					&& c6 == ' ')
-			{
-				return true;
-			}
-			
-			// application/svg+xml
-			if (c2 == 's' && c3 == 'v' && c4 == 'g' && c5 == ' ')
-			{
-				return true;
-			}
-		}
-
-		// big and little (identical) endian UTF-8 encodings, with BOM
-		// application/xml
-		if (cc1 == 0xef && cc2 == 0xbb && cc3 == 0xbf)
-		{
-			if (c4 == '<' && c5 == '?' && c6 == 'x')
-			{
-				return true;
-			}
-		}
-
-		// big and little endian UTF-16 encodings, with byte order mark
-		// application/xml
-		if (cc1 == 0xfe && cc2 == 0xff)
-		{
-			if (cc3 == 0 && c4 == '<' && cc5 == 0 && c6 == '?' && cc7 == 0
-					&& c8 == 'x')
-			{
-				return true;
-			}
-		}
-
-		// application/xml
-		if (cc1 == 0xff && cc2 == 0xfe)
-		{
-			if (c3 == '<' && cc4 == 0 && c5 == '?' && cc6 == 0 && c7 == 'x'
-					&& cc8 == 0)
-			{
-				return true;
-			}
-		}
-
-		// big and little endian UTF-32 encodings, with BOM
-		// application/xml
-		if (cc1 == 0x00 && cc2 == 0x00 && cc3 == 0xfe && cc4 == 0xff)
-		{
-			if (cc5 == 0 && cc6 == 0 && cc7 == 0 && c8 == '<' && cc9 == 0
-					&& cc10 == 0 && cc11 == 0 && c12 == '?' && cc13 == 0
-					&& cc14 == 0 && cc15 == 0 && c16 == 'x')
-			{
-				return true;
-			}
-		}
-
-		// application/xml
-		if (cc1 == 0xff && cc2 == 0xfe && cc3 == 0x00 && cc4 == 0x00)
-		{
-			if (c5 == '<' && cc6 == 0 && cc7 == 0 && cc8 == 0 && c9 == '?'
-					&& cc10 == 0 && cc11 == 0 && cc12 == 0 && c13 == 'x'
-					&& cc14 == 0 && cc15 == 0 && cc16 == 0)
-			{
-				return true;
-			}
-		}
-
-		// application/pdf (%PDF-)
-		if (cc1 == 37 && cc2 == 80 && cc3 == 68 && cc4 == 70 && cc5 == 45)
-		{
-			return true;
-		}
-
-		// image/png
-		if ((cc1 == 137 && cc2 == 80 && cc3 == 78 && cc4 == 71 && cc5 == 13
-				&& cc6 == 10 && cc7 == 26 && cc8 == 10) ||
-			(cc1 == 194 && cc2 == 137 && cc3 == 80 && cc4 == 78 && cc5 == 71 && cc6 == 13 //Our embedded PNG+XML
-				&& cc7 == 10 && cc8 == 26 && cc9 == 10))
-		{
-			return true;
-		}
-
-		// image/jpeg
-		if (cc1 == 0xFF && cc2 == 0xD8 && cc3 == 0xFF)
-		{
-			if (cc4 == 0xE0 || cc4 == 0xEE)
-			{
-				return true;
-			}
-
-			/**
-			 * File format used by digital cameras to store images.
-			 * Exif Format can be read by any application supporting
-			 * JPEG. Exif Spec can be found at:
-			 * http://www.pima.net/standards/it10/PIMA15740/Exif_2-1.PDF
-			 */
-			if ((cc4 == 0xE1) && (c7 == 'E' && c8 == 'x' && c9 == 'i'
-					&& c10 == 'f' && cc11 == 0))
-			{
-				return true;
-			}
-		}
-
-		// vsdx, vssx (also zip, jar, odt, ods, odp, docx, xlsx, pptx, apk, aar)
-		if (cc1 == 0x50 && cc2 == 0x4B && cc3 == 0x03 && cc4 == 0x04)
-		{
-			return true;
-		}
-		else if (cc1 == 0x50 && cc2 == 0x4B && cc3 == 0x03 && cc4 == 0x06)
-		{
-			return true;
-		}
-
-		// mxfile, mxlibrary, mxGraphModel
-		if (c1 == '<' && c2 == 'm' && c3 == 'x')
-		{
-			return true;
-		}
-	}
-
-	return false;
-};
-
-function isConflict(origStat, stat)
-{
-	return stat != null && origStat != null && stat.mtimeMs != origStat.mtimeMs;
-};
-
-function getDraftFileName(fileObject)
-{
-	let filePath = fileObject.path;
-	let draftFileName = '', counter = 1, uniquePart = '';
-
-	do
-	{
-		draftFileName = path.join(path.dirname(filePath), DRAFT_PREFEX + path.basename(filePath) + uniquePart + DRAFT_EXT);
-		uniquePart = '_' + counter++;
-	} while (fs.existsSync(draftFileName));
-
-	return draftFileName;
-};
-
-async function getFileDrafts(fileObject)
-{
-	let filePath = fileObject.path;
-	let draftsPaths = [], drafts = [], draftFileName, counter = 1, uniquePart = '';
-
-	do
-	{
-		draftsPaths.push(draftFileName);
-		draftFileName = path.join(path.dirname(filePath), DRAFT_PREFEX + path.basename(filePath) + uniquePart + DRAFT_EXT);
-		uniquePart = '_' + counter++;
-	} while (fs.existsSync(draftFileName)); //TODO this assume continuous drafts names
-
-	//Port old draft files to new prefex
-	counter = 1;
-	uniquePart = '';
-	let draftExists = false;
-
-	do
-	{
-		draftFileName = path.join(path.dirname(filePath), OLD_DRAFT_PREFEX + path.basename(filePath) + uniquePart + DRAFT_EXT);
-		draftExists = fs.existsSync(draftFileName);
-		
-		if (draftExists)
-		{
-			const newDraftFileName = path.join(path.dirname(filePath), DRAFT_PREFEX + path.basename(filePath) + uniquePart + DRAFT_EXT);
-			await fsProm.rename(draftFileName, newDraftFileName);
-			draftsPaths.push(newDraftFileName);
-		}
-
-		uniquePart = '_' + counter++;
-	} while (draftExists); //TODO this assume continuous drafts names
-
-	//Skip the first null element
-	for (let i = 1; i < draftsPaths.length; i++)
-	{
-		try
-		{
-			let stat = await fsProm.lstat(draftsPaths[i]);
-			drafts.push({data: await fsProm.readFile(draftsPaths[i], 'utf8'), 
-						created: stat.ctimeMs,
-						modified: stat.mtimeMs,
-						path: draftsPaths[i]});
-		}
-		catch (e){} // Ignore
-	}
-
-	return drafts;
-};
-
-async function saveDraft(fileObject, data)
-{
-	var draftFileName = fileObject.draftFileName || getDraftFileName(fileObject);
-
-	if (!checkFileContent(data) || path.resolve(draftFileName).startsWith(__dirname))
-	{
-		throw new Error('Invalid file data');
-	}
-	else
-	{
-		await fsProm.writeFile(draftFileName, data, 'utf8');
-		
-		if (isWin)
-		{
-			try
-			{
-				// Add Hidden attribute:
-				var child = spawn('attrib', ['+h', draftFileName]);
-    			child.on('error', function(err) 
-				{
-					console.log('hiding draft file error: ' + err);
-    			});
-			} catch(e) {}
-		}
-
-		return draftFileName;
-	}
-}
-
-async function saveFile(fileObject, data, origStat, overwrite, defEnc)
-{
-	if (!checkFileContent(data) || path.resolve(fileObject.path).startsWith(__dirname))
-	{
-		throw new Error('Invalid file data');
-	}
-
-	var retryCount = 0;
-	var backupCreated = false;
-	var bkpPath = path.join(path.dirname(fileObject.path), BKP_PREFEX + path.basename(fileObject.path) + BKP_EXT);
-	const oldBkpPath = path.join(path.dirname(fileObject.path), OLD_BKP_PREFEX + path.basename(fileObject.path) + BKP_EXT);
-	var writeEnc = defEnc || fileObject.encoding;
-
-	var writeFile = async function()
-	{
-		let fh;
-
-		try
-		{
-			// O_SYNC is for sync I/O and reduce risk of file corruption
-			fh = await fsProm.open(fileObject.path, O_SYNC | O_CREAT | O_WRONLY | O_TRUNC);
-			await fsProm.writeFile(fh, data, writeEnc);
-		}
-		finally
-		{
-			await fh?.close();
-		}
-
-		let stat2 = await fsProm.stat(fileObject.path);
-		// Workaround for possible writing errors is to check the written
-		// contents of the file and retry 3 times before showing an error
-		let writtenData = await fsProm.readFile(fileObject.path, writeEnc);
-		
-		if (data != writtenData)
-		{
-			retryCount++;
-			
-			if (retryCount < 3)
-			{
-				return await writeFile();
-			}
-			else
-			{
-				throw new Error('all saving trials failed');
-			}
-		}
-		else
-		{
-			//We'll keep the backup file in case the original file is corrupted. TODO When should we delete the backup file?
-			if (backupCreated)
-			{
-				//fs.unlink(bkpPath, (err) => {}); //Ignore errors!
-
-				//Delete old backup file with old prefix
-				if (fs.existsSync(oldBkpPath))
-				{
-					fs.unlink(oldBkpPath, (err) => {}); //Ignore errors
-				}
-			}
-
-			return stat2;
-		}
-	};
-	
-	async function doSaveFile(isNew)
-	{
-		if (enableStoreBkp && !isNew)
-		{
-			//Copy file to backup file (after conflict and stat is checked)
-			let bkpFh;
-
-			try
-			{
-				//Use file read then write to open the backup file direct sync write to reduce the chance of file corruption
-				let fileContent = await fsProm.readFile(fileObject.path, writeEnc);
-				bkpFh = await fsProm.open(bkpPath, O_SYNC | O_CREAT | O_WRONLY | O_TRUNC);
-				await fsProm.writeFile(bkpFh, fileContent, writeEnc);
-				backupCreated = true;
-			}
-			catch (e) 
-			{
-				if (__DEV__)
-				{
-					console.log('Backup file writing failed', e); //Ignore
-				}
-			}
-			finally 
-			{
-				await bkpFh?.close();
-
-				if (isWin)
-				{
-					try
-					{
-						// Add Hidden attribute:
-						var child = spawn('attrib', ['+h', bkpPath]);
-						child.on('error', function(err) 
-						{
-							console.log('hiding backup file error: ' + err);
-						});
-					} catch(e) {}
-				}
-			}
-		}
-
-		return await writeFile();
-	};
-	
-	if (overwrite)
-	{
-		return await doSaveFile(true);
-	}
-	else
-	{
-		let stat = fs.existsSync(fileObject.path)?
-					await fsProm.stat(fileObject.path) : null;
-
-		if (stat && isConflict(origStat, stat))
-		{
-			throw new Error('conflict');
-		}
-		else
-		{
-			return await doSaveFile(stat == null);
-		}
-	}
-};
-
-async function writeFile(filePath, data, enc)
-{
-	if (!checkFileContent(data, enc) || path.resolve(filePath).startsWith(__dirname))
-	{
-		throw new Error('Invalid file data');
-	}
-	else
-	{
-		return await fsProm.writeFile(filePath, data, enc);
-	}
-};
-
-function getAppDataFolder()
-{
-	try
-	{
-		var appDataDir = app.getPath('appData');
-		var drawioDir = appDataDir + '/draw.io';
-		
-		if (!fs.existsSync(drawioDir)) //Usually this dir already exists
-		{
-			fs.mkdirSync(drawioDir);
-		}
-		
-		return drawioDir;
-	}
-	catch(e) {}
-	
-	return '.';
-};
-
-function getDocumentsFolder()
-{
-	//On windows, misconfigured Documents folder cause an exception
-	try
-	{
-		return app.getPath('documents');
-	}
-	catch(e) {}
-	
-	return '.';
-};
-
-function checkFileExists(pathParts)
-{
-	let filePath = path.join(...pathParts);
-	return {exists: fs.existsSync(filePath), path: filePath};
-};
-
-async function showOpenDialog(defaultPath, filters, properties)
-{
-	let win = BrowserWindow.getFocusedWindow();
-
-	return dialog.showOpenDialog(win, {
-		defaultPath: defaultPath,
-		filters: filters,
-		properties: properties
-	});
-};
-
-async function showSaveDialog(defaultPath, filters)
-{
-	let win = BrowserWindow.getFocusedWindow();
-
-	return dialog.showSaveDialog(win, {
-		defaultPath: defaultPath,
-		filters: filters
-	});
-};
-
-async function installPlugin(filePath)
-{
-	if (!enablePlugins) return {};
-
-	var pluginsDir = path.join(getAppDataFolder(), '/plugins');
-	
-	if (!fs.existsSync(pluginsDir))
-	{
-		fs.mkdirSync(pluginsDir);
-	}
-	
-	var pluginName = path.basename(filePath);
-	var dstFile = path.join(pluginsDir, pluginName);
-	
-	if (fs.existsSync(dstFile))
-	{
-		throw new Error('fileExists');
-	}
-	else
-	{
-		await fsProm.copyFile(filePath, dstFile);
-	}
-
-	return {pluginName: pluginName, selDir: path.dirname(filePath)};
-}
-
-function getPluginFile(plugin)
-{
-	if (!enablePlugins) return null;
-	
-	const prefix = path.join(getAppDataFolder(), '/plugins/');
-	const pluginFile = path.join(prefix, plugin);
-	        	
-	if (pluginFile.startsWith(prefix) && fs.existsSync(pluginFile))
-	{
-		return pluginFile;
-	}
-
-	return null;
-}
-
-function uninstallPlugin(plugin)
-{
-	const pluginFile = getPluginFile(plugin);
-	        	
-	if (pluginFile != null)
-	{
-		fs.unlinkSync(pluginFile);
-	}
-}
-
-function dirname(path_p)
-{
-	return path.dirname(path_p);
-}
-
-async function readFile(filename, encoding)
-{
-	let data = await fsProm.readFile(filename, encoding);
-
-	if (checkFileContent(data, encoding) && !path.resolve(filename).startsWith(__dirname))
-	{
-		return data;
-	}
-
-	throw new Error('Invalid file data');
-}
-
-async function fileStat(file)
-{
-	return await fsProm.stat(file);
-}
-
-async function isFileWritable(file)
-{
-	try 
-	{
-		await fsProm.access(file, fs.constants.W_OK);
-		return true;
-	}
-	catch (e)
-	{
-		return false;
-	}
-}
-
-function clipboardAction(method, data)
-{
-	if (method == 'writeText')
-	{
-		clipboard.writeText(data);
-	}
-	else if (method == 'readText')
-	{
-		return clipboard.readText();
-	}
-	else if (method == 'writeImage')
-	{
-		clipboard.write({image: 
-			nativeImage.createFromDataURL(data.dataUrl), html: '<img src="' +
-			data.dataUrl + '" width="' + data.w + '" height="' + data.h + '">'});
-	}
-}
-
-async function deleteFile(file) 
-{
-	// Reading the header of the file to confirm it is a file we can delete
-	let fh = await fsProm.open(file, O_RDONLY);
-	let buffer = Buffer.allocUnsafe(16);
-	await fh.read(buffer, 0, 16);
-	await fh.close();
-
-	if (checkFileContent(buffer) && !path.resolve(file).startsWith(__dirname))
-	{
-		await fsProm.unlink(file);
-	}
-}
-
-function windowAction(method)
-{
-	let win = BrowserWindow.getFocusedWindow();
-
-	if (win)
-	{
-		if (method == 'minimize')
-		{
-			win.minimize();
-		}
-		else if (method == 'maximize')
-		{
-			win.maximize();
-		}
-		else if (method == 'unmaximize')
-		{
-			win.unmaximize();
-		}
-		else if (method == 'close')
-		{
-			win.close();
-		}
-		else if (method == 'isMaximized')
-		{
-			return win.isMaximized();
-		}
-		else if (method == 'removeAllListeners')
-		{
-			win.removeAllListeners();
-		}
-	}
-}
-
-const allowedUrls = /^(?:https?|mailto|tel|callto):/i;
-
-function openExternal(url)
-{
-	//Only open http(s), mailto, tel, and callto links
-	if (allowedUrls.test(url))
-	{
-		shell.openExternal(url);
-		return true;
-	}
-
-	return false;
-}
-
-function watchFile(filePath)
-{
-	let win = BrowserWindow.getFocusedWindow();
-
-	if (win)
-	{
-		fs.watchFile(filePath, (curr, prev) => {
-			try
-			{
-				win.webContents.send('fileChanged', {
-					path: filePath,
-					curr: curr,
-					prev: prev
-				});
-			}
-			catch (e) {} // Ignore
-		});
-	}
-}
-
-function unwatchFile(filePath)
-{
-	fs.unwatchFile(filePath);
-}
-
-ipcMain.on("rendererReq", async (event, args) => 
-{
-	if (!validateSender(event.senderFrame)) return null;
-
-	try
-	{
-		let ret = null;
-
-		switch(args.action)
-		{
-		case 'saveFile':
-			ret = await saveFile(args.fileObject, args.data, args.origStat, args.overwrite, args.defEnc);
-			break;
-		case 'writeFile':
-			ret = await writeFile(args.path, args.data, args.enc);
-			break;
-		case 'saveDraft':
-			ret = await saveDraft(args.fileObject, args.data);
-			break;
-		case 'getFileDrafts':
-			ret = await getFileDrafts(args.fileObject);
-			break;
-		case 'getDocumentsFolder':
-			ret = await getDocumentsFolder();
-			break;
-		case 'checkFileExists':
-			ret = await checkFileExists(args.pathParts);
-			break;
-		case 'showOpenDialog':
-			dialogOpen = true;
-			ret = await showOpenDialog(args.defaultPath, args.filters, args.properties);
-			ret = ret.filePaths;
-			dialogOpen = false;
-			break;
-		case 'showSaveDialog':
-			dialogOpen = true;
-			ret = await showSaveDialog(args.defaultPath, args.filters);
-			ret = ret.canceled? null : ret.filePath;
-			dialogOpen = false;
-			break;
-		case 'installPlugin':
-			ret = await installPlugin(args.filePath);
-			break;
-		case 'uninstallPlugin':
-			ret = await uninstallPlugin(args.plugin);
-			break;
-		case 'getPluginFile':
-			ret = await getPluginFile(args.plugin);
-			break;
-		case 'isPluginsEnabled':
-			ret = enablePlugins;
-			break;
-		case 'dirname':
-			ret = await dirname(args.path);
-			break;
-		case 'readFile':
-			ret = await readFile(args.filename, args.encoding);
-			break;
-		case 'clipboardAction':
-			ret = await clipboardAction(args.method, args.data);
-			break;
-		case 'deleteFile':
-			ret = await deleteFile(args.file);
-			break;
-		case 'fileStat':
-			ret = await fileStat(args.file);
-			break;
-		case 'isFileWritable':
-			ret = await isFileWritable(args.file);
-			break;
-		case 'windowAction':
-			ret = await windowAction(args.method);
-			break;
-		case 'openExternal':
-			ret = await openExternal(args.url);
-			break;
-		case 'watchFile':
-			ret = await watchFile(args.path);
-			break;
-		case 'unwatchFile':	
-			ret = await unwatchFile(args.path);
-			break;
-		};
-
-		event.reply('mainResp', {success: true, data: ret, reqId: args.reqId});
-	}
-	catch (e)
-	{
-		event.reply('mainResp', {error: true, msg: e.message, e: e, reqId: args.reqId});
-	}
-});
\ No newline at end of file
diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html
index 32c5ca067d..5a452071c0 100644
--- a/src/main/webapp/index.html
+++ b/src/main/webapp/index.html
@@ -71,11 +71,12 @@
 				// ignore
 			}
 		}
 		
 		// Global variable for desktop
-		var mxIsElectron = navigator.userAgent != null && navigator.userAgent.toLowerCase().indexOf(' electron/') > -1;
+		var mxIsElectron = navigator.userAgent != null && navigator.userAgent.toLowerCase().indexOf(' electron/') > -1 && 
+							navigator.userAgent.indexOf(' draw.io/') > -1;
 
 		// Redirects page if required
 		if (urlParams['dev'] != '1')
 		{
 			(function()
diff --git a/src/main/webapp/js/app.min.js b/src/main/webapp/js/app.min.js
index b8f8e106cc..2f5a63b18d 100644
--- a/src/main/webapp/js/app.min.js
+++ b/src/main/webapp/js/app.min.js
@@ -144,11 +144,11 @@ window.uiTheme=window.uiTheme||function(){var a=urlParams.ui;"1"==urlParams.extA
 a),DRAWIO_GITLAB_URL=a);a=urlParams["gitlab-id"];null!=a&&(DRAWIO_GITLAB_ID=a);window.DRAWIO_LOG_URL=window.DRAWIO_LOG_URL||"";a=window.location.host;if("test.draw.io"!=a){var c="diagrams.net";b=a.length-c.length;c=a.lastIndexOf(c,b);-1!==c&&c===b?window.DRAWIO_LOG_URL="https://log.diagrams.net":(c="draw.io",b=a.length-c.length,c=a.lastIndexOf(c,b),-1!==c&&c===b&&(window.DRAWIO_LOG_URL="https://log.draw.io"))}})();
 if("1"==urlParams.offline||"1"==urlParams.demo||"1"==urlParams.stealth||"1"==urlParams.local||"1"==urlParams.lockdown)urlParams.picker="0",urlParams.gapi="0",urlParams.db="0",urlParams.od="0",urlParams.gh="0",urlParams.gl="0",urlParams.tr="0";
 "se.diagrams.net"==window.location.hostname&&(urlParams.db="0",urlParams.od="0",urlParams.gh="0",urlParams.gl="0",urlParams.tr="0",urlParams.plugins="0",urlParams.mode="google",urlParams.lockdown="1",window.DRAWIO_GOOGLE_APP_ID=window.DRAWIO_GOOGLE_APP_ID||"184079235871",window.DRAWIO_GOOGLE_CLIENT_ID=window.DRAWIO_GOOGLE_CLIENT_ID||"184079235871-pjf5nn0lff27lk8qf0770gmffiv9gt61.apps.googleusercontent.com");"trello"==urlParams.mode&&(urlParams.tr="1");
 "embed.diagrams.net"==window.location.hostname&&(urlParams.embed="1");(null==window.location.hash||1>=window.location.hash.length)&&null!=urlParams.open&&(window.location.hash=urlParams.open);window.urlParams=window.urlParams||{};window.DOM_PURIFY_CONFIG=window.DOM_PURIFY_CONFIG||{ADD_TAGS:["use"],FORBID_TAGS:["form"],ALLOWED_URI_REGEXP:/^((?!javascript:).)*$/i,ADD_ATTR:["target","content"]};window.MAX_REQUEST_SIZE=window.MAX_REQUEST_SIZE||10485760;window.MAX_AREA=window.MAX_AREA||225E6;window.EXPORT_URL=window.EXPORT_URL||"/export";window.SAVE_URL=window.SAVE_URL||"/save";window.OPEN_URL=window.OPEN_URL||"/open";window.RESOURCES_PATH=window.RESOURCES_PATH||"resources";
 window.RESOURCE_BASE=window.RESOURCE_BASE||window.RESOURCES_PATH+"/grapheditor";window.STENCIL_PATH=window.STENCIL_PATH||"stencils";window.IMAGE_PATH=window.IMAGE_PATH||"images";window.STYLE_PATH=window.STYLE_PATH||"styles";window.CSS_PATH=window.CSS_PATH||"styles";window.OPEN_FORM=window.OPEN_FORM||"open.html";window.mxBasePath=window.mxBasePath||"mxgraph";window.mxImageBasePath=window.mxImageBasePath||"mxgraph/images";window.mxLanguage=window.mxLanguage||urlParams.lang;
-window.mxLanguages=window.mxLanguages||["de","se"];var mxClient={VERSION:"21.4.1",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
+window.mxLanguages=window.mxLanguages||["de","se"];var mxClient={VERSION:"21.5.0",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
 IS_OP:null!=navigator.userAgent&&(0<=navigator.userAgent.indexOf("Opera/")||0<=navigator.userAgent.indexOf("OPR/")),IS_OT:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Presto/")&&0>navigator.userAgent.indexOf("Presto/2.4.")&&0>navigator.userAgent.indexOf("Presto/2.3.")&&0>navigator.userAgent.indexOf("Presto/2.2.")&&0>navigator.userAgent.indexOf("Presto/2.1.")&&0>navigator.userAgent.indexOf("Presto/2.0.")&&0>navigator.userAgent.indexOf("Presto/1."),IS_SF:/Apple Computer, Inc/.test(navigator.vendor),
 IS_ANDROID:0<=navigator.appVersion.indexOf("Android"),IS_IOS:/iP(hone|od|ad)/.test(navigator.platform)||navigator.userAgent.match(/Mac/)&&navigator.maxTouchPoints&&2<navigator.maxTouchPoints,IS_WEBVIEW:/((iPhone|iPod|iPad).*AppleWebKit(?!.*Version)|; wv)/i.test(navigator.userAgent),IS_GC:/Google Inc/.test(navigator.vendor),IS_CHROMEAPP:null!=window.chrome&&null!=chrome.app&&null!=chrome.app.runtime,IS_FF:-1<navigator.userAgent.toLowerCase().indexOf("firefox"),IS_MT:0<=navigator.userAgent.indexOf("Firefox/")&&
 0>navigator.userAgent.indexOf("Firefox/1.")&&0>navigator.userAgent.indexOf("Firefox/2.")||0<=navigator.userAgent.indexOf("Iceweasel/")&&0>navigator.userAgent.indexOf("Iceweasel/1.")&&0>navigator.userAgent.indexOf("Iceweasel/2.")||0<=navigator.userAgent.indexOf("SeaMonkey/")&&0>navigator.userAgent.indexOf("SeaMonkey/1.")||0<=navigator.userAgent.indexOf("Iceape/")&&0>navigator.userAgent.indexOf("Iceape/1."),IS_SVG:"MICROSOFT INTERNET EXPLORER"!=navigator.appName.toUpperCase(),NO_FO:!document.createElementNS||
 "[object SVGForeignObjectElement]"!==document.createElementNS("http://www.w3.org/2000/svg","foreignObject").toString()||0<=navigator.userAgent.indexOf("Opera/"),IS_WIN:0<navigator.appVersion.indexOf("Win"),IS_MAC:0<navigator.appVersion.indexOf("Mac"),IS_CHROMEOS:/\bCrOS\b/.test(navigator.appVersion),IS_LINUX:/\bLinux\b/.test(navigator.appVersion),IS_TOUCH:"ontouchstart"in document.documentElement,IS_POINTER:null!=window.PointerEvent&&!(0<navigator.appVersion.indexOf("Mac")),IS_LOCAL:0>document.location.href.indexOf("http://")&&
 0>document.location.href.indexOf("https://"),defaultBundles:[],isBrowserSupported:function(){return mxClient.IS_SVG},link:function(a,b,c,d){c=c||document;var e=c.createElement("link");e.setAttribute("rel",a);e.setAttribute("href",b);e.setAttribute("charset","UTF-8");e.setAttribute("type","text/css");d&&e.setAttribute("id",d);c.getElementsByTagName("head")[0].appendChild(e)},loadResources:function(a,b){function c(){0==--d&&a()}for(var d=mxClient.defaultBundles.length,e=0;e<mxClient.defaultBundles.length;e++)mxResources.add(mxClient.defaultBundles[e],
@@ -11734,11 +11734,11 @@ Ea.style.cssText="margin:0 8px 0 8px;";Ea.setAttribute("value","100 %");Ea.style
 PrintDialog.previewEnabled&&(ba=mxUtils.button(mxResources.get("preview"),function(){m.hideDialog();N(!1)}),ba.className="geBtn",y.appendChild(ba));ba=mxUtils.button(mxResources.get(PrintDialog.previewEnabled?"print":"ok"),function(){m.hideDialog();N(!0)});ba.className="geBtn gePrimaryBtn";y.appendChild(ba);m.editor.cancelFirst||y.appendChild(W);V.appendChild(y);this.container=V};var z=ChangePageSetup.prototype.execute;ChangePageSetup.prototype.execute=function(){null==this.page&&(this.page=this.ui.currentPage);
 if(this.page!=this.ui.currentPage){if(null!=this.page.viewState){this.ignoreColor||(this.page.viewState.background=this.color);if(!this.ignoreImage){var m=this.image;null!=m&&null!=m.src&&Graph.isPageLink(m.src)&&(m={originalSrc:m.src});this.page.viewState.backgroundImage=m}null!=this.format&&(this.page.viewState.pageFormat=this.format);null!=this.mathEnabled&&(this.page.viewState.mathEnabled=this.mathEnabled);null!=this.shadowVisible&&(this.page.viewState.shadowVisible=this.shadowVisible)}}else z.apply(this,
 arguments),null!=this.mathEnabled&&this.mathEnabled!=this.ui.isMathEnabled()&&(this.ui.setMathEnabled(this.mathEnabled),this.mathEnabled=!this.mathEnabled),null!=this.shadowVisible&&this.shadowVisible!=this.ui.editor.graph.shadowVisible&&(this.ui.editor.graph.setShadowVisible(this.shadowVisible),this.shadowVisible=!this.shadowVisible)};Editor.prototype.useCanvasForExport=!1;try{var D=document.createElement("canvas"),M=new Image;M.onload=function(){try{D.getContext("2d").drawImage(M,0,0);var m=D.toDataURL("image/png");
 Editor.prototype.useCanvasForExport=null!=m&&6<m.length}catch(y){}};M.src="data:image/svg+xml;base64,"+btoa(unescape(encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1px" height="1px" version="1.1"><foreignObject pointer-events="all" width="1" height="1"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject></svg>')))}catch(m){}Editor.prototype.useCanvasForExport=!1})();
 (function(){var b=new mxObjectCodec(new ChangePageSetup,["ui","previousColor","previousImage","previousFormat"]);b.beforeDecode=function(e,f,c){c.ui=e.ui;return f};b.afterDecode=function(e,f,c){c.previousColor=c.color;c.previousImage=c.image;c.previousFormat=c.format;null!=c.foldingEnabled&&(c.foldingEnabled=!c.foldingEnabled);null!=c.mathEnabled&&(c.mathEnabled=!c.mathEnabled);null!=c.shadowVisible&&(c.shadowVisible=!c.shadowVisible);return c};mxCodecRegistry.register(b)})();
-(function(){var b=new mxObjectCodec(new ChangeGridColor,["ui"]);b.beforeDecode=function(e,f,c){c.ui=e.ui;return f};mxCodecRegistry.register(b)})();(function(){EditorUi.VERSION="21.4.1";EditorUi.compactUi="atlas"!=Editor.currentTheme;Editor.isDarkMode()&&(mxGraphView.prototype.gridColor=mxGraphView.prototype.defaultDarkGridColor);EditorUi.enableLogging="1"!=urlParams.stealth&&"1"!=urlParams.lockdown&&(/.*\.draw\.io$/.test(window.location.hostname)||/.*\.diagrams\.net$/.test(window.location.hostname))&&"support.draw.io"!=window.location.hostname;EditorUi.drawHost=window.DRAWIO_BASE_URL;EditorUi.lightboxHost=window.DRAWIO_LIGHTBOX_URL;
+(function(){var b=new mxObjectCodec(new ChangeGridColor,["ui"]);b.beforeDecode=function(e,f,c){c.ui=e.ui;return f};mxCodecRegistry.register(b)})();(function(){EditorUi.VERSION="21.5.0";EditorUi.compactUi="atlas"!=Editor.currentTheme;Editor.isDarkMode()&&(mxGraphView.prototype.gridColor=mxGraphView.prototype.defaultDarkGridColor);EditorUi.enableLogging="1"!=urlParams.stealth&&"1"!=urlParams.lockdown&&(/.*\.draw\.io$/.test(window.location.hostname)||/.*\.diagrams\.net$/.test(window.location.hostname))&&"support.draw.io"!=window.location.hostname;EditorUi.drawHost=window.DRAWIO_BASE_URL;EditorUi.lightboxHost=window.DRAWIO_LIGHTBOX_URL;
 EditorUi.lastErrorMessage=null;EditorUi.ignoredAnonymizedChars="\n\t`~!@#$%^&*()_+{}|:\"<>?-=[];'./,\n\t";EditorUi.templateFile=TEMPLATE_PATH+"/index.xml";EditorUi.cacheUrl=window.REALTIME_URL;null==EditorUi.cacheUrl&&"undefined"!==typeof DrawioFile&&(DrawioFile.SYNC="none");Editor.cacheTimeout=1E4;EditorUi.enablePlantUml=EditorUi.enableLogging;EditorUi.isElectronApp=null!=window&&null!=window.process&&null!=window.process.versions&&null!=window.process.versions.electron;EditorUi.nativeFileSupport=
 !mxClient.IS_OP&&!EditorUi.isElectronApp&&"1"!=urlParams.extAuth&&"showSaveFilePicker"in window&&"showOpenFilePicker"in window;EditorUi.enableDrafts=!mxClient.IS_CHROMEAPP&&isLocalStorage&&"0"!=urlParams.drafts;EditorUi.scratchpadHelpLink="https://www.drawio.com/doc/faq/scratchpad";EditorUi.enableHtmlEditOption=!0;EditorUi.mermaidDiagramTypes="flowchart classDiagram sequenceDiagram stateDiagram mindmap graph erDiagram requirementDiagram journey gantt pie gitGraph".split(" ");EditorUi.defaultMermaidConfig=
 {theme:"neutral",arrowMarkerAbsolute:!1,flowchart:{htmlLabels:!1},sequence:{diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,mirrorActors:!0,bottomMarginAdj:1,useMaxWidth:!0,rightAngles:!1,showSequenceNumbers:!1},gantt:{titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,leftPadding:75,gridLineStartPadding:35,fontSize:11,fontFamily:'"Open-Sans", "sans-serif"',numberSectionStyles:4,axisFormat:"%Y-%m-%d"}};EditorUi.logError=
 function(d,g,n,q,t,u,B){if(null!=d){t=null!=t?t:Error(d);t.stack=null!=t.stack?t.stack:"";u=null!=u?u:0>d.indexOf("NetworkError")&&0>d.indexOf("SecurityError")&&0>d.indexOf("NS_ERROR_FAILURE")&&0>d.indexOf("out of memory")?"SEVERE":"CONFIG";try{EditorUi.enableLogging&&"1"!=urlParams.dev&&d!=EditorUi.lastErrorMessage&&0>d.indexOf("extension:")&&0>t.stack.indexOf("extension:")&&0>t.stack.indexOf("<anonymous>:")&&(EditorUi.lastErrorMessage=d,(new Image).src=(null!=window.DRAWIO_LOG_URL?window.DRAWIO_LOG_URL:
 "")+"/log?severity="+u+"&v="+encodeURIComponent(EditorUi.VERSION)+"&msg=clientError:"+encodeURIComponent(d)+":url:"+encodeURIComponent(window.location.href)+":lnum:"+encodeURIComponent(n)+(null!=q?":colno:"+encodeURIComponent(q):"")+(""!=t.stack?"&stack="+encodeURIComponent(t.stack):""))}catch(F){}try{B||null==window.console||console.error(u,d,g,n,q,t)}catch(F){}}};EditorUi.logEvent=function(d){if("1"==urlParams.dev)EditorUi.debug("logEvent",d);else if(EditorUi.enableLogging)try{var g=null!=window.DRAWIO_LOG_URL?
@@ -12761,12 +12761,12 @@ c.constructor==DriveFile&&null!=c.desc&&null!=this.drive&&(k.label+=(null!=this.
 (new Image).src=mxGraph.prototype.warningImage.src;window.openWindow=mxUtils.bind(this,function(c,k,l){if("1"==urlParams.openInSameWin||navigator.standalone)null!=l&&l();else{var v=null;try{v=window.open(c)}catch(x){}null==v||void 0===v?this.showDialog((new PopupDialog(this,c,k,l)).container,320,140,!0,!0):null!=k&&k()}});this.updateDocumentTitle();this.updateUi();window.showOpenAlert=mxUtils.bind(this,function(c){null!=window.openFile&&window.openFile.cancel(!0);this.handleError(c)});this.editor.chromeless&&
 !this.editor.editable||this.addFileDropHandler([document]);if(null!=App.DrawPlugins){for(b=0;b<App.DrawPlugins.length;b++)try{App.DrawPlugins[b](this)}catch(c){null!=window.console&&console.log("Plugin Error:",c,App.DrawPlugins[b])}finally{App.embedModePluginsCount--,this.initializeEmbedMode()}window.Draw.loadPlugin=mxUtils.bind(this,function(c){try{c(this)}finally{App.embedModePluginsCount--,this.initializeEmbedMode()}});setTimeout(mxUtils.bind(this,function(){0<App.embedModePluginsCount&&(App.embedModePluginsCount=
 0,this.initializeEmbedMode())}),5E3)}this.load()};App.ERROR_TIMEOUT="timeout";App.ERROR_BUSY="busy";App.ERROR_UNKNOWN="unknown";App.MODE_GOOGLE="google";App.MODE_DROPBOX="dropbox";App.MODE_ONEDRIVE="onedrive";App.MODE_GITHUB="github";App.MODE_GITLAB="gitlab";App.MODE_DEVICE="device";App.MODE_BROWSER="browser";App.MODE_TRELLO="trello";App.MODE_EMBED="embed";App.MODE_ATLAS="atlas";App.DROPBOX_APPKEY=window.DRAWIO_DROPBOX_ID;App.DROPBOX_URL=window.DRAWIO_BASE_URL+"/js/dropbox/Dropbox-sdk.min.js";
 App.DROPINS_URL="https://www.dropbox.com/static/api/2/dropins.js";App.ONEDRIVE_URL=mxClient.IS_IE11?"https://js.live.net/v7.2/OneDrive.js":window.DRAWIO_BASE_URL+"/js/onedrive/OneDrive.js";App.TRELLO_URL="https://api.trello.com/1/client.js";App.TRELLO_JQUERY_URL=window.DRAWIO_BASE_URL+"/js/jquery/jquery-3.6.0.min.js";App.PUSHER_KEY="1e756b07a690c5bdb054";App.PUSHER_CLUSTER="eu";App.PUSHER_URL="https://js.pusher.com/7.0.3/pusher.min.js";App.SIMPLE_PEER_URL=window.DRAWIO_BASE_URL+"/js/simplepeer/simplepeer9.10.0.min.js";
 App.GOOGLE_APIS="drive-share";App.startTime=new Date;
-App.pluginRegistry={"4xAKTrabTpTzahoLthkwPNUn":"plugins/explore.js",ex:"plugins/explore.js",ac:"plugins/connect.js",acj:"plugins/connectJira.js",ac148:"plugins/cConf-1-4-8.js",ac148cmnt:"plugins/cConf-comments.js",nxtcld:"plugins/nextcloud.js",monday:"plugins/monday.js",voice:"plugins/voice.js",tips:"plugins/tooltips.js",svgdata:"plugins/svgdata.js",electron:"plugins/electron.js",number:"plugins/number.js",sql:"plugins/sql.js",props:"plugins/props.js",text:"plugins/text.js",anim:"plugins/animation.js",
-update:"plugins/update.js",trees:"plugins/trees/trees.js","import":"plugins/import.js",replay:"plugins/replay.js",anon:"plugins/anonymize.js",tr:"plugins/trello.js",f5:"plugins/rackF5.js",tickets:"plugins/tickets.js",flow:"plugins/flow.js",webcola:"plugins/webcola/webcola.js",rnd:"plugins/random.js",page:"plugins/page.js",gd:"plugins/googledrive.js",tags:"plugins/tags.js"};App.publicPlugin="ex voice tips svgdata number sql props text anim update trees replay anon tickets flow webcola tags".split(" ");
+App.pluginRegistry={"4xAKTrabTpTzahoLthkwPNUn":"plugins/explore.js",ex:"plugins/explore.js",ac:"plugins/connect.js",acj:"plugins/connectJira.js",ac148:"plugins/cConf-1-4-8.js",ac148cmnt:"plugins/cConf-comments.js",nxtcld:"plugins/nextcloud.js",monday:"plugins/monday.js",voice:"plugins/voice.js",tips:"plugins/tooltips.js",svgdata:"plugins/svgdata.js",number:"plugins/number.js",sql:"plugins/sql.js",props:"plugins/props.js",text:"plugins/text.js",anim:"plugins/animation.js",update:"plugins/update.js",
+trees:"plugins/trees/trees.js","import":"plugins/import.js",replay:"plugins/replay.js",anon:"plugins/anonymize.js",tr:"plugins/trello.js",f5:"plugins/rackF5.js",tickets:"plugins/tickets.js",flow:"plugins/flow.js",webcola:"plugins/webcola/webcola.js",rnd:"plugins/random.js",page:"plugins/page.js",gd:"plugins/googledrive.js",tags:"plugins/tags.js"};App.publicPlugin="ex voice tips svgdata number sql props text anim update trees replay anon tickets flow webcola tags".split(" ");
 App.loadScripts=function(b,e,f){for(var c=b.length,k=!1,l=0;l<b.length;l++)mxscript(b[l],function(){0!=--c||k||null==e||e()},null,null,null,function(v){k=!0;null!=f&&f(Error(v))})};
 App.getStoredMode=function(){var b=null;null==b&&isLocalStorage&&(b=localStorage.getItem(".mode"));if(null==b&&"undefined"!=typeof Storage){for(var e=document.cookie.split(";"),f=0;f<e.length;f++){var c=mxUtils.trim(e[f]);if("MODE="==c.substring(0,5)){b=c.substring(5);break}}null!=b&&isLocalStorage&&(e=new Date,e.setYear(e.getFullYear()-1),document.cookie="MODE=; expires="+e.toUTCString(),localStorage.setItem(".mode",b))}return b};
 (function(){mxClient.IS_CHROMEAPP||("1"!=urlParams.offline&&("db.draw.io"==window.location.hostname&&null==urlParams.mode&&(urlParams.mode="dropbox"),App.mode=urlParams.mode),null==App.mode&&(App.mode=App.getStoredMode()),null!=window.mxscript&&"1"!=urlParams.embed&&("function"===typeof window.DriveClient&&("0"!=urlParams.gapi&&isSvgBrowser&&(null==document.documentMode||10<=document.documentMode)?App.mode==App.MODE_GOOGLE||null!=urlParams.state&&""==window.location.hash||null!=window.location.hash&&
 "#G"==window.location.hash.substring(0,2)?mxscript("https://apis.google.com/js/api.js"):"0"!=urlParams.chrome||null!=window.location.hash&&"#Uhttps%3A%2F%2Fdrive.google.com%2Fuc%3Fid%3D"===window.location.hash.substring(0,45)||(window.DriveClient=null):window.DriveClient=null),"function"===typeof window.DropboxClient&&("0"!=urlParams.db&&isSvgBrowser&&(null==document.documentMode||9<document.documentMode)?App.mode==App.MODE_DROPBOX||null!=window.location.hash&&"#D"==window.location.hash.substring(0,
 2)?mxscript(App.DROPBOX_URL,function(){mxscript(App.DROPINS_URL,null,"dropboxjs",App.DROPBOX_APPKEY,!0)}):"0"==urlParams.chrome&&(window.DropboxClient=null):window.DropboxClient=null),"function"===typeof window.OneDriveClient&&("0"!=urlParams.od&&(null==navigator.userAgent||0>navigator.userAgent.indexOf("MSIE")||10<=document.documentMode)?App.mode==App.MODE_ONEDRIVE||null!=window.location.hash&&"#W"==window.location.hash.substring(0,2)?mxscript(App.ONEDRIVE_URL):"0"==urlParams.chrome&&(window.OneDriveClient=
diff --git a/src/main/webapp/js/diagramly/App.js b/src/main/webapp/js/diagramly/App.js
index bc85844c8c..9bf0aacb51 100644
--- a/src/main/webapp/js/diagramly/App.js
+++ b/src/main/webapp/js/diagramly/App.js
@@ -323,11 +323,10 @@ App.pluginRegistry = {'4xAKTrabTpTzahoLthkwPNUn': 'plugins/explore.js',
 	'ac148': 'plugins/cConf-1-4-8.js', 'ac148cmnt': 'plugins/cConf-comments.js', 
 	'nxtcld': 'plugins/nextcloud.js',
 	'monday': 'plugins/monday.js',
 	'voice': 'plugins/voice.js',
 	'tips': 'plugins/tooltips.js', 'svgdata': 'plugins/svgdata.js',
-	'electron': 'plugins/electron.js',
 	'number': 'plugins/number.js', 'sql': 'plugins/sql.js',
 	'props': 'plugins/props.js', 'text': 'plugins/text.js',
 	'anim': 'plugins/animation.js', 'update': 'plugins/update.js',
 	'trees': 'plugins/trees/trees.js', 'import': 'plugins/import.js',
 	'replay': 'plugins/replay.js', 'anon': 'plugins/anonymize.js',
@@ -713,11 +712,11 @@ App.main = function(callback, createUi)
 				// Checks bootstrap script
 				if (scripts != null && scripts.length > 0)
 				{
 					var content = mxUtils.getTextContent(scripts[0]);
 					
-					if (CryptoJS.MD5(content).toString() != '54e964166a638e485d475fdae66aa95d')
+					if (CryptoJS.MD5(content).toString() != '3428184eed5811f9c1458f703cb2806b')
 					{
 						console.log('Change bootstrap script MD5 in the previous line:', CryptoJS.MD5(content).toString());
 						alert('[Dev] Bootstrap script change requires update of CSP');
 					}
 				}
diff --git a/src/main/webapp/js/diagramly/Devel.js b/src/main/webapp/js/diagramly/Devel.js
index fbcc8eb45c..38fb626cce 100644
--- a/src/main/webapp/js/diagramly/Devel.js
+++ b/src/main/webapp/js/diagramly/Devel.js
@@ -15,12 +15,14 @@ if (!mxIsElectron && location.protocol !== 'http:')
 			// Below are the SHAs of the two script blocks in index.html.
 			// These must be updated here and in the CDN after changes.
 			//----------------------------------------------------------//
 			//------------- Bootstrap script in index.html -------------//
 			//----------------------------------------------------------//
+			// Version 21.5.0
+			'\'sha256-6zAB96lsBZREqf0sT44BhH1T69sm7HrN34rpMOcWbNo=\' ' +
 			// Version 21.4.1
-			'\'sha256-6g514VrT/cZFZltSaKxIVNFF46+MFaTSDTPB8WfYK+c=\' ' +
+			'\'sha256-3SkDBaLE+ouvAOfTmG2TGwmQ2EE9AT0F2YcHvZmEMeo=\' ' +
 			// Version 20.8.14
 			'\'sha256-vrEVJkYyBW9H4tt1lYZtK5fDowIeRwUgYZfFTT36YpE=\' ' +
 			// Version 20.8.12
 			'\'sha256-6g514VrT/cZFZltSaKxIVNFF46+MFaTSDTPB8WfYK+c=\' ' +
 			// Version 16.4.4
@@ -80,11 +82,11 @@ if (!mxIsElectron && location.protocol !== 'http:')
 		mxmeta(null, devCsp, 'Content-Security-Policy');
 
 		if (urlParams['print-csp'] == '1')
 		{
 			console.log('Content-Security-Policy');
-			var app_diagrams_net = csp.replace(/%script-src%/g, 'https://www.dropbox.com https://api.trello.com https://cdn.jsdelivr.net/npm/monday-sdk-js/dist/main.js').
+			var app_diagrams_net = csp.replace(/%script-src%/g, 'https://www.dropbox.com https://api.trello.com').
 				replace(/%connect-src%/g, 'https://*.dropboxapi.com https://api.trello.com').
 				replace(/%frame-src%/g, '').
 					replace(/%style-src%/g, '').
 					replace(/  /g, ' ') + ' frame-ancestors \'self\' https://teams.microsoft.com;';
 			console.log('app.diagrams.net:', app_diagrams_net);
@@ -98,10 +100,13 @@ if (!mxIsElectron && location.protocol !== 'http:')
 				'base-uri \'none\';' +
 				'object-src \'none\';' +
 				'worker-src https://viewer.diagrams.net/service-worker.js;'
 			console.log('viewer.diagrams.net:', viewer_diagrams_net);
 
+			var teams_diagrams_net = app_diagrams_net.replace(/ 'sha256-[^']+'/g, '') + 'worker-src https://app.diagrams.net/service-worker.js;';
+			console.log('teams.diagrams.net:', teams_diagrams_net);
+
 			var ac_draw_io = csp.replace(/%script-src%/g, 'https://aui-cdn.atlassian.com https://connect-cdn.atl-paas.net').
 					replace(/%frame-src%/g, 'https://www.lucidchart.com https://app.lucidchart.com https://lucid.app blob:').
 					replace(/%style-src%/g, 'https://aui-cdn.atlassian.com https://*.atlassian.net').
 					replace(/%connect-src%/g, '').
 					replace(/  /g, ' ') +
@@ -117,33 +122,10 @@ if (!mxIsElectron && location.protocol !== 'http:')
 			console.log('aj.draw.io:', aj_draw_io);
 
 			console.log('import.diagrams.net:', 'default-src \'self\'; worker-src blob:; img-src \'self\' blob: data: https://www.lucidchart.com ' +
 					'https://app.lucidchart.com https://lucid.app; style-src \'self\' \'unsafe-inline\'; frame-src https://www.lucidchart.com https://app.lucidchart.com https://lucid.app;');
 			console.log('Development:', devCsp);
-			
-			console.log('Header Worker:', 'let securityHeaders =', JSON.stringify({
-				online: {
-					"Content-Security-Policy" : app_diagrams_net,
-					"Permissions-Policy" : "microphone=()"
-				},
-				viewer: {
-					"Content-Security-Policy" : viewer_diagrams_net,
-					"Permissions-Policy" : "microphone=()",
-				},
-				teams: {
-					"Content-Security-Policy" : app_diagrams_net.replace(/ 'sha256-[^']+'/g, '') + 'worker-src https://app.diagrams.net/service-worker.js;',
-					"Permissions-Policy" : "microphone=()"
-				},
-				jira: {
-					"Content-Security-Policy" : aj_draw_io,
-					"Permissions-Policy" : "microphone=()"
-				},
-				conf: {
-					"Content-Security-Policy" : ac_draw_io,
-					"Permissions-Policy" : "microphone=()"
-				}
-			}, null, 4));
 
 			console.log('Remember to add index.html new hashes to Desktop app (electron.js). In desktop, only newest hashes are needed.');
 		}
 	})();
 }
diff --git a/src/main/webapp/js/export.js b/src/main/webapp/js/export.js
index fa903e8150..78e0304ae7 100644
--- a/src/main/webapp/js/export.js
+++ b/src/main/webapp/js/export.js
@@ -1,10 +1,36 @@
 var mxIsElectron = navigator.userAgent != null &&
-	navigator.userAgent.toLowerCase().indexOf(' electron/') > -1;
+	navigator.userAgent.toLowerCase().indexOf(' electron/') > -1 && 
+	navigator.userAgent.indexOf(' draw.io/') > -1;
 var GOOGLE_APPS_MAX_AREA = 25000000;
 var GOOGLE_SHEET_MAX_AREA = 1048576; //1024x1024
 
+/**
+ * Adds meta tag to the page.
+ */
+function mxmeta(content, httpEquiv)
+{
+	try
+	{
+		var s = document.createElement('meta');
+		
+		s.setAttribute('content', content);
+		s.setAttribute('http-equiv', httpEquiv);
+
+		var t = document.getElementsByTagName('meta')[0];
+		t.parentNode.insertBefore(s, t);
+	}
+	catch (e)
+	{
+		// ignore
+	}
+};
+
+if (mxIsElectron)
+{
+	mxmeta('default-src \'self\'; script-src \'self\'; connect-src \'self\' https://*.draw.io https://*.diagrams.net https://fonts.googleapis.com https://fonts.gstatic.com; img-src * data:; media-src *; font-src *; frame-src \'none\'; style-src \'self\' \'unsafe-inline\' https://fonts.googleapis.com; base-uri \'none\';child-src \'self\';object-src \'none\';', 'Content-Security-Policy');
+}
 //TODO Add support for loading math from a local folder
 Editor.initMath((remoteMath? 'https://app.diagrams.net/' : '') + 'math/es5/startup.js');
 
 function render(data)
 {
diff --git a/src/main/webapp/js/integrate.min.js b/src/main/webapp/js/integrate.min.js
index 9b1e74613f..db2fee43fd 100644
--- a/src/main/webapp/js/integrate.min.js
+++ b/src/main/webapp/js/integrate.min.js
@@ -144,11 +144,11 @@ window.uiTheme=window.uiTheme||function(){var a=urlParams.ui;"1"==urlParams.extA
 a),DRAWIO_GITLAB_URL=a);a=urlParams["gitlab-id"];null!=a&&(DRAWIO_GITLAB_ID=a);window.DRAWIO_LOG_URL=window.DRAWIO_LOG_URL||"";a=window.location.host;if("test.draw.io"!=a){var c="diagrams.net";b=a.length-c.length;c=a.lastIndexOf(c,b);-1!==c&&c===b?window.DRAWIO_LOG_URL="https://log.diagrams.net":(c="draw.io",b=a.length-c.length,c=a.lastIndexOf(c,b),-1!==c&&c===b&&(window.DRAWIO_LOG_URL="https://log.draw.io"))}})();
 if("1"==urlParams.offline||"1"==urlParams.demo||"1"==urlParams.stealth||"1"==urlParams.local||"1"==urlParams.lockdown)urlParams.picker="0",urlParams.gapi="0",urlParams.db="0",urlParams.od="0",urlParams.gh="0",urlParams.gl="0",urlParams.tr="0";
 "se.diagrams.net"==window.location.hostname&&(urlParams.db="0",urlParams.od="0",urlParams.gh="0",urlParams.gl="0",urlParams.tr="0",urlParams.plugins="0",urlParams.mode="google",urlParams.lockdown="1",window.DRAWIO_GOOGLE_APP_ID=window.DRAWIO_GOOGLE_APP_ID||"184079235871",window.DRAWIO_GOOGLE_CLIENT_ID=window.DRAWIO_GOOGLE_CLIENT_ID||"184079235871-pjf5nn0lff27lk8qf0770gmffiv9gt61.apps.googleusercontent.com");"trello"==urlParams.mode&&(urlParams.tr="1");
 "embed.diagrams.net"==window.location.hostname&&(urlParams.embed="1");(null==window.location.hash||1>=window.location.hash.length)&&null!=urlParams.open&&(window.location.hash=urlParams.open);window.urlParams=window.urlParams||{};window.DOM_PURIFY_CONFIG=window.DOM_PURIFY_CONFIG||{ADD_TAGS:["use"],FORBID_TAGS:["form"],ALLOWED_URI_REGEXP:/^((?!javascript:).)*$/i,ADD_ATTR:["target","content"]};window.MAX_REQUEST_SIZE=window.MAX_REQUEST_SIZE||10485760;window.MAX_AREA=window.MAX_AREA||225E6;window.EXPORT_URL=window.EXPORT_URL||"/export";window.SAVE_URL=window.SAVE_URL||"/save";window.OPEN_URL=window.OPEN_URL||"/open";window.RESOURCES_PATH=window.RESOURCES_PATH||"resources";
 window.RESOURCE_BASE=window.RESOURCE_BASE||window.RESOURCES_PATH+"/grapheditor";window.STENCIL_PATH=window.STENCIL_PATH||"stencils";window.IMAGE_PATH=window.IMAGE_PATH||"images";window.STYLE_PATH=window.STYLE_PATH||"styles";window.CSS_PATH=window.CSS_PATH||"styles";window.OPEN_FORM=window.OPEN_FORM||"open.html";window.mxBasePath=window.mxBasePath||"mxgraph";window.mxImageBasePath=window.mxImageBasePath||"mxgraph/images";window.mxLanguage=window.mxLanguage||urlParams.lang;
-window.mxLanguages=window.mxLanguages||["de","se"];var mxClient={VERSION:"21.4.1",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
+window.mxLanguages=window.mxLanguages||["de","se"];var mxClient={VERSION:"21.5.0",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
 IS_OP:null!=navigator.userAgent&&(0<=navigator.userAgent.indexOf("Opera/")||0<=navigator.userAgent.indexOf("OPR/")),IS_OT:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Presto/")&&0>navigator.userAgent.indexOf("Presto/2.4.")&&0>navigator.userAgent.indexOf("Presto/2.3.")&&0>navigator.userAgent.indexOf("Presto/2.2.")&&0>navigator.userAgent.indexOf("Presto/2.1.")&&0>navigator.userAgent.indexOf("Presto/2.0.")&&0>navigator.userAgent.indexOf("Presto/1."),IS_SF:/Apple Computer, Inc/.test(navigator.vendor),
 IS_ANDROID:0<=navigator.appVersion.indexOf("Android"),IS_IOS:/iP(hone|od|ad)/.test(navigator.platform)||navigator.userAgent.match(/Mac/)&&navigator.maxTouchPoints&&2<navigator.maxTouchPoints,IS_WEBVIEW:/((iPhone|iPod|iPad).*AppleWebKit(?!.*Version)|; wv)/i.test(navigator.userAgent),IS_GC:/Google Inc/.test(navigator.vendor),IS_CHROMEAPP:null!=window.chrome&&null!=chrome.app&&null!=chrome.app.runtime,IS_FF:-1<navigator.userAgent.toLowerCase().indexOf("firefox"),IS_MT:0<=navigator.userAgent.indexOf("Firefox/")&&
 0>navigator.userAgent.indexOf("Firefox/1.")&&0>navigator.userAgent.indexOf("Firefox/2.")||0<=navigator.userAgent.indexOf("Iceweasel/")&&0>navigator.userAgent.indexOf("Iceweasel/1.")&&0>navigator.userAgent.indexOf("Iceweasel/2.")||0<=navigator.userAgent.indexOf("SeaMonkey/")&&0>navigator.userAgent.indexOf("SeaMonkey/1.")||0<=navigator.userAgent.indexOf("Iceape/")&&0>navigator.userAgent.indexOf("Iceape/1."),IS_SVG:"MICROSOFT INTERNET EXPLORER"!=navigator.appName.toUpperCase(),NO_FO:!document.createElementNS||
 "[object SVGForeignObjectElement]"!==document.createElementNS("http://www.w3.org/2000/svg","foreignObject").toString()||0<=navigator.userAgent.indexOf("Opera/"),IS_WIN:0<navigator.appVersion.indexOf("Win"),IS_MAC:0<navigator.appVersion.indexOf("Mac"),IS_CHROMEOS:/\bCrOS\b/.test(navigator.appVersion),IS_LINUX:/\bLinux\b/.test(navigator.appVersion),IS_TOUCH:"ontouchstart"in document.documentElement,IS_POINTER:null!=window.PointerEvent&&!(0<navigator.appVersion.indexOf("Mac")),IS_LOCAL:0>document.location.href.indexOf("http://")&&
 0>document.location.href.indexOf("https://"),defaultBundles:[],isBrowserSupported:function(){return mxClient.IS_SVG},link:function(a,b,c,d){c=c||document;var e=c.createElement("link");e.setAttribute("rel",a);e.setAttribute("href",b);e.setAttribute("charset","UTF-8");e.setAttribute("type","text/css");d&&e.setAttribute("id",d);c.getElementsByTagName("head")[0].appendChild(e)},loadResources:function(a,b){function c(){0==--d&&a()}for(var d=mxClient.defaultBundles.length,e=0;e<mxClient.defaultBundles.length;e++)mxResources.add(mxClient.defaultBundles[e],
@@ -11734,11 +11734,11 @@ Ea.style.cssText="margin:0 8px 0 8px;";Ea.setAttribute("value","100 %");Ea.style
 PrintDialog.previewEnabled&&(aa=mxUtils.button(mxResources.get("preview"),function(){g.hideDialog();M(!1)}),aa.className="geBtn",x.appendChild(aa));aa=mxUtils.button(mxResources.get(PrintDialog.previewEnabled?"print":"ok"),function(){g.hideDialog();M(!0)});aa.className="geBtn gePrimaryBtn";x.appendChild(aa);g.editor.cancelFirst||x.appendChild(W);S.appendChild(x);this.container=S};var v=ChangePageSetup.prototype.execute;ChangePageSetup.prototype.execute=function(){null==this.page&&(this.page=this.ui.currentPage);
 if(this.page!=this.ui.currentPage){if(null!=this.page.viewState){this.ignoreColor||(this.page.viewState.background=this.color);if(!this.ignoreImage){var g=this.image;null!=g&&null!=g.src&&Graph.isPageLink(g.src)&&(g={originalSrc:g.src});this.page.viewState.backgroundImage=g}null!=this.format&&(this.page.viewState.pageFormat=this.format);null!=this.mathEnabled&&(this.page.viewState.mathEnabled=this.mathEnabled);null!=this.shadowVisible&&(this.page.viewState.shadowVisible=this.shadowVisible)}}else v.apply(this,
 arguments),null!=this.mathEnabled&&this.mathEnabled!=this.ui.isMathEnabled()&&(this.ui.setMathEnabled(this.mathEnabled),this.mathEnabled=!this.mathEnabled),null!=this.shadowVisible&&this.shadowVisible!=this.ui.editor.graph.shadowVisible&&(this.ui.editor.graph.setShadowVisible(this.shadowVisible),this.shadowVisible=!this.shadowVisible)};Editor.prototype.useCanvasForExport=!1;try{var z=document.createElement("canvas"),I=new Image;I.onload=function(){try{z.getContext("2d").drawImage(I,0,0);var g=z.toDataURL("image/png");
 Editor.prototype.useCanvasForExport=null!=g&&6<g.length}catch(x){}};I.src="data:image/svg+xml;base64,"+btoa(unescape(encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1px" height="1px" version="1.1"><foreignObject pointer-events="all" width="1" height="1"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject></svg>')))}catch(g){}Editor.prototype.useCanvasForExport=!1})();
 (function(){var b=new mxObjectCodec(new ChangePageSetup,["ui","previousColor","previousImage","previousFormat"]);b.beforeDecode=function(f,l,d){d.ui=f.ui;return l};b.afterDecode=function(f,l,d){d.previousColor=d.color;d.previousImage=d.image;d.previousFormat=d.format;null!=d.foldingEnabled&&(d.foldingEnabled=!d.foldingEnabled);null!=d.mathEnabled&&(d.mathEnabled=!d.mathEnabled);null!=d.shadowVisible&&(d.shadowVisible=!d.shadowVisible);return d};mxCodecRegistry.register(b)})();
-(function(){var b=new mxObjectCodec(new ChangeGridColor,["ui"]);b.beforeDecode=function(f,l,d){d.ui=f.ui;return l};mxCodecRegistry.register(b)})();(function(){EditorUi.VERSION="21.4.1";EditorUi.compactUi="atlas"!=Editor.currentTheme;Editor.isDarkMode()&&(mxGraphView.prototype.gridColor=mxGraphView.prototype.defaultDarkGridColor);EditorUi.enableLogging="1"!=urlParams.stealth&&"1"!=urlParams.lockdown&&(/.*\.draw\.io$/.test(window.location.hostname)||/.*\.diagrams\.net$/.test(window.location.hostname))&&"support.draw.io"!=window.location.hostname;EditorUi.drawHost=window.DRAWIO_BASE_URL;EditorUi.lightboxHost=window.DRAWIO_LIGHTBOX_URL;
+(function(){var b=new mxObjectCodec(new ChangeGridColor,["ui"]);b.beforeDecode=function(f,l,d){d.ui=f.ui;return l};mxCodecRegistry.register(b)})();(function(){EditorUi.VERSION="21.5.0";EditorUi.compactUi="atlas"!=Editor.currentTheme;Editor.isDarkMode()&&(mxGraphView.prototype.gridColor=mxGraphView.prototype.defaultDarkGridColor);EditorUi.enableLogging="1"!=urlParams.stealth&&"1"!=urlParams.lockdown&&(/.*\.draw\.io$/.test(window.location.hostname)||/.*\.diagrams\.net$/.test(window.location.hostname))&&"support.draw.io"!=window.location.hostname;EditorUi.drawHost=window.DRAWIO_BASE_URL;EditorUi.lightboxHost=window.DRAWIO_LIGHTBOX_URL;
 EditorUi.lastErrorMessage=null;EditorUi.ignoredAnonymizedChars="\n\t`~!@#$%^&*()_+{}|:\"<>?-=[];'./,\n\t";EditorUi.templateFile=TEMPLATE_PATH+"/index.xml";EditorUi.cacheUrl=window.REALTIME_URL;null==EditorUi.cacheUrl&&"undefined"!==typeof DrawioFile&&(DrawioFile.SYNC="none");Editor.cacheTimeout=1E4;EditorUi.enablePlantUml=EditorUi.enableLogging;EditorUi.isElectronApp=null!=window&&null!=window.process&&null!=window.process.versions&&null!=window.process.versions.electron;EditorUi.nativeFileSupport=
 !mxClient.IS_OP&&!EditorUi.isElectronApp&&"1"!=urlParams.extAuth&&"showSaveFilePicker"in window&&"showOpenFilePicker"in window;EditorUi.enableDrafts=!mxClient.IS_CHROMEAPP&&isLocalStorage&&"0"!=urlParams.drafts;EditorUi.scratchpadHelpLink="https://www.drawio.com/doc/faq/scratchpad";EditorUi.enableHtmlEditOption=!0;EditorUi.mermaidDiagramTypes="flowchart classDiagram sequenceDiagram stateDiagram mindmap graph erDiagram requirementDiagram journey gantt pie gitGraph".split(" ");EditorUi.defaultMermaidConfig=
 {theme:"neutral",arrowMarkerAbsolute:!1,flowchart:{htmlLabels:!1},sequence:{diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,mirrorActors:!0,bottomMarginAdj:1,useMaxWidth:!0,rightAngles:!1,showSequenceNumbers:!1},gantt:{titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,leftPadding:75,gridLineStartPadding:35,fontSize:11,fontFamily:'"Open-Sans", "sans-serif"',numberSectionStyles:4,axisFormat:"%Y-%m-%d"}};EditorUi.logError=
 function(c,e,k,p,n,q,y){if(null!=c){n=null!=n?n:Error(c);n.stack=null!=n.stack?n.stack:"";q=null!=q?q:0>c.indexOf("NetworkError")&&0>c.indexOf("SecurityError")&&0>c.indexOf("NS_ERROR_FAILURE")&&0>c.indexOf("out of memory")?"SEVERE":"CONFIG";try{EditorUi.enableLogging&&"1"!=urlParams.dev&&c!=EditorUi.lastErrorMessage&&0>c.indexOf("extension:")&&0>n.stack.indexOf("extension:")&&0>n.stack.indexOf("<anonymous>:")&&(EditorUi.lastErrorMessage=c,(new Image).src=(null!=window.DRAWIO_LOG_URL?window.DRAWIO_LOG_URL:
 "")+"/log?severity="+q+"&v="+encodeURIComponent(EditorUi.VERSION)+"&msg=clientError:"+encodeURIComponent(c)+":url:"+encodeURIComponent(window.location.href)+":lnum:"+encodeURIComponent(k)+(null!=p?":colno:"+encodeURIComponent(p):"")+(""!=n.stack?"&stack="+encodeURIComponent(n.stack):""))}catch(B){}try{y||null==window.console||console.error(q,c,e,k,p,n)}catch(B){}}};EditorUi.logEvent=function(c){if("1"==urlParams.dev)EditorUi.debug("logEvent",c);else if(EditorUi.enableLogging)try{var e=null!=window.DRAWIO_LOG_URL?
@@ -12443,12 +12443,12 @@ d.constructor==DriveFile&&null!=d.desc&&null!=this.drive&&(t.label+=(null!=this.
 (new Image).src=mxGraph.prototype.warningImage.src;window.openWindow=mxUtils.bind(this,function(d,t,u){if("1"==urlParams.openInSameWin||navigator.standalone)null!=u&&u();else{var A=null;try{A=window.open(d)}catch(D){}null==A||void 0===A?this.showDialog((new PopupDialog(this,d,t,u)).container,320,140,!0,!0):null!=t&&t()}});this.updateDocumentTitle();this.updateUi();window.showOpenAlert=mxUtils.bind(this,function(d){null!=window.openFile&&window.openFile.cancel(!0);this.handleError(d)});this.editor.chromeless&&
 !this.editor.editable||this.addFileDropHandler([document]);if(null!=App.DrawPlugins){for(b=0;b<App.DrawPlugins.length;b++)try{App.DrawPlugins[b](this)}catch(d){null!=window.console&&console.log("Plugin Error:",d,App.DrawPlugins[b])}finally{App.embedModePluginsCount--,this.initializeEmbedMode()}window.Draw.loadPlugin=mxUtils.bind(this,function(d){try{d(this)}finally{App.embedModePluginsCount--,this.initializeEmbedMode()}});setTimeout(mxUtils.bind(this,function(){0<App.embedModePluginsCount&&(App.embedModePluginsCount=
 0,this.initializeEmbedMode())}),5E3)}this.load()};App.ERROR_TIMEOUT="timeout";App.ERROR_BUSY="busy";App.ERROR_UNKNOWN="unknown";App.MODE_GOOGLE="google";App.MODE_DROPBOX="dropbox";App.MODE_ONEDRIVE="onedrive";App.MODE_GITHUB="github";App.MODE_GITLAB="gitlab";App.MODE_DEVICE="device";App.MODE_BROWSER="browser";App.MODE_TRELLO="trello";App.MODE_EMBED="embed";App.MODE_ATLAS="atlas";App.DROPBOX_APPKEY=window.DRAWIO_DROPBOX_ID;App.DROPBOX_URL=window.DRAWIO_BASE_URL+"/js/dropbox/Dropbox-sdk.min.js";
 App.DROPINS_URL="https://www.dropbox.com/static/api/2/dropins.js";App.ONEDRIVE_URL=mxClient.IS_IE11?"https://js.live.net/v7.2/OneDrive.js":window.DRAWIO_BASE_URL+"/js/onedrive/OneDrive.js";App.TRELLO_URL="https://api.trello.com/1/client.js";App.TRELLO_JQUERY_URL=window.DRAWIO_BASE_URL+"/js/jquery/jquery-3.6.0.min.js";App.PUSHER_KEY="1e756b07a690c5bdb054";App.PUSHER_CLUSTER="eu";App.PUSHER_URL="https://js.pusher.com/7.0.3/pusher.min.js";App.SIMPLE_PEER_URL=window.DRAWIO_BASE_URL+"/js/simplepeer/simplepeer9.10.0.min.js";
 App.GOOGLE_APIS="drive-share";App.startTime=new Date;
-App.pluginRegistry={"4xAKTrabTpTzahoLthkwPNUn":"plugins/explore.js",ex:"plugins/explore.js",ac:"plugins/connect.js",acj:"plugins/connectJira.js",ac148:"plugins/cConf-1-4-8.js",ac148cmnt:"plugins/cConf-comments.js",nxtcld:"plugins/nextcloud.js",monday:"plugins/monday.js",voice:"plugins/voice.js",tips:"plugins/tooltips.js",svgdata:"plugins/svgdata.js",electron:"plugins/electron.js",number:"plugins/number.js",sql:"plugins/sql.js",props:"plugins/props.js",text:"plugins/text.js",anim:"plugins/animation.js",
-update:"plugins/update.js",trees:"plugins/trees/trees.js","import":"plugins/import.js",replay:"plugins/replay.js",anon:"plugins/anonymize.js",tr:"plugins/trello.js",f5:"plugins/rackF5.js",tickets:"plugins/tickets.js",flow:"plugins/flow.js",webcola:"plugins/webcola/webcola.js",rnd:"plugins/random.js",page:"plugins/page.js",gd:"plugins/googledrive.js",tags:"plugins/tags.js"};App.publicPlugin="ex voice tips svgdata number sql props text anim update trees replay anon tickets flow webcola tags".split(" ");
+App.pluginRegistry={"4xAKTrabTpTzahoLthkwPNUn":"plugins/explore.js",ex:"plugins/explore.js",ac:"plugins/connect.js",acj:"plugins/connectJira.js",ac148:"plugins/cConf-1-4-8.js",ac148cmnt:"plugins/cConf-comments.js",nxtcld:"plugins/nextcloud.js",monday:"plugins/monday.js",voice:"plugins/voice.js",tips:"plugins/tooltips.js",svgdata:"plugins/svgdata.js",number:"plugins/number.js",sql:"plugins/sql.js",props:"plugins/props.js",text:"plugins/text.js",anim:"plugins/animation.js",update:"plugins/update.js",
+trees:"plugins/trees/trees.js","import":"plugins/import.js",replay:"plugins/replay.js",anon:"plugins/anonymize.js",tr:"plugins/trello.js",f5:"plugins/rackF5.js",tickets:"plugins/tickets.js",flow:"plugins/flow.js",webcola:"plugins/webcola/webcola.js",rnd:"plugins/random.js",page:"plugins/page.js",gd:"plugins/googledrive.js",tags:"plugins/tags.js"};App.publicPlugin="ex voice tips svgdata number sql props text anim update trees replay anon tickets flow webcola tags".split(" ");
 App.loadScripts=function(b,f,l){for(var d=b.length,t=!1,u=0;u<b.length;u++)mxscript(b[u],function(){0!=--d||t||null==f||f()},null,null,null,function(A){t=!0;null!=l&&l(Error(A))})};
 App.getStoredMode=function(){var b=null;null==b&&isLocalStorage&&(b=localStorage.getItem(".mode"));if(null==b&&"undefined"!=typeof Storage){for(var f=document.cookie.split(";"),l=0;l<f.length;l++){var d=mxUtils.trim(f[l]);if("MODE="==d.substring(0,5)){b=d.substring(5);break}}null!=b&&isLocalStorage&&(f=new Date,f.setYear(f.getFullYear()-1),document.cookie="MODE=; expires="+f.toUTCString(),localStorage.setItem(".mode",b))}return b};
 (function(){mxClient.IS_CHROMEAPP||("1"!=urlParams.offline&&("db.draw.io"==window.location.hostname&&null==urlParams.mode&&(urlParams.mode="dropbox"),App.mode=urlParams.mode),null==App.mode&&(App.mode=App.getStoredMode()),null!=window.mxscript&&"1"!=urlParams.embed&&("function"===typeof window.DriveClient&&("0"!=urlParams.gapi&&isSvgBrowser&&(null==document.documentMode||10<=document.documentMode)?App.mode==App.MODE_GOOGLE||null!=urlParams.state&&""==window.location.hash||null!=window.location.hash&&
 "#G"==window.location.hash.substring(0,2)?mxscript("https://apis.google.com/js/api.js"):"0"!=urlParams.chrome||null!=window.location.hash&&"#Uhttps%3A%2F%2Fdrive.google.com%2Fuc%3Fid%3D"===window.location.hash.substring(0,45)||(window.DriveClient=null):window.DriveClient=null),"function"===typeof window.DropboxClient&&("0"!=urlParams.db&&isSvgBrowser&&(null==document.documentMode||9<document.documentMode)?App.mode==App.MODE_DROPBOX||null!=window.location.hash&&"#D"==window.location.hash.substring(0,
 2)?mxscript(App.DROPBOX_URL,function(){mxscript(App.DROPINS_URL,null,"dropboxjs",App.DROPBOX_APPKEY,!0)}):"0"==urlParams.chrome&&(window.DropboxClient=null):window.DropboxClient=null),"function"===typeof window.OneDriveClient&&("0"!=urlParams.od&&(null==navigator.userAgent||0>navigator.userAgent.indexOf("MSIE")||10<=document.documentMode)?App.mode==App.MODE_ONEDRIVE||null!=window.location.hash&&"#W"==window.location.hash.substring(0,2)?mxscript(App.ONEDRIVE_URL):"0"==urlParams.chrome&&(window.OneDriveClient=
diff --git a/src/main/webapp/js/viewer-static.min.js b/src/main/webapp/js/viewer-static.min.js
index a3169cc111..3e78a7f104 100644
--- a/src/main/webapp/js/viewer-static.min.js
+++ b/src/main/webapp/js/viewer-static.min.js
@@ -110,11 +110,11 @@ window.uiTheme=window.uiTheme||function(){var a=urlParams.ui;"1"==urlParams.extA
 a),DRAWIO_GITLAB_URL=a);a=urlParams["gitlab-id"];null!=a&&(DRAWIO_GITLAB_ID=a);window.DRAWIO_LOG_URL=window.DRAWIO_LOG_URL||"";a=window.location.host;if("test.draw.io"!=a){var c="diagrams.net";b=a.length-c.length;c=a.lastIndexOf(c,b);-1!==c&&c===b?window.DRAWIO_LOG_URL="https://log.diagrams.net":(c="draw.io",b=a.length-c.length,c=a.lastIndexOf(c,b),-1!==c&&c===b&&(window.DRAWIO_LOG_URL="https://log.draw.io"))}})();
 if("1"==urlParams.offline||"1"==urlParams.demo||"1"==urlParams.stealth||"1"==urlParams.local||"1"==urlParams.lockdown)urlParams.picker="0",urlParams.gapi="0",urlParams.db="0",urlParams.od="0",urlParams.gh="0",urlParams.gl="0",urlParams.tr="0";
 "se.diagrams.net"==window.location.hostname&&(urlParams.db="0",urlParams.od="0",urlParams.gh="0",urlParams.gl="0",urlParams.tr="0",urlParams.plugins="0",urlParams.mode="google",urlParams.lockdown="1",window.DRAWIO_GOOGLE_APP_ID=window.DRAWIO_GOOGLE_APP_ID||"184079235871",window.DRAWIO_GOOGLE_CLIENT_ID=window.DRAWIO_GOOGLE_CLIENT_ID||"184079235871-pjf5nn0lff27lk8qf0770gmffiv9gt61.apps.googleusercontent.com");"trello"==urlParams.mode&&(urlParams.tr="1");
 "embed.diagrams.net"==window.location.hostname&&(urlParams.embed="1");(null==window.location.hash||1>=window.location.hash.length)&&null!=urlParams.open&&(window.location.hash=urlParams.open);window.urlParams=window.urlParams||{};window.DOM_PURIFY_CONFIG=window.DOM_PURIFY_CONFIG||{ADD_TAGS:["use"],FORBID_TAGS:["form"],ALLOWED_URI_REGEXP:/^((?!javascript:).)*$/i,ADD_ATTR:["target","content"]};window.MAX_REQUEST_SIZE=window.MAX_REQUEST_SIZE||10485760;window.MAX_AREA=window.MAX_AREA||225E6;window.EXPORT_URL=window.EXPORT_URL||"/export";window.SAVE_URL=window.SAVE_URL||"/save";window.OPEN_URL=window.OPEN_URL||"/open";window.RESOURCES_PATH=window.RESOURCES_PATH||"resources";
 window.RESOURCE_BASE=window.RESOURCE_BASE||window.RESOURCES_PATH+"/grapheditor";window.STENCIL_PATH=window.STENCIL_PATH||"stencils";window.IMAGE_PATH=window.IMAGE_PATH||"images";window.STYLE_PATH=window.STYLE_PATH||"styles";window.CSS_PATH=window.CSS_PATH||"styles";window.OPEN_FORM=window.OPEN_FORM||"open.html";window.mxBasePath=window.mxBasePath||"mxgraph";window.mxImageBasePath=window.mxImageBasePath||"mxgraph/images";window.mxLanguage=window.mxLanguage||urlParams.lang;
-window.mxLanguages=window.mxLanguages||["de","se"];var mxClient={VERSION:"21.4.1",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
+window.mxLanguages=window.mxLanguages||["de","se"];var mxClient={VERSION:"21.5.0",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
 IS_OP:null!=navigator.userAgent&&(0<=navigator.userAgent.indexOf("Opera/")||0<=navigator.userAgent.indexOf("OPR/")),IS_OT:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Presto/")&&0>navigator.userAgent.indexOf("Presto/2.4.")&&0>navigator.userAgent.indexOf("Presto/2.3.")&&0>navigator.userAgent.indexOf("Presto/2.2.")&&0>navigator.userAgent.indexOf("Presto/2.1.")&&0>navigator.userAgent.indexOf("Presto/2.0.")&&0>navigator.userAgent.indexOf("Presto/1."),IS_SF:/Apple Computer, Inc/.test(navigator.vendor),
 IS_ANDROID:0<=navigator.appVersion.indexOf("Android"),IS_IOS:/iP(hone|od|ad)/.test(navigator.platform)||navigator.userAgent.match(/Mac/)&&navigator.maxTouchPoints&&2<navigator.maxTouchPoints,IS_WEBVIEW:/((iPhone|iPod|iPad).*AppleWebKit(?!.*Version)|; wv)/i.test(navigator.userAgent),IS_GC:/Google Inc/.test(navigator.vendor),IS_CHROMEAPP:null!=window.chrome&&null!=chrome.app&&null!=chrome.app.runtime,IS_FF:-1<navigator.userAgent.toLowerCase().indexOf("firefox"),IS_MT:0<=navigator.userAgent.indexOf("Firefox/")&&
 0>navigator.userAgent.indexOf("Firefox/1.")&&0>navigator.userAgent.indexOf("Firefox/2.")||0<=navigator.userAgent.indexOf("Iceweasel/")&&0>navigator.userAgent.indexOf("Iceweasel/1.")&&0>navigator.userAgent.indexOf("Iceweasel/2.")||0<=navigator.userAgent.indexOf("SeaMonkey/")&&0>navigator.userAgent.indexOf("SeaMonkey/1.")||0<=navigator.userAgent.indexOf("Iceape/")&&0>navigator.userAgent.indexOf("Iceape/1."),IS_SVG:"MICROSOFT INTERNET EXPLORER"!=navigator.appName.toUpperCase(),NO_FO:!document.createElementNS||
 "[object SVGForeignObjectElement]"!==document.createElementNS("http://www.w3.org/2000/svg","foreignObject").toString()||0<=navigator.userAgent.indexOf("Opera/"),IS_WIN:0<navigator.appVersion.indexOf("Win"),IS_MAC:0<navigator.appVersion.indexOf("Mac"),IS_CHROMEOS:/\bCrOS\b/.test(navigator.appVersion),IS_LINUX:/\bLinux\b/.test(navigator.appVersion),IS_TOUCH:"ontouchstart"in document.documentElement,IS_POINTER:null!=window.PointerEvent&&!(0<navigator.appVersion.indexOf("Mac")),IS_LOCAL:0>document.location.href.indexOf("http://")&&
 0>document.location.href.indexOf("https://"),defaultBundles:[],isBrowserSupported:function(){return mxClient.IS_SVG},link:function(a,b,c,d){c=c||document;var e=c.createElement("link");e.setAttribute("rel",a);e.setAttribute("href",b);e.setAttribute("charset","UTF-8");e.setAttribute("type","text/css");d&&e.setAttribute("id",d);c.getElementsByTagName("head")[0].appendChild(e)},loadResources:function(a,b){function c(){0==--d&&a()}for(var d=mxClient.defaultBundles.length,e=0;e<mxClient.defaultBundles.length;e++)mxResources.add(mxClient.defaultBundles[e],
@@ -3469,11 +3469,11 @@ Z.appendChild(ba);z=document.createElement("div");z.style.cssText="text-align:ri
 X(!1)}),za.className="geBtn",z.appendChild(za));za=mxUtils.button(mxResources.get(PrintDialog.previewEnabled?"print":"ok"),function(){k.hideDialog();X(!0)});za.className="geBtn gePrimaryBtn";z.appendChild(za);k.editor.cancelFirst||z.appendChild(ba);Z.appendChild(z);this.container=Z};var W=ChangePageSetup.prototype.execute;ChangePageSetup.prototype.execute=function(){null==this.page&&(this.page=this.ui.currentPage);if(this.page!=this.ui.currentPage){if(null!=this.page.viewState){this.ignoreColor||
 (this.page.viewState.background=this.color);if(!this.ignoreImage){var k=this.image;null!=k&&null!=k.src&&Graph.isPageLink(k.src)&&(k={originalSrc:k.src});this.page.viewState.backgroundImage=k}null!=this.format&&(this.page.viewState.pageFormat=this.format);null!=this.mathEnabled&&(this.page.viewState.mathEnabled=this.mathEnabled);null!=this.shadowVisible&&(this.page.viewState.shadowVisible=this.shadowVisible)}}else W.apply(this,arguments),null!=this.mathEnabled&&this.mathEnabled!=this.ui.isMathEnabled()&&
 (this.ui.setMathEnabled(this.mathEnabled),this.mathEnabled=!this.mathEnabled),null!=this.shadowVisible&&this.shadowVisible!=this.ui.editor.graph.shadowVisible&&(this.ui.editor.graph.setShadowVisible(this.shadowVisible),this.shadowVisible=!this.shadowVisible)};Editor.prototype.useCanvasForExport=!1;try{var P=document.createElement("canvas"),U=new Image;U.onload=function(){try{P.getContext("2d").drawImage(U,0,0);var k=P.toDataURL("image/png");Editor.prototype.useCanvasForExport=null!=k&&6<k.length}catch(z){}};
 U.src="data:image/svg+xml;base64,"+btoa(unescape(encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1px" height="1px" version="1.1"><foreignObject pointer-events="all" width="1" height="1"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject></svg>')))}catch(k){}Editor.prototype.useCanvasForExport=!1})();
 (function(){var b=new mxObjectCodec(new ChangePageSetup,["ui","previousColor","previousImage","previousFormat"]);b.beforeDecode=function(e,g,p){p.ui=e.ui;return g};b.afterDecode=function(e,g,p){p.previousColor=p.color;p.previousImage=p.image;p.previousFormat=p.format;null!=p.foldingEnabled&&(p.foldingEnabled=!p.foldingEnabled);null!=p.mathEnabled&&(p.mathEnabled=!p.mathEnabled);null!=p.shadowVisible&&(p.shadowVisible=!p.shadowVisible);return p};mxCodecRegistry.register(b)})();
-(function(){var b=new mxObjectCodec(new ChangeGridColor,["ui"]);b.beforeDecode=function(e,g,p){p.ui=e.ui;return g};mxCodecRegistry.register(b)})();(function(){EditorUi.VERSION="21.4.1";EditorUi.compactUi="atlas"!=Editor.currentTheme;Editor.isDarkMode()&&(mxGraphView.prototype.gridColor=mxGraphView.prototype.defaultDarkGridColor);EditorUi.enableLogging="1"!=urlParams.stealth&&"1"!=urlParams.lockdown&&(/.*\.draw\.io$/.test(window.location.hostname)||/.*\.diagrams\.net$/.test(window.location.hostname))&&"support.draw.io"!=window.location.hostname;EditorUi.drawHost=window.DRAWIO_BASE_URL;EditorUi.lightboxHost=window.DRAWIO_LIGHTBOX_URL;
+(function(){var b=new mxObjectCodec(new ChangeGridColor,["ui"]);b.beforeDecode=function(e,g,p){p.ui=e.ui;return g};mxCodecRegistry.register(b)})();(function(){EditorUi.VERSION="21.5.0";EditorUi.compactUi="atlas"!=Editor.currentTheme;Editor.isDarkMode()&&(mxGraphView.prototype.gridColor=mxGraphView.prototype.defaultDarkGridColor);EditorUi.enableLogging="1"!=urlParams.stealth&&"1"!=urlParams.lockdown&&(/.*\.draw\.io$/.test(window.location.hostname)||/.*\.diagrams\.net$/.test(window.location.hostname))&&"support.draw.io"!=window.location.hostname;EditorUi.drawHost=window.DRAWIO_BASE_URL;EditorUi.lightboxHost=window.DRAWIO_LIGHTBOX_URL;
 EditorUi.lastErrorMessage=null;EditorUi.ignoredAnonymizedChars="\n\t`~!@#$%^&*()_+{}|:\"<>?-=[];'./,\n\t";EditorUi.templateFile=TEMPLATE_PATH+"/index.xml";EditorUi.cacheUrl=window.REALTIME_URL;null==EditorUi.cacheUrl&&"undefined"!==typeof DrawioFile&&(DrawioFile.SYNC="none");Editor.cacheTimeout=1E4;EditorUi.enablePlantUml=EditorUi.enableLogging;EditorUi.isElectronApp=null!=window&&null!=window.process&&null!=window.process.versions&&null!=window.process.versions.electron;EditorUi.nativeFileSupport=
 !mxClient.IS_OP&&!EditorUi.isElectronApp&&"1"!=urlParams.extAuth&&"showSaveFilePicker"in window&&"showOpenFilePicker"in window;EditorUi.enableDrafts=!mxClient.IS_CHROMEAPP&&isLocalStorage&&"0"!=urlParams.drafts;EditorUi.scratchpadHelpLink="https://www.drawio.com/doc/faq/scratchpad";EditorUi.enableHtmlEditOption=!0;EditorUi.mermaidDiagramTypes="flowchart classDiagram sequenceDiagram stateDiagram mindmap graph erDiagram requirementDiagram journey gantt pie gitGraph".split(" ");EditorUi.defaultMermaidConfig=
 {theme:"neutral",arrowMarkerAbsolute:!1,flowchart:{htmlLabels:!1},sequence:{diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,mirrorActors:!0,bottomMarginAdj:1,useMaxWidth:!0,rightAngles:!1,showSequenceNumbers:!1},gantt:{titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,leftPadding:75,gridLineStartPadding:35,fontSize:11,fontFamily:'"Open-Sans", "sans-serif"',numberSectionStyles:4,axisFormat:"%Y-%m-%d"}};EditorUi.logError=
 function(d,f,l,u,A,B,F){if(null!=d){A=null!=A?A:Error(d);A.stack=null!=A.stack?A.stack:"";B=null!=B?B:0>d.indexOf("NetworkError")&&0>d.indexOf("SecurityError")&&0>d.indexOf("NS_ERROR_FAILURE")&&0>d.indexOf("out of memory")?"SEVERE":"CONFIG";try{EditorUi.enableLogging&&"1"!=urlParams.dev&&d!=EditorUi.lastErrorMessage&&0>d.indexOf("extension:")&&0>A.stack.indexOf("extension:")&&0>A.stack.indexOf("<anonymous>:")&&(EditorUi.lastErrorMessage=d,(new Image).src=(null!=window.DRAWIO_LOG_URL?window.DRAWIO_LOG_URL:
 "")+"/log?severity="+B+"&v="+encodeURIComponent(EditorUi.VERSION)+"&msg=clientError:"+encodeURIComponent(d)+":url:"+encodeURIComponent(window.location.href)+":lnum:"+encodeURIComponent(l)+(null!=u?":colno:"+encodeURIComponent(u):"")+(""!=A.stack?"&stack="+encodeURIComponent(A.stack):""))}catch(K){}try{F||null==window.console||console.error(B,d,f,l,u,A)}catch(K){}}};EditorUi.logEvent=function(d){if("1"==urlParams.dev)EditorUi.debug("logEvent",d);else if(EditorUi.enableLogging)try{var f=null!=window.DRAWIO_LOG_URL?
diff --git a/src/main/webapp/js/viewer.min.js b/src/main/webapp/js/viewer.min.js
index 49e2852bf8..9e9c05cbe6 100644
--- a/src/main/webapp/js/viewer.min.js
+++ b/src/main/webapp/js/viewer.min.js
@@ -110,11 +110,11 @@ window.uiTheme=window.uiTheme||function(){var a=urlParams.ui;"1"==urlParams.extA
 a),DRAWIO_GITLAB_URL=a);a=urlParams["gitlab-id"];null!=a&&(DRAWIO_GITLAB_ID=a);window.DRAWIO_LOG_URL=window.DRAWIO_LOG_URL||"";a=window.location.host;if("test.draw.io"!=a){var c="diagrams.net";b=a.length-c.length;c=a.lastIndexOf(c,b);-1!==c&&c===b?window.DRAWIO_LOG_URL="https://log.diagrams.net":(c="draw.io",b=a.length-c.length,c=a.lastIndexOf(c,b),-1!==c&&c===b&&(window.DRAWIO_LOG_URL="https://log.draw.io"))}})();
 if("1"==urlParams.offline||"1"==urlParams.demo||"1"==urlParams.stealth||"1"==urlParams.local||"1"==urlParams.lockdown)urlParams.picker="0",urlParams.gapi="0",urlParams.db="0",urlParams.od="0",urlParams.gh="0",urlParams.gl="0",urlParams.tr="0";
 "se.diagrams.net"==window.location.hostname&&(urlParams.db="0",urlParams.od="0",urlParams.gh="0",urlParams.gl="0",urlParams.tr="0",urlParams.plugins="0",urlParams.mode="google",urlParams.lockdown="1",window.DRAWIO_GOOGLE_APP_ID=window.DRAWIO_GOOGLE_APP_ID||"184079235871",window.DRAWIO_GOOGLE_CLIENT_ID=window.DRAWIO_GOOGLE_CLIENT_ID||"184079235871-pjf5nn0lff27lk8qf0770gmffiv9gt61.apps.googleusercontent.com");"trello"==urlParams.mode&&(urlParams.tr="1");
 "embed.diagrams.net"==window.location.hostname&&(urlParams.embed="1");(null==window.location.hash||1>=window.location.hash.length)&&null!=urlParams.open&&(window.location.hash=urlParams.open);window.urlParams=window.urlParams||{};window.DOM_PURIFY_CONFIG=window.DOM_PURIFY_CONFIG||{ADD_TAGS:["use"],FORBID_TAGS:["form"],ALLOWED_URI_REGEXP:/^((?!javascript:).)*$/i,ADD_ATTR:["target","content"]};window.MAX_REQUEST_SIZE=window.MAX_REQUEST_SIZE||10485760;window.MAX_AREA=window.MAX_AREA||225E6;window.EXPORT_URL=window.EXPORT_URL||"/export";window.SAVE_URL=window.SAVE_URL||"/save";window.OPEN_URL=window.OPEN_URL||"/open";window.RESOURCES_PATH=window.RESOURCES_PATH||"resources";
 window.RESOURCE_BASE=window.RESOURCE_BASE||window.RESOURCES_PATH+"/grapheditor";window.STENCIL_PATH=window.STENCIL_PATH||"stencils";window.IMAGE_PATH=window.IMAGE_PATH||"images";window.STYLE_PATH=window.STYLE_PATH||"styles";window.CSS_PATH=window.CSS_PATH||"styles";window.OPEN_FORM=window.OPEN_FORM||"open.html";window.mxBasePath=window.mxBasePath||"mxgraph";window.mxImageBasePath=window.mxImageBasePath||"mxgraph/images";window.mxLanguage=window.mxLanguage||urlParams.lang;
-window.mxLanguages=window.mxLanguages||["de","se"];var mxClient={VERSION:"21.4.1",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
+window.mxLanguages=window.mxLanguages||["de","se"];var mxClient={VERSION:"21.5.0",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
 IS_OP:null!=navigator.userAgent&&(0<=navigator.userAgent.indexOf("Opera/")||0<=navigator.userAgent.indexOf("OPR/")),IS_OT:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Presto/")&&0>navigator.userAgent.indexOf("Presto/2.4.")&&0>navigator.userAgent.indexOf("Presto/2.3.")&&0>navigator.userAgent.indexOf("Presto/2.2.")&&0>navigator.userAgent.indexOf("Presto/2.1.")&&0>navigator.userAgent.indexOf("Presto/2.0.")&&0>navigator.userAgent.indexOf("Presto/1."),IS_SF:/Apple Computer, Inc/.test(navigator.vendor),
 IS_ANDROID:0<=navigator.appVersion.indexOf("Android"),IS_IOS:/iP(hone|od|ad)/.test(navigator.platform)||navigator.userAgent.match(/Mac/)&&navigator.maxTouchPoints&&2<navigator.maxTouchPoints,IS_WEBVIEW:/((iPhone|iPod|iPad).*AppleWebKit(?!.*Version)|; wv)/i.test(navigator.userAgent),IS_GC:/Google Inc/.test(navigator.vendor),IS_CHROMEAPP:null!=window.chrome&&null!=chrome.app&&null!=chrome.app.runtime,IS_FF:-1<navigator.userAgent.toLowerCase().indexOf("firefox"),IS_MT:0<=navigator.userAgent.indexOf("Firefox/")&&
 0>navigator.userAgent.indexOf("Firefox/1.")&&0>navigator.userAgent.indexOf("Firefox/2.")||0<=navigator.userAgent.indexOf("Iceweasel/")&&0>navigator.userAgent.indexOf("Iceweasel/1.")&&0>navigator.userAgent.indexOf("Iceweasel/2.")||0<=navigator.userAgent.indexOf("SeaMonkey/")&&0>navigator.userAgent.indexOf("SeaMonkey/1.")||0<=navigator.userAgent.indexOf("Iceape/")&&0>navigator.userAgent.indexOf("Iceape/1."),IS_SVG:"MICROSOFT INTERNET EXPLORER"!=navigator.appName.toUpperCase(),NO_FO:!document.createElementNS||
 "[object SVGForeignObjectElement]"!==document.createElementNS("http://www.w3.org/2000/svg","foreignObject").toString()||0<=navigator.userAgent.indexOf("Opera/"),IS_WIN:0<navigator.appVersion.indexOf("Win"),IS_MAC:0<navigator.appVersion.indexOf("Mac"),IS_CHROMEOS:/\bCrOS\b/.test(navigator.appVersion),IS_LINUX:/\bLinux\b/.test(navigator.appVersion),IS_TOUCH:"ontouchstart"in document.documentElement,IS_POINTER:null!=window.PointerEvent&&!(0<navigator.appVersion.indexOf("Mac")),IS_LOCAL:0>document.location.href.indexOf("http://")&&
 0>document.location.href.indexOf("https://"),defaultBundles:[],isBrowserSupported:function(){return mxClient.IS_SVG},link:function(a,b,c,d){c=c||document;var e=c.createElement("link");e.setAttribute("rel",a);e.setAttribute("href",b);e.setAttribute("charset","UTF-8");e.setAttribute("type","text/css");d&&e.setAttribute("id",d);c.getElementsByTagName("head")[0].appendChild(e)},loadResources:function(a,b){function c(){0==--d&&a()}for(var d=mxClient.defaultBundles.length,e=0;e<mxClient.defaultBundles.length;e++)mxResources.add(mxClient.defaultBundles[e],
@@ -3469,11 +3469,11 @@ Z.appendChild(ba);z=document.createElement("div");z.style.cssText="text-align:ri
 X(!1)}),za.className="geBtn",z.appendChild(za));za=mxUtils.button(mxResources.get(PrintDialog.previewEnabled?"print":"ok"),function(){k.hideDialog();X(!0)});za.className="geBtn gePrimaryBtn";z.appendChild(za);k.editor.cancelFirst||z.appendChild(ba);Z.appendChild(z);this.container=Z};var W=ChangePageSetup.prototype.execute;ChangePageSetup.prototype.execute=function(){null==this.page&&(this.page=this.ui.currentPage);if(this.page!=this.ui.currentPage){if(null!=this.page.viewState){this.ignoreColor||
 (this.page.viewState.background=this.color);if(!this.ignoreImage){var k=this.image;null!=k&&null!=k.src&&Graph.isPageLink(k.src)&&(k={originalSrc:k.src});this.page.viewState.backgroundImage=k}null!=this.format&&(this.page.viewState.pageFormat=this.format);null!=this.mathEnabled&&(this.page.viewState.mathEnabled=this.mathEnabled);null!=this.shadowVisible&&(this.page.viewState.shadowVisible=this.shadowVisible)}}else W.apply(this,arguments),null!=this.mathEnabled&&this.mathEnabled!=this.ui.isMathEnabled()&&
 (this.ui.setMathEnabled(this.mathEnabled),this.mathEnabled=!this.mathEnabled),null!=this.shadowVisible&&this.shadowVisible!=this.ui.editor.graph.shadowVisible&&(this.ui.editor.graph.setShadowVisible(this.shadowVisible),this.shadowVisible=!this.shadowVisible)};Editor.prototype.useCanvasForExport=!1;try{var P=document.createElement("canvas"),U=new Image;U.onload=function(){try{P.getContext("2d").drawImage(U,0,0);var k=P.toDataURL("image/png");Editor.prototype.useCanvasForExport=null!=k&&6<k.length}catch(z){}};
 U.src="data:image/svg+xml;base64,"+btoa(unescape(encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1px" height="1px" version="1.1"><foreignObject pointer-events="all" width="1" height="1"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject></svg>')))}catch(k){}Editor.prototype.useCanvasForExport=!1})();
 (function(){var b=new mxObjectCodec(new ChangePageSetup,["ui","previousColor","previousImage","previousFormat"]);b.beforeDecode=function(e,g,p){p.ui=e.ui;return g};b.afterDecode=function(e,g,p){p.previousColor=p.color;p.previousImage=p.image;p.previousFormat=p.format;null!=p.foldingEnabled&&(p.foldingEnabled=!p.foldingEnabled);null!=p.mathEnabled&&(p.mathEnabled=!p.mathEnabled);null!=p.shadowVisible&&(p.shadowVisible=!p.shadowVisible);return p};mxCodecRegistry.register(b)})();
-(function(){var b=new mxObjectCodec(new ChangeGridColor,["ui"]);b.beforeDecode=function(e,g,p){p.ui=e.ui;return g};mxCodecRegistry.register(b)})();(function(){EditorUi.VERSION="21.4.1";EditorUi.compactUi="atlas"!=Editor.currentTheme;Editor.isDarkMode()&&(mxGraphView.prototype.gridColor=mxGraphView.prototype.defaultDarkGridColor);EditorUi.enableLogging="1"!=urlParams.stealth&&"1"!=urlParams.lockdown&&(/.*\.draw\.io$/.test(window.location.hostname)||/.*\.diagrams\.net$/.test(window.location.hostname))&&"support.draw.io"!=window.location.hostname;EditorUi.drawHost=window.DRAWIO_BASE_URL;EditorUi.lightboxHost=window.DRAWIO_LIGHTBOX_URL;
+(function(){var b=new mxObjectCodec(new ChangeGridColor,["ui"]);b.beforeDecode=function(e,g,p){p.ui=e.ui;return g};mxCodecRegistry.register(b)})();(function(){EditorUi.VERSION="21.5.0";EditorUi.compactUi="atlas"!=Editor.currentTheme;Editor.isDarkMode()&&(mxGraphView.prototype.gridColor=mxGraphView.prototype.defaultDarkGridColor);EditorUi.enableLogging="1"!=urlParams.stealth&&"1"!=urlParams.lockdown&&(/.*\.draw\.io$/.test(window.location.hostname)||/.*\.diagrams\.net$/.test(window.location.hostname))&&"support.draw.io"!=window.location.hostname;EditorUi.drawHost=window.DRAWIO_BASE_URL;EditorUi.lightboxHost=window.DRAWIO_LIGHTBOX_URL;
 EditorUi.lastErrorMessage=null;EditorUi.ignoredAnonymizedChars="\n\t`~!@#$%^&*()_+{}|:\"<>?-=[];'./,\n\t";EditorUi.templateFile=TEMPLATE_PATH+"/index.xml";EditorUi.cacheUrl=window.REALTIME_URL;null==EditorUi.cacheUrl&&"undefined"!==typeof DrawioFile&&(DrawioFile.SYNC="none");Editor.cacheTimeout=1E4;EditorUi.enablePlantUml=EditorUi.enableLogging;EditorUi.isElectronApp=null!=window&&null!=window.process&&null!=window.process.versions&&null!=window.process.versions.electron;EditorUi.nativeFileSupport=
 !mxClient.IS_OP&&!EditorUi.isElectronApp&&"1"!=urlParams.extAuth&&"showSaveFilePicker"in window&&"showOpenFilePicker"in window;EditorUi.enableDrafts=!mxClient.IS_CHROMEAPP&&isLocalStorage&&"0"!=urlParams.drafts;EditorUi.scratchpadHelpLink="https://www.drawio.com/doc/faq/scratchpad";EditorUi.enableHtmlEditOption=!0;EditorUi.mermaidDiagramTypes="flowchart classDiagram sequenceDiagram stateDiagram mindmap graph erDiagram requirementDiagram journey gantt pie gitGraph".split(" ");EditorUi.defaultMermaidConfig=
 {theme:"neutral",arrowMarkerAbsolute:!1,flowchart:{htmlLabels:!1},sequence:{diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,mirrorActors:!0,bottomMarginAdj:1,useMaxWidth:!0,rightAngles:!1,showSequenceNumbers:!1},gantt:{titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,leftPadding:75,gridLineStartPadding:35,fontSize:11,fontFamily:'"Open-Sans", "sans-serif"',numberSectionStyles:4,axisFormat:"%Y-%m-%d"}};EditorUi.logError=
 function(d,f,l,u,A,B,F){if(null!=d){A=null!=A?A:Error(d);A.stack=null!=A.stack?A.stack:"";B=null!=B?B:0>d.indexOf("NetworkError")&&0>d.indexOf("SecurityError")&&0>d.indexOf("NS_ERROR_FAILURE")&&0>d.indexOf("out of memory")?"SEVERE":"CONFIG";try{EditorUi.enableLogging&&"1"!=urlParams.dev&&d!=EditorUi.lastErrorMessage&&0>d.indexOf("extension:")&&0>A.stack.indexOf("extension:")&&0>A.stack.indexOf("<anonymous>:")&&(EditorUi.lastErrorMessage=d,(new Image).src=(null!=window.DRAWIO_LOG_URL?window.DRAWIO_LOG_URL:
 "")+"/log?severity="+B+"&v="+encodeURIComponent(EditorUi.VERSION)+"&msg=clientError:"+encodeURIComponent(d)+":url:"+encodeURIComponent(window.location.href)+":lnum:"+encodeURIComponent(l)+(null!=u?":colno:"+encodeURIComponent(u):"")+(""!=A.stack?"&stack="+encodeURIComponent(A.stack):""))}catch(K){}try{F||null==window.console||console.error(B,d,f,l,u,A)}catch(K){}}};EditorUi.logEvent=function(d){if("1"==urlParams.dev)EditorUi.debug("logEvent",d);else if(EditorUi.enableLogging)try{var f=null!=window.DRAWIO_LOG_URL?
diff --git a/src/main/webapp/js/vsdxImporter.js b/src/main/webapp/js/vsdxImporter.js
new file mode 100644
index 0000000000..6eaa6916bb
--- /dev/null
+++ b/src/main/webapp/js/vsdxImporter.js
@@ -0,0 +1,81 @@
+var mxIsElectron = navigator.userAgent != null &&
+	navigator.userAgent.toLowerCase().indexOf(' electron/') > -1 && 
+	navigator.userAgent.indexOf(' draw.io/') > -1;
+/**
+ * Adds meta tag to the page.
+ */
+function mxmeta(content, httpEquiv)
+{
+	try
+	{
+		var s = document.createElement('meta');
+		
+		s.setAttribute('content', content);
+		s.setAttribute('http-equiv', httpEquiv);
+
+		var t = document.getElementsByTagName('meta')[0];
+		t.parentNode.insertBefore(s, t);
+	}
+	catch (e)
+	{
+		// ignore
+	}
+};
+
+function doImport(vsdxBuff, callback, error, file, customParam)
+{
+	EditorUi.prototype.createUi = function(){};
+	EditorUi.prototype.addTrees = function(){};
+	EditorUi.prototype.updateActionStates = function(){};
+	var editorUi = new EditorUi();
+	var blob = file? file : new Blob([vsdxBuff], {type: 'application/octet-stream'});
+
+	editorUi.importVisio(blob, callback, error, file? file.name : null, customParam);		
+};
+
+
+if (mxIsElectron)
+{
+	mxmeta('default-src \'self\'; script-src \'self\'; connect-src \'self\' https://*.draw.io https://*.diagrams.net https://fonts.googleapis.com https://fonts.gstatic.com; img-src * data:; media-src *; font-src *; frame-src \'none\'; style-src \'self\' \'unsafe-inline\' https://fonts.googleapis.com; base-uri \'none\';child-src \'self\';object-src \'none\';', 'Content-Security-Policy');
+
+	electron.registerMsgListener('import', (vsdxBuff) => 
+	{
+		doImport(vsdxBuff, function(xml)
+		{
+			electron.sendMessage('import-success', xml);
+		},
+		function()
+		{
+			electron.sendMessage('import-error');
+		});
+	});
+}
+
+window.addEventListener('load', function()
+{
+	document.getElementById('fileUpload').addEventListener('change', function()
+	{
+		const curFiles = this.files;
+
+		if(curFiles.length > 0) 
+		{
+			function createDoneDiv(msg)
+			{
+				var doneDiv = document.createElement('div');
+				doneDiv.id = 'doneDiv';
+				doneDiv.innerHTML = msg;
+				document.body.appendChild(doneDiv);
+			};
+			
+			doImport(null, function(xml)
+			{
+				window.importResXML = xml;
+				createDoneDiv('success');
+			}, function(err)
+			{
+				console.log(err)
+				createDoneDiv('error');
+			}, curFiles[0], window.customParam);
+		}
+	});
+});
\ No newline at end of file
diff --git a/src/main/webapp/mxgraph/mxClient.js b/src/main/webapp/mxgraph/mxClient.js
index 46c8a3f7f5..8f71ba6001 100644
--- a/src/main/webapp/mxgraph/mxClient.js
+++ b/src/main/webapp/mxgraph/mxClient.js
@@ -1,6 +1,6 @@
-var mxClient={VERSION:"21.4.1",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
+var mxClient={VERSION:"21.5.0",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
 IS_OP:null!=navigator.userAgent&&(0<=navigator.userAgent.indexOf("Opera/")||0<=navigator.userAgent.indexOf("OPR/")),IS_OT:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Presto/")&&0>navigator.userAgent.indexOf("Presto/2.4.")&&0>navigator.userAgent.indexOf("Presto/2.3.")&&0>navigator.userAgent.indexOf("Presto/2.2.")&&0>navigator.userAgent.indexOf("Presto/2.1.")&&0>navigator.userAgent.indexOf("Presto/2.0.")&&0>navigator.userAgent.indexOf("Presto/1."),IS_SF:/Apple Computer, Inc/.test(navigator.vendor),
 IS_ANDROID:0<=navigator.appVersion.indexOf("Android"),IS_IOS:/iP(hone|od|ad)/.test(navigator.platform)||navigator.userAgent.match(/Mac/)&&navigator.maxTouchPoints&&2<navigator.maxTouchPoints,IS_WEBVIEW:/((iPhone|iPod|iPad).*AppleWebKit(?!.*Version)|; wv)/i.test(navigator.userAgent),IS_GC:/Google Inc/.test(navigator.vendor),IS_CHROMEAPP:null!=window.chrome&&null!=chrome.app&&null!=chrome.app.runtime,IS_FF:-1<navigator.userAgent.toLowerCase().indexOf("firefox"),IS_MT:0<=navigator.userAgent.indexOf("Firefox/")&&
 0>navigator.userAgent.indexOf("Firefox/1.")&&0>navigator.userAgent.indexOf("Firefox/2.")||0<=navigator.userAgent.indexOf("Iceweasel/")&&0>navigator.userAgent.indexOf("Iceweasel/1.")&&0>navigator.userAgent.indexOf("Iceweasel/2.")||0<=navigator.userAgent.indexOf("SeaMonkey/")&&0>navigator.userAgent.indexOf("SeaMonkey/1.")||0<=navigator.userAgent.indexOf("Iceape/")&&0>navigator.userAgent.indexOf("Iceape/1."),IS_SVG:"MICROSOFT INTERNET EXPLORER"!=navigator.appName.toUpperCase(),NO_FO:!document.createElementNS||
 "[object SVGForeignObjectElement]"!==document.createElementNS("http://www.w3.org/2000/svg","foreignObject").toString()||0<=navigator.userAgent.indexOf("Opera/"),IS_WIN:0<navigator.appVersion.indexOf("Win"),IS_MAC:0<navigator.appVersion.indexOf("Mac"),IS_CHROMEOS:/\bCrOS\b/.test(navigator.appVersion),IS_LINUX:/\bLinux\b/.test(navigator.appVersion),IS_TOUCH:"ontouchstart"in document.documentElement,IS_POINTER:null!=window.PointerEvent&&!(0<navigator.appVersion.indexOf("Mac")),IS_LOCAL:0>document.location.href.indexOf("http://")&&
 0>document.location.href.indexOf("https://"),defaultBundles:[],isBrowserSupported:function(){return mxClient.IS_SVG},link:function(a,b,c,d){c=c||document;var e=c.createElement("link");e.setAttribute("rel",a);e.setAttribute("href",b);e.setAttribute("charset","UTF-8");e.setAttribute("type","text/css");d&&e.setAttribute("id",d);c.getElementsByTagName("head")[0].appendChild(e)},loadResources:function(a,b){function c(){0==--d&&a()}for(var d=mxClient.defaultBundles.length,e=0;e<mxClient.defaultBundles.length;e++)mxResources.add(mxClient.defaultBundles[e],
diff --git a/src/main/webapp/resources/dia_ca.txt b/src/main/webapp/resources/dia_ca.txt
index ca48e28f60..cc4701271e 100644
--- a/src/main/webapp/resources/dia_ca.txt
+++ b/src/main/webapp/resources/dia_ca.txt
@@ -607,11 +607,11 @@ portrait=Vertical
 position=Posició
 posterPrint=Imprimeix cartell
 preferences=Preferències
 preview=Vista prèvia
 previousPage=Pàgina anterior
-presentationMode=Presentation Mode
+presentationMode=Mode de presentació
 print=Imprimeix
 printAllPages=Imprimeix totes les pàgines
 procEng=Enginyeria de processos
 project=Projecta
 priority=Prioritat
@@ -779,11 +779,11 @@ tryAgain=Torna a provar-ho
 tryOpeningViaThisPage=Prova d'obrir-lo via aquesta pàgina
 turn=Gira 90°
 type=Escriu
 twitter=Twitter
 uml=UML
-unassigned=Unassigned
+unassigned=No assignat
 underline=Subratlla
 undo=Desfés
 ungroup=Desagrupa
 unmerge=Divideix
 unsavedChanges=Canvis no desats
@@ -1255,11 +1255,11 @@ noAdminsSelected=No s'han seleccionat administradors/editors
 errCreateConfigFile=S'ha produït un error en crear el fitxer "configuration.json", comproveu que teniu els permisos necessaris.
 errSetPageRestr=S'ha produït un error en establir les restriccions de la pàgina
 notAdmin4Team=No ets administrador d'aquest equip
 configUpdated=Configuració actualitzada, reinicieu l'editor si voleu treballar amb la darrera configuració.
 outOfDateRevisionAlert=Esteu editant una revisió històrica del diagrama, comproveu la revisió i obriu-la per substituir la darrera versió. O tanca i sobreescriu/fusiona més tard.
-confAErrFaqs=There are {1} error(s), the following instructions may help fixing most of the cases. (Please download the log for future references)
-confA403ErrFaq=There are ({1}) 403 error(s). The current users must have add (write) permissions on all pages and attachments. Even admins sometimes are not allowed to write to some pages via page restrictions
-confA404ErrFaq=There are ({1}) 404 error(s). The attachment/page is not found. This is due to improper migration or the diagram file (an attachment of the page) is deleted.
-confA500ErrFaq=There are ({1}) 500 error(s). An internal server error in Confluence Cloud. Such errors are due to overloading the server and usually fixed by retrying the process.
-confAOtherErrFaq=There are ({1}) other error(s). Please check the error description. If the description is not clear, please contact our support.
-confAReplaceBaseUrl=Replace Base URL in diagram links when no page ID mapping is found
+confAErrFaqs=Hi ha {1} error(s), les instruccions següents poden ajudar a solucionar la majoria dels casos. (Descarregueu el registre per a futures referències)
+confA403ErrFaq=Hi ha ({1}) error(s) 403. Els usuaris actuals han de tenir permisos per afegir (escriptura) a totes les pàgines i fitxers adjunts. Fins i tot els administradors de vegades no poden escriure en algunes pàgines mitjançant restriccions de pàgina
+confA404ErrFaq=Hi ha ({1}) error(s) 404. No s'ha trobat l'adjunt/pàgina. Això es deu a una migració incorrecta o s'ha suprimit el fitxer del diagrama (un fitxer adjunt de la pàgina).
+confA500ErrFaq=Hi ha ({1}) error(s) 500. Un error intern del servidor a Confluence Cloud. Aquests errors es deuen a la sobrecàrrega del servidor i normalment es solucionen tornant a intentar el procés.
+confAOtherErrFaq=Hi ha ({1}) altre(s) error(s). Comproveu la descripció de l'error. Si la descripció no és clara, poseu-vos en contacte amb el nostre servei d'assistència.
+confAReplaceBaseUrl=Substituïu l'URL base als enllaços del diagrama quan no es trobi cap assignació d'ID de pàgina
diff --git a/src/main/webapp/resources/dia_id.txt b/src/main/webapp/resources/dia_id.txt
index 27e0db512b..459b37785e 100644
--- a/src/main/webapp/resources/dia_id.txt
+++ b/src/main/webapp/resources/dia_id.txt
@@ -325,13 +325,13 @@ fitTo=Paskan ke
 fitToSheetsAcross=lembar mendatar
 fitToBy=dan
 fitToSheetsDown=lembar menurun
 fitTwoPages=Dua Halaman
 fitWindow=Paskan Jendela
-flip=Putar
-flipH=Putar Horizontal
-flipV=Putar Vertikal
+flip=Jungkirkan
+flipH=Jungkir Horizontal
+flipV=Jungkir Vertikal
 flowchart=Diagram Alir
 folder=Folder
 font=Fonta
 fontColor=Warna Fonta
 fontFamily=Famili Fonta
@@ -502,13 +502,13 @@ modern=Modern
 modificationDate=Tanggal ubah
 modifiedBy=Diubah oleh
 more=Lainnya
 moreResults=Hasil Lainnya
 moreShapes=Bentuk Lainnya
-move=Pindahkan
+move=Pindah
 moveToFolder=Pindahkan ke Folder
-moving=Pemindahan
+moving=Memindah
 moveSelectionTo=Pindahkan pilihan ke {1}
 myDrive=Drive-ku
 myFiles=Berkasku
 name=Nama
 navigation=Navigasi
@@ -527,11 +527,11 @@ noLibraries=Tidak ada pustaka yang ditemukan
 noMoreResults=Tidak ada hasil lainnya
 none=Tidak ada
 noOtherViewers=Tidak ada pengunjung lain
 noPlugins=Tidak ada plugin
 noPreview=Tidak ada pratinjau
-noResponse=TIdak ada respons dari server
+noResponse=TIdak ada respon dari server
 noResultsFor=Tidak ada hasil untuk '{1}'
 noRevisions=Tidak ada revisi
 noSearchResults=Tidak ada hasil pencarian yang ditemukan
 noPageContentOrNotSaved=Tidak ada jangkar yang ditemukan di halaman ini atau jangkar belum disimpan
 normal=Normal
@@ -577,11 +577,11 @@ pageContent=Isi Halaman
 pageNotFound=Halaman tidak ditemukan
 pageWithNumber=Halaman-{1}
 pages=Halaman
 pageTabs=Tab Halaman
 pageView=Tampilan Halaman
-pageSetup=Pengaturan Halaman
+pageSetup=Penyiapan Halaman
 pageScale=Skala Halaman
 pan=Pan
 panTooltip=Spasi+Seret untuk memperlebar
 paperSize=Ukuran Kertas
 pattern=Pola
@@ -638,14 +638,14 @@ rememberMe=Ingat saya
 rememberThisSetting=Ingat pengaturan ini
 removeFormat=Hapus Format
 removeFromGroup=Hapus dari Grup
 removeIt=Hapus {1}
 removeWaypoint=Hapus Waypoint
-rename=Namai Ulang
-renamed=Dinamai Ulang
-renameIt=Namai Ulang {1}
-renaming=Menamai ulang
+rename=Ubah Nama
+renamed=Diubah Nama
+renameIt=Ubah Nama {1}
+renaming=Mengubah Nama
 replace=Mengganti
 replaceIt={1} telah ada. Anda ingin menggantinya?
 replaceExistingDrawing=Ganti gambar yang ada
 required=diperlukan
 requirementDiagram=Diagram Kebutuhan
@@ -729,11 +729,11 @@ sketch=Sketsa
 snapToGrid=Lekatkan ke Kisi
 solid=Padat
 sourceSpacing=Spasi Sumber
 south=Selatan
 software=Perangkat Lunak
-space=Spasi
+space=Ruang
 spacing=Jarak Spasi
 specialLink=Tautan Khusus
 stateDiagram=Diagram Keadaan
 standard=Standar
 startDrawing=Mulai menggambar
@@ -1038,154 +1038,154 @@ confAImpDiagramFailed=Mengimpor diagram "{1}" gagal. Tidak bisa menemukan ID hal
 confAImpDiagramError=Galat saat mengimpor diagram "{1}". Tidak bisa mengambil atau menyimpan diagram tersebut. Tidak bisa memperbaiki tautan diagram ini.
 confAUpdateDgrmCCFailed=Memutakhirkan tautan ke diagram "{1}" gagal.
 confImpDiagramSuccess=Memutakhirkan diagram "{1}" sukses dilakukan.
 confANoLnksInDrgm=Tidak ada tautan untuk diperbarui di: {1}
 confAUpdateLnkToPg=Memperbarui tautan ke halaman: "{1}" dalam diagram: "{2}"
-confAUpdateLBLnkToPg=Updated lightbox link to page: "{1}" in diagram: "{2}"
-confAUpdateLnkBase=Updated base URL from: "{1}" to: "{2}" in diagram: "{3}"
+confAUpdateLBLnkToPg=Memperbarui tautan lightbox ke halaman: "{1}" dalam diagram: "{2}"
+confAUpdateLnkBase=Memperbarui URL dasar dari: "{1}" menjadi: "{2}" dalam diagram: "{3}"
 confAPageIdsImpDone=Impor ID Halaman selesai
 confAPrcsMacrosInPage=Memroses makro draw.io dalam halaman "{1}"
 confAErrFetchPage=Galat saat mengambil halaman "{1}"
-confAFixingMacro=Fixing macro of diagram "{1}"
-confAErrReadingExpFile=Error reading export file
-confAPrcsDiagInPageDone=Processing draw.io diagrams in page "{1}" finished
-confAFixingMacroSkipped=Fixing macro of diagram "{1}" failed. Cannot find its new page ID. Maybe it points to a page that is not imported.
-pageIdsExpTrg=Export target
-confALucidDiagImgImported={2} diagram "{1}" image extracted successfully
-confASavingLucidDiagImgFailed=Extracting {2} diagram "{1}" image failed
-confGetInfoFailed=Fetching file info from {1} failed.
-confCheckCacheFailed=Cannot get cached file info.
-confReadFileErr=Cannot read "{1}" file from {2}.
-confSaveCacheFailed=Unexpected error. Cannot save cached file
-orgChartType=Org Chart Type
-linear=Linear
-hanger2=Hanger 2
-hanger4=Hanger 4
-fishbone1=Fishbone 1
-fishbone2=Fishbone 2
-1ColumnLeft=Single Column Left
-1ColumnRight=Single Column Right
-smart=Smart
-parentChildSpacing=Parent Child Spacing
-siblingSpacing=Sibling Spacing
-confNoPermErr=Sorry, you don't have enough permissions to view this embedded diagram from page {1}
-copyAsImage=Copy as Image
-lucidImport=Lucidchart Import
-lucidImportInst1=Click the "Start Import" button to import all Lucidchart diagrams.
-installFirst=Please install {1} first
-drawioChromeExt=draw.io Chrome Extension
-loginFirstThen=Please login to {1} first, then {2}
-errFetchDocList=Error: Couldn't fetch documents list
-builtinPlugins=Built-in Plugins
-extPlugins=External Plugins
-backupFound=Backup file found
-chromeOnly=This feature only works in Google Chrome
-msgDeleted=This message has been deleted
-confAErrFetchDrawList=Error fetching diagrams list. Some diagrams are skipped.
-confAErrCheckDrawDiag=Cannot check diagram {1}
-confAErrFetchPageList=Error fetching pages list
-confADiagImportIncom={1} diagram "{2}" is imported partially and may have missing shapes
-invalidSel=Invalid selection
-diagNameEmptyErr=Diagram name cannot be empty
-openDiagram=Open Diagram
-newDiagram=New diagram
-editable=Editable
-confAReimportStarted=Re-import {1} diagrams started...
-spaceFilter=Filter by spaces
-curViewState=Current Viewer State
-pageLayers=Page and Layers
-customize=Customize
-firstPage=First Page (All Layers)
-curEditorState=Current Editor State
-noAnchorsFound=No anchors found
-attachment=Attachment
-curDiagram=Current Diagram
-recentDiags=Recent Diagrams
-csvImport=CSV Import
-chooseFile=Choose a file...
-choose=Choose
-gdriveFname=Google Drive filename
-widthOfViewer=Width of the viewer (px)
-heightOfViewer=Height of the viewer (px)
-autoSetViewerSize=Automatically set the size of the viewer
-thumbnail=Thumbnail
-prevInDraw=Preview in draw.io
-onedriveFname=OneDrive filename
-diagFname=Diagram filename
-diagUrl=Diagram URL
-showDiag=Show Diagram
-diagPreview=Diagram Preview
-csvFileUrl=CSV File URL
-generate=Generate
-selectDiag2Insert=Please select a diagram to insert it.
-errShowingDiag=Unexpected error. Cannot show diagram
-noRecentDiags=No recent diagrams found
-fetchingRecentFailed=Failed to fetch recent diagrams
-useSrch2FindDiags=Use the search box to find draw.io diagrams
-cantReadChckPerms=Cannot read the specified diagram. Please check you have read permission on that file.
-cantFetchChckPerms=Cannot fetch diagram info. Please check you have read permission on that file.
-searchFailed=Searching failed. Please try again later.
-plsTypeStr=Please type a search string.
-unsupportedFileChckUrl=Unsupported file. Please check the specified URL
-diagNotFoundChckUrl=Diagram not found or cannot be accessed. Please check the specified URL
-csvNotFoundChckUrl=CSV file not found or cannot be accessed. Please check the specified URL
-cantReadUpload=Cannot read the uploaded diagram
-select=Select
-errCantGetIdType=Unexpected Error: Cannot get content id or type.
-errGAuthWinBlocked=Error: Google Authentication window blocked
-authDrawAccess=Authorize draw.io to access {1}
-connTimeout=The connection has timed out
-errAuthSrvc=Error authenticating to {1}
-plsSelectFile=Please select a file
-mustBgtZ={1} must be greater than zero
-cantLoadPrev=Cannot load file preview.
-errAccessFile=Error: Access Denied. You do not have permission to access "{1}".
-noPrevAvail=No preview is available.
-personalAccNotSup=Personal accounts are not supported.
-errSavingTryLater=Error occurred during saving, please try again later.
-plsEnterFld=Please enter {1}
-invalidDiagUrl=Invalid Diagram URL
-unsupportedVsdx=Unsupported vsdx file
-unsupportedImg=Unsupported image file
-unsupportedFormat=Unsupported file format
-plsSelectSingleFile=Please select a single file only
-attCorrupt=Attachment file "{1}" is corrupted
-loadAttFailed=Failed to load attachment "{1}"
-embedDrawDiag=Embed draw.io Diagram
-addDiagram=Add Diagram
-embedDiagram=Embed Diagram
-editOwningPg=Edit owning page
-deepIndexing=Deep Indexing (Index diagrams that aren't used in any page also)
-confADeepIndexStarted=Deep Indexing Started
-confADeepIndexDone=Deep Indexing Done
-officeNoDiagramsSelected=No diagrams found in the selection
-officeNoDiagramsInDoc=No diagrams found in the document
-officeNotSupported=This feature is not supported in this host application
-someImagesFailed={1} out of {2} failed due to the following errors
-importingNoUsedDiagrams=Importing {1} Diagrams not used in pages
-importingDrafts=Importing {1} Diagrams in drafts
-processingDrafts=Processing drafts
-updatingDrafts=Updating drafts
-updateDrafts=Update drafts
-notifications=Notifications
-drawioImp=draw.io Import
-confALibsImp=Importing draw.io Libraries
-confALibsImpFailed=Importing {1} library failed
+confAFixingMacro=Memperbaiki makro dari diagram "{1}"
+confAErrReadingExpFile=Galat saat membaca berkas ekspor
+confAPrcsDiagInPageDone=Pemrosesan diagram draw.io dalam halaman "{1}" selesai
+confAFixingMacroSkipped=Memperbaiki makro dari diagram "{1}" gagal. Tidak bisa menemukan ID halaman barunya. Mungkin itu menunjuk ke suatu halaman yang tidak diimpor.
+pageIdsExpTrg=Target ekspor
+confALucidDiagImgImported=Gambar "{1}" diagram {2} sukses diekstrak
+confASavingLucidDiagImgFailed=Ekstraksi gambar "{1}" diagram {2} gagal
+confGetInfoFailed=Mengambil info berkas dari {1} gagal.
+confCheckCacheFailed=Tidak bisa mendapat info berkas tersinggah.
+confReadFileErr=Tidak bisa membaca berkas "{1}" dari {2}.
+confSaveCacheFailed=Galat yang tidak diharapkan. Tidak bisa menyimpan berkas yang tersinggah
+orgChartType=Tipe Bagan Organisasi
+linear=Linier
+hanger2=Gantungan baju 2
+hanger4=Gantungan baju 4
+fishbone1=Tulang ikan 1
+fishbone2=Tulang Ikan 2
+1ColumnLeft=Kolom Tunggal Kiri
+1ColumnRight=Kolom Tunggal Kanan
+smart=Cerdas
+parentChildSpacing=Jarak Antara Induk Anak
+siblingSpacing=Jarak Antara Sejajar
+confNoPermErr=Maaf, Anda tidak punya cukup izin untuk melihat diagram tertanam dari halaman {1} ini
+copyAsImage=Salin sebagai gambar
+lucidImport=Impor Lucidchart
+lucidImportInst1=Klik tombol "Mulai Impor" untuk mengimpor semua diagram Lucidchart.
+installFirst=Harap pasang {1} terlebih dahulu
+drawioChromeExt=Ekstensi Chrome draw.io
+loginFirstThen=Harap log masuk ke {1} terlebih dahulu, lalu {2}
+errFetchDocList=Galat: Tak bisa mengambil daftar dokumen
+builtinPlugins=Pengaya Bawaan
+extPlugins=Pengaya Eksternal
+backupFound=Berkas backup ditemukan
+chromeOnly=Fitur ini hanya bekerja di Google Chrome
+msgDeleted=Pesan ini telah dihapus
+confAErrFetchDrawList=Galat saat mengambil daftar diagram. Beberapa diagram dilewati.
+confAErrCheckDrawDiag=Tidak bisa memeriksa diagram {1}
+confAErrFetchPageList=Galat saat mengambil daftar halaman
+confADiagImportIncom={1} diagram "{2}" diimpor sebagian dan mungkin kehilangan beberapa bentuk
+invalidSel=Pilihan yang tidak valid
+diagNameEmptyErr=Nama diagram tidak boleh kosong
+openDiagram=Buka Diagram
+newDiagram=Diagram Baru
+editable=Dapat Disunting
+confAReimportStarted=Impor ulang {1} diagram dimulai...
+spaceFilter=Saring menurut spasi
+curViewState=Keadaan Penampil Sekarang
+pageLayers=Halaman dan Lapisan
+customize=Sesuaikan
+firstPage=Halaman Pertama (Semua Lapisan)
+curEditorState=Keadaan Penyunting Saat Ini
+noAnchorsFound=Tidak ditemukan jangkar
+attachment=Lampiran
+curDiagram=Diagram Saat ini
+recentDiags=Diagram Baru-baru Ini
+csvImport=Impor CSV
+chooseFile=Pilih sebuah berkas...
+choose=Pilih
+gdriveFname=Nama berkas Google Drive
+widthOfViewer=Lebar penampil (px)
+heightOfViewer=Tinggi penampil (px)
+autoSetViewerSize=Secara otomatis atur ukuran penampil
+thumbnail=Gambar mini
+prevInDraw=Pratinjau dalam draw.io
+onedriveFname=Nama berkas OneDrive
+diagFname=Nama berkas diagram
+diagUrl=URL diagram
+showDiag=Tampilkan Diagram
+diagPreview=Pratinjau Diagram
+csvFileUrl=URL Berkas CSV
+generate=Bangkitkan
+selectDiag2Insert=Harap pilih suatu diagram untuk disisipi.
+errShowingDiag=Galat tak diharapkan. Tidak bisa menunjukkan diagram
+noRecentDiags=Tidak ditemukan diagram baru-baru ini
+fetchingRecentFailed=Gagal mengambil diagram baru-baru ini
+useSrch2FindDiags=Gunakan kotak pencarian untuk menemukan diagram-diagram draw.io
+cantReadChckPerms=Tidak bisa membaca diagram yang dinyatakan. Harap periksa apakah Anda punya hak baca pada berkas itu.
+cantFetchChckPerms=Tidak bisa mengambil info diagram. Harap periksa apakah Anda punya hak baca pada berkas itu.
+searchFailed=Pencarian gagal. Harap coba lagi nanti.
+plsTypeStr=Harap ketikkan suatu string pencarian.
+unsupportedFileChckUrl=Berkas yang tidak didukung. Harap periksa URL yang dinyatakan
+diagNotFoundChckUrl=Diagram tidak ditemukan atau tidak bisa diakses. Harap periksa URL yang dinyatakan
+csvNotFoundChckUrl=Berkas CVS tidak ditemukan atau tidak bisa diakses. Harap periksa URL yang dinyatakan
+cantReadUpload=Tidak bisa membaca diagram yang diunggah
+select=Pilih
+errCantGetIdType=Galat Tak Diharapkan: Tidak bisa mendapatkan id atau tipe konten.
+errGAuthWinBlocked=Galat: Jendela Otentikasi Google terblokir
+authDrawAccess=Otorisasikan draw.io untuk mengakses {1}
+connTimeout=Koneksi kehabisan waktu
+errAuthSrvc=Galat mengotentikasi ke {1}
+plsSelectFile=Harap pilih sebuah berkas
+mustBgtZ={1} harus lebih dari nol
+cantLoadPrev=Tidak bisa memuat pratinjau berkas.
+errAccessFile=Galat: Akses Ditolak. Anda tidak punya izin untuk mengakses "{1}".
+noPrevAvail=Tidak ada pratinjau yang tersedia.
+personalAccNotSup=Akun pribadi tidak didukung.
+errSavingTryLater=Terjadi galat saat menyimpan, harap coba lagi nanti.
+plsEnterFld=Harap masukkan {1}
+invalidDiagUrl=URL Diagram Tidak Valid
+unsupportedVsdx=Berkas vsdx yang tidak didukung
+unsupportedImg=Berkas gambar yang tidak didukung
+unsupportedFormat=Format berkas yang tidak didukung
+plsSelectSingleFile=Harap pilih satu berkas saja
+attCorrupt=Berkas lampiran "{1}" terkorupsi
+loadAttFailed=Gagal memuat lampiran "{1}"
+embedDrawDiag=Tanamkan Diagram draw.io
+addDiagram=Tambah Diagram
+embedDiagram=Tanam Diagram
+editOwningPg=Sunting halaman yang memuat
+deepIndexing=Pengindeksan Dalam (Juga mengindeks diagram yang tidak dipakai di halaman mana pun)
+confADeepIndexStarted=Pengindeksan Dalam Dimulai
+confADeepIndexDone=Pengindeksan Dalam Selesai
+officeNoDiagramsSelected=Tidak ditemukan diagram dalam pilihan
+officeNoDiagramsInDoc=Tidak ditemukan diagram dalam dokumen
+officeNotSupported=Fitur ini tidak didukung dalam aplikasi host ini
+someImagesFailed={1} dari {2} gagal karena galat berikut
+importingNoUsedDiagrams=Mengimpor {1} Diagram yang tidak dipakai di halaman
+importingDrafts=Mengimpor {1} Diagram dalam draf
+processingDrafts=Memroses draf
+updatingDrafts=Memutakhirkan draf
+updateDrafts=Mutakhirkan draf
+notifications=Pemberitahuan
+drawioImp=Impor draw.io
+confALibsImp=Mengimpor Pustaka draw.io
+confALibsImpFailed=Mengimpor {1} pustaka gagal
 contributors=Kontributor
-drawDiagrams=draw.io Diagrams
-errFileNotFoundOrNoPer=Error: Access Denied. File not found or you do not have permission to access "{1}" on {2}.
-confACheckPagesWEmbed=Checking pages having embedded draw.io diagrams.
+drawDiagrams=Diagram draw.io
+errFileNotFoundOrNoPer=Galat: Akses Ditolak. Berkas tidak ditemukan atau Anda tidak punya hak untuk mengakses "{1}" pada {2}.
+confACheckPagesWEmbed=Memeriksa halaman yang memiliki diagram draw.io yang tertanam.
 confADelBrokenEmbedDiagLnk=Removing broken embedded diagram links
-replaceWith=Replace with
-replaceAll=Replace All
+replaceWith=Gantikan dengan
+replaceAll=Ganti Semua
 confASkipDiagModified=Skipped "{1}" as it was modified after initial import
-replFind=Replace/Find
-matchesRepl={1} matches replaced
+replFind=Ganti/Cari
+matchesRepl={1} kecocokan diganti
 draftErrDataLoss=An error occurred while reading the draft file. The diagram cannot be edited now to prevent any possible data loss. Please try again later or contact support.
 ibm=IBM
 linkToDiagramHint=Add a link to this diagram. The diagram can only be edited from the page that owns it.
-linkToDiagram=Link to Diagram
+linkToDiagram=Tautan ke Diagram
 changedBy=Diubah Oleh
 lastModifiedOn=Terakhir diubah pada
 searchResults=Hasil Pencarian
 showAllTemps=Tampilkan semua templat
 notionToken=Token Notion
@@ -1239,27 +1239,27 @@ diagramTooLarge=The diagram is too large, please reduce its size and try again.
 selectAdminUsers=Select Admin Users
 xyzTeam=Tim {1}
 addTeamTitle=Adding a new draw.io Team
 addTeamInst1=To create a new draw.io Team, you need to create a new Atlassian group with "drawio-" postfix (e.g, a group named "drawio-marketing").
 addTeamInst2=Then, configure which team member can edit/add configuration, templates, and libraries from this page.
-drawioTeams=draw.io Teams
-members=Members
-adminEditors=Admins/Editors
-allowAll=Allow all
-noTeams=No teams found
-errorLoadingTeams=Error Loading Teams
-noTeamMembers=No team members found
-errLoadTMembers=Error loading team members
+drawioTeams=Tim draw.io
+members=Anggota
+adminEditors=Admin/Editor
+allowAll=Izinkan semua
+noTeams=Tidak ditemukan tim
+errorLoadingTeams=Galat Saat Memuat Tim
+noTeamMembers=Tidak ditemukan anggota tim
+errLoadTMembers=Galat saat memuat anggota tim
 errCreateTeamPage=Error creating team "{1}" page in "draw.io Configuration" space, please check you have the required permissions.
 gotoConfigPage=Please create the space from draw.io "Configuration" page.
 noAdminsSelected=No admins/editors selected
 errCreateConfigFile=Error creating "configuration.json" file, please check you have the required permissions.
 errSetPageRestr=Error setting page restrictions
 notAdmin4Team=You are not an admin for this team
 configUpdated=Configuration updated, restart the editor if you want to work with last configuration.
 outOfDateRevisionAlert=You are editing a historical revision of the diagram, please review the revision and open it to replace the latest version. Or close and overwrite/merge later.
-confAErrFaqs=There are {1} error(s), the following instructions may help fixing most of the cases. (Please download the log for future references)
-confA403ErrFaq=There are ({1}) 403 error(s). The current users must have add (write) permissions on all pages and attachments. Even admins sometimes are not allowed to write to some pages via page restrictions
-confA404ErrFaq=There are ({1}) 404 error(s). The attachment/page is not found. This is due to improper migration or the diagram file (an attachment of the page) is deleted.
-confA500ErrFaq=There are ({1}) 500 error(s). An internal server error in Confluence Cloud. Such errors are due to overloading the server and usually fixed by retrying the process.
-confAOtherErrFaq=There are ({1}) other error(s). Please check the error description. If the description is not clear, please contact our support.
-confAReplaceBaseUrl=Replace Base URL in diagram links when no page ID mapping is found
+confAErrFaqs=Ada {1} galat, instruksi berikut mungkin bisa membantu memperbaiki kebanyakan kasus. (Harap unduh log untuk acuan mendatang)
+confA403ErrFaq=Ada ({1}) galat 403. Pengguna saat ini mesti punya hak tambah (tulis) pada semua halaman dan lampiran. Bahkan admin kadang tidak diizinkan menulis ke beberapa halaman melalui pembatasan halaman
+confA404ErrFaq=Ada ({1}) galat 404. Lampiran/halaman tidak ditemukan. Ini karena migrasi yang tidak sesuai atau berkas diagram (suatu lampiran dari halaman) dihapus.
+confA500ErrFaq=Ada ({1}) galat 500. Sebuah galat server internal dalam Cloud Confluence. Galat seperti itu karena pembebanan lebih server dan biasanya diperbaiki dengan mencoba ulang proses.
+confAOtherErrFaq=Ada ({1}) galat lain. Harap periksa deskripsi galat. Bila deskripsi tidak jelas, harap hubungi dukungan kami.
+confAReplaceBaseUrl=Menggantikan URL Dasar dalam tautan diagram ketika pemetaan ID halaman tidak ditemukan
diff --git a/src/main/webapp/service-worker.js b/src/main/webapp/service-worker.js
index 8e21fca9cc..17ddb3bfba 100644
--- a/src/main/webapp/service-worker.js
+++ b/src/main/webapp/service-worker.js
@@ -1,2 +1,2 @@
-if(!self.define){const e=e=>{"require"!==e&&(e+=".js");let r=Promise.resolve();return i[e]||(r=new Promise((async r=>{if("document"in self){const i=document.createElement("script");i.src=e,document.head.appendChild(i),i.onload=r}else importScripts(e),r()}))),r.then((()=>{if(!i[e])throw new Error(`Module ${e} didn’t register its module`);return i[e]}))},r=(r,i)=>{Promise.all(r.map(e)).then((e=>i(1===e.length?e[0]:e)))},i={require:Promise.resolve(r)};self.define=(r,a,c)=>{i[r]||(i[r]=Promise.resolve().then((()=>{let i={};const s={uri:location.origin+r.slice(1)};return Promise.all(a.map((r=>{switch(r){case"exports":return i;case"module":return s;default:return e(r)}}))).then((e=>{const r=c(...e);return i.default||(i.default=r),i}))})))}}define("./service-worker.js",["./workbox-99ba3a23"],(function(e){"use strict";self.addEventListener("message",(e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()})),e.precacheAndRoute([{url:"js/app.min.js",revision:"24ace1901711d6cab23a4ef379de9120"},{url:"js/extensions.min.js",revision:"3834501a2250d98fc7207a6ae6298f14"},{url:"js/orgchart.min.js",revision:"619d8c4dab47b81868916df31f55478b"},{url:"js/stencils.min.js",revision:"698f1f70f64466ff6ae9280cd91cd23f"},{url:"js/shapes-14-6-5.min.js",revision:"95f54e7999c9fba2a1d65b4fe4f634f3"},{url:"js/math-print.js",revision:"cf64f6a493a8cb5079f2b70813e478d7"},{url:"index.html",revision:"8279349dc2b6543249d7e51c2d1cf92e"},{url:"open.html",revision:"d71816b3b00e769fc6019fcdd6921662"},{url:"styles/fonts/ArchitectsDaughter-Regular.ttf",revision:"31c2153c0530e32553b31a49b3d70736"},{url:"styles/grapheditor.css",revision:"c80c6d3bdaa85e0fbc9d9b174ef763f4"},{url:"styles/atlas.css",revision:"d627cfef208f13a9cff1670f143c6348"},{url:"styles/dark.css",revision:"436ac9aaaa67eb15e64c368cc05ba5a7"},{url:"js/dropbox/Dropbox-sdk.min.js",revision:"4b9842892aa37b156db0a8364b7a83b0"},{url:"js/onedrive/OneDrive.js",revision:"505e8280346666f7ee801bc59521fa67"},{url:"js/viewer-static.min.js",revision:"c7148759e7b2120d703b4cbf3dfda60f"},{url:"connect/jira/editor-1-3-3.html",revision:"6ec59ca5f689067e52cdda13f22ed89f"},{url:"connect/jira/viewerPanel-1-3-12.html",revision:"9adfcef71f6a8c68c20c2d2fba35fe19"},{url:"connect/jira/fullScreenViewer-1-3-3.html",revision:"29c803d9aa4dc0718540c916a0a4e62c"},{url:"connect/jira/viewerPanel.js",revision:"8d298de3aeaa32cad74b5d4b53ed3d4f"},{url:"connect/jira/spinner.gif",revision:"7d857ab9d86123e93d74d48e958fe743"},{url:"connect/jira/editor.js",revision:"d1c80a7301cd26c6dc31b1fdce9e37e5"},{url:"connect/jira/fullscreen-viewer-init.js",revision:"e00ad51fc16b87c362d6eaf930ab1fa5"},{url:"connect/jira/fullscreen-viewer.js",revision:"d5748a4fe01b7e747914ebd3e37c9de2"},{url:"plugins/connectJira.js",revision:"4cefa13414e0d406550f3c073923080c"},{url:"plugins/cConf-comments.js",revision:"ee6764429bf47a8545aa1cedacee718e"},{url:"plugins/cConf-1-4-8.js",revision:"91c04e236ba9dbdb26d8565b3354e00a"},{url:"connect/confluence/connectUtils-1-4-8.js",revision:"9b93b748a41a6f9444ff92810b7908b8"},{url:"connect/new_common/cac.js",revision:"6d666b6789b51dabc5a1af53a9db5d3d"},{url:"connect/gdrive_common/gac.js",revision:"78f85e79f15f56b8b8d83c90f4a15679"},{url:"connect/onedrive_common/ac.js",revision:"d10d4603e86da7c9af277dac832e8e06"},{url:"connect/confluence/viewer-init.js",revision:"8aa8d02147def4535563bc65632a3e6d"},{url:"connect/confluence/viewer.js",revision:"e865c0c1820464235ca8f0b9dc6eb71e"},{url:"connect/confluence/viewer-1-4-42.html",revision:"083a8751312bdb6485f2a4ced206e086"},{url:"connect/confluence/macroEditor-1-4-8.html",revision:"b2908e71f755a069fe6487e1e705736c"},{url:"connect/confluence/includeDiagram-1-4-8.js",revision:"2947a24a48572562d9fcb55b20d22fca"},{url:"connect/confluence/includeDiagram.html",revision:"bbc4156ca3902347d3c8121dd08a89d7"},{url:"connect/confluence/macro-editor.js",revision:"0bd745f0c23bba15ad1ff8e7b8e14987"},{url:"math/es5/startup.js",revision:"dc7130cdc866593293dbb5dde11ceb40"},{url:"math/es5/core.js",revision:"f71bc0bfb7d2ac8261747f97a5d47dd4"},{url:"math/es5/ui/safe.js",revision:"8c1fcfee7c879588ad409edcdd9cce53"},{url:"math/es5/output/svg.js",revision:"4f55967d16197ebb01b86356d8ab179a"},{url:"math/es5/input/tex.js",revision:"5c4f470da2ccb1acf85041fcecd6fff6"},{url:"math/es5/input/asciimath.js",revision:"c2d4076dd8e26d509bfe3a378e71cfa7"},{url:"math/es5/output/svg/fonts/tex.js",revision:"6eab785a3788ea805bd2b552d1f0aab8"},{url:"resources/dia.txt",revision:"f2bb9f811ec054499a5eca5add259a96"},{url:"resources/dia_am.txt",revision:"757af1ba9c187b2db9865965be4584d4"},{url:"resources/dia_ar.txt",revision:"f139fee88b934da5fc0e51c800449d2e"},{url:"resources/dia_bg.txt",revision:"b59ea02be4c9c5b60791327a42503115"},{url:"resources/dia_bn.txt",revision:"c7bb29b3be89b945859a9dbc996e3977"},{url:"resources/dia_bs.txt",revision:"c8faa32407ce808dd181f1708300dc65"},{url:"resources/dia_ca.txt",revision:"b2a3ab72212774891c4698f3aa67764b"},{url:"resources/dia_cs.txt",revision:"621536d118c10c11e0455bdc21d90495"},{url:"resources/dia_da.txt",revision:"2c9232e5e9cef27da9172a187a933115"},{url:"resources/dia_de.txt",revision:"112d8443021165e8c7d9994f97ddaf48"},{url:"resources/dia_el.txt",revision:"cbeb9bcc4a8a37ab0cce55d996c3b627"},{url:"resources/dia_eo.txt",revision:"c4d5feab9f7ce5d22f8487f4fc2bc585"},{url:"resources/dia_es.txt",revision:"d0d9810976aeb9b9fef0118aca1c3815"},{url:"resources/dia_et.txt",revision:"5303fb8a71bf11794f3cbe9324fd3d2d"},{url:"resources/dia_eu.txt",revision:"552e57dff8a9233098009af48380f066"},{url:"resources/dia_fa.txt",revision:"a2bd813de7a95f881a1ac941fab6ea29"},{url:"resources/dia_fi.txt",revision:"dbbd5d0126ad8f43fe18735f4f65b604"},{url:"resources/dia_fil.txt",revision:"0efbb4b0779c2314496e2209272f1729"},{url:"resources/dia_fr.txt",revision:"60a1a016d2ba9f171848b48a3b4baadd"},{url:"resources/dia_gl.txt",revision:"089dd7084f23978ef1696e674bcc4cab"},{url:"resources/dia_gu.txt",revision:"e00b05d0b7fe33e23a8c589c8226d2a7"},{url:"resources/dia_he.txt",revision:"bba5f189a07b266f40dfed938b0068c6"},{url:"resources/dia_hi.txt",revision:"d580a9d0f5545626c9cc37daafc51a3c"},{url:"resources/dia_hr.txt",revision:"97deaf0afd81d692f005dc02f329ac88"},{url:"resources/dia_hu.txt",revision:"465d05499416a9adeb023313a8160424"},{url:"resources/dia_id.txt",revision:"3e5ab9a1098930d4dd84278169f49b86"},{url:"resources/dia_it.txt",revision:"da633c90cadf73d0df46991b5586df54"},{url:"resources/dia_ja.txt",revision:"95dcedfc13dd97fb2ae63184d3ae14fc"},{url:"resources/dia_kn.txt",revision:"965dc84ec662842d0c313674632a5544"},{url:"resources/dia_ko.txt",revision:"e49ee6d9c9bbc77276cb85c97069b919"},{url:"resources/dia_lt.txt",revision:"51465381c456510952d6269952dced5e"},{url:"resources/dia_lv.txt",revision:"3ac8dd9a8bb6e7ec1143ab46cd70b96a"},{url:"resources/dia_ml.txt",revision:"11910b85c2616d84d97651e97cf11d7a"},{url:"resources/dia_mr.txt",revision:"8497141bca86742111017248e26a07ea"},{url:"resources/dia_ms.txt",revision:"ee74d690582d04322dba57dbc7224c99"},{url:"resources/dia_my.txt",revision:"f2bb9f811ec054499a5eca5add259a96"},{url:"resources/dia_nl.txt",revision:"35a2a6ece18b1c59893925d547425261"},{url:"resources/dia_no.txt",revision:"b0b4fe8a1c31db304d431935cdab14b8"},{url:"resources/dia_pl.txt",revision:"c86f5e75805a2903734a1c9a7a81d63b"},{url:"resources/dia_pt-br.txt",revision:"2eee01639ff6775e24220fbfa3c9c788"},{url:"resources/dia_pt.txt",revision:"63407d1bd46853ff9e3ed3b9ace9602f"},{url:"resources/dia_ro.txt",revision:"e2e5f6a838ae71143e6c50b290af7bb1"},{url:"resources/dia_ru.txt",revision:"38de6a4f45437cdd66dc3decc48c8841"},{url:"resources/dia_si.txt",revision:"f2bb9f811ec054499a5eca5add259a96"},{url:"resources/dia_sk.txt",revision:"58fffaadfebfec4deafcfc5c20178b57"},{url:"resources/dia_sl.txt",revision:"a66ac8feda2a580540b7b840603c1e23"},{url:"resources/dia_sr.txt",revision:"9cb339e7ca6db727cbcec145b01a7bdb"},{url:"resources/dia_sv.txt",revision:"84338c7bffb013c00b71ee6868a55b9f"},{url:"resources/dia_sw.txt",revision:"476b03b2ee388853d15f8f7924a10e40"},{url:"resources/dia_ta.txt",revision:"ef879e2a9c097abe6b578a22df399257"},{url:"resources/dia_te.txt",revision:"efd7ac431c2163371f13f1e0cdb05aaa"},{url:"resources/dia_th.txt",revision:"1ab6b69b33a88ed897c96a885165a566"},{url:"resources/dia_tr.txt",revision:"4c1bae6ee6079bf94c4e7e86a49b2684"},{url:"resources/dia_uk.txt",revision:"612e5ccdf38b00749ff4926cd1ea2b3f"},{url:"resources/dia_vi.txt",revision:"757058bddd335a0c0bc37829a2b2ff2a"},{url:"resources/dia_zh-tw.txt",revision:"838b0f7bd695a5a2a0c5ebbd83d33296"},{url:"resources/dia_zh.txt",revision:"7736de1c10669ab8f284558fb5dc434c"},{url:"favicon.ico",revision:"fab2d88b37c72d83607527573de45281"},{url:"images/manifest.json",revision:"389fa448cb99794bece27ffcb216abee"},{url:"images/logo.png",revision:"89630b64b911ebe0daa3dfe442087cfa"},{url:"images/drawlogo.svg",revision:"4bf4d14ebcf072d8bd4c5a1c89e88fc6"},{url:"images/drawlogo48.png",revision:"8b13428373aca67b895364d025f42417"},{url:"images/drawlogo-gray.svg",revision:"0aabacbc0873816e1e09e4736ae44c7d"},{url:"images/drawlogo-text-bottom.svg",revision:"f6c438823ab31f290940bd4feb8dd9c2"},{url:"images/default-user.jpg",revision:"2c399696a87c8921f12d2f9e1990cc6e"},{url:"images/logo-flat-small.png",revision:"4b178e59ff499d6dd1894fc498b59877"},{url:"images/apple-touch-icon.png",revision:"73da7989a23ce9a4be565ec65658a239"},{url:"images/favicon-16x16.png",revision:"1a79d5461a5d2bf21f6652e0ac20d6e5"},{url:"images/favicon-32x32.png",revision:"e3b92da2febe70bad5372f6f3474b034"},{url:"images/android-chrome-196x196.png",revision:"f8c045b2d7b1c719fda64edab04c415c"},{url:"images/android-chrome-512x512.png",revision:"959b5fac2453963ff6d60fb85e4b73fd"},{url:"images/delete.png",revision:"5f2350f2fd20f1a229637aed32ed8f29"},{url:"images/droptarget.png",revision:"bbf7f563fb6784de1ce96f329519b043"},{url:"images/help.png",revision:"9266c6c3915bd33c243d80037d37bf61"},{url:"images/download.png",revision:"35418dd7bd48d87502c71b578cc6c37f"},{url:"images/logo-flat.png",revision:"038070ab43aee6e54a791211859fc67b"},{url:"images/google-drive-logo.svg",revision:"5d9f2f5bbc7dcc252730a0072bb23059"},{url:"images/onedrive-logo.svg",revision:"3645b344ec0634c1290dd58d7dc87b97"},{url:"images/dropbox-logo.svg",revision:"e6be408c77cf9c82d41ac64fa854280a"},{url:"images/github-logo.svg",revision:"a1a999b69a275eac0cb918360ac05ae1"},{url:"images/gitlab-logo.svg",revision:"0faea8c818899e58533e153c44b10517"},{url:"images/trello-logo.svg",revision:"006fd0d7d70d7e95dc691674cb12e044"},{url:"images/osa_drive-harddisk.png",revision:"b954e1ae772087c5b4c6ae797e1f9649"},{url:"images/osa_database.png",revision:"c350d9d9b95f37b6cfe798b40ede5fb0"},{url:"images/google-drive-logo-white.svg",revision:"f329d8b1be7778515a85b93fc35d9f26"},{url:"images/dropbox-logo-white.svg",revision:"4ea8299ac3bc31a16f199ee3aec223bf"},{url:"images/onedrive-logo-white.svg",revision:"b3602fa0fc947009cff3f33a581cff4d"},{url:"images/github-logo-white.svg",revision:"537b1127b3ca0f95b45782d1304fb77a"},{url:"images/gitlab-logo-white.svg",revision:"5fede9ac2f394c716b8c23e3fddc3910"},{url:"images/trello-logo-white-orange.svg",revision:"e2a0a52ba3766682f138138d10a75eb5"},{url:"images/logo-confluence.png",revision:"ed1e55d44ae5eba8f999aba2c93e8331"},{url:"images/logo-jira.png",revision:"f8d460555a0d1f87cfd901e940666629"},{url:"images/clear.gif",revision:"db13c778e4382e0b55258d0f811d5d70"},{url:"images/spin.gif",revision:"487cbb40b9ced439aa1ad914e816d773"},{url:"images/checkmark.gif",revision:"ba764ce62f2bf952df5bbc2bb4d381c5"},{url:"images/hs.png",revision:"fefa1a03d92ebad25c88dca94a0b63db"},{url:"images/aui-wait.gif",revision:"5a474bcbd8d2f2826f03d10ea44bf60e"},{url:"mxgraph/css/common.css",revision:"618b42f0bde0c7685e04811c25dc2b3e"},{url:"mxgraph/images/expanded.gif",revision:"2b67c2c035af1e9a5cc814f0d22074cf"},{url:"mxgraph/images/collapsed.gif",revision:"73cc826da002a3d740ca4ce6ec5c1f4a"},{url:"mxgraph/images/maximize.gif",revision:"5cd13d6925493ab51e876694cc1c2ec2"},{url:"mxgraph/images/minimize.gif",revision:"8957741b9b0f86af9438775f2aadbb54"},{url:"mxgraph/images/close.gif",revision:"8b84669812ac7382984fca35de8da48b"},{url:"mxgraph/images/resize.gif",revision:"a6477612b3567a34033f9cac6184eed3"},{url:"mxgraph/images/separator.gif",revision:"7819742ff106c97da7a801c2372bbbe5"},{url:"mxgraph/images/window.gif",revision:"fd9a21dd4181f98052a202a0a01f18ab"},{url:"mxgraph/images/window-title.gif",revision:"3fb1d6c43246cdf991a11dfe826dfe99"},{url:"mxgraph/images/button.gif",revision:"00759bdc3ad218fa739f584369541809"},{url:"mxgraph/images/point.gif",revision:"83a43717b284902442620f61bc4e9fa6"}],{ignoreURLParametersMatching:[/.*/]})}));
+if(!self.define){const e=e=>{"require"!==e&&(e+=".js");let r=Promise.resolve();return i[e]||(r=new Promise((async r=>{if("document"in self){const i=document.createElement("script");i.src=e,document.head.appendChild(i),i.onload=r}else importScripts(e),r()}))),r.then((()=>{if(!i[e])throw new Error(`Module ${e} didn’t register its module`);return i[e]}))},r=(r,i)=>{Promise.all(r.map(e)).then((e=>i(1===e.length?e[0]:e)))},i={require:Promise.resolve(r)};self.define=(r,a,c)=>{i[r]||(i[r]=Promise.resolve().then((()=>{let i={};const s={uri:location.origin+r.slice(1)};return Promise.all(a.map((r=>{switch(r){case"exports":return i;case"module":return s;default:return e(r)}}))).then((e=>{const r=c(...e);return i.default||(i.default=r),i}))})))}}define("./service-worker.js",["./workbox-99ba3a23"],(function(e){"use strict";self.addEventListener("message",(e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()})),e.precacheAndRoute([{url:"js/app.min.js",revision:"94d4887ca9c27d6b300b5dbc85e155ab"},{url:"js/extensions.min.js",revision:"3834501a2250d98fc7207a6ae6298f14"},{url:"js/orgchart.min.js",revision:"619d8c4dab47b81868916df31f55478b"},{url:"js/stencils.min.js",revision:"698f1f70f64466ff6ae9280cd91cd23f"},{url:"js/shapes-14-6-5.min.js",revision:"95f54e7999c9fba2a1d65b4fe4f634f3"},{url:"js/math-print.js",revision:"cf64f6a493a8cb5079f2b70813e478d7"},{url:"index.html",revision:"d29a8e0ad73c5cfd3dc1e35361bf558b"},{url:"open.html",revision:"d71816b3b00e769fc6019fcdd6921662"},{url:"styles/fonts/ArchitectsDaughter-Regular.ttf",revision:"31c2153c0530e32553b31a49b3d70736"},{url:"styles/grapheditor.css",revision:"c80c6d3bdaa85e0fbc9d9b174ef763f4"},{url:"styles/atlas.css",revision:"d627cfef208f13a9cff1670f143c6348"},{url:"styles/dark.css",revision:"436ac9aaaa67eb15e64c368cc05ba5a7"},{url:"js/dropbox/Dropbox-sdk.min.js",revision:"4b9842892aa37b156db0a8364b7a83b0"},{url:"js/onedrive/OneDrive.js",revision:"505e8280346666f7ee801bc59521fa67"},{url:"js/viewer-static.min.js",revision:"93a4740f593c525cf58cf653d05e8373"},{url:"connect/jira/editor-1-3-3.html",revision:"6ec59ca5f689067e52cdda13f22ed89f"},{url:"connect/jira/viewerPanel-1-3-12.html",revision:"9adfcef71f6a8c68c20c2d2fba35fe19"},{url:"connect/jira/fullScreenViewer-1-3-3.html",revision:"29c803d9aa4dc0718540c916a0a4e62c"},{url:"connect/jira/viewerPanel.js",revision:"8d298de3aeaa32cad74b5d4b53ed3d4f"},{url:"connect/jira/spinner.gif",revision:"7d857ab9d86123e93d74d48e958fe743"},{url:"connect/jira/editor.js",revision:"d1c80a7301cd26c6dc31b1fdce9e37e5"},{url:"connect/jira/fullscreen-viewer-init.js",revision:"e00ad51fc16b87c362d6eaf930ab1fa5"},{url:"connect/jira/fullscreen-viewer.js",revision:"d5748a4fe01b7e747914ebd3e37c9de2"},{url:"plugins/connectJira.js",revision:"4cefa13414e0d406550f3c073923080c"},{url:"plugins/cConf-comments.js",revision:"ee6764429bf47a8545aa1cedacee718e"},{url:"plugins/cConf-1-4-8.js",revision:"91c04e236ba9dbdb26d8565b3354e00a"},{url:"connect/confluence/connectUtils-1-4-8.js",revision:"9b93b748a41a6f9444ff92810b7908b8"},{url:"connect/new_common/cac.js",revision:"6d666b6789b51dabc5a1af53a9db5d3d"},{url:"connect/gdrive_common/gac.js",revision:"78f85e79f15f56b8b8d83c90f4a15679"},{url:"connect/onedrive_common/ac.js",revision:"d10d4603e86da7c9af277dac832e8e06"},{url:"connect/confluence/viewer-init.js",revision:"8aa8d02147def4535563bc65632a3e6d"},{url:"connect/confluence/viewer.js",revision:"e865c0c1820464235ca8f0b9dc6eb71e"},{url:"connect/confluence/viewer-1-4-42.html",revision:"083a8751312bdb6485f2a4ced206e086"},{url:"connect/confluence/macroEditor-1-4-8.html",revision:"b2908e71f755a069fe6487e1e705736c"},{url:"connect/confluence/includeDiagram-1-4-8.js",revision:"2947a24a48572562d9fcb55b20d22fca"},{url:"connect/confluence/includeDiagram.html",revision:"bbc4156ca3902347d3c8121dd08a89d7"},{url:"connect/confluence/macro-editor.js",revision:"0bd745f0c23bba15ad1ff8e7b8e14987"},{url:"math/es5/startup.js",revision:"dc7130cdc866593293dbb5dde11ceb40"},{url:"math/es5/core.js",revision:"f71bc0bfb7d2ac8261747f97a5d47dd4"},{url:"math/es5/ui/safe.js",revision:"8c1fcfee7c879588ad409edcdd9cce53"},{url:"math/es5/output/svg.js",revision:"4f55967d16197ebb01b86356d8ab179a"},{url:"math/es5/input/tex.js",revision:"5c4f470da2ccb1acf85041fcecd6fff6"},{url:"math/es5/input/asciimath.js",revision:"c2d4076dd8e26d509bfe3a378e71cfa7"},{url:"math/es5/output/svg/fonts/tex.js",revision:"6eab785a3788ea805bd2b552d1f0aab8"},{url:"resources/dia.txt",revision:"f2bb9f811ec054499a5eca5add259a96"},{url:"resources/dia_am.txt",revision:"757af1ba9c187b2db9865965be4584d4"},{url:"resources/dia_ar.txt",revision:"f139fee88b934da5fc0e51c800449d2e"},{url:"resources/dia_bg.txt",revision:"b59ea02be4c9c5b60791327a42503115"},{url:"resources/dia_bn.txt",revision:"c7bb29b3be89b945859a9dbc996e3977"},{url:"resources/dia_bs.txt",revision:"c8faa32407ce808dd181f1708300dc65"},{url:"resources/dia_ca.txt",revision:"8dc84ddf5fc455eee7390adb7bb8fb42"},{url:"resources/dia_cs.txt",revision:"621536d118c10c11e0455bdc21d90495"},{url:"resources/dia_da.txt",revision:"2c9232e5e9cef27da9172a187a933115"},{url:"resources/dia_de.txt",revision:"112d8443021165e8c7d9994f97ddaf48"},{url:"resources/dia_el.txt",revision:"cbeb9bcc4a8a37ab0cce55d996c3b627"},{url:"resources/dia_eo.txt",revision:"c4d5feab9f7ce5d22f8487f4fc2bc585"},{url:"resources/dia_es.txt",revision:"d0d9810976aeb9b9fef0118aca1c3815"},{url:"resources/dia_et.txt",revision:"5303fb8a71bf11794f3cbe9324fd3d2d"},{url:"resources/dia_eu.txt",revision:"552e57dff8a9233098009af48380f066"},{url:"resources/dia_fa.txt",revision:"a2bd813de7a95f881a1ac941fab6ea29"},{url:"resources/dia_fi.txt",revision:"dbbd5d0126ad8f43fe18735f4f65b604"},{url:"resources/dia_fil.txt",revision:"0efbb4b0779c2314496e2209272f1729"},{url:"resources/dia_fr.txt",revision:"60a1a016d2ba9f171848b48a3b4baadd"},{url:"resources/dia_gl.txt",revision:"089dd7084f23978ef1696e674bcc4cab"},{url:"resources/dia_gu.txt",revision:"e00b05d0b7fe33e23a8c589c8226d2a7"},{url:"resources/dia_he.txt",revision:"bba5f189a07b266f40dfed938b0068c6"},{url:"resources/dia_hi.txt",revision:"d580a9d0f5545626c9cc37daafc51a3c"},{url:"resources/dia_hr.txt",revision:"97deaf0afd81d692f005dc02f329ac88"},{url:"resources/dia_hu.txt",revision:"465d05499416a9adeb023313a8160424"},{url:"resources/dia_id.txt",revision:"228d2a20f4627360cfb07e25aea78104"},{url:"resources/dia_it.txt",revision:"da633c90cadf73d0df46991b5586df54"},{url:"resources/dia_ja.txt",revision:"95dcedfc13dd97fb2ae63184d3ae14fc"},{url:"resources/dia_kn.txt",revision:"965dc84ec662842d0c313674632a5544"},{url:"resources/dia_ko.txt",revision:"e49ee6d9c9bbc77276cb85c97069b919"},{url:"resources/dia_lt.txt",revision:"51465381c456510952d6269952dced5e"},{url:"resources/dia_lv.txt",revision:"3ac8dd9a8bb6e7ec1143ab46cd70b96a"},{url:"resources/dia_ml.txt",revision:"11910b85c2616d84d97651e97cf11d7a"},{url:"resources/dia_mr.txt",revision:"8497141bca86742111017248e26a07ea"},{url:"resources/dia_ms.txt",revision:"ee74d690582d04322dba57dbc7224c99"},{url:"resources/dia_my.txt",revision:"f2bb9f811ec054499a5eca5add259a96"},{url:"resources/dia_nl.txt",revision:"35a2a6ece18b1c59893925d547425261"},{url:"resources/dia_no.txt",revision:"b0b4fe8a1c31db304d431935cdab14b8"},{url:"resources/dia_pl.txt",revision:"c86f5e75805a2903734a1c9a7a81d63b"},{url:"resources/dia_pt-br.txt",revision:"2eee01639ff6775e24220fbfa3c9c788"},{url:"resources/dia_pt.txt",revision:"63407d1bd46853ff9e3ed3b9ace9602f"},{url:"resources/dia_ro.txt",revision:"e2e5f6a838ae71143e6c50b290af7bb1"},{url:"resources/dia_ru.txt",revision:"38de6a4f45437cdd66dc3decc48c8841"},{url:"resources/dia_si.txt",revision:"f2bb9f811ec054499a5eca5add259a96"},{url:"resources/dia_sk.txt",revision:"58fffaadfebfec4deafcfc5c20178b57"},{url:"resources/dia_sl.txt",revision:"a66ac8feda2a580540b7b840603c1e23"},{url:"resources/dia_sr.txt",revision:"9cb339e7ca6db727cbcec145b01a7bdb"},{url:"resources/dia_sv.txt",revision:"84338c7bffb013c00b71ee6868a55b9f"},{url:"resources/dia_sw.txt",revision:"476b03b2ee388853d15f8f7924a10e40"},{url:"resources/dia_ta.txt",revision:"ef879e2a9c097abe6b578a22df399257"},{url:"resources/dia_te.txt",revision:"efd7ac431c2163371f13f1e0cdb05aaa"},{url:"resources/dia_th.txt",revision:"1ab6b69b33a88ed897c96a885165a566"},{url:"resources/dia_tr.txt",revision:"4c1bae6ee6079bf94c4e7e86a49b2684"},{url:"resources/dia_uk.txt",revision:"612e5ccdf38b00749ff4926cd1ea2b3f"},{url:"resources/dia_vi.txt",revision:"757058bddd335a0c0bc37829a2b2ff2a"},{url:"resources/dia_zh-tw.txt",revision:"838b0f7bd695a5a2a0c5ebbd83d33296"},{url:"resources/dia_zh.txt",revision:"7736de1c10669ab8f284558fb5dc434c"},{url:"favicon.ico",revision:"fab2d88b37c72d83607527573de45281"},{url:"images/manifest.json",revision:"389fa448cb99794bece27ffcb216abee"},{url:"images/logo.png",revision:"89630b64b911ebe0daa3dfe442087cfa"},{url:"images/drawlogo.svg",revision:"4bf4d14ebcf072d8bd4c5a1c89e88fc6"},{url:"images/drawlogo48.png",revision:"8b13428373aca67b895364d025f42417"},{url:"images/drawlogo-gray.svg",revision:"0aabacbc0873816e1e09e4736ae44c7d"},{url:"images/drawlogo-text-bottom.svg",revision:"f6c438823ab31f290940bd4feb8dd9c2"},{url:"images/default-user.jpg",revision:"2c399696a87c8921f12d2f9e1990cc6e"},{url:"images/logo-flat-small.png",revision:"4b178e59ff499d6dd1894fc498b59877"},{url:"images/apple-touch-icon.png",revision:"73da7989a23ce9a4be565ec65658a239"},{url:"images/favicon-16x16.png",revision:"1a79d5461a5d2bf21f6652e0ac20d6e5"},{url:"images/favicon-32x32.png",revision:"e3b92da2febe70bad5372f6f3474b034"},{url:"images/android-chrome-196x196.png",revision:"f8c045b2d7b1c719fda64edab04c415c"},{url:"images/android-chrome-512x512.png",revision:"959b5fac2453963ff6d60fb85e4b73fd"},{url:"images/delete.png",revision:"5f2350f2fd20f1a229637aed32ed8f29"},{url:"images/droptarget.png",revision:"bbf7f563fb6784de1ce96f329519b043"},{url:"images/help.png",revision:"9266c6c3915bd33c243d80037d37bf61"},{url:"images/download.png",revision:"35418dd7bd48d87502c71b578cc6c37f"},{url:"images/logo-flat.png",revision:"038070ab43aee6e54a791211859fc67b"},{url:"images/google-drive-logo.svg",revision:"5d9f2f5bbc7dcc252730a0072bb23059"},{url:"images/onedrive-logo.svg",revision:"3645b344ec0634c1290dd58d7dc87b97"},{url:"images/dropbox-logo.svg",revision:"e6be408c77cf9c82d41ac64fa854280a"},{url:"images/github-logo.svg",revision:"a1a999b69a275eac0cb918360ac05ae1"},{url:"images/gitlab-logo.svg",revision:"0faea8c818899e58533e153c44b10517"},{url:"images/trello-logo.svg",revision:"006fd0d7d70d7e95dc691674cb12e044"},{url:"images/osa_drive-harddisk.png",revision:"b954e1ae772087c5b4c6ae797e1f9649"},{url:"images/osa_database.png",revision:"c350d9d9b95f37b6cfe798b40ede5fb0"},{url:"images/google-drive-logo-white.svg",revision:"f329d8b1be7778515a85b93fc35d9f26"},{url:"images/dropbox-logo-white.svg",revision:"4ea8299ac3bc31a16f199ee3aec223bf"},{url:"images/onedrive-logo-white.svg",revision:"b3602fa0fc947009cff3f33a581cff4d"},{url:"images/github-logo-white.svg",revision:"537b1127b3ca0f95b45782d1304fb77a"},{url:"images/gitlab-logo-white.svg",revision:"5fede9ac2f394c716b8c23e3fddc3910"},{url:"images/trello-logo-white-orange.svg",revision:"e2a0a52ba3766682f138138d10a75eb5"},{url:"images/logo-confluence.png",revision:"ed1e55d44ae5eba8f999aba2c93e8331"},{url:"images/logo-jira.png",revision:"f8d460555a0d1f87cfd901e940666629"},{url:"images/clear.gif",revision:"db13c778e4382e0b55258d0f811d5d70"},{url:"images/spin.gif",revision:"487cbb40b9ced439aa1ad914e816d773"},{url:"images/checkmark.gif",revision:"ba764ce62f2bf952df5bbc2bb4d381c5"},{url:"images/hs.png",revision:"fefa1a03d92ebad25c88dca94a0b63db"},{url:"images/aui-wait.gif",revision:"5a474bcbd8d2f2826f03d10ea44bf60e"},{url:"mxgraph/css/common.css",revision:"618b42f0bde0c7685e04811c25dc2b3e"},{url:"mxgraph/images/expanded.gif",revision:"2b67c2c035af1e9a5cc814f0d22074cf"},{url:"mxgraph/images/collapsed.gif",revision:"73cc826da002a3d740ca4ce6ec5c1f4a"},{url:"mxgraph/images/maximize.gif",revision:"5cd13d6925493ab51e876694cc1c2ec2"},{url:"mxgraph/images/minimize.gif",revision:"8957741b9b0f86af9438775f2aadbb54"},{url:"mxgraph/images/close.gif",revision:"8b84669812ac7382984fca35de8da48b"},{url:"mxgraph/images/resize.gif",revision:"a6477612b3567a34033f9cac6184eed3"},{url:"mxgraph/images/separator.gif",revision:"7819742ff106c97da7a801c2372bbbe5"},{url:"mxgraph/images/window.gif",revision:"fd9a21dd4181f98052a202a0a01f18ab"},{url:"mxgraph/images/window-title.gif",revision:"3fb1d6c43246cdf991a11dfe826dfe99"},{url:"mxgraph/images/button.gif",revision:"00759bdc3ad218fa739f584369541809"},{url:"mxgraph/images/point.gif",revision:"83a43717b284902442620f61bc4e9fa6"}],{ignoreURLParametersMatching:[/.*/]})}));
 //# sourceMappingURL=service-worker.js.map
diff --git a/src/main/webapp/service-worker.js.map b/src/main/webapp/service-worker.js.map
index 5ad106554d..e2e405f0f0 100644
--- a/src/main/webapp/service-worker.js.map
+++ b/src/main/webapp/service-worker.js.map
@@ -1 +1 @@
-{"version":3,"file":"service-worker.js","sources":["../../../../../tmp/47be77072c8f5a091f9e8b37e334731c/service-worker.js"],"sourcesContent":["import {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/usr/lib/node_modules/workbox-cli/node_modules/workbox-precaching/precacheAndRoute.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.addEventListener('message', (event) => {\n  if (event.data && event.data.type === 'SKIP_WAITING') {\n    self.skipWaiting();\n  }\n});\n\n\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n  {\n    \"url\": \"js/app.min.js\",\n    \"revision\": \"24ace1901711d6cab23a4ef379de9120\"\n  },\n  {\n    \"url\": \"js/extensions.min.js\",\n    \"revision\": \"3834501a2250d98fc7207a6ae6298f14\"\n  },\n  {\n    \"url\": \"js/orgchart.min.js\",\n    \"revision\": \"619d8c4dab47b81868916df31f55478b\"\n  },\n  {\n    \"url\": \"js/stencils.min.js\",\n    \"revision\": \"698f1f70f64466ff6ae9280cd91cd23f\"\n  },\n  {\n    \"url\": \"js/shapes-14-6-5.min.js\",\n    \"revision\": \"95f54e7999c9fba2a1d65b4fe4f634f3\"\n  },\n  {\n    \"url\": \"js/math-print.js\",\n    \"revision\": \"cf64f6a493a8cb5079f2b70813e478d7\"\n  },\n  {\n    \"url\": \"index.html\",\n    \"revision\": \"8279349dc2b6543249d7e51c2d1cf92e\"\n  },\n  {\n    \"url\": \"open.html\",\n    \"revision\": \"d71816b3b00e769fc6019fcdd6921662\"\n  },\n  {\n    \"url\": \"styles/fonts/ArchitectsDaughter-Regular.ttf\",\n    \"revision\": \"31c2153c0530e32553b31a49b3d70736\"\n  },\n  {\n    \"url\": \"styles/grapheditor.css\",\n    \"revision\": \"c80c6d3bdaa85e0fbc9d9b174ef763f4\"\n  },\n  {\n    \"url\": \"styles/atlas.css\",\n    \"revision\": \"d627cfef208f13a9cff1670f143c6348\"\n  },\n  {\n    \"url\": \"styles/dark.css\",\n    \"revision\": \"436ac9aaaa67eb15e64c368cc05ba5a7\"\n  },\n  {\n    \"url\": \"js/dropbox/Dropbox-sdk.min.js\",\n    \"revision\": \"4b9842892aa37b156db0a8364b7a83b0\"\n  },\n  {\n    \"url\": \"js/onedrive/OneDrive.js\",\n    \"revision\": \"505e8280346666f7ee801bc59521fa67\"\n  },\n  {\n    \"url\": \"js/viewer-static.min.js\",\n    \"revision\": \"c7148759e7b2120d703b4cbf3dfda60f\"\n  },\n  {\n    \"url\": \"connect/jira/editor-1-3-3.html\",\n    \"revision\": \"6ec59ca5f689067e52cdda13f22ed89f\"\n  },\n  {\n    \"url\": \"connect/jira/viewerPanel-1-3-12.html\",\n    \"revision\": \"9adfcef71f6a8c68c20c2d2fba35fe19\"\n  },\n  {\n    \"url\": \"connect/jira/fullScreenViewer-1-3-3.html\",\n    \"revision\": \"29c803d9aa4dc0718540c916a0a4e62c\"\n  },\n  {\n    \"url\": \"connect/jira/viewerPanel.js\",\n    \"revision\": \"8d298de3aeaa32cad74b5d4b53ed3d4f\"\n  },\n  {\n    \"url\": \"connect/jira/spinner.gif\",\n    \"revision\": \"7d857ab9d86123e93d74d48e958fe743\"\n  },\n  {\n    \"url\": \"connect/jira/editor.js\",\n    \"revision\": \"d1c80a7301cd26c6dc31b1fdce9e37e5\"\n  },\n  {\n    \"url\": \"connect/jira/fullscreen-viewer-init.js\",\n    \"revision\": \"e00ad51fc16b87c362d6eaf930ab1fa5\"\n  },\n  {\n    \"url\": \"connect/jira/fullscreen-viewer.js\",\n    \"revision\": \"d5748a4fe01b7e747914ebd3e37c9de2\"\n  },\n  {\n    \"url\": \"plugins/connectJira.js\",\n    \"revision\": \"4cefa13414e0d406550f3c073923080c\"\n  },\n  {\n    \"url\": \"plugins/cConf-comments.js\",\n    \"revision\": \"ee6764429bf47a8545aa1cedacee718e\"\n  },\n  {\n    \"url\": \"plugins/cConf-1-4-8.js\",\n    \"revision\": \"91c04e236ba9dbdb26d8565b3354e00a\"\n  },\n  {\n    \"url\": \"connect/confluence/connectUtils-1-4-8.js\",\n    \"revision\": \"9b93b748a41a6f9444ff92810b7908b8\"\n  },\n  {\n    \"url\": \"connect/new_common/cac.js\",\n    \"revision\": \"6d666b6789b51dabc5a1af53a9db5d3d\"\n  },\n  {\n    \"url\": \"connect/gdrive_common/gac.js\",\n    \"revision\": \"78f85e79f15f56b8b8d83c90f4a15679\"\n  },\n  {\n    \"url\": \"connect/onedrive_common/ac.js\",\n    \"revision\": \"d10d4603e86da7c9af277dac832e8e06\"\n  },\n  {\n    \"url\": \"connect/confluence/viewer-init.js\",\n    \"revision\": \"8aa8d02147def4535563bc65632a3e6d\"\n  },\n  {\n    \"url\": \"connect/confluence/viewer.js\",\n    \"revision\": \"e865c0c1820464235ca8f0b9dc6eb71e\"\n  },\n  {\n    \"url\": \"connect/confluence/viewer-1-4-42.html\",\n    \"revision\": \"083a8751312bdb6485f2a4ced206e086\"\n  },\n  {\n    \"url\": \"connect/confluence/macroEditor-1-4-8.html\",\n    \"revision\": \"b2908e71f755a069fe6487e1e705736c\"\n  },\n  {\n    \"url\": \"connect/confluence/includeDiagram-1-4-8.js\",\n    \"revision\": \"2947a24a48572562d9fcb55b20d22fca\"\n  },\n  {\n    \"url\": \"connect/confluence/includeDiagram.html\",\n    \"revision\": \"bbc4156ca3902347d3c8121dd08a89d7\"\n  },\n  {\n    \"url\": \"connect/confluence/macro-editor.js\",\n    \"revision\": \"0bd745f0c23bba15ad1ff8e7b8e14987\"\n  },\n  {\n    \"url\": \"math/es5/startup.js\",\n    \"revision\": \"dc7130cdc866593293dbb5dde11ceb40\"\n  },\n  {\n    \"url\": \"math/es5/core.js\",\n    \"revision\": \"f71bc0bfb7d2ac8261747f97a5d47dd4\"\n  },\n  {\n    \"url\": \"math/es5/ui/safe.js\",\n    \"revision\": \"8c1fcfee7c879588ad409edcdd9cce53\"\n  },\n  {\n    \"url\": \"math/es5/output/svg.js\",\n    \"revision\": \"4f55967d16197ebb01b86356d8ab179a\"\n  },\n  {\n    \"url\": \"math/es5/input/tex.js\",\n    \"revision\": \"5c4f470da2ccb1acf85041fcecd6fff6\"\n  },\n  {\n    \"url\": \"math/es5/input/asciimath.js\",\n    \"revision\": \"c2d4076dd8e26d509bfe3a378e71cfa7\"\n  },\n  {\n    \"url\": \"math/es5/output/svg/fonts/tex.js\",\n    \"revision\": \"6eab785a3788ea805bd2b552d1f0aab8\"\n  },\n  {\n    \"url\": \"resources/dia.txt\",\n    \"revision\": \"f2bb9f811ec054499a5eca5add259a96\"\n  },\n  {\n    \"url\": \"resources/dia_am.txt\",\n    \"revision\": \"757af1ba9c187b2db9865965be4584d4\"\n  },\n  {\n    \"url\": \"resources/dia_ar.txt\",\n    \"revision\": \"f139fee88b934da5fc0e51c800449d2e\"\n  },\n  {\n    \"url\": \"resources/dia_bg.txt\",\n    \"revision\": \"b59ea02be4c9c5b60791327a42503115\"\n  },\n  {\n    \"url\": \"resources/dia_bn.txt\",\n    \"revision\": \"c7bb29b3be89b945859a9dbc996e3977\"\n  },\n  {\n    \"url\": \"resources/dia_bs.txt\",\n    \"revision\": \"c8faa32407ce808dd181f1708300dc65\"\n  },\n  {\n    \"url\": \"resources/dia_ca.txt\",\n    \"revision\": \"b2a3ab72212774891c4698f3aa67764b\"\n  },\n  {\n    \"url\": \"resources/dia_cs.txt\",\n    \"revision\": \"621536d118c10c11e0455bdc21d90495\"\n  },\n  {\n    \"url\": \"resources/dia_da.txt\",\n    \"revision\": \"2c9232e5e9cef27da9172a187a933115\"\n  },\n  {\n    \"url\": \"resources/dia_de.txt\",\n    \"revision\": \"112d8443021165e8c7d9994f97ddaf48\"\n  },\n  {\n    \"url\": \"resources/dia_el.txt\",\n    \"revision\": \"cbeb9bcc4a8a37ab0cce55d996c3b627\"\n  },\n  {\n    \"url\": \"resources/dia_eo.txt\",\n    \"revision\": \"c4d5feab9f7ce5d22f8487f4fc2bc585\"\n  },\n  {\n    \"url\": \"resources/dia_es.txt\",\n    \"revision\": \"d0d9810976aeb9b9fef0118aca1c3815\"\n  },\n  {\n    \"url\": \"resources/dia_et.txt\",\n    \"revision\": \"5303fb8a71bf11794f3cbe9324fd3d2d\"\n  },\n  {\n    \"url\": \"resources/dia_eu.txt\",\n    \"revision\": \"552e57dff8a9233098009af48380f066\"\n  },\n  {\n    \"url\": \"resources/dia_fa.txt\",\n    \"revision\": \"a2bd813de7a95f881a1ac941fab6ea29\"\n  },\n  {\n    \"url\": \"resources/dia_fi.txt\",\n    \"revision\": \"dbbd5d0126ad8f43fe18735f4f65b604\"\n  },\n  {\n    \"url\": \"resources/dia_fil.txt\",\n    \"revision\": \"0efbb4b0779c2314496e2209272f1729\"\n  },\n  {\n    \"url\": \"resources/dia_fr.txt\",\n    \"revision\": \"60a1a016d2ba9f171848b48a3b4baadd\"\n  },\n  {\n    \"url\": \"resources/dia_gl.txt\",\n    \"revision\": \"089dd7084f23978ef1696e674bcc4cab\"\n  },\n  {\n    \"url\": \"resources/dia_gu.txt\",\n    \"revision\": \"e00b05d0b7fe33e23a8c589c8226d2a7\"\n  },\n  {\n    \"url\": \"resources/dia_he.txt\",\n    \"revision\": \"bba5f189a07b266f40dfed938b0068c6\"\n  },\n  {\n    \"url\": \"resources/dia_hi.txt\",\n    \"revision\": \"d580a9d0f5545626c9cc37daafc51a3c\"\n  },\n  {\n    \"url\": \"resources/dia_hr.txt\",\n    \"revision\": \"97deaf0afd81d692f005dc02f329ac88\"\n  },\n  {\n    \"url\": \"resources/dia_hu.txt\",\n    \"revision\": \"465d05499416a9adeb023313a8160424\"\n  },\n  {\n    \"url\": \"resources/dia_id.txt\",\n    \"revision\": \"3e5ab9a1098930d4dd84278169f49b86\"\n  },\n  {\n    \"url\": \"resources/dia_it.txt\",\n    \"revision\": \"da633c90cadf73d0df46991b5586df54\"\n  },\n  {\n    \"url\": \"resources/dia_ja.txt\",\n    \"revision\": \"95dcedfc13dd97fb2ae63184d3ae14fc\"\n  },\n  {\n    \"url\": \"resources/dia_kn.txt\",\n    \"revision\": \"965dc84ec662842d0c313674632a5544\"\n  },\n  {\n    \"url\": \"resources/dia_ko.txt\",\n    \"revision\": \"e49ee6d9c9bbc77276cb85c97069b919\"\n  },\n  {\n    \"url\": \"resources/dia_lt.txt\",\n    \"revision\": \"51465381c456510952d6269952dced5e\"\n  },\n  {\n    \"url\": \"resources/dia_lv.txt\",\n    \"revision\": \"3ac8dd9a8bb6e7ec1143ab46cd70b96a\"\n  },\n  {\n    \"url\": \"resources/dia_ml.txt\",\n    \"revision\": \"11910b85c2616d84d97651e97cf11d7a\"\n  },\n  {\n    \"url\": \"resources/dia_mr.txt\",\n    \"revision\": \"8497141bca86742111017248e26a07ea\"\n  },\n  {\n    \"url\": \"resources/dia_ms.txt\",\n    \"revision\": \"ee74d690582d04322dba57dbc7224c99\"\n  },\n  {\n    \"url\": \"resources/dia_my.txt\",\n    \"revision\": \"f2bb9f811ec054499a5eca5add259a96\"\n  },\n  {\n    \"url\": \"resources/dia_nl.txt\",\n    \"revision\": \"35a2a6ece18b1c59893925d547425261\"\n  },\n  {\n    \"url\": \"resources/dia_no.txt\",\n    \"revision\": \"b0b4fe8a1c31db304d431935cdab14b8\"\n  },\n  {\n    \"url\": \"resources/dia_pl.txt\",\n    \"revision\": \"c86f5e75805a2903734a1c9a7a81d63b\"\n  },\n  {\n    \"url\": \"resources/dia_pt-br.txt\",\n    \"revision\": \"2eee01639ff6775e24220fbfa3c9c788\"\n  },\n  {\n    \"url\": \"resources/dia_pt.txt\",\n    \"revision\": \"63407d1bd46853ff9e3ed3b9ace9602f\"\n  },\n  {\n    \"url\": \"resources/dia_ro.txt\",\n    \"revision\": \"e2e5f6a838ae71143e6c50b290af7bb1\"\n  },\n  {\n    \"url\": \"resources/dia_ru.txt\",\n    \"revision\": \"38de6a4f45437cdd66dc3decc48c8841\"\n  },\n  {\n    \"url\": \"resources/dia_si.txt\",\n    \"revision\": \"f2bb9f811ec054499a5eca5add259a96\"\n  },\n  {\n    \"url\": \"resources/dia_sk.txt\",\n    \"revision\": \"58fffaadfebfec4deafcfc5c20178b57\"\n  },\n  {\n    \"url\": \"resources/dia_sl.txt\",\n    \"revision\": \"a66ac8feda2a580540b7b840603c1e23\"\n  },\n  {\n    \"url\": \"resources/dia_sr.txt\",\n    \"revision\": \"9cb339e7ca6db727cbcec145b01a7bdb\"\n  },\n  {\n    \"url\": \"resources/dia_sv.txt\",\n    \"revision\": \"84338c7bffb013c00b71ee6868a55b9f\"\n  },\n  {\n    \"url\": \"resources/dia_sw.txt\",\n    \"revision\": \"476b03b2ee388853d15f8f7924a10e40\"\n  },\n  {\n    \"url\": \"resources/dia_ta.txt\",\n    \"revision\": \"ef879e2a9c097abe6b578a22df399257\"\n  },\n  {\n    \"url\": \"resources/dia_te.txt\",\n    \"revision\": \"efd7ac431c2163371f13f1e0cdb05aaa\"\n  },\n  {\n    \"url\": \"resources/dia_th.txt\",\n    \"revision\": \"1ab6b69b33a88ed897c96a885165a566\"\n  },\n  {\n    \"url\": \"resources/dia_tr.txt\",\n    \"revision\": \"4c1bae6ee6079bf94c4e7e86a49b2684\"\n  },\n  {\n    \"url\": \"resources/dia_uk.txt\",\n    \"revision\": \"612e5ccdf38b00749ff4926cd1ea2b3f\"\n  },\n  {\n    \"url\": \"resources/dia_vi.txt\",\n    \"revision\": \"757058bddd335a0c0bc37829a2b2ff2a\"\n  },\n  {\n    \"url\": \"resources/dia_zh-tw.txt\",\n    \"revision\": \"838b0f7bd695a5a2a0c5ebbd83d33296\"\n  },\n  {\n    \"url\": \"resources/dia_zh.txt\",\n    \"revision\": \"7736de1c10669ab8f284558fb5dc434c\"\n  },\n  {\n    \"url\": \"favicon.ico\",\n    \"revision\": \"fab2d88b37c72d83607527573de45281\"\n  },\n  {\n    \"url\": \"images/manifest.json\",\n    \"revision\": \"389fa448cb99794bece27ffcb216abee\"\n  },\n  {\n    \"url\": \"images/logo.png\",\n    \"revision\": \"89630b64b911ebe0daa3dfe442087cfa\"\n  },\n  {\n    \"url\": \"images/drawlogo.svg\",\n    \"revision\": \"4bf4d14ebcf072d8bd4c5a1c89e88fc6\"\n  },\n  {\n    \"url\": \"images/drawlogo48.png\",\n    \"revision\": \"8b13428373aca67b895364d025f42417\"\n  },\n  {\n    \"url\": \"images/drawlogo-gray.svg\",\n    \"revision\": \"0aabacbc0873816e1e09e4736ae44c7d\"\n  },\n  {\n    \"url\": \"images/drawlogo-text-bottom.svg\",\n    \"revision\": \"f6c438823ab31f290940bd4feb8dd9c2\"\n  },\n  {\n    \"url\": \"images/default-user.jpg\",\n    \"revision\": \"2c399696a87c8921f12d2f9e1990cc6e\"\n  },\n  {\n    \"url\": \"images/logo-flat-small.png\",\n    \"revision\": \"4b178e59ff499d6dd1894fc498b59877\"\n  },\n  {\n    \"url\": \"images/apple-touch-icon.png\",\n    \"revision\": \"73da7989a23ce9a4be565ec65658a239\"\n  },\n  {\n    \"url\": \"images/favicon-16x16.png\",\n    \"revision\": \"1a79d5461a5d2bf21f6652e0ac20d6e5\"\n  },\n  {\n    \"url\": \"images/favicon-32x32.png\",\n    \"revision\": \"e3b92da2febe70bad5372f6f3474b034\"\n  },\n  {\n    \"url\": \"images/android-chrome-196x196.png\",\n    \"revision\": \"f8c045b2d7b1c719fda64edab04c415c\"\n  },\n  {\n    \"url\": \"images/android-chrome-512x512.png\",\n    \"revision\": \"959b5fac2453963ff6d60fb85e4b73fd\"\n  },\n  {\n    \"url\": \"images/delete.png\",\n    \"revision\": \"5f2350f2fd20f1a229637aed32ed8f29\"\n  },\n  {\n    \"url\": \"images/droptarget.png\",\n    \"revision\": \"bbf7f563fb6784de1ce96f329519b043\"\n  },\n  {\n    \"url\": \"images/help.png\",\n    \"revision\": \"9266c6c3915bd33c243d80037d37bf61\"\n  },\n  {\n    \"url\": \"images/download.png\",\n    \"revision\": \"35418dd7bd48d87502c71b578cc6c37f\"\n  },\n  {\n    \"url\": \"images/logo-flat.png\",\n    \"revision\": \"038070ab43aee6e54a791211859fc67b\"\n  },\n  {\n    \"url\": \"images/google-drive-logo.svg\",\n    \"revision\": \"5d9f2f5bbc7dcc252730a0072bb23059\"\n  },\n  {\n    \"url\": \"images/onedrive-logo.svg\",\n    \"revision\": \"3645b344ec0634c1290dd58d7dc87b97\"\n  },\n  {\n    \"url\": \"images/dropbox-logo.svg\",\n    \"revision\": \"e6be408c77cf9c82d41ac64fa854280a\"\n  },\n  {\n    \"url\": \"images/github-logo.svg\",\n    \"revision\": \"a1a999b69a275eac0cb918360ac05ae1\"\n  },\n  {\n    \"url\": \"images/gitlab-logo.svg\",\n    \"revision\": \"0faea8c818899e58533e153c44b10517\"\n  },\n  {\n    \"url\": \"images/trello-logo.svg\",\n    \"revision\": \"006fd0d7d70d7e95dc691674cb12e044\"\n  },\n  {\n    \"url\": \"images/osa_drive-harddisk.png\",\n    \"revision\": \"b954e1ae772087c5b4c6ae797e1f9649\"\n  },\n  {\n    \"url\": \"images/osa_database.png\",\n    \"revision\": \"c350d9d9b95f37b6cfe798b40ede5fb0\"\n  },\n  {\n    \"url\": \"images/google-drive-logo-white.svg\",\n    \"revision\": \"f329d8b1be7778515a85b93fc35d9f26\"\n  },\n  {\n    \"url\": \"images/dropbox-logo-white.svg\",\n    \"revision\": \"4ea8299ac3bc31a16f199ee3aec223bf\"\n  },\n  {\n    \"url\": \"images/onedrive-logo-white.svg\",\n    \"revision\": \"b3602fa0fc947009cff3f33a581cff4d\"\n  },\n  {\n    \"url\": \"images/github-logo-white.svg\",\n    \"revision\": \"537b1127b3ca0f95b45782d1304fb77a\"\n  },\n  {\n    \"url\": \"images/gitlab-logo-white.svg\",\n    \"revision\": \"5fede9ac2f394c716b8c23e3fddc3910\"\n  },\n  {\n    \"url\": \"images/trello-logo-white-orange.svg\",\n    \"revision\": \"e2a0a52ba3766682f138138d10a75eb5\"\n  },\n  {\n    \"url\": \"images/logo-confluence.png\",\n    \"revision\": \"ed1e55d44ae5eba8f999aba2c93e8331\"\n  },\n  {\n    \"url\": \"images/logo-jira.png\",\n    \"revision\": \"f8d460555a0d1f87cfd901e940666629\"\n  },\n  {\n    \"url\": \"images/clear.gif\",\n    \"revision\": \"db13c778e4382e0b55258d0f811d5d70\"\n  },\n  {\n    \"url\": \"images/spin.gif\",\n    \"revision\": \"487cbb40b9ced439aa1ad914e816d773\"\n  },\n  {\n    \"url\": \"images/checkmark.gif\",\n    \"revision\": \"ba764ce62f2bf952df5bbc2bb4d381c5\"\n  },\n  {\n    \"url\": \"images/hs.png\",\n    \"revision\": \"fefa1a03d92ebad25c88dca94a0b63db\"\n  },\n  {\n    \"url\": \"images/aui-wait.gif\",\n    \"revision\": \"5a474bcbd8d2f2826f03d10ea44bf60e\"\n  },\n  {\n    \"url\": \"mxgraph/css/common.css\",\n    \"revision\": \"618b42f0bde0c7685e04811c25dc2b3e\"\n  },\n  {\n    \"url\": \"mxgraph/images/expanded.gif\",\n    \"revision\": \"2b67c2c035af1e9a5cc814f0d22074cf\"\n  },\n  {\n    \"url\": \"mxgraph/images/collapsed.gif\",\n    \"revision\": \"73cc826da002a3d740ca4ce6ec5c1f4a\"\n  },\n  {\n    \"url\": \"mxgraph/images/maximize.gif\",\n    \"revision\": \"5cd13d6925493ab51e876694cc1c2ec2\"\n  },\n  {\n    \"url\": \"mxgraph/images/minimize.gif\",\n    \"revision\": \"8957741b9b0f86af9438775f2aadbb54\"\n  },\n  {\n    \"url\": \"mxgraph/images/close.gif\",\n    \"revision\": \"8b84669812ac7382984fca35de8da48b\"\n  },\n  {\n    \"url\": \"mxgraph/images/resize.gif\",\n    \"revision\": \"a6477612b3567a34033f9cac6184eed3\"\n  },\n  {\n    \"url\": \"mxgraph/images/separator.gif\",\n    \"revision\": \"7819742ff106c97da7a801c2372bbbe5\"\n  },\n  {\n    \"url\": \"mxgraph/images/window.gif\",\n    \"revision\": \"fd9a21dd4181f98052a202a0a01f18ab\"\n  },\n  {\n    \"url\": \"mxgraph/images/window-title.gif\",\n    \"revision\": \"3fb1d6c43246cdf991a11dfe826dfe99\"\n  },\n  {\n    \"url\": \"mxgraph/images/button.gif\",\n    \"revision\": \"00759bdc3ad218fa739f584369541809\"\n  },\n  {\n    \"url\": \"mxgraph/images/point.gif\",\n    \"revision\": \"83a43717b284902442620f61bc4e9fa6\"\n  }\n], {\n  \"ignoreURLParametersMatching\": [/.*/]\n});\n\n\n\n\n\n\n\n\n"],"names":["self","addEventListener","event","data","type","skipWaiting","workbox_precaching_precacheAndRoute","url","revision","ignoreURLParametersMatching"],"mappings":"szBAmBAA,KAAKC,iBAAiB,WAAYC,IAC5BA,EAAMC,MAA4B,iBAApBD,EAAMC,KAAKC,MAC3BJ,KAAKK,aACN,IAWHC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,gBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,YACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,kBACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,cACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,kBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,kBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,kBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,gBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,qCAEb,CACDC,4BAA+B,CAAC"}
\ No newline at end of file
+{"version":3,"file":"service-worker.js","sources":["../../../../../tmp/5bb4de72dde9a7cf368cbbc2ddd18031/service-worker.js"],"sourcesContent":["import {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/usr/lib/node_modules/workbox-cli/node_modules/workbox-precaching/precacheAndRoute.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.addEventListener('message', (event) => {\n  if (event.data && event.data.type === 'SKIP_WAITING') {\n    self.skipWaiting();\n  }\n});\n\n\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n  {\n    \"url\": \"js/app.min.js\",\n    \"revision\": \"94d4887ca9c27d6b300b5dbc85e155ab\"\n  },\n  {\n    \"url\": \"js/extensions.min.js\",\n    \"revision\": \"3834501a2250d98fc7207a6ae6298f14\"\n  },\n  {\n    \"url\": \"js/orgchart.min.js\",\n    \"revision\": \"619d8c4dab47b81868916df31f55478b\"\n  },\n  {\n    \"url\": \"js/stencils.min.js\",\n    \"revision\": \"698f1f70f64466ff6ae9280cd91cd23f\"\n  },\n  {\n    \"url\": \"js/shapes-14-6-5.min.js\",\n    \"revision\": \"95f54e7999c9fba2a1d65b4fe4f634f3\"\n  },\n  {\n    \"url\": \"js/math-print.js\",\n    \"revision\": \"cf64f6a493a8cb5079f2b70813e478d7\"\n  },\n  {\n    \"url\": \"index.html\",\n    \"revision\": \"d29a8e0ad73c5cfd3dc1e35361bf558b\"\n  },\n  {\n    \"url\": \"open.html\",\n    \"revision\": \"d71816b3b00e769fc6019fcdd6921662\"\n  },\n  {\n    \"url\": \"styles/fonts/ArchitectsDaughter-Regular.ttf\",\n    \"revision\": \"31c2153c0530e32553b31a49b3d70736\"\n  },\n  {\n    \"url\": \"styles/grapheditor.css\",\n    \"revision\": \"c80c6d3bdaa85e0fbc9d9b174ef763f4\"\n  },\n  {\n    \"url\": \"styles/atlas.css\",\n    \"revision\": \"d627cfef208f13a9cff1670f143c6348\"\n  },\n  {\n    \"url\": \"styles/dark.css\",\n    \"revision\": \"436ac9aaaa67eb15e64c368cc05ba5a7\"\n  },\n  {\n    \"url\": \"js/dropbox/Dropbox-sdk.min.js\",\n    \"revision\": \"4b9842892aa37b156db0a8364b7a83b0\"\n  },\n  {\n    \"url\": \"js/onedrive/OneDrive.js\",\n    \"revision\": \"505e8280346666f7ee801bc59521fa67\"\n  },\n  {\n    \"url\": \"js/viewer-static.min.js\",\n    \"revision\": \"93a4740f593c525cf58cf653d05e8373\"\n  },\n  {\n    \"url\": \"connect/jira/editor-1-3-3.html\",\n    \"revision\": \"6ec59ca5f689067e52cdda13f22ed89f\"\n  },\n  {\n    \"url\": \"connect/jira/viewerPanel-1-3-12.html\",\n    \"revision\": \"9adfcef71f6a8c68c20c2d2fba35fe19\"\n  },\n  {\n    \"url\": \"connect/jira/fullScreenViewer-1-3-3.html\",\n    \"revision\": \"29c803d9aa4dc0718540c916a0a4e62c\"\n  },\n  {\n    \"url\": \"connect/jira/viewerPanel.js\",\n    \"revision\": \"8d298de3aeaa32cad74b5d4b53ed3d4f\"\n  },\n  {\n    \"url\": \"connect/jira/spinner.gif\",\n    \"revision\": \"7d857ab9d86123e93d74d48e958fe743\"\n  },\n  {\n    \"url\": \"connect/jira/editor.js\",\n    \"revision\": \"d1c80a7301cd26c6dc31b1fdce9e37e5\"\n  },\n  {\n    \"url\": \"connect/jira/fullscreen-viewer-init.js\",\n    \"revision\": \"e00ad51fc16b87c362d6eaf930ab1fa5\"\n  },\n  {\n    \"url\": \"connect/jira/fullscreen-viewer.js\",\n    \"revision\": \"d5748a4fe01b7e747914ebd3e37c9de2\"\n  },\n  {\n    \"url\": \"plugins/connectJira.js\",\n    \"revision\": \"4cefa13414e0d406550f3c073923080c\"\n  },\n  {\n    \"url\": \"plugins/cConf-comments.js\",\n    \"revision\": \"ee6764429bf47a8545aa1cedacee718e\"\n  },\n  {\n    \"url\": \"plugins/cConf-1-4-8.js\",\n    \"revision\": \"91c04e236ba9dbdb26d8565b3354e00a\"\n  },\n  {\n    \"url\": \"connect/confluence/connectUtils-1-4-8.js\",\n    \"revision\": \"9b93b748a41a6f9444ff92810b7908b8\"\n  },\n  {\n    \"url\": \"connect/new_common/cac.js\",\n    \"revision\": \"6d666b6789b51dabc5a1af53a9db5d3d\"\n  },\n  {\n    \"url\": \"connect/gdrive_common/gac.js\",\n    \"revision\": \"78f85e79f15f56b8b8d83c90f4a15679\"\n  },\n  {\n    \"url\": \"connect/onedrive_common/ac.js\",\n    \"revision\": \"d10d4603e86da7c9af277dac832e8e06\"\n  },\n  {\n    \"url\": \"connect/confluence/viewer-init.js\",\n    \"revision\": \"8aa8d02147def4535563bc65632a3e6d\"\n  },\n  {\n    \"url\": \"connect/confluence/viewer.js\",\n    \"revision\": \"e865c0c1820464235ca8f0b9dc6eb71e\"\n  },\n  {\n    \"url\": \"connect/confluence/viewer-1-4-42.html\",\n    \"revision\": \"083a8751312bdb6485f2a4ced206e086\"\n  },\n  {\n    \"url\": \"connect/confluence/macroEditor-1-4-8.html\",\n    \"revision\": \"b2908e71f755a069fe6487e1e705736c\"\n  },\n  {\n    \"url\": \"connect/confluence/includeDiagram-1-4-8.js\",\n    \"revision\": \"2947a24a48572562d9fcb55b20d22fca\"\n  },\n  {\n    \"url\": \"connect/confluence/includeDiagram.html\",\n    \"revision\": \"bbc4156ca3902347d3c8121dd08a89d7\"\n  },\n  {\n    \"url\": \"connect/confluence/macro-editor.js\",\n    \"revision\": \"0bd745f0c23bba15ad1ff8e7b8e14987\"\n  },\n  {\n    \"url\": \"math/es5/startup.js\",\n    \"revision\": \"dc7130cdc866593293dbb5dde11ceb40\"\n  },\n  {\n    \"url\": \"math/es5/core.js\",\n    \"revision\": \"f71bc0bfb7d2ac8261747f97a5d47dd4\"\n  },\n  {\n    \"url\": \"math/es5/ui/safe.js\",\n    \"revision\": \"8c1fcfee7c879588ad409edcdd9cce53\"\n  },\n  {\n    \"url\": \"math/es5/output/svg.js\",\n    \"revision\": \"4f55967d16197ebb01b86356d8ab179a\"\n  },\n  {\n    \"url\": \"math/es5/input/tex.js\",\n    \"revision\": \"5c4f470da2ccb1acf85041fcecd6fff6\"\n  },\n  {\n    \"url\": \"math/es5/input/asciimath.js\",\n    \"revision\": \"c2d4076dd8e26d509bfe3a378e71cfa7\"\n  },\n  {\n    \"url\": \"math/es5/output/svg/fonts/tex.js\",\n    \"revision\": \"6eab785a3788ea805bd2b552d1f0aab8\"\n  },\n  {\n    \"url\": \"resources/dia.txt\",\n    \"revision\": \"f2bb9f811ec054499a5eca5add259a96\"\n  },\n  {\n    \"url\": \"resources/dia_am.txt\",\n    \"revision\": \"757af1ba9c187b2db9865965be4584d4\"\n  },\n  {\n    \"url\": \"resources/dia_ar.txt\",\n    \"revision\": \"f139fee88b934da5fc0e51c800449d2e\"\n  },\n  {\n    \"url\": \"resources/dia_bg.txt\",\n    \"revision\": \"b59ea02be4c9c5b60791327a42503115\"\n  },\n  {\n    \"url\": \"resources/dia_bn.txt\",\n    \"revision\": \"c7bb29b3be89b945859a9dbc996e3977\"\n  },\n  {\n    \"url\": \"resources/dia_bs.txt\",\n    \"revision\": \"c8faa32407ce808dd181f1708300dc65\"\n  },\n  {\n    \"url\": \"resources/dia_ca.txt\",\n    \"revision\": \"8dc84ddf5fc455eee7390adb7bb8fb42\"\n  },\n  {\n    \"url\": \"resources/dia_cs.txt\",\n    \"revision\": \"621536d118c10c11e0455bdc21d90495\"\n  },\n  {\n    \"url\": \"resources/dia_da.txt\",\n    \"revision\": \"2c9232e5e9cef27da9172a187a933115\"\n  },\n  {\n    \"url\": \"resources/dia_de.txt\",\n    \"revision\": \"112d8443021165e8c7d9994f97ddaf48\"\n  },\n  {\n    \"url\": \"resources/dia_el.txt\",\n    \"revision\": \"cbeb9bcc4a8a37ab0cce55d996c3b627\"\n  },\n  {\n    \"url\": \"resources/dia_eo.txt\",\n    \"revision\": \"c4d5feab9f7ce5d22f8487f4fc2bc585\"\n  },\n  {\n    \"url\": \"resources/dia_es.txt\",\n    \"revision\": \"d0d9810976aeb9b9fef0118aca1c3815\"\n  },\n  {\n    \"url\": \"resources/dia_et.txt\",\n    \"revision\": \"5303fb8a71bf11794f3cbe9324fd3d2d\"\n  },\n  {\n    \"url\": \"resources/dia_eu.txt\",\n    \"revision\": \"552e57dff8a9233098009af48380f066\"\n  },\n  {\n    \"url\": \"resources/dia_fa.txt\",\n    \"revision\": \"a2bd813de7a95f881a1ac941fab6ea29\"\n  },\n  {\n    \"url\": \"resources/dia_fi.txt\",\n    \"revision\": \"dbbd5d0126ad8f43fe18735f4f65b604\"\n  },\n  {\n    \"url\": \"resources/dia_fil.txt\",\n    \"revision\": \"0efbb4b0779c2314496e2209272f1729\"\n  },\n  {\n    \"url\": \"resources/dia_fr.txt\",\n    \"revision\": \"60a1a016d2ba9f171848b48a3b4baadd\"\n  },\n  {\n    \"url\": \"resources/dia_gl.txt\",\n    \"revision\": \"089dd7084f23978ef1696e674bcc4cab\"\n  },\n  {\n    \"url\": \"resources/dia_gu.txt\",\n    \"revision\": \"e00b05d0b7fe33e23a8c589c8226d2a7\"\n  },\n  {\n    \"url\": \"resources/dia_he.txt\",\n    \"revision\": \"bba5f189a07b266f40dfed938b0068c6\"\n  },\n  {\n    \"url\": \"resources/dia_hi.txt\",\n    \"revision\": \"d580a9d0f5545626c9cc37daafc51a3c\"\n  },\n  {\n    \"url\": \"resources/dia_hr.txt\",\n    \"revision\": \"97deaf0afd81d692f005dc02f329ac88\"\n  },\n  {\n    \"url\": \"resources/dia_hu.txt\",\n    \"revision\": \"465d05499416a9adeb023313a8160424\"\n  },\n  {\n    \"url\": \"resources/dia_id.txt\",\n    \"revision\": \"228d2a20f4627360cfb07e25aea78104\"\n  },\n  {\n    \"url\": \"resources/dia_it.txt\",\n    \"revision\": \"da633c90cadf73d0df46991b5586df54\"\n  },\n  {\n    \"url\": \"resources/dia_ja.txt\",\n    \"revision\": \"95dcedfc13dd97fb2ae63184d3ae14fc\"\n  },\n  {\n    \"url\": \"resources/dia_kn.txt\",\n    \"revision\": \"965dc84ec662842d0c313674632a5544\"\n  },\n  {\n    \"url\": \"resources/dia_ko.txt\",\n    \"revision\": \"e49ee6d9c9bbc77276cb85c97069b919\"\n  },\n  {\n    \"url\": \"resources/dia_lt.txt\",\n    \"revision\": \"51465381c456510952d6269952dced5e\"\n  },\n  {\n    \"url\": \"resources/dia_lv.txt\",\n    \"revision\": \"3ac8dd9a8bb6e7ec1143ab46cd70b96a\"\n  },\n  {\n    \"url\": \"resources/dia_ml.txt\",\n    \"revision\": \"11910b85c2616d84d97651e97cf11d7a\"\n  },\n  {\n    \"url\": \"resources/dia_mr.txt\",\n    \"revision\": \"8497141bca86742111017248e26a07ea\"\n  },\n  {\n    \"url\": \"resources/dia_ms.txt\",\n    \"revision\": \"ee74d690582d04322dba57dbc7224c99\"\n  },\n  {\n    \"url\": \"resources/dia_my.txt\",\n    \"revision\": \"f2bb9f811ec054499a5eca5add259a96\"\n  },\n  {\n    \"url\": \"resources/dia_nl.txt\",\n    \"revision\": \"35a2a6ece18b1c59893925d547425261\"\n  },\n  {\n    \"url\": \"resources/dia_no.txt\",\n    \"revision\": \"b0b4fe8a1c31db304d431935cdab14b8\"\n  },\n  {\n    \"url\": \"resources/dia_pl.txt\",\n    \"revision\": \"c86f5e75805a2903734a1c9a7a81d63b\"\n  },\n  {\n    \"url\": \"resources/dia_pt-br.txt\",\n    \"revision\": \"2eee01639ff6775e24220fbfa3c9c788\"\n  },\n  {\n    \"url\": \"resources/dia_pt.txt\",\n    \"revision\": \"63407d1bd46853ff9e3ed3b9ace9602f\"\n  },\n  {\n    \"url\": \"resources/dia_ro.txt\",\n    \"revision\": \"e2e5f6a838ae71143e6c50b290af7bb1\"\n  },\n  {\n    \"url\": \"resources/dia_ru.txt\",\n    \"revision\": \"38de6a4f45437cdd66dc3decc48c8841\"\n  },\n  {\n    \"url\": \"resources/dia_si.txt\",\n    \"revision\": \"f2bb9f811ec054499a5eca5add259a96\"\n  },\n  {\n    \"url\": \"resources/dia_sk.txt\",\n    \"revision\": \"58fffaadfebfec4deafcfc5c20178b57\"\n  },\n  {\n    \"url\": \"resources/dia_sl.txt\",\n    \"revision\": \"a66ac8feda2a580540b7b840603c1e23\"\n  },\n  {\n    \"url\": \"resources/dia_sr.txt\",\n    \"revision\": \"9cb339e7ca6db727cbcec145b01a7bdb\"\n  },\n  {\n    \"url\": \"resources/dia_sv.txt\",\n    \"revision\": \"84338c7bffb013c00b71ee6868a55b9f\"\n  },\n  {\n    \"url\": \"resources/dia_sw.txt\",\n    \"revision\": \"476b03b2ee388853d15f8f7924a10e40\"\n  },\n  {\n    \"url\": \"resources/dia_ta.txt\",\n    \"revision\": \"ef879e2a9c097abe6b578a22df399257\"\n  },\n  {\n    \"url\": \"resources/dia_te.txt\",\n    \"revision\": \"efd7ac431c2163371f13f1e0cdb05aaa\"\n  },\n  {\n    \"url\": \"resources/dia_th.txt\",\n    \"revision\": \"1ab6b69b33a88ed897c96a885165a566\"\n  },\n  {\n    \"url\": \"resources/dia_tr.txt\",\n    \"revision\": \"4c1bae6ee6079bf94c4e7e86a49b2684\"\n  },\n  {\n    \"url\": \"resources/dia_uk.txt\",\n    \"revision\": \"612e5ccdf38b00749ff4926cd1ea2b3f\"\n  },\n  {\n    \"url\": \"resources/dia_vi.txt\",\n    \"revision\": \"757058bddd335a0c0bc37829a2b2ff2a\"\n  },\n  {\n    \"url\": \"resources/dia_zh-tw.txt\",\n    \"revision\": \"838b0f7bd695a5a2a0c5ebbd83d33296\"\n  },\n  {\n    \"url\": \"resources/dia_zh.txt\",\n    \"revision\": \"7736de1c10669ab8f284558fb5dc434c\"\n  },\n  {\n    \"url\": \"favicon.ico\",\n    \"revision\": \"fab2d88b37c72d83607527573de45281\"\n  },\n  {\n    \"url\": \"images/manifest.json\",\n    \"revision\": \"389fa448cb99794bece27ffcb216abee\"\n  },\n  {\n    \"url\": \"images/logo.png\",\n    \"revision\": \"89630b64b911ebe0daa3dfe442087cfa\"\n  },\n  {\n    \"url\": \"images/drawlogo.svg\",\n    \"revision\": \"4bf4d14ebcf072d8bd4c5a1c89e88fc6\"\n  },\n  {\n    \"url\": \"images/drawlogo48.png\",\n    \"revision\": \"8b13428373aca67b895364d025f42417\"\n  },\n  {\n    \"url\": \"images/drawlogo-gray.svg\",\n    \"revision\": \"0aabacbc0873816e1e09e4736ae44c7d\"\n  },\n  {\n    \"url\": \"images/drawlogo-text-bottom.svg\",\n    \"revision\": \"f6c438823ab31f290940bd4feb8dd9c2\"\n  },\n  {\n    \"url\": \"images/default-user.jpg\",\n    \"revision\": \"2c399696a87c8921f12d2f9e1990cc6e\"\n  },\n  {\n    \"url\": \"images/logo-flat-small.png\",\n    \"revision\": \"4b178e59ff499d6dd1894fc498b59877\"\n  },\n  {\n    \"url\": \"images/apple-touch-icon.png\",\n    \"revision\": \"73da7989a23ce9a4be565ec65658a239\"\n  },\n  {\n    \"url\": \"images/favicon-16x16.png\",\n    \"revision\": \"1a79d5461a5d2bf21f6652e0ac20d6e5\"\n  },\n  {\n    \"url\": \"images/favicon-32x32.png\",\n    \"revision\": \"e3b92da2febe70bad5372f6f3474b034\"\n  },\n  {\n    \"url\": \"images/android-chrome-196x196.png\",\n    \"revision\": \"f8c045b2d7b1c719fda64edab04c415c\"\n  },\n  {\n    \"url\": \"images/android-chrome-512x512.png\",\n    \"revision\": \"959b5fac2453963ff6d60fb85e4b73fd\"\n  },\n  {\n    \"url\": \"images/delete.png\",\n    \"revision\": \"5f2350f2fd20f1a229637aed32ed8f29\"\n  },\n  {\n    \"url\": \"images/droptarget.png\",\n    \"revision\": \"bbf7f563fb6784de1ce96f329519b043\"\n  },\n  {\n    \"url\": \"images/help.png\",\n    \"revision\": \"9266c6c3915bd33c243d80037d37bf61\"\n  },\n  {\n    \"url\": \"images/download.png\",\n    \"revision\": \"35418dd7bd48d87502c71b578cc6c37f\"\n  },\n  {\n    \"url\": \"images/logo-flat.png\",\n    \"revision\": \"038070ab43aee6e54a791211859fc67b\"\n  },\n  {\n    \"url\": \"images/google-drive-logo.svg\",\n    \"revision\": \"5d9f2f5bbc7dcc252730a0072bb23059\"\n  },\n  {\n    \"url\": \"images/onedrive-logo.svg\",\n    \"revision\": \"3645b344ec0634c1290dd58d7dc87b97\"\n  },\n  {\n    \"url\": \"images/dropbox-logo.svg\",\n    \"revision\": \"e6be408c77cf9c82d41ac64fa854280a\"\n  },\n  {\n    \"url\": \"images/github-logo.svg\",\n    \"revision\": \"a1a999b69a275eac0cb918360ac05ae1\"\n  },\n  {\n    \"url\": \"images/gitlab-logo.svg\",\n    \"revision\": \"0faea8c818899e58533e153c44b10517\"\n  },\n  {\n    \"url\": \"images/trello-logo.svg\",\n    \"revision\": \"006fd0d7d70d7e95dc691674cb12e044\"\n  },\n  {\n    \"url\": \"images/osa_drive-harddisk.png\",\n    \"revision\": \"b954e1ae772087c5b4c6ae797e1f9649\"\n  },\n  {\n    \"url\": \"images/osa_database.png\",\n    \"revision\": \"c350d9d9b95f37b6cfe798b40ede5fb0\"\n  },\n  {\n    \"url\": \"images/google-drive-logo-white.svg\",\n    \"revision\": \"f329d8b1be7778515a85b93fc35d9f26\"\n  },\n  {\n    \"url\": \"images/dropbox-logo-white.svg\",\n    \"revision\": \"4ea8299ac3bc31a16f199ee3aec223bf\"\n  },\n  {\n    \"url\": \"images/onedrive-logo-white.svg\",\n    \"revision\": \"b3602fa0fc947009cff3f33a581cff4d\"\n  },\n  {\n    \"url\": \"images/github-logo-white.svg\",\n    \"revision\": \"537b1127b3ca0f95b45782d1304fb77a\"\n  },\n  {\n    \"url\": \"images/gitlab-logo-white.svg\",\n    \"revision\": \"5fede9ac2f394c716b8c23e3fddc3910\"\n  },\n  {\n    \"url\": \"images/trello-logo-white-orange.svg\",\n    \"revision\": \"e2a0a52ba3766682f138138d10a75eb5\"\n  },\n  {\n    \"url\": \"images/logo-confluence.png\",\n    \"revision\": \"ed1e55d44ae5eba8f999aba2c93e8331\"\n  },\n  {\n    \"url\": \"images/logo-jira.png\",\n    \"revision\": \"f8d460555a0d1f87cfd901e940666629\"\n  },\n  {\n    \"url\": \"images/clear.gif\",\n    \"revision\": \"db13c778e4382e0b55258d0f811d5d70\"\n  },\n  {\n    \"url\": \"images/spin.gif\",\n    \"revision\": \"487cbb40b9ced439aa1ad914e816d773\"\n  },\n  {\n    \"url\": \"images/checkmark.gif\",\n    \"revision\": \"ba764ce62f2bf952df5bbc2bb4d381c5\"\n  },\n  {\n    \"url\": \"images/hs.png\",\n    \"revision\": \"fefa1a03d92ebad25c88dca94a0b63db\"\n  },\n  {\n    \"url\": \"images/aui-wait.gif\",\n    \"revision\": \"5a474bcbd8d2f2826f03d10ea44bf60e\"\n  },\n  {\n    \"url\": \"mxgraph/css/common.css\",\n    \"revision\": \"618b42f0bde0c7685e04811c25dc2b3e\"\n  },\n  {\n    \"url\": \"mxgraph/images/expanded.gif\",\n    \"revision\": \"2b67c2c035af1e9a5cc814f0d22074cf\"\n  },\n  {\n    \"url\": \"mxgraph/images/collapsed.gif\",\n    \"revision\": \"73cc826da002a3d740ca4ce6ec5c1f4a\"\n  },\n  {\n    \"url\": \"mxgraph/images/maximize.gif\",\n    \"revision\": \"5cd13d6925493ab51e876694cc1c2ec2\"\n  },\n  {\n    \"url\": \"mxgraph/images/minimize.gif\",\n    \"revision\": \"8957741b9b0f86af9438775f2aadbb54\"\n  },\n  {\n    \"url\": \"mxgraph/images/close.gif\",\n    \"revision\": \"8b84669812ac7382984fca35de8da48b\"\n  },\n  {\n    \"url\": \"mxgraph/images/resize.gif\",\n    \"revision\": \"a6477612b3567a34033f9cac6184eed3\"\n  },\n  {\n    \"url\": \"mxgraph/images/separator.gif\",\n    \"revision\": \"7819742ff106c97da7a801c2372bbbe5\"\n  },\n  {\n    \"url\": \"mxgraph/images/window.gif\",\n    \"revision\": \"fd9a21dd4181f98052a202a0a01f18ab\"\n  },\n  {\n    \"url\": \"mxgraph/images/window-title.gif\",\n    \"revision\": \"3fb1d6c43246cdf991a11dfe826dfe99\"\n  },\n  {\n    \"url\": \"mxgraph/images/button.gif\",\n    \"revision\": \"00759bdc3ad218fa739f584369541809\"\n  },\n  {\n    \"url\": \"mxgraph/images/point.gif\",\n    \"revision\": \"83a43717b284902442620f61bc4e9fa6\"\n  }\n], {\n  \"ignoreURLParametersMatching\": [/.*/]\n});\n\n\n\n\n\n\n\n\n"],"names":["self","addEventListener","event","data","type","skipWaiting","workbox_precaching_precacheAndRoute","url","revision","ignoreURLParametersMatching"],"mappings":"szBAmBAA,KAAKC,iBAAiB,WAAYC,IAC5BA,EAAMC,MAA4B,iBAApBD,EAAMC,KAAKC,MAC3BJ,KAAKK,aACN,IAWHC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,gBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,YACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,kBACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,cACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,kBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,kBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,kBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,gBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,qCAEb,CACDC,4BAA+B,CAAC"}
\ No newline at end of file
diff --git a/src/main/webapp/teams.html b/src/main/webapp/teams.html
index 2e1bd2c1f2..7389cdef9d 100644
--- a/src/main/webapp/teams.html
+++ b/src/main/webapp/teams.html
@@ -71,11 +71,12 @@
 				// ignore
 			}
 		}
 		
 		// Global variable for desktop
-		var mxIsElectron = navigator.userAgent != null && navigator.userAgent.toLowerCase().indexOf(' electron/') > -1;
+		var mxIsElectron = navigator.userAgent != null && navigator.userAgent.toLowerCase().indexOf(' electron/') > -1 && 
+							navigator.userAgent.indexOf(' draw.io/') > -1;
 
 		// Redirects page if required
 		if (urlParams['dev'] != '1')
 		{
 			(function()
diff --git a/src/main/webapp/vsdxImporter.html b/src/main/webapp/vsdxImporter.html
index b5b1f31c5c..d0028d2952 100644
--- a/src/main/webapp/vsdxImporter.html
+++ b/src/main/webapp/vsdxImporter.html
@@ -1,67 +1,13 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="UTF-8">
 <title>VSDX Importer</title>
+<script type="text/javascript" src="js/vsdxImporter.js"></script>
 <script type="text/javascript" src="js/app.min.js"></script>
 <script type="text/javascript" src="js/extensions.min.js"></script>
-<script type="text/javascript">
-  function doImport(vsdxBuff, callback, error, file, customParam)
-  {
-	EditorUi.prototype.createUi = function(){};
-	EditorUi.prototype.addTrees = function(){};
-	EditorUi.prototype.updateActionStates = function(){};
- 	var editorUi = new EditorUi();
- 	var blob = file? file : new Blob([vsdxBuff], {type: 'application/octet-stream'});
-
- 	editorUi.importVisio(blob, callback, error, file? file.name : null, customParam);		
-  };
-
-  try
-  {
-	electron.registerMsgListener('import', (vsdxBuff) => 
-	{
-	 	doImport(vsdxBuff, function(xml)
-		{
-			electron.sendMessage('import-success', xml);
-		},
-		function()
-		{
-			electron.sendMessage('import-error');
-		});
-	});
-  }
-  catch(e) {} //Ignore
-</script>
 </head>
 <body>
 	<input type="file" id="fileUpload">
-	<script type="text/javascript">
-		document.getElementById('fileUpload').addEventListener('change', function()
-		{
-			const curFiles = this.files;
-
-			if(curFiles.length > 0) 
-			{
-				function createDoneDiv(msg)
-				{
-					var doneDiv = document.createElement('div');
-					doneDiv.id = 'doneDiv';
-					doneDiv.innerHTML = msg;
-					document.body.appendChild(doneDiv);
-				};
-				
-				doImport(null, function(xml)
-				{
-					window.importResXML = xml;
-					createDoneDiv('success');
-				}, function(err)
-				{
-					console.log(err)
-					createDoneDiv('error');
-				}, curFiles[0], window.customParam);
-			}
-		});
-	</script>
 </body>
 </html>
\ No newline at end of file

Vulnerable code: 21.4.1
module.exports = {
	disableUpdate: function() 
	{
		return false;
	}
}
const {
    contextBridge,
    ipcRenderer
} = require("electron");

let reqId = 1;
let reqInfo = {};
let fileChangedListeners = {};

ipcRenderer.on('mainResp', (event, resp) => 
{
	var callbacks = reqInfo[resp.reqId];
	
	if (resp.error)
	{
		callbacks.error(resp.msg, resp.e);
	}
	else
	{
		callbacks.callback(resp.data);
	}
	
	delete reqInfo[resp.reqId];
});

ipcRenderer.on('fileChanged', (event, resp) => 
{
	var listener = fileChangedListeners[resp.path];
	
	if (listener)
	{
		listener(resp.curr, resp.prev);
	}
});

contextBridge.exposeInMainWorld(
    'electron', {
        request: (msg, callback, error) => 
		{
			msg.reqId = reqId++;
			reqInfo[msg.reqId] = {callback: callback, error: error};

			//TODO Maybe a special function for this better than this hack?
			//File watch special case where the callback is called multiple times
			if (msg.action == 'watchFile')
			{
				fileChangedListeners[msg.path] = msg.listener;
				delete msg.listener;
			}

			ipcRenderer.send('rendererReq', msg);
        },
		registerMsgListener: function(action, callback)
		{
			ipcRenderer.on(action, function(event, args)
			{
				callback(args);
			});
		},
		sendMessage: function(action, args)
		{
			ipcRenderer.send(action, args);
		},
		listenOnce: function(action, callback)
		{
			ipcRenderer.once(action, function(event, args)
			{
				callback(args);
			});
		}
    }
);

contextBridge.exposeInMainWorld(
    'process', {
		type: process.type,
		versions: process.versions
	}
);
const fs = require('fs')
const fsProm = require('fs/promises');
const os = require('os');
const path = require('path')
const url = require('url')
const {Menu: menu, shell, dialog, session,
		clipboard, nativeImage, ipcMain, app, BrowserWindow} = require('electron')
const crc = require('crc');
const zlib = require('zlib');
const log = require('electron-log')
const program = require('commander')
const {autoUpdater} = require("electron-updater")
const PDFDocument = require('pdf-lib').PDFDocument;
const Store = require('electron-store');
const store = new Store();
const ProgressBar = require('electron-progressbar');
const spawn = require('child_process').spawn;
const disableUpdate = require('./disableUpdate').disableUpdate() || 
						process.env.DRAWIO_DISABLE_UPDATE === 'true' || 
						fs.existsSync('/.flatpak-info'); //This file indicates running in flatpak sandbox
autoUpdater.logger = log
autoUpdater.logger.transports.file.level = 'info'
autoUpdater.autoDownload = false

//Command option to disable hardware acceleration
if (process.argv.indexOf('--disable-acceleration') !== -1)
{
	app.disableHardwareAcceleration();
}

const __DEV__ = process.env.DRAWIO_ENV === 'dev'
		
let windowsRegistry = []
let cmdQPressed = false
let firstWinLoaded = false
let firstWinFilePath = null
const isMac = process.platform === 'darwin'
const isWin = process.platform === 'win32'
let enableSpellCheck = store.get('enableSpellCheck');
enableSpellCheck = enableSpellCheck != null? enableSpellCheck : isMac;
let enableStoreBkp = store.get('enableStoreBkp') != null? store.get('enableStoreBkp') : true;
let dialogOpen = false;
let enablePlugins = false;

//Read config file
var queryObj = {
	'dev': __DEV__ ? 1 : 0,
	'test': __DEV__ ? 1 : 0,
	'gapi': 0,
	'db': 0,
	'od': 0,
	'gh': 0,
	'gl': 0,
	'tr': 0,
	'browser': 0,
	'picker': 0,
	'mode': 'device',
	'export': 'https://convert.diagrams.net/node/export',
	'disableUpdate': disableUpdate? 1 : 0,
	'enableSpellCheck': enableSpellCheck? 1 : 0,
	'enableStoreBkp': enableStoreBkp? 1 : 0
};

try
{
	if (fs.existsSync(process.cwd() + '/urlParams.json'))
	{
		let urlParams = JSON.parse(fs.readFileSync(process.cwd() + '/urlParams.json'));
		
		for (var param in urlParams)
		{
			queryObj[param] = urlParams[param];
		}
	}
}
catch(e)
{
	console.log('Error in urlParams.json file: ' + e.message);
}

// Trying sandboxing the renderer for more protection
//app.enableSandbox(); // This maybe the reason snap stopped working

// Only allow request from the app code itself
function validateSender (frame) 
{
	return frame.url.startsWith(url.pathToFileURL(__dirname).href);
}

function createWindow (opt = {})
{
	let lastWinSizeStr = store.get('lastWinSize');
	let lastWinSize = lastWinSizeStr ? lastWinSizeStr.split(',') : [1600, 1200];

	// TODO On some Mac OS, double click the titlebar set incorrect window size
	if (lastWinSize[0] < 500)
	{
		lastWinSize[0] = 500;
	}

	if (lastWinSize[1] < 500)
	{
		lastWinSize[1] = 500;
	}

	let options = Object.assign(
	{
		backgroundColor: '#FFF',
		width: parseInt(lastWinSize[0]),
		height: parseInt(lastWinSize[1]),
		icon: `${__dirname}/images/drawlogo256.png`,
		webviewTag: false,
		webSecurity: true,
		webPreferences: {
			preload: `${__dirname}/electron-preload.js`,
			spellcheck: enableSpellCheck,
			contextIsolation: true,
			disableBlinkFeatures: 'Auxclick' // Is this needed?
		}
	}, opt)

	let mainWindow = new BrowserWindow(options)
	windowsRegistry.push(mainWindow)

	if (__DEV__) 
	{
		console.log('createWindow', opt)
	}

	//Cannot be read before app is ready
	queryObj['appLang'] = app.getLocale();

	let ourl = url.format(
	{
		pathname: `${__dirname}/index.html`,
		protocol: 'file:',
		query: queryObj,
		slashes: true
	})
	
	mainWindow.loadURL(ourl)

	// Open the DevTools.
	if (__DEV__)
	{
		mainWindow.webContents.openDevTools()
	}

	ipcMain.on('openDevTools', function(e)
	{
		if (!validateSender(e.senderFrame)) return null;

		mainWindow.webContents.openDevTools();
	});

	mainWindow.on('maximize', function()
	{
		mainWindow.webContents.send('maximize')
	});

	mainWindow.on('unmaximize', function()
	{
		mainWindow.webContents.send('unmaximize')
	});

	mainWindow.on('resize', function()
	{
		const size = mainWindow.getSize();
		store.set('lastWinSize', size[0] + ',' + size[1]);

		mainWindow.webContents.send('resize')
	});

	mainWindow.on('close', (event) =>
	{
		const win = event.sender
		const index = windowsRegistry.indexOf(win)
		
		if (__DEV__) 
		{
			console.log('Window on close', index)
		}
		
		const contents = win.webContents

		if (contents != null)
		{
	        ipcMain.once('isModified-result', async (e, data) =>
			{
				if (!validateSender(e.senderFrame)) return null;

				if (data.isModified)
				{
					// Can't use async function here because it crashes on Linux when win.destroy is called
					let response = dialog.showMessageBoxSync(
						win,
						{
							type: 'question',
							buttons: ['Cancel', 'Discard Changes'],
							title: 'Confirm',
							message: 'The document has unsaved changes. Do you really want to quit without saving?' //mxResources.get('allChangesLost')
						});

					if (response === 1)
					{
						//If user chose not to save, remove the draft
						if (data.draftPath != null)
						{
							await deleteFile(data.draftPath);
							win.destroy();
						}
						else
						{
							contents.send('removeDraft');

							ipcMain.once('draftRemoved', (e) =>
							{
								if (!validateSender(e.senderFrame)) return null;

								win.destroy();
							});
						}
					}
					else
					{
						cmdQPressed = false;
					}
				}
				else
				{
					win.destroy();
				}
			});

			contents.send('isModified');
			event.preventDefault();
		}
	})

	// Emitted when the window is closed.
	mainWindow.on('closed', (event/*:WindowEvent*/) =>
	{
		const index = windowsRegistry.indexOf(event.sender)
		
		if (__DEV__) 
		{
			console.log('Window closed idx:%d', index)
		}
		
		windowsRegistry.splice(index, 1)
	})
	
	return mainWindow
}

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', e =>
{
	// Enforce our CSP on all contents
	session.defaultSession.webRequest.onHeadersReceived((details, callback) => 
	{
		callback({
			responseHeaders: {
				...details.responseHeaders,
				'Content-Security-Policy': ['default-src \'self\'; script-src \'self\' \'sha256-6g514VrT/cZFZltSaKxIVNFF46+MFaTSDTPB8WfYK+c=\' \'sha256-3SkDBaLE+ouvAOfTmG2TGwmQ2EE9AT0F2YcHvZmEMeo=\'; connect-src \'self\' https://*.draw.io https://*.diagrams.net https://fonts.googleapis.com https://fonts.gstatic.com; img-src * data:; media-src *; font-src *; frame-src \'none\'; style-src \'self\' \'unsafe-inline\' https://fonts.googleapis.com; base-uri \'none\';child-src \'self\';object-src \'none\';']
			}
		})
	});

	// Enforce loading file only from our app directory
	session.defaultSession.webRequest.onBeforeRequest({urls: ['file://*']}, (details, callback) =>
	{
		if (!details.url.startsWith(url.pathToFileURL(__dirname).href))
		{
			callback({cancel: true});
		}
		else
		{
			callback({});
		}
	});

	ipcMain.on('newfile', (e, arg) =>
	{
		if (!validateSender(e.senderFrame)) return null;

		let opts = {};

		if (arg)
		{
			if (arg.width)
			{
				opts.width = arg.width;
			}

			if (arg.height)
			{
				opts.height = arg.height;
			}
		}

		createWindow(opts);
	})
	
    let argv = process.argv
    
    // https://github.com/electron/electron/issues/4690#issuecomment-217435222
    if (process.defaultApp != true)
    {
        argv.unshift(null)
    }

	var validFormatRegExp = /^(pdf|svg|png|jpeg|jpg|vsdx|xml)$/;
	
	function argsRange(val) 
	{
	  return val.split('..').map(Number);
	}
	
	try
	{
		program
	        .version(app.getVersion())
	        .usage('[options] [input file/folder]')
	        .allowUnknownOption() //-h and --help are considered unknown!!
	        .option('-c, --create', 'creates a new empty file if no file is passed')
	        .option('-k, --check', 'does not overwrite existing files')
	        .option('-x, --export', 'export the input file/folder based on the given options')
	        .option('-r, --recursive', 'for a folder input, recursively convert all files in sub-folders also')
	        .option('-o, --output <output file/folder>', 'specify the output file/folder. If omitted, the input file name is used for output with the specified format as extension')
	        .option('-f, --format <format>',
			    'if output file name extension is specified, this option is ignored (file type is determined from output extension, possible export formats are pdf, png, jpg, svg, vsdx, and xml)',
			    validFormatRegExp, 'pdf')
			.option('-q, --quality <quality>',
				'output image quality for JPEG (default: 90)', parseInt)
			.option('-t, --transparent',
				'set transparent background for PNG')
			.option('-e, --embed-diagram',
				'includes a copy of the diagram (for PNG, SVG and PDF formats only)')
			.option('--embed-svg-images',
				'Embed Images in SVG file (for SVG format only)')
			.option('-b, --border <border>',
				'sets the border width around the diagram (default: 0)', parseInt)
			.option('-s, --scale <scale>',
				'scales the diagram size', parseFloat)
			.option('--width <width>',
				'fits the generated image/pdf into the specified width, preserves aspect ratio.', parseInt)
			.option('--height <height>',
				'fits the generated image/pdf into the specified height, preserves aspect ratio.', parseInt)
			.option('--crop',
				'crops PDF to diagram size')
			.option('-a, --all-pages',
				'export all pages (for PDF format only)')
			.option('-p, --page-index <pageIndex>',
				'selects a specific page, if not specified and the format is an image, the first page is selected', parseInt)
			.option('-l, --layers <comma separated layer indexes>',
				'selects which layers to export (applies to all pages), if not specified, all layers are selected')
			.option('-g, --page-range <from>..<to>',
				'selects a page range (for PDF format only)', argsRange)
			.option('-u, --uncompressed',
				'Uncompressed XML output (for XML format only)')
			.option('--enable-plugins',
				'Enable Plugins')
	        .parse(argv)
	}
	catch(e)
	{
		//On parse error, return [exit and commander will show the error message]
		return;
	}
	
	var options = program.opts();
	enablePlugins = options.enablePlugins;

    //Start export mode?
    if (options.export)
	{
    	var dummyWin = new BrowserWindow({
			show : false,
			webPreferences: {
				preload: `${__dirname}/electron-preload.js`,
				contextIsolation: true,
				disableBlinkFeatures: 'Auxclick' // Is this needed?
			}
		});
    	
    	windowsRegistry.push(dummyWin);
    	
		/*ipcMain.on('log', function(event, msg)
		{
			console.log(msg);
		});*/
	
    	try
    	{
	    	//Prepare arguments and confirm it's valid
	    	var format = null;
	    	var outType = null;
	    	
	    	//Format & Output
	    	if (options.output)
			{
	    		try
	    		{
	    			var outStat = fs.statSync(options.output);
	    			
	    			if (outStat.isDirectory())
					{
	    				outType = {isDir: true};
					}
	    			else //If we can get file stat, then it exists
					{
	    				throw 'Error: Output file already exists';
					}
	    		}
	    		catch(e) //on error, file doesn't exist and it is not a dir
	    		{
	    			outType = {isFile: true};
	    			
	    			format = path.extname(options.output).substr(1);
					
					if (!validFormatRegExp.test(format))
					{
						format = null;
					}
	    		}
			}
	    	
	    	if (format == null)
			{
	    		format = options.format;
			}
	    	
	    	var from = null, to = null;
	    	
	    	if (options.pageIndex != null && options.pageIndex >= 0)
			{
	    		from = options.pageIndex;
				to = options.pageIndex;
				options.allPages = false;
			}
	    	else if (options.pageRange && options.pageRange.length == 2)
			{
	    		from = options.pageRange[0] >= 0 ? options.pageRange[0] : null;
	    		to = options.pageRange[1] >= 0 ? options.pageRange[1] : null;
				options.allPages = false;
			}

			var expArgs = {
				format: format,
				w: options.width > 0 ? options.width : null,
				h: options.height > 0 ? options.height : null,
				border: options.border > 0 ? options.border : 0,
				bg: options.transparent ? 'none' : '#ffffff',
				from: from,
				to: to,
				allPages: format == 'pdf' && options.allPages,
				scale: (options.crop && (options.scale == null || options.scale == 1)) ? 1.00001: (options.scale || 1), //any value other than 1 crops the pdf
				embedXml: options.embedDiagram? '1' : '0',
				embedImages: options.embedSvgImages? '1' : '0',
				jpegQuality: options.quality,
				uncompressed: options.uncompressed
			};

			if (options.layers)
			{
				expArgs.extras = JSON.stringify({layers: options.layers.split(',')});
			}

			var paths = program.args;
			
			// If a file is passed 
			if (paths !== undefined && paths[0] != null)
			{
				var inStat = null;
				
				try
				{
					inStat = fs.statSync(paths[0]);
				}
				catch(e)
				{
					throw 'Error: input file/directory not found';	
				}
				
				var files = [];
				
				function addDirectoryFiles(dir, isRecursive)
				{
					fs.readdirSync(dir).forEach(function(file) 
					{
						var filePath = path.join(dir, file);
						stat = fs.statSync(filePath);
						
						if (stat.isFile() && path.basename(filePath).charAt(0) != '.')
						{
							files.push(filePath);
						}
						if (stat.isDirectory() && isRecursive)
					    {
							addDirectoryFiles(filePath, isRecursive)
					    }
					});
				}
				
				if (inStat.isFile())
				{
					files.push(paths[0]);
				}
				else if (inStat.isDirectory())
				{
					addDirectoryFiles(paths[0], options.recursive);
				}

				if (files.length > 0)
				{
					var fileIndex = 0;
					
					function processOneFile()
					{
						var curFile = files[fileIndex];
						
						try
						{
							var ext = path.extname(curFile);
							
							let fileContent = fs.readFileSync(curFile, ext === '.png' || ext === '.vsdx' ? null : 'utf-8');
							
							if (ext === '.vsdx')
							{
								dummyWin.loadURL(`file://${__dirname}/vsdxImporter.html`);
								
								const contents = dummyWin.webContents;

								contents.on('did-finish-load', function()
							    {
									contents.send('import', fileContent);

									ipcMain.once('import-success', function(e, xml)
						    	    {
										if (!validateSender(e.senderFrame)) return null;

										expArgs.xml = xml;
										startExport();
						    	    });
						    	    
						    	    ipcMain.once('import-error', function(e)
						    	    {
										if (!validateSender(e.senderFrame)) return null;

						    	    	console.error('Error: cannot import VSDX file: ' + curFile);
						    	    	next();
						    	    });
							    });
							}
							else
							{
								if (ext === '.csv')
								{
									expArgs.csv = fileContent;
								}
								else if (ext === '.png')
								{
									expArgs.xml = Buffer.from(fileContent).toString('base64');
								}
								else
								{
									expArgs.xml = fileContent;
								}

								startExport();
							}
							
							function next()
							{
								fileIndex++;
								
								if (fileIndex < files.length)
								{
									processOneFile();
								}
								else
								{
									cmdQPressed = true;
									dummyWin.destroy();
								}
							};
							
							function startExport()
							{
								var mockEvent = {
									reply: function(msg, data)
									{
										try
										{
											if (data == null || data.length == 0)
											{
												console.error('Error: Export failed: ' + curFile);
											}
											else if (msg == 'export-success')
											{
												var outFileName = null;
												
												if (outType != null)
												{
													if (outType.isDir)
													{
														outFileName = path.join(options.output, path.basename(curFile,
															path.extname(curFile))) + '.' + format;
													}
													else
													{
														outFileName = options.output;
													}
												}
												else if (inStat.isFile())
												{
													outFileName = path.join(path.dirname(paths[0]), path.basename(paths[0],
														path.extname(paths[0]))) + '.' + format;
													
												}
												else //dir
												{
													outFileName = path.join(path.dirname(curFile), path.basename(curFile,
														path.extname(curFile))) + '.' + format;
												}
												
												try
												{
													var counter = 0;
													var realFileName = outFileName;
													
													if (program.rawArgs.indexOf('-k') > -1 || program.rawArgs.indexOf('--check') > -1)
													{
														while (fs.existsSync(realFileName))
														{
															counter++;
															realFileName = path.join(path.dirname(outFileName), path.basename(outFileName,
																path.extname(outFileName))) + '-' + counter + path.extname(outFileName);
														}
													}
													
													fs.writeFileSync(realFileName, data, format == 'vsdx'? 'base64' : null, { flag: 'wx' });
													console.log(curFile + ' -> ' + realFileName);
												}
												catch(e)
												{
													console.error('Error writing to file: ' + outFileName);
												}
											}
											else
											{
												console.error('Error: ' + data + ': ' + curFile);
											}
											
											next();
										}
										finally
										{
											mockEvent.finalize();
										}
							    	}
								};

								exportDiagram(mockEvent, expArgs, true);
							};
						}
						catch(e)
						{
							console.error('Error reading file: ' + curFile);
							next();
						}
					}
					
					processOneFile();
				}
				else
				{
					throw 'Error: input file/directory not found or directory is empty';
				}
			}
			else
			{
				throw 'Error: An input file must be specified';
			}
    	}
    	catch(e)
    	{
    		console.error(e);
    		
    		cmdQPressed = true;
			dummyWin.destroy();
    	}
    	
    	return;
	}
    else if (program.rawArgs.indexOf('-h') > -1 || program.rawArgs.indexOf('--help') > -1 || program.rawArgs.indexOf('-V') > -1 || program.rawArgs.indexOf('--version') > -1) //To prevent execution when help/version arg is used
	{
		app.quit();
    	return;
	}
    
    //Prevent multiple instances of the application (casuses issues with configuration)
    const gotTheLock = app.requestSingleInstanceLock()

    if (!gotTheLock) 
    {
    	app.quit()
    } 
    else 
    {
    	app.on('second-instance', (event, commandLine, workingDirectory) => {
			// Creating a new window while a save/open dialog is open crashes the app
			if (dialogOpen) return;

    		//Create another window
    		let win = createWindow()

			let loadEvtCount = 0;
			
			function loadFinished(e)
			{
				if (e != null && !validateSender(e.senderFrame)) return null;

				loadEvtCount++;
				
				if (loadEvtCount == 2)
				{
	    	    	//Open the file if new app request is from opening a file
	    	    	var potFile = commandLine.pop();
	    	    	
	    	    	if (fs.existsSync(potFile))
	    	    	{
	    	    		win.webContents.send('args-obj', {args: [potFile]});
	    	    	}
				}
			}
			
			//Order of these two events is not guaranteed, so wait for them async.
			//TOOD There is still a chance we catch another window 'app-load-finished' if user created multiple windows quickly 
	    	ipcMain.once('app-load-finished', loadFinished);
    	    
    	    win.webContents.on('did-finish-load', function()
    	    {    			
    	        win.webContents.zoomFactor = 1;
    	        win.webContents.setVisualZoomLevelLimits(1, 1);
				loadFinished();
    	    });
    	})
    }

    let win = createWindow()
    
	let loadEvtCount = 0;
			
	function loadFinished(e)
	{
		if (e != null && !validateSender(e.senderFrame)) return null;

		loadEvtCount++;
		
		if (loadEvtCount == 2)
		{
			//Sending entire program is not allowed in Electron 9 as it is not native JS object
			win.webContents.send('args-obj', {args: program.args, create: options.create});
		}
	}
	
	//Order of these two events is not guaranteed, so wait for them async.
	//TOOD There is still a chance we catch another window 'app-load-finished' if user created multiple windows quickly 
	ipcMain.once('app-load-finished', loadFinished);

    win.webContents.on('did-finish-load', function()
    {
    	if (firstWinFilePath != null)
		{
    		if (program.args != null)
    		{
    			program.args.push(firstWinFilePath);
    		}
    		else
			{
    			program.args = [firstWinFilePath];
			}
		}
    	
    	firstWinLoaded = true;
    	
        win.webContents.zoomFactor = 1;
        win.webContents.setVisualZoomLevelLimits(1, 1);
		loadFinished();
    });
	
	function toggleSpellCheck(e)
	{
		if (e != null && !validateSender(e.senderFrame)) return null;

		enableSpellCheck = !enableSpellCheck;
		store.set('enableSpellCheck', enableSpellCheck);
	};

	ipcMain.on('toggleSpellCheck', toggleSpellCheck);

	function toggleStoreBkp(e)
	{
		if (e != null && !validateSender(e.senderFrame)) return null;

		enableStoreBkp = !enableStoreBkp;
		store.set('enableStoreBkp', enableStoreBkp);
	};

	ipcMain.on('toggleStoreBkp', toggleStoreBkp);

    let updateNoAvailAdded = false;
    
	function checkForUpdatesFn(e) 
	{ 
		if (e != null && e.senderFrame != null && 
			!validateSender(e.senderFrame)) return null;

		autoUpdater.checkForUpdates();
		store.set('dontCheckUpdates', false);
		
		if (!updateNoAvailAdded) 
		{
			updateNoAvailAdded = true;
			autoUpdater.on('update-not-available', (info) => {
				dialog.showMessageBox(
					{
						type: 'info',
						title: 'No updates found',
						message: 'Your application is up-to-date',
					})
			})
		}
	};
	
	let checkForUpdates = {
		label: 'Check for updates',
		click: checkForUpdatesFn
	}

	ipcMain.on('checkForUpdates', checkForUpdatesFn);

	if (isMac)
	{
	    let template = [{
	      label: app.name,
	      submenu: [
	        {
	          label: 'About ' + app.name,
	          click() { shell.openExternal('https://www.drawio.com'); }
	        },
	        {
	          label: 'Support',
	          click() { shell.openExternal('https://github.com/jgraph/drawio-desktop/issues'); }
			},
			checkForUpdates,
			{ type: 'separator' },
	        { role: 'hide' },
	        { role: 'hideothers' },
	        { role: 'unhide' },
	        { type: 'separator' },
	        { role: 'quit' }
	      ]
	    }, {
	      label: 'Edit',
	      submenu: [
			{ role: 'undo' },
			{ role: 'redo' },
			{ type: 'separator' },
			{ role: 'cut' },
			{ role: 'copy' },
			{ role: 'paste' },
			{ role: 'pasteAndMatchStyle' },
			{ role: 'selectAll' }
	      ]
	    }]
	    
	    if (disableUpdate)
		{
			template[0].submenu.splice(2, 1);
		}
		
		const menuBar = menu.buildFromTemplate(template)
		menu.setApplicationMenu(menuBar)
	}
	else //hide  menubar in win/linux
	{
		menu.setApplicationMenu(null)
	}
	
	autoUpdater.setFeedURL({
		provider: 'github',
		repo: 'drawio-desktop',
		owner: 'jgraph'
	})
	
	if (!disableUpdate && !store.get('dontCheckUpdates'))
	{
		autoUpdater.checkForUpdates()
	}
})

//Quit from the dock context menu should quit the application directly
if (isMac) 
{
	app.on('before-quit', function() {
		cmdQPressed = true;
	});	
}

// Quit when all windows are closed.
app.on('window-all-closed', function ()
{
	if (__DEV__) 
	{
		console.log('window-all-closed', windowsRegistry.length)
	}
	
	// On OS X it is common for applications and their menu bar
	// to stay active until the user quits explicitly with Cmd + Q
	if (cmdQPressed || !isMac)
	{
		app.quit()
	}
})

app.on('activate', function ()
{
	if (__DEV__) 
	{
		console.log('app on activate', windowsRegistry.length)
	}
	
	// On OS X it's common to re-create a window in the app when the
	// dock icon is clicked and there are no other windows open.
	if (windowsRegistry.length === 0)
	{
		createWindow()
	}
})

app.on('will-finish-launching', function()
{
	app.on("open-file", function(event, filePath) 
	{
	    event.preventDefault();
		// Creating a new window while a save/open dialog is open crashes the app
		if (dialogOpen) return;

	    if (firstWinLoaded)
	    {
		    let win = createWindow();
		    
			let loadEvtCount = 0;
			
			function loadFinished(e)
			{
				if (e != null && !validateSender(e.senderFrame)) return null;

				loadEvtCount++;
				
				if (loadEvtCount == 2)
				{
	    	    	win.webContents.send('args-obj', {args: [filePath]});
				}
			}
			
			//Order of these two events is not guaranteed, so wait for them async.
			//TOOD There is still a chance we catch another window 'app-load-finished' if user created multiple windows quickly 
	    	ipcMain.once('app-load-finished', loadFinished);
    	    
		    win.webContents.on('did-finish-load', function()
		    {
		        win.webContents.zoomFactor = 1;
		        win.webContents.setVisualZoomLevelLimits(1, 1);
				loadFinished();
		    });
	    }
	    else
		{
	    	firstWinFilePath = filePath
		}
	});
});
 
app.on('web-contents-created', (event, contents) => {
	// Disable navigation
	contents.on('will-navigate', (event, navigationUrl) => {
		event.preventDefault()
	})

	// Limit creation of new windows (we also override window.open)
	contents.setWindowOpenHandler(({ url }) => {
		// We allow external absolute URLs to be open externally (check openExternal for details) and also empty windows (url -> about:blank)
		if (url.startsWith('about:blank'))
		{
			return {
				action: 'allow',
				overrideBrowserWindowOptions: {
					fullscreenable: false,
					webPreferences: {
						contextIsolation: true
					}
				}
			}
		} 
		else if (!openExternal(url))
		{
			return {action: 'deny'}
		}
	})

	// Disable all webviews
	contents.on('will-attach-webview', (event, webPreferences, params) => {
		event.preventDefault()
	})
})

autoUpdater.on('error', e => log.error('@error@\n', e))

autoUpdater.on('update-available', (a, b) =>
{
	log.info('@update-available@\n', a, b)
	
	dialog.showMessageBox(
	{
		type: 'question',
		buttons: ['Ok', 'Cancel', 'Don\'t Ask Again'],
		title: 'Confirm Update',
		message: 'Update available.\n\nWould you like to download and install new version?',
		detail: 'Application will automatically restart to apply update after download',
	}).then( result =>
	{
		if (result.response === 0)
		{
			autoUpdater.downloadUpdate()
			
			var progressBar = new ProgressBar({
				title: 'draw.io Update',
			    text: 'Downloading draw.io update...'
			});
			
			function reportUpdateError(e)
			{
				progressBar.detail = 'Error occurred while fetching updates. ' + (e && e.message? e.message : e)
				progressBar._window.setClosable(true);
			}

			autoUpdater.on('error', e => {
				if (progressBar._window != null)
				{
					reportUpdateError(e);
				}
				else
				{
					progressBar.on('ready', function() {
						reportUpdateError(e);
					});
				}
			})

			var firstTimeProg = true;
			
			autoUpdater.on('download-progress', (d) => {
				//On mac, download-progress event is not called, so the indeterminate progress will continue until download is finished
				log.info('@update-progress@\n', d);
				
				var percent = d.percent;
				
				if (percent)
				{
					percent = Math.round(percent * 100)/100;
				}
				
				if (firstTimeProg)
				{
					firstTimeProg = false;
					progressBar.close();

					progressBar = new ProgressBar({
						indeterminate: false,
						title: 'draw.io Update',
						text: 'Downloading draw.io update...',
						detail: `${percent}% ...`,
						initialValue: percent
					});
				
					progressBar
							.on('completed', function() {
								progressBar.detail = 'Download completed.';
							})
							.on('aborted', function(value) {
								log.info(`progress aborted... ${value}`);
							})
							.on('progress', function(value) {
								progressBar.detail = `${value}% ...`;
							})
							.on('ready', function() {
								//InitialValue doesn't set the UI! so this is needed to render it correctly
								progressBar.value = percent;
							});
				}
				else 
				{
					progressBar.value = percent;
				}
			});

		    autoUpdater.on('update-downloaded', (info) => {
				if (!progressBar.isCompleted())
				{
					progressBar.close()
				}
		
				log.info('@update-downloaded@\n', info)
				// Ask user to update the app
				dialog.showMessageBox(
				{
					type: 'question',
					buttons: ['Install', 'Later'],
					defaultId: 0,
					message: 'A new version of ' + app.name + ' has been downloaded',
					detail: 'It will be installed the next time you restart the application',
				}).then(result =>
				{
					if (result.response === 0)
					{
						setTimeout(() => autoUpdater.quitAndInstall(), 1)
					}
				})
		    });
		}
		else if (result.response === 2)
		{
			//save in settings don't check for updates
			log.info('@dont check for updates!@')
			store.set('dontCheckUpdates', true)
		}
	})
})

//Pdf export
const MICRON_TO_PIXEL = 264.58 		//264.58 micron = 1 pixel
const PIXELS_PER_INCH = 100.117		// Usually it is 100 pixels per inch but this give better results
const PNG_CHUNK_IDAT = 1229209940;
const LARGE_IMAGE_AREA = 30000000;

//NOTE: Key length must not be longer than 79 bytes (not checked)
function writePngWithText(origBuff, key, text, compressed, base64encoded)
{
	var isDpi = key == 'dpi';
	var inOffset = 0;
	var outOffset = 0;
	var data = text;
	var dataLen = isDpi? 9 : key.length + data.length + 1; //we add 1 zeros with non-compressed data, for pHYs it's 2 of 4-byte-int + 1 byte
	
	//prepare compressed data to get its size
	if (compressed)
	{
		data = zlib.deflateRawSync(encodeURIComponent(text));
		dataLen = key.length + data.length + 2; //we add 2 zeros with compressed data
	}
	
	var outBuff = Buffer.allocUnsafe(origBuff.length + dataLen + 4); //4 is the header size "zTXt", "tEXt" or "pHYs"
	
	try
	{
		var magic1 = origBuff.readUInt32BE(inOffset);
		inOffset += 4;
		var magic2 = origBuff.readUInt32BE(inOffset);
		inOffset += 4;
		
		if (magic1 != 0x89504e47 && magic2 != 0x0d0a1a0a)
		{
			throw new Error("PNGImageDecoder0");
		}
		
		outBuff.writeUInt32BE(magic1, outOffset);
		outOffset += 4;
		outBuff.writeUInt32BE(magic2, outOffset);
		outOffset += 4;
	}
	catch (e)
	{
		log.error(e.message, {stack: e.stack});
		throw new Error("PNGImageDecoder1");
	}

	try
	{
		while (inOffset < origBuff.length)
		{
			var length = origBuff.readInt32BE(inOffset);
			inOffset += 4;
			var type = origBuff.readInt32BE(inOffset)
			inOffset += 4;

			if (type == PNG_CHUNK_IDAT)
			{
				// Insert zTXt chunk before IDAT chunk
				outBuff.writeInt32BE(dataLen, outOffset);
				outOffset += 4;
				
				var typeSignature = isDpi? 'pHYs' : (compressed ? "zTXt" : "tEXt");
				outBuff.write(typeSignature, outOffset);
				
				outOffset += 4;

				if (isDpi)
				{
					var dpm = Math.round(parseInt(text) / 0.0254) || 3937; //One inch is equal to exactly 0.0254 meters. 3937 is 100dpi

					outBuff.writeInt32BE(dpm, outOffset);
					outBuff.writeInt32BE(dpm, outOffset + 4);
					outBuff.writeInt8(1, outOffset + 8);
					outOffset += 9;

					data = Buffer.allocUnsafe(9);
					data.writeInt32BE(dpm, 0);
					data.writeInt32BE(dpm, 4);
					data.writeInt8(1, 8);
				}
				else
				{
					outBuff.write(key, outOffset);
					outOffset += key.length;
					outBuff.writeInt8(0, outOffset);
					outOffset ++;

					if (compressed)
					{
						outBuff.writeInt8(0, outOffset);
						outOffset ++;
						data.copy(outBuff, outOffset);
					}
					else
					{
						outBuff.write(data, outOffset);	
					}

					outOffset += data.length;				
				}

				var crcVal = 0xffffffff;
				crcVal = crc.crcjam(typeSignature, crcVal);
				crcVal = crc.crcjam(data, crcVal);

				// CRC
				outBuff.writeInt32BE(crcVal ^ 0xffffffff, outOffset);
				outOffset += 4;

				// Writes the IDAT chunk after the zTXt
				outBuff.writeInt32BE(length, outOffset);
				outOffset += 4;
				outBuff.writeInt32BE(type, outOffset);
				outOffset += 4;

				origBuff.copy(outBuff, outOffset, inOffset);

				// Encodes the buffer using base64 if requested
				return base64encoded? outBuff.toString('base64') : outBuff;
			}

			outBuff.writeInt32BE(length, outOffset);
			outOffset += 4;
			outBuff.writeInt32BE(type, outOffset);
			outOffset += 4;

			origBuff.copy(outBuff, outOffset, inOffset, inOffset + length + 4);// +4 to move past the crc
			
			inOffset += length + 4;
			outOffset += length + 4;
		}
	}
	catch (e)
	{
		log.error(e.message, {stack: e.stack});
		throw e;
	}
}

//TODO Create a lightweight html file similar to export3.html for exporting to vsdx
function exportVsdx(event, args, directFinalize)
{
	let win = createWindow({
		show : false
	});

	let loadEvtCount = 0;
			
	function loadFinished(e)
	{
		if (e != null && e.senderFrame != null &&
			!validateSender(e.senderFrame)) return null;

		loadEvtCount++;
		
		if (loadEvtCount == 2)
		{
	    	win.webContents.send('export-vsdx', args);
	    	
	        ipcMain.once('export-vsdx-finished', (e, data) =>
			{
				if (!validateSender(e.senderFrame)) return null;

				var hasError = false;
				
				if (data == null)
				{
					hasError = true;
				}
				
				//Set finalize here since it is call in the reply below
				function finalize()
				{
					win.destroy();
				};
				
				if (directFinalize === true)
				{
					event.finalize = finalize;
				}
				else
				{
					//Destroy the window after response being received by caller
					ipcMain.once('export-finalize', finalize);
				}
				
				if (hasError)
				{
					event.reply('export-error');
				}
				else
				{
					event.reply('export-success', data);
				}
			});
		}
	}
	
	//Order of these two events is not guaranteed, so wait for them async.
	//TOOD There is still a chance we catch another window 'app-load-finished' if user created multiple windows quickly 
	ipcMain.once('app-load-finished', loadFinished);
    win.webContents.on('did-finish-load', loadFinished);
};

async function mergePdfs(pdfFiles, xml)
{
	//Pass throgh single files
	if (pdfFiles.length == 1 && xml == null)
	{
		return pdfFiles[0];
	}

	try 
	{
		const pdfDoc = await PDFDocument.create();
		pdfDoc.setCreator('diagrams.net');

		if (xml != null)
		{	
			//Embed diagram XML as file attachment
			await pdfDoc.attach(Buffer.from(xml).toString('base64'), 'diagram.xml', {
				mimeType: 'application/vnd.jgraph.mxfile',
				description: 'Diagram Content'
			  });
		}

		for (var i = 0; i < pdfFiles.length; i++)
		{
			const pdfFile = await PDFDocument.load(pdfFiles[i].buffer);
			const pages = await pdfDoc.copyPages(pdfFile, pdfFile.getPageIndices());
			pages.forEach(p => pdfDoc.addPage(p));
		}

		const pdfBytes = await pdfDoc.save();
        return Buffer.from(pdfBytes);
    }
	catch(e)
	{
        throw new Error('Error during PDF combination: ' + e.message);
    }
}

//TODO Use canvas to export images if math is not used to speedup export (no capturePage). Requires change to export3.html also
function exportDiagram(event, args, directFinalize)
{
	if (event != null && event.senderFrame != null &&
		!validateSender(event.senderFrame)) return null;

	if (args.format == 'vsdx')
	{
		exportVsdx(event, args, directFinalize);
		return;
	}
	
	var browser = null;
	
	try
	{
		browser = new BrowserWindow({
			webPreferences: {
				preload: `${__dirname}/electron-preload.js`,
				backgroundThrottling: false,
				contextIsolation: true,
				disableBlinkFeatures: 'Auxclick' // Is this needed?
			},
			show : false,
			frame: false,
			enableLargerThanScreen: true,
			transparent: args.format == 'png' && (args.bg == null || args.bg == 'none'),
			parent: windowsRegistry[0] //set parent to first opened window. Not very accurate, but useful when all visible windows are closed
		});

		browser.loadURL(`file://${__dirname}/export3.html`);

		const contents = browser.webContents;
		var pageByPage = (args.format == 'pdf' && !args.print), from, pdfs;

		if (pageByPage)
		{
			from = args.allPages? 0 : parseInt(args.from || 0);
			to = args.allPages? 1000 : parseInt(args.to || 1000) + 1; //The 'to' will be corrected later
			pdfs = [];

			args.from = from;
			args.to = from;
			args.allPages = false;
		}
			
		contents.on('did-finish-load', function()
	    {
			//Set finalize here since it is call in the reply below
			function finalize()
			{
				browser.destroy();
			};
			
			if (directFinalize === true)
			{
				event.finalize = finalize;
			}
			else
			{
				//Destroy the window after response being received by caller
				ipcMain.once('export-finalize', finalize);
			}

			function renderingFinishHandler(e, renderInfo)
			{
				if (!validateSender(e.senderFrame)) return null;

				if (renderInfo == null)
				{
					event.reply('export-error');
					return;
				}

				var pageCount = renderInfo.pageCount, bounds = null;
				//For some reason, Electron 9 doesn't send this object as is without stringifying. Usually when variable is external to function own scope
				try
				{
					bounds = JSON.parse(renderInfo.bounds);
				}
				catch(e)
				{
					bounds = null;
				}
				
				var pdfOptions = {pageSize: 'A4'};
				var hasError = false;
				
				if (bounds == null || bounds.width < 5 || bounds.height < 5) //very small page size never return from printToPDF
				{
					//A workaround to detect errors in the input file or being empty file
					hasError = true;
				}
				else
				{
					pdfOptions = {
						printBackground: true,
						pageSize : {
							width: bounds.width / PIXELS_PER_INCH,
							height: (bounds.height + 2) / PIXELS_PER_INCH //the extra 2 pixels to prevent adding an extra empty page						
						},
						margins: {
							top: 0,
							bottom: 0,
							left: 0,
							right: 0
						} // no margin
					}
				}
				
				var base64encoded = args.base64 == '1';
				
				if (hasError)
				{
					event.reply('export-error');
				}
				else if (args.format == 'png' || args.format == 'jpg' || args.format == 'jpeg')
				{
					//Adds an extra pixel to prevent scrollbars from showing
					var newBounds = {width: Math.ceil(bounds.width + bounds.x) + 1, height: Math.ceil(bounds.height + bounds.y) + 1};
					browser.setBounds(newBounds);
					
					//TODO The browser takes sometime to show the graph (also after resize it takes some time to render)
					//	 	1 sec is most probably enough (for small images, 5 for large ones) BUT not a stable solution
					setTimeout(function()
					{
						browser.capturePage().then(function(img)
						{
							//Image is double the given bounds, so resize is needed!
							var tScale = 1;

							//If user defined width and/or height, enforce it precisely here. Height override width
							if (args.h)
							{
								tScale = args.h / newBounds.height;
							}
							else if (args.w)
							{
								tScale = args.w / newBounds.width;
							}
							
							newBounds.width *= tScale;
							newBounds.height *= tScale;
							img = img.resize(newBounds);

							var data = args.format == 'png'? img.toPNG() : img.toJPEG(args.jpegQuality || 90);
							
							if (args.dpi != null && args.format == 'png')
							{
								data = writePngWithText(data, 'dpi', args.dpi);
							}
							
							if (args.embedXml == "1" && args.format == 'png')
							{
								data = writePngWithText(data, "mxGraphModel", args.xml, true,
										base64encoded);
							}
							else
							{
								if (base64encoded)
								{
									data = data.toString('base64');
								}
							}
							
							event.reply('export-success', data);
						});
					}, bounds.width * bounds.height < LARGE_IMAGE_AREA? 1000 : 5000);
				}
				else if (args.format == 'pdf')
				{
					if (args.print)
					{
						pdfOptions = {
							scaleFactor: args.pageScale,
							printBackground: true,
							pageSize : {
								width: args.pageWidth * MICRON_TO_PIXEL,
								//This height adjustment fixes the output. TODO Test more cases
								height: (args.pageHeight * 1.025) * MICRON_TO_PIXEL
							},
							marginsType: 1 // no margin
						};
						 
						contents.print(pdfOptions, (success, errorType) => 
						{
							//Consider all as success
							event.reply('export-success', {});
						});
					}
					else
					{
						contents.printToPDF(pdfOptions).then(async (data) => 
						{
							pdfs.push(data);
							to = to > pageCount? pageCount : to;
							from++;
							
							if (from < to)
							{
								args.from = from;
								args.to = from;
								ipcMain.once('render-finished', renderingFinishHandler);
								contents.send('render', args);
							}
							else
							{
								data = await mergePdfs(pdfs, args.embedXml == '1' ? args.xml : null);
								event.reply('export-success', data);
							}
						})
						.catch((error) => 
						{
							event.reply('export-error', error);
						});
					}
				}
				else if (args.format == 'svg')
				{
					contents.send('get-svg-data');
					
					ipcMain.once('svg-data', (e, data) =>
					{
						if (!validateSender(e.senderFrame)) return null;

						event.reply('export-success', data);
					});
				}
				else
				{
					event.reply('export-error', 'Error: Unsupported format');
				}
			};
			
			ipcMain.once('render-finished', renderingFinishHandler);

			if (args.format == 'xml')
			{
				ipcMain.once('xml-data', (e, data) =>
				{
					if (!validateSender(e.senderFrame)) return null;

					event.reply('export-success', data);
				});
				
				ipcMain.once('xml-data-error', (e) =>
				{
					if (!validateSender(e.senderFrame)) return null;

					event.reply('export-error');
				});
			}
			
			args.border = args.border || 0;
			args.scale = args.scale || 1;
			
			contents.send('render', args);
	    });
	}
	catch (e)
	{
		if (browser != null)
		{
			browser.destroy();
		}

		event.reply('export-error', e);
		console.log('export-error', e);
	}
};

ipcMain.on('export', exportDiagram);

//================================================================
// Renderer Helper functions
//================================================================

const { O_SYNC, O_CREAT, O_WRONLY, O_TRUNC, O_RDONLY } = fs.constants;
const DRAFT_PREFEX = '.$';
const OLD_DRAFT_PREFEX = '~$';
const DRAFT_EXT = '.dtmp';
const BKP_PREFEX = '.$';
const OLD_BKP_PREFEX = '~$';
const BKP_EXT = '.bkp';

/**
 * Checks the file content type
 * Confirm content is xml, pdf, png, jpg, svg, vsdx ...
 */
function checkFileContent(body, enc)
{
	if (body != null)
	{
		let head, headBinay;
		
		if (typeof body === 'string')
		{
			if (enc === 'base64')
			{
				headBinay = Buffer.from(body.substring(0, 22), 'base64');
				head = headBinay.toString();
			}
			else
			{
				head = body.substring(0, 16);
				headBinay = Buffer.from(head);
			}
		}
		else
		{
			head = new TextDecoder("utf-8").decode(body.subarray(0, 16));
			headBinay = body;
		}
		
		let c1 = head[0],
		c2 = head[1],
		c3 = head[2],
		c4 = head[3],
		c5 = head[4],
		c6 = head[5],
		c7 = head[6],
		c8 = head[7],
		c9 = head[8],
		c10 = head[9],
		c11 = head[10],
		c12 = head[11],
		c13 = head[12],
		c14 = head[13],
		c15 = head[14],
		c16 = head[15];

		let cc1 = headBinay[0],
		cc2 = headBinay[1],
		cc3 = headBinay[2],
		cc4 = headBinay[3],
		cc5 = headBinay[4],
		cc6 = headBinay[5],
		cc7 = headBinay[6],
		cc8 = headBinay[7],
		cc9 = headBinay[8],
		cc10 = headBinay[9],
		cc11 = headBinay[10],
		cc12 = headBinay[11],
		cc13 = headBinay[12],
		cc14 = headBinay[13],
		cc15 = headBinay[14],
		cc16 = headBinay[15];

		if (c1 == '<')
		{
			// text/html
			if (c2 == '!'
					|| ((c2 == 'h'
							&& (c3 == 't' && c4 == 'm' && c5 == 'l'
									|| c3 == 'e' && c4 == 'a' && c5 == 'd')
							|| (c2 == 'b' && c3 == 'o' && c4 == 'd'
									&& c5 == 'y')))
					|| ((c2 == 'H'
							&& (c3 == 'T' && c4 == 'M' && c5 == 'L'
									|| c3 == 'E' && c4 == 'A' && c5 == 'D')
							|| (c2 == 'B' && c3 == 'O' && c4 == 'D'
									&& c5 == 'Y'))))
			{
				return true;
			}

			// application/xml
			if (c2 == '?' && c3 == 'x' && c4 == 'm' && c5 == 'l'
					&& c6 == ' ')
			{
				return true;
			}
			
			// application/svg+xml
			if (c2 == 's' && c3 == 'v' && c4 == 'g' && c5 == ' ')
			{
				return true;
			}
		}

		// big and little (identical) endian UTF-8 encodings, with BOM
		// application/xml
		if (cc1 == 0xef && cc2 == 0xbb && cc3 == 0xbf)
		{
			if (c4 == '<' && c5 == '?' && c6 == 'x')
			{
				return true;
			}
		}

		// big and little endian UTF-16 encodings, with byte order mark
		// application/xml
		if (cc1 == 0xfe && cc2 == 0xff)
		{
			if (cc3 == 0 && c4 == '<' && cc5 == 0 && c6 == '?' && cc7 == 0
					&& c8 == 'x')
			{
				return true;
			}
		}

		// application/xml
		if (cc1 == 0xff && cc2 == 0xfe)
		{
			if (c3 == '<' && cc4 == 0 && c5 == '?' && cc6 == 0 && c7 == 'x'
					&& cc8 == 0)
			{
				return true;
			}
		}

		// big and little endian UTF-32 encodings, with BOM
		// application/xml
		if (cc1 == 0x00 && cc2 == 0x00 && cc3 == 0xfe && cc4 == 0xff)
		{
			if (cc5 == 0 && cc6 == 0 && cc7 == 0 && c8 == '<' && cc9 == 0
					&& cc10 == 0 && cc11 == 0 && c12 == '?' && cc13 == 0
					&& cc14 == 0 && cc15 == 0 && c16 == 'x')
			{
				return true;
			}
		}

		// application/xml
		if (cc1 == 0xff && cc2 == 0xfe && cc3 == 0x00 && cc4 == 0x00)
		{
			if (c5 == '<' && cc6 == 0 && cc7 == 0 && cc8 == 0 && c9 == '?'
					&& cc10 == 0 && cc11 == 0 && cc12 == 0 && c13 == 'x'
					&& cc14 == 0 && cc15 == 0 && cc16 == 0)
			{
				return true;
			}
		}

		// application/pdf (%PDF-)
		if (cc1 == 37 && cc2 == 80 && cc3 == 68 && cc4 == 70 && cc5 == 45)
		{
			return true;
		}

		// image/png
		if ((cc1 == 137 && cc2 == 80 && cc3 == 78 && cc4 == 71 && cc5 == 13
				&& cc6 == 10 && cc7 == 26 && cc8 == 10) ||
			(cc1 == 194 && cc2 == 137 && cc3 == 80 && cc4 == 78 && cc5 == 71 && cc6 == 13 //Our embedded PNG+XML
				&& cc7 == 10 && cc8 == 26 && cc9 == 10))
		{
			return true;
		}

		// image/jpeg
		if (cc1 == 0xFF && cc2 == 0xD8 && cc3 == 0xFF)
		{
			if (cc4 == 0xE0 || cc4 == 0xEE)
			{
				return true;
			}

			/**
			 * File format used by digital cameras to store images.
			 * Exif Format can be read by any application supporting
			 * JPEG. Exif Spec can be found at:
			 * http://www.pima.net/standards/it10/PIMA15740/Exif_2-1.PDF
			 */
			if ((cc4 == 0xE1) && (c7 == 'E' && c8 == 'x' && c9 == 'i'
					&& c10 == 'f' && cc11 == 0))
			{
				return true;
			}
		}

		// vsdx, vssx (also zip, jar, odt, ods, odp, docx, xlsx, pptx, apk, aar)
		if (cc1 == 0x50 && cc2 == 0x4B && cc3 == 0x03 && cc4 == 0x04)
		{
			return true;
		}
		else if (cc1 == 0x50 && cc2 == 0x4B && cc3 == 0x03 && cc4 == 0x06)
		{
			return true;
		}

		// mxfile, mxlibrary, mxGraphModel
		if (c1 == '<' && c2 == 'm' && c3 == 'x')
		{
			return true;
		}
	}

	return false;
};

function isConflict(origStat, stat)
{
	return stat != null && origStat != null && stat.mtimeMs != origStat.mtimeMs;
};

function getDraftFileName(fileObject)
{
	let filePath = fileObject.path;
	let draftFileName = '', counter = 1, uniquePart = '';

	do
	{
		draftFileName = path.join(path.dirname(filePath), DRAFT_PREFEX + path.basename(filePath) + uniquePart + DRAFT_EXT);
		uniquePart = '_' + counter++;
	} while (fs.existsSync(draftFileName));

	return draftFileName;
};

async function getFileDrafts(fileObject)
{
	let filePath = fileObject.path;
	let draftsPaths = [], drafts = [], draftFileName, counter = 1, uniquePart = '';

	do
	{
		draftsPaths.push(draftFileName);
		draftFileName = path.join(path.dirname(filePath), DRAFT_PREFEX + path.basename(filePath) + uniquePart + DRAFT_EXT);
		uniquePart = '_' + counter++;
	} while (fs.existsSync(draftFileName)); //TODO this assume continuous drafts names

	//Port old draft files to new prefex
	counter = 1;
	uniquePart = '';
	let draftExists = false;

	do
	{
		draftFileName = path.join(path.dirname(filePath), OLD_DRAFT_PREFEX + path.basename(filePath) + uniquePart + DRAFT_EXT);
		draftExists = fs.existsSync(draftFileName);
		
		if (draftExists)
		{
			const newDraftFileName = path.join(path.dirname(filePath), DRAFT_PREFEX + path.basename(filePath) + uniquePart + DRAFT_EXT);
			await fsProm.rename(draftFileName, newDraftFileName);
			draftsPaths.push(newDraftFileName);
		}

		uniquePart = '_' + counter++;
	} while (draftExists); //TODO this assume continuous drafts names

	//Skip the first null element
	for (let i = 1; i < draftsPaths.length; i++)
	{
		try
		{
			let stat = await fsProm.lstat(draftsPaths[i]);
			drafts.push({data: await fsProm.readFile(draftsPaths[i], 'utf8'), 
						created: stat.ctimeMs,
						modified: stat.mtimeMs,
						path: draftsPaths[i]});
		}
		catch (e){} // Ignore
	}

	return drafts;
};

async function saveDraft(fileObject, data)
{
	var draftFileName = fileObject.draftFileName || getDraftFileName(fileObject);

	if (!checkFileContent(data) || path.resolve(draftFileName).startsWith(__dirname))
	{
		throw new Error('Invalid file data');
	}
	else
	{
		await fsProm.writeFile(draftFileName, data, 'utf8');
		
		if (isWin)
		{
			try
			{
				// Add Hidden attribute:
				var child = spawn('attrib', ['+h', draftFileName]);
    			child.on('error', function(err) 
				{
					console.log('hiding draft file error: ' + err);
    			});
			} catch(e) {}
		}

		return draftFileName;
	}
}

async function saveFile(fileObject, data, origStat, overwrite, defEnc)
{
	if (!checkFileContent(data) || path.resolve(fileObject.path).startsWith(__dirname))
	{
		throw new Error('Invalid file data');
	}

	var retryCount = 0;
	var backupCreated = false;
	var bkpPath = path.join(path.dirname(fileObject.path), BKP_PREFEX + path.basename(fileObject.path) + BKP_EXT);
	const oldBkpPath = path.join(path.dirname(fileObject.path), OLD_BKP_PREFEX + path.basename(fileObject.path) + BKP_EXT);
	var writeEnc = defEnc || fileObject.encoding;

	var writeFile = async function()
	{
		let fh;

		try
		{
			// O_SYNC is for sync I/O and reduce risk of file corruption
			fh = await fsProm.open(fileObject.path, O_SYNC | O_CREAT | O_WRONLY | O_TRUNC);
			await fsProm.writeFile(fh, data, writeEnc);
		}
		finally
		{
			await fh?.close();
		}

		let stat2 = await fsProm.stat(fileObject.path);
		// Workaround for possible writing errors is to check the written
		// contents of the file and retry 3 times before showing an error
		let writtenData = await fsProm.readFile(fileObject.path, writeEnc);
		
		if (data != writtenData)
		{
			retryCount++;
			
			if (retryCount < 3)
			{
				return await writeFile();
			}
			else
			{
				throw new Error('all saving trials failed');
			}
		}
		else
		{
			//We'll keep the backup file in case the original file is corrupted. TODO When should we delete the backup file?
			if (backupCreated)
			{
				//fs.unlink(bkpPath, (err) => {}); //Ignore errors!

				//Delete old backup file with old prefix
				if (fs.existsSync(oldBkpPath))
				{
					fs.unlink(oldBkpPath, (err) => {}); //Ignore errors
				}
			}

			return stat2;
		}
	};
	
	async function doSaveFile(isNew)
	{
		if (enableStoreBkp && !isNew)
		{
			//Copy file to backup file (after conflict and stat is checked)
			let bkpFh;

			try
			{
				//Use file read then write to open the backup file direct sync write to reduce the chance of file corruption
				let fileContent = await fsProm.readFile(fileObject.path, writeEnc);
				bkpFh = await fsProm.open(bkpPath, O_SYNC | O_CREAT | O_WRONLY | O_TRUNC);
				await fsProm.writeFile(bkpFh, fileContent, writeEnc);
				backupCreated = true;
			}
			catch (e) 
			{
				if (__DEV__)
				{
					console.log('Backup file writing failed', e); //Ignore
				}
			}
			finally 
			{
				await bkpFh?.close();

				if (isWin)
				{
					try
					{
						// Add Hidden attribute:
						var child = spawn('attrib', ['+h', bkpPath]);
						child.on('error', function(err) 
						{
							console.log('hiding backup file error: ' + err);
						});
					} catch(e) {}
				}
			}
		}

		return await writeFile();
	};
	
	if (overwrite)
	{
		return await doSaveFile(true);
	}
	else
	{
		let stat = fs.existsSync(fileObject.path)?
					await fsProm.stat(fileObject.path) : null;

		if (stat && isConflict(origStat, stat))
		{
			throw new Error('conflict');
		}
		else
		{
			return await doSaveFile(stat == null);
		}
	}
};

async function writeFile(filePath, data, enc)
{
	if (!checkFileContent(data, enc) || path.resolve(filePath).startsWith(__dirname))
	{
		throw new Error('Invalid file data');
	}
	else
	{
		return await fsProm.writeFile(filePath, data, enc);
	}
};

function getAppDataFolder()
{
	try
	{
		var appDataDir = app.getPath('appData');
		var drawioDir = appDataDir + '/draw.io';
		
		if (!fs.existsSync(drawioDir)) //Usually this dir already exists
		{
			fs.mkdirSync(drawioDir);
		}
		
		return drawioDir;
	}
	catch(e) {}
	
	return '.';
};

function getDocumentsFolder()
{
	//On windows, misconfigured Documents folder cause an exception
	try
	{
		return app.getPath('documents');
	}
	catch(e) {}
	
	return '.';
};

function checkFileExists(pathParts)
{
	let filePath = path.join(...pathParts);
	return {exists: fs.existsSync(filePath), path: filePath};
};

async function showOpenDialog(defaultPath, filters, properties)
{
	let win = BrowserWindow.getFocusedWindow();

	return dialog.showOpenDialog(win, {
		defaultPath: defaultPath,
		filters: filters,
		properties: properties
	});
};

async function showSaveDialog(defaultPath, filters)
{
	let win = BrowserWindow.getFocusedWindow();

	return dialog.showSaveDialog(win, {
		defaultPath: defaultPath,
		filters: filters
	});
};

async function installPlugin(filePath)
{
	if (!enablePlugins) return {};

	var pluginsDir = path.join(getAppDataFolder(), '/plugins');
	
	if (!fs.existsSync(pluginsDir))
	{
		fs.mkdirSync(pluginsDir);
	}
	
	var pluginName = path.basename(filePath);
	var dstFile = path.join(pluginsDir, pluginName);
	
	if (fs.existsSync(dstFile))
	{
		throw new Error('fileExists');
	}
	else
	{
		await fsProm.copyFile(filePath, dstFile);
	}

	return {pluginName: pluginName, selDir: path.dirname(filePath)};
}

function getPluginFile(plugin)
{
	if (!enablePlugins) return null;
	
	const prefix = path.join(getAppDataFolder(), '/plugins/');
	const pluginFile = path.join(prefix, plugin);
	        	
	if (pluginFile.startsWith(prefix) && fs.existsSync(pluginFile))
	{
		return pluginFile;
	}

	return null;
}

function uninstallPlugin(plugin)
{
	const pluginFile = getPluginFile(plugin);
	        	
	if (pluginFile != null)
	{
		fs.unlinkSync(pluginFile);
	}
}

function dirname(path_p)
{
	return path.dirname(path_p);
}

async function readFile(filename, encoding)
{
	let data = await fsProm.readFile(filename, encoding);

	if (checkFileContent(data, encoding) && !path.resolve(filename).startsWith(__dirname))
	{
		return data;
	}

	throw new Error('Invalid file data');
}

async function fileStat(file)
{
	return await fsProm.stat(file);
}

async function isFileWritable(file)
{
	try 
	{
		await fsProm.access(file, fs.constants.W_OK);
		return true;
	}
	catch (e)
	{
		return false;
	}
}

function clipboardAction(method, data)
{
	if (method == 'writeText')
	{
		clipboard.writeText(data);
	}
	else if (method == 'readText')
	{
		return clipboard.readText();
	}
	else if (method == 'writeImage')
	{
		clipboard.write({image: 
			nativeImage.createFromDataURL(data.dataUrl), html: '<img src="' +
			data.dataUrl + '" width="' + data.w + '" height="' + data.h + '">'});
	}
}

async function deleteFile(file) 
{
	// Reading the header of the file to confirm it is a file we can delete
	let fh = await fsProm.open(file, O_RDONLY);
	let buffer = Buffer.allocUnsafe(16);
	await fh.read(buffer, 0, 16);
	await fh.close();

	if (checkFileContent(buffer) && !path.resolve(file).startsWith(__dirname))
	{
		await fsProm.unlink(file);
	}
}

function windowAction(method)
{
	let win = BrowserWindow.getFocusedWindow();

	if (win)
	{
		if (method == 'minimize')
		{
			win.minimize();
		}
		else if (method == 'maximize')
		{
			win.maximize();
		}
		else if (method == 'unmaximize')
		{
			win.unmaximize();
		}
		else if (method == 'close')
		{
			win.close();
		}
		else if (method == 'isMaximized')
		{
			return win.isMaximized();
		}
		else if (method == 'removeAllListeners')
		{
			win.removeAllListeners();
		}
	}
}

const allowedUrls = /^(?:https?|mailto|tel|callto):/i;

function openExternal(url)
{
	//Only open http(s), mailto, tel, and callto links
	if (allowedUrls.test(url))
	{
		shell.openExternal(url);
		return true;
	}

	return false;
}

function watchFile(filePath)
{
	let win = BrowserWindow.getFocusedWindow();

	if (win)
	{
		fs.watchFile(filePath, (curr, prev) => {
			try
			{
				win.webContents.send('fileChanged', {
					path: filePath,
					curr: curr,
					prev: prev
				});
			}
			catch (e) {} // Ignore
		});
	}
}

function unwatchFile(filePath)
{
	fs.unwatchFile(filePath);
}

ipcMain.on("rendererReq", async (event, args) => 
{
	if (!validateSender(event.senderFrame)) return null;

	try
	{
		let ret = null;

		switch(args.action)
		{
		case 'saveFile':
			ret = await saveFile(args.fileObject, args.data, args.origStat, args.overwrite, args.defEnc);
			break;
		case 'writeFile':
			ret = await writeFile(args.path, args.data, args.enc);
			break;
		case 'saveDraft':
			ret = await saveDraft(args.fileObject, args.data);
			break;
		case 'getFileDrafts':
			ret = await getFileDrafts(args.fileObject);
			break;
		case 'getDocumentsFolder':
			ret = await getDocumentsFolder();
			break;
		case 'checkFileExists':
			ret = await checkFileExists(args.pathParts);
			break;
		case 'showOpenDialog':
			dialogOpen = true;
			ret = await showOpenDialog(args.defaultPath, args.filters, args.properties);
			ret = ret.filePaths;
			dialogOpen = false;
			break;
		case 'showSaveDialog':
			dialogOpen = true;
			ret = await showSaveDialog(args.defaultPath, args.filters);
			ret = ret.canceled? null : ret.filePath;
			dialogOpen = false;
			break;
		case 'installPlugin':
			ret = await installPlugin(args.filePath);
			break;
		case 'uninstallPlugin':
			ret = await uninstallPlugin(args.plugin);
			break;
		case 'getPluginFile':
			ret = await getPluginFile(args.plugin);
			break;
		case 'isPluginsEnabled':
			ret = enablePlugins;
			break;
		case 'dirname':
			ret = await dirname(args.path);
			break;
		case 'readFile':
			ret = await readFile(args.filename, args.encoding);
			break;
		case 'clipboardAction':
			ret = await clipboardAction(args.method, args.data);
			break;
		case 'deleteFile':
			ret = await deleteFile(args.file);
			break;
		case 'fileStat':
			ret = await fileStat(args.file);
			break;
		case 'isFileWritable':
			ret = await isFileWritable(args.file);
			break;
		case 'windowAction':
			ret = await windowAction(args.method);
			break;
		case 'openExternal':
			ret = await openExternal(args.url);
			break;
		case 'watchFile':
			ret = await watchFile(args.path);
			break;
		case 'unwatchFile':	
			ret = await unwatchFile(args.path);
			break;
		};

		event.reply('mainResp', {success: true, data: ret, reqId: args.reqId});
	}
	catch (e)
	{
		event.reply('mainResp', {error: true, msg: e.message, e: e, reqId: args.reqId});
	}
});
		var mxIsElectron = navigator.userAgent != null && navigator.userAgent.toLowerCase().indexOf(' electron/') > -1;
window.mxLanguages=window.mxLanguages||["de","se"];var mxClient={VERSION:"21.4.1",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
(function(){var b=new mxObjectCodec(new ChangeGridColor,["ui"]);b.beforeDecode=function(e,f,c){c.ui=e.ui;return f};mxCodecRegistry.register(b)})();(function(){EditorUi.VERSION="21.4.1";EditorUi.compactUi="atlas"!=Editor.currentTheme;Editor.isDarkMode()&&(mxGraphView.prototype.gridColor=mxGraphView.prototype.defaultDarkGridColor);EditorUi.enableLogging="1"!=urlParams.stealth&&"1"!=urlParams.lockdown&&(/.*\.draw\.io$/.test(window.location.hostname)||/.*\.diagrams\.net$/.test(window.location.hostname))&&"support.draw.io"!=window.location.hostname;EditorUi.drawHost=window.DRAWIO_BASE_URL;EditorUi.lightboxHost=window.DRAWIO_LIGHTBOX_URL;
App.pluginRegistry={"4xAKTrabTpTzahoLthkwPNUn":"plugins/explore.js",ex:"plugins/explore.js",ac:"plugins/connect.js",acj:"plugins/connectJira.js",ac148:"plugins/cConf-1-4-8.js",ac148cmnt:"plugins/cConf-comments.js",nxtcld:"plugins/nextcloud.js",monday:"plugins/monday.js",voice:"plugins/voice.js",tips:"plugins/tooltips.js",svgdata:"plugins/svgdata.js",electron:"plugins/electron.js",number:"plugins/number.js",sql:"plugins/sql.js",props:"plugins/props.js",text:"plugins/text.js",anim:"plugins/animation.js",
update:"plugins/update.js",trees:"plugins/trees/trees.js","import":"plugins/import.js",replay:"plugins/replay.js",anon:"plugins/anonymize.js",tr:"plugins/trello.js",f5:"plugins/rackF5.js",tickets:"plugins/tickets.js",flow:"plugins/flow.js",webcola:"plugins/webcola/webcola.js",rnd:"plugins/random.js",page:"plugins/page.js",gd:"plugins/googledrive.js",tags:"plugins/tags.js"};App.publicPlugin="ex voice tips svgdata number sql props text anim update trees replay anon tickets flow webcola tags".split(" ");
	'electron': 'plugins/electron.js',
					if (CryptoJS.MD5(content).toString() != '54e964166a638e485d475fdae66aa95d')
			'\'sha256-6g514VrT/cZFZltSaKxIVNFF46+MFaTSDTPB8WfYK+c=\' ' +
			var app_diagrams_net = csp.replace(/%script-src%/g, 'https://www.dropbox.com https://api.trello.com https://cdn.jsdelivr.net/npm/monday-sdk-js/dist/main.js').
			
			console.log('Header Worker:', 'let securityHeaders =', JSON.stringify({
				online: {
					"Content-Security-Policy" : app_diagrams_net,
					"Permissions-Policy" : "microphone=()"
				},
				viewer: {
					"Content-Security-Policy" : viewer_diagrams_net,
					"Permissions-Policy" : "microphone=()",
				},
				teams: {
					"Content-Security-Policy" : app_diagrams_net.replace(/ 'sha256-[^']+'/g, '') + 'worker-src https://app.diagrams.net/service-worker.js;',
					"Permissions-Policy" : "microphone=()"
				},
				jira: {
					"Content-Security-Policy" : aj_draw_io,
					"Permissions-Policy" : "microphone=()"
				},
				conf: {
					"Content-Security-Policy" : ac_draw_io,
					"Permissions-Policy" : "microphone=()"
				}
			}, null, 4));
	navigator.userAgent.toLowerCase().indexOf(' electron/') > -1;
window.mxLanguages=window.mxLanguages||["de","se"];var mxClient={VERSION:"21.4.1",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
(function(){var b=new mxObjectCodec(new ChangeGridColor,["ui"]);b.beforeDecode=function(f,l,d){d.ui=f.ui;return l};mxCodecRegistry.register(b)})();(function(){EditorUi.VERSION="21.4.1";EditorUi.compactUi="atlas"!=Editor.currentTheme;Editor.isDarkMode()&&(mxGraphView.prototype.gridColor=mxGraphView.prototype.defaultDarkGridColor);EditorUi.enableLogging="1"!=urlParams.stealth&&"1"!=urlParams.lockdown&&(/.*\.draw\.io$/.test(window.location.hostname)||/.*\.diagrams\.net$/.test(window.location.hostname))&&"support.draw.io"!=window.location.hostname;EditorUi.drawHost=window.DRAWIO_BASE_URL;EditorUi.lightboxHost=window.DRAWIO_LIGHTBOX_URL;
App.pluginRegistry={"4xAKTrabTpTzahoLthkwPNUn":"plugins/explore.js",ex:"plugins/explore.js",ac:"plugins/connect.js",acj:"plugins/connectJira.js",ac148:"plugins/cConf-1-4-8.js",ac148cmnt:"plugins/cConf-comments.js",nxtcld:"plugins/nextcloud.js",monday:"plugins/monday.js",voice:"plugins/voice.js",tips:"plugins/tooltips.js",svgdata:"plugins/svgdata.js",electron:"plugins/electron.js",number:"plugins/number.js",sql:"plugins/sql.js",props:"plugins/props.js",text:"plugins/text.js",anim:"plugins/animation.js",
update:"plugins/update.js",trees:"plugins/trees/trees.js","import":"plugins/import.js",replay:"plugins/replay.js",anon:"plugins/anonymize.js",tr:"plugins/trello.js",f5:"plugins/rackF5.js",tickets:"plugins/tickets.js",flow:"plugins/flow.js",webcola:"plugins/webcola/webcola.js",rnd:"plugins/random.js",page:"plugins/page.js",gd:"plugins/googledrive.js",tags:"plugins/tags.js"};App.publicPlugin="ex voice tips svgdata number sql props text anim update trees replay anon tickets flow webcola tags".split(" ");
window.mxLanguages=window.mxLanguages||["de","se"];var mxClient={VERSION:"21.4.1",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
(function(){var b=new mxObjectCodec(new ChangeGridColor,["ui"]);b.beforeDecode=function(e,g,p){p.ui=e.ui;return g};mxCodecRegistry.register(b)})();(function(){EditorUi.VERSION="21.4.1";EditorUi.compactUi="atlas"!=Editor.currentTheme;Editor.isDarkMode()&&(mxGraphView.prototype.gridColor=mxGraphView.prototype.defaultDarkGridColor);EditorUi.enableLogging="1"!=urlParams.stealth&&"1"!=urlParams.lockdown&&(/.*\.draw\.io$/.test(window.location.hostname)||/.*\.diagrams\.net$/.test(window.location.hostname))&&"support.draw.io"!=window.location.hostname;EditorUi.drawHost=window.DRAWIO_BASE_URL;EditorUi.lightboxHost=window.DRAWIO_LIGHTBOX_URL;
window.mxLanguages=window.mxLanguages||["de","se"];var mxClient={VERSION:"21.4.1",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
(function(){var b=new mxObjectCodec(new ChangeGridColor,["ui"]);b.beforeDecode=function(e,g,p){p.ui=e.ui;return g};mxCodecRegistry.register(b)})();(function(){EditorUi.VERSION="21.4.1";EditorUi.compactUi="atlas"!=Editor.currentTheme;Editor.isDarkMode()&&(mxGraphView.prototype.gridColor=mxGraphView.prototype.defaultDarkGridColor);EditorUi.enableLogging="1"!=urlParams.stealth&&"1"!=urlParams.lockdown&&(/.*\.draw\.io$/.test(window.location.hostname)||/.*\.diagrams\.net$/.test(window.location.hostname))&&"support.draw.io"!=window.location.hostname;EditorUi.drawHost=window.DRAWIO_BASE_URL;EditorUi.lightboxHost=window.DRAWIO_LIGHTBOX_URL;
var mxClient={VERSION:"21.4.1",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
presentationMode=Presentation Mode
unassigned=Unassigned
confAErrFaqs=There are {1} error(s), the following instructions may help fixing most of the cases. (Please download the log for future references)
confA403ErrFaq=There are ({1}) 403 error(s). The current users must have add (write) permissions on all pages and attachments. Even admins sometimes are not allowed to write to some pages via page restrictions
confA404ErrFaq=There are ({1}) 404 error(s). The attachment/page is not found. This is due to improper migration or the diagram file (an attachment of the page) is deleted.
confA500ErrFaq=There are ({1}) 500 error(s). An internal server error in Confluence Cloud. Such errors are due to overloading the server and usually fixed by retrying the process.
confAOtherErrFaq=There are ({1}) other error(s). Please check the error description. If the description is not clear, please contact our support.
confAReplaceBaseUrl=Replace Base URL in diagram links when no page ID mapping is found
flip=Putar
flipH=Putar Horizontal
flipV=Putar Vertikal
move=Pindahkan
moving=Pemindahan
noResponse=TIdak ada respons dari server
pageSetup=Pengaturan Halaman
rename=Namai Ulang
renamed=Dinamai Ulang
renameIt=Namai Ulang {1}
renaming=Menamai ulang
space=Spasi
confAUpdateLBLnkToPg=Updated lightbox link to page: "{1}" in diagram: "{2}"
confAUpdateLnkBase=Updated base URL from: "{1}" to: "{2}" in diagram: "{3}"
confAFixingMacro=Fixing macro of diagram "{1}"
confAErrReadingExpFile=Error reading export file
confAPrcsDiagInPageDone=Processing draw.io diagrams in page "{1}" finished
confAFixingMacroSkipped=Fixing macro of diagram "{1}" failed. Cannot find its new page ID. Maybe it points to a page that is not imported.
pageIdsExpTrg=Export target
confALucidDiagImgImported={2} diagram "{1}" image extracted successfully
confASavingLucidDiagImgFailed=Extracting {2} diagram "{1}" image failed
confGetInfoFailed=Fetching file info from {1} failed.
confCheckCacheFailed=Cannot get cached file info.
confReadFileErr=Cannot read "{1}" file from {2}.
confSaveCacheFailed=Unexpected error. Cannot save cached file
orgChartType=Org Chart Type
linear=Linear
hanger2=Hanger 2
hanger4=Hanger 4
fishbone1=Fishbone 1
fishbone2=Fishbone 2
1ColumnLeft=Single Column Left
1ColumnRight=Single Column Right
smart=Smart
parentChildSpacing=Parent Child Spacing
siblingSpacing=Sibling Spacing
confNoPermErr=Sorry, you don't have enough permissions to view this embedded diagram from page {1}
copyAsImage=Copy as Image
lucidImport=Lucidchart Import
lucidImportInst1=Click the "Start Import" button to import all Lucidchart diagrams.
installFirst=Please install {1} first
drawioChromeExt=draw.io Chrome Extension
loginFirstThen=Please login to {1} first, then {2}
errFetchDocList=Error: Couldn't fetch documents list
builtinPlugins=Built-in Plugins
extPlugins=External Plugins
backupFound=Backup file found
chromeOnly=This feature only works in Google Chrome
msgDeleted=This message has been deleted
confAErrFetchDrawList=Error fetching diagrams list. Some diagrams are skipped.
confAErrCheckDrawDiag=Cannot check diagram {1}
confAErrFetchPageList=Error fetching pages list
confADiagImportIncom={1} diagram "{2}" is imported partially and may have missing shapes
invalidSel=Invalid selection
diagNameEmptyErr=Diagram name cannot be empty
openDiagram=Open Diagram
newDiagram=New diagram
editable=Editable
confAReimportStarted=Re-import {1} diagrams started...
spaceFilter=Filter by spaces
curViewState=Current Viewer State
pageLayers=Page and Layers
customize=Customize
firstPage=First Page (All Layers)
curEditorState=Current Editor State
noAnchorsFound=No anchors found
attachment=Attachment
curDiagram=Current Diagram
recentDiags=Recent Diagrams
csvImport=CSV Import
chooseFile=Choose a file...
choose=Choose
gdriveFname=Google Drive filename
widthOfViewer=Width of the viewer (px)
heightOfViewer=Height of the viewer (px)
autoSetViewerSize=Automatically set the size of the viewer
thumbnail=Thumbnail
prevInDraw=Preview in draw.io
onedriveFname=OneDrive filename
diagFname=Diagram filename
diagUrl=Diagram URL
showDiag=Show Diagram
diagPreview=Diagram Preview
csvFileUrl=CSV File URL
generate=Generate
selectDiag2Insert=Please select a diagram to insert it.
errShowingDiag=Unexpected error. Cannot show diagram
noRecentDiags=No recent diagrams found
fetchingRecentFailed=Failed to fetch recent diagrams
useSrch2FindDiags=Use the search box to find draw.io diagrams
cantReadChckPerms=Cannot read the specified diagram. Please check you have read permission on that file.
cantFetchChckPerms=Cannot fetch diagram info. Please check you have read permission on that file.
searchFailed=Searching failed. Please try again later.
plsTypeStr=Please type a search string.
unsupportedFileChckUrl=Unsupported file. Please check the specified URL
diagNotFoundChckUrl=Diagram not found or cannot be accessed. Please check the specified URL
csvNotFoundChckUrl=CSV file not found or cannot be accessed. Please check the specified URL
cantReadUpload=Cannot read the uploaded diagram
select=Select
errCantGetIdType=Unexpected Error: Cannot get content id or type.
errGAuthWinBlocked=Error: Google Authentication window blocked
authDrawAccess=Authorize draw.io to access {1}
connTimeout=The connection has timed out
errAuthSrvc=Error authenticating to {1}
plsSelectFile=Please select a file
mustBgtZ={1} must be greater than zero
cantLoadPrev=Cannot load file preview.
errAccessFile=Error: Access Denied. You do not have permission to access "{1}".
noPrevAvail=No preview is available.
personalAccNotSup=Personal accounts are not supported.
errSavingTryLater=Error occurred during saving, please try again later.
plsEnterFld=Please enter {1}
invalidDiagUrl=Invalid Diagram URL
unsupportedVsdx=Unsupported vsdx file
unsupportedImg=Unsupported image file
unsupportedFormat=Unsupported file format
plsSelectSingleFile=Please select a single file only
attCorrupt=Attachment file "{1}" is corrupted
loadAttFailed=Failed to load attachment "{1}"
embedDrawDiag=Embed draw.io Diagram
addDiagram=Add Diagram
embedDiagram=Embed Diagram
editOwningPg=Edit owning page
deepIndexing=Deep Indexing (Index diagrams that aren't used in any page also)
confADeepIndexStarted=Deep Indexing Started
confADeepIndexDone=Deep Indexing Done
officeNoDiagramsSelected=No diagrams found in the selection
officeNoDiagramsInDoc=No diagrams found in the document
officeNotSupported=This feature is not supported in this host application
someImagesFailed={1} out of {2} failed due to the following errors
importingNoUsedDiagrams=Importing {1} Diagrams not used in pages
importingDrafts=Importing {1} Diagrams in drafts
processingDrafts=Processing drafts
updatingDrafts=Updating drafts
updateDrafts=Update drafts
notifications=Notifications
drawioImp=draw.io Import
confALibsImp=Importing draw.io Libraries
confALibsImpFailed=Importing {1} library failed
drawDiagrams=draw.io Diagrams
errFileNotFoundOrNoPer=Error: Access Denied. File not found or you do not have permission to access "{1}" on {2}.
confACheckPagesWEmbed=Checking pages having embedded draw.io diagrams.
replaceWith=Replace with
replaceAll=Replace All
replFind=Replace/Find
matchesRepl={1} matches replaced
linkToDiagram=Link to Diagram
drawioTeams=draw.io Teams
members=Members
adminEditors=Admins/Editors
allowAll=Allow all
noTeams=No teams found
errorLoadingTeams=Error Loading Teams
noTeamMembers=No team members found
errLoadTMembers=Error loading team members
confAErrFaqs=There are {1} error(s), the following instructions may help fixing most of the cases. (Please download the log for future references)
confA403ErrFaq=There are ({1}) 403 error(s). The current users must have add (write) permissions on all pages and attachments. Even admins sometimes are not allowed to write to some pages via page restrictions
confA404ErrFaq=There are ({1}) 404 error(s). The attachment/page is not found. This is due to improper migration or the diagram file (an attachment of the page) is deleted.
confA500ErrFaq=There are ({1}) 500 error(s). An internal server error in Confluence Cloud. Such errors are due to overloading the server and usually fixed by retrying the process.
confAOtherErrFaq=There are ({1}) other error(s). Please check the error description. If the description is not clear, please contact our support.
confAReplaceBaseUrl=Replace Base URL in diagram links when no page ID mapping is found
if(!self.define){const e=e=>{"require"!==e&&(e+=".js");let r=Promise.resolve();return i[e]||(r=new Promise((async r=>{if("document"in self){const i=document.createElement("script");i.src=e,document.head.appendChild(i),i.onload=r}else importScripts(e),r()}))),r.then((()=>{if(!i[e])throw new Error(`Module ${e} didn’t register its module`);return i[e]}))},r=(r,i)=>{Promise.all(r.map(e)).then((e=>i(1===e.length?e[0]:e)))},i={require:Promise.resolve(r)};self.define=(r,a,c)=>{i[r]||(i[r]=Promise.resolve().then((()=>{let i={};const s={uri:location.origin+r.slice(1)};return Promise.all(a.map((r=>{switch(r){case"exports":return i;case"module":return s;default:return e(r)}}))).then((e=>{const r=c(...e);return i.default||(i.default=r),i}))})))}}define("./service-worker.js",["./workbox-99ba3a23"],(function(e){"use strict";self.addEventListener("message",(e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()})),e.precacheAndRoute([{url:"js/app.min.js",revision:"24ace1901711d6cab23a4ef379de9120"},{url:"js/extensions.min.js",revision:"3834501a2250d98fc7207a6ae6298f14"},{url:"js/orgchart.min.js",revision:"619d8c4dab47b81868916df31f55478b"},{url:"js/stencils.min.js",revision:"698f1f70f64466ff6ae9280cd91cd23f"},{url:"js/shapes-14-6-5.min.js",revision:"95f54e7999c9fba2a1d65b4fe4f634f3"},{url:"js/math-print.js",revision:"cf64f6a493a8cb5079f2b70813e478d7"},{url:"index.html",revision:"8279349dc2b6543249d7e51c2d1cf92e"},{url:"open.html",revision:"d71816b3b00e769fc6019fcdd6921662"},{url:"styles/fonts/ArchitectsDaughter-Regular.ttf",revision:"31c2153c0530e32553b31a49b3d70736"},{url:"styles/grapheditor.css",revision:"c80c6d3bdaa85e0fbc9d9b174ef763f4"},{url:"styles/atlas.css",revision:"d627cfef208f13a9cff1670f143c6348"},{url:"styles/dark.css",revision:"436ac9aaaa67eb15e64c368cc05ba5a7"},{url:"js/dropbox/Dropbox-sdk.min.js",revision:"4b9842892aa37b156db0a8364b7a83b0"},{url:"js/onedrive/OneDrive.js",revision:"505e8280346666f7ee801bc59521fa67"},{url:"js/viewer-static.min.js",revision:"c7148759e7b2120d703b4cbf3dfda60f"},{url:"connect/jira/editor-1-3-3.html",revision:"6ec59ca5f689067e52cdda13f22ed89f"},{url:"connect/jira/viewerPanel-1-3-12.html",revision:"9adfcef71f6a8c68c20c2d2fba35fe19"},{url:"connect/jira/fullScreenViewer-1-3-3.html",revision:"29c803d9aa4dc0718540c916a0a4e62c"},{url:"connect/jira/viewerPanel.js",revision:"8d298de3aeaa32cad74b5d4b53ed3d4f"},{url:"connect/jira/spinner.gif",revision:"7d857ab9d86123e93d74d48e958fe743"},{url:"connect/jira/editor.js",revision:"d1c80a7301cd26c6dc31b1fdce9e37e5"},{url:"connect/jira/fullscreen-viewer-init.js",revision:"e00ad51fc16b87c362d6eaf930ab1fa5"},{url:"connect/jira/fullscreen-viewer.js",revision:"d5748a4fe01b7e747914ebd3e37c9de2"},{url:"plugins/connectJira.js",revision:"4cefa13414e0d406550f3c073923080c"},{url:"plugins/cConf-comments.js",revision:"ee6764429bf47a8545aa1cedacee718e"},{url:"plugins/cConf-1-4-8.js",revision:"91c04e236ba9dbdb26d8565b3354e00a"},{url:"connect/confluence/connectUtils-1-4-8.js",revision:"9b93b748a41a6f9444ff92810b7908b8"},{url:"connect/new_common/cac.js",revision:"6d666b6789b51dabc5a1af53a9db5d3d"},{url:"connect/gdrive_common/gac.js",revision:"78f85e79f15f56b8b8d83c90f4a15679"},{url:"connect/onedrive_common/ac.js",revision:"d10d4603e86da7c9af277dac832e8e06"},{url:"connect/confluence/viewer-init.js",revision:"8aa8d02147def4535563bc65632a3e6d"},{url:"connect/confluence/viewer.js",revision:"e865c0c1820464235ca8f0b9dc6eb71e"},{url:"connect/confluence/viewer-1-4-42.html",revision:"083a8751312bdb6485f2a4ced206e086"},{url:"connect/confluence/macroEditor-1-4-8.html",revision:"b2908e71f755a069fe6487e1e705736c"},{url:"connect/confluence/includeDiagram-1-4-8.js",revision:"2947a24a48572562d9fcb55b20d22fca"},{url:"connect/confluence/includeDiagram.html",revision:"bbc4156ca3902347d3c8121dd08a89d7"},{url:"connect/confluence/macro-editor.js",revision:"0bd745f0c23bba15ad1ff8e7b8e14987"},{url:"math/es5/startup.js",revision:"dc7130cdc866593293dbb5dde11ceb40"},{url:"math/es5/core.js",revision:"f71bc0bfb7d2ac8261747f97a5d47dd4"},{url:"math/es5/ui/safe.js",revision:"8c1fcfee7c879588ad409edcdd9cce53"},{url:"math/es5/output/svg.js",revision:"4f55967d16197ebb01b86356d8ab179a"},{url:"math/es5/input/tex.js",revision:"5c4f470da2ccb1acf85041fcecd6fff6"},{url:"math/es5/input/asciimath.js",revision:"c2d4076dd8e26d509bfe3a378e71cfa7"},{url:"math/es5/output/svg/fonts/tex.js",revision:"6eab785a3788ea805bd2b552d1f0aab8"},{url:"resources/dia.txt",revision:"f2bb9f811ec054499a5eca5add259a96"},{url:"resources/dia_am.txt",revision:"757af1ba9c187b2db9865965be4584d4"},{url:"resources/dia_ar.txt",revision:"f139fee88b934da5fc0e51c800449d2e"},{url:"resources/dia_bg.txt",revision:"b59ea02be4c9c5b60791327a42503115"},{url:"resources/dia_bn.txt",revision:"c7bb29b3be89b945859a9dbc996e3977"},{url:"resources/dia_bs.txt",revision:"c8faa32407ce808dd181f1708300dc65"},{url:"resources/dia_ca.txt",revision:"b2a3ab72212774891c4698f3aa67764b"},{url:"resources/dia_cs.txt",revision:"621536d118c10c11e0455bdc21d90495"},{url:"resources/dia_da.txt",revision:"2c9232e5e9cef27da9172a187a933115"},{url:"resources/dia_de.txt",revision:"112d8443021165e8c7d9994f97ddaf48"},{url:"resources/dia_el.txt",revision:"cbeb9bcc4a8a37ab0cce55d996c3b627"},{url:"resources/dia_eo.txt",revision:"c4d5feab9f7ce5d22f8487f4fc2bc585"},{url:"resources/dia_es.txt",revision:"d0d9810976aeb9b9fef0118aca1c3815"},{url:"resources/dia_et.txt",revision:"5303fb8a71bf11794f3cbe9324fd3d2d"},{url:"resources/dia_eu.txt",revision:"552e57dff8a9233098009af48380f066"},{url:"resources/dia_fa.txt",revision:"a2bd813de7a95f881a1ac941fab6ea29"},{url:"resources/dia_fi.txt",revision:"dbbd5d0126ad8f43fe18735f4f65b604"},{url:"resources/dia_fil.txt",revision:"0efbb4b0779c2314496e2209272f1729"},{url:"resources/dia_fr.txt",revision:"60a1a016d2ba9f171848b48a3b4baadd"},{url:"resources/dia_gl.txt",revision:"089dd7084f23978ef1696e674bcc4cab"},{url:"resources/dia_gu.txt",revision:"e00b05d0b7fe33e23a8c589c8226d2a7"},{url:"resources/dia_he.txt",revision:"bba5f189a07b266f40dfed938b0068c6"},{url:"resources/dia_hi.txt",revision:"d580a9d0f5545626c9cc37daafc51a3c"},{url:"resources/dia_hr.txt",revision:"97deaf0afd81d692f005dc02f329ac88"},{url:"resources/dia_hu.txt",revision:"465d05499416a9adeb023313a8160424"},{url:"resources/dia_id.txt",revision:"3e5ab9a1098930d4dd84278169f49b86"},{url:"resources/dia_it.txt",revision:"da633c90cadf73d0df46991b5586df54"},{url:"resources/dia_ja.txt",revision:"95dcedfc13dd97fb2ae63184d3ae14fc"},{url:"resources/dia_kn.txt",revision:"965dc84ec662842d0c313674632a5544"},{url:"resources/dia_ko.txt",revision:"e49ee6d9c9bbc77276cb85c97069b919"},{url:"resources/dia_lt.txt",revision:"51465381c456510952d6269952dced5e"},{url:"resources/dia_lv.txt",revision:"3ac8dd9a8bb6e7ec1143ab46cd70b96a"},{url:"resources/dia_ml.txt",revision:"11910b85c2616d84d97651e97cf11d7a"},{url:"resources/dia_mr.txt",revision:"8497141bca86742111017248e26a07ea"},{url:"resources/dia_ms.txt",revision:"ee74d690582d04322dba57dbc7224c99"},{url:"resources/dia_my.txt",revision:"f2bb9f811ec054499a5eca5add259a96"},{url:"resources/dia_nl.txt",revision:"35a2a6ece18b1c59893925d547425261"},{url:"resources/dia_no.txt",revision:"b0b4fe8a1c31db304d431935cdab14b8"},{url:"resources/dia_pl.txt",revision:"c86f5e75805a2903734a1c9a7a81d63b"},{url:"resources/dia_pt-br.txt",revision:"2eee01639ff6775e24220fbfa3c9c788"},{url:"resources/dia_pt.txt",revision:"63407d1bd46853ff9e3ed3b9ace9602f"},{url:"resources/dia_ro.txt",revision:"e2e5f6a838ae71143e6c50b290af7bb1"},{url:"resources/dia_ru.txt",revision:"38de6a4f45437cdd66dc3decc48c8841"},{url:"resources/dia_si.txt",revision:"f2bb9f811ec054499a5eca5add259a96"},{url:"resources/dia_sk.txt",revision:"58fffaadfebfec4deafcfc5c20178b57"},{url:"resources/dia_sl.txt",revision:"a66ac8feda2a580540b7b840603c1e23"},{url:"resources/dia_sr.txt",revision:"9cb339e7ca6db727cbcec145b01a7bdb"},{url:"resources/dia_sv.txt",revision:"84338c7bffb013c00b71ee6868a55b9f"},{url:"resources/dia_sw.txt",revision:"476b03b2ee388853d15f8f7924a10e40"},{url:"resources/dia_ta.txt",revision:"ef879e2a9c097abe6b578a22df399257"},{url:"resources/dia_te.txt",revision:"efd7ac431c2163371f13f1e0cdb05aaa"},{url:"resources/dia_th.txt",revision:"1ab6b69b33a88ed897c96a885165a566"},{url:"resources/dia_tr.txt",revision:"4c1bae6ee6079bf94c4e7e86a49b2684"},{url:"resources/dia_uk.txt",revision:"612e5ccdf38b00749ff4926cd1ea2b3f"},{url:"resources/dia_vi.txt",revision:"757058bddd335a0c0bc37829a2b2ff2a"},{url:"resources/dia_zh-tw.txt",revision:"838b0f7bd695a5a2a0c5ebbd83d33296"},{url:"resources/dia_zh.txt",revision:"7736de1c10669ab8f284558fb5dc434c"},{url:"favicon.ico",revision:"fab2d88b37c72d83607527573de45281"},{url:"images/manifest.json",revision:"389fa448cb99794bece27ffcb216abee"},{url:"images/logo.png",revision:"89630b64b911ebe0daa3dfe442087cfa"},{url:"images/drawlogo.svg",revision:"4bf4d14ebcf072d8bd4c5a1c89e88fc6"},{url:"images/drawlogo48.png",revision:"8b13428373aca67b895364d025f42417"},{url:"images/drawlogo-gray.svg",revision:"0aabacbc0873816e1e09e4736ae44c7d"},{url:"images/drawlogo-text-bottom.svg",revision:"f6c438823ab31f290940bd4feb8dd9c2"},{url:"images/default-user.jpg",revision:"2c399696a87c8921f12d2f9e1990cc6e"},{url:"images/logo-flat-small.png",revision:"4b178e59ff499d6dd1894fc498b59877"},{url:"images/apple-touch-icon.png",revision:"73da7989a23ce9a4be565ec65658a239"},{url:"images/favicon-16x16.png",revision:"1a79d5461a5d2bf21f6652e0ac20d6e5"},{url:"images/favicon-32x32.png",revision:"e3b92da2febe70bad5372f6f3474b034"},{url:"images/android-chrome-196x196.png",revision:"f8c045b2d7b1c719fda64edab04c415c"},{url:"images/android-chrome-512x512.png",revision:"959b5fac2453963ff6d60fb85e4b73fd"},{url:"images/delete.png",revision:"5f2350f2fd20f1a229637aed32ed8f29"},{url:"images/droptarget.png",revision:"bbf7f563fb6784de1ce96f329519b043"},{url:"images/help.png",revision:"9266c6c3915bd33c243d80037d37bf61"},{url:"images/download.png",revision:"35418dd7bd48d87502c71b578cc6c37f"},{url:"images/logo-flat.png",revision:"038070ab43aee6e54a791211859fc67b"},{url:"images/google-drive-logo.svg",revision:"5d9f2f5bbc7dcc252730a0072bb23059"},{url:"images/onedrive-logo.svg",revision:"3645b344ec0634c1290dd58d7dc87b97"},{url:"images/dropbox-logo.svg",revision:"e6be408c77cf9c82d41ac64fa854280a"},{url:"images/github-logo.svg",revision:"a1a999b69a275eac0cb918360ac05ae1"},{url:"images/gitlab-logo.svg",revision:"0faea8c818899e58533e153c44b10517"},{url:"images/trello-logo.svg",revision:"006fd0d7d70d7e95dc691674cb12e044"},{url:"images/osa_drive-harddisk.png",revision:"b954e1ae772087c5b4c6ae797e1f9649"},{url:"images/osa_database.png",revision:"c350d9d9b95f37b6cfe798b40ede5fb0"},{url:"images/google-drive-logo-white.svg",revision:"f329d8b1be7778515a85b93fc35d9f26"},{url:"images/dropbox-logo-white.svg",revision:"4ea8299ac3bc31a16f199ee3aec223bf"},{url:"images/onedrive-logo-white.svg",revision:"b3602fa0fc947009cff3f33a581cff4d"},{url:"images/github-logo-white.svg",revision:"537b1127b3ca0f95b45782d1304fb77a"},{url:"images/gitlab-logo-white.svg",revision:"5fede9ac2f394c716b8c23e3fddc3910"},{url:"images/trello-logo-white-orange.svg",revision:"e2a0a52ba3766682f138138d10a75eb5"},{url:"images/logo-confluence.png",revision:"ed1e55d44ae5eba8f999aba2c93e8331"},{url:"images/logo-jira.png",revision:"f8d460555a0d1f87cfd901e940666629"},{url:"images/clear.gif",revision:"db13c778e4382e0b55258d0f811d5d70"},{url:"images/spin.gif",revision:"487cbb40b9ced439aa1ad914e816d773"},{url:"images/checkmark.gif",revision:"ba764ce62f2bf952df5bbc2bb4d381c5"},{url:"images/hs.png",revision:"fefa1a03d92ebad25c88dca94a0b63db"},{url:"images/aui-wait.gif",revision:"5a474bcbd8d2f2826f03d10ea44bf60e"},{url:"mxgraph/css/common.css",revision:"618b42f0bde0c7685e04811c25dc2b3e"},{url:"mxgraph/images/expanded.gif",revision:"2b67c2c035af1e9a5cc814f0d22074cf"},{url:"mxgraph/images/collapsed.gif",revision:"73cc826da002a3d740ca4ce6ec5c1f4a"},{url:"mxgraph/images/maximize.gif",revision:"5cd13d6925493ab51e876694cc1c2ec2"},{url:"mxgraph/images/minimize.gif",revision:"8957741b9b0f86af9438775f2aadbb54"},{url:"mxgraph/images/close.gif",revision:"8b84669812ac7382984fca35de8da48b"},{url:"mxgraph/images/resize.gif",revision:"a6477612b3567a34033f9cac6184eed3"},{url:"mxgraph/images/separator.gif",revision:"7819742ff106c97da7a801c2372bbbe5"},{url:"mxgraph/images/window.gif",revision:"fd9a21dd4181f98052a202a0a01f18ab"},{url:"mxgraph/images/window-title.gif",revision:"3fb1d6c43246cdf991a11dfe826dfe99"},{url:"mxgraph/images/button.gif",revision:"00759bdc3ad218fa739f584369541809"},{url:"mxgraph/images/point.gif",revision:"83a43717b284902442620f61bc4e9fa6"}],{ignoreURLParametersMatching:[/.*/]})}));
{"version":3,"file":"service-worker.js","sources":["../../../../../tmp/47be77072c8f5a091f9e8b37e334731c/service-worker.js"],"sourcesContent":["import {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/usr/lib/node_modules/workbox-cli/node_modules/workbox-precaching/precacheAndRoute.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.addEventListener('message', (event) => {\n  if (event.data && event.data.type === 'SKIP_WAITING') {\n    self.skipWaiting();\n  }\n});\n\n\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n  {\n    \"url\": \"js/app.min.js\",\n    \"revision\": \"24ace1901711d6cab23a4ef379de9120\"\n  },\n  {\n    \"url\": \"js/extensions.min.js\",\n    \"revision\": \"3834501a2250d98fc7207a6ae6298f14\"\n  },\n  {\n    \"url\": \"js/orgchart.min.js\",\n    \"revision\": \"619d8c4dab47b81868916df31f55478b\"\n  },\n  {\n    \"url\": \"js/stencils.min.js\",\n    \"revision\": \"698f1f70f64466ff6ae9280cd91cd23f\"\n  },\n  {\n    \"url\": \"js/shapes-14-6-5.min.js\",\n    \"revision\": \"95f54e7999c9fba2a1d65b4fe4f634f3\"\n  },\n  {\n    \"url\": \"js/math-print.js\",\n    \"revision\": \"cf64f6a493a8cb5079f2b70813e478d7\"\n  },\n  {\n    \"url\": \"index.html\",\n    \"revision\": \"8279349dc2b6543249d7e51c2d1cf92e\"\n  },\n  {\n    \"url\": \"open.html\",\n    \"revision\": \"d71816b3b00e769fc6019fcdd6921662\"\n  },\n  {\n    \"url\": \"styles/fonts/ArchitectsDaughter-Regular.ttf\",\n    \"revision\": \"31c2153c0530e32553b31a49b3d70736\"\n  },\n  {\n    \"url\": \"styles/grapheditor.css\",\n    \"revision\": \"c80c6d3bdaa85e0fbc9d9b174ef763f4\"\n  },\n  {\n    \"url\": \"styles/atlas.css\",\n    \"revision\": \"d627cfef208f13a9cff1670f143c6348\"\n  },\n  {\n    \"url\": \"styles/dark.css\",\n    \"revision\": \"436ac9aaaa67eb15e64c368cc05ba5a7\"\n  },\n  {\n    \"url\": \"js/dropbox/Dropbox-sdk.min.js\",\n    \"revision\": \"4b9842892aa37b156db0a8364b7a83b0\"\n  },\n  {\n    \"url\": \"js/onedrive/OneDrive.js\",\n    \"revision\": \"505e8280346666f7ee801bc59521fa67\"\n  },\n  {\n    \"url\": \"js/viewer-static.min.js\",\n    \"revision\": \"c7148759e7b2120d703b4cbf3dfda60f\"\n  },\n  {\n    \"url\": \"connect/jira/editor-1-3-3.html\",\n    \"revision\": \"6ec59ca5f689067e52cdda13f22ed89f\"\n  },\n  {\n    \"url\": \"connect/jira/viewerPanel-1-3-12.html\",\n    \"revision\": \"9adfcef71f6a8c68c20c2d2fba35fe19\"\n  },\n  {\n    \"url\": \"connect/jira/fullScreenViewer-1-3-3.html\",\n    \"revision\": \"29c803d9aa4dc0718540c916a0a4e62c\"\n  },\n  {\n    \"url\": \"connect/jira/viewerPanel.js\",\n    \"revision\": \"8d298de3aeaa32cad74b5d4b53ed3d4f\"\n  },\n  {\n    \"url\": \"connect/jira/spinner.gif\",\n    \"revision\": \"7d857ab9d86123e93d74d48e958fe743\"\n  },\n  {\n    \"url\": \"connect/jira/editor.js\",\n    \"revision\": \"d1c80a7301cd26c6dc31b1fdce9e37e5\"\n  },\n  {\n    \"url\": \"connect/jira/fullscreen-viewer-init.js\",\n    \"revision\": \"e00ad51fc16b87c362d6eaf930ab1fa5\"\n  },\n  {\n    \"url\": \"connect/jira/fullscreen-viewer.js\",\n    \"revision\": \"d5748a4fe01b7e747914ebd3e37c9de2\"\n  },\n  {\n    \"url\": \"plugins/connectJira.js\",\n    \"revision\": \"4cefa13414e0d406550f3c073923080c\"\n  },\n  {\n    \"url\": \"plugins/cConf-comments.js\",\n    \"revision\": \"ee6764429bf47a8545aa1cedacee718e\"\n  },\n  {\n    \"url\": \"plugins/cConf-1-4-8.js\",\n    \"revision\": \"91c04e236ba9dbdb26d8565b3354e00a\"\n  },\n  {\n    \"url\": \"connect/confluence/connectUtils-1-4-8.js\",\n    \"revision\": \"9b93b748a41a6f9444ff92810b7908b8\"\n  },\n  {\n    \"url\": \"connect/new_common/cac.js\",\n    \"revision\": \"6d666b6789b51dabc5a1af53a9db5d3d\"\n  },\n  {\n    \"url\": \"connect/gdrive_common/gac.js\",\n    \"revision\": \"78f85e79f15f56b8b8d83c90f4a15679\"\n  },\n  {\n    \"url\": \"connect/onedrive_common/ac.js\",\n    \"revision\": \"d10d4603e86da7c9af277dac832e8e06\"\n  },\n  {\n    \"url\": \"connect/confluence/viewer-init.js\",\n    \"revision\": \"8aa8d02147def4535563bc65632a3e6d\"\n  },\n  {\n    \"url\": \"connect/confluence/viewer.js\",\n    \"revision\": \"e865c0c1820464235ca8f0b9dc6eb71e\"\n  },\n  {\n    \"url\": \"connect/confluence/viewer-1-4-42.html\",\n    \"revision\": \"083a8751312bdb6485f2a4ced206e086\"\n  },\n  {\n    \"url\": \"connect/confluence/macroEditor-1-4-8.html\",\n    \"revision\": \"b2908e71f755a069fe6487e1e705736c\"\n  },\n  {\n    \"url\": \"connect/confluence/includeDiagram-1-4-8.js\",\n    \"revision\": \"2947a24a48572562d9fcb55b20d22fca\"\n  },\n  {\n    \"url\": \"connect/confluence/includeDiagram.html\",\n    \"revision\": \"bbc4156ca3902347d3c8121dd08a89d7\"\n  },\n  {\n    \"url\": \"connect/confluence/macro-editor.js\",\n    \"revision\": \"0bd745f0c23bba15ad1ff8e7b8e14987\"\n  },\n  {\n    \"url\": \"math/es5/startup.js\",\n    \"revision\": \"dc7130cdc866593293dbb5dde11ceb40\"\n  },\n  {\n    \"url\": \"math/es5/core.js\",\n    \"revision\": \"f71bc0bfb7d2ac8261747f97a5d47dd4\"\n  },\n  {\n    \"url\": \"math/es5/ui/safe.js\",\n    \"revision\": \"8c1fcfee7c879588ad409edcdd9cce53\"\n  },\n  {\n    \"url\": \"math/es5/output/svg.js\",\n    \"revision\": \"4f55967d16197ebb01b86356d8ab179a\"\n  },\n  {\n    \"url\": \"math/es5/input/tex.js\",\n    \"revision\": \"5c4f470da2ccb1acf85041fcecd6fff6\"\n  },\n  {\n    \"url\": \"math/es5/input/asciimath.js\",\n    \"revision\": \"c2d4076dd8e26d509bfe3a378e71cfa7\"\n  },\n  {\n    \"url\": \"math/es5/output/svg/fonts/tex.js\",\n    \"revision\": \"6eab785a3788ea805bd2b552d1f0aab8\"\n  },\n  {\n    \"url\": \"resources/dia.txt\",\n    \"revision\": \"f2bb9f811ec054499a5eca5add259a96\"\n  },\n  {\n    \"url\": \"resources/dia_am.txt\",\n    \"revision\": \"757af1ba9c187b2db9865965be4584d4\"\n  },\n  {\n    \"url\": \"resources/dia_ar.txt\",\n    \"revision\": \"f139fee88b934da5fc0e51c800449d2e\"\n  },\n  {\n    \"url\": \"resources/dia_bg.txt\",\n    \"revision\": \"b59ea02be4c9c5b60791327a42503115\"\n  },\n  {\n    \"url\": \"resources/dia_bn.txt\",\n    \"revision\": \"c7bb29b3be89b945859a9dbc996e3977\"\n  },\n  {\n    \"url\": \"resources/dia_bs.txt\",\n    \"revision\": \"c8faa32407ce808dd181f1708300dc65\"\n  },\n  {\n    \"url\": \"resources/dia_ca.txt\",\n    \"revision\": \"b2a3ab72212774891c4698f3aa67764b\"\n  },\n  {\n    \"url\": \"resources/dia_cs.txt\",\n    \"revision\": \"621536d118c10c11e0455bdc21d90495\"\n  },\n  {\n    \"url\": \"resources/dia_da.txt\",\n    \"revision\": \"2c9232e5e9cef27da9172a187a933115\"\n  },\n  {\n    \"url\": \"resources/dia_de.txt\",\n    \"revision\": \"112d8443021165e8c7d9994f97ddaf48\"\n  },\n  {\n    \"url\": \"resources/dia_el.txt\",\n    \"revision\": \"cbeb9bcc4a8a37ab0cce55d996c3b627\"\n  },\n  {\n    \"url\": \"resources/dia_eo.txt\",\n    \"revision\": \"c4d5feab9f7ce5d22f8487f4fc2bc585\"\n  },\n  {\n    \"url\": \"resources/dia_es.txt\",\n    \"revision\": \"d0d9810976aeb9b9fef0118aca1c3815\"\n  },\n  {\n    \"url\": \"resources/dia_et.txt\",\n    \"revision\": \"5303fb8a71bf11794f3cbe9324fd3d2d\"\n  },\n  {\n    \"url\": \"resources/dia_eu.txt\",\n    \"revision\": \"552e57dff8a9233098009af48380f066\"\n  },\n  {\n    \"url\": \"resources/dia_fa.txt\",\n    \"revision\": \"a2bd813de7a95f881a1ac941fab6ea29\"\n  },\n  {\n    \"url\": \"resources/dia_fi.txt\",\n    \"revision\": \"dbbd5d0126ad8f43fe18735f4f65b604\"\n  },\n  {\n    \"url\": \"resources/dia_fil.txt\",\n    \"revision\": \"0efbb4b0779c2314496e2209272f1729\"\n  },\n  {\n    \"url\": \"resources/dia_fr.txt\",\n    \"revision\": \"60a1a016d2ba9f171848b48a3b4baadd\"\n  },\n  {\n    \"url\": \"resources/dia_gl.txt\",\n    \"revision\": \"089dd7084f23978ef1696e674bcc4cab\"\n  },\n  {\n    \"url\": \"resources/dia_gu.txt\",\n    \"revision\": \"e00b05d0b7fe33e23a8c589c8226d2a7\"\n  },\n  {\n    \"url\": \"resources/dia_he.txt\",\n    \"revision\": \"bba5f189a07b266f40dfed938b0068c6\"\n  },\n  {\n    \"url\": \"resources/dia_hi.txt\",\n    \"revision\": \"d580a9d0f5545626c9cc37daafc51a3c\"\n  },\n  {\n    \"url\": \"resources/dia_hr.txt\",\n    \"revision\": \"97deaf0afd81d692f005dc02f329ac88\"\n  },\n  {\n    \"url\": \"resources/dia_hu.txt\",\n    \"revision\": \"465d05499416a9adeb023313a8160424\"\n  },\n  {\n    \"url\": \"resources/dia_id.txt\",\n    \"revision\": \"3e5ab9a1098930d4dd84278169f49b86\"\n  },\n  {\n    \"url\": \"resources/dia_it.txt\",\n    \"revision\": \"da633c90cadf73d0df46991b5586df54\"\n  },\n  {\n    \"url\": \"resources/dia_ja.txt\",\n    \"revision\": \"95dcedfc13dd97fb2ae63184d3ae14fc\"\n  },\n  {\n    \"url\": \"resources/dia_kn.txt\",\n    \"revision\": \"965dc84ec662842d0c313674632a5544\"\n  },\n  {\n    \"url\": \"resources/dia_ko.txt\",\n    \"revision\": \"e49ee6d9c9bbc77276cb85c97069b919\"\n  },\n  {\n    \"url\": \"resources/dia_lt.txt\",\n    \"revision\": \"51465381c456510952d6269952dced5e\"\n  },\n  {\n    \"url\": \"resources/dia_lv.txt\",\n    \"revision\": \"3ac8dd9a8bb6e7ec1143ab46cd70b96a\"\n  },\n  {\n    \"url\": \"resources/dia_ml.txt\",\n    \"revision\": \"11910b85c2616d84d97651e97cf11d7a\"\n  },\n  {\n    \"url\": \"resources/dia_mr.txt\",\n    \"revision\": \"8497141bca86742111017248e26a07ea\"\n  },\n  {\n    \"url\": \"resources/dia_ms.txt\",\n    \"revision\": \"ee74d690582d04322dba57dbc7224c99\"\n  },\n  {\n    \"url\": \"resources/dia_my.txt\",\n    \"revision\": \"f2bb9f811ec054499a5eca5add259a96\"\n  },\n  {\n    \"url\": \"resources/dia_nl.txt\",\n    \"revision\": \"35a2a6ece18b1c59893925d547425261\"\n  },\n  {\n    \"url\": \"resources/dia_no.txt\",\n    \"revision\": \"b0b4fe8a1c31db304d431935cdab14b8\"\n  },\n  {\n    \"url\": \"resources/dia_pl.txt\",\n    \"revision\": \"c86f5e75805a2903734a1c9a7a81d63b\"\n  },\n  {\n    \"url\": \"resources/dia_pt-br.txt\",\n    \"revision\": \"2eee01639ff6775e24220fbfa3c9c788\"\n  },\n  {\n    \"url\": \"resources/dia_pt.txt\",\n    \"revision\": \"63407d1bd46853ff9e3ed3b9ace9602f\"\n  },\n  {\n    \"url\": \"resources/dia_ro.txt\",\n    \"revision\": \"e2e5f6a838ae71143e6c50b290af7bb1\"\n  },\n  {\n    \"url\": \"resources/dia_ru.txt\",\n    \"revision\": \"38de6a4f45437cdd66dc3decc48c8841\"\n  },\n  {\n    \"url\": \"resources/dia_si.txt\",\n    \"revision\": \"f2bb9f811ec054499a5eca5add259a96\"\n  },\n  {\n    \"url\": \"resources/dia_sk.txt\",\n    \"revision\": \"58fffaadfebfec4deafcfc5c20178b57\"\n  },\n  {\n    \"url\": \"resources/dia_sl.txt\",\n    \"revision\": \"a66ac8feda2a580540b7b840603c1e23\"\n  },\n  {\n    \"url\": \"resources/dia_sr.txt\",\n    \"revision\": \"9cb339e7ca6db727cbcec145b01a7bdb\"\n  },\n  {\n    \"url\": \"resources/dia_sv.txt\",\n    \"revision\": \"84338c7bffb013c00b71ee6868a55b9f\"\n  },\n  {\n    \"url\": \"resources/dia_sw.txt\",\n    \"revision\": \"476b03b2ee388853d15f8f7924a10e40\"\n  },\n  {\n    \"url\": \"resources/dia_ta.txt\",\n    \"revision\": \"ef879e2a9c097abe6b578a22df399257\"\n  },\n  {\n    \"url\": \"resources/dia_te.txt\",\n    \"revision\": \"efd7ac431c2163371f13f1e0cdb05aaa\"\n  },\n  {\n    \"url\": \"resources/dia_th.txt\",\n    \"revision\": \"1ab6b69b33a88ed897c96a885165a566\"\n  },\n  {\n    \"url\": \"resources/dia_tr.txt\",\n    \"revision\": \"4c1bae6ee6079bf94c4e7e86a49b2684\"\n  },\n  {\n    \"url\": \"resources/dia_uk.txt\",\n    \"revision\": \"612e5ccdf38b00749ff4926cd1ea2b3f\"\n  },\n  {\n    \"url\": \"resources/dia_vi.txt\",\n    \"revision\": \"757058bddd335a0c0bc37829a2b2ff2a\"\n  },\n  {\n    \"url\": \"resources/dia_zh-tw.txt\",\n    \"revision\": \"838b0f7bd695a5a2a0c5ebbd83d33296\"\n  },\n  {\n    \"url\": \"resources/dia_zh.txt\",\n    \"revision\": \"7736de1c10669ab8f284558fb5dc434c\"\n  },\n  {\n    \"url\": \"favicon.ico\",\n    \"revision\": \"fab2d88b37c72d83607527573de45281\"\n  },\n  {\n    \"url\": \"images/manifest.json\",\n    \"revision\": \"389fa448cb99794bece27ffcb216abee\"\n  },\n  {\n    \"url\": \"images/logo.png\",\n    \"revision\": \"89630b64b911ebe0daa3dfe442087cfa\"\n  },\n  {\n    \"url\": \"images/drawlogo.svg\",\n    \"revision\": \"4bf4d14ebcf072d8bd4c5a1c89e88fc6\"\n  },\n  {\n    \"url\": \"images/drawlogo48.png\",\n    \"revision\": \"8b13428373aca67b895364d025f42417\"\n  },\n  {\n    \"url\": \"images/drawlogo-gray.svg\",\n    \"revision\": \"0aabacbc0873816e1e09e4736ae44c7d\"\n  },\n  {\n    \"url\": \"images/drawlogo-text-bottom.svg\",\n    \"revision\": \"f6c438823ab31f290940bd4feb8dd9c2\"\n  },\n  {\n    \"url\": \"images/default-user.jpg\",\n    \"revision\": \"2c399696a87c8921f12d2f9e1990cc6e\"\n  },\n  {\n    \"url\": \"images/logo-flat-small.png\",\n    \"revision\": \"4b178e59ff499d6dd1894fc498b59877\"\n  },\n  {\n    \"url\": \"images/apple-touch-icon.png\",\n    \"revision\": \"73da7989a23ce9a4be565ec65658a239\"\n  },\n  {\n    \"url\": \"images/favicon-16x16.png\",\n    \"revision\": \"1a79d5461a5d2bf21f6652e0ac20d6e5\"\n  },\n  {\n    \"url\": \"images/favicon-32x32.png\",\n    \"revision\": \"e3b92da2febe70bad5372f6f3474b034\"\n  },\n  {\n    \"url\": \"images/android-chrome-196x196.png\",\n    \"revision\": \"f8c045b2d7b1c719fda64edab04c415c\"\n  },\n  {\n    \"url\": \"images/android-chrome-512x512.png\",\n    \"revision\": \"959b5fac2453963ff6d60fb85e4b73fd\"\n  },\n  {\n    \"url\": \"images/delete.png\",\n    \"revision\": \"5f2350f2fd20f1a229637aed32ed8f29\"\n  },\n  {\n    \"url\": \"images/droptarget.png\",\n    \"revision\": \"bbf7f563fb6784de1ce96f329519b043\"\n  },\n  {\n    \"url\": \"images/help.png\",\n    \"revision\": \"9266c6c3915bd33c243d80037d37bf61\"\n  },\n  {\n    \"url\": \"images/download.png\",\n    \"revision\": \"35418dd7bd48d87502c71b578cc6c37f\"\n  },\n  {\n    \"url\": \"images/logo-flat.png\",\n    \"revision\": \"038070ab43aee6e54a791211859fc67b\"\n  },\n  {\n    \"url\": \"images/google-drive-logo.svg\",\n    \"revision\": \"5d9f2f5bbc7dcc252730a0072bb23059\"\n  },\n  {\n    \"url\": \"images/onedrive-logo.svg\",\n    \"revision\": \"3645b344ec0634c1290dd58d7dc87b97\"\n  },\n  {\n    \"url\": \"images/dropbox-logo.svg\",\n    \"revision\": \"e6be408c77cf9c82d41ac64fa854280a\"\n  },\n  {\n    \"url\": \"images/github-logo.svg\",\n    \"revision\": \"a1a999b69a275eac0cb918360ac05ae1\"\n  },\n  {\n    \"url\": \"images/gitlab-logo.svg\",\n    \"revision\": \"0faea8c818899e58533e153c44b10517\"\n  },\n  {\n    \"url\": \"images/trello-logo.svg\",\n    \"revision\": \"006fd0d7d70d7e95dc691674cb12e044\"\n  },\n  {\n    \"url\": \"images/osa_drive-harddisk.png\",\n    \"revision\": \"b954e1ae772087c5b4c6ae797e1f9649\"\n  },\n  {\n    \"url\": \"images/osa_database.png\",\n    \"revision\": \"c350d9d9b95f37b6cfe798b40ede5fb0\"\n  },\n  {\n    \"url\": \"images/google-drive-logo-white.svg\",\n    \"revision\": \"f329d8b1be7778515a85b93fc35d9f26\"\n  },\n  {\n    \"url\": \"images/dropbox-logo-white.svg\",\n    \"revision\": \"4ea8299ac3bc31a16f199ee3aec223bf\"\n  },\n  {\n    \"url\": \"images/onedrive-logo-white.svg\",\n    \"revision\": \"b3602fa0fc947009cff3f33a581cff4d\"\n  },\n  {\n    \"url\": \"images/github-logo-white.svg\",\n    \"revision\": \"537b1127b3ca0f95b45782d1304fb77a\"\n  },\n  {\n    \"url\": \"images/gitlab-logo-white.svg\",\n    \"revision\": \"5fede9ac2f394c716b8c23e3fddc3910\"\n  },\n  {\n    \"url\": \"images/trello-logo-white-orange.svg\",\n    \"revision\": \"e2a0a52ba3766682f138138d10a75eb5\"\n  },\n  {\n    \"url\": \"images/logo-confluence.png\",\n    \"revision\": \"ed1e55d44ae5eba8f999aba2c93e8331\"\n  },\n  {\n    \"url\": \"images/logo-jira.png\",\n    \"revision\": \"f8d460555a0d1f87cfd901e940666629\"\n  },\n  {\n    \"url\": \"images/clear.gif\",\n    \"revision\": \"db13c778e4382e0b55258d0f811d5d70\"\n  },\n  {\n    \"url\": \"images/spin.gif\",\n    \"revision\": \"487cbb40b9ced439aa1ad914e816d773\"\n  },\n  {\n    \"url\": \"images/checkmark.gif\",\n    \"revision\": \"ba764ce62f2bf952df5bbc2bb4d381c5\"\n  },\n  {\n    \"url\": \"images/hs.png\",\n    \"revision\": \"fefa1a03d92ebad25c88dca94a0b63db\"\n  },\n  {\n    \"url\": \"images/aui-wait.gif\",\n    \"revision\": \"5a474bcbd8d2f2826f03d10ea44bf60e\"\n  },\n  {\n    \"url\": \"mxgraph/css/common.css\",\n    \"revision\": \"618b42f0bde0c7685e04811c25dc2b3e\"\n  },\n  {\n    \"url\": \"mxgraph/images/expanded.gif\",\n    \"revision\": \"2b67c2c035af1e9a5cc814f0d22074cf\"\n  },\n  {\n    \"url\": \"mxgraph/images/collapsed.gif\",\n    \"revision\": \"73cc826da002a3d740ca4ce6ec5c1f4a\"\n  },\n  {\n    \"url\": \"mxgraph/images/maximize.gif\",\n    \"revision\": \"5cd13d6925493ab51e876694cc1c2ec2\"\n  },\n  {\n    \"url\": \"mxgraph/images/minimize.gif\",\n    \"revision\": \"8957741b9b0f86af9438775f2aadbb54\"\n  },\n  {\n    \"url\": \"mxgraph/images/close.gif\",\n    \"revision\": \"8b84669812ac7382984fca35de8da48b\"\n  },\n  {\n    \"url\": \"mxgraph/images/resize.gif\",\n    \"revision\": \"a6477612b3567a34033f9cac6184eed3\"\n  },\n  {\n    \"url\": \"mxgraph/images/separator.gif\",\n    \"revision\": \"7819742ff106c97da7a801c2372bbbe5\"\n  },\n  {\n    \"url\": \"mxgraph/images/window.gif\",\n    \"revision\": \"fd9a21dd4181f98052a202a0a01f18ab\"\n  },\n  {\n    \"url\": \"mxgraph/images/window-title.gif\",\n    \"revision\": \"3fb1d6c43246cdf991a11dfe826dfe99\"\n  },\n  {\n    \"url\": \"mxgraph/images/button.gif\",\n    \"revision\": \"00759bdc3ad218fa739f584369541809\"\n  },\n  {\n    \"url\": \"mxgraph/images/point.gif\",\n    \"revision\": \"83a43717b284902442620f61bc4e9fa6\"\n  }\n], {\n  \"ignoreURLParametersMatching\": [/.*/]\n});\n\n\n\n\n\n\n\n\n"],"names":["self","addEventListener","event","data","type","skipWaiting","workbox_precaching_precacheAndRoute","url","revision","ignoreURLParametersMatching"],"mappings":"szBAmBAA,KAAKC,iBAAiB,WAAYC,IAC5BA,EAAMC,MAA4B,iBAApBD,EAAMC,KAAKC,MAC3BJ,KAAKK,aACN,IAWHC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,gBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,YACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,kBACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,cACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,kBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,kBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,kBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,gBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,qCAEb,CACDC,4BAA+B,CAAC"}
		var mxIsElectron = navigator.userAgent != null && navigator.userAgent.toLowerCase().indexOf(' electron/') > -1;
<script type="text/javascript">
  function doImport(vsdxBuff, callback, error, file, customParam)
  {
	EditorUi.prototype.createUi = function(){};
	EditorUi.prototype.addTrees = function(){};
	EditorUi.prototype.updateActionStates = function(){};
 	var editorUi = new EditorUi();
 	var blob = file? file : new Blob([vsdxBuff], {type: 'application/octet-stream'});

 	editorUi.importVisio(blob, callback, error, file? file.name : null, customParam);		
  };

  try
  {
	electron.registerMsgListener('import', (vsdxBuff) => 
	{
	 	doImport(vsdxBuff, function(xml)
		{
			electron.sendMessage('import-success', xml);
		},
		function()
		{
			electron.sendMessage('import-error');
		});
	});
  }
  catch(e) {} //Ignore
</script>
	<script type="text/javascript">
		document.getElementById('fileUpload').addEventListener('change', function()
		{
			const curFiles = this.files;

			if(curFiles.length > 0) 
			{
				function createDoneDiv(msg)
				{
					var doneDiv = document.createElement('div');
					doneDiv.id = 'doneDiv';
					doneDiv.innerHTML = msg;
					document.body.appendChild(doneDiv);
				};
				
				doImport(null, function(xml)
				{
					window.importResXML = xml;
					createDoneDiv('success');
				}, function(err)
				{
					console.log(err)
					createDoneDiv('error');
				}, curFiles[0], window.customParam);
			}
		});
	</script>
Fixed code: 17-JUN-2023: 21.5.0

- Moves electron.js out of drawio project into desktop

21.5.0
		var mxIsElectron = navigator.userAgent != null && navigator.userAgent.toLowerCase().indexOf(' electron/') > -1 && 
							navigator.userAgent.indexOf(' draw.io/') > -1;
window.mxLanguages=window.mxLanguages||["de","se"];var mxClient={VERSION:"21.5.0",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
(function(){var b=new mxObjectCodec(new ChangeGridColor,["ui"]);b.beforeDecode=function(e,f,c){c.ui=e.ui;return f};mxCodecRegistry.register(b)})();(function(){EditorUi.VERSION="21.5.0";EditorUi.compactUi="atlas"!=Editor.currentTheme;Editor.isDarkMode()&&(mxGraphView.prototype.gridColor=mxGraphView.prototype.defaultDarkGridColor);EditorUi.enableLogging="1"!=urlParams.stealth&&"1"!=urlParams.lockdown&&(/.*\.draw\.io$/.test(window.location.hostname)||/.*\.diagrams\.net$/.test(window.location.hostname))&&"support.draw.io"!=window.location.hostname;EditorUi.drawHost=window.DRAWIO_BASE_URL;EditorUi.lightboxHost=window.DRAWIO_LIGHTBOX_URL;
App.pluginRegistry={"4xAKTrabTpTzahoLthkwPNUn":"plugins/explore.js",ex:"plugins/explore.js",ac:"plugins/connect.js",acj:"plugins/connectJira.js",ac148:"plugins/cConf-1-4-8.js",ac148cmnt:"plugins/cConf-comments.js",nxtcld:"plugins/nextcloud.js",monday:"plugins/monday.js",voice:"plugins/voice.js",tips:"plugins/tooltips.js",svgdata:"plugins/svgdata.js",number:"plugins/number.js",sql:"plugins/sql.js",props:"plugins/props.js",text:"plugins/text.js",anim:"plugins/animation.js",update:"plugins/update.js",
trees:"plugins/trees/trees.js","import":"plugins/import.js",replay:"plugins/replay.js",anon:"plugins/anonymize.js",tr:"plugins/trello.js",f5:"plugins/rackF5.js",tickets:"plugins/tickets.js",flow:"plugins/flow.js",webcola:"plugins/webcola/webcola.js",rnd:"plugins/random.js",page:"plugins/page.js",gd:"plugins/googledrive.js",tags:"plugins/tags.js"};App.publicPlugin="ex voice tips svgdata number sql props text anim update trees replay anon tickets flow webcola tags".split(" ");
					if (CryptoJS.MD5(content).toString() != '3428184eed5811f9c1458f703cb2806b')
			// Version 21.5.0
			'\'sha256-6zAB96lsBZREqf0sT44BhH1T69sm7HrN34rpMOcWbNo=\' ' +
			'\'sha256-3SkDBaLE+ouvAOfTmG2TGwmQ2EE9AT0F2YcHvZmEMeo=\' ' +
			var app_diagrams_net = csp.replace(/%script-src%/g, 'https://www.dropbox.com https://api.trello.com').
			var teams_diagrams_net = app_diagrams_net.replace(/ 'sha256-[^']+'/g, '') + 'worker-src https://app.diagrams.net/service-worker.js;';
			console.log('teams.diagrams.net:', teams_diagrams_net);

	navigator.userAgent.toLowerCase().indexOf(' electron/') > -1 && 
	navigator.userAgent.indexOf(' draw.io/') > -1;
/**
 * Adds meta tag to the page.
 */
function mxmeta(content, httpEquiv)
{
	try
	{
		var s = document.createElement('meta');
		
		s.setAttribute('content', content);
		s.setAttribute('http-equiv', httpEquiv);

		var t = document.getElementsByTagName('meta')[0];
		t.parentNode.insertBefore(s, t);
	}
	catch (e)
	{
		// ignore
	}
};

if (mxIsElectron)
{
	mxmeta('default-src \'self\'; script-src \'self\'; connect-src \'self\' https://*.draw.io https://*.diagrams.net https://fonts.googleapis.com https://fonts.gstatic.com; img-src * data:; media-src *; font-src *; frame-src \'none\'; style-src \'self\' \'unsafe-inline\' https://fonts.googleapis.com; base-uri \'none\';child-src \'self\';object-src \'none\';', 'Content-Security-Policy');
}
window.mxLanguages=window.mxLanguages||["de","se"];var mxClient={VERSION:"21.5.0",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
(function(){var b=new mxObjectCodec(new ChangeGridColor,["ui"]);b.beforeDecode=function(f,l,d){d.ui=f.ui;return l};mxCodecRegistry.register(b)})();(function(){EditorUi.VERSION="21.5.0";EditorUi.compactUi="atlas"!=Editor.currentTheme;Editor.isDarkMode()&&(mxGraphView.prototype.gridColor=mxGraphView.prototype.defaultDarkGridColor);EditorUi.enableLogging="1"!=urlParams.stealth&&"1"!=urlParams.lockdown&&(/.*\.draw\.io$/.test(window.location.hostname)||/.*\.diagrams\.net$/.test(window.location.hostname))&&"support.draw.io"!=window.location.hostname;EditorUi.drawHost=window.DRAWIO_BASE_URL;EditorUi.lightboxHost=window.DRAWIO_LIGHTBOX_URL;
App.pluginRegistry={"4xAKTrabTpTzahoLthkwPNUn":"plugins/explore.js",ex:"plugins/explore.js",ac:"plugins/connect.js",acj:"plugins/connectJira.js",ac148:"plugins/cConf-1-4-8.js",ac148cmnt:"plugins/cConf-comments.js",nxtcld:"plugins/nextcloud.js",monday:"plugins/monday.js",voice:"plugins/voice.js",tips:"plugins/tooltips.js",svgdata:"plugins/svgdata.js",number:"plugins/number.js",sql:"plugins/sql.js",props:"plugins/props.js",text:"plugins/text.js",anim:"plugins/animation.js",update:"plugins/update.js",
trees:"plugins/trees/trees.js","import":"plugins/import.js",replay:"plugins/replay.js",anon:"plugins/anonymize.js",tr:"plugins/trello.js",f5:"plugins/rackF5.js",tickets:"plugins/tickets.js",flow:"plugins/flow.js",webcola:"plugins/webcola/webcola.js",rnd:"plugins/random.js",page:"plugins/page.js",gd:"plugins/googledrive.js",tags:"plugins/tags.js"};App.publicPlugin="ex voice tips svgdata number sql props text anim update trees replay anon tickets flow webcola tags".split(" ");
window.mxLanguages=window.mxLanguages||["de","se"];var mxClient={VERSION:"21.5.0",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
(function(){var b=new mxObjectCodec(new ChangeGridColor,["ui"]);b.beforeDecode=function(e,g,p){p.ui=e.ui;return g};mxCodecRegistry.register(b)})();(function(){EditorUi.VERSION="21.5.0";EditorUi.compactUi="atlas"!=Editor.currentTheme;Editor.isDarkMode()&&(mxGraphView.prototype.gridColor=mxGraphView.prototype.defaultDarkGridColor);EditorUi.enableLogging="1"!=urlParams.stealth&&"1"!=urlParams.lockdown&&(/.*\.draw\.io$/.test(window.location.hostname)||/.*\.diagrams\.net$/.test(window.location.hostname))&&"support.draw.io"!=window.location.hostname;EditorUi.drawHost=window.DRAWIO_BASE_URL;EditorUi.lightboxHost=window.DRAWIO_LIGHTBOX_URL;
window.mxLanguages=window.mxLanguages||["de","se"];var mxClient={VERSION:"21.5.0",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
(function(){var b=new mxObjectCodec(new ChangeGridColor,["ui"]);b.beforeDecode=function(e,g,p){p.ui=e.ui;return g};mxCodecRegistry.register(b)})();(function(){EditorUi.VERSION="21.5.0";EditorUi.compactUi="atlas"!=Editor.currentTheme;Editor.isDarkMode()&&(mxGraphView.prototype.gridColor=mxGraphView.prototype.defaultDarkGridColor);EditorUi.enableLogging="1"!=urlParams.stealth&&"1"!=urlParams.lockdown&&(/.*\.draw\.io$/.test(window.location.hostname)||/.*\.diagrams\.net$/.test(window.location.hostname))&&"support.draw.io"!=window.location.hostname;EditorUi.drawHost=window.DRAWIO_BASE_URL;EditorUi.lightboxHost=window.DRAWIO_LIGHTBOX_URL;
var mxIsElectron = navigator.userAgent != null &&
	navigator.userAgent.toLowerCase().indexOf(' electron/') > -1 && 
	navigator.userAgent.indexOf(' draw.io/') > -1;
/**
 * Adds meta tag to the page.
 */
function mxmeta(content, httpEquiv)
{
	try
	{
		var s = document.createElement('meta');
		
		s.setAttribute('content', content);
		s.setAttribute('http-equiv', httpEquiv);

		var t = document.getElementsByTagName('meta')[0];
		t.parentNode.insertBefore(s, t);
	}
	catch (e)
	{
		// ignore
	}
};

function doImport(vsdxBuff, callback, error, file, customParam)
{
	EditorUi.prototype.createUi = function(){};
	EditorUi.prototype.addTrees = function(){};
	EditorUi.prototype.updateActionStates = function(){};
	var editorUi = new EditorUi();
	var blob = file? file : new Blob([vsdxBuff], {type: 'application/octet-stream'});

	editorUi.importVisio(blob, callback, error, file? file.name : null, customParam);		
};


if (mxIsElectron)
{
	mxmeta('default-src \'self\'; script-src \'self\'; connect-src \'self\' https://*.draw.io https://*.diagrams.net https://fonts.googleapis.com https://fonts.gstatic.com; img-src * data:; media-src *; font-src *; frame-src \'none\'; style-src \'self\' \'unsafe-inline\' https://fonts.googleapis.com; base-uri \'none\';child-src \'self\';object-src \'none\';', 'Content-Security-Policy');

	electron.registerMsgListener('import', (vsdxBuff) => 
	{
		doImport(vsdxBuff, function(xml)
		{
			electron.sendMessage('import-success', xml);
		},
		function()
		{
			electron.sendMessage('import-error');
		});
	});
}

window.addEventListener('load', function()
{
	document.getElementById('fileUpload').addEventListener('change', function()
	{
		const curFiles = this.files;

		if(curFiles.length > 0) 
		{
			function createDoneDiv(msg)
			{
				var doneDiv = document.createElement('div');
				doneDiv.id = 'doneDiv';
				doneDiv.innerHTML = msg;
				document.body.appendChild(doneDiv);
			};
			
			doImport(null, function(xml)
			{
				window.importResXML = xml;
				createDoneDiv('success');
			}, function(err)
			{
				console.log(err)
				createDoneDiv('error');
			}, curFiles[0], window.customParam);
		}
	});
});
var mxClient={VERSION:"21.5.0",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&0>navigator.userAgent.indexOf("Edge/"),
presentationMode=Mode de presentació
unassigned=No assignat
confAErrFaqs=Hi ha {1} error(s), les instruccions següents poden ajudar a solucionar la majoria dels casos. (Descarregueu el registre per a futures referències)
confA403ErrFaq=Hi ha ({1}) error(s) 403. Els usuaris actuals han de tenir permisos per afegir (escriptura) a totes les pàgines i fitxers adjunts. Fins i tot els administradors de vegades no poden escriure en algunes pàgines mitjançant restriccions de pàgina
confA404ErrFaq=Hi ha ({1}) error(s) 404. No s'ha trobat l'adjunt/pàgina. Això es deu a una migració incorrecta o s'ha suprimit el fitxer del diagrama (un fitxer adjunt de la pàgina).
confA500ErrFaq=Hi ha ({1}) error(s) 500. Un error intern del servidor a Confluence Cloud. Aquests errors es deuen a la sobrecàrrega del servidor i normalment es solucionen tornant a intentar el procés.
confAOtherErrFaq=Hi ha ({1}) altre(s) error(s). Comproveu la descripció de l'error. Si la descripció no és clara, poseu-vos en contacte amb el nostre servei d'assistència.
confAReplaceBaseUrl=Substituïu l'URL base als enllaços del diagrama quan no es trobi cap assignació d'ID de pàgina
flip=Jungkirkan
flipH=Jungkir Horizontal
flipV=Jungkir Vertikal
move=Pindah
moving=Memindah
noResponse=TIdak ada respon dari server
pageSetup=Penyiapan Halaman
rename=Ubah Nama
renamed=Diubah Nama
renameIt=Ubah Nama {1}
renaming=Mengubah Nama
space=Ruang
confAUpdateLBLnkToPg=Memperbarui tautan lightbox ke halaman: "{1}" dalam diagram: "{2}"
confAUpdateLnkBase=Memperbarui URL dasar dari: "{1}" menjadi: "{2}" dalam diagram: "{3}"
confAFixingMacro=Memperbaiki makro dari diagram "{1}"
confAErrReadingExpFile=Galat saat membaca berkas ekspor
confAPrcsDiagInPageDone=Pemrosesan diagram draw.io dalam halaman "{1}" selesai
confAFixingMacroSkipped=Memperbaiki makro dari diagram "{1}" gagal. Tidak bisa menemukan ID halaman barunya. Mungkin itu menunjuk ke suatu halaman yang tidak diimpor.
pageIdsExpTrg=Target ekspor
confALucidDiagImgImported=Gambar "{1}" diagram {2} sukses diekstrak
confASavingLucidDiagImgFailed=Ekstraksi gambar "{1}" diagram {2} gagal
confGetInfoFailed=Mengambil info berkas dari {1} gagal.
confCheckCacheFailed=Tidak bisa mendapat info berkas tersinggah.
confReadFileErr=Tidak bisa membaca berkas "{1}" dari {2}.
confSaveCacheFailed=Galat yang tidak diharapkan. Tidak bisa menyimpan berkas yang tersinggah
orgChartType=Tipe Bagan Organisasi
linear=Linier
hanger2=Gantungan baju 2
hanger4=Gantungan baju 4
fishbone1=Tulang ikan 1
fishbone2=Tulang Ikan 2
1ColumnLeft=Kolom Tunggal Kiri
1ColumnRight=Kolom Tunggal Kanan
smart=Cerdas
parentChildSpacing=Jarak Antara Induk Anak
siblingSpacing=Jarak Antara Sejajar
confNoPermErr=Maaf, Anda tidak punya cukup izin untuk melihat diagram tertanam dari halaman {1} ini
copyAsImage=Salin sebagai gambar
lucidImport=Impor Lucidchart
lucidImportInst1=Klik tombol "Mulai Impor" untuk mengimpor semua diagram Lucidchart.
installFirst=Harap pasang {1} terlebih dahulu
drawioChromeExt=Ekstensi Chrome draw.io
loginFirstThen=Harap log masuk ke {1} terlebih dahulu, lalu {2}
errFetchDocList=Galat: Tak bisa mengambil daftar dokumen
builtinPlugins=Pengaya Bawaan
extPlugins=Pengaya Eksternal
backupFound=Berkas backup ditemukan
chromeOnly=Fitur ini hanya bekerja di Google Chrome
msgDeleted=Pesan ini telah dihapus
confAErrFetchDrawList=Galat saat mengambil daftar diagram. Beberapa diagram dilewati.
confAErrCheckDrawDiag=Tidak bisa memeriksa diagram {1}
confAErrFetchPageList=Galat saat mengambil daftar halaman
confADiagImportIncom={1} diagram "{2}" diimpor sebagian dan mungkin kehilangan beberapa bentuk
invalidSel=Pilihan yang tidak valid
diagNameEmptyErr=Nama diagram tidak boleh kosong
openDiagram=Buka Diagram
newDiagram=Diagram Baru
editable=Dapat Disunting
confAReimportStarted=Impor ulang {1} diagram dimulai...
spaceFilter=Saring menurut spasi
curViewState=Keadaan Penampil Sekarang
pageLayers=Halaman dan Lapisan
customize=Sesuaikan
firstPage=Halaman Pertama (Semua Lapisan)
curEditorState=Keadaan Penyunting Saat Ini
noAnchorsFound=Tidak ditemukan jangkar
attachment=Lampiran
curDiagram=Diagram Saat ini
recentDiags=Diagram Baru-baru Ini
csvImport=Impor CSV
chooseFile=Pilih sebuah berkas...
choose=Pilih
gdriveFname=Nama berkas Google Drive
widthOfViewer=Lebar penampil (px)
heightOfViewer=Tinggi penampil (px)
autoSetViewerSize=Secara otomatis atur ukuran penampil
thumbnail=Gambar mini
prevInDraw=Pratinjau dalam draw.io
onedriveFname=Nama berkas OneDrive
diagFname=Nama berkas diagram
diagUrl=URL diagram
showDiag=Tampilkan Diagram
diagPreview=Pratinjau Diagram
csvFileUrl=URL Berkas CSV
generate=Bangkitkan
selectDiag2Insert=Harap pilih suatu diagram untuk disisipi.
errShowingDiag=Galat tak diharapkan. Tidak bisa menunjukkan diagram
noRecentDiags=Tidak ditemukan diagram baru-baru ini
fetchingRecentFailed=Gagal mengambil diagram baru-baru ini
useSrch2FindDiags=Gunakan kotak pencarian untuk menemukan diagram-diagram draw.io
cantReadChckPerms=Tidak bisa membaca diagram yang dinyatakan. Harap periksa apakah Anda punya hak baca pada berkas itu.
cantFetchChckPerms=Tidak bisa mengambil info diagram. Harap periksa apakah Anda punya hak baca pada berkas itu.
searchFailed=Pencarian gagal. Harap coba lagi nanti.
plsTypeStr=Harap ketikkan suatu string pencarian.
unsupportedFileChckUrl=Berkas yang tidak didukung. Harap periksa URL yang dinyatakan
diagNotFoundChckUrl=Diagram tidak ditemukan atau tidak bisa diakses. Harap periksa URL yang dinyatakan
csvNotFoundChckUrl=Berkas CVS tidak ditemukan atau tidak bisa diakses. Harap periksa URL yang dinyatakan
cantReadUpload=Tidak bisa membaca diagram yang diunggah
select=Pilih
errCantGetIdType=Galat Tak Diharapkan: Tidak bisa mendapatkan id atau tipe konten.
errGAuthWinBlocked=Galat: Jendela Otentikasi Google terblokir
authDrawAccess=Otorisasikan draw.io untuk mengakses {1}
connTimeout=Koneksi kehabisan waktu
errAuthSrvc=Galat mengotentikasi ke {1}
plsSelectFile=Harap pilih sebuah berkas
mustBgtZ={1} harus lebih dari nol
cantLoadPrev=Tidak bisa memuat pratinjau berkas.
errAccessFile=Galat: Akses Ditolak. Anda tidak punya izin untuk mengakses "{1}".
noPrevAvail=Tidak ada pratinjau yang tersedia.
personalAccNotSup=Akun pribadi tidak didukung.
errSavingTryLater=Terjadi galat saat menyimpan, harap coba lagi nanti.
plsEnterFld=Harap masukkan {1}
invalidDiagUrl=URL Diagram Tidak Valid
unsupportedVsdx=Berkas vsdx yang tidak didukung
unsupportedImg=Berkas gambar yang tidak didukung
unsupportedFormat=Format berkas yang tidak didukung
plsSelectSingleFile=Harap pilih satu berkas saja
attCorrupt=Berkas lampiran "{1}" terkorupsi
loadAttFailed=Gagal memuat lampiran "{1}"
embedDrawDiag=Tanamkan Diagram draw.io
addDiagram=Tambah Diagram
embedDiagram=Tanam Diagram
editOwningPg=Sunting halaman yang memuat
deepIndexing=Pengindeksan Dalam (Juga mengindeks diagram yang tidak dipakai di halaman mana pun)
confADeepIndexStarted=Pengindeksan Dalam Dimulai
confADeepIndexDone=Pengindeksan Dalam Selesai
officeNoDiagramsSelected=Tidak ditemukan diagram dalam pilihan
officeNoDiagramsInDoc=Tidak ditemukan diagram dalam dokumen
officeNotSupported=Fitur ini tidak didukung dalam aplikasi host ini
someImagesFailed={1} dari {2} gagal karena galat berikut
importingNoUsedDiagrams=Mengimpor {1} Diagram yang tidak dipakai di halaman
importingDrafts=Mengimpor {1} Diagram dalam draf
processingDrafts=Memroses draf
updatingDrafts=Memutakhirkan draf
updateDrafts=Mutakhirkan draf
notifications=Pemberitahuan
drawioImp=Impor draw.io
confALibsImp=Mengimpor Pustaka draw.io
confALibsImpFailed=Mengimpor {1} pustaka gagal
drawDiagrams=Diagram draw.io
errFileNotFoundOrNoPer=Galat: Akses Ditolak. Berkas tidak ditemukan atau Anda tidak punya hak untuk mengakses "{1}" pada {2}.
confACheckPagesWEmbed=Memeriksa halaman yang memiliki diagram draw.io yang tertanam.
replaceWith=Gantikan dengan
replaceAll=Ganti Semua
replFind=Ganti/Cari
matchesRepl={1} kecocokan diganti
linkToDiagram=Tautan ke Diagram
drawioTeams=Tim draw.io
members=Anggota
adminEditors=Admin/Editor
allowAll=Izinkan semua
noTeams=Tidak ditemukan tim
errorLoadingTeams=Galat Saat Memuat Tim
noTeamMembers=Tidak ditemukan anggota tim
errLoadTMembers=Galat saat memuat anggota tim
confAErrFaqs=Ada {1} galat, instruksi berikut mungkin bisa membantu memperbaiki kebanyakan kasus. (Harap unduh log untuk acuan mendatang)
confA403ErrFaq=Ada ({1}) galat 403. Pengguna saat ini mesti punya hak tambah (tulis) pada semua halaman dan lampiran. Bahkan admin kadang tidak diizinkan menulis ke beberapa halaman melalui pembatasan halaman
confA404ErrFaq=Ada ({1}) galat 404. Lampiran/halaman tidak ditemukan. Ini karena migrasi yang tidak sesuai atau berkas diagram (suatu lampiran dari halaman) dihapus.
confA500ErrFaq=Ada ({1}) galat 500. Sebuah galat server internal dalam Cloud Confluence. Galat seperti itu karena pembebanan lebih server dan biasanya diperbaiki dengan mencoba ulang proses.
confAOtherErrFaq=Ada ({1}) galat lain. Harap periksa deskripsi galat. Bila deskripsi tidak jelas, harap hubungi dukungan kami.
confAReplaceBaseUrl=Menggantikan URL Dasar dalam tautan diagram ketika pemetaan ID halaman tidak ditemukan
if(!self.define){const e=e=>{"require"!==e&&(e+=".js");let r=Promise.resolve();return i[e]||(r=new Promise((async r=>{if("document"in self){const i=document.createElement("script");i.src=e,document.head.appendChild(i),i.onload=r}else importScripts(e),r()}))),r.then((()=>{if(!i[e])throw new Error(`Module ${e} didn’t register its module`);return i[e]}))},r=(r,i)=>{Promise.all(r.map(e)).then((e=>i(1===e.length?e[0]:e)))},i={require:Promise.resolve(r)};self.define=(r,a,c)=>{i[r]||(i[r]=Promise.resolve().then((()=>{let i={};const s={uri:location.origin+r.slice(1)};return Promise.all(a.map((r=>{switch(r){case"exports":return i;case"module":return s;default:return e(r)}}))).then((e=>{const r=c(...e);return i.default||(i.default=r),i}))})))}}define("./service-worker.js",["./workbox-99ba3a23"],(function(e){"use strict";self.addEventListener("message",(e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()})),e.precacheAndRoute([{url:"js/app.min.js",revision:"94d4887ca9c27d6b300b5dbc85e155ab"},{url:"js/extensions.min.js",revision:"3834501a2250d98fc7207a6ae6298f14"},{url:"js/orgchart.min.js",revision:"619d8c4dab47b81868916df31f55478b"},{url:"js/stencils.min.js",revision:"698f1f70f64466ff6ae9280cd91cd23f"},{url:"js/shapes-14-6-5.min.js",revision:"95f54e7999c9fba2a1d65b4fe4f634f3"},{url:"js/math-print.js",revision:"cf64f6a493a8cb5079f2b70813e478d7"},{url:"index.html",revision:"d29a8e0ad73c5cfd3dc1e35361bf558b"},{url:"open.html",revision:"d71816b3b00e769fc6019fcdd6921662"},{url:"styles/fonts/ArchitectsDaughter-Regular.ttf",revision:"31c2153c0530e32553b31a49b3d70736"},{url:"styles/grapheditor.css",revision:"c80c6d3bdaa85e0fbc9d9b174ef763f4"},{url:"styles/atlas.css",revision:"d627cfef208f13a9cff1670f143c6348"},{url:"styles/dark.css",revision:"436ac9aaaa67eb15e64c368cc05ba5a7"},{url:"js/dropbox/Dropbox-sdk.min.js",revision:"4b9842892aa37b156db0a8364b7a83b0"},{url:"js/onedrive/OneDrive.js",revision:"505e8280346666f7ee801bc59521fa67"},{url:"js/viewer-static.min.js",revision:"93a4740f593c525cf58cf653d05e8373"},{url:"connect/jira/editor-1-3-3.html",revision:"6ec59ca5f689067e52cdda13f22ed89f"},{url:"connect/jira/viewerPanel-1-3-12.html",revision:"9adfcef71f6a8c68c20c2d2fba35fe19"},{url:"connect/jira/fullScreenViewer-1-3-3.html",revision:"29c803d9aa4dc0718540c916a0a4e62c"},{url:"connect/jira/viewerPanel.js",revision:"8d298de3aeaa32cad74b5d4b53ed3d4f"},{url:"connect/jira/spinner.gif",revision:"7d857ab9d86123e93d74d48e958fe743"},{url:"connect/jira/editor.js",revision:"d1c80a7301cd26c6dc31b1fdce9e37e5"},{url:"connect/jira/fullscreen-viewer-init.js",revision:"e00ad51fc16b87c362d6eaf930ab1fa5"},{url:"connect/jira/fullscreen-viewer.js",revision:"d5748a4fe01b7e747914ebd3e37c9de2"},{url:"plugins/connectJira.js",revision:"4cefa13414e0d406550f3c073923080c"},{url:"plugins/cConf-comments.js",revision:"ee6764429bf47a8545aa1cedacee718e"},{url:"plugins/cConf-1-4-8.js",revision:"91c04e236ba9dbdb26d8565b3354e00a"},{url:"connect/confluence/connectUtils-1-4-8.js",revision:"9b93b748a41a6f9444ff92810b7908b8"},{url:"connect/new_common/cac.js",revision:"6d666b6789b51dabc5a1af53a9db5d3d"},{url:"connect/gdrive_common/gac.js",revision:"78f85e79f15f56b8b8d83c90f4a15679"},{url:"connect/onedrive_common/ac.js",revision:"d10d4603e86da7c9af277dac832e8e06"},{url:"connect/confluence/viewer-init.js",revision:"8aa8d02147def4535563bc65632a3e6d"},{url:"connect/confluence/viewer.js",revision:"e865c0c1820464235ca8f0b9dc6eb71e"},{url:"connect/confluence/viewer-1-4-42.html",revision:"083a8751312bdb6485f2a4ced206e086"},{url:"connect/confluence/macroEditor-1-4-8.html",revision:"b2908e71f755a069fe6487e1e705736c"},{url:"connect/confluence/includeDiagram-1-4-8.js",revision:"2947a24a48572562d9fcb55b20d22fca"},{url:"connect/confluence/includeDiagram.html",revision:"bbc4156ca3902347d3c8121dd08a89d7"},{url:"connect/confluence/macro-editor.js",revision:"0bd745f0c23bba15ad1ff8e7b8e14987"},{url:"math/es5/startup.js",revision:"dc7130cdc866593293dbb5dde11ceb40"},{url:"math/es5/core.js",revision:"f71bc0bfb7d2ac8261747f97a5d47dd4"},{url:"math/es5/ui/safe.js",revision:"8c1fcfee7c879588ad409edcdd9cce53"},{url:"math/es5/output/svg.js",revision:"4f55967d16197ebb01b86356d8ab179a"},{url:"math/es5/input/tex.js",revision:"5c4f470da2ccb1acf85041fcecd6fff6"},{url:"math/es5/input/asciimath.js",revision:"c2d4076dd8e26d509bfe3a378e71cfa7"},{url:"math/es5/output/svg/fonts/tex.js",revision:"6eab785a3788ea805bd2b552d1f0aab8"},{url:"resources/dia.txt",revision:"f2bb9f811ec054499a5eca5add259a96"},{url:"resources/dia_am.txt",revision:"757af1ba9c187b2db9865965be4584d4"},{url:"resources/dia_ar.txt",revision:"f139fee88b934da5fc0e51c800449d2e"},{url:"resources/dia_bg.txt",revision:"b59ea02be4c9c5b60791327a42503115"},{url:"resources/dia_bn.txt",revision:"c7bb29b3be89b945859a9dbc996e3977"},{url:"resources/dia_bs.txt",revision:"c8faa32407ce808dd181f1708300dc65"},{url:"resources/dia_ca.txt",revision:"8dc84ddf5fc455eee7390adb7bb8fb42"},{url:"resources/dia_cs.txt",revision:"621536d118c10c11e0455bdc21d90495"},{url:"resources/dia_da.txt",revision:"2c9232e5e9cef27da9172a187a933115"},{url:"resources/dia_de.txt",revision:"112d8443021165e8c7d9994f97ddaf48"},{url:"resources/dia_el.txt",revision:"cbeb9bcc4a8a37ab0cce55d996c3b627"},{url:"resources/dia_eo.txt",revision:"c4d5feab9f7ce5d22f8487f4fc2bc585"},{url:"resources/dia_es.txt",revision:"d0d9810976aeb9b9fef0118aca1c3815"},{url:"resources/dia_et.txt",revision:"5303fb8a71bf11794f3cbe9324fd3d2d"},{url:"resources/dia_eu.txt",revision:"552e57dff8a9233098009af48380f066"},{url:"resources/dia_fa.txt",revision:"a2bd813de7a95f881a1ac941fab6ea29"},{url:"resources/dia_fi.txt",revision:"dbbd5d0126ad8f43fe18735f4f65b604"},{url:"resources/dia_fil.txt",revision:"0efbb4b0779c2314496e2209272f1729"},{url:"resources/dia_fr.txt",revision:"60a1a016d2ba9f171848b48a3b4baadd"},{url:"resources/dia_gl.txt",revision:"089dd7084f23978ef1696e674bcc4cab"},{url:"resources/dia_gu.txt",revision:"e00b05d0b7fe33e23a8c589c8226d2a7"},{url:"resources/dia_he.txt",revision:"bba5f189a07b266f40dfed938b0068c6"},{url:"resources/dia_hi.txt",revision:"d580a9d0f5545626c9cc37daafc51a3c"},{url:"resources/dia_hr.txt",revision:"97deaf0afd81d692f005dc02f329ac88"},{url:"resources/dia_hu.txt",revision:"465d05499416a9adeb023313a8160424"},{url:"resources/dia_id.txt",revision:"228d2a20f4627360cfb07e25aea78104"},{url:"resources/dia_it.txt",revision:"da633c90cadf73d0df46991b5586df54"},{url:"resources/dia_ja.txt",revision:"95dcedfc13dd97fb2ae63184d3ae14fc"},{url:"resources/dia_kn.txt",revision:"965dc84ec662842d0c313674632a5544"},{url:"resources/dia_ko.txt",revision:"e49ee6d9c9bbc77276cb85c97069b919"},{url:"resources/dia_lt.txt",revision:"51465381c456510952d6269952dced5e"},{url:"resources/dia_lv.txt",revision:"3ac8dd9a8bb6e7ec1143ab46cd70b96a"},{url:"resources/dia_ml.txt",revision:"11910b85c2616d84d97651e97cf11d7a"},{url:"resources/dia_mr.txt",revision:"8497141bca86742111017248e26a07ea"},{url:"resources/dia_ms.txt",revision:"ee74d690582d04322dba57dbc7224c99"},{url:"resources/dia_my.txt",revision:"f2bb9f811ec054499a5eca5add259a96"},{url:"resources/dia_nl.txt",revision:"35a2a6ece18b1c59893925d547425261"},{url:"resources/dia_no.txt",revision:"b0b4fe8a1c31db304d431935cdab14b8"},{url:"resources/dia_pl.txt",revision:"c86f5e75805a2903734a1c9a7a81d63b"},{url:"resources/dia_pt-br.txt",revision:"2eee01639ff6775e24220fbfa3c9c788"},{url:"resources/dia_pt.txt",revision:"63407d1bd46853ff9e3ed3b9ace9602f"},{url:"resources/dia_ro.txt",revision:"e2e5f6a838ae71143e6c50b290af7bb1"},{url:"resources/dia_ru.txt",revision:"38de6a4f45437cdd66dc3decc48c8841"},{url:"resources/dia_si.txt",revision:"f2bb9f811ec054499a5eca5add259a96"},{url:"resources/dia_sk.txt",revision:"58fffaadfebfec4deafcfc5c20178b57"},{url:"resources/dia_sl.txt",revision:"a66ac8feda2a580540b7b840603c1e23"},{url:"resources/dia_sr.txt",revision:"9cb339e7ca6db727cbcec145b01a7bdb"},{url:"resources/dia_sv.txt",revision:"84338c7bffb013c00b71ee6868a55b9f"},{url:"resources/dia_sw.txt",revision:"476b03b2ee388853d15f8f7924a10e40"},{url:"resources/dia_ta.txt",revision:"ef879e2a9c097abe6b578a22df399257"},{url:"resources/dia_te.txt",revision:"efd7ac431c2163371f13f1e0cdb05aaa"},{url:"resources/dia_th.txt",revision:"1ab6b69b33a88ed897c96a885165a566"},{url:"resources/dia_tr.txt",revision:"4c1bae6ee6079bf94c4e7e86a49b2684"},{url:"resources/dia_uk.txt",revision:"612e5ccdf38b00749ff4926cd1ea2b3f"},{url:"resources/dia_vi.txt",revision:"757058bddd335a0c0bc37829a2b2ff2a"},{url:"resources/dia_zh-tw.txt",revision:"838b0f7bd695a5a2a0c5ebbd83d33296"},{url:"resources/dia_zh.txt",revision:"7736de1c10669ab8f284558fb5dc434c"},{url:"favicon.ico",revision:"fab2d88b37c72d83607527573de45281"},{url:"images/manifest.json",revision:"389fa448cb99794bece27ffcb216abee"},{url:"images/logo.png",revision:"89630b64b911ebe0daa3dfe442087cfa"},{url:"images/drawlogo.svg",revision:"4bf4d14ebcf072d8bd4c5a1c89e88fc6"},{url:"images/drawlogo48.png",revision:"8b13428373aca67b895364d025f42417"},{url:"images/drawlogo-gray.svg",revision:"0aabacbc0873816e1e09e4736ae44c7d"},{url:"images/drawlogo-text-bottom.svg",revision:"f6c438823ab31f290940bd4feb8dd9c2"},{url:"images/default-user.jpg",revision:"2c399696a87c8921f12d2f9e1990cc6e"},{url:"images/logo-flat-small.png",revision:"4b178e59ff499d6dd1894fc498b59877"},{url:"images/apple-touch-icon.png",revision:"73da7989a23ce9a4be565ec65658a239"},{url:"images/favicon-16x16.png",revision:"1a79d5461a5d2bf21f6652e0ac20d6e5"},{url:"images/favicon-32x32.png",revision:"e3b92da2febe70bad5372f6f3474b034"},{url:"images/android-chrome-196x196.png",revision:"f8c045b2d7b1c719fda64edab04c415c"},{url:"images/android-chrome-512x512.png",revision:"959b5fac2453963ff6d60fb85e4b73fd"},{url:"images/delete.png",revision:"5f2350f2fd20f1a229637aed32ed8f29"},{url:"images/droptarget.png",revision:"bbf7f563fb6784de1ce96f329519b043"},{url:"images/help.png",revision:"9266c6c3915bd33c243d80037d37bf61"},{url:"images/download.png",revision:"35418dd7bd48d87502c71b578cc6c37f"},{url:"images/logo-flat.png",revision:"038070ab43aee6e54a791211859fc67b"},{url:"images/google-drive-logo.svg",revision:"5d9f2f5bbc7dcc252730a0072bb23059"},{url:"images/onedrive-logo.svg",revision:"3645b344ec0634c1290dd58d7dc87b97"},{url:"images/dropbox-logo.svg",revision:"e6be408c77cf9c82d41ac64fa854280a"},{url:"images/github-logo.svg",revision:"a1a999b69a275eac0cb918360ac05ae1"},{url:"images/gitlab-logo.svg",revision:"0faea8c818899e58533e153c44b10517"},{url:"images/trello-logo.svg",revision:"006fd0d7d70d7e95dc691674cb12e044"},{url:"images/osa_drive-harddisk.png",revision:"b954e1ae772087c5b4c6ae797e1f9649"},{url:"images/osa_database.png",revision:"c350d9d9b95f37b6cfe798b40ede5fb0"},{url:"images/google-drive-logo-white.svg",revision:"f329d8b1be7778515a85b93fc35d9f26"},{url:"images/dropbox-logo-white.svg",revision:"4ea8299ac3bc31a16f199ee3aec223bf"},{url:"images/onedrive-logo-white.svg",revision:"b3602fa0fc947009cff3f33a581cff4d"},{url:"images/github-logo-white.svg",revision:"537b1127b3ca0f95b45782d1304fb77a"},{url:"images/gitlab-logo-white.svg",revision:"5fede9ac2f394c716b8c23e3fddc3910"},{url:"images/trello-logo-white-orange.svg",revision:"e2a0a52ba3766682f138138d10a75eb5"},{url:"images/logo-confluence.png",revision:"ed1e55d44ae5eba8f999aba2c93e8331"},{url:"images/logo-jira.png",revision:"f8d460555a0d1f87cfd901e940666629"},{url:"images/clear.gif",revision:"db13c778e4382e0b55258d0f811d5d70"},{url:"images/spin.gif",revision:"487cbb40b9ced439aa1ad914e816d773"},{url:"images/checkmark.gif",revision:"ba764ce62f2bf952df5bbc2bb4d381c5"},{url:"images/hs.png",revision:"fefa1a03d92ebad25c88dca94a0b63db"},{url:"images/aui-wait.gif",revision:"5a474bcbd8d2f2826f03d10ea44bf60e"},{url:"mxgraph/css/common.css",revision:"618b42f0bde0c7685e04811c25dc2b3e"},{url:"mxgraph/images/expanded.gif",revision:"2b67c2c035af1e9a5cc814f0d22074cf"},{url:"mxgraph/images/collapsed.gif",revision:"73cc826da002a3d740ca4ce6ec5c1f4a"},{url:"mxgraph/images/maximize.gif",revision:"5cd13d6925493ab51e876694cc1c2ec2"},{url:"mxgraph/images/minimize.gif",revision:"8957741b9b0f86af9438775f2aadbb54"},{url:"mxgraph/images/close.gif",revision:"8b84669812ac7382984fca35de8da48b"},{url:"mxgraph/images/resize.gif",revision:"a6477612b3567a34033f9cac6184eed3"},{url:"mxgraph/images/separator.gif",revision:"7819742ff106c97da7a801c2372bbbe5"},{url:"mxgraph/images/window.gif",revision:"fd9a21dd4181f98052a202a0a01f18ab"},{url:"mxgraph/images/window-title.gif",revision:"3fb1d6c43246cdf991a11dfe826dfe99"},{url:"mxgraph/images/button.gif",revision:"00759bdc3ad218fa739f584369541809"},{url:"mxgraph/images/point.gif",revision:"83a43717b284902442620f61bc4e9fa6"}],{ignoreURLParametersMatching:[/.*/]})}));
{"version":3,"file":"service-worker.js","sources":["../../../../../tmp/5bb4de72dde9a7cf368cbbc2ddd18031/service-worker.js"],"sourcesContent":["import {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/usr/lib/node_modules/workbox-cli/node_modules/workbox-precaching/precacheAndRoute.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.addEventListener('message', (event) => {\n  if (event.data && event.data.type === 'SKIP_WAITING') {\n    self.skipWaiting();\n  }\n});\n\n\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n  {\n    \"url\": \"js/app.min.js\",\n    \"revision\": \"94d4887ca9c27d6b300b5dbc85e155ab\"\n  },\n  {\n    \"url\": \"js/extensions.min.js\",\n    \"revision\": \"3834501a2250d98fc7207a6ae6298f14\"\n  },\n  {\n    \"url\": \"js/orgchart.min.js\",\n    \"revision\": \"619d8c4dab47b81868916df31f55478b\"\n  },\n  {\n    \"url\": \"js/stencils.min.js\",\n    \"revision\": \"698f1f70f64466ff6ae9280cd91cd23f\"\n  },\n  {\n    \"url\": \"js/shapes-14-6-5.min.js\",\n    \"revision\": \"95f54e7999c9fba2a1d65b4fe4f634f3\"\n  },\n  {\n    \"url\": \"js/math-print.js\",\n    \"revision\": \"cf64f6a493a8cb5079f2b70813e478d7\"\n  },\n  {\n    \"url\": \"index.html\",\n    \"revision\": \"d29a8e0ad73c5cfd3dc1e35361bf558b\"\n  },\n  {\n    \"url\": \"open.html\",\n    \"revision\": \"d71816b3b00e769fc6019fcdd6921662\"\n  },\n  {\n    \"url\": \"styles/fonts/ArchitectsDaughter-Regular.ttf\",\n    \"revision\": \"31c2153c0530e32553b31a49b3d70736\"\n  },\n  {\n    \"url\": \"styles/grapheditor.css\",\n    \"revision\": \"c80c6d3bdaa85e0fbc9d9b174ef763f4\"\n  },\n  {\n    \"url\": \"styles/atlas.css\",\n    \"revision\": \"d627cfef208f13a9cff1670f143c6348\"\n  },\n  {\n    \"url\": \"styles/dark.css\",\n    \"revision\": \"436ac9aaaa67eb15e64c368cc05ba5a7\"\n  },\n  {\n    \"url\": \"js/dropbox/Dropbox-sdk.min.js\",\n    \"revision\": \"4b9842892aa37b156db0a8364b7a83b0\"\n  },\n  {\n    \"url\": \"js/onedrive/OneDrive.js\",\n    \"revision\": \"505e8280346666f7ee801bc59521fa67\"\n  },\n  {\n    \"url\": \"js/viewer-static.min.js\",\n    \"revision\": \"93a4740f593c525cf58cf653d05e8373\"\n  },\n  {\n    \"url\": \"connect/jira/editor-1-3-3.html\",\n    \"revision\": \"6ec59ca5f689067e52cdda13f22ed89f\"\n  },\n  {\n    \"url\": \"connect/jira/viewerPanel-1-3-12.html\",\n    \"revision\": \"9adfcef71f6a8c68c20c2d2fba35fe19\"\n  },\n  {\n    \"url\": \"connect/jira/fullScreenViewer-1-3-3.html\",\n    \"revision\": \"29c803d9aa4dc0718540c916a0a4e62c\"\n  },\n  {\n    \"url\": \"connect/jira/viewerPanel.js\",\n    \"revision\": \"8d298de3aeaa32cad74b5d4b53ed3d4f\"\n  },\n  {\n    \"url\": \"connect/jira/spinner.gif\",\n    \"revision\": \"7d857ab9d86123e93d74d48e958fe743\"\n  },\n  {\n    \"url\": \"connect/jira/editor.js\",\n    \"revision\": \"d1c80a7301cd26c6dc31b1fdce9e37e5\"\n  },\n  {\n    \"url\": \"connect/jira/fullscreen-viewer-init.js\",\n    \"revision\": \"e00ad51fc16b87c362d6eaf930ab1fa5\"\n  },\n  {\n    \"url\": \"connect/jira/fullscreen-viewer.js\",\n    \"revision\": \"d5748a4fe01b7e747914ebd3e37c9de2\"\n  },\n  {\n    \"url\": \"plugins/connectJira.js\",\n    \"revision\": \"4cefa13414e0d406550f3c073923080c\"\n  },\n  {\n    \"url\": \"plugins/cConf-comments.js\",\n    \"revision\": \"ee6764429bf47a8545aa1cedacee718e\"\n  },\n  {\n    \"url\": \"plugins/cConf-1-4-8.js\",\n    \"revision\": \"91c04e236ba9dbdb26d8565b3354e00a\"\n  },\n  {\n    \"url\": \"connect/confluence/connectUtils-1-4-8.js\",\n    \"revision\": \"9b93b748a41a6f9444ff92810b7908b8\"\n  },\n  {\n    \"url\": \"connect/new_common/cac.js\",\n    \"revision\": \"6d666b6789b51dabc5a1af53a9db5d3d\"\n  },\n  {\n    \"url\": \"connect/gdrive_common/gac.js\",\n    \"revision\": \"78f85e79f15f56b8b8d83c90f4a15679\"\n  },\n  {\n    \"url\": \"connect/onedrive_common/ac.js\",\n    \"revision\": \"d10d4603e86da7c9af277dac832e8e06\"\n  },\n  {\n    \"url\": \"connect/confluence/viewer-init.js\",\n    \"revision\": \"8aa8d02147def4535563bc65632a3e6d\"\n  },\n  {\n    \"url\": \"connect/confluence/viewer.js\",\n    \"revision\": \"e865c0c1820464235ca8f0b9dc6eb71e\"\n  },\n  {\n    \"url\": \"connect/confluence/viewer-1-4-42.html\",\n    \"revision\": \"083a8751312bdb6485f2a4ced206e086\"\n  },\n  {\n    \"url\": \"connect/confluence/macroEditor-1-4-8.html\",\n    \"revision\": \"b2908e71f755a069fe6487e1e705736c\"\n  },\n  {\n    \"url\": \"connect/confluence/includeDiagram-1-4-8.js\",\n    \"revision\": \"2947a24a48572562d9fcb55b20d22fca\"\n  },\n  {\n    \"url\": \"connect/confluence/includeDiagram.html\",\n    \"revision\": \"bbc4156ca3902347d3c8121dd08a89d7\"\n  },\n  {\n    \"url\": \"connect/confluence/macro-editor.js\",\n    \"revision\": \"0bd745f0c23bba15ad1ff8e7b8e14987\"\n  },\n  {\n    \"url\": \"math/es5/startup.js\",\n    \"revision\": \"dc7130cdc866593293dbb5dde11ceb40\"\n  },\n  {\n    \"url\": \"math/es5/core.js\",\n    \"revision\": \"f71bc0bfb7d2ac8261747f97a5d47dd4\"\n  },\n  {\n    \"url\": \"math/es5/ui/safe.js\",\n    \"revision\": \"8c1fcfee7c879588ad409edcdd9cce53\"\n  },\n  {\n    \"url\": \"math/es5/output/svg.js\",\n    \"revision\": \"4f55967d16197ebb01b86356d8ab179a\"\n  },\n  {\n    \"url\": \"math/es5/input/tex.js\",\n    \"revision\": \"5c4f470da2ccb1acf85041fcecd6fff6\"\n  },\n  {\n    \"url\": \"math/es5/input/asciimath.js\",\n    \"revision\": \"c2d4076dd8e26d509bfe3a378e71cfa7\"\n  },\n  {\n    \"url\": \"math/es5/output/svg/fonts/tex.js\",\n    \"revision\": \"6eab785a3788ea805bd2b552d1f0aab8\"\n  },\n  {\n    \"url\": \"resources/dia.txt\",\n    \"revision\": \"f2bb9f811ec054499a5eca5add259a96\"\n  },\n  {\n    \"url\": \"resources/dia_am.txt\",\n    \"revision\": \"757af1ba9c187b2db9865965be4584d4\"\n  },\n  {\n    \"url\": \"resources/dia_ar.txt\",\n    \"revision\": \"f139fee88b934da5fc0e51c800449d2e\"\n  },\n  {\n    \"url\": \"resources/dia_bg.txt\",\n    \"revision\": \"b59ea02be4c9c5b60791327a42503115\"\n  },\n  {\n    \"url\": \"resources/dia_bn.txt\",\n    \"revision\": \"c7bb29b3be89b945859a9dbc996e3977\"\n  },\n  {\n    \"url\": \"resources/dia_bs.txt\",\n    \"revision\": \"c8faa32407ce808dd181f1708300dc65\"\n  },\n  {\n    \"url\": \"resources/dia_ca.txt\",\n    \"revision\": \"8dc84ddf5fc455eee7390adb7bb8fb42\"\n  },\n  {\n    \"url\": \"resources/dia_cs.txt\",\n    \"revision\": \"621536d118c10c11e0455bdc21d90495\"\n  },\n  {\n    \"url\": \"resources/dia_da.txt\",\n    \"revision\": \"2c9232e5e9cef27da9172a187a933115\"\n  },\n  {\n    \"url\": \"resources/dia_de.txt\",\n    \"revision\": \"112d8443021165e8c7d9994f97ddaf48\"\n  },\n  {\n    \"url\": \"resources/dia_el.txt\",\n    \"revision\": \"cbeb9bcc4a8a37ab0cce55d996c3b627\"\n  },\n  {\n    \"url\": \"resources/dia_eo.txt\",\n    \"revision\": \"c4d5feab9f7ce5d22f8487f4fc2bc585\"\n  },\n  {\n    \"url\": \"resources/dia_es.txt\",\n    \"revision\": \"d0d9810976aeb9b9fef0118aca1c3815\"\n  },\n  {\n    \"url\": \"resources/dia_et.txt\",\n    \"revision\": \"5303fb8a71bf11794f3cbe9324fd3d2d\"\n  },\n  {\n    \"url\": \"resources/dia_eu.txt\",\n    \"revision\": \"552e57dff8a9233098009af48380f066\"\n  },\n  {\n    \"url\": \"resources/dia_fa.txt\",\n    \"revision\": \"a2bd813de7a95f881a1ac941fab6ea29\"\n  },\n  {\n    \"url\": \"resources/dia_fi.txt\",\n    \"revision\": \"dbbd5d0126ad8f43fe18735f4f65b604\"\n  },\n  {\n    \"url\": \"resources/dia_fil.txt\",\n    \"revision\": \"0efbb4b0779c2314496e2209272f1729\"\n  },\n  {\n    \"url\": \"resources/dia_fr.txt\",\n    \"revision\": \"60a1a016d2ba9f171848b48a3b4baadd\"\n  },\n  {\n    \"url\": \"resources/dia_gl.txt\",\n    \"revision\": \"089dd7084f23978ef1696e674bcc4cab\"\n  },\n  {\n    \"url\": \"resources/dia_gu.txt\",\n    \"revision\": \"e00b05d0b7fe33e23a8c589c8226d2a7\"\n  },\n  {\n    \"url\": \"resources/dia_he.txt\",\n    \"revision\": \"bba5f189a07b266f40dfed938b0068c6\"\n  },\n  {\n    \"url\": \"resources/dia_hi.txt\",\n    \"revision\": \"d580a9d0f5545626c9cc37daafc51a3c\"\n  },\n  {\n    \"url\": \"resources/dia_hr.txt\",\n    \"revision\": \"97deaf0afd81d692f005dc02f329ac88\"\n  },\n  {\n    \"url\": \"resources/dia_hu.txt\",\n    \"revision\": \"465d05499416a9adeb023313a8160424\"\n  },\n  {\n    \"url\": \"resources/dia_id.txt\",\n    \"revision\": \"228d2a20f4627360cfb07e25aea78104\"\n  },\n  {\n    \"url\": \"resources/dia_it.txt\",\n    \"revision\": \"da633c90cadf73d0df46991b5586df54\"\n  },\n  {\n    \"url\": \"resources/dia_ja.txt\",\n    \"revision\": \"95dcedfc13dd97fb2ae63184d3ae14fc\"\n  },\n  {\n    \"url\": \"resources/dia_kn.txt\",\n    \"revision\": \"965dc84ec662842d0c313674632a5544\"\n  },\n  {\n    \"url\": \"resources/dia_ko.txt\",\n    \"revision\": \"e49ee6d9c9bbc77276cb85c97069b919\"\n  },\n  {\n    \"url\": \"resources/dia_lt.txt\",\n    \"revision\": \"51465381c456510952d6269952dced5e\"\n  },\n  {\n    \"url\": \"resources/dia_lv.txt\",\n    \"revision\": \"3ac8dd9a8bb6e7ec1143ab46cd70b96a\"\n  },\n  {\n    \"url\": \"resources/dia_ml.txt\",\n    \"revision\": \"11910b85c2616d84d97651e97cf11d7a\"\n  },\n  {\n    \"url\": \"resources/dia_mr.txt\",\n    \"revision\": \"8497141bca86742111017248e26a07ea\"\n  },\n  {\n    \"url\": \"resources/dia_ms.txt\",\n    \"revision\": \"ee74d690582d04322dba57dbc7224c99\"\n  },\n  {\n    \"url\": \"resources/dia_my.txt\",\n    \"revision\": \"f2bb9f811ec054499a5eca5add259a96\"\n  },\n  {\n    \"url\": \"resources/dia_nl.txt\",\n    \"revision\": \"35a2a6ece18b1c59893925d547425261\"\n  },\n  {\n    \"url\": \"resources/dia_no.txt\",\n    \"revision\": \"b0b4fe8a1c31db304d431935cdab14b8\"\n  },\n  {\n    \"url\": \"resources/dia_pl.txt\",\n    \"revision\": \"c86f5e75805a2903734a1c9a7a81d63b\"\n  },\n  {\n    \"url\": \"resources/dia_pt-br.txt\",\n    \"revision\": \"2eee01639ff6775e24220fbfa3c9c788\"\n  },\n  {\n    \"url\": \"resources/dia_pt.txt\",\n    \"revision\": \"63407d1bd46853ff9e3ed3b9ace9602f\"\n  },\n  {\n    \"url\": \"resources/dia_ro.txt\",\n    \"revision\": \"e2e5f6a838ae71143e6c50b290af7bb1\"\n  },\n  {\n    \"url\": \"resources/dia_ru.txt\",\n    \"revision\": \"38de6a4f45437cdd66dc3decc48c8841\"\n  },\n  {\n    \"url\": \"resources/dia_si.txt\",\n    \"revision\": \"f2bb9f811ec054499a5eca5add259a96\"\n  },\n  {\n    \"url\": \"resources/dia_sk.txt\",\n    \"revision\": \"58fffaadfebfec4deafcfc5c20178b57\"\n  },\n  {\n    \"url\": \"resources/dia_sl.txt\",\n    \"revision\": \"a66ac8feda2a580540b7b840603c1e23\"\n  },\n  {\n    \"url\": \"resources/dia_sr.txt\",\n    \"revision\": \"9cb339e7ca6db727cbcec145b01a7bdb\"\n  },\n  {\n    \"url\": \"resources/dia_sv.txt\",\n    \"revision\": \"84338c7bffb013c00b71ee6868a55b9f\"\n  },\n  {\n    \"url\": \"resources/dia_sw.txt\",\n    \"revision\": \"476b03b2ee388853d15f8f7924a10e40\"\n  },\n  {\n    \"url\": \"resources/dia_ta.txt\",\n    \"revision\": \"ef879e2a9c097abe6b578a22df399257\"\n  },\n  {\n    \"url\": \"resources/dia_te.txt\",\n    \"revision\": \"efd7ac431c2163371f13f1e0cdb05aaa\"\n  },\n  {\n    \"url\": \"resources/dia_th.txt\",\n    \"revision\": \"1ab6b69b33a88ed897c96a885165a566\"\n  },\n  {\n    \"url\": \"resources/dia_tr.txt\",\n    \"revision\": \"4c1bae6ee6079bf94c4e7e86a49b2684\"\n  },\n  {\n    \"url\": \"resources/dia_uk.txt\",\n    \"revision\": \"612e5ccdf38b00749ff4926cd1ea2b3f\"\n  },\n  {\n    \"url\": \"resources/dia_vi.txt\",\n    \"revision\": \"757058bddd335a0c0bc37829a2b2ff2a\"\n  },\n  {\n    \"url\": \"resources/dia_zh-tw.txt\",\n    \"revision\": \"838b0f7bd695a5a2a0c5ebbd83d33296\"\n  },\n  {\n    \"url\": \"resources/dia_zh.txt\",\n    \"revision\": \"7736de1c10669ab8f284558fb5dc434c\"\n  },\n  {\n    \"url\": \"favicon.ico\",\n    \"revision\": \"fab2d88b37c72d83607527573de45281\"\n  },\n  {\n    \"url\": \"images/manifest.json\",\n    \"revision\": \"389fa448cb99794bece27ffcb216abee\"\n  },\n  {\n    \"url\": \"images/logo.png\",\n    \"revision\": \"89630b64b911ebe0daa3dfe442087cfa\"\n  },\n  {\n    \"url\": \"images/drawlogo.svg\",\n    \"revision\": \"4bf4d14ebcf072d8bd4c5a1c89e88fc6\"\n  },\n  {\n    \"url\": \"images/drawlogo48.png\",\n    \"revision\": \"8b13428373aca67b895364d025f42417\"\n  },\n  {\n    \"url\": \"images/drawlogo-gray.svg\",\n    \"revision\": \"0aabacbc0873816e1e09e4736ae44c7d\"\n  },\n  {\n    \"url\": \"images/drawlogo-text-bottom.svg\",\n    \"revision\": \"f6c438823ab31f290940bd4feb8dd9c2\"\n  },\n  {\n    \"url\": \"images/default-user.jpg\",\n    \"revision\": \"2c399696a87c8921f12d2f9e1990cc6e\"\n  },\n  {\n    \"url\": \"images/logo-flat-small.png\",\n    \"revision\": \"4b178e59ff499d6dd1894fc498b59877\"\n  },\n  {\n    \"url\": \"images/apple-touch-icon.png\",\n    \"revision\": \"73da7989a23ce9a4be565ec65658a239\"\n  },\n  {\n    \"url\": \"images/favicon-16x16.png\",\n    \"revision\": \"1a79d5461a5d2bf21f6652e0ac20d6e5\"\n  },\n  {\n    \"url\": \"images/favicon-32x32.png\",\n    \"revision\": \"e3b92da2febe70bad5372f6f3474b034\"\n  },\n  {\n    \"url\": \"images/android-chrome-196x196.png\",\n    \"revision\": \"f8c045b2d7b1c719fda64edab04c415c\"\n  },\n  {\n    \"url\": \"images/android-chrome-512x512.png\",\n    \"revision\": \"959b5fac2453963ff6d60fb85e4b73fd\"\n  },\n  {\n    \"url\": \"images/delete.png\",\n    \"revision\": \"5f2350f2fd20f1a229637aed32ed8f29\"\n  },\n  {\n    \"url\": \"images/droptarget.png\",\n    \"revision\": \"bbf7f563fb6784de1ce96f329519b043\"\n  },\n  {\n    \"url\": \"images/help.png\",\n    \"revision\": \"9266c6c3915bd33c243d80037d37bf61\"\n  },\n  {\n    \"url\": \"images/download.png\",\n    \"revision\": \"35418dd7bd48d87502c71b578cc6c37f\"\n  },\n  {\n    \"url\": \"images/logo-flat.png\",\n    \"revision\": \"038070ab43aee6e54a791211859fc67b\"\n  },\n  {\n    \"url\": \"images/google-drive-logo.svg\",\n    \"revision\": \"5d9f2f5bbc7dcc252730a0072bb23059\"\n  },\n  {\n    \"url\": \"images/onedrive-logo.svg\",\n    \"revision\": \"3645b344ec0634c1290dd58d7dc87b97\"\n  },\n  {\n    \"url\": \"images/dropbox-logo.svg\",\n    \"revision\": \"e6be408c77cf9c82d41ac64fa854280a\"\n  },\n  {\n    \"url\": \"images/github-logo.svg\",\n    \"revision\": \"a1a999b69a275eac0cb918360ac05ae1\"\n  },\n  {\n    \"url\": \"images/gitlab-logo.svg\",\n    \"revision\": \"0faea8c818899e58533e153c44b10517\"\n  },\n  {\n    \"url\": \"images/trello-logo.svg\",\n    \"revision\": \"006fd0d7d70d7e95dc691674cb12e044\"\n  },\n  {\n    \"url\": \"images/osa_drive-harddisk.png\",\n    \"revision\": \"b954e1ae772087c5b4c6ae797e1f9649\"\n  },\n  {\n    \"url\": \"images/osa_database.png\",\n    \"revision\": \"c350d9d9b95f37b6cfe798b40ede5fb0\"\n  },\n  {\n    \"url\": \"images/google-drive-logo-white.svg\",\n    \"revision\": \"f329d8b1be7778515a85b93fc35d9f26\"\n  },\n  {\n    \"url\": \"images/dropbox-logo-white.svg\",\n    \"revision\": \"4ea8299ac3bc31a16f199ee3aec223bf\"\n  },\n  {\n    \"url\": \"images/onedrive-logo-white.svg\",\n    \"revision\": \"b3602fa0fc947009cff3f33a581cff4d\"\n  },\n  {\n    \"url\": \"images/github-logo-white.svg\",\n    \"revision\": \"537b1127b3ca0f95b45782d1304fb77a\"\n  },\n  {\n    \"url\": \"images/gitlab-logo-white.svg\",\n    \"revision\": \"5fede9ac2f394c716b8c23e3fddc3910\"\n  },\n  {\n    \"url\": \"images/trello-logo-white-orange.svg\",\n    \"revision\": \"e2a0a52ba3766682f138138d10a75eb5\"\n  },\n  {\n    \"url\": \"images/logo-confluence.png\",\n    \"revision\": \"ed1e55d44ae5eba8f999aba2c93e8331\"\n  },\n  {\n    \"url\": \"images/logo-jira.png\",\n    \"revision\": \"f8d460555a0d1f87cfd901e940666629\"\n  },\n  {\n    \"url\": \"images/clear.gif\",\n    \"revision\": \"db13c778e4382e0b55258d0f811d5d70\"\n  },\n  {\n    \"url\": \"images/spin.gif\",\n    \"revision\": \"487cbb40b9ced439aa1ad914e816d773\"\n  },\n  {\n    \"url\": \"images/checkmark.gif\",\n    \"revision\": \"ba764ce62f2bf952df5bbc2bb4d381c5\"\n  },\n  {\n    \"url\": \"images/hs.png\",\n    \"revision\": \"fefa1a03d92ebad25c88dca94a0b63db\"\n  },\n  {\n    \"url\": \"images/aui-wait.gif\",\n    \"revision\": \"5a474bcbd8d2f2826f03d10ea44bf60e\"\n  },\n  {\n    \"url\": \"mxgraph/css/common.css\",\n    \"revision\": \"618b42f0bde0c7685e04811c25dc2b3e\"\n  },\n  {\n    \"url\": \"mxgraph/images/expanded.gif\",\n    \"revision\": \"2b67c2c035af1e9a5cc814f0d22074cf\"\n  },\n  {\n    \"url\": \"mxgraph/images/collapsed.gif\",\n    \"revision\": \"73cc826da002a3d740ca4ce6ec5c1f4a\"\n  },\n  {\n    \"url\": \"mxgraph/images/maximize.gif\",\n    \"revision\": \"5cd13d6925493ab51e876694cc1c2ec2\"\n  },\n  {\n    \"url\": \"mxgraph/images/minimize.gif\",\n    \"revision\": \"8957741b9b0f86af9438775f2aadbb54\"\n  },\n  {\n    \"url\": \"mxgraph/images/close.gif\",\n    \"revision\": \"8b84669812ac7382984fca35de8da48b\"\n  },\n  {\n    \"url\": \"mxgraph/images/resize.gif\",\n    \"revision\": \"a6477612b3567a34033f9cac6184eed3\"\n  },\n  {\n    \"url\": \"mxgraph/images/separator.gif\",\n    \"revision\": \"7819742ff106c97da7a801c2372bbbe5\"\n  },\n  {\n    \"url\": \"mxgraph/images/window.gif\",\n    \"revision\": \"fd9a21dd4181f98052a202a0a01f18ab\"\n  },\n  {\n    \"url\": \"mxgraph/images/window-title.gif\",\n    \"revision\": \"3fb1d6c43246cdf991a11dfe826dfe99\"\n  },\n  {\n    \"url\": \"mxgraph/images/button.gif\",\n    \"revision\": \"00759bdc3ad218fa739f584369541809\"\n  },\n  {\n    \"url\": \"mxgraph/images/point.gif\",\n    \"revision\": \"83a43717b284902442620f61bc4e9fa6\"\n  }\n], {\n  \"ignoreURLParametersMatching\": [/.*/]\n});\n\n\n\n\n\n\n\n\n"],"names":["self","addEventListener","event","data","type","skipWaiting","workbox_precaching_precacheAndRoute","url","revision","ignoreURLParametersMatching"],"mappings":"szBAmBAA,KAAKC,iBAAiB,WAAYC,IAC5BA,EAAMC,MAA4B,iBAApBD,EAAMC,KAAKC,MAC3BJ,KAAKK,aACN,IAWHC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,gBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,YACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,kBACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,cACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,kBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,kBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,kBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,gBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,qCAEb,CACDC,4BAA+B,CAAC"}
		var mxIsElectron = navigator.userAgent != null && navigator.userAgent.toLowerCase().indexOf(' electron/') > -1 && 
							navigator.userAgent.indexOf(' draw.io/') > -1;
<script type="text/javascript" src="js/vsdxImporter.js"></script>