{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 6a13b33c2617a6d68810","webpack:///external \"NeoCommon\"","webpack:///./src/ForceToolApi.ts","webpack:///./src/ForceToolUI.ts","webpack:///./src/index.ts","webpack:///./src/TestApp.ts","webpack:///./node_modules/blueimp-md5/js/md5.js","webpack:///./src/ForceToolInterceptor.ts","webpack:///external \"NeoGames\""],"names":[],"mappings":"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CA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,mBAAmB;AAClC;AACA;AACA;AACA,eAAe,aAAa;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,kBAAkB;AACjC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAM,IAA0C;AAChD,IAAI,kCAAO;AACX;AACA,KAAK;AAAA,oGAAC;AACN,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;ACvRD,4CAA8E;AAC9E,2CAAwC;AACxC,6CAA6E;AAC7E,8CAA4C;AAS5C,IAAI,YAAY,GAAG,yBAAa,CAAC,IAAI,CAAC,YAAY,CAAC;AACnD,IAAI,YAAY,GAAG,yBAAa,CAAC,IAAI,CAAC,YAAY,CAAC;AACnD,IAAI,WAAW,GAAG,yBAAa,CAAC,IAA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","file":"neo-forcetool.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"NeoCommon\"), require(\"NeoGames\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"NeoCommon\", \"NeoGames\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"NeoForceTool\"] = factory(require(\"NeoCommon\"), require(\"NeoGames\"));\n\telse\n\t\troot[\"NeoForceTool\"] = factory(root[\"NeoCommon\"], root[\"NeoGames\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_0__, __WEBPACK_EXTERNAL_MODULE_8__) {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 3);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 6a13b33c2617a6d68810","module.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"NeoCommon\"\n// module id = 0\n// module chunks = 0","import {Utils, FileUtils, StringUtils, UriHelper, lodash} from 'neo-common';\nimport {ForceToolCommand, ForceToolDefinition, ForceToolSet, ForceToolSetFile, SetCategory, SetDefinition, SetFileDefinition} from './Types';\nimport {IHashItem} from \"neo-common/Engine/Utils/UriHelper\";\n//import {readLocalJsonFile} from './ForceUtils';\n\nconst baseFolder = 'ForceTool';\nconst fileDefinition = `${baseFolder}/definition.json`;\n\nconst windowKeyPrefix = 'NEO_ForceTool_';\n\nconst windowKeys = {\n    Definition: windowKeyPrefix + 'Definition',\n    Current: {\n        Category: windowKeyPrefix + 'Current_Category',\n        File: windowKeyPrefix + 'Current_File',\n        CommandIndex: windowKeyPrefix + 'Current_CommandIndex',\n    }\n};\n\nconst queryStrings = {\n    forceToolEnabled: 'force'\n};\n\nconst queryHashes = {\n    category: 'category',\n    file: 'file'\n};\n\ntype FileCategoryDefinition = {\n    [SetName: string]: SetFileDefinition;\n}\n\ntype FileDefinition = {\n    Categories: {[CategoryName: string]: FileCategoryDefinition};\n}\n\nexport class ForceToolApi {\n    public static getSampleForceSetFile(): ForceToolSetFile {\n        return {\n            Name: 'SampleSet',\n            Description: 'Sample Force Set Commands File',\n            Commands: [\n                {\n                    Description: 'Command 1',\n                    Module: 'base',\n                    Action: 'spin',\n                    Command: '/S'\n                },\n                {\n                    Description: 'Command 2',\n                    Module: 'freespin',\n                    Action: 'spin',\n                    Command: '/S /S'\n                }\n            ]\n        };\n    }\n\n    public static updateCurrentForceSet(newForceSet: ForceToolSet): Promise<boolean> {\n        return Promise.resolve()\n            .then(() => {\n                const categoryName = window[windowKeys.Current.Category] as string;\n                const fileName = window[windowKeys.Current.File] as string;\n                return !StringUtils.isNullOrEmpty(categoryName) && !StringUtils.isNullOrEmpty(fileName)\n                    ? ForceToolApi.getFileSet(categoryName, fileName)\n                    : null;\n            })\n            .then(set => {\n                if (set) {\n                    if ('File' in newForceSet) {\n                        delete newForceSet.File;\n                    }\n\n                    lodash.assign(set, newForceSet);\n                    return true;\n                }\n\n                return false;\n            });\n    }\n\n    public static clearCurrent(): void {\n        ForceToolApi.setCurrentCommandIndex(-1);\n        window[windowKeys.Current.Category] = '';\n        window[windowKeys.Current.File] = '';\n        ForceToolApi.removeUrlHash();\n    }\n\n    public static resetCurrentForceSet(): Promise<ForceToolSet> {\n        return Promise.resolve()\n            .then(() => {\n                const categoryName = window[windowKeys.Current.Category] as string;\n                const fileName = window[windowKeys.Current.File] as string;\n                return !StringUtils.isNullOrEmpty(categoryName) && !StringUtils.isNullOrEmpty(fileName)\n                    ? ForceToolApi.getFileSet(categoryName, fileName, true)\n                    : null;\n            });\n    }\n\n    public static getFileSet(categoryName: string, fileName: string, restoreFromFile: boolean = false): Promise<ForceToolSet> {\n\n        function updateCurrent(set: ForceToolSet, categoryName: string, fileName: string) {\n            window[windowKeys.Current.Category] = categoryName;\n            window[windowKeys.Current.File] = fileName;\n\n            let currentCommandIndex = ForceToolApi.getCurrentCommandIndex();\n            if (currentCommandIndex >= set.Commands.length) {\n                currentCommandIndex = -1;\n                ForceToolApi.setCurrentCommandIndex(currentCommandIndex);\n            }\n\n            if (set.Commands.length > 0 && currentCommandIndex === -1) {\n                currentCommandIndex = 0;\n                ForceToolApi.setCurrentCommandIndex(currentCommandIndex);\n            }\n\n            // update current URL hash to include 'category' and 'file' with its values\n            const hashGroups = UriHelper.getHashGroups();\n            let itemCategory = lodash.find(hashGroups, (item: IHashItem) => item.name === queryHashes.category);\n            if (Utils.isNullOrUndefined(itemCategory)) {\n                itemCategory = {\n                    name: queryHashes.category,\n                    value: ''\n                };\n                hashGroups.push(itemCategory);\n            }\n\n            let itemFile = lodash.find(hashGroups, (item: IHashItem) => item.name === queryHashes.file);\n            if (Utils.isNullOrUndefined(itemFile)) {\n                itemFile = {\n                    name: queryHashes.file,\n                    value: ''\n                };\n                hashGroups.push(itemFile);\n            }\n\n            itemCategory.value = categoryName;\n            itemFile.value = ForceToolApi.extractFileBaseName(fileName);\n            UriHelper.updateHash(hashGroups);\n        }\n\n        return ForceToolApi.getDefinition()\n            .then(definition => {\n                const category = lodash.find(definition.Categories, (categ: any) => categ.Name === categoryName);\n                if (!Utils.isNullOrUndefined(category)) {\n                    const categorySet = lodash.find(category.Sets, (set: any) => set.File === fileName);\n                    if (!Utils.isNullOrUndefined(categorySet)) {\n                        if (restoreFromFile === true) {\n                            categorySet.Set = null;\n                        }\n\n                        if (Utils.isNullOrUndefined(categorySet.Set)) {\n                            return ForceToolApi.readForceSetFile(fileName)\n                                .then(set => {\n                                    categorySet.Set = set;\n                                    updateCurrent(set, categoryName, fileName);\n                                    return set;\n                                });\n                        }\n\n                        updateCurrent(categorySet.Set, categoryName, fileName);\n                        return categorySet.Set;\n                    }\n                }\n\n                return null;\n            });\n    }\n\n    public static removeUrlHash(): void {\n        const hashGroups = UriHelper.getHashGroups();\n        lodash.remove(hashGroups, (item: IHashItem) => item.name === queryHashes.category);\n        lodash.remove(hashGroups, (item: IHashItem) => item.name === queryHashes.file);\n\n        if (hashGroups.length === 0) {\n            if ('pushState' in history) {\n                history.replaceState('', document.title, window.location.pathname + window.location.search);\n            } else {\n                location.hash = '';\n            }\n        } else {\n            UriHelper.updateHash(hashGroups);\n        }\n    }\n\n    private static readForceSetFile(fileName: string): Promise<ForceToolSet> {\n        //return readLocalJsonFile<ForceToolSet>(UriHelper.setTimeStamp(fileName))\n        return readLocalJsonFile<ForceToolSet>(UriHelper.setTimeStamp(fileName))\n            .catch(err => {\n                if (DEBUG) {\n                    console.warn(`Read force tool set from file '${fileName}' failed`, err);\n                }\n\n                return null;\n            })\n            .then(setFile => {\n                const fileExist = !Utils.isNullOrUndefined(setFile);\n\n                const result: ForceToolSet = ForceToolApi.isValidForceSetFile(setFile) ? setFile : {\n                    File: fileName,\n                    Name: '-',\n                    Description: fileExist ? 'Invalid file format!' : 'File does not exist',\n                    Commands: []\n                };\n\n                result.File = fileName;\n\n                return result;\n            });\n    }\n\n    private static requiredCommandKeys = ['Action', 'Command', 'Module'];\n\n    public static isValidForceSetFile(setFile: ForceToolSet): boolean {\n        let valid = !Utils.isNullOrUndefined(setFile) &&\n                    !Utils.isNullOrUndefined(setFile.Name) &&\n                    !Utils.isNullOrUndefined(setFile.Commands);\n\n        if (valid && lodash.isArray(setFile.Commands) && setFile.Commands.length > 0) {\n            valid = lodash.every(setFile.Commands, (cmd: ForceToolCommand) => {\n                return ForceToolApi.isValidForceCommand(cmd);\n            });\n        }\n        return valid;\n    }\n\n    public static get hasSelectedForceSet(): boolean {\n        var categoryName = window[windowKeys.Current.Category];\n        var fileName = window[windowKeys.Current.File];\n        return !StringUtils.isNullOrEmpty(categoryName) && !StringUtils.isNullOrEmpty(fileName);\n    }\n\n    public static isValidForceCommand(command: ForceToolCommand): boolean {\n        const validKeys = lodash.intersection(lodash.keys(command), ForceToolApi.requiredCommandKeys);\n        return !Utils.isNullOrUndefined(command.Description) &&\n               validKeys.length === ForceToolApi.requiredCommandKeys.length;\n    }\n\n    public static getCurrentForceSet(): Promise<ForceToolSet> {\n        return Promise.resolve()\n            .then(() => {\n                const categoryName = window[windowKeys.Current.Category] as string;\n                const fileName = window[windowKeys.Current.File] as string;\n                return !StringUtils.isNullOrEmpty(categoryName) && !StringUtils.isNullOrEmpty(fileName)\n                    ? ForceToolApi.getFileSet(categoryName, fileName)\n                    : null;\n            })\n            .then(set => {\n                if (!Utils.isNullOrUndefined(set)) {\n                    return set;\n                }\n\n                const hashGroups = UriHelper.getHashGroups();\n                const itemCategory = lodash.find(hashGroups, (item: IHashItem) => item.name === queryHashes.category);\n                const itemFile = lodash.find(hashGroups, (item: IHashItem) => item.name === queryHashes.file);\n                const category = itemCategory ? itemCategory.value : null;\n                let file = itemFile ? itemFile.value : null;\n                const validData = !Utils.isNullOrUndefined(category) && !Utils.isNullOrUndefined(file);\n                if (validData) {\n                    file = ForceToolApi.createFileName(category, file);\n                }\n\n                return validData ? ForceToolApi.getFileSet(category, file) : null;\n            });\n    }\n\n    public static getCurrentCommandIndex(): number {\n        let currentCommandIndex = window[windowKeys.Current.CommandIndex] as number;\n        if (Utils.isNullOrUndefined(currentCommandIndex)) {\n            currentCommandIndex = -1;\n            ForceToolApi.setCurrentCommandIndex(currentCommandIndex);\n        }\n\n        return currentCommandIndex;\n    }\n\n    public static setCurrentCommandIndex(value: number): void {\n        window[windowKeys.Current.CommandIndex] = value;\n    }\n\n    public static getDefinition(): Promise<ForceToolDefinition> {\n        let definition = window[windowKeys.Definition] as ForceToolDefinition;\n        if (!Utils.isNullOrUndefined(definition)) {\n            return Promise.resolve(definition);\n        }\n\n        return ForceToolApi.readDefinition()\n            .then(definition => {\n                if (!Utils.isNullOrUndefined(definition)) {\n                    // cache it in window obj\n                    window[windowKeys.Definition] = definition;\n                }\n                return definition;\n            });\n    }\n\n    public static getNonBaseFilePath(fileName: string): string {\n        if (!Utils.isNullOrUndefined(fileName)) {\n            var parts = fileName.split('/');\n            if (parts.length > 0) {\n                if (parts[0].toLowerCase() === baseFolder.toLowerCase()) {\n                    parts.splice(0, 1);\n                }\n                return parts.join('/');\n            }\n        }\n        return fileName;\n    }\n\n    private static extractFileBaseName(fileName: string): string {\n        if (!Utils.isNullOrUndefined(fileName)) {\n            const parts = fileName.split('/');\n            if (parts.length === 3) {\n                return parts[2];\n            }\n        }\n\n        return fileName;\n    }\n\n    private static createFileName(category: string, file: string): string {\n        return `${baseFolder}/${category}/${file}`;\n    }\n\n    private static readDefinition(): Promise<ForceToolDefinition> {\n        return readLocalJsonFile<FileDefinition>(UriHelper.setTimeStamp(fileDefinition))\n            .catch(err => {\n                if (DEBUG) {\n                    console.warn(`Read force tool definition from file '${fileDefinition}' failed`, err);\n                }\n\n                return null;\n            })\n            .then(fileDefinition => {\n                const result: ForceToolDefinition = {\n                    Categories: []\n                };\n\n                if (!Utils.isNullOrUndefined(fileDefinition) && !Utils.isNullOrUndefined(fileDefinition.Categories)) {\n                    for (const categoryName in fileDefinition.Categories) {\n                        if (fileDefinition.Categories.hasOwnProperty(categoryName)) {\n                            const setCategory: SetCategory = {\n                                Name: categoryName,\n                                Sets: []\n                            };\n\n                            const categoryDefinition = fileDefinition.Categories[categoryName] as FileCategoryDefinition;\n\n                            for (const setName in categoryDefinition) {\n                                if (categoryDefinition.hasOwnProperty(setName)) {\n                                    const setDefinition = categoryDefinition[setName] as SetDefinition;\n                                    setDefinition.Name = setName;\n                                    //setDefinition.File = `${baseFolder}/${categoryName}/${setDefinition.File}`;\n                                    setDefinition.File = ForceToolApi.createFileName(categoryName, setDefinition.File);\n\n                                    setCategory.Sets.push(setDefinition);\n                                }\n                            }\n\n                            result.Categories.push(setCategory);\n                        }\n                    }\n                }\n\n                return result;\n            });\n    }\n}\n\nfunction readLocalJsonFile<T>(file: string, throwError?: boolean): Promise<T> {\n    return FileUtils.readLocalJsonFile(file, throwError) as Promise<T>;\n}\n\n\n// WEBPACK FOOTER //\n// ./src/ForceToolApi.ts","import {Utils, StringUtils, HtmlUtils, lodash} from 'neo-common';\nimport {ForceToolApi} from './ForceToolApi';\nimport {ForceToolCommand, ForceToolDefinition, ForceToolExternalSetupInfo, ForceToolSet, SetCategory, SetDefinition} from './Types';\nimport md5 = require('blueimp-md5');\n\nconst elementIds = {\n    demoContainer: 'forceToolDemo',\n    container: 'forceToolContainer',\n    overlay: 'forceToolOverlay',\n    demoCloseOverlay: 'forceToolDemoCloseOverlay',\n    title: 'forceToolTitle',\n    titleText: 'title-text',\n    titleBtn: 'title-btn',\n    titleActionsPanel: 'title-actions',\n    forceToolDemoBtn: 'forceToolDemoBtn',\n    forceToolList: 'forceToolList',\n    forceToolContent: 'forceToolContent',\n    currentForceSet: 'currentForceSet',\n    linkContentCurrent: 'linkContentCurrent',\n    linkContentAll: 'linkContentAll',\n\n    txtCurrentForceSet: 'txtCurrentForceSet',\n    txtCurrentForceSetFile: 'txtCurrentForceSetFile',\n\n    divForceSetCommands: 'divForceSetCommands',\n    divForceSetRawContent: 'divForceSetRawContent',\n    txtRawForceSetCommands: 'txtRawForceSetCommands',\n    divCommandsFooterNextCommand: 'divCommandsFooterNextCommand',\n    divCommandsFooterLinks: 'divCommandsFooterLinks',\n    lblCommandsFooterNextCommand: 'lblCommandsFooterNextCommand',\n    linkCommandsFooterEdit: 'linkCommandsFooterEdit',\n    linkCommandsFooterEditCancel: 'linkCommandsFooterEditCancel',\n    linkCommandsFooterEditRestore: 'linkCommandsFooterEditRestore'\n};\n\nconst elements = {\n    demoContainer: null as HTMLDivElement,\n    container: null as HTMLDivElement,\n    overlay: null as HTMLDivElement,\n    title: null as HTMLHeadingElement,\n    titleText: null as HTMLSpanElement,\n    titleBtn: null as HTMLSpanElement,\n    titleActionsPanel: null as HTMLDivElement,\n    forceToolDemoBtn: null as HTMLButtonElement,\n    forceToolList: null as HTMLDivElement,\n    forceToolContent: null as HTMLDivElement,\n    demoCloseOverlay: null as HTMLDivElement,\n\n    currentForceSet: null as HTMLDivElement,\n    linkContentCurrent: null as HTMLAnchorElement,\n    linkContentAll: null as HTMLAnchorElement,\n    txtCurrentForceSet: null as HTMLLabelElement,\n    txtCurrentForceSetFile: null as HTMLLabelElement,\n\n    divForceSetCommands: null as HTMLDivElement,\n    divForceSetRawContent: null as HTMLDivElement,\n    txtRawForceSetCommands: null as HTMLTextAreaElement,\n    divCommandsFooterNextCommand: null as HTMLDivElement,\n    divCommandsFooterLinks: null as HTMLDivElement,\n    lblCommandsFooterNextCommand: null as HTMLSpanElement,\n    linkCommandsFooterEdit: null as HTMLAnchorElement,\n    linkCommandsFooterEditCancel: null as HTMLAnchorElement,\n    linkCommandsFooterEditRestore: null as HTMLAnchorElement\n};\n\ntype ForceEditorMode = 'list' | 'editor';\n\nconst HREF_VOID = 'javascript: void(0);';\n\nconst htmlTemplates = {\n    demoContainer: `<div>\n    <button id=\"forceToolDemoBtn\" class=\"ready\"><span>DEMO</span></button>\n</div>`,\n\n    container: `<div id=\"forceToolOverlay\" style=\"display: none;\"></div>\n<div id=\"forceToolDemoCloseOverlay\"></div>\n<div id=\"forceToolTitle\">\n<span id=\"title-text\"></span>\n<span id=\"title-btn\"></span>\n<div id=\"title-actions\">\n    <a href=\"${HREF_VOID}\" id=\"linkContentCurrent\">Current</a>\n    <a href=\"${HREF_VOID}\" id=\"linkContentAll\" class=\"selected\">All</a>\n</div>\n</div>\n    <div id=\"forceToolContent\">\n        <div id=\"forceToolList\"></div>\n        <div id=\"currentForceSet\" data-mode=\"list\">\n            <label class=\"title\" id=\"txtCurrentForceSet\"></label>\n            <label class=\"subtitle\" id=\"txtCurrentForceSetFile\"></label>\n            <div class=\"content\" id=\"divForceSetCommands\">\n            </div>\n            <div id=\"divForceSetRawContent\">\n                <textarea id=\"txtRawForceSetCommands\"></textarea>\n            </div>\n            <div class=\"footer\">\n                <div id=\"divCommandsFooterNextCommand\">\n                    <label>Next command:</label>\n                    <span id=\"lblCommandsFooterNextCommand\"></span>\n                </div>\n                <div id=\"divCommandsFooterLinks\">\n                    <a href=\"${HREF_VOID}\" id=\"linkCommandsFooterEditCancel\">Cancel</a>\n                    <a href=\"${HREF_VOID}\" id=\"linkCommandsFooterEdit\">Edit</a>\n                    <a href=\"${HREF_VOID}\" id=\"linkCommandsFooterEditRestore\">Restore</a>\n                </div>\n            </div>\n        </div>\n    </div>`,\n\n    categoryName: (category: SetCategory) => `<label class=\"category\">${category.Name} (${category.Sets.length})</label>`,\n\n    categorySetItem: (category: SetCategory, set: SetDefinition) =>\n        `<li>\n            <button data-category=\"${category.Name}\" data-file=\"${set.File}\" title=\"${set.Name} - ${set.Description}\">\n                <span class=\"name\">${set.Name}</span>\n                <span class=\"description\">${set.Description}</span>\n            </button>\n        </li>`\n};\n\nconst NEWLINE = '\\n';\n\nexport enum ForceToolUIState {\n    Enabled,\n    Disabled\n}\n\nexport enum ForceToolLayout {\n    Debug = 'debug',\n    DemoDebug = 'demodebug',\n    Demo = 'demo'\n}\n\nexport class ForceToolUI {\n    private static _initialized = false;\n    private static _state = ForceToolUIState.Enabled;\n    private static _layout = ForceToolLayout.Debug;\n    private static _demoRunning = false;\n    private static _externalSetupInfo: ForceToolExternalSetupInfo;\n    private static _pinDialogVisible: boolean;\n\n    public static initialize(layout: ForceToolLayout, externalSetupInfo: ForceToolExternalSetupInfo): Promise<any> {\n        return Promise.resolve()\n            .then(() => {\n                if (!ForceToolUI._initialized) {\n                    ForceToolUI._externalSetupInfo = externalSetupInfo;\n                    ForceToolUI._layout = layout;\n                    ForceToolUI.initHtml();\n                    ForceToolUI._initialized = true;\n                    return ForceToolApi.getDefinition()\n                        .then(definition => ForceToolUI.drawList(definition))\n                        .then(() => ForceToolUI.afterDrawList())\n                        .catch(err => ForceToolUI.drawError(err, 'Error loading force tool definition file'));\n                }\n            });\n    }\n\n    public static updateState(state: ForceToolUIState): void {\n        if (state !== ForceToolUI._state) {\n            ForceToolUI._state = state;\n            //ForceToolUI.refresh();\n\n            HtmlUtils.toggleShow(elements.overlay, state === ForceToolUIState.Disabled);\n            setTimeout(() => {\n                ForceToolUI.refresh();\n            }, 10);\n        }\n    }\n\n    public static get demoRunning(): boolean {\n        return this._demoRunning;\n    }\n\n    public static set demoRunning(value: boolean) {\n        this._demoRunning = value;\n    }\n\n    private static get layoutIsDemo(): boolean {\n        return ForceToolUI._layout === ForceToolLayout.Demo;\n    }\n\n    private static get layoutIsDemoLike(): boolean {\n        return Utils.valueIsIn(ForceToolUI._layout, [ForceToolLayout.Demo, ForceToolLayout.DemoDebug]);\n    }\n\n    private static get layoutIsDebugLike(): boolean {\n        return Utils.valueIsIn(ForceToolUI._layout, [ForceToolLayout.Debug, ForceToolLayout.DemoDebug]);\n    }\n\n    private static initHtml() {\n        // force tool container ...\n        let container = document.getElementById(elementIds.container);\n        if (container) {\n            container.parentElement.removeChild(container);\n        }\n\n        container = document.createElement('div');\n        container.setAttribute('id', elementIds.container);\n        container.classList.add('expanded');\n        container.innerHTML = htmlTemplates.container;\n        container.dataset['layout'] = ForceToolUI._layout;\n\n        if (ForceToolUI.layoutIsDemoLike && !ForceToolApi.hasSelectedForceSet) {\n            container.style.display = 'none';\n        }\n\n        document.body.insertBefore(container, document.body.firstChild);\n\n        // forceToolDemo\n        let demoContainer = document.getElementById(elementIds.demoContainer);\n        if (demoContainer) {\n            demoContainer.parentElement.removeChild(demoContainer);\n        }\n\n        if (ForceToolUI.layoutIsDemoLike) {\n            demoContainer = document.createElement('div');\n            demoContainer.setAttribute('id', elementIds.demoContainer);\n            demoContainer.innerHTML = htmlTemplates.demoContainer;\n            document.body.insertBefore(demoContainer, document.body.firstChild);\n        }\n\n        ForceToolUI._pinDialogVisible = false;\n\n        // find elements\n        ForceToolUI.findElements(ForceToolUI.layoutIsDebugLike);\n\n        if (ForceToolUI.layoutIsDemoLike) {\n            const clearFix = document.createElement('div');\n            clearFix.classList.add('clearfix');\n            elements.demoContainer.parentNode.insertBefore(clearFix, elements.demoContainer.nextSibling);\n\n            elements.forceToolDemoBtn.addEventListener('click', ForceToolUI.demoButtonClick);\n\n            elements.demoCloseOverlay.addEventListener('click', ForceToolUI.demoButtonClick);\n        } else {\n            container.removeChild(elements.demoCloseOverlay);\n        }\n\n        elements.titleText.innerText = ForceToolUI.layoutIsDemoLike ? 'Select Demo Set' : 'Force Tool Sets';\n\n        if (!ForceToolUI.layoutIsDebugLike) {\n            HtmlUtils.toggleShow(elements.titleActionsPanel, false);\n        }\n        HtmlUtils.toggleShow(elements.txtCurrentForceSetFile, ForceToolUI.layoutIsDebugLike);\n        HtmlUtils.toggleShow(elements.txtCurrentForceSet, ForceToolUI.layoutIsDebugLike);\n\n        if (!ForceToolUI.layoutIsDebugLike) {\n            elements.divForceSetRawContent.parentElement.removeChild(elements.divForceSetRawContent);\n            //elements.divCommandsFooterNextCommand.parentElement.removeChild(elements.divCommandsFooterNextCommand);\n            elements.divCommandsFooterLinks.parentElement.removeChild(elements.divCommandsFooterLinks);\n        }\n\n        // attach handlers to html events of elements\n        elements.titleBtn.addEventListener('click', ForceToolUI.expandCollapse);\n        elements.linkContentAll.addEventListener('click', ForceToolUI.changeContent);\n        elements.linkContentCurrent.addEventListener('click', ForceToolUI.changeContent);\n        elements.linkCommandsFooterEdit.addEventListener('click', ForceToolUI.editCancelRawEditor);\n        elements.linkCommandsFooterEditCancel.addEventListener('click', ForceToolUI.editCancelRawEditor);\n        elements.linkCommandsFooterEditRestore.addEventListener('click', ForceToolUI.editCancelRawEditor);\n\n        const forceFileSetSample = JSON.stringify(ForceToolApi.getSampleForceSetFile(), null, '  ');\n        elements.txtRawForceSetCommands.placeholder = `Enter valid force set commands JSON.\\nExample:\\n\\n` + forceFileSetSample;\n\n        //elements.forceToolList.innerHTML = 'Loading...';\n        elements.forceToolList.innerHTML = '';\n    }\n\n    private static afterDrawList(allowedPinDetection: boolean = true): void {\n        // attach click on list buttons (sets)\n        const setsButtons = HtmlUtils.queryElements('#forceToolList button[data-file]') as HTMLButtonElement[];\n        lodash.each(setsButtons, (btn: HTMLButtonElement) => {\n            btn.addEventListener('click', ForceToolUI.openSetButtonClick);\n        });\n\n        if (ForceToolUI.layoutIsDemo) {\n            ForceToolApi.clearCurrent();\n        }\n\n        ForceToolUI.redrawCurrentForceSet();\n\n        if (allowedPinDetection) {\n            const genDemoPin = ForceToolUI.generatePinHashMode;\n            if (genDemoPin && ForceToolUI.layoutIsDebugLike) {\n                ForceToolUI.renderPINDialog(true);\n            } else {\n                ForceToolUI.renderEnterPINDialog();\n            }\n        }\n\n        return null;\n    }\n\n    private static get generatePinHashMode(): boolean {\n        return Utils.asBool(Utils.valueOrDefault(Utils.getURIQuery()['gen.hash'], 'false'))\n               && ForceToolUI.layoutIsDebugLike;\n    }\n\n    private static renderEnterPINDialog(): void {\n        if (!Utils.isNullOrUndefined(this._externalSetupInfo) && ForceToolUI.layoutIsDemoLike) {\n            const demoPINHash = this._externalSetupInfo.forceToolDemoPINHash();\n            if (!StringUtils.isNullOrEmpty(demoPINHash)) {\n                ForceToolUI.renderPINDialog(false);\n            }\n        }\n    }\n\n    private static renderPINDialog(generatePin: boolean): void {\n        const title = generatePin ? 'Generate PIN HASH' : 'Enter DEMO PIN:';\n        const submitText = generatePin ? 'Generate HASH' : 'Continue';\n        const submitMode = generatePin ? 'generate' : 'validate';\n\n        const pinPadHtml = ForceToolUI.renderNumericPINPad(!generatePin);\n\n        /*<tr>\n                    <td colspan=\"2\"><b>${title}</b></td>\n                </tr>*/\n\n        const pinInputType = generatePin ? 'text' : 'password';\n\n        let html = `\n            <table style=\"font-family: initial; width: 100%;\">\n                \n                <tr>\n                    <td colspan=\"2\">\n                        <input type=\"${pinInputType}\" id=\"edDemoPin\" placeholder=\"DEMO PIN\" readonly/>\n                    </td>\n                </tr>\n                <tr>\n                    <td colspan=\"2\">\n                        ${pinPadHtml}\n                    </td>\n                </tr>`;\n\n        if (generatePin) {\n            html += `\n                <tr>\n                    <td colspan=\"2\">\n                        <input type=\"text\" readonly id=\"edDemoPinHash\" placeholder=\"PIN HASH\"/>\n                    </td>\n                </tr>`;\n        }\n\n        html += `</table>`;\n        elements.forceToolContent.innerHTML = html;\n\n        const pinPadButtons = HtmlUtils.queryElements('button[data-pin-button]');\n        lodash.each(pinPadButtons, (btn: HTMLButtonElement) => {\n            btn.addEventListener('click', ForceToolUI.pinPadButtonClicked);\n        });\n\n        ForceToolUI._pinDialogVisible = true;\n    }\n\n    private static pinPadButtonClicked(event: Event): void {\n        const button = event.currentTarget as HTMLButtonElement;\n        const btnValue = Number(button.dataset['pinButton']);\n        const edDemoPin = document.getElementById('edDemoPin') as HTMLInputElement;\n\n        let generatePinHash = ForceToolUI.layoutIsDebugLike;\n        let canSubmit = ForceToolUI.generatePinHashMode;\n\n        if (btnValue > -1) {\n            edDemoPin.value += btnValue;\n        } else {\n            if (btnValue === -1) {\n                const value = edDemoPin.value;\n                if (!StringUtils.isNullOrEmpty(value) && value.length > 0) {\n                    edDemoPin.value = value.length === 1 ? '' : value.substr(0, value.length - 1);\n                }\n            } else if (btnValue === -2) {\n                generatePinHash = false;\n                canSubmit = true;\n            }\n        }\n\n        if (canSubmit) {\n            ForceToolUI.submitDemoPinHash(generatePinHash);\n        }\n    }\n\n    private static renderNumericPINPad(renderAccept: boolean = true): string {\n        const acceptHtml = renderAccept ? '<td><button data-pin-button=\"-2\">✓</button></td>' : '';\n        return `\n        <table style=\"font-family: initial;\">\n            <tr>\n                <td><button data-pin-button=\"7\">7</button></td>\n                <td><button data-pin-button=\"8\">8</button></td>\n                <td><button data-pin-button=\"9\">9</button></td>\n            </tr>\n            <tr>\n                <td><button data-pin-button=\"4\">4</button></td>\n                <td><button data-pin-button=\"5\">5</button></td>\n                <td><button data-pin-button=\"6\">6</button></td>\n            </tr>\n            <tr>\n                <td><button data-pin-button=\"1\">1</button></td>\n                <td><button data-pin-button=\"2\">2</button></td>\n                <td><button data-pin-button=\"3\">3</button></td>\n            </tr>\n            <tr>\n                <td><button data-pin-button=\"0\">0</button></td>\n                <td><button data-pin-button=\"-1\">←</button></td>\n                ${acceptHtml}\n            </tr>\n        </table>`;\n    }\n\n    private static submitDemoPinHash(generatePinHash: boolean): void {\n        const edDemoPin = document.getElementById('edDemoPin') as HTMLInputElement;\n        const demoPin = edDemoPin.value;\n        const hasDemoPin = !StringUtils.isNullOrEmpty(demoPin);\n\n        if (generatePinHash) {\n            const hash = hasDemoPin ? md5(demoPin, null, false) : '';\n\n            const edDemoPinHash = document.getElementById('edDemoPinHash') as HTMLInputElement;\n            edDemoPinHash.value = hash;\n\n            if (hasDemoPin) {\n                edDemoPinHash.select();\n                edDemoPinHash.focus();\n            }\n        } else {\n            const demoPINHash = ForceToolUI._externalSetupInfo.forceToolDemoPINHash();\n            const hash = md5(demoPin, null, false);\n            if (demoPINHash === hash) {\n                ForceToolUI.initHtml();\n                ForceToolApi.getDefinition()\n                    .then(definition => ForceToolUI.drawList(definition))\n                    .then(() => ForceToolUI.afterDrawList(false))\n                    .then(() => {\n                        ForceToolUI.demoButtonClick();\n                    })\n                    .catch(err => ForceToolUI.drawError(err, 'Error loading force tool definition file'));\n            } else {\n                edDemoPin.value = '';\n                alert('Invalid PIN!');\n            }\n        }\n    }\n\n    public static refresh(): void {\n        ForceToolApi.getCurrentForceSet()\n            .then(forceSet => {\n                const hasCurrent = !Utils.isNullOrUndefined(forceSet);\n                const content = hasCurrent ? 'Current' : 'All';\n                ForceToolUI.changeContentTo(content, forceSet);\n                if (hasCurrent) {\n                    ForceToolUI.setCurrentForceSet(forceSet);\n                }\n            });\n\n    }\n\n    private static redrawCurrentForceSet(): void {\n        ForceToolApi.getCurrentForceSet()\n            .then(forceSet => {\n                if (!Utils.isNullOrUndefined(forceSet)) {\n                    ForceToolUI.setCurrentForceSet(forceSet);\n                }\n            });\n    }\n\n    private static setCurrentForceSet(forceSet: ForceToolSet): boolean {\n        elements.txtRawForceSetCommands.value = '';\n        ForceToolUI.changeContentTo('Current', forceSet);\n\n        elements.txtCurrentForceSet.innerText = forceSet.Description;\n        elements.txtCurrentForceSet.title = `${forceSet.Description} [${forceSet.Name}] File: ${forceSet.File}`;\n        elements.txtCurrentForceSetFile.innerText = ForceToolApi.getNonBaseFilePath(forceSet.File);\n\n        elements.divForceSetCommands.innerHTML = '';\n\n        //let html = htmlTemplates.commandsTable.begin;\n        let html = `<table id=\"tableCommands\"><thead><tr>\n                <th>&nbsp;</th>\n                <th>#</th>\n                <th>Name</th>`;\n\n        if (ForceToolUI.layoutIsDebugLike) {\n            html += `<th>Module</th><th>Action</th>`;\n        }\n\n        html += `</tr></thead><tbody>`;\n\n        const nextCommandIndex = ForceToolApi.getCurrentCommandIndex();\n        let nextCommand: ForceToolCommand = null;\n        let activeCommandIndex = -1;\n\n        for (let i = 0; i < forceSet.Commands.length; i++) {\n            const command = forceSet.Commands[i];\n            const isNextCommand = i === nextCommandIndex;\n            if (isNextCommand) {\n                nextCommand = command;\n                activeCommandIndex = i;\n            }\n            const nextCommandCssClass = isNextCommand ? 'current' : '';\n            const nextCommandHtml = isNextCommand ? '&#10148;' : '';\n            const rowCssClass = (!isNextCommand && i < nextCommandIndex) ? 'inactive' : '';\n            const idx = i + 1 + '.';\n            const isEmptyCommand = StringUtils.isNullOrEmpty(command.Command);\n\n            html +=\n                `<tr class=\"${rowCssClass}\">\n                    <td class=\"${nextCommandCssClass}\">${nextCommandHtml}</td>\n                    <td>${idx}</td>`;\n\n            const cellCss = isEmptyCommand ? 'no-cmd-cell' : '';\n\n            const commandItemTitle = isEmptyCommand ? '&lt;EMPTY COMMAND&gt;' : command.Description;\n            html += `<td title=\"Command: ${command.Command}\" class=\"${cellCss}\">\n                        <a href=\"${HREF_VOID}\" data-command=\"true\" data-commandempty=\"${isEmptyCommand}\" data-commandindex=\"${i}\">${commandItemTitle}</a>\n                    </td>`;\n\n            if (ForceToolUI.layoutIsDebugLike) {\n                html += `<td class=\"${cellCss}\">${command.Module}</td><td class=\"${cellCss}\">${command.Action}</td>` + NEWLINE;\n            }\n\n            html += `</tr>` + NEWLINE;\n        }\n\n        //html += htmlTemplates.commandsTable.end;\n        html += `</tbody></table>`;\n        elements.divForceSetCommands.innerHTML = html;\n\n        const hasNextCommand = !Utils.isNullOrUndefined(nextCommand);\n\n        elements.lblCommandsFooterNextCommand.innerText = hasNextCommand\n            ? `${nextCommandIndex + 1}. ${nextCommand.Description} (${nextCommand.Module}/${nextCommand.Action})`\n            : '';\n\n        elements.lblCommandsFooterNextCommand.title = hasNextCommand\n            ? `Command: ${nextCommand.Command}`\n            : '';\n\n        const commandsLinks = HtmlUtils.queryElements('#divForceSetCommands a[data-command=\"true\"]') as HTMLAnchorElement[];\n        lodash.each(commandsLinks, (link: HTMLAnchorElement) => {\n            link.addEventListener('click', ForceToolUI.changeCommandIndex);\n        });\n\n        if (activeCommandIndex > -1) {\n            const activeCommandLinks = HtmlUtils.queryElements(`a[data-commandindex=\"${activeCommandIndex}\"]`);\n            if (activeCommandLinks.length > 0) {\n                (activeCommandLinks[0] as any).scrollIntoView(false);\n            }\n        }\n\n        return hasNextCommand;\n    }\n\n    private static demoButtonClick(): void {\n        if (ForceToolUI.demoRunning) {\n            return;\n        }\n\n        function toggleContainerVisible() {\n            const containerVisible = elements.container.style.display === 'block';\n            HtmlUtils.toggleShow(elements.container, !containerVisible);\n        }\n\n        if (ForceToolUI._pinDialogVisible) {\n            return toggleContainerVisible();\n        }\n\n        const hasCurrentCssClass = elements.forceToolContent.classList.contains('current');\n        //HtmlUtils.toggleShow(elements.container, true);\n\n        if (hasCurrentCssClass) {\n            HtmlUtils.toggleShow(elements.container, true);\n            ForceToolUI.changeContentTo('All', null);\n        } else {\n            return toggleContainerVisible();\n        }\n    }\n\n    private static expandCollapse(): void {\n        if (ForceToolUI.layoutIsDemo) {\n            ForceToolUI.demoButtonClick();\n        } else {\n            const elem = elements.container;\n            const expanded = elem.classList.contains('expanded');\n            const currentClass = expanded ? 'expanded' : 'collapsed';\n            const newClass = expanded ? 'collapsed' : 'expanded';\n            elem.classList.remove(currentClass);\n            elem.classList.add(newClass);\n        }\n    }\n\n    private static openSetButtonClick(event: Event): void {\n        const self = ForceToolUI;\n        const button = event.currentTarget as HTMLButtonElement;\n        const category = button.dataset['category'];\n        const file = button.dataset['file'];\n        ForceToolApi.setCurrentCommandIndex(-1);\n        ForceToolApi.getFileSet(category, file)\n            .then(setFile => {\n                if (!Utils.isNullOrUndefined(setFile)) {\n                    const wasSet = ForceToolUI.setCurrentForceSet(setFile);\n                    self.demoRunning = wasSet && self.layoutIsDemoLike;\n                    if (self.demoRunning && self.layoutIsDemo) {\n                        HtmlUtils.toggleShow(elements.container, false);\n                        elements.forceToolDemoBtn.classList.remove('ready');\n                        elements.forceToolDemoBtn.classList.add('busy');\n                    }\n                }\n            });\n    }\n\n    public static notifyCommandSent(forceSet: ForceToolSet, commandIndex: number): void {\n        let forceSetEnded = false;\n        let newCommandIndex = commandIndex + 1;\n        if (newCommandIndex >= forceSet.Commands.length) {\n            newCommandIndex = 0;\n            forceSetEnded = true;\n        }\n\n        ForceToolApi.setCurrentCommandIndex(newCommandIndex);\n        ForceToolUI.refresh();\n\n        if (forceSetEnded) {\n            // when all force commands was sent and if demo is running, turn off demo\n            if (ForceToolUI.demoRunning && ForceToolUI.layoutIsDemo) {\n                setTimeout(() => {\n                    elements.forceToolDemoBtn.classList.remove('busy');\n                    elements.forceToolDemoBtn.classList.add('ready');\n                    ForceToolApi.clearCurrent();\n\n                    ForceToolUI.demoRunning = false;\n                    elements.titleText.innerText = ForceToolUI.layoutIsDemoLike ? 'Select Demo Set' : 'Force Tool Sets';\n                    ForceToolUI.renderEnterPINDialog();\n                }, 1 * 1000);\n            }\n        }\n    }\n\n    private static changeCommandIndex(event: Event): void {\n        const link = event.target as HTMLAnchorElement;\n        const commandindex = Number(link.dataset['commandindex']);\n        ForceToolApi.setCurrentCommandIndex(commandindex);\n        ForceToolUI.redrawCurrentForceSet();\n    }\n\n    private static editCancelRawEditor(event: Event): void {\n        const link = event.target as HTMLAnchorElement;\n        const clickedEdit = link.id === elementIds.linkCommandsFooterEdit;\n        const currentMode = elements.currentForceSet.dataset['mode'] as ForceEditorMode;\n\n        function setNewMode(newMode: ForceEditorMode) {\n            elements.currentForceSet.dataset['mode'] = newMode;\n            elements.linkCommandsFooterEdit.innerText = newMode === 'editor' ? 'Apply' : 'Edit';\n        }\n\n        if (clickedEdit) {\n            if (currentMode === 'list') {\n                setNewMode('editor');\n\n                if (StringUtils.isNullOrEmpty(elements.txtRawForceSetCommands.value)) {\n                    ForceToolApi.getCurrentForceSet()\n                        .then(forceSet => {\n                            if (!Utils.isNullOrUndefined(forceSet)) {\n                                const json = lodash.cloneDeep(forceSet) as ForceToolSet;\n                                delete json.File;\n\n                                elements.txtRawForceSetCommands.value = JSON.stringify(json, null, '  ');\n                            }\n                        });\n                }\n            } else {\n                let forceSet: ForceToolSet = null;\n                try {\n                    forceSet = StringUtils.isNullOrEmpty(elements.txtRawForceSetCommands.value) ? null : JSON.parse(elements.txtRawForceSetCommands.value);\n                } catch (err) {\n                    alert('Error parsing text, its not valid JSON!');\n                }\n\n                if (forceSet) {\n                    if (!ForceToolApi.isValidForceSetFile(forceSet)) {\n                        alert('Invalid file format!');\n                    } else {\n                        ForceToolApi.updateCurrentForceSet(forceSet)\n                            .then(success => {\n                                if (success) {\n                                    setNewMode('list');\n                                    ForceToolUI.setCurrentForceSet(forceSet);\n                                }\n                            });\n                    }\n                }\n            }\n        } else {\n            const clickedRestore = link.id === elementIds.linkCommandsFooterEditRestore;\n            if (clickedRestore) {\n                if (confirm('Do you want to restore editor with definition from file?')) {\n                    ForceToolApi.resetCurrentForceSet()\n                        .then(forceSet => {\n                            if (forceSet) {\n                                ForceToolUI.setCurrentForceSet(forceSet);\n                                const json = lodash.cloneDeep(forceSet) as ForceToolSet;\n                                delete json.File;\n\n                                elements.txtRawForceSetCommands.value = JSON.stringify(json, null, '  ');\n                            }\n                        });\n                }\n            } else {\n                const hasSomeData = !StringUtils.isNullOrEmpty(elements.txtRawForceSetCommands.value) && elements.txtRawForceSetCommands.value.length > 0;\n\n                if (hasSomeData) {\n                    if (!confirm('Do you want to keep current changes in editor?\\n' +\n                                 'OK - Keep editor text\\n' +\n                                 'Cancel - Clear editor text')) {\n                        elements.txtRawForceSetCommands.value = '';\n                    }\n                }\n                setNewMode('list');\n            }\n        }\n    }\n\n    private static changeContent(event: Event): void {\n        const link = event.target as HTMLAnchorElement;\n        const clickedAll = (link.id === elementIds.linkContentAll);\n        if (clickedAll) {\n            ForceToolUI.changeContentTo('All', null);\n        } else {\n            ForceToolApi.getCurrentForceSet()\n                .then(forceSet => {\n                    ForceToolUI.changeContentTo('Current', forceSet);\n                });\n        }\n    }\n\n    private static changeContentTo(content: 'Current' | 'All', forceSet: ForceToolSet): void {\n        const changeToAll = content === 'All';\n        const hasCurrentCssClass = elements.forceToolContent.classList.contains('current');\n\n        if (changeToAll) {\n            ForceToolApi.clearCurrent();\n\n            if (hasCurrentCssClass) {\n                elements.forceToolContent.classList.remove('current');\n            }\n\n            if (elements.linkContentCurrent.classList.contains('selected')) {\n                elements.linkContentCurrent.classList.remove('selected');\n            }\n\n            if (!elements.linkContentAll.classList.contains('selected')) {\n                elements.linkContentAll.classList.add('selected');\n            }\n\n            elements.titleText.innerText = ForceToolUI.layoutIsDemoLike ? 'Select Demo Set' : 'Force Tool Sets';\n        } else {\n            if (!hasCurrentCssClass) {\n                elements.forceToolContent.classList.add('current');\n            }\n\n            if (elements.linkContentAll.classList.contains('selected')) {\n                elements.linkContentAll.classList.remove('selected');\n            }\n\n            if (!elements.linkContentCurrent.classList.contains('selected')) {\n                elements.linkContentCurrent.classList.add('selected');\n            }\n\n            //elements.titleText.innerText = ForceToolUI.layoutIsDemoLike ? 'Demo Set' : 'Force Tool Set';\n            elements.titleText.innerText = forceSet ? forceSet.Description : '-';\n        }\n    }\n\n    private static findElements(layoutIsDebugLike: boolean): boolean {\n        let hasElements = true;\n\n        for (const key in elementIds) {\n            const elementId = elementIds[key];\n            elements[key] = document.getElementById(elementId);\n\n            if (Utils.isNullOrUndefined(elements[key])) {\n                if (layoutIsDebugLike && Utils.valueIsIn(elementId, [elementIds.demoContainer, elementIds.forceToolDemoBtn])) {\n                    continue;\n                }\n\n                hasElements = false;\n                if (DEBUG) {\n                    console.error(`Could not find element with id '${elementId}' `);\n                }\n                break;\n            }\n        }\n\n        return hasElements;\n    }\n\n    private static drawList(definition: ForceToolDefinition | undefined): void {\n        let html = '';\n        for (let i = 0; i < definition.Categories.length; i++) {\n            const category = definition.Categories[i];\n            html += htmlTemplates.categoryName(category) + NEWLINE;\n            html += '<ul>' + NEWLINE;\n\n            if (category.Sets.length === 0) {\n                html += '<li>CATEGORY HAS NO SETS</li>' + NEWLINE;\n            } else {\n                for (let j = 0; j < category.Sets.length; j++) {\n                    const set = category.Sets[j];\n                    html += htmlTemplates.categorySetItem(category, set) + NEWLINE;\n                }\n            }\n\n            html += '</ul>' + NEWLINE;\n        }\n\n        elements.forceToolList.innerHTML = html;\n\n        return null;\n    }\n\n    private static drawError(error: any, message: string) {\n        elements.forceToolList.innerHTML = message;\n\n        if (error) {\n            console.error(error);\n        }\n    }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/ForceToolUI.ts","import {\n    libraryInitialize as neoCommonInitialize,\n} from 'neo-common';\n\nneoCommonInitialize();\n\nimport {runTestApp} from './TestApp';\nimport {ForceToolApi} from './ForceToolApi';\nimport * as Types from './Types';\n\nimport './ForceToolInterceptor';\n\nexport {\n    runTestApp,\n    ForceToolApi,\n    Types\n}\n\n\n// WEBPACK FOOTER //\n// ./src/index.ts","import {ForceToolApi} from './ForceToolApi';\nimport * as Types from './Types';\nimport {ForceToolLayout, ForceToolUI} from './ForceToolUI';\nimport {ForceToolExternalSetupInfo} from './Types';\n\nexport function runTestApp() {\n    ForceToolApi.getDefinition()\n        .then(definition => displayDefinition(definition));\n\n    const externalSetupInfo: ForceToolExternalSetupInfo = {\n        isForceToolDebugEnabled: () => true,\n        isForceToolEnabled: () => true,\n        forceToolDemoPINHash: () => 'e10adc3949ba59abbe56e057f20f883e',\n        isGameCollectable: () => false\n    };\n    ForceToolUI.initialize(ForceToolLayout.Debug, externalSetupInfo);\n}\n\nfunction displayDefinition(definition: Types.ForceToolDefinition) {\n    console.log(`Categories (${definition.Categories.length}) and sets:`);\n\n    for (let i = 0; i < definition.Categories.length; i++) {\n        const category = definition.Categories[i];\n        console.log(`\\t${category.Name}`);\n        if (category.Sets.length === 0) {\n            console.log('\\t' + '- NO SETS');\n        } else {\n            for (let j = 0; j < category.Sets.length; j++) {\n                const set = category.Sets[j];\n                console.log('\\t' + `- ${set.Name} [${set.Description}] | ${set.File}`);\n            }\n        }\n    }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/TestApp.ts","/*\n * JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\n\n/* global define */\n\n;(function ($) {\n  'use strict'\n\n  /*\n  * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n  * to work around bugs in some JS interpreters.\n  */\n  function safeAdd (x, y) {\n    var lsw = (x & 0xffff) + (y & 0xffff)\n    var msw = (x >> 16) + (y >> 16) + (lsw >> 16)\n    return (msw << 16) | (lsw & 0xffff)\n  }\n\n  /*\n  * Bitwise rotate a 32-bit number to the left.\n  */\n  function bitRotateLeft (num, cnt) {\n    return (num << cnt) | (num >>> (32 - cnt))\n  }\n\n  /*\n  * These functions implement the four basic operations the algorithm uses.\n  */\n  function md5cmn (q, a, b, x, s, t) {\n    return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b)\n  }\n  function md5ff (a, b, c, d, x, s, t) {\n    return md5cmn((b & c) | (~b & d), a, b, x, s, t)\n  }\n  function md5gg (a, b, c, d, x, s, t) {\n    return md5cmn((b & d) | (c & ~d), a, b, x, s, t)\n  }\n  function md5hh (a, b, c, d, x, s, t) {\n    return md5cmn(b ^ c ^ d, a, b, x, s, t)\n  }\n  function md5ii (a, b, c, d, x, s, t) {\n    return md5cmn(c ^ (b | ~d), a, b, x, s, t)\n  }\n\n  /*\n  * Calculate the MD5 of an array of little-endian words, and a bit length.\n  */\n  function binlMD5 (x, len) {\n    /* append padding */\n    x[len >> 5] |= 0x80 << (len % 32)\n    x[((len + 64) >>> 9 << 4) + 14] = len\n\n    var i\n    var olda\n    var oldb\n    var oldc\n    var oldd\n    var a = 1732584193\n    var b = -271733879\n    var c = -1732584194\n    var d = 271733878\n\n    for (i = 0; i < x.length; i += 16) {\n      olda = a\n      oldb = b\n      oldc = c\n      oldd = d\n\n      a = md5ff(a, b, c, d, x[i], 7, -680876936)\n      d = md5ff(d, a, b, c, x[i + 1], 12, -389564586)\n      c = md5ff(c, d, a, b, x[i + 2], 17, 606105819)\n      b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330)\n      a = md5ff(a, b, c, d, x[i + 4], 7, -176418897)\n      d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426)\n      c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341)\n      b = md5ff(b, c, d, a, x[i + 7], 22, -45705983)\n      a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416)\n      d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417)\n      c = md5ff(c, d, a, b, x[i + 10], 17, -42063)\n      b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162)\n      a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682)\n      d = md5ff(d, a, b, c, x[i + 13], 12, -40341101)\n      c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290)\n      b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329)\n\n      a = md5gg(a, b, c, d, x[i + 1], 5, -165796510)\n      d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632)\n      c = md5gg(c, d, a, b, x[i + 11], 14, 643717713)\n      b = md5gg(b, c, d, a, x[i], 20, -373897302)\n      a = md5gg(a, b, c, d, x[i + 5], 5, -701558691)\n      d = md5gg(d, a, b, c, x[i + 10], 9, 38016083)\n      c = md5gg(c, d, a, b, x[i + 15], 14, -660478335)\n      b = md5gg(b, c, d, a, x[i + 4], 20, -405537848)\n      a = md5gg(a, b, c, d, x[i + 9], 5, 568446438)\n      d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690)\n      c = md5gg(c, d, a, b, x[i + 3], 14, -187363961)\n      b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501)\n      a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467)\n      d = md5gg(d, a, b, c, x[i + 2], 9, -51403784)\n      c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473)\n      b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734)\n\n      a = md5hh(a, b, c, d, x[i + 5], 4, -378558)\n      d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463)\n      c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562)\n      b = md5hh(b, c, d, a, x[i + 14], 23, -35309556)\n      a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060)\n      d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353)\n      c = md5hh(c, d, a, b, x[i + 7], 16, -155497632)\n      b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640)\n      a = md5hh(a, b, c, d, x[i + 13], 4, 681279174)\n      d = md5hh(d, a, b, c, x[i], 11, -358537222)\n      c = md5hh(c, d, a, b, x[i + 3], 16, -722521979)\n      b = md5hh(b, c, d, a, x[i + 6], 23, 76029189)\n      a = md5hh(a, b, c, d, x[i + 9], 4, -640364487)\n      d = md5hh(d, a, b, c, x[i + 12], 11, -421815835)\n      c = md5hh(c, d, a, b, x[i + 15], 16, 530742520)\n      b = md5hh(b, c, d, a, x[i + 2], 23, -995338651)\n\n      a = md5ii(a, b, c, d, x[i], 6, -198630844)\n      d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415)\n      c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905)\n      b = md5ii(b, c, d, a, x[i + 5], 21, -57434055)\n      a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571)\n      d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606)\n      c = md5ii(c, d, a, b, x[i + 10], 15, -1051523)\n      b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799)\n      a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359)\n      d = md5ii(d, a, b, c, x[i + 15], 10, -30611744)\n      c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380)\n      b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649)\n      a = md5ii(a, b, c, d, x[i + 4], 6, -145523070)\n      d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379)\n      c = md5ii(c, d, a, b, x[i + 2], 15, 718787259)\n      b = md5ii(b, c, d, a, x[i + 9], 21, -343485551)\n\n      a = safeAdd(a, olda)\n      b = safeAdd(b, oldb)\n      c = safeAdd(c, oldc)\n      d = safeAdd(d, oldd)\n    }\n    return [a, b, c, d]\n  }\n\n  /*\n  * Convert an array of little-endian words to a string\n  */\n  function binl2rstr (input) {\n    var i\n    var output = ''\n    var length32 = input.length * 32\n    for (i = 0; i < length32; i += 8) {\n      output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff)\n    }\n    return output\n  }\n\n  /*\n  * Convert a raw string to an array of little-endian words\n  * Characters >255 have their high-byte silently ignored.\n  */\n  function rstr2binl (input) {\n    var i\n    var output = []\n    output[(input.length >> 2) - 1] = undefined\n    for (i = 0; i < output.length; i += 1) {\n      output[i] = 0\n    }\n    var length8 = input.length * 8\n    for (i = 0; i < length8; i += 8) {\n      output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32)\n    }\n    return output\n  }\n\n  /*\n  * Calculate the MD5 of a raw string\n  */\n  function rstrMD5 (s) {\n    return binl2rstr(binlMD5(rstr2binl(s), s.length * 8))\n  }\n\n  /*\n  * Calculate the HMAC-MD5, of a key and some data (raw strings)\n  */\n  function rstrHMACMD5 (key, data) {\n    var i\n    var bkey = rstr2binl(key)\n    var ipad = []\n    var opad = []\n    var hash\n    ipad[15] = opad[15] = undefined\n    if (bkey.length > 16) {\n      bkey = binlMD5(bkey, key.length * 8)\n    }\n    for (i = 0; i < 16; i += 1) {\n      ipad[i] = bkey[i] ^ 0x36363636\n      opad[i] = bkey[i] ^ 0x5c5c5c5c\n    }\n    hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8)\n    return binl2rstr(binlMD5(opad.concat(hash), 512 + 128))\n  }\n\n  /*\n  * Convert a raw string to a hex string\n  */\n  function rstr2hex (input) {\n    var hexTab = '0123456789abcdef'\n    var output = ''\n    var x\n    var i\n    for (i = 0; i < input.length; i += 1) {\n      x = input.charCodeAt(i)\n      output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f)\n    }\n    return output\n  }\n\n  /*\n  * Encode a string as utf-8\n  */\n  function str2rstrUTF8 (input) {\n    return unescape(encodeURIComponent(input))\n  }\n\n  /*\n  * Take string arguments and return either raw or hex encoded strings\n  */\n  function rawMD5 (s) {\n    return rstrMD5(str2rstrUTF8(s))\n  }\n  function hexMD5 (s) {\n    return rstr2hex(rawMD5(s))\n  }\n  function rawHMACMD5 (k, d) {\n    return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d))\n  }\n  function hexHMACMD5 (k, d) {\n    return rstr2hex(rawHMACMD5(k, d))\n  }\n\n  function md5 (string, key, raw) {\n    if (!key) {\n      if (!raw) {\n        return hexMD5(string)\n      }\n      return rawMD5(string)\n    }\n    if (!raw) {\n      return hexHMACMD5(key, string)\n    }\n    return rawHMACMD5(key, string)\n  }\n\n  if (typeof define === 'function' && define.amd) {\n    define(function () {\n      return md5\n    })\n  } else if (typeof module === 'object' && module.exports) {\n    module.exports = md5\n  } else {\n    $.md5 = md5\n  }\n})(this)\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/blueimp-md5/js/md5.js\n// module id = 5\n// module chunks = 0","import {Logger, StringUtils, Utils, ApiClientCommunication} from 'neo-common';\nimport {Communication} from 'neo-games';\nimport {ForceToolLayout, ForceToolUI, ForceToolUIState} from './ForceToolUI';\nimport {ForceToolApi} from './ForceToolApi';\nimport {ForceToolExternalSetup, ForceToolExternalSetupInfo, ForceToolSet} from './Types';\n\ntype ApiClientError = ApiClientCommunication.Types.ApiClientError;\ntype ResponseBase = ApiClientCommunication.ResponseBase;\ntype IRequest = Communication.Game.IRequest;\ntype SendRequestFunctionType = Communication.Game.SendRequestFunctionType;\ntype IGameClientInterceptor = Communication.Game.IGameClientInterceptor;\ntype InterceptorRequestContext = Communication.Game.InterceptorRequestContext;\nvar InitResponse = Communication.Game.InitResponse;\nvar GameResponse = Communication.Game.GameResponse;\nvar InitRequest = Communication.Game.InitRequest;\nvar SpinRequest = Communication.Game.SpinRequest;\nvar GameModules = Communication.Game.GameModules;\nvar CollectRequest = Communication.Game.CollectRequest;\n\nfunction logDebug(msg: string): void {\n    if (DEBUG) {\n        Logger.debugGroup('ForceToolInterceptor', msg);\n    }\n}\n\nfunction logError(msg: string): void {\n    if (DEBUG) {\n        Logger.errorGroup('ForceToolInterceptor', msg);\n    }\n}\n\nconst contextKeys = {\n    ForceSet: 'ForceSet',\n    ForceCommandIndex: 'ForceCommandIndex',\n    ForceUIDisabled: 'ForceUIDisabled'\n};\n\n@Communication.Game.gameClientInterceptor()\nexport class ForceToolInterceptor implements IGameClientInterceptor {\n    private _initialized: boolean;\n    private _externalSetupInfo: ForceToolExternalSetupInfo;\n    private _forceLayout: ForceToolLayout;\n\n    constructor() {\n        const self = this;\n        this._externalSetupInfo = null;\n        this._forceLayout = null;\n        const externalSetup: ForceToolExternalSetup = {\n            initialize: function (info: ForceToolExternalSetupInfo) {\n                self._externalSetupInfo = info;\n            }\n        };\n        window['ForceToolExternalSetup'] = externalSetup;\n    }\n\n    private get isEnabled(): boolean {\n        const query = URI().query(true);\n        let forceToolEnabled = Utils.asBool(Utils.valueOrDefault(query['force'], false));\n\n        if (forceToolEnabled !== true) {\n            const Symbol = window['Symbol'] as any;\n            if (typeof Symbol === 'function') {\n                // if Symbol is supported (newer browsers) check force flag here...\n                const forFn = Symbol.for;\n                if (typeof forFn === 'function') {\n                    const symbolVar = forFn('NeoForceToolEnabledSymbol');\n                    if (symbolVar) {\n                        const enabledValue = window[symbolVar];\n                        forceToolEnabled = Utils.asBool(Utils.valueOrDefault(enabledValue, false));\n                    }\n                }\n            }\n        }\n\n        if (forceToolEnabled) {\n            if (DEBUG) {\n                logDebug('Force tool is enabled in query string.');\n            }\n\n            const isForceToolEnabledInApp = this._externalSetupInfo ? this._externalSetupInfo.isForceToolEnabled : null;\n\n            if (Utils.isNullOrUndefined(isForceToolEnabledInApp)) {\n                if (DEBUG) {\n                    logDebug('Force tool will be disabled, app does not register callback to tell if forcetool can be enabled.');\n                }\n\n                forceToolEnabled = false;\n            } else {\n                forceToolEnabled = isForceToolEnabledInApp();\n\n                if (DEBUG) {\n                    const enabMsg = forceToolEnabled ? 'enabled' : 'disabled';\n                    logDebug(`Force tool will be ${enabMsg}, app callback returns that!`);\n                }\n            }\n        } else {\n            if (DEBUG) {\n                logDebug('Force tool is not enabled in query string!');\n            }\n        }\n\n        return forceToolEnabled;\n    }\n\n    private get layout(): ForceToolLayout {\n        if (this._forceLayout === null) {\n            let forceLayout = ForceToolLayout.Demo;\n\n            if (DEBUG) {\n                const query = URI().query(true);\n                const layout = Utils.valueOrDefault(query['force.layout'], ForceToolLayout.Demo);\n                if (Utils.valueIsIn(layout, [ForceToolLayout.Debug, ForceToolLayout.Demo, ForceToolLayout.DemoDebug])) {\n                    forceLayout = layout;\n                }\n            } else {\n                if (!Utils.isNullOrUndefined(this._externalSetupInfo)) {\n                    const demoDebugEnabled = this._externalSetupInfo.isForceToolDebugEnabled();\n                    forceLayout = demoDebugEnabled ? ForceToolLayout.DemoDebug : ForceToolLayout.Demo;\n                }\n            }\n\n            this._forceLayout = forceLayout;\n        }\n\n        return this._forceLayout;\n    }\n\n    private get initialized(): boolean {\n        return this._initialized;\n    }\n\n    private initialize(): Promise<void> {\n        const self = this;\n        return Promise.resolve()\n            .then(() => {\n                if (!self.initialized) {\n                    self._initialized = true;\n                    return ForceToolUI.initialize(self.layout, self._externalSetupInfo);\n                }\n            });\n    }\n\n    private force(context: InterceptorRequestContext): Promise<any> {\n        const self = this;\n        return this.initialize()\n            .then(ForceToolApi.getCurrentForceSet)\n            .then(forceSet => {\n                if (forceSet) {\n                    const msgHeader = `ForceSet[${forceSet.Name}/${forceSet.File}] `;\n                    const requestModule = context.module.toLowerCase();\n                    const requestAction = context.request.actionName().toLowerCase();\n                    const requestRoute = `${requestModule}/${requestAction}`;\n\n                    const commandIndex = ForceToolApi.getCurrentCommandIndex();\n                    if (forceSet.Commands && commandIndex > -1 && forceSet.Commands.length > commandIndex) {\n                        const command = forceSet.Commands[commandIndex];\n                        const commandIsValid = ForceToolApi.isValidForceCommand(command);\n\n                        if (commandIsValid) {\n                            const commandModule = command.Module;\n                            const commandHasModule = !StringUtils.isNullOrEmpty(commandModule);\n                            const commandAction = command.Action;\n                            const commandHasAction = !StringUtils.isNullOrEmpty(commandAction);\n                            const commandRoute = `${command.Module}/${command.Action}`.toLowerCase();\n\n                            let routeMatch = true;\n                            if (commandHasModule && commandHasAction) {\n                                routeMatch = requestRoute === commandRoute;\n                            } else if (!commandHasAction && commandHasModule) {\n                                routeMatch = requestModule === commandModule;\n                            } else if (!commandHasModule && commandHasAction) {\n                                routeMatch = requestAction === commandAction;\n                            }\n\n                            if (routeMatch) {\n                                if (StringUtils.isNullOrEmpty(command.Command)) {\n                                    if (DEBUG) {\n                                        logDebug(msgHeader + `Force command skipped, command at index (${commandIndex}) is empty.`);\n                                    }\n                                } else {\n                                    if (DEBUG) {\n                                        logDebug(msgHeader + `Sending force command [${command.Command}] to '${requestRoute}'`);\n                                    }\n\n                                    // Set force attribute on request to specified force set command\n                                    (context.request as any).force = command.Command;\n\n                                    // update interceptor request context to mark that for current request, force command was used.\n                                    context.context[contextKeys.ForceUIDisabled] = true;\n\n                                    ForceToolUI.updateState(ForceToolUIState.Disabled);\n                                }\n\n                                // update interceptor request context to mark that for current request, force command was used.\n                                context.context[contextKeys.ForceCommandIndex] = commandIndex;\n                                context.context[contextKeys.ForceSet] = forceSet;\n                            } else {\n                                if (DEBUG) {\n                                    logDebug(msgHeader + `Force command skipped, current route '${requestRoute}' does not match command's '${commandRoute}'.`);\n                                }\n                            }\n                        } else {\n                            if (DEBUG) {\n                                logError(msgHeader + `No force command was sent, command at index (${commandIndex}) points to invalid command data.`);\n                            }\n                        }\n                    } else {\n                        if (DEBUG) {\n                            const cmdCount = Utils.isNullOrUndefined(forceSet.Commands) ? 0 : forceSet.Commands.length;\n                            logError(msgHeader + `No force command was sent, command index (${commandIndex}) is out of range of force set (${cmdCount}) commands.`);\n                        }\n                    }\n                } else {\n                    if (DEBUG) {\n                        logDebug(`No force command to send, no force set is selected yet!`);\n                    }\n                }\n            });\n    }\n\n    public onSendGameRequest(context: InterceptorRequestContext, sendRequestFn: SendRequestFunctionType): Promise<any> {\n        return this.isEnabled\n            ? this.force(context)\n            : Promise.resolve();\n    }\n\n    public onRequestError(context: InterceptorRequestContext, clientError: ApiClientError): void {\n        const forceUIWasDisabled = Utils.valueOrDefault(context.context[contextKeys.ForceUIDisabled], false);\n        if (forceUIWasDisabled) {\n            // enable force UI on error!\n            ForceToolUI.updateState(ForceToolUIState.Enabled);\n            context.context[contextKeys.ForceUIDisabled] = false;\n        }\n    }\n\n    public onResponseReceived<TResponse extends ResponseBase>(context: InterceptorRequestContext, response: TResponse): Promise<any> {\n        return Promise.resolve();\n    }\n\n    public onSendGameRequestFinal(context: InterceptorRequestContext): void {\n        const forceCommandIndex = Utils.valueOrDefault(context.context[contextKeys.ForceCommandIndex], -1);\n        const forceSet = context.context[contextKeys.ForceSet] as ForceToolSet;\n        if (forceCommandIndex > -1 && !Utils.isNullOrUndefined(forceSet)) {\n            ForceToolUI.notifyCommandSent(forceSet, forceCommandIndex);\n        }\n\n        const forceUIWasDisabled = Utils.valueOrDefault(context.context[contextKeys.ForceUIDisabled], false);\n        if (forceUIWasDisabled) {\n            ForceToolUI.updateState(ForceToolUIState.Enabled);\n            context.context[contextKeys.ForceUIDisabled] = false;\n        }\n    }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/ForceToolInterceptor.ts","module.exports = __WEBPACK_EXTERNAL_MODULE_8__;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"NeoGames\"\n// module id = 8\n// module chunks = 0"],"sourceRoot":""}