var Neutralino = (function (e) {
    'use strict';
    function t(e, t) {
        return (window.addEventListener(e, t), Promise.resolve({ success: !0, message: 'Event listener added' }));
    }
    function n(e, t) {
        const n = new CustomEvent(e, { detail: t });
        return (window.dispatchEvent(n), Promise.resolve({ success: !0, message: 'Message dispatched' }));
    }
    function r(e) {
        const t = window.atob(e),
            n = t.length,
            r = new Uint8Array(n);
        for (let e = 0; e < n; e++) r[e] = t.charCodeAt(e);
        return r.buffer;
    }
    function o(e) {
        let t = new Uint8Array(e),
            n = '';
        for (let e of t) n += String.fromCharCode(e);
        return window.btoa(n);
    }
    function i(e) {
        const t = [];
        for (const n of e) {
            const e = Array.isArray(n) ? n : [n];
            for (const n of e) {
                const e = n instanceof HTMLElement ? n : document.getElementById(n);
                e && t.push(e);
            }
        }
        return t;
    }
    let a;
    const s = {},
        c = [],
        u = {};
    function d() {
        window.NL_TOKEN && sessionStorage.setItem('NL_TOKEN', window.NL_TOKEN);
        const e = g().split('.')[1],
            o = window.NL_GINJECTED || window.NL_CINJECTED ? '127.0.0.1' : window.location.hostname;
        ((a = new WebSocket(`ws://${o}:${window.NL_PORT}?connectToken=${e}`)),
            (function () {
                if (
                    (t('ready', async () => {
                        if ((await f(c), !window.NL_EXTENABLED)) return;
                        let e = await l('extensions.getStats');
                        for (let t of e.connected) n('extensionReady', t);
                    }),
                    t('extClientConnect', (e) => {
                        n('extensionReady', e.detail);
                    }),
                    !window.NL_EXTENABLED)
                )
                    return;
                t('extensionReady', async (e) => {
                    e.detail in u && (await f(u[e.detail]), delete u[e.detail]);
                });
            })(),
            a.addEventListener('message', (e) => {
                const t = JSON.parse(e.data);
                t.id && t.id in s
                    ? (t.data?.error
                          ? (s[t.id].reject(t.data.error),
                            'NE_RT_INVTOKN' == t.data.error.code &&
                                (a.close(),
                                (document.body.innerText = ''),
                                document.write(
                                    '<code>NE_RT_INVTOKN</code>: Neutralinojs application cannot execute native methods since <code>NL_TOKEN</code> is invalid.'
                                )))
                          : t.data?.success &&
                            s[t.id].resolve(t.data.hasOwnProperty('returnValue') ? t.data.returnValue : t.data),
                      delete s[t.id])
                    : t.event &&
                      ('openedFile' == t.event && 'dataBinary' == t?.data?.action && (t.data.data = r(t.data.data)),
                      n(t.event, t.data));
            }),
            a.addEventListener('open', async (e) => {
                n('ready');
            }),
            a.addEventListener('close', async (e) => {
                n('serverOffline', {
                    code: 'NE_CL_NSEROFF',
                    message: 'Neutralino server is offline. Try restarting the application',
                });
            }),
            a.addEventListener('error', async (e) => {
                ((document.body.innerText = ''),
                    document.write(
                        '<code>NE_CL_IVCTOKN</code>: Neutralinojs application cannot connect with the framework core using <code>NL_TOKEN</code>.'
                    ));
            }));
    }
    function l(e, t) {
        return new Promise((n, r) => {
            if (a?.readyState != WebSocket.OPEN)
                return ((o = { method: e, data: t, resolve: n, reject: r }), void c.push(o));
            var o;
            const i = '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, (e) =>
                    (e ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (e / 4)))).toString(16)
                ),
                u = g();
            ((s[i] = { resolve: n, reject: r }), a.send(JSON.stringify({ id: i, method: e, data: t, accessToken: u })));
        });
    }
    async function f(e) {
        for (; e.length > 0; ) {
            const t = e.shift();
            try {
                const e = await l(t.method, t.data);
                t.resolve(e);
            } catch (e) {
                t.reject(e);
            }
        }
    }
    function g() {
        return window.NL_TOKEN || sessionStorage.getItem('NL_TOKEN') || '';
    }
    function w(e, t) {
        return l('filesystem.writeBinaryFile', { path: e, data: o(t) });
    }
    var m = {
        __proto__: null,
        appendBinaryFile: function (e, t) {
            return l('filesystem.appendBinaryFile', { path: e, data: o(t) });
        },
        appendFile: function (e, t) {
            return l('filesystem.appendFile', { path: e, data: t });
        },
        copy: function (e, t, n) {
            return l('filesystem.copy', { source: e, destination: t, ...n });
        },
        createDirectory: function (e) {
            return l('filesystem.createDirectory', { path: e });
        },
        createWatcher: function (e) {
            return l('filesystem.createWatcher', { path: e });
        },
        getAbsolutePath: function (e) {
            return l('filesystem.getAbsolutePath', { path: e });
        },
        getJoinedPath: function (...e) {
            return l('filesystem.getJoinedPath', { paths: e });
        },
        getNormalizedPath: function (e) {
            return l('filesystem.getNormalizedPath', { path: e });
        },
        getOpenedFileInfo: function (e) {
            return l('filesystem.getOpenedFileInfo', { id: e });
        },
        getPathParts: function (e) {
            return l('filesystem.getPathParts', { path: e });
        },
        getPermissions: function (e) {
            return l('filesystem.getPermissions', { path: e });
        },
        getRelativePath: function (e, t) {
            return l('filesystem.getRelativePath', { path: e, base: t });
        },
        getStats: function (e) {
            return l('filesystem.getStats', { path: e });
        },
        getUnnormalizedPath: function (e) {
            return l('filesystem.getUnnormalizedPath', { path: e });
        },
        getWatchers: function () {
            return l('filesystem.getWatchers');
        },
        move: function (e, t) {
            return l('filesystem.move', { source: e, destination: t });
        },
        openFile: function (e) {
            return l('filesystem.openFile', { path: e });
        },
        readBinaryFile: function (e, t) {
            return new Promise((n, o) => {
                l('filesystem.readBinaryFile', { path: e, ...t })
                    .then((e) => {
                        n(r(e));
                    })
                    .catch((e) => {
                        o(e);
                    });
            });
        },
        readDirectory: function (e, t) {
            return l('filesystem.readDirectory', { path: e, ...t });
        },
        readFile: function (e, t) {
            return l('filesystem.readFile', { path: e, ...t });
        },
        remove: function (e) {
            return l('filesystem.remove', { path: e });
        },
        removeWatcher: function (e) {
            return l('filesystem.removeWatcher', { id: e });
        },
        setPermissions: function (e, t, n) {
            return l('filesystem.setPermissions', { path: e, ...t, mode: n });
        },
        updateOpenedFile: function (e, t, n) {
            return l('filesystem.updateOpenedFile', { id: e, event: t, data: n });
        },
        writeBinaryFile: w,
        writeFile: function (e, t) {
            return l('filesystem.writeFile', { path: e, data: t });
        },
    };
    function p(e, t) {
        return l('os.execCommand', { command: e, ...t });
    }
    var h = {
        __proto__: null,
        execCommand: p,
        getEnv: function (e) {
            return l('os.getEnv', { key: e });
        },
        getEnvs: function () {
            return l('os.getEnvs');
        },
        getPath: function (e) {
            return l('os.getPath', { name: e });
        },
        getSpawnedProcesses: function () {
            return l('os.getSpawnedProcesses');
        },
        open: function (e) {
            return l('os.open', { url: e });
        },
        setTray: function (e) {
            return l('os.setTray', e);
        },
        showFolderDialog: function (e, t) {
            return l('os.showFolderDialog', { title: e, ...t });
        },
        showMessageBox: function (e, t, n, r) {
            return l('os.showMessageBox', { title: e, content: t, choice: n, icon: r });
        },
        showNotification: function (e, t, n) {
            return l('os.showNotification', { title: e, content: t, icon: n });
        },
        showOpenDialog: function (e, t) {
            return l('os.showOpenDialog', { title: e, ...t });
        },
        showSaveDialog: function (e, t) {
            return l('os.showSaveDialog', { title: e, ...t });
        },
        spawnProcess: function (e, t) {
            return l('os.spawnProcess', { command: e, ...t });
        },
        updateSpawnedProcess: function (e, t, n) {
            return l('os.updateSpawnedProcess', { id: e, event: t, data: n });
        },
    };
    var y = {
        __proto__: null,
        getArch: function () {
            return l('computer.getArch');
        },
        getCPUInfo: function () {
            return l('computer.getCPUInfo');
        },
        getDisplays: function () {
            return l('computer.getDisplays');
        },
        getKernelInfo: function () {
            return l('computer.getKernelInfo');
        },
        getMemoryInfo: function () {
            return l('computer.getMemoryInfo');
        },
        getMousePosition: function () {
            return l('computer.getMousePosition');
        },
        getOSInfo: function () {
            return l('computer.getOSInfo');
        },
    };
    var _ = {
        __proto__: null,
        clear: function () {
            return l('storage.clear');
        },
        getData: function (e) {
            return l('storage.getData', { key: e });
        },
        getKeys: function () {
            return l('storage.getKeys');
        },
        removeData: function (e) {
            return l('storage.removeData', { key: e });
        },
        setData: function (e, t) {
            return l('storage.setData', { key: e, data: t });
        },
    };
    function v(e, t) {
        return l('debug.log', { message: e, type: t });
    }
    var N = { __proto__: null, log: v };
    function E(e) {
        return l('app.exit', { code: e });
    }
    var P = {
        __proto__: null,
        broadcast: function (e, t) {
            return l('app.broadcast', { event: e, data: t });
        },
        exit: E,
        getConfig: function () {
            return l('app.getConfig');
        },
        killProcess: function () {
            return l('app.killProcess');
        },
        readProcessInput: function (e) {
            return l('app.readProcessInput', { readAll: e });
        },
        restartProcess: function (e) {
            return new Promise(async (t) => {
                let n = window.NL_ARGS.reduce((e, t) => (t.includes(' ') && (t = `"${t}"`), (e += ' ' + t)), '');
                (e?.args && (n += ' ' + e.args), await p(n, { background: !0 }), E(), t());
            });
        },
        writeProcessError: function (e) {
            return l('app.writeProcessError', { data: e });
        },
        writeProcessOutput: function (e) {
            return l('app.writeProcessOutput', { data: e });
        },
    };
    const b = new Set(),
        D = new Map(),
        T = new Map();
    function O(e = 0, t = 0) {
        return l('window.beginDrag', { screenX: e, screenY: t });
    }
    function S() {
        return l('window.getSize');
    }
    var L = {
        __proto__: null,
        beginDrag: O,
        center: function () {
            return l('window.center');
        },
        create: function (e, t) {
            return new Promise((n, r) => {
                function o(e) {
                    return ('string' != typeof e || ((e = e.trim()).includes(' ') && (e = `"${e}"`)), e);
                }
                t = { ...t, useSavedState: !1 };
                let i = window.NL_ARGS.reduce(
                    (e, t, n) => (
                        (t.includes('--path=') ||
                            t.includes('--debug-mode') ||
                            t.includes('--load-dir-res') ||
                            0 == n) &&
                            (e += ' ' + o(t)),
                        e
                    ),
                    ''
                );
                i += ' --url=' + o(e);
                for (let e in t) {
                    if ('processArgs' == e) continue;
                    i += ` --window${'-' + e.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()}=${o(t[e])}`;
                }
                (t && t.processArgs && (i += ' ' + t.processArgs),
                    p(i, { background: !0 })
                        .then((e) => {
                            n(e);
                        })
                        .catch((e) => {
                            r(e);
                        }));
            });
        },
        exitFullScreen: function () {
            return l('window.exitFullScreen');
        },
        focus: function () {
            return l('window.focus');
        },
        getPosition: function () {
            return l('window.getPosition');
        },
        getSize: S,
        getTitle: function () {
            return l('window.getTitle');
        },
        hide: function () {
            return l('window.hide');
        },
        isFullScreen: function () {
            return l('window.isFullScreen');
        },
        isMaximized: function () {
            return l('window.isMaximized');
        },
        isMinimized: function () {
            return l('window.isMinimized');
        },
        isVisible: function () {
            return l('window.isVisible');
        },
        maximize: function () {
            return l('window.maximize');
        },
        minimize: function () {
            return l('window.minimize');
        },
        move: function (e, t) {
            return l('window.move', { x: e, y: t });
        },
        print: function () {
            return l('window.print');
        },
        setAlwaysOnTop: function (e) {
            return l('window.setAlwaysOnTop', { onTop: e });
        },
        setBorderless: function (e) {
            return l('window.setBorderless', { borderless: e });
        },
        setDraggableRegion: function (e, t) {
            return new Promise((n, r) => {
                const o = e instanceof HTMLElement ? e : document.getElementById(e);
                if (!o) return r({ code: 'NE_WD_DOMNOTF', message: 'Unable to find DOM element' });
                if (b.has(o))
                    return r({
                        code: 'NE_WD_ALRDREL',
                        message: 'This DOM element is already an active draggable region',
                    });
                if (t?.exclude?.length) {
                    const e = new Set();
                    for (const n of t.exclude) {
                        const t = n instanceof HTMLElement ? n : document.getElementById(n);
                        t && e.add(t);
                    }
                    e.size && D.set(o, e);
                }
                const a =
                    ((s = o),
                    async function (e) {
                        if (0 !== e.button) return;
                        const t = D.get(s);
                        if (t) for (const n of t) if (n.contains(e.target)) return;
                        (await O(e.screenX, e.screenY), e.preventDefault());
                    });
                var s;
                (o.addEventListener('pointerdown', a), b.add(o), T.set(o, a));
                n({
                    success: !0,
                    message: 'Draggable region was activated',
                    exclusions: {
                        add(...e) {
                            if (!b.has(o))
                                throw {
                                    code: 'NE_WD_NOTDRRE',
                                    message:
                                        'DOM element is no longer an active draggable region. You likely called unsetDraggableRegion on this element too early!',
                                };
                            let t = D.get(o);
                            t || ((t = new Set()), D.set(o, t));
                            const n = i(e);
                            for (const e of n) t.add(e);
                        },
                        remove(...e) {
                            if (!b.has(o))
                                throw {
                                    code: 'NE_WD_NOTDRRE',
                                    message:
                                        'DOM element is no longer an active draggable region. You likely called unsetDraggableRegion on this element too early!',
                                };
                            const t = D.get(o);
                            if (!t) return;
                            const n = i(e);
                            for (const e of n) t.delete(e);
                        },
                        removeAll() {
                            if (!b.has(o))
                                throw {
                                    code: 'NE_WD_NOTDRRE',
                                    message:
                                        'DOM element is no longer an active draggable region. You likely called unsetDraggableRegion on this element too early!',
                                };
                            D.delete(o);
                        },
                    },
                });
            });
        },
        setFullScreen: function () {
            return l('window.setFullScreen');
        },
        setIcon: function (e) {
            return l('window.setIcon', { icon: e });
        },
        setMainMenu: function (e) {
            return l('window.setMainMenu', e);
        },
        setSize: function (e) {
            return new Promise(async (t, n) => {
                let r = await S();
                l('window.setSize', (e = { ...r, ...e }))
                    .then((e) => {
                        t(e);
                    })
                    .catch((e) => {
                        n(e);
                    });
            });
        },
        setTitle: function (e) {
            return l('window.setTitle', { title: e });
        },
        show: function () {
            return l('window.show');
        },
        snapshot: function (e) {
            return l('window.snapshot', { path: e });
        },
        unmaximize: function () {
            return l('window.unmaximize');
        },
        unminimize: function () {
            return l('window.unminimize');
        },
        unsetDraggableRegion: function (e) {
            return new Promise((t, n) => {
                const r = e instanceof HTMLElement ? e : document.getElementById(e);
                if (!r) return n({ code: 'NE_WD_DOMNOTF', message: 'Unable to find DOM element' });
                if (!b.has(r))
                    return n({ code: 'NE_WD_NOTDRRE', message: 'DOM element is not an active draggable region' });
                const o = T.get(r);
                (o && (r.removeEventListener('pointerdown', o), T.delete(r)),
                    b.delete(r),
                    D.delete(r),
                    t({ success: !0, message: 'Draggable region was deactivated' }));
            });
        },
    };
    var M = {
        __proto__: null,
        broadcast: function (e, t) {
            return l('events.broadcast', { event: e, data: t });
        },
        dispatch: n,
        off: function (e, t) {
            return (
                window.removeEventListener(e, t),
                Promise.resolve({ success: !0, message: 'Event listener removed' })
            );
        },
        on: t,
    };
    function x() {
        return l('extensions.getStats');
    }
    var F = {
        __proto__: null,
        broadcast: function (e, t) {
            return l('extensions.broadcast', { event: e, data: t });
        },
        dispatch: function (e, t, n) {
            return new Promise(async (r, o) => {
                const i = await x();
                if (i.loaded.includes(e))
                    if (i.connected.includes(e))
                        try {
                            r(await l('extensions.dispatch', { extensionId: e, event: t, data: n }));
                        } catch (e) {
                            o(e);
                        }
                    else
                        !(function (e, t) {
                            e in u ? u[e].push(t) : (u[e] = [t]);
                        })(e, {
                            method: 'extensions.dispatch',
                            data: { extensionId: e, event: t, data: n },
                            resolve: r,
                            reject: o,
                        });
                else o({ code: 'NE_EX_EXTNOTL', message: `${e} is not loaded` });
            });
        },
        getStats: x,
    };
    let R = null;
    var A = {
        __proto__: null,
        checkForUpdates: function (e) {
            return new Promise(async (t, n) => {
                if (!e) return n({ code: 'NE_RT_NATRTER', message: 'Missing require parameter: url' });
                try {
                    const r = await fetch(e);
                    ((R = JSON.parse(await r.text())),
                        !(function (e) {
                            return !!(
                                e.applicationId &&
                                e.applicationId == window.NL_APPID &&
                                e.version &&
                                e.resourcesURL
                            );
                        })(R)
                            ? n({
                                  code: 'NE_UP_CUPDMER',
                                  message: 'Invalid update manifest or mismatching applicationId',
                              })
                            : t(R));
                } catch (e) {
                    n({ code: 'NE_UP_CUPDERR', message: 'Unable to fetch update manifest' });
                }
            });
        },
        install: function () {
            return new Promise(async (e, t) => {
                if (!R)
                    return t({
                        code: 'NE_UP_UPDNOUF',
                        message:
                            'No update manifest loaded. Make sure that updater.checkForUpdates() is called before install().',
                    });
                try {
                    const t = await fetch(R.resourcesURL),
                        n = await t.arrayBuffer();
                    (await w(window.NL_PATH + '/resources.neu', n),
                        e({ success: !0, message: 'Update installed. Restart the process to see updates' }));
                } catch (e) {
                    t({ code: 'NE_UP_UPDINER', message: 'Update installation error' });
                }
            });
        },
    };
    var I = {
        __proto__: null,
        clear: function () {
            return l('clipboard.clear');
        },
        getFormat: function () {
            return l('clipboard.getFormat');
        },
        readHTML: function () {
            return l('clipboard.readHTML');
        },
        readImage: function (e = '') {
            return new Promise((t, n) => {
                l('clipboard.readImage')
                    .then((n) => {
                        if (n) {
                            const r = window.atob(n.data);
                            let o,
                                i,
                                a,
                                s = 32 == n.bpp ? 4 : 3;
                            switch (e.toLowerCase()) {
                                case 'rgb':
                                    ((o = n.width * n.height * 3), (i = [0, 1, 2]));
                                    break;
                                case 'rgba':
                                    ((o = n.width * n.height * 4), (i = [0, 1, 2, 3]));
                                    break;
                                case 'argb':
                                    ((o = n.width * n.height * 4), (i = [3, 0, 1, 2]));
                                    break;
                                case 'bgra':
                                    ((o = n.width * n.height * 4), (i = [2, 1, 0, 3]));
                                    break;
                                default:
                                    ((o = r.length), (a = new Uint8Array(o)));
                                    for (let e = 0; e < o; e++) a[e] = r.charCodeAt(e);
                                    return ((n.data = a), void t(n));
                            }
                            a = new Uint8Array(o);
                            let c,
                                u,
                                d,
                                l,
                                f,
                                g = 255 == new Uint8Array(new Uint32Array([255]).buffer)[0],
                                w = [],
                                m = 0;
                            for (let e = 0; e < r.length; e += s)
                                ((c = r.charCodeAt(e)),
                                    (u = r.charCodeAt(e + 1)),
                                    (d = r.charCodeAt(e + 2)),
                                    (l = 4 == s ? r.charCodeAt(e + 3) : 255),
                                    (f = g
                                        ? ((l << 24) | (d << 16) | (u << 8) | c) >>> 0
                                        : ((c << 24) | (u << 16) | (d << 8) | l) >>> 0),
                                    (w = [
                                        (f >> n.redShift) & 255,
                                        (f >> n.greenShift) & 255,
                                        (f >> n.blueShift) & 255,
                                        (f >> n.alphaShift) & 255,
                                    ]),
                                    i.forEach((e, t) => {
                                        a[t + m] = w[e];
                                    }),
                                    (m += i.length));
                            n.data = a;
                        }
                        t(n);
                    })
                    .catch((e) => {
                        n(e);
                    });
            });
        },
        readText: function () {
            return l('clipboard.readText');
        },
        writeHTML: function (e) {
            return l('clipboard.writeHTML', { data: e });
        },
        writeImage: function (e) {
            const t = { ...e };
            return (e?.data && (t.data = o(e.data)), l('clipboard.writeImage', t));
        },
        writeText: function (e) {
            return l('clipboard.writeText', { data: e });
        },
    };
    var C = {
        __proto__: null,
        extractDirectory: function (e, t) {
            return l('resources.extractDirectory', { path: e, destination: t });
        },
        extractFile: function (e, t) {
            return l('resources.extractFile', { path: e, destination: t });
        },
        getFiles: function () {
            return l('resources.getFiles');
        },
        getStats: function (e) {
            return l('resources.getStats', { path: e });
        },
        readBinaryFile: function (e) {
            return new Promise((t, n) => {
                l('resources.readBinaryFile', { path: e })
                    .then((e) => {
                        t(r(e));
                    })
                    .catch((e) => {
                        n(e);
                    });
            });
        },
        readFile: function (e) {
            return l('resources.readFile', { path: e });
        },
    };
    var U = {
        __proto__: null,
        getMounts: function () {
            return l('server.getMounts');
        },
        mount: function (e, t) {
            return l('server.mount', { path: e, target: t });
        },
        unmount: function (e) {
            return l('server.unmount', { path: e });
        },
    };
    var k = {
        __proto__: null,
        getMethods: function () {
            return l('custom.getMethods');
        },
    };
    let z = !1;
    return (
        (e.app = P),
        (e.clipboard = I),
        (e.computer = y),
        (e.custom = k),
        (e.debug = N),
        (e.events = M),
        (e.extensions = F),
        (e.filesystem = m),
        (e.init = function (e = {}) {
            if (((e = { exportCustomMethods: !0, ...e }), !z)) {
                if (
                    (d(),
                    window.NL_ARGS.find((e) => '--neu-dev-auto-reload' == e) &&
                        t('neuDev_reloadApp', async () => {
                            (await v('Reloading the application...'), location.reload());
                        }),
                    e.exportCustomMethods && window.NL_CMETHODS && window.NL_CMETHODS.length > 0)
                )
                    for (const e of window.NL_CMETHODS)
                        Neutralino.custom[e] = (...t) => {
                            let n = {};
                            for (const [e, r] of t.entries())
                                n =
                                    'object' != typeof r || Array.isArray(r) || null == r
                                        ? { ...n, ['arg' + e]: r }
                                        : { ...n, ...r };
                            return l('custom.' + e, n);
                        };
                ((window.NL_CVERSION = '6.5.0'),
                    (window.NL_CCOMMIT = '425c526c318342e0e5d0f17caceef2a53049eda4'),
                    (z = !0));
            }
        }),
        (e.os = h),
        (e.resources = C),
        (e.server = U),
        (e.storage = _),
        (e.updater = A),
        (e.window = L),
        e
    );
})({});
