{"version":3,"sources":["jsdelivr-header.js","/npm/img-spy-modules@0.1.0/src/export/export.selectors.ts","/npm/img-spy-modules@0.1.0/src/export/export.types.ts","/npm/img-spy-modules@0.1.0/src/export/export.actions.ts","/npm/img-spy-modules@0.1.0/src/export/export.utils.ts","/npm/img-spy-modules@0.1.0/src/export/export.models.ts","/npm/img-spy-modules@0.1.0/src/export/index.ts","/npm/img-spy-modules@0.1.0/src/fst-watcher/fst-watcher.selectors.ts","/npm/img-spy-modules@0.1.0/src/fst-watcher/fst-watcher.types.ts","/npm/img-spy-modules@0.1.0/src/fst-watcher/fst-watcher.actions.ts","/npm/img-spy-modules@0.1.0/src/fst-watcher/fst-watcher.utils.ts","/npm/img-spy-modules@0.1.0/src/fst-watcher/fst-watcher.operations/filter-data-source-change.ts","/npm/img-spy-modules@0.1.0/src/fst-watcher/fst-watcher.operations/index.ts","/npm/img-spy-modules@0.1.0/src/fst-watcher/fst-watcher.models.ts","/npm/img-spy-modules@0.1.0/src/fst-watcher/fst-watcher.reducers.ts","/npm/img-spy-modules@0.1.0/src/fst-watcher/index.ts","/npm/img-spy-modules@0.1.0/src/settings/settings.selectors.ts","/npm/img-spy-modules@0.1.0/src/settings/settings.types.ts","/npm/img-spy-modules@0.1.0/src/settings/settings.actions.ts","/npm/img-spy-modules@0.1.0/src/settings/settings.utils.ts","/npm/img-spy-modules@0.1.0/src/settings/settings.reducers.ts","/npm/img-spy-modules@0.1.0/src/settings/index.ts","/npm/img-spy-modules@0.1.0/src/settings-window/settings-window.selectors.ts","/npm/img-spy-modules@0.1.0/src/settings-window/settings-window.types.ts","/npm/img-spy-modules@0.1.0/src/settings-window/settings-window.actions.ts","/npm/img-spy-modules@0.1.0/src/settings-window/settings-window.utils.ts","/npm/img-spy-modules@0.1.0/src/settings-window/settings-window.reducers.ts","/npm/img-spy-modules@0.1.0/src/settings-window/index.ts","/npm/img-spy-modules@0.1.0/src/terminal/terminal.selectors.ts","/npm/img-spy-modules@0.1.0/src/terminal/terminal.types.ts","/npm/img-spy-modules@0.1.0/src/terminal/terminal.actions.ts","/npm/img-spy-modules@0.1.0/src/terminal/terminal.utils.ts","/npm/img-spy-modules@0.1.0/src/terminal/terminal.reducers.ts","/npm/img-spy-modules@0.1.0/src/terminal/index.ts","/npm/img-spy-modules@0.1.0/src/windows/windows.selectors.ts","/npm/img-spy-modules@0.1.0/src/windows/windows.types.ts","/npm/img-spy-modules@0.1.0/src/windows/windows.actions.ts","/npm/img-spy-modules@0.1.0/src/windows/windows.utils.ts","/npm/img-spy-modules@0.1.0/src/windows/windows.epics/close-modal.ts","/npm/img-spy-modules@0.1.0/src/windows/windows.epics/index.ts","/npm/img-spy-modules@0.1.0/src/windows/index.ts"],"names":[],"mappings":"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","file":"/npm/img-spy-modules@0.1.0/dist/img-spy-modules.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/img-spy-modules@0.1.0/dist/img-spy-modules.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","export default {\n\n};\n","const EXPORT_CSV        = \"app/export/CSV\";\n\n\nexport default {\n    EXPORT_CSV\n};\n","import { Action }               from \"redux-actions\";\n\nimport { ExportCsvData }        from \"./export.models\";\nimport types                    from \"./export.types\";\n\n\nconst exportCsv = (\n    payload: ExportCsvData\n): Action<ExportCsvData> => ({\n    type: types.EXPORT_CSV,\n    payload\n});\n\nexport default {\n    exportCsv\n};\n","export default {\n\n};\n","import * as fs                          from \"fs\";\nimport json2csv                         from \"json2csv\";\nimport { Observable,\n         Observer }                     from \"rxjs\";\n\n\nexport interface ExportCsvData<T = any> {\n    file: string;\n    data: T;\n    fields: Array<string>;\n}\n\nexport class ExportCsvObservable {\n    public static create(data: ExportCsvData): Observable<ExportCsvData> {\n        return Observable.create((observer: Observer<ExportCsvData>) => {\n            const csv = json2csv(data);\n            fs.writeFile(data.file, csv, (err) => {\n                observer.next(data);\n            });\n        });\n    }\n}\n","export const name = \"export\";\nexport { default as exportSelectors }   from \"./export.selectors\";\nexport { default as exportActions }     from \"./export.actions\";\nexport { default as exportTypes }       from \"./export.types\";\nexport { default as exportUtils }       from \"./export.utils\";\n\nexport *                                from \"./export.models\";\nexport { default }                      from \"./export.reducers\";\n","import * as crypto          from \"crypto\";\nimport anymatch             from \"anymatch\";\n\nimport { FileSelector,\n         FstRoot,\n         FstDirectory,\n         FstParent,\n         FstItemMap,\n         FstType,\n         FstItem, \n         AddressTypes}          from \"./fst-watcher.models\";\n\n\nfunction hasFstItem(fstRoot: FstRoot, path: string): boolean {\n    const rootDir = fstRoot.children.physical;\n    if (path === \"\") {\n        return true;\n    }\n\n    const spath = path.split(\"/\");\n    return _hasFstItem();\n\n    ///\n\n    function _hasFstItem(currDir = rootDir, index = 0): boolean {\n        const currName = spath[index];\n        if (spath.length - 1 === index) {\n            return !!currDir.children[currName];\n        }\n\n        const nextDir = currDir.children[currName];\n        if (nextDir && nextDir.type === \"directory\") {\n            return _hasFstItem(nextDir, index + 1);\n        }\n\n        return false;\n    }\n};\n\nfunction getFstItem<T extends FstItem>(\n    fstRoot: FstRoot, path: string, address?: AddressTypes\n): T {\n    // Defaults\n    if (!address) { address = \"physical\"; }\n\n    // Get root directory\n    const rootDir = fstRoot.children[address];\n\n    // Return root if no path provided\n    if (path === \"\") { return rootDir as T; }\n\n    // Call recursive get\n    const spath = path.split(\"/\");\n    return _getPath();\n\n    ///\n\n    function _getPath(currDir = rootDir, index = 0): T {\n        const currName = spath[index];\n        if (spath.length - 1 === index) {\n            return currDir.children[currName] as T;\n        }\n\n        const nextDir = currDir.children[currName] as FstDirectory;\n        if (!nextDir || nextDir.type !== \"directory\") {\n            throw Error(\"Directory not found.\");\n        }\n\n        return _getPath(nextDir, index + 1);\n    }\n}\n\nfunction getFstParent(fstRoot: FstRoot, item: FstItem): FstParent & FstItem {\n    return item.parentPath !== undefined ?\n        getFstItem(fstRoot, item.parentPath) : undefined;\n}\n\nfunction getFstChildren(fstRoot: FstRoot, fstItem: FstItem): FstItemMap  {\n    switch (fstItem.type) {\n        case \"directory\": return fstItem.children;\n        case \"dataSource\":\n        const mountPoint = getMountPoint(fstItem);\n        const mountFolder =\n            fstRoot.children.virtual.children[mountPoint] as FstDirectory;\n        if (mountFolder) {\n            return mountFolder.children;\n        } else {\n            return null;\n        }\n\n        default:\n            return null;\n    }\n};\n\nfunction getMountPoint(fstDataSource: FstItem): string {\n    return crypto.createHash(\"md5\").update(fstDataSource.path).digest(\"hex\");\n}\n\nfunction getFullPath<T extends {imgPath?: string, path: string}>(\n    fstItem: T\n): string {\n    const { imgPath, path } = fstItem;\n    if(imgPath) {\n        return `${imgPath}/${path.split(\"/\").slice(1).join(\"/\")}`;\n    }\n    return `${path.split(\"/\").slice(1).join(\"/\")}`;\n    \n}\n\nfunction getFstType(path: string) {\n    if (anymatch(\"**/*.dd\", path)) {\n        return \"dataSource\";\n    }\n\n    return \"file\";\n}\n\nfunction isFstSelected(item: FstItem, selector: FileSelector) {\n    return selector &&\n        item.path === selector.path &&\n        item.address === selector.address;\n}\n\nfunction getSortedChildren(children: FstItemMap): Array<string> {\n    if (!children) {\n        return [];\n    }\n\n    const sortedKeys = Object\n        .keys(children)\n        .sort((nameA, nameB) => {\n            const fstA = children[nameA],\n                fstB = children[nameB];\n\n            if (fstB.type === \"directory\" && fstA.type !==  \"directory\") {\n                return 1;\n            }\n            if (fstA.type === \"directory\" && fstB.type !==  \"directory\") {\n                return -1;\n            }\n\n            return nameA.toLowerCase() > nameB.toLowerCase() ? 1 : -1;\n        });\n\n    // if (this.props.root) {\n    //     sortedKeys = sortedKeys.filter((key) => key !== \".mount\");\n    // }\n\n    return sortedKeys;\n}\n\n\nexport default {\n    hasFstItem,\n    getFstItem,\n    getMountPoint,\n    getFstParent,\n    getFstChildren,\n    getFullPath,\n    getFstType,\n    isFstSelected,\n    getSortedChildren\n}\n","const ADD            = \"app/fst-watcher/ADD\";\nconst UPDATE         = \"app/fst-watcher/UPDATE\";\nconst UNLINK         = \"app/fst-watcher/UNLINK\";\nconst OPEN           = \"app/fst-watcher/OPEN\";\nconst OPEN_OUT       = \"app/fst-watcher/OPEN_OUT\";\nconst TOGGLE_OPEN    = \"app/fst-watcher/TOGGLE_OPEN\";\nconst ANALYZE        = \"app/fst-watcher/HASH\";\nconst LIST           = \"app/fst-watcher/LIST\";\nconst CONTENT        = \"app/fst-watcher/CONTENT\";\nconst EXPORT         = \"app/fst-watcher/EXPORT\";\n\n\nexport default {\n    ADD,\n    UPDATE,\n    UNLINK,\n    OPEN,\n    OPEN_OUT,\n    TOGGLE_OPEN,\n    ANALYZE,\n    LIST,\n    CONTENT,\n    EXPORT\n}\n","import { Action }               from \"redux-actions\";\n\nimport { FstItem,\n         FstFile,\n         FstDirectory,\n         FstAddPayload,\n         FstUnlinkPayload,\n         FileSelector,\n         FstExportPayload, \n         AddressTypes }         from \"./fst-watcher.models\";\nimport types                    from \"./fst-watcher.types\";\n\n\nconst add = (\n    newItem: Partial<FstItem>, address?: AddressTypes\n): Action<FstAddPayload> => ({\n    type: types.ADD,\n    payload: { newItem, address }\n});\n\nconst unlink = (\n    path: string, address?: AddressTypes\n): Action<FstUnlinkPayload> => ({\n    type: types.UNLINK,\n    payload: { path, address }\n});\n\nconst open = (\n    path: string, address?: AddressTypes\n): Action<FstUnlinkPayload> => ({\n    type: types.OPEN,\n    payload: { path, address }\n});\n\nconst toggleOpen = (\n    selector: FileSelector\n): Action<FstUnlinkPayload> => ({\n    type: types.TOGGLE_OPEN,\n    payload: {\n        path: selector.path,\n        address: selector.address\n    }\n});\n\nconst openOut = (\n    payload: FstItem\n): Action<FstItem> => ({\n    type: types.OPEN_OUT,\n    payload\n});\n\nconst analyze = (\n    payload: FstItem\n): Action<FstItem> => ({\n    type: types.ANALYZE,\n    payload\n});\n\nconst list = (\n    payload: FstDirectory\n): Action<FstDirectory> => ({\n    type: types.LIST,\n    payload\n});\n\nconst content = (\n    payload: FstFile\n): Action<FstFile> => ({\n    type: types.CONTENT,\n    payload\n});\n\nconst exportFile = (\n    file: FileSelector, path: string\n): Action<FstExportPayload> => ({\n    type: types.EXPORT, payload: { file, path }\n});\n\n\nexport default {\n    add,\n    unlink,\n    open,\n    toggleOpen,\n    openOut,\n    analyze,\n    list,\n    content,\n    exportFile\n};\n","import { DataSource }           from \"img-spy-core\";\n\nimport { FstItem,\n         FstDirectory,\n         FstDataSource }        from \"./fst-watcher.models\";\n\n\ntype UpdatePathCallback = (name: string, prev: FstItem) => FstItem;\nfunction updatePath(rootDir: FstDirectory, path: string, buildCurrItem: UpdatePathCallback): FstDirectory {\n    const spath =  path.split(\"/\");\n    return _updatePath();\n\n    ///\n\n    function _updatePath(currDir = rootDir, index = 0) {\n        const currName = spath[index];\n        if (spath.length - 1 === index) {\n            return {\n                ...currDir,\n                children: {\n                    ...currDir.children,\n                    [currName]: {\n                        ...buildCurrItem(currName, currDir.children[currName]),\n                        parentPath: currDir.path\n                    }\n                }\n            };\n        }\n\n        const nextDir = currDir.children[currName] as FstDirectory;\n        if (!nextDir) {\n            throw Error(\"Directory not found.\");\n        }\n\n        return {\n            ...currDir,\n            children: {\n                ...currDir.children,\n                [currName]: _updatePath(nextDir, index + 1)\n            }\n        };\n    }\n}\n\nfunction deletePath(rootDir: FstDirectory, path: string): FstDirectory {\n    const spath = path.split(\"/\");\n    return _deletePath();\n\n    ///\n\n    function _deletePath(currDir = rootDir, index = 0): FstDirectory {\n        const currName = spath[index];\n        if (spath.length - 1 === index) {\n            const { [currName]: rmChild, ...children  } = currDir.children;\n            return { ...currDir, children };\n        }\n\n        const nextDir = currDir.children[currName] as FstDirectory;\n        if (!nextDir) {\n            return currDir;\n        }\n\n        return {\n            ...currDir,\n            children: {\n                ...currDir.children,\n                [currName]: _deletePath(nextDir, index + 1)\n            }\n        };\n    }\n}\n\nfunction openPath(rootDir: FstDirectory, path: string): FstDirectory {\n    const spath = path.split(\"/\");\n    return _openPath() as FstDirectory;\n\n    ///\n\n    function _openPath(currDir = rootDir, index = 0): FstDirectory {\n        const currName = spath[index];\n        if (spath.length - 1 === index) {\n            return {\n                ...currDir,\n                isOpen: true\n            };\n        }\n\n        const nextDir = currDir.children[currName] as FstDirectory;\n        if (!nextDir) {\n            throw Error(\"Directory not found.\");\n        }\n\n        return {\n            ...currDir,\n            isOpen: true,\n            children: {\n                ...currDir.children,\n                [currName]: _openPath(nextDir, index + 1)\n            }\n        };\n    }\n}\n\nfunction insertDataSource(rootDir: FstDirectory, dataSource: DataSource): void {\n    const spath = dataSource.path.split(\"/\");\n    let accPath = \"\";\n    _insertDataSource();\n\n    ////\n\n    function _insertDataSource(currDir = rootDir, index = 0) {\n        const currName = spath[index];\n        accPath += (index > 0 ? \"/\" : \"\") + currName;\n        if (spath.length - 1 === index) {\n            const fstDataSource: FstDataSource = {\n                ...dataSource,\n\n                address: \"physical\",\n                parentPath: currDir.path,\n                type: \"dataSource\"\n            };\n            delete fstDataSource.computingHash;\n            currDir.children[currName] = fstDataSource;\n            return;\n        }\n\n        let nextDir = currDir.children[currName] as FstDirectory;\n        if (!nextDir) {\n            nextDir = {\n                name: currName,\n                path: accPath,\n                address: \"physical\",\n                parentPath: currDir.path,\n\n                type: \"directory\",\n                isOpen: false,\n                children: {}\n            };\n            currDir.children[currName] = nextDir;\n        }\n        _insertDataSource(nextDir, index + 1);\n    }\n}\n\n\nexport default {\n    updatePath,\n    deletePath,\n    openPath,\n    insertDataSource\n};\n","import { pipe,\n         OperatorFunction }         from \"rxjs\";\nimport { filter,\n         map }                      from \"rxjs/operators\";\nimport { StateObservable,\n         ofType }                   from \"redux-observable\";\nimport { Action }                   from \"redux-actions\";\n\nimport { FstDataSource,\n         FstAddPayload,\n         FstState }                 from \"../fst-watcher.models\";\nimport types                        from \"../fst-watcher.types\";\nimport selectors                    from \"../fst-watcher.selectors\";\n\n\nfunction filterDataSourceChange<S extends FstState>(\n    state$: StateObservable<S>\n): OperatorFunction<Action<FstAddPayload>, FstDataSource> {\n    return pipe(\n        ofType(types.ADD),\n        filter((action: Action<any>) => {\n            return action.payload.newItem.type === \"dataSource\";\n        }),\n        map(action => {\n            const state = state$.value;\n            return selectors.getFstItem<FstDataSource>(\n                state.fstRoot,\n                action.payload.newItem.path\n            );\n        })\n    );\n}\n\nexport default filterDataSourceChange;\n","import filterDataSourceChange   from \"./filter-data-source-change\";\n\nexport default {\n    filterDataSourceChange\n};\n","import { DataSourceType,\n         Partition }   from \"img-spy-core\";\n\n\nexport const dataSourceTypes = {\n    DISK: 1,\n    PARTITION: 2\n};\n\nexport const dataSourceFileActions = {\n    MOVE: 1\n};\n\nexport interface FileSelector {\n    path: string;\n    address: AddressTypes;\n}\n\nexport type AddressTypes = \"virtual\" | \"physical\";\n\nexport interface FstInfo {\n    parentPath?: string;\n    deleted?: boolean;\n    loaded?: boolean;\n    name?: string;\n    content?: Buffer;\n    imgPath?: string;\n    offset?: number;\n    inode?: number;\n\n    path: string;\n    address: AddressTypes;\n}\n\nexport interface FstFile extends FstInfo {\n    type: \"file\";\n}\n\nexport interface FstItemMap {\n    [name: string]: FstItem\n}\n\nexport interface FstParent extends FstInfo {\n    isOpen?: boolean;\n    canOpen?: boolean;\n    children?: FstItemMap;\n}\n\nexport interface FstDataSource extends FstParent {\n    type: \"dataSource\";\n\n    imgType?: DataSourceType;\n    partitions?: Array<Partition>;\n    hash?: string;\n    computedHash: string;\n    computingHash?: boolean;\n    mountedIn?: string;\n}\n\nexport interface FstDirectory extends FstParent  {\n    type: \"directory\";\n}\n\nexport interface FstRoot {\n    type: \"root\";\n    name: \"root\";\n    children: {\n        physical: FstDirectory;\n        virtual: FstDirectory;\n    };\n}\n\nexport type FstItem = FstDirectory | FstFile | FstDataSource;\nexport type FstType = FstItem[\"type\"];\n\nexport interface FstAddPayload {\n    newItem: Partial<FstItem>;\n    address: AddressTypes;\n}\n\nexport interface FstUnlinkPayload {\n    path: string;\n    address: AddressTypes;\n}\n\nexport interface FstHashPayload {\n    path: string;\n    hash: string;\n}\n\nexport interface FstExportPayload {\n    file: FileSelector;\n    path: string;\n}\n\nexport interface FstState {\n    fstRoot: FstRoot;\n}\n","import * as path                from \"path\";\nimport { Reducer }              from \"redux-actions\";\nimport { reducerBuilder }       from \"img-spy-core\";\n\nimport { FstDirectory,\n         FstItem,\n         FstRoot,\n         FstDataSource,\n         FstAddPayload,\n         FstUnlinkPayload }     from \"./fst-watcher.models\";\nimport utils                    from \"./fst-watcher.utils\";\nimport types                    from \"./fst-watcher.types\"\n\n\n// TODO: Make it easier to understand\nconst add: Reducer<FstRoot, FstAddPayload> = (\n    state, action\n) => {\n    const { newItem } = action.payload;\n    const address = action.payload.address || \"physical\";\n    const rootDir = state.children[address];\n\n    if (newItem.path === \"\") {\n        if (newItem.type === \"directory\") {\n            return {\n                ...state,\n                children: {\n                    ...state.children,\n                    [address]: {\n                        ...rootDir,\n                        ...newItem\n                    }\n\n                }\n            };\n        } else {\n            throw Error(\"Wrong path for a file.\");\n        }\n    }\n\n    const newRootDir = utils.updatePath(rootDir, newItem.path, (name, prev) => {\n        const nextItem: FstItem = Object.assign({}, prev, newItem);\n        if ((nextItem.type === \"directory\") && !nextItem.children) {\n            nextItem.children = {};\n        }\n\n        return nextItem;\n    });\n\n    return {\n        ...state,\n        children: {\n            ...state.children,\n            [address]: newRootDir\n        }\n    };\n}\n\nconst unlink: Reducer<FstRoot, FstUnlinkPayload> = (\n    state, action\n) => {\n    const { path } = action.payload;\n    let { address } = action.payload;\n    if (!address) {\n        address = \"physical\";\n    }\n    const rootDir = state.children[address];\n\n    const newRootDir = utils.deletePath(rootDir, path);\n\n    return {\n        ...state,\n        children: {\n            ...state.children,\n            [address]: newRootDir\n        }\n    };\n};\n\nconst open: Reducer<FstRoot, FstUnlinkPayload> = (\n    state, action\n) => {\n    const { path } = action.payload;\n    let { address } = action.payload;\n    if (!address) {\n        address = \"physical\";\n    }\n    const rootDir = state.children[address];\n\n    if (path === \"\") {\n        return state;\n    }\n\n    const newRootDir = utils.openPath(rootDir, path);\n\n    return {\n        ...state,\n        children: {\n            ...state.children,\n            [address]: newRootDir\n        }\n    };\n}\n\nconst toogleOpen: Reducer<FstRoot, FstUnlinkPayload> = (\n    state, action\n): FstRoot => {\n    const { path } = action.payload;\n    let { address } = action.payload;\n    if (!address) {\n        address = \"physical\";\n    }\n    const rootDir = state.children[address];\n    let newRootDir;\n    if (!path) {\n        newRootDir = {\n            ...rootDir,\n            isOpen: !rootDir.isOpen\n        };\n    } else {\n        newRootDir = utils.updatePath(rootDir, path,\n            (name, prev: FstDirectory | FstDataSource) =>\n                ({\n                    ...prev,\n                    isOpen: !prev.isOpen\n                })\n        );\n    }\n\n    return {\n        ...state,\n        children: {\n            ...state.children,\n            [address]: newRootDir\n        }\n    };\n}\n\n\ntype Payload = FstAddPayload | FstUnlinkPayload;\nexport default reducerBuilder<FstRoot, Payload>({\n        [types.ADD]: add,\n        [types.UNLINK]: unlink,\n        [types.OPEN]: open,\n        [types.TOGGLE_OPEN]: toogleOpen\n    }, (info) => {\n        const initialPhysical: FstDirectory = {\n            name: path.basename(info.args[\"folder\"]),\n            type: \"directory\",\n            path: \"\",\n            address: \"physical\",\n            isOpen: true,\n            children: {}\n        };\n\n        const initialState: FstRoot = {\n            name: \"root\",\n            type: \"root\",\n            children: {\n                physical: initialPhysical,\n                virtual: {\n                    name: \"Virtual\",\n                    type: \"directory\",\n                    address: \"virtual\",\n                    isOpen: false,\n                    path: \"\",\n                    children: {}\n                }\n            }\n        };\n        Object.keys(info.initialSettings.sources).forEach((path) => {\n            const dataSource = info.initialSettings.sources[path];\n            utils.insertDataSource(initialPhysical, dataSource);\n        });\n\n        return initialState;\n    });","export const name = \"fstRoot\";\nexport { default as fstWatcherSelectors }   from \"./fst-watcher.selectors\";\nexport { default as fstWatcherActions }     from \"./fst-watcher.actions\";\nexport { default as fstWatcherTypes }       from \"./fst-watcher.types\";\nexport { default as fstWatcherUtils }       from \"./fst-watcher.utils\";\nexport { default as fstWatcherOperations }  from \"./fst-watcher.operations\";\n\nexport *                                    from \"./fst-watcher.models\";\nexport { default }                          from \"./fst-watcher.reducers\";\n","export default {\n\n};\n","const APPLY         = \"APPLY\";\nconst UPDATE        = \"UPDATE\";\nconst UPDATE_THEME  = \"UPDATE_THEME\";\nconst UPDATE_SOURCE = \"UPDATE_SOURCE\";\nconst DELETE_SOURCE = \"DELETE_SOURCE\";\n\n\nexport default {\n    APPLY,\n    UPDATE,\n    UPDATE_THEME,\n    UPDATE_SOURCE,\n    DELETE_SOURCE\n};\n","import { Action }               from \"redux-actions\";\n\nimport { SettingsModel,\n         Theme,\n         ApplySettingsPayload,\n         DataSource }           from \"./settings.models\";\nimport types                    from \"./settings.types\";\n\n\nconst applySettings = (\n    payload: ApplySettingsPayload\n): Action<ApplySettingsPayload> => ({\n    type: types.APPLY,\n    payload\n});\n\nconst updateSettings = <T = any>(\n    payload: SettingsModel<T>\n): Action<SettingsModel<T>> => ({\n    type: types.UPDATE,\n    payload\n});\n\nconst updateSource = (\n    payload: DataSource\n): Action<DataSource> => ({\n    type: types.UPDATE_SOURCE,\n    payload\n});\n\nconst deleteSource = (\n    path: string\n): Action<string> => ({\n    type: types.DELETE_SOURCE,\n    payload: path\n});\n\nconst updateTheme = (\n    theme: Theme\n): Action<Theme> => ({\n    type: types.UPDATE_THEME,\n    payload: theme\n});\n\n\nexport default {\n    applySettings,\n    updateSettings,\n    updateSource,\n    deleteSource,\n    updateTheme\n};\n","export default {\n\n};\n","import produce              from \"immer\";\nimport { Reducer }          from \"redux-actions\";\nimport { reducerBuilder }   from \"img-spy-core\";\n\nimport { SettingsModel,\n         Theme,\n         DataSource }       from \"./settings.models\";\nimport types                from \"./settings.types\";\n\n\nconst update: Reducer<SettingsModel, SettingsModel> = (\n    state, action\n) => produce(state, draft => {\n    Object.assign(draft, action.payload)\n});\n\nconst updateTheme: Reducer<SettingsModel, Theme> = (\n    state, action\n) => produce(state, draft => {\n    draft.theme = action.payload;\n});\n\nconst deleteSource: Reducer<SettingsModel, string> = (\n    state, action\n) => produce(state, draft => {\n    delete draft[action.payload];\n});\n\nconst updateSource: Reducer<SettingsModel, DataSource> = (\n    state, action\n) => produce(state, draft => {\n    const source = action.payload;\n    draft.sources[source.path] = source;\n});\n\n\ntype Payload = SettingsModel | DataSource | string | Theme;\nexport default reducerBuilder<SettingsModel, Payload>({\n    [types.UPDATE]: update,\n    [types.UPDATE_THEME]: updateTheme,\n    [types.DELETE_SOURCE]: deleteSource,\n    [types.UPDATE_SOURCE]: updateSource\n\n}, (info) => info.initialSettings);\n","export const name = \"settings\";\nexport { default as settingsSelectors }   from \"./settings.selectors\";\nexport { default as settingsActions }     from \"./settings.actions\";\nexport { default as settingsTypes }       from \"./settings.types\";\nexport { default as settingsUtils }       from \"./settings.utils\";\n\nexport *                                  from \"./settings.models\";\nexport { default }                        from \"./settings.reducers\";\n","export default {\n\n};\n","const SELECT_SOURCE     = \"app/settings-window/SELECT_SOURCE\";\n\nexport default {\n    SELECT_SOURCE\n};\n","import { Action }               from \"redux-actions\";\n\nimport { DataSource }           from \"./settings-window.models\";\nimport types                    from \"./settings-window.types\";\n\n\nexport const selectSource = (\n    payload: DataSource\n): Action<DataSource> => ({\n    type: types.SELECT_SOURCE,\n    payload\n});\n\n\nexport default {\n    selectSource\n};\n","export default {\n\n};\n","import produce                  from \"immer\";\n\nimport { Reducer }              from \"redux-actions\";\nimport { reducerBuilder }       from \"img-spy-core\";\n\nimport { SettingsWindowModel,\n         DataSource }           from \"./settings-window.models\";\nimport types                    from \"./settings-window.types\";\n\n\nconst selectSource: Reducer<SettingsWindowModel, DataSource> = (\n    state, action\n) => produce(state, draft => {\n    draft.sources.selectedSource = action.payload;\n});\n\ntype Payload = DataSource;\nexport default reducerBuilder<SettingsWindowModel, Payload>({\n    [types.SELECT_SOURCE]: selectSource,\n}, { sources: {} });\n","export const name = \"settingsWindow\"\nexport { default as settingsWindowSelectors } from \"./settings-window.selectors\";\nexport { default as settingsWindowActions }   from \"./settings-window.actions\";\nexport { default as settingsWindowTypes }     from \"./settings-window.types\";\nexport { default as settingsWindowUtils }     from \"./settings-window.utils\";\n\nexport *                                      from \"./settings-window.models\";\nexport { default }                            from \"./settings-window.reducers\";\n","export default {\n\n};\n","const PUSH_LINE = \"app/terminal/PUSH_LINE\";\n\nexport default {\n    PUSH_LINE\n};\n","import { Action }               from \"redux-actions\";\n\nimport { TerminalLine }         from \"./terminal.models\";\nimport types                    from \"./terminal.types\";\n\n\nconst pushLine = (\n    payload: TerminalLine\n): Action<TerminalLine> => ({\n    type: types.PUSH_LINE,\n    payload\n});\n\n\nexport default {\n    pushLine\n};\n","export default {\n\n};\n","import produce                  from \"immer\";\n\nimport { Reducer }              from \"redux-actions\";\nimport { reducerBuilder }       from \"img-spy-core\";\n\nimport { TerminalModel,\n         TerminalLine }         from \"./terminal.models\";\nimport types                    from \"./terminal.types\";\n\n\nconst pushLine: Reducer<TerminalModel, TerminalLine> = (\n    state, action\n) => produce(state, draft => {\n    draft.lines.push(action.payload);\n});\n\n\ntype Payload = TerminalLine;\nexport default reducerBuilder<TerminalModel, Payload>({\n    [types.PUSH_LINE]: pushLine\n}, {\n    lines: []\n});\n","export const name = \"terminal\";\nexport { default as terminalSelectors }   from \"./terminal.selectors\";\nexport { default as terminalActions }     from \"./terminal.actions\";\nexport { default as terminalTypes }       from \"./terminal.types\";\nexport { default as terminalUtils }       from \"./terminal.utils\";\n\nexport *                                  from \"./terminal.models\";\nexport { default }                        from \"./terminal.reducers\";\n","export default {\n\n};\n","const CLOSE_MODAL  = \"app/windows/CLOSE_MODAL\";\n\n\nexport default {\n    CLOSE_MODAL,\n};\n","import { Action }               from \"redux-actions\";\n\nimport types                    from \"./windows.types\";\n\n\nconst closeModal = (\n): Action<undefined> => ({\n    type: types.CLOSE_MODAL,\n});\n\nexport default {\n    closeModal\n};\n","export default {\n\n};\n","import { Action }               from \"redux-actions\";\nimport { ofType }               from \"redux-observable\";\nimport { map, filter }          from \"rxjs/operators\";\n\nimport { ActionEpic }           from \"img-spy-core\";\nimport { apiQuery }             from \"img-spy-api\";\n\nimport { WindowsModelState }    from \"../windows.models\";\nimport types                    from \"../windows.types\";\n\n\nconst closeModalEpic: ActionEpic<undefined, WindowsModelState> = (\n    action$, state$\n) => action$.pipe(\n    ofType(types.CLOSE_MODAL),\n    apiQuery(api => api.closeWindow(\"settings\")),\n    map(() => undefined), // do nothing\n);\n\nexport default closeModalEpic;\n","import { combineEpics }         from \"redux-observable\";\nimport { Action }               from \"redux-actions\";\n\nimport { WindowsModelState }    from \"../windows.models\";\nimport closeModal               from \"./close-modal\";\n\n\nexport default combineEpics<Action<any>, Action<any>, WindowsModelState>(\n    closeModal,\n);\n","export const name = \"windows\";\nexport { default as windowsSelectors }      from \"./windows.selectors\";\nexport { default as windowsActions }        from \"./windows.actions\";\nexport { default as windowsTypes }          from \"./windows.types\";\nexport { default as windowsUtils }          from \"./windows.utils\";\n\nexport *                                    from \"./windows.models\";\nexport { default }                          from \"./windows.reducers\";\nexport { default as epic }                  from \"./windows.epics\";"]}