From 780ad9a200763701053657911532b12922d96ae6 Mon Sep 17 00:00:00 2001 From: "|| Prof. - Xadk3!#0000 || @naryal2580" Date: Sun, 21 May 2023 16:28:12 +0530 Subject: [PATCH] add.[ALL] --- .resources/app/app_bootstrap/Constants.js | 37 + .resources/app/app_bootstrap/GPUSettings.js | 17 + .resources/app/app_bootstrap/appSettings.js | 19 + .resources/app/app_bootstrap/appUpdater.js | 55 ++ .../app/app_bootstrap/autoStart/darwin.js | 21 + .../app/app_bootstrap/autoStart/index.js | 3 + .../app/app_bootstrap/autoStart/linux.js | 71 ++ .../app/app_bootstrap/autoStart/win32.js | 55 ++ .resources/app/app_bootstrap/bootstrap.js | 167 ++++ .resources/app/app_bootstrap/buildInfo.js | 12 + .../app/app_bootstrap/data/quotes_copy.json | 14 + .resources/app/app_bootstrap/errorHandler.js | 85 ++ .../app/app_bootstrap/firstRun/darwin.js | 9 + .../app/app_bootstrap/firstRun/index.js | 3 + .../app/app_bootstrap/firstRun/linux.js | 9 + .../app/app_bootstrap/firstRun/win32.js | 75 ++ .resources/app/app_bootstrap/hostUpdater.js | 164 ++++ .../app_bootstrap/images/img_lucky_dice.png | Bin 0 -> 6378 bytes .resources/app/app_bootstrap/index.js | 39 + .../app/app_bootstrap/installDevTools.js | 19 + .resources/app/app_bootstrap/ipcMain.js | 13 + .resources/app/app_bootstrap/request.js | 162 ++++ .resources/app/app_bootstrap/requireNative.js | 5 + .../abddffb32a4a35627c3857a06c751424.png | Bin 0 -> 6378 bytes .../ac3f027697c11abd84295888e843f3d2.woff2 | Bin 0 -> 29668 bytes .../bf3d19297ef12291559b3edae977480c.woff2 | Bin 0 -> 30600 bytes .../app/app_bootstrap/splash/index.html | 11 + .resources/app/app_bootstrap/splash/index.js | 44 + .../app/app_bootstrap/splash/variables.json | 6 + .resources/app/app_bootstrap/splashScreen.js | 421 +++++++++ .../app/app_bootstrap/splashScreenPreload.js | 33 + .../app/app_bootstrap/squirrelUpdate.js | 189 ++++ .../app/app_bootstrap/startupMenu/darwin.js | 17 + .../app/app_bootstrap/startupMenu/index.js | 11 + .../app/app_bootstrap/startupMenu/linux.js | 17 + .../app/app_bootstrap/startupMenu/win32.js | 17 + .../app/app_bootstrap/videos/connecting.webm | Bin 0 -> 160381 bytes .../videos/connecting_halloween.webm | Bin 0 -> 137006 bytes .resources/app/app_bootstrap/windowsUtils.js | 76 ++ .resources/app/common/Backoff.js | 90 ++ .resources/app/common/FeatureFlags.js | 26 + .resources/app/common/Settings.js | 58 ++ .resources/app/common/crashReporterSetup.js | 101 ++ .resources/app/common/crashReporterUtils.js | 42 + .resources/app/common/moduleUpdater.js | 859 ++++++++++++++++++ .resources/app/common/nodeGlobalPaths.js | 31 + .resources/app/common/paths.js | 101 ++ .resources/app/common/processUtils.js | 51 ++ .resources/app/common/securityUtils.js | 42 + .resources/app/common/typings/global.d.ts | 14 + .resources/app/common/updater.js | 394 ++++++++ .resources/app/package.json | 17 + .resources/bootstrap/manifest.json | 7 + .resources/build_info.json | 4 + 54 files changed, 3733 insertions(+) create mode 100644 .resources/app/app_bootstrap/Constants.js create mode 100644 .resources/app/app_bootstrap/GPUSettings.js create mode 100644 .resources/app/app_bootstrap/appSettings.js create mode 100644 .resources/app/app_bootstrap/appUpdater.js create mode 100644 .resources/app/app_bootstrap/autoStart/darwin.js create mode 100644 .resources/app/app_bootstrap/autoStart/index.js create mode 100644 .resources/app/app_bootstrap/autoStart/linux.js create mode 100644 .resources/app/app_bootstrap/autoStart/win32.js create mode 100644 .resources/app/app_bootstrap/bootstrap.js create mode 100644 .resources/app/app_bootstrap/buildInfo.js create mode 100644 .resources/app/app_bootstrap/data/quotes_copy.json create mode 100644 .resources/app/app_bootstrap/errorHandler.js create mode 100644 .resources/app/app_bootstrap/firstRun/darwin.js create mode 100644 .resources/app/app_bootstrap/firstRun/index.js create mode 100644 .resources/app/app_bootstrap/firstRun/linux.js create mode 100644 .resources/app/app_bootstrap/firstRun/win32.js create mode 100644 .resources/app/app_bootstrap/hostUpdater.js create mode 100644 .resources/app/app_bootstrap/images/img_lucky_dice.png create mode 100644 .resources/app/app_bootstrap/index.js create mode 100644 .resources/app/app_bootstrap/installDevTools.js create mode 100644 .resources/app/app_bootstrap/ipcMain.js create mode 100644 .resources/app/app_bootstrap/request.js create mode 100644 .resources/app/app_bootstrap/requireNative.js create mode 100644 .resources/app/app_bootstrap/splash/abddffb32a4a35627c3857a06c751424.png create mode 100644 .resources/app/app_bootstrap/splash/ac3f027697c11abd84295888e843f3d2.woff2 create mode 100644 .resources/app/app_bootstrap/splash/bf3d19297ef12291559b3edae977480c.woff2 create mode 100644 .resources/app/app_bootstrap/splash/index.html create mode 100644 .resources/app/app_bootstrap/splash/index.js create mode 100644 .resources/app/app_bootstrap/splash/variables.json create mode 100644 .resources/app/app_bootstrap/splashScreen.js create mode 100644 .resources/app/app_bootstrap/splashScreenPreload.js create mode 100644 .resources/app/app_bootstrap/squirrelUpdate.js create mode 100644 .resources/app/app_bootstrap/startupMenu/darwin.js create mode 100644 .resources/app/app_bootstrap/startupMenu/index.js create mode 100644 .resources/app/app_bootstrap/startupMenu/linux.js create mode 100644 .resources/app/app_bootstrap/startupMenu/win32.js create mode 100644 .resources/app/app_bootstrap/videos/connecting.webm create mode 100755 .resources/app/app_bootstrap/videos/connecting_halloween.webm create mode 100644 .resources/app/app_bootstrap/windowsUtils.js create mode 100644 .resources/app/common/Backoff.js create mode 100644 .resources/app/common/FeatureFlags.js create mode 100644 .resources/app/common/Settings.js create mode 100644 .resources/app/common/crashReporterSetup.js create mode 100644 .resources/app/common/crashReporterUtils.js create mode 100644 .resources/app/common/moduleUpdater.js create mode 100644 .resources/app/common/nodeGlobalPaths.js create mode 100644 .resources/app/common/paths.js create mode 100644 .resources/app/common/processUtils.js create mode 100644 .resources/app/common/securityUtils.js create mode 100644 .resources/app/common/typings/global.d.ts create mode 100644 .resources/app/common/updater.js create mode 100644 .resources/app/package.json create mode 100644 .resources/bootstrap/manifest.json create mode 100644 .resources/build_info.json diff --git a/.resources/app/app_bootstrap/Constants.js b/.resources/app/app_bootstrap/Constants.js new file mode 100644 index 0000000..a02c6e8 --- /dev/null +++ b/.resources/app/app_bootstrap/Constants.js @@ -0,0 +1,37 @@ +"use strict"; + +var _appSettings = require("./appSettings"); +// bootstrap constants +// after startup, these constants will be merged into core module constants +// since they are used in both locations (see app/Constants.js) + +const { + releaseChannel +} = require('./buildInfo'); +const settings = (0, _appSettings.getSettings)(); +function capitalizeFirstLetter(s) { + return s.charAt(0).toUpperCase() + s.slice(1); +} +const appNameSuffix = releaseChannel === 'stable' ? '' : capitalizeFirstLetter(releaseChannel); +const APP_COMPANY = 'Discord Inc'; +const APP_DESCRIPTION = 'Discord - https://discord.com'; +const APP_NAME = 'Discord' + appNameSuffix; +const APP_NAME_FOR_HUMANS = 'Discord' + (appNameSuffix !== '' ? ' ' + appNameSuffix : ''); +const APP_ID_BASE = 'com.squirrel'; +const APP_ID = `${APP_ID_BASE}.${APP_NAME}.${APP_NAME}`; +const APP_PROTOCOL = 'Discord'; +const API_ENDPOINT = settings.get('API_ENDPOINT') || 'https://discord.com/api'; +const UPDATE_ENDPOINT = settings.get('UPDATE_ENDPOINT') || API_ENDPOINT; +const NEW_UPDATE_ENDPOINT = settings.get('NEW_UPDATE_ENDPOINT') || 'https://updates.discord.com/'; +const bootstrapConstants = { + APP_COMPANY, + APP_DESCRIPTION, + APP_NAME, + APP_NAME_FOR_HUMANS, + APP_ID, + APP_PROTOCOL, + API_ENDPOINT, + NEW_UPDATE_ENDPOINT, + UPDATE_ENDPOINT +}; +module.exports = bootstrapConstants; \ No newline at end of file diff --git a/.resources/app/app_bootstrap/GPUSettings.js b/.resources/app/app_bootstrap/GPUSettings.js new file mode 100644 index 0000000..f208526 --- /dev/null +++ b/.resources/app/app_bootstrap/GPUSettings.js @@ -0,0 +1,17 @@ +"use strict"; + +// this file is here for two reasons: +// 1. web requires ./GPUSettings file from electron app (bad!), and requires are +// relative to process.main (bootstrap's index.js) +// 2. GPUSettings has been refactored into GPUSettings, and because we want to +// be able to update GPUSettings OTA, we will have the core module provide +// us with the GPUSettings +// so tl;dr this is core module's GPUSettings, providing compat for web + +exports.replace = function (GPUSettings) { + // replacing module.exports directly would have no effect, since requires are cached + // so we mutate the existing object + for (const name of Object.keys(GPUSettings)) { + exports[name] = GPUSettings[name]; + } +}; \ No newline at end of file diff --git a/.resources/app/app_bootstrap/appSettings.js b/.resources/app/app_bootstrap/appSettings.js new file mode 100644 index 0000000..f0fc965 --- /dev/null +++ b/.resources/app/app_bootstrap/appSettings.js @@ -0,0 +1,19 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getSettings = getSettings; +exports.init = init; +var _Settings = _interopRequireDefault(require("../common/Settings")); +var paths = _interopRequireWildcard(require("../common/paths")); +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +let settings; +function init() { + settings = new _Settings.default(paths.getUserData()); +} +function getSettings() { + return settings; +} \ No newline at end of file diff --git a/.resources/app/app_bootstrap/appUpdater.js b/.resources/app/app_bootstrap/appUpdater.js new file mode 100644 index 0000000..1941c1c --- /dev/null +++ b/.resources/app/app_bootstrap/appUpdater.js @@ -0,0 +1,55 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.focusSplash = focusSplash; +exports.update = update; +var _fs = _interopRequireDefault(require("fs")); +var _path = _interopRequireDefault(require("path")); +var moduleUpdater = _interopRequireWildcard(require("../common/moduleUpdater")); +var paths = _interopRequireWildcard(require("../common/paths")); +var _updater = require("../common/updater"); +var _appSettings = require("./appSettings"); +var autoStart = _interopRequireWildcard(require("./autoStart")); +var _buildInfo = _interopRequireDefault(require("./buildInfo")); +var _errorHandler = require("./errorHandler"); +var firstRun = _interopRequireWildcard(require("./firstRun")); +var splashScreen = _interopRequireWildcard(require("./splashScreen")); +var _Constants = require("./Constants"); +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +// settings +const USE_PINNED_UPDATE_MANIFEST = 'USE_PINNED_UPDATE_MANIFEST'; +function update(startMinimized, doneCallback, showCallback) { + const settings = (0, _appSettings.getSettings)(); + if ((0, _updater.tryInitUpdater)(_buildInfo.default, _Constants.NEW_UPDATE_ENDPOINT)) { + const updater = (0, _updater.getUpdater)(); + const usePinnedUpdateManifest = settings.get(USE_PINNED_UPDATE_MANIFEST); + updater.on('host-updated', () => { + autoStart.update(() => {}); + }); + updater.on('unhandled-exception', _errorHandler.fatal); + updater.on(_updater.INCONSISTENT_INSTALLER_STATE_ERROR, _errorHandler.fatal); + updater.on('update-error', _errorHandler.handled); + updater.on('starting-new-host', () => { + // dont run stale launch events--the host we're updating to will run its own callbacks + splashScreen.events.removeListener(splashScreen.APP_SHOULD_LAUNCH, doneCallback); + splashScreen.events.removeListener(splashScreen.APP_SHOULD_SHOW, showCallback); + }); + if (usePinnedUpdateManifest) { + const manifestPath = _path.default.join(paths.getUserData(), 'pinned_update.json'); + updater.setPinnedManifestSync(JSON.parse(_fs.default.readFileSync(manifestPath))); + } + firstRun.performFirstRunTasks(updater); + } else { + moduleUpdater.init(_Constants.UPDATE_ENDPOINT, settings, _buildInfo.default); + } + splashScreen.initSplash(startMinimized); + splashScreen.events.once(splashScreen.APP_SHOULD_LAUNCH, doneCallback); + splashScreen.events.once(splashScreen.APP_SHOULD_SHOW, showCallback); +} +function focusSplash() { + splashScreen.focusWindow(); +} \ No newline at end of file diff --git a/.resources/app/app_bootstrap/autoStart/darwin.js b/.resources/app/app_bootstrap/autoStart/darwin.js new file mode 100644 index 0000000..1e2ca29 --- /dev/null +++ b/.resources/app/app_bootstrap/autoStart/darwin.js @@ -0,0 +1,21 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.install = install; +exports.isInstalled = isInstalled; +exports.uninstall = uninstall; +exports.update = update; +function install(callback) { + return callback(); +} +function update(callback) { + return callback(); +} +function isInstalled(callback) { + return callback(false); +} +function uninstall(callback) { + return callback(); +} \ No newline at end of file diff --git a/.resources/app/app_bootstrap/autoStart/index.js b/.resources/app/app_bootstrap/autoStart/index.js new file mode 100644 index 0000000..9264bb8 --- /dev/null +++ b/.resources/app/app_bootstrap/autoStart/index.js @@ -0,0 +1,3 @@ +"use strict"; + +module.exports = require('./' + process.platform); \ No newline at end of file diff --git a/.resources/app/app_bootstrap/autoStart/linux.js b/.resources/app/app_bootstrap/autoStart/linux.js new file mode 100644 index 0000000..8515689 --- /dev/null +++ b/.resources/app/app_bootstrap/autoStart/linux.js @@ -0,0 +1,71 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.install = install; +exports.isInstalled = isInstalled; +exports.uninstall = uninstall; +exports.update = update; +var _fs = _interopRequireDefault(require("fs")); +var _path = _interopRequireDefault(require("path")); +var _electron = require("electron"); +var _buildInfo = _interopRequireDefault(require("../buildInfo")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +// TODO: We should use Constant's APP_NAME, but only once +// we set up backwards compat with this. +const appName = _path.default.basename(process.execPath, '.exe'); +const exePath = _electron.app.getPath('exe'); +const exeDir = _path.default.dirname(exePath); +const iconPath = _path.default.join(exeDir, 'discord.png'); +const autostartDir = _path.default.join(_electron.app.getPath('appData'), 'autostart'); +const electronAppName = _electron.app.name ? _electron.app.name : _electron.app.getName(); +const autostartFileName = _path.default.join(autostartDir, electronAppName + '-' + _buildInfo.default.releaseChannel + '.desktop'); +const desktopFile = `[Desktop Entry] +Type=Application +Exec=${exePath} +Hidden=false +NoDisplay=false +Name=${appName} +Icon=${iconPath} +Comment=Text and voice chat for gamers. +X-GNOME-Autostart-enabled=true +`; +function ensureDir() { + try { + _fs.default.mkdirSync(autostartDir); + return true; + } catch (e) { + // catch for when it already exists. + } + return false; +} +function install(callback) { + // TODO: This could fail. We should read its return value + ensureDir(); + try { + return _fs.default.writeFile(autostartFileName, desktopFile, callback); + } catch (e) { + // I guess we don't autostart then + return callback(); + } +} +function update(callback) { + // TODO: We might need to implement this later on + return callback(); +} +function isInstalled(callback) { + try { + _fs.default.stat(autostartFileName, (err, stats) => { + if (err) { + return callback(false); + } + return callback(stats.isFile()); + }); + } catch (e) { + return callback(false); + } +} +function uninstall(callback) { + return _fs.default.unlink(autostartFileName, callback); +} \ No newline at end of file diff --git a/.resources/app/app_bootstrap/autoStart/win32.js b/.resources/app/app_bootstrap/autoStart/win32.js new file mode 100644 index 0000000..252ed9a --- /dev/null +++ b/.resources/app/app_bootstrap/autoStart/win32.js @@ -0,0 +1,55 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.install = install; +exports.isInstalled = isInstalled; +exports.uninstall = uninstall; +exports.update = update; +var _path = _interopRequireDefault(require("path")); +var windowsUtils = _interopRequireWildcard(require("../windowsUtils")); +var _appSettings = require("../appSettings"); +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +const settings = (0, _appSettings.getSettings)(); + +// TODO: We should use Constant's APP_NAME, but only once +// we set up backwards compat with this. +const appName = _path.default.basename(process.execPath, '.exe'); +const fullExeName = _path.default.basename(process.execPath); +const updatePath = _path.default.join(_path.default.dirname(process.execPath), '..', 'Update.exe'); +function install(callback) { + const startMinimized = settings.get('START_MINIMIZED', false); + let execPath = `"${updatePath}" --processStart ${fullExeName}`; + if (startMinimized) { + execPath = `${execPath} --process-start-args --start-minimized`; + } + const queue = [['HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run', '/v', appName, '/d', execPath]]; + windowsUtils.addToRegistry(queue, callback); +} +function update(callback) { + isInstalled(installed => { + if (installed) { + install(callback); + } else { + callback(); + } + }); +} +function isInstalled(callback) { + const queryValue = ['HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run', '/v', appName]; + queryValue.unshift('query'); + windowsUtils.spawnReg(queryValue, (error, stdout) => { + const doesOldKeyExist = stdout.indexOf(appName) >= 0; + callback(doesOldKeyExist); + }); +} +function uninstall(callback) { + const queryValue = ['HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run', '/v', appName, '/f']; + queryValue.unshift('delete'); + windowsUtils.spawnReg(queryValue, (error, stdout) => { + callback(); + }); +} \ No newline at end of file diff --git a/.resources/app/app_bootstrap/bootstrap.js b/.resources/app/app_bootstrap/bootstrap.js new file mode 100644 index 0000000..a071f40 --- /dev/null +++ b/.resources/app/app_bootstrap/bootstrap.js @@ -0,0 +1,167 @@ +"use strict"; + +// bootstrap, or what runs before the rest of desktop does +// responsible for handling updates and updating modules before continuing startup + +if (process.platform === 'linux') { + // Some people are reporting audio problems on Linux that are fixed by setting + // an environment variable PULSE_LATENCY_MSEC=30 -- the "real" fix is to see + // what conditions require this and set this then (also to set it directly in + // our webrtc setup code rather than here) but this should fix the bug for now. + if (process.env.PULSE_LATENCY_MSEC === undefined) { + process.env.PULSE_LATENCY_MSEC = 30; + } +} +const { + app, + Menu +} = require('electron'); +const sentry = require('@sentry/node'); +const buildInfo = require('./buildInfo'); +app.setVersion(buildInfo.version); + +// expose releaseChannel to a global, since it's used by splash screen +global.releaseChannel = buildInfo.releaseChannel; +const errorHandler = require('./errorHandler'); +errorHandler.init(); +const crashReporterSetup = require('../common/crashReporterSetup'); +crashReporterSetup.init(buildInfo, sentry); +const paths = require('../common/paths'); +paths.init(buildInfo); +global.moduleDataPath = paths.getModuleDataPath(); +const appSettings = require('./appSettings'); +appSettings.init(); +const Constants = require('./Constants'); +const GPUSettings = require('./GPUSettings'); +function setupHardwareAcceleration() { + const settings = appSettings.getSettings(); + // TODO: this is a copy of gpuSettings.getEnableHardwareAcceleration + if (!settings.get('enableHardwareAcceleration', true)) { + app.disableHardwareAcceleration(); + } +} +setupHardwareAcceleration(); + +// [adill] work around chrome 66 disabling autoplay by default +app.commandLine.appendSwitch('autoplay-policy', 'no-user-gesture-required'); + +// WinRetrieveSuggestionsOnlyOnDemand: Work around electron 13 bug w/ async spellchecking on Windows. +// HardwareMediaKeyHandling,MediaSessionService: Prevent Discord from registering as a media service. +app.commandLine.appendSwitch('disable-features', 'WinRetrieveSuggestionsOnlyOnDemand,HardwareMediaKeyHandling,MediaSessionService'); +function hasArgvFlag(flag) { + return (process.argv || []).slice(1).includes(flag); +} +console.log(`${Constants.APP_NAME} ${app.getVersion()}`); +let pendingAppQuit = false; +if (process.platform === 'win32') { + // this tells Windows (in particular Windows 10) which icon to associate your app with, important for correctly + // pinning app to task bar. + app.setAppUserModelId(Constants.APP_ID); + const { + handleStartupEvent + } = require('./squirrelUpdate'); + // TODO: Isn't using argv[1] fragile? + const squirrelCommand = process.argv[1]; + // TODO: Is protocol case sensitive? + if (handleStartupEvent(Constants.APP_PROTOCOL, app, squirrelCommand)) { + pendingAppQuit = true; + } +} +const appUpdater = require('./appUpdater'); +const moduleUpdater = require('../common/moduleUpdater'); +const updater = require('../common/updater'); +const splashScreen = require('./splashScreen'); +const autoStart = require('./autoStart'); +const requireNative = require('./requireNative'); +let coreModule; +const allowMultipleInstances = hasArgvFlag('--multi-instance'); +const isFirstInstance = allowMultipleInstances ? true : app.requestSingleInstanceLock(); +function extractUrlFromArgs(args) { + const urlArgIndex = args.indexOf('--url'); + if (urlArgIndex < 0) { + return null; + } + const passThroughArgsIndex = args.indexOf('--'); + if (passThroughArgsIndex < 0 || passThroughArgsIndex < urlArgIndex) { + return null; + } + const url = args[passThroughArgsIndex + 1]; + if (url == null) { + return null; + } + return url; +} +let initialUrl = extractUrlFromArgs(process.argv); +if (!allowMultipleInstances) { + app.on('second-instance', (_event, args, _workingDirectory) => { + if (args != null && args.indexOf('--squirrel-uninstall') > -1) { + app.quit(); + return; + } + const url = extractUrlFromArgs(args); + if (coreModule) { + // url can be null, as a user opening the executable again will focus the app from background + coreModule.handleOpenUrl(url); + } else if (url != null) { + initialUrl = url; + } + if (!coreModule) { + appUpdater.focusSplash(); + } + }); +} +app.on('will-finish-launching', () => { + // on macos protocol links are handled entirely through this event + app.on('open-url', (event, url) => { + event.preventDefault(); + if (coreModule) { + coreModule.handleOpenUrl(url); + } else { + initialUrl = url; + } + }); +}); +function startUpdate() { + console.log('Starting updater.'); + const startMinimized = hasArgvFlag('--start-minimized'); + appUpdater.update(startMinimized, () => { + try { + coreModule = requireNative('discord_desktop_core'); + coreModule.startup({ + paths, + splashScreen, + moduleUpdater, + autoStart, + buildInfo, + appSettings, + Constants, + GPUSettings, + updater, + crashReporterSetup + }); + if (initialUrl != null) { + coreModule.handleOpenUrl(initialUrl); + initialUrl = null; + } + } catch (err) { + return errorHandler.fatal(err); + } + }, () => { + coreModule.setMainWindowVisible(!startMinimized); + }); +} +function startApp() { + console.log('Starting app.'); + paths.cleanOldVersions(buildInfo); + const startupMenu = require('./startupMenu'); + Menu.setApplicationMenu(startupMenu); + startUpdate(); +} +if (pendingAppQuit) { + console.log('Startup prevented.'); +} else if (!isFirstInstance && !allowMultipleInstances) { + console.log('Quitting secondary instance.'); + app.quit(); +} else { + app.whenReady().then(() => startApp()); +} \ No newline at end of file diff --git a/.resources/app/app_bootstrap/buildInfo.js b/.resources/app/app_bootstrap/buildInfo.js new file mode 100644 index 0000000..662e074 --- /dev/null +++ b/.resources/app/app_bootstrap/buildInfo.js @@ -0,0 +1,12 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _path = _interopRequireDefault(require("path")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +const buildInfo = require(_path.default.join(process.resourcesPath, 'build_info.json')); +var _default = buildInfo; +exports.default = _default; +module.exports = exports.default; \ No newline at end of file diff --git a/.resources/app/app_bootstrap/data/quotes_copy.json b/.resources/app/app_bootstrap/data/quotes_copy.json new file mode 100644 index 0000000..fc33384 --- /dev/null +++ b/.resources/app/app_bootstrap/data/quotes_copy.json @@ -0,0 +1,14 @@ +[ + "Upsorbing the Contents", + "Additive Parsing the Load", + "Commence Monosaturated Goodening", + "Kick Off the Multi-Core Widening", + "Bastening the Game Turkey", + "Abstracting the Rummage Disc", + "Undecerealenizing the Process", + "Postrefragmenting the Widget Layer", + "Satisfying the Constraints", + "Abnoramalzing Some of the Matrices", + "Optimizing the People", + "Proclaigerizing the Network" +] diff --git a/.resources/app/app_bootstrap/errorHandler.js b/.resources/app/app_bootstrap/errorHandler.js new file mode 100644 index 0000000..669057d --- /dev/null +++ b/.resources/app/app_bootstrap/errorHandler.js @@ -0,0 +1,85 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.fatal = fatal; +exports.handled = handled; +exports.init = init; +var Sentry = _interopRequireWildcard(require("@sentry/node")); +var _electron = require("electron"); +var _process = _interopRequireDefault(require("process")); +var _crashReporterSetup = require("../common/crashReporterSetup"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +const HANDLED_ERROR_INTERVAL = 3; +const HANDLED_ERROR_LIMIT = 10; +let handledErrorCounter = 0; +let totalHandledErrors = 0; +const consoleOutputOnly = _process.default.env.DISCORD_TEST != null; +function isErrorSafeToSuppress(error) { + return /attempting to call a function in a renderer window/i.test(error.message); +} +function captureJSException(error) { + Sentry.captureException(error, scope => { + scope.clear(); + scope.setTag('nativeBuildNumber', _crashReporterSetup.metadata.nativeBuildNumber); + scope.setUser(_crashReporterSetup.metadata.sentry.user); + scope.setExtras({ + environment: _crashReporterSetup.metadata.sentry.environment, + release: _crashReporterSetup.metadata.sentry.release, + nativeBuildNumber: _crashReporterSetup.metadata.nativeBuildNumber + }); + return scope; + }); +} +function init() { + _process.default.on('uncaughtException', error => { + const stack = error.stack ? error.stack : String(error); + const message = `Uncaught exception:\n ${stack}`; + console.warn(message); + captureJSException(error); + if (!isErrorSafeToSuppress(error)) { + if (consoleOutputOnly) { + console.error(`${message} error: ${error}`); + _process.default.exit(-1); + } + _electron.dialog.showErrorBox('A JavaScript error occurred in the main process', message); + } + }); +} + +// show a similar error message to the error handler, except exit out the app +// after the error message has been closed +function fatal(err) { + const options = { + type: 'error', + message: 'A fatal Javascript error occured', + detail: err && err.stack ? err.stack : String(err) + }; + if (consoleOutputOnly) { + console.error(`fatal: ${err}\n${err === null || err === void 0 ? void 0 : err.stack}`); + _process.default.exit(-1); + } + const callback = _ => _electron.app.quit(); + const electronMajor = parseInt(_process.default.versions.electron.split('.')[0]); + if (electronMajor >= 6) { + _electron.dialog.showMessageBox(null, options).then(callback); + } else { + _electron.dialog.showMessageBox(options, callback); + } + captureJSException(err); +} + +// capture a handled error for telemetry purposes, e.g. finding update loops. +function handled(err) { + if (global.releaseChannel !== 'ptb' && global.releaseChannel !== 'canary' && global.releaseChannel !== 'development') { + return; + } + if (totalHandledErrors < HANDLED_ERROR_LIMIT && handledErrorCounter++ % HANDLED_ERROR_INTERVAL == 0) { + console.warn('Reporting non-fatal error', err); + captureJSException(err); + totalHandledErrors++; + } +} \ No newline at end of file diff --git a/.resources/app/app_bootstrap/firstRun/darwin.js b/.resources/app/app_bootstrap/firstRun/darwin.js new file mode 100644 index 0000000..e261191 --- /dev/null +++ b/.resources/app/app_bootstrap/firstRun/darwin.js @@ -0,0 +1,9 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.performFirstRunTasks = performFirstRunTasks; +function performFirstRunTasks(_updater) { + // +} \ No newline at end of file diff --git a/.resources/app/app_bootstrap/firstRun/index.js b/.resources/app/app_bootstrap/firstRun/index.js new file mode 100644 index 0000000..9264bb8 --- /dev/null +++ b/.resources/app/app_bootstrap/firstRun/index.js @@ -0,0 +1,3 @@ +"use strict"; + +module.exports = require('./' + process.platform); \ No newline at end of file diff --git a/.resources/app/app_bootstrap/firstRun/linux.js b/.resources/app/app_bootstrap/firstRun/linux.js new file mode 100644 index 0000000..e261191 --- /dev/null +++ b/.resources/app/app_bootstrap/firstRun/linux.js @@ -0,0 +1,9 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.performFirstRunTasks = performFirstRunTasks; +function performFirstRunTasks(_updater) { + // +} \ No newline at end of file diff --git a/.resources/app/app_bootstrap/firstRun/win32.js b/.resources/app/app_bootstrap/firstRun/win32.js new file mode 100644 index 0000000..b61ee3a --- /dev/null +++ b/.resources/app/app_bootstrap/firstRun/win32.js @@ -0,0 +1,75 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.performFirstRunTasks = performFirstRunTasks; +var _fs = _interopRequireDefault(require("fs")); +var _path = _interopRequireDefault(require("path")); +var paths = _interopRequireWildcard(require("../../common/paths")); +var _errorHandler = require("../errorHandler"); +var _squirrelUpdate = require("../squirrelUpdate"); +var _Constants = require("../Constants"); +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +const appFolder = _path.default.resolve(process.execPath, '..'); +const rootFolder = _path.default.resolve(appFolder, '..'); +const exeName = _path.default.basename(process.execPath); +const updateExe = _path.default.join(rootFolder, 'Update.exe'); +function copyIconToRoot() { + const icoSrc = _path.default.join(appFolder, 'app.ico'); + const icoDest = _path.default.join(rootFolder, 'app.ico'); + try { + const ico = _fs.default.readFileSync(icoSrc); + _fs.default.writeFileSync(icoDest, ico); + return icoDest; + } catch (e) { + return icoSrc; + } +} +function updateShortcuts(updater) { + const shortcutFileName = `${_Constants.APP_NAME_FOR_HUMANS}.lnk`; + const shortcutPaths = [_path.default.join(updater.getKnownFolder('desktop'), shortcutFileName), _path.default.join(updater.getKnownFolder('programs'), _Constants.APP_COMPANY, shortcutFileName)]; + const iconPath = copyIconToRoot(); + for (const shortcutPath of shortcutPaths) { + if (!_fs.default.existsSync(shortcutPath)) { + // If the user deleted the shortcut, don't recreate it. + continue; + } + updater.createShortcut({ + /* eslint-disable camelcase */ + target_path: updateExe, + shortcut_path: shortcutPath, + arguments: `--processStart ${exeName}`, + icon_path: iconPath, + icon_index: 0, + description: _Constants.APP_DESCRIPTION, + app_user_model_id: _Constants.APP_ID, + working_directory: appFolder + /* eslint-enable camelcase */ + }); + } +} + +function performFirstRunTasks(updater) { + const firstRunCompletePath = _path.default.join(paths.getUserDataVersioned(), '.first-run'); + if (!_fs.default.existsSync(firstRunCompletePath)) { + let updatedShortcuts = false; + try { + updateShortcuts(updater); + updatedShortcuts = true; + } catch (e) { + (0, _errorHandler.handled)(e); + } + (0, _squirrelUpdate.installProtocol)(_Constants.APP_PROTOCOL, () => { + try { + if (updatedShortcuts) { + _fs.default.writeFileSync(firstRunCompletePath, 'true'); + } + } catch (e) { + (0, _errorHandler.handled)(e); + } + }); + } +} \ No newline at end of file diff --git a/.resources/app/app_bootstrap/hostUpdater.js b/.resources/app/app_bootstrap/hostUpdater.js new file mode 100644 index 0000000..a55e3ce --- /dev/null +++ b/.resources/app/app_bootstrap/hostUpdater.js @@ -0,0 +1,164 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _electron = require("electron"); +var _events = require("events"); +var _request = _interopRequireDefault(require("./request")); +var squirrelUpdate = _interopRequireWildcard(require("./squirrelUpdate")); +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/* eslint-disable no-console */ + +function versionParse(verString) { + return verString.split('.').map(i => parseInt(i)); +} +function versionNewer(verA, verB) { + let i = 0; + while (true) { + const a = verA[i]; + const b = verB[i]; + i++; + if (a === undefined) { + return false; + } else { + if (b === undefined || a > b) { + return true; + } + if (a < b) { + return false; + } + } + } +} +class AutoUpdaterWin32 extends _events.EventEmitter { + constructor() { + super(); + this.updateUrl = null; + this.updateVersion = null; + } + setFeedURL(updateUrl) { + this.updateUrl = updateUrl; + } + quitAndInstall() { + if (squirrelUpdate.updateExistsSync()) { + squirrelUpdate.restart(_electron.app, this.updateVersion ?? _electron.app.getVersion()); + } else { + /* eslint-disable-next-line */ + require('auto-updater').quitAndInstall(); + } + } + downloadAndInstallUpdate(callback) { + squirrelUpdate.spawnUpdateInstall(this.updateUrl, progress => { + this.emit('update-progress', progress); + }).catch(err => callback(err)).then(() => callback()); + } + checkForUpdates() { + if (this.updateUrl == null) { + throw new Error('Update URL is not set'); + } + this.emit('checking-for-update'); + if (!squirrelUpdate.updateExistsSync()) { + this.emit('update-not-available'); + return; + } + squirrelUpdate.spawnUpdate(['--check', this.updateUrl], (error, stdout) => { + if (error != null) { + this.emit('error', error); + return; + } + try { + // Last line of the output is JSON details about the releases + const json = stdout.trim().split('\n').pop(); + const releasesFound = JSON.parse(json).releasesToApply; + if (releasesFound == null || releasesFound.length === 0) { + this.emit('update-not-available'); + return; + } + const update = releasesFound.pop(); + this.emit('update-available'); + this.downloadAndInstallUpdate(error => { + if (error != null) { + this.emit('error', error); + return; + } + this.updateVersion = update.version; + this.emit('update-downloaded', {}, update.release, update.version, new Date(), this.updateUrl, this.quitAndInstall.bind(this)); + }); + } catch (error) { + error.stdout = stdout; + this.emit('error', error); + } + }); + } +} + +// todo +class AutoUpdaterLinux extends _events.EventEmitter { + constructor() { + super(); + this.updateUrl = null; + } + setFeedURL(url) { + this.updateUrl = url; + } + quitAndInstall() { + // Just restart. The splash screen will hit the update manually state and + // prompt the user to download the new package. + _electron.app.relaunch(); + _electron.app.quit(); + } + async checkForUpdates() { + const currVersion = versionParse(_electron.app.getVersion()); + this.emit('checking-for-update'); + try { + const response = await _request.default.get(this.updateUrl); + if (response.statusCode === 204) { + // you are up to date + this.emit('update-not-available'); + return; + } + let latestVerStr = ''; + let latestVersion = []; + try { + const latestMetadata = JSON.parse(response.body); + latestVerStr = latestMetadata.name; + latestVersion = versionParse(latestVerStr); + } catch (_) {} + if (versionNewer(latestVersion, currVersion)) { + console.log('[Updates] You are out of date!'); + // you need to update + this.emit('update-manually', latestVerStr); + } else { + console.log('[Updates] You are living in the future!'); + this.emit('update-not-available'); + } + } catch (err) { + console.error('[Updates] Error fetching ' + this.updateUrl + ': ' + err.message); + this.emit('error', err); + } + } +} +let autoUpdater; + +// TODO +// events: checking-for-update, update-available, update-not-available, update-manually, update-downloaded, error +// also, checkForUpdates, setFeedURL, quitAndInstall +// also, see electron.autoUpdater, and its API +switch (process.platform) { + case 'darwin': + autoUpdater = require('electron').autoUpdater; + break; + case 'win32': + autoUpdater = new AutoUpdaterWin32(); + break; + case 'linux': + autoUpdater = new AutoUpdaterLinux(); + break; +} +var _default = autoUpdater; +exports.default = _default; +module.exports = exports.default; \ No newline at end of file diff --git a/.resources/app/app_bootstrap/images/img_lucky_dice.png b/.resources/app/app_bootstrap/images/img_lucky_dice.png new file mode 100644 index 0000000000000000000000000000000000000000..909b7290936c50e51226b0661d686d21c207b749 GIT binary patch literal 6378 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 literal 0 HcmV?d00001 diff --git a/.resources/app/app_bootstrap/index.js b/.resources/app/app_bootstrap/index.js new file mode 100644 index 0000000..e24cc86 --- /dev/null +++ b/.resources/app/app_bootstrap/index.js @@ -0,0 +1,39 @@ +"use strict"; + +const buildInfo = require('./buildInfo'); +const paths = require('../common/paths'); +paths.init(buildInfo); +const moduleUpdater = require('../common/moduleUpdater'); +const updater = require('../common/updater'); +const requireNative = require('./requireNative'); +function getAppMode() { + if (process.argv && process.argv.includes('--overlay-host')) { + return 'overlay-host'; + } + return 'app'; +} +const mode = getAppMode(); +if (mode === 'app') { + require('./bootstrap'); +} else if (mode === 'overlay-host') { + // Initialize the update system just enough to find installed native modules. + const appSettings = require('./appSettings'); + appSettings.init(); + const { + NEW_UPDATE_ENDPOINT + } = require('./Constants'); + if (buildInfo.newUpdater) { + if (!updater.tryInitUpdater(buildInfo, NEW_UPDATE_ENDPOINT)) { + throw new Error('Failed to initialize modules in overlay host.'); + } + + // Load the module search path but if there's a pending host update, don't + // restart into it. + updater.getUpdater().startCurrentVersionSync({ + allowObsoleteHost: true + }); + } else { + moduleUpdater.initPathsOnly(buildInfo); + } + requireNative('discord_overlay2/standalone_host.js'); +} \ No newline at end of file diff --git a/.resources/app/app_bootstrap/installDevTools.js b/.resources/app/app_bootstrap/installDevTools.js new file mode 100644 index 0000000..6ee379e --- /dev/null +++ b/.resources/app/app_bootstrap/installDevTools.js @@ -0,0 +1,19 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +// used in devtools to hook in additional dev tools +// require('electron').remote.require('./installDevTools')() + +function installDevTools() { + console.log(`Installing Devtron`); + const devtron = require('devtron'); + devtron.uninstall(); + devtron.install(); + console.log(`Installed Devtron`); +} +var _default = installDevTools; +exports.default = _default; +module.exports = exports.default; \ No newline at end of file diff --git a/.resources/app/app_bootstrap/ipcMain.js b/.resources/app/app_bootstrap/ipcMain.js new file mode 100644 index 0000000..1a10c7d --- /dev/null +++ b/.resources/app/app_bootstrap/ipcMain.js @@ -0,0 +1,13 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _electron = require("electron"); +var _default = { + on: (event, callback) => _electron.ipcMain.on(`DISCORD_${event}`, callback), + removeListener: (event, callback) => _electron.ipcMain.removeListener(`DISCORD_${event}`, callback) +}; +exports.default = _default; +module.exports = exports.default; \ No newline at end of file diff --git a/.resources/app/app_bootstrap/request.js b/.resources/app/app_bootstrap/request.js new file mode 100644 index 0000000..9e17b19 --- /dev/null +++ b/.resources/app/app_bootstrap/request.js @@ -0,0 +1,162 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _electron = require("electron"); +var _querystring = _interopRequireDefault(require("querystring")); +var _request = _interopRequireDefault(require("request")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +const DEFAULT_REQUEST_TIMEOUT = 30000; +function makeHTTPResponse({ + method, + url, + headers, + statusCode, + statusMessage +}, body) { + return { + method, + url, + headers, + statusCode, + statusMessage, + body + }; +} +function makeHTTPStatusError(response) { + const err = new Error(`HTTP Error: Status Code ${response.statusCode}`); + err.response = response; + return err; +} +function handleHTTPResponse(resolve, reject, response, stream) { + const totalBytes = parseInt(response.headers['content-length'] || 1, 10); + let receivedBytes = 0; + const chunks = []; + + // don't stream response if it's a failure + if (response.statusCode >= 300) { + stream = null; + } + response.on('data', chunk => { + if (stream != null) { + receivedBytes += chunk.length; + stream.write(chunk); + stream.emit('progress', { + totalBytes, + receivedBytes + }); + return; + } + chunks.push(chunk); + }); + response.on('end', () => { + if (stream != null) { + stream.on('finish', () => resolve(makeHTTPResponse(response, null))); + stream.end(); + return; + } + const res = makeHTTPResponse(response, Buffer.concat(chunks)); + if (res.statusCode >= 300) { + reject(makeHTTPStatusError(res)); + return; + } + resolve(res); + }); +} +function nodeRequest({ + method, + url, + headers, + qs, + timeout, + body, + stream +}) { + return new Promise((resolve, reject) => { + const req = (0, _request.default)({ + method, + url, + qs, + headers, + followAllRedirects: true, + encoding: null, + timeout: timeout != null ? timeout : DEFAULT_REQUEST_TIMEOUT, + body + }); + req.on('response', response => handleHTTPResponse(resolve, reject, response, stream)); + req.on('error', err => reject(err)); + }); +} +async function electronRequest({ + method, + url, + headers, + qs, + timeout, + body, + stream +}) { + await _electron.app.whenReady(); + const { + net, + session + } = require('electron'); + const req = net.request({ + method, + url: `${url}${qs != null ? `?${_querystring.default.stringify(qs)}` : ''}`, + redirect: 'follow', + session: session.defaultSession + }); + if (headers != null) { + for (const headerKey of Object.keys(headers)) { + req.setHeader(headerKey, headers[headerKey]); + } + } + if (body != null) { + req.write(body, 'utf-8'); + } + return new Promise((resolve, reject) => { + const reqTimeout = setTimeout(() => { + req.abort(); + reject(new Error(`network timeout: ${url}`)); + }, timeout != null ? timeout : DEFAULT_REQUEST_TIMEOUT); + req.on('login', (authInfo, callback) => callback()); + req.on('response', response => { + clearTimeout(reqTimeout); + handleHTTPResponse(resolve, reject, response, stream); + }); + req.on('error', err => { + clearTimeout(reqTimeout); + reject(err); + }); + req.end(); + }); +} +async function requestWithMethod(method, options) { + if (typeof options === 'string') { + options = { + url: options + }; + } + options = { + ...options, + method + }; + try { + return await electronRequest(options); + } catch (err) { + console.log(`Error downloading with electron net: ${err.message}`); + console.log('Falling back to node net library..'); + } + return nodeRequest(options); +} + +// only supports get for now, since retrying is non-idempotent and +// we'd want to grovel the errors to make sure it's safe to retry +var _default = { + get: requestWithMethod.bind(null, 'GET') +}; +exports.default = _default; +module.exports = exports.default; \ No newline at end of file diff --git a/.resources/app/app_bootstrap/requireNative.js b/.resources/app/app_bootstrap/requireNative.js new file mode 100644 index 0000000..c18c0c0 --- /dev/null +++ b/.resources/app/app_bootstrap/requireNative.js @@ -0,0 +1,5 @@ +"use strict"; + +// require(), with paths specialized for requiring only native modules. +module.paths = []; +module.exports = require; \ No newline at end of file diff --git a/.resources/app/app_bootstrap/splash/abddffb32a4a35627c3857a06c751424.png b/.resources/app/app_bootstrap/splash/abddffb32a4a35627c3857a06c751424.png new file mode 100644 index 0000000000000000000000000000000000000000..909b7290936c50e51226b0661d686d21c207b749 GIT binary patch literal 6378 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 literal 0 HcmV?d00001 diff --git a/.resources/app/app_bootstrap/splash/ac3f027697c11abd84295888e843f3d2.woff2 b/.resources/app/app_bootstrap/splash/ac3f027697c11abd84295888e843f3d2.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..20c0fde36de14081c47d57c34f1caede44976adc GIT binary patch literal 29668 zcmV)0K+eB+Pew8T0RR910CVI35dZ)H0Xk>^0CRx=0RV#l00000000000000000000 z0000Qa2xbg9Hcx3U;vC92!R3#oD~rW3WC-Yf~#EtHUcCAlST`PYybox1(XX1qznv! zPFoxwkpQ}FJ8A?}>CLKi{|Pfc7A1<_${*aeXpMQsjUP<74L#@%22n4Wd$Rxk|Nj>x z6&W+_Fm1OnKtNDIz5hYY%p4TqGCN9*z71`xwNAJWIYi6>43f3b7l_f^@Qq)D13h%rn&gnwUdUsVZ=RCUja-NfZO;@#L~57M!#2_VWe^mg=ij==!^BFdQ!q6yb>-p8K&hIa6;KJ5gHK&xocwO zz>Rm@y`Wn)+9$sr(#2Fcr2O&!AN=|AXCPnzkO-ngf~1xNBpCoj9Z2eFF#yONfRs#8 zEGWrgqeIlC%&>v!Y>B$PEMEw@lS59GtJo#oRW4ngyK73jPN8TDccp9h_P?fOwBK|; zk0j@eBHA(_J+d>JSp<#Nqt>?D(s#I&@&vmS9A~fi)!~B&ND7!8;u)X=@Ob$DwU%ct zI*Z9al(wN!Dyf+~OlA(DxP?Zo8_}j2_zzb&n?JATL~VM4L!%I~)@?Jrr@d9PimgN; zWEGck2rUrGVSUSfHq`Y`kbB%Yvvm$vP6E^OhSU-jlEs*iw%;n;!oM?1-dD%z;v9@{ z#bDInEZwg?)$gS5zdaRZ_A{5cuGX#=Euv&glu{cJ(HryLf7vhn1p;~(&5*T71p@f} zj?-c^twThq7)>um3B8aU;iT%k61Fn$Pxt>)>5}U1#bbwz00~)}6vxNU`;*Q0(v`K} zbYfHx3s6Y%A_ie*r+{O4{_@}>_(1~9fP|Y1nJ*d=BL))dEabc1c5^ziOT>5k0B~PDH;JI zbV9Oc20g~)cOU0Yld28pirXG))a;|5y5`V-PlS!~wK!zyvakrqcIckr6ogHo3XP^& zV7ZO*zhAxw25A5K35M7;;qMLw^*A*eJ{dbMe2g*)Mn{z7>lKC7QP$UkBgaYBnofrV zI_Ysx_r|mTs_`7RIPaVf%)AtIu7~qp_+v6>!-*RoLB_vKWd^1^5Fx1&*&Z z$m9~be9HyKyWp+`JVXQE2NFhACLD+z(qgI4oFYEdSRWwSlN_jtF?35*@t1K(981{3 zwfW45@IV14FYzF#koP?VIvR0w>}Vr|HfN$PhkRG!1sKA`BHiU&rJUVy2!r(AsQZ6E z)QIg<8g0I#c*7Q~Ko5yzQ5Cec@`}shc`YQ^|H}>(S$Tq^UR7GV7K;rog+8FFX%Q?Q zIaB9J5-p~ys0Gbb>R+=7*`?Ku?Y+bG51+km{rJ732k%3Xh>7?mlo~B&yx_1bx$+b! zSap$Fn$oP|N-DMVax3ms>Z-fa&Fq&UGD{N9sh|N?P(_8~4 z2BGzefHz7NMMY$^o~$-38=mTsmyD&)h7n>`0&#g7S9C#8PUV%V2d^f>5wV{GN#8Ei zd5WMyA8Ic5)Lo!koZzdoNkh`&ct6#7@_*R&bZ~vNRZwe=UA&x_u2Ek|%3hD7*utBx zD!lZny(WRDHeI3&Eiv>sq1SQLyXmAYp4s|)RT}H@0%hter@j|Mzz0$-iqv4GIl@|W zuy`b>iV~{6DVK}DQLO=uA)|b7;6-1a5nna9sIE79aicdC_NKDLC_8V;!POmCk+YN| zzb00owozxhbM|woP$-ewqTw`iG~aL14GXd-mHFEdsgZcEE=81l zhk9O+OvY^{wvcUZkoD0aOsMOfL-w<6h(1)nNuQGn<@ zigco5oX9!D)Pu{w6l?1R5Lm&5f@1^@gy$isrzs$pP7zU6*V>c3hSB;pbjm)3m~vmL z6N$UE_856DB}BJScU@nOHX%HYB+FjGEDx^{5!MM6EXJ7A&zV~A$;^%w!w5h|ze=;| z(9%($e%jLPHOkO^h9?*rLD`^#Ng#r9Q;8^GzarRaOs^Z+=k$J0)&$i$-IxLx>eQ{v zuLzQKLX~I;X?ILD*;2;L6E8*WQX5M) z@}Tio8|c?9%8ppY28h||-1A9~fvzPg9XCUjml_nOP+UWvr5(h2nLX9D7GNZzE~=$u zI4}-x(NJHab>1uzXVQT#5;VOq{Yz!C+n>y_swWziRVzi(1)u8MOfVWQF zliwx&M}Qf>^f}&X(YUCR5#ES#0Rq*37b$gk@CyvxRSvrzM*S<}wB_tNKcvuWWLbcG z_mB}}u^=eXBIX8%i%a2V2qehA|z3W2_#K*v(gZsP)aSV?TDZqs(L{P$Rt~25oe&Fa|##ivIxj%r8{u>)f23o#V^X_9{(gg~n&#f%r z73$@|b|EB?gBHx-B)=`%CY^#J)S(Mwv5al|mt70*B9M+H9I^FeI53m>ER|~RSZOx0 zoq^~L!;VSJ%WAN1}cE;c&LEOEAApo zN;w|apo!=Mrt6_OtB4C|I?@#G!50KeB<%QVY6{tJE-Xp8T5jQJ4scrMu>*he4liw7 zs`GiNXLe@~p|d_3J8&1rBc+zi2ndDO=f6{c16;u_axND+v}QlW6#NuOg&Hw}oSFqw>*=dx;cW-c6V=Hfje_ht zZR|i16{Iw&xl|LS363_}nk;DYYhoF~!QRDnhc^Ndj#wt!nQi$gl%o34#(EEj9@m%k zWbat!v0C4b9eBud-r~7!TbiHx-{+!+ybRO9heTu{O+hO-6fPcQi1AVZNwTxS8q3kR z=s}>mq=c@fYAHq-Kug%|GARs$9MDq4Q5MG}byDwW(y<&bhcXu)s`z!BLQOT{isPo- zh22nTOnIQ`&~`ralYd9i7YVluu>;u@iUG$<<1|ta5Ion>)v@9iSVr;~AL_K=Y1ft5M9mY*FxoiGWG(?sz;TcY%CJU^Q z8u-{Dhi>{z=`w8&-d0Vo^L~8dcqz?$+WYEP!f$k`fx90gjUKqxCdyF?Qz*rb(wwis zqxa+YV*ms4_)df2an~Ch#p{M3-6GIc=p3_6u{wYC>S}~q;joiqG$Dj?A7Sb|i z_KHWtJZ8ma+6Za8g^i7kJqs1_r@Y{}U~wy|1{4Q{6jIkpR#K?Q;@?MD05f@=WdZNi-gZrLHKG(G9GM|rd5C_%MfjZLW0mJ0wGcqZ4~(y2`4DZ zL>7r8W@2ko7jE{$3f(nsKI+}Ic+qYBkxM}^L5#7$I>~5AC)3@_a{6PLz-#Q`I1})} z#<@AT0Ei6Sg{$*ERFY!cTx7kBSXU06#&U3+;d#{X6;wAz8xy)1nmZ+ENI%7uJ=00A z1~y^x8tbU3=_-t~+PL;1j+P37%f?wOv2DI1QH_mk%#9VsKS0qbiNcxpG~Ap|y{M;* z*LCxW*3!Th2lNfPV|CTp>-59`Xm2rJP$TTUW3>}Ou3KM;F&0>HG8#@Rysb6z#2jYv>tIT9Zx#Ahluq9oZ>Z44}O`Xo+Oj7tK1}2!Moyv90em1M{1%Xpxj`7Y~U2AdKUI16wt z-~zzKfXe_^LgmbZpHU_Vy*69Y7Ma!azHxm6efZ8My{+o?ux;qRXKp{MJ)da+)q z*Yno1`0m|jeNZ32`)ul6IQiCZ0?Vwq{k-vKl&@9snkMtAN`LrOKSp-R_I!whAIqo2 zs}A5n#1cC%PdDEQc~|>r`ry7z^=KWMB(RS4mlHtvE5#G$U#g*5cIoEt?*E~O{^`-q z-n}@!edYPm<-2#M-hG^W@hjc*@@cjOmUT~mxOdC^E8hsowij^-SkeCXa5|ehO&6-_ zV%6QKWgJH^q7lPTF&za$?Qu_PuBCrz%;Hz4# z(J(54FK{_QyafyABf>Ug?GSB&7`0ZznCjF4U-jm9MZ^sIY#&x^B%~}pn0-hQvukQe zeA|#M&32xSI)1dw+oX7pH_=Gr3|HKCviCuW7<2_82Db%-%X zho-!ou`rP6XfT9|0xS%e1%eb)un;Wa!m)4A7%>>hmQSvr3EZB+gj3GpxQJl4>Uo!| z^NgNGe@Oh*P1Lwjh)YdOl7wdZ$$aB&R~|qd7|b9;UWOG`NSd!=MwL{8-onCU&FK)6 z<`zrXyyDP`FCMRi5^y`*VS+k4f>KgR$QEvd-`$!~k(x1PSU;vPG9lv_(Lb7@x;BDf zoMOT#mC{FGV?pQ`C0QbyX!T0mQ8rPkq8>3}#+_afjPzGTW*AJt0+W(Ef(H*IPrfLf zol##3K^1BWnyF@@H{c;dge{o1s+X`WSOe3TX{SBdqD12~=_*%(OuSa%6A;pCEOMS2 zO{FUAwqZgK;vO?#is=#^zX$Z4ng#%Y)jXFs^wH$Q!v`f2!|sH8&*X0xL`55@6eT=aqGGgZm$yO zZjUq7?ikTirM&01fjK$WSuA^h@w%+!_sTZ$dadO5j>NS0n_Oo~DVP|NVIxV5N16;D zsE!G2n7VqJr=CHc_tG_ArE2vDau5C-p+_HDY{UgJ9^#`UAfYBqD2X;v9L{L_BJ@V^ z1j;2Ty3ZJx!J>@)k`1Sj@^A~wi{myPJ^|rXz3Pe}=PN485d~)5^q}bvLF*x$kSK2~ z&>tP7MIja#nFxW}(C-PTGDr#mM4w@ZK!}NjO?*{WT@wg81BX0t>v0*QlLw>e2z(U0 zpf;KwlHL&s{XGCJ0=P)0sX72cu0iTTzrBMwv_;X zwBGY#B4tE!ULQsdqa`4Rw+X~p1sbRf2g9{x%DkO4703>ZKtl%I!i-7&q+`e6=s&mm zHQQI^tT^+zxAK)m*4S#F1gWx>QmgehwLp^E{A&@p2rFu?wJ}JsUsw~?M(`D4mc=4% zv)^IItSRPLYTdo8 zTTAqxJQXgu%BWB4nJd_F6JVUF=2~XGoeoNJLcUX~XhFSR&)keXcY(&6W}f9X*d@kM zClxsDqHCajv1e}1frlUyOgG;O8|`+8O1eU4RJ#u9IeX?79C;dPqA(Fw+GLMd$ubl< z>yjIwzO`qr2o%AEO9$bCj+vn&_;etVTJ)M91Qa>VJqkoL3VJaC&@K9kRM4oBq^W$aAjF&h? z+DzH=6r5uh?tC1l%T=sWy;j`@jla(Z!5`ygyUsoK?*LHnFcD|k)qA@DcD#g1lBY_W zA@gi|*siDG%#*)R(GsQ0Rh%miG(SMSR^0}To3)%bPw9AreW$KHdhfqMfI))KsOQ__ zM6eMeM~fLJexjta;^p)_5_P(aS+eKKTcGe6`x_>LB+HbqRJBI!dJX5vyE(1Myj9x{ zoxAnyv;SWtpquU})K_98NJYcMBLOsch=j3l@dya27SYnC46$aJXOV8J_1NlL{htTc zV<3`#qoyrdx9ixY`{i}H^zTRkz`;U>2_Gry%=kDxk10D|!X(L4rOlA}wEbNakvj9_ zFI2Qd>2ekSUZp?&F(W(1Gl2Nl4$ko~WdAq79!A*5Ssu<%bt2^JSkp_{Q3F&RR2^20 z3#!dot{ok@&yRN6Y`vBKq0^kUcJ$u*qYY6vH_j5Vxg6*W}LxzrDzNy{Iu?{$ss zY~9<8M3<&f`6<|Ax>gR8a^tjpMImK3Bn9hLh>+$*_N1J=`SyeG%3nv|6d5@cIua9~ zglsT)CXS(dCJpWh9V4H9>BKu>Om;1~QEq_Eo@vwM3{%Q=a;+SZ>-*4hK{eSywvrW4 z2Jv80wD1zOa}#Q5a#ISN(>;LdqH34a zxU3eQeVm(WWc$UU4B^5p(m-6Kp{DHy^=ZYA%@Ujc`&wK{rIl4)MW;I5nHsv$$A0v) zU;TzAikK5W6U?y4T00$*B3rq0G^*9ox~blM4W6Nv(WTB-l&YgBWmeOL$56_tuFA?vMJcx{X)5nHN_k!FLKUTCTa`{-xyY7nfhsB#L(+y^fmt z3XhzWL^VU)ka*5k4JTRD8C3=&)QMz7snT{;C)Mjd_iZrJ0ihPN@{A89&vwZiY!k$@ z;R2q868PD`G!;UBZqrxJEG|;Dj$M4r;CS+Skk-fw#Oac(T_eyt~~kb z^v6aV#5JU+I*iQ`J5GGA^Qo(Rt!w2=HP_bXzVx+kFrpZUOBrToJ6lOfY-)kMC?rCJ zx@5>9kO~FN6DJ(Fy13nL#kpj_p6!P@058|eKh)FEGTj*7cVraoZsa5A_<+7KYTz^o zU;wT-0Rr-n`}Fwp?K5HU?8raXQQ=MNALVtfss_hsuU%>wd&!`mJ-g`w1+~XkSVDYimd#Unkh3VyY8Ax^-;Uv zaqE&EagaVlLER`U+aJ224Trv}o85LfW!=vPO*+Z=Q_P%!CuA1?{exkIwV{f-ef7^<$O+)x`AjF6zs$esnx5$cF#oBGm24K8Hu9L*Jyaw@JyL2OIncFBNSIjG%)sp zsn>>iL+&MW%`CKV^^28u!+qoCH*4>B>*VDhU)_9k3DC!1ugMW$VxwS`A(I*nV+{yu zB!n~urbI+sm{yFi;!H2rj7Vk{Z+401mSj$3^GdcUfrX{p7~j^!cBQZZIu7|o$Z4*;<`cS4=BM&MvS9v!=P~%)q)x~t@DGBQ2?(wst#an zgD6naH~8ZtUC3`UBQk=)wziC|d-N^vB&AHk6+78;R5=`u{fQPY;e`Q` z!vtOW2UHI{^~C4bpacI4lKiujlgi;_NN&$tGOoM7{K;ICu9e4^Z#jLjI3Da8KPfUg zW5=?oBZ!mQdRq(p&%zYxLwf;(W3Pf?+JEmMuZ-R5&4=dct0d+pHNWCG(Rf z@yd{ia>grGURArOMB!BTGY|BoL673JA`1*b;;{pHZhP|PD3~+WmUq>PoU9RoNN2w1 z(1Lk24DI+hn4}ITWQ&zCB5g15_Y}E3ULeUkK5Uz~t6tP9NN+q*7?r4W+)_mz6xlC; zbqs`T(VT!VUnLUvrbPW1`7$I#fYEG?lPe;x0|!jds_o%0xVt?GMO=`zq3cQHO?@zX73a0W{1_)~Pxt3}hCz zMy&R1MI9NB?D1VqXGH^p21w{!9qju`n^PJW@KhM40w#JAiOhs6B5zZ!(c}#+4alJ^ zkOeKQ?fXmy1ARqxD6&K8xWDO{6#613%i)h z!LaXXnZuBpT^&^;sSe>XSiJ$J+!g1X@W3e~YT22p@#8u(S~f4WqK6D_IN(bN1QG_J z#DGX5ASSUOE^#0s@gOM)ASH?0YY_R*Nv^K#dqGX~<}Ijq)?2V$&wSdAZqa;wZE4K$ zg3qUj+WCG6#_@*?(#S%QgCY+_0g56NB`C^JRG_FrpKJn+&2|oG+c|J}$0LCz9O5(i4_R2eT!#(KIT`Fr6doDL0J0-JeY3SdmfM!oQ6?b>_ zfsahL4=@MD*dup5qF{qIodS6O0KjiwWj^`$y({U%foA*+X& zN9U$l2ty}i8M{#<2RB|1@vdb5cobA-Wf{eJGvr7d5&J<195JBK1#n5~!4z@UBb9_m zkYoxZ=Zsb3X%QJs*T7s29Em8KK}?$Yc-tTDgIt8Z2w=s-bjq_`sVdqImV7heb|Fe*OAQQwVAWB3js|-!{AI(P*99 z$>}qjuRQ#&*&cg!T*bY=&1>K^Cd*z2XOYqqcCRU>F&yGLS+iXYHp1Y!rjeB%i&RF+ zH+~o>Xi&>M?%YjeY0O>usN3`3h_M4>ac~^_rj5)S>nc&JEP}1=Fb#$9?EpbJJ~{LQ1s=F3s4+^prYP$W){HW~SI!ZN zcBM`ICd)TU;819lXp*)R8ztvZ-uk|PQwi3Ticm@wDpRR638@ODR-roGG{|YgntfGT z4kcD;PtvwJM(H}#v$D^U)*1A>GOSQaIRYJM3}sTGDedN0XUHUs!_~lT4qL6+ddh#QF<^SLQEV+$BMn?C%SYuUPeWx%a({0bL>OZJe z^dM-{>43QpVD}r)W59{N2b}uG0LObiaP+5xi~SJ{Fx&GUygjj1kB~!}ydI@Wrpw2l zOA2oH;S;_z!*rU*C-1no#dk+u|0Gd|DdVvwCg=TqiQccC-?;SV+w{=23$CSiC+FY( z8+YDO`v3W3l;>~Wy*wYv5n$#WZz`dWbLLUL#`rL$qbTZJR%(AQXV>n@{Ue$XFWVwp zQ*8C9OH@C*dnTjIJ4_uVp3-5Q?p5g-#;)>NJ{nJUCn2@!OK9h^7c)bKaze(ploT1= zC59@5N>)U9mQ;*(v_X8C`kuZvGr}p0*PkY4VwiD8Ng`+-XIV!sWW$Nf`lrlB+GjOB z;%23p>?uODq`B!W>Pe0gwE1zYDVA9|3qSq3R=Z6OW`g3SP7!TMMomc&B8-ypk_MBc zq@z?&7RMQ-WLVN*$7$M7%4-qCX@Q!2XEel$0g2o^w>FOR=P4Ei#;C<3)fo3F+UDU< zQ?!K?j&dyGU4)xrLlk^A5v49dF^!Rm#>sOtV-do&3!?A&DNE5yFxD}e6Y5AwoJk*3 zNQXq#SZCBgR9Ik~Q`#Ul`d~M!WsV+65$wwIoWkkIC`&1o4Mq$*~2w+3Ep(wYQTUP<6YJgF>9XU@}N4 z*qRDg1IZ?2JJ+-yFc3(QrgWkJv5IQ~z@5bepk-s%d;P5D2qlyjIXeYZ&drvzIYqX3 zn}Mn&ElLwIGDzf#MA2<(a=}jnK9HIwoyhT%AhJ`YHd|EzoMtOvH!(OhR0S7_y0G*W z9am`hr3^3?IOB7U@-BHu`FMC1)c&bngOe^XF3|Q=O?Op5LOoNGXcl_JLkQpJB6Ow>DSMvV%%aw!H%BHzjn;6R7>+e= zFE*@wYC40&Qm-C6^rdY*IB^8yDm%q^zV;{tHqcPpgF&N6RSz;cS!p>Kz65H1YAItiU}N>&t|~4U?2MdqNc3J-!(?40 zJS0cOiVqzuCu8@xT}$Rntx5s|=9dyT7^>m!f^oF0Z_Z(-34kjcNzDPv4RpJGI@IRAoxHc z&0vx|1eTV&7DV&7Bg)fMt1BYT-JWoKYLry)A;4>R^d8EGf+k{)hL_U5t#w+OX2( zBnsVB9-e6J8j`IGkOG4oHLW5|MsSf9)PoEK?9^#9@Y`O#0cDYo3~3nz=<2CSuj#F6 zSc^}?zV|M#FtKwZ6}LOF+YN~MoCngy4KOn1c&u0_hC-6V>*`F-z($T~77bpc^RxZa zbp1ao40A@h#I7n1t2qmGhE0uAR0c7(_?uhXRK_$`J)q5y>d++rQyVcq!K~Sj%zk;) z%WiN@LV*D*mzQ!B_DS@rFC_@If(_<1n7v-jXLkkI7Br%JHcr-`CtX#CxiB_IIl5u( zCI3FRhq>f0^}15`C1MFSNFNV&LoYv{TG@qV27#Pb4AB%TY?1?O!I2h=0-&aYEeUYj z!G_E!AjoZ$o&6qd>Xt1CaXkUF8;r`C`0k?E8i7KQOK5nM;`+4<>#);wURMp#n07Vg zZhEsdcjBcwN+KP>1Zqf>h@oFIoizn@L1^yy)MN8mN=wSqwdunsM-$dw-opPzHPEZT zOk9lETarX!t10e>>=mTiY-}LWSc|gO73ZC9y{9!g$Jz0OgBp0;(^lP`*S7oYTilMp z{jgKqlt~6jf1}4-sTmFRp8WLKXD=Y2nHTaDvk+>fhdFA5ag26Yy?!kzrUo(%H}G0k zym%U}>3uHId#uqSO^PtrR7F)@YBxoBI>ei?}M#9ClrnF~Be&S0sM3Ixixtk(zOMcqEwr9HMZ zS|{{%{1u5trD_a29W;F4R2BqZ@6F{p140hEkm1mxEI57d^gHu2W6M4$$k(fSlyefI zV>QO?r?m}dtUiOW(WjlMeWY&J=Fdp5@1k3FWFQ_Q$HdUDa(j3%OEO1>JemCv$fB#4 z&T(enGOed$1NWosuLa7Vwc%dJRi<+`tu-DPR{b%Fb<{bPsF!$ACzNk+Q}NRUS*!}L zF9H&7@y!W-!|4X6v+xdcF0$XG8f3Ogv5?&l>UV0sn(lGNg~$SbN11S0hPAS|ubwvQ zGg^B}@h1a9ib)^haRkgXSOrBaKZm6nNDZq>qYaBEZmK; zKkgjOgFRhlXDH+^Xsx?0fnPS6&95Ww=ZsHgqsyF7opPw3bncO@o;Gjg6&9Jw(*X;f z(c}%w`2};>x?G@cd#0>CrNDVc-{e=He;>X z(%)Q>a=w3S5iOW4jEw`r%t1cpcy)DxOw>@)B4$9hxu3O}v+ zq`FyI>LFiLl;Et$J+>YCZt-9n(vGTF?k$&>hcq2s8XSVSnZ6;5?YD_vQ-bbWn23YR zO7dF?a06EW=2NT8OEmm?OrJFZ=Y`v@!J7KBPd4|Xt%W})`XPUw8Cfz!zB+OD{v8L+ zp?EgHlLlMDp%71I_`%Eq8o$|8V+ok0@Vt@&PvTF4e%<2()0{{vR~}jhJI8LF?)ra% zGlg$VNrGY5G}Jr4%YV-JAUfx`4izC)TKs zFo7yMZOUYukJUZBfw8RJv1C4X<5O!PPssTheUe>wuTZ_dNXK5`f!h{3s%VLL_~#i8 zSZAHa@qEI^SE(iL+UW9lf!?#<7P|0Rt}pnj_I?A>>tcYIocOjVLT=%=HFXroVUo>O zT}7ONYN}iK#?u1lxAfqQJGJJrbLusOY8(mk_av#F8*Tc-iv9c2HoDKjaLg(ml|k6t`lRg#<|fcn8MJ@x(I0|C zVisyzd@MC4dKBlM4M6c;8>f0-f^I)DqU^A%q3;P=@FxYG!#`GYuNEcb_Yz=oo@Jfsbn^&=JJQo13aD74!!qjD@a$PM>M|zx|LxOKDXCv) z5Q(pzP*C%zNiKYCJ+>JMg#7+1CEr-Bt0VRFqg!MvMkh?`oHu{k!U+pm9DQHoHLd_| zwHvrx+dALtes%wA4dK)F{`CUi0Ofs2j`ZqAPT1sy2%zQL0!&zk_xGTlF$|QEIgB_b z&$_XGLT=AD4v%XB#x`yrELFprY8^b=mn(0tH0jlq((4N@qH*QmXv>%|PopIeMt9=u zAlnYs2dRFGRc#&noI#I|wX5wRJQSS!?P3Mz1!YhH5>?8Uj;z?n-=+Mlyd_czJBT6m zfd5Cmkf&5xopu))cAW=vrTz%*{+E*K4cGBQSiF*B*LMQ zC(F@Y539t6D)D?gbhOBjJri^GmG1exX{9d9pbz}`SKd^>T!;620;t}u%28oRClD47 z(3hgSr9^Oyxz2z$*K@cF)Ow1FK*DEYhs)H{)HEZPn z(%Y~iVCawO{ApLtlGu!=kReN$o~tY!;XQGdO9Y#m2)PsFTN;&h4j{7V6NRWC@Zx@EK>e4>RM$sV5^DH9VNvwCfwSd>?(& z&{vwWTV&Yq!}c#o==uFw-tkpl6JGkI+QRt8F5Xc%^E~Hzy$Vrlr_H$WSwSEiBu=uV zEoK)0CTp%-txrZVs|Ci@jtpSc-&+A#q4xOIrSMp|@(WF()O-p#<~AR3%(-26D&PZP^@!Unxw6e)!fxjSdbdoq>IKb|I% z+31kbk%GwBG#lBxX2&2gZv1P@)VMYX1UnGeWKLMINwxPt9Qzu(V=6Fpt$gX(28R|} z|A`OOAI11NW-D8Q-PGsn3Qaox`HxWxTP$AjjGDpDUdc0Y0OQ2`Qtld)NMsTSCJRM{ zLUWm2$P>feS!*X|b8!(~=D3NXu#+P&xby5VsuhL#1yZkz*YIdPCkmMWQxFYq1~zZ) zxi1t|WLgy;|C&oRp@S&a-BpvCT8Sq_@5mO8ypW?dUR}}sb7It$#3n71Ony&KKvT3@ zy&^c`?A6bm9LG)c!oA-Lj(#_3fo`ouKDVmbpgqj`?dpFW=pZ_TltP#!q$3H*ySnau+(Y;y>`q3g&f%GDDtR{GnjrJ~?E;?QY?D@zNPbVBapgpN=pAeq!UM!I zNFFg;sJRSOtC8atKYJ;tL6puizt35&(}CuP6?B}lAylMS;s3c$DFV8k>T!?J{InDF z>7V=W-8=X227WcxGnYAr;YP&GZ-yS8fPBNYVcnM2r2Ejdqn}3kc|v^LW3f*L_RIVF z12Tw+28O{CJ*iqM3!Ut+b>a#9sm^*6jP{?p!|8bM`d-A8Ny{F=M9`Jd=t$)Ku#3ja)D5Qx&Yz)V5*YVDc1G3=AyV#05UrGlSw+7LRAQ^ZK>JT`IJ zd6Pn|^7Zf0hQHhS4QgA~#SY*t<36E04cR zf?$Dl*Fh>k&Fc7&A=M%x1)^1oQL#+mEa1r8r2(f%ZjQH-JXHm_FqkitXpa(M6w3$# z!TCD!#+ATIs@;(IZmn{KRN-B-vb!B<&%NSM(H^G*aCAe4w1m9+G?fRLiTUbhLY)fr z^f~K^uFY)u`-%6^jfxNjer1IR4B)1np!0vtbJt-u8X}zxg+I3y$YV|YR}EdA+l+>k zf4Sye#j3w){Klrxp<$=jqN{!(wam8j-LhMzrXT8lFfX~a^_^|@07dZg0Q7Zo&RFb9 z|22HU%q26?f0C0B1FYgMECIeM{R|jvK_cVNn{7Rbzy(1%AD9`MQ-|PZ#|D5+R|}5+ zaGY-0{0>zgMsK1QvhGOC2vNFIU8Ja;o|MoYhdxgcZ^@MZ9zayk4W<8Tgv#mTM=lH- zOUq4m;(U*#m3QwKIV{@l$%2``MeN(MglFRPc84)ZZ8WXumam?=3p*IL23Pg`;i| z>z%5e=H?l>i6+yjqfk?@)F2u4`R@Kxz!|V=g09h4<4Ale+K;B()WAQG0+oxyDjQGZ z0@Owf22sriI6lr8^n1%|#(Pcfdb^-Nl3QHO`GMFHCfa_D!7N71LTZna z4q!SMFsPnx9D`K*^Gm`(r$T0X;x~KMu(Bj1L8flKR}a_sU_B;Sbg4-1dOz(0=LoUM zIMdQ)lS6o}$7FDNQI?hl7*eHvFPz2t5*|~9fL|&t*CIegg%Vcg?JotTm9X~WB=te1 ztU{YB_Z{Hbw#B}Y$vfOWgF(bmv_OD@m&lYA!{!Y9VbgSLe!DtsZPsaGnMmwa%x~vs zfcXj$&*9;LARq{e6rq-p2+mV7h|SgkYjlWAMkuXT`)Pen6M{G`E1y5XndW1y6T_1_ z)fCN$cI10;Jm06+7x>)cxWKEI)gCj-lbW1n7i@q{JCS5J%9>=m;T~Sq8J2jd6M8ga7Orc%0_*d$dIOSBe�a^D6Ms(9 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 literal 0 HcmV?d00001 diff --git a/.resources/app/app_bootstrap/splash/index.html b/.resources/app/app_bootstrap/splash/index.html new file mode 100644 index 0000000..5dec1de --- /dev/null +++ b/.resources/app/app_bootstrap/splash/index.html @@ -0,0 +1,11 @@ + + + + + Discord Updater + + +
+ + + diff --git a/.resources/app/app_bootstrap/splash/index.js b/.resources/app/app_bootstrap/splash/index.js new file mode 100644 index 0000000..a01c575 --- /dev/null +++ b/.resources/app/app_bootstrap/splash/index.js @@ -0,0 +1,44 @@ +!function(e){var t={};function n(r){if(t[r])return t[r].exports;var a=t[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)n.d(r,a,function(t){return e[t]}.bind(null,a));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=27)}([function(e,t,n){e.exports=n(25)()},function(e,t,n){"use strict";e.exports=n(17)},function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE){0;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}}(),e.exports=n(18)},function(e,t,n){var r; +/*! + Copyright (c) 2018 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/!function(){"use strict";var n={}.hasOwnProperty;function a(){for(var e=[],t=0;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(this.props,[]);return function(e){c.forEach((function(t){return delete e[t]}))}(a),a.className=this.props.inputClassName,a.id=this.state.inputId,a.style=n,l.default.createElement("div",{className:this.props.className,style:t},this.renderStyles(),l.default.createElement("input",r({},a,{ref:this.inputRef})),l.default.createElement("div",{ref:this.sizerRef,style:s},e),this.props.placeholder?l.default.createElement("div",{ref:this.placeHolderSizerRef,style:s},this.props.placeholder):null)}}]),t}(o.Component);h.propTypes={className:i.default.string,defaultValue:i.default.any,extraWidth:i.default.oneOfType([i.default.number,i.default.string]),id:i.default.string,injectStyles:i.default.bool,inputClassName:i.default.string,inputRef:i.default.func,inputStyle:i.default.object,minWidth:i.default.oneOfType([i.default.number,i.default.string]),onAutosize:i.default.func,onChange:i.default.func,placeholder:i.default.string,placeholderIsMinWidth:i.default.bool,style:i.default.object,value:i.default.any},h.defaultProps={minWidth:1,injectStyles:!0},t.default=h},function(e,t,n){var r=n(9);"string"==typeof r&&(r=[[e.i,r,""]]);var a={hmr:!0,transform:void 0};n(15)(r,a);r.locals&&(e.exports=r.locals)},function(e,t,n){var r=n(10);(t=e.exports=n(5)(!1)).i(n(11),""),t.push([e.i,"@font-face {\n font-family: gg sans;\n font-weight: 400;\n src: url("+r(n(12))+") format('woff2');\n}\n@font-face {\n font-family: gg sans;\n font-weight: 500;\n src: url("+r(n(13))+') format(\'woff2\');\n}\n* {\n box-sizing: border-box;\n -webkit-user-select: none;\n cursor: default;\n}\nbody,\nhtml {\n -webkit-app-region: drag;\n padding: 0;\n margin: 0;\n overflow: hidden;\n width: 300px;\n height: 300px;\n}\n#splash {\n -webkit-app-region: drag;\n background: #282b30;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 3000;\n transform: translateZ(0);\n padding-bottom: 10px;\n}\n#splash .splash-inner {\n text-align: center;\n}\n#splash .splash-inner img,\n#splash .splash-inner video {\n size: 200px;\n}\n#splash .splash-inner video {\n visibility: hidden;\n}\n#splash .splash-inner video.loaded {\n visibility: visible;\n}\n#splash .splash-inner .splash-text {\n position: relative;\n top: -30px;\n}\n#splash .splash-inner .splash-text > span {\n color: #8a8e94;\n font-size: 12px;\n font-family: "gg sans", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;\n font-weight: 600;\n display: block;\n}\n#splash .splash-inner .splash-text > span.splash-status {\n color: #fff;\n font-weight: 500;\n font-size: 16px;\n font-variant-numeric: tabular-nums;\n}\n#splash .splash-inner-dl .dice-image {\n position: absolute;\n left: 77px;\n top: 45px;\n width: 146px;\n height: 100px;\n background: url('+r(n(14))+') center center no-repeat;\n background-size: 146px 100px;\n}\n#splash .splash-inner-dl .dl-update-message {\n font-family: "gg sans", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;\n font-style: medium;\n font-size: 18px;\n color: #fff;\n padding-left: 20px;\n padding-right: 20px;\n top: 169px;\n left: 0;\n margin: 0;\n position: absolute;\n text-align: center;\n}\n#splash .splash-inner-dl .dl-version-message {\n font-family: "gg sans", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;\n font-style: medium;\n font-size: 12px;\n color: #8a8e94;\n text-transform: uppercase;\n position: absolute;\n width: 100%;\n bottom: 12px;\n left: 0;\n margin: 0;\n text-align: center;\n}\n#splash .splash-inner-dl .dl-select-frame {\n -webkit-app-region: no-drag;\n font-family: "gg sans", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;\n overflow: hidden;\n position: absolute;\n width: 100%;\n height: 130px;\n top: 220px;\n left: 0;\n margin: 0;\n}\n#splash .splash-inner-dl .dl-select-frame .Select {\n position: absolute;\n left: 0;\n top: 0;\n width: 165px;\n height: 44px;\n margin-left: 20px;\n margin-right: 10px;\n color: #fff;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-control {\n border: 1px solid;\n border-color: rgba(255,255,255,0.3);\n border-radius: 3px;\n background: #282b30;\n height: 44px;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-menu-outer {\n background: #282b30;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-menu {\n max-height: 80px;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-option {\n color: #8a8e94;\n line-height: 15px;\n padding: 5px 10px;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-option.is-focused {\n color: #fff;\n background-color: #4e59e0;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-value {\n color: #fff;\n bottom: 0;\n align-items: center;\n display: flex;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-input {\n outline: none;\n}\n#splash .splash-inner-dl .dl-select-frame .dl-button {\n position: absolute;\n left: 195px;\n top: 0;\n width: 85px;\n height: 44px;\n background-color: #5865f2;\n color: #fff;\n font-size: 14px;\n font-weight: 600;\n border-radius: 3px;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n#splash .splash-inner-dl .dl-select-frame .dl-button:hover {\n background-color: #4e59e0;\n}\n.progress {\n display: flex;\n justify-content: center;\n margin-top: 10px;\n}\n.progress .progress-bar {\n height: 8px;\n border-radius: 4px;\n width: 180px;\n background-color: rgba(255,255,255,0.1);\n}\n.progress .progress-bar .complete {\n border-radius: 4px;\n box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.1), inset 0px 1px 0px 0px rgba(255,255,255,0.1);\n height: 100%;\n background-color: #737f8d;\n}\n.progress-placeholder {\n margin-top: 10px;\n height: 8px;\n}\n',""])},function(e,t){e.exports=function(e){return"string"!=typeof e?e:(/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),/["'() \t\n]/.test(e)?'"'+e.replace(/"/g,'\\"').replace(/\n/g,"\\n")+'"':e)}},function(e,t,n){(e.exports=n(5)(!1)).push([e.i,"/**\n * React Select\n * ============\n * Created by Jed Watson and Joss Mackison for KeystoneJS, http://www.keystonejs.com/\n * https://twitter.com/jedwatson https://twitter.com/jossmackison https://twitter.com/keystonejs\n * MIT License: https://github.com/keystonejs/react-select\n*/\n.Select {\n position: relative;\n}\n.Select,\n.Select div,\n.Select input,\n.Select span {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n.Select.is-disabled > .Select-control {\n background-color: #f6f6f6;\n}\n.Select.is-disabled .Select-arrow-zone {\n cursor: default;\n pointer-events: none;\n}\n.Select-control {\n background-color: #fff;\n border-color: #d9d9d9 #ccc #b3b3b3;\n border-radius: 4px;\n border: 1px solid #ccc;\n color: #333;\n cursor: default;\n display: table;\n height: 36px;\n outline: none;\n overflow: hidden;\n position: relative;\n width: 100%;\n}\n.Select-control:hover {\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);\n}\n.is-searchable.is-open > .Select-control {\n cursor: text;\n}\n.is-open > .Select-control {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n background: #fff;\n border-color: #b3b3b3 #ccc #d9d9d9;\n}\n.is-open > .Select-control > .Select-arrow {\n border-color: transparent transparent #999;\n border-width: 0 5px 5px;\n}\n.is-searchable.is-focused:not(.is-open) > .Select-control {\n cursor: text;\n}\n.is-focused:not(.is-open) > .Select-control {\n border-color: #08c #0099e6 #0099e6;\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 0 5px -1px rgba(0, 136, 204, 0.5);\n}\n.Select-placeholder {\n bottom: 0;\n color: #aaa;\n left: 0;\n line-height: 34px;\n padding-left: 10px;\n padding-right: 10px;\n position: absolute;\n right: 0;\n top: 0;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.has-value > .Select-control > .Select-placeholder {\n color: #333;\n}\n.Select-value {\n color: #aaa;\n left: 0;\n padding: 8px 52px 8px 10px;\n position: absolute;\n right: -15px;\n top: 0;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.has-value > .Select-control > .Select-value {\n color: #333;\n}\n.Select-input {\n height: 34px;\n padding-left: 10px;\n padding-right: 10px;\n vertical-align: middle;\n}\n.Select-input > input {\n background: none transparent;\n border: 0 none;\n box-shadow: none;\n cursor: default;\n display: inline-block;\n font-family: inherit;\n font-size: inherit;\n height: 34px;\n margin: 0;\n outline: none;\n padding: 0;\n -webkit-appearance: none;\n}\n.is-focused .Select-input > input {\n cursor: text;\n}\n.Select-control:not(.is-searchable) > .Select-input {\n outline: none;\n}\n.Select-loading-zone {\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 16px;\n}\n.Select-loading {\n -webkit-animation: Select-animation-spin 400ms infinite linear;\n -o-animation: Select-animation-spin 400ms infinite linear;\n animation: Select-animation-spin 400ms infinite linear;\n width: 16px;\n height: 16px;\n box-sizing: border-box;\n border-radius: 50%;\n border: 2px solid #ccc;\n border-right-color: #333;\n display: inline-block;\n position: relative;\n vertical-align: middle;\n}\n.Select-clear-zone {\n -webkit-animation: Select-animation-fadeIn 200ms;\n -o-animation: Select-animation-fadeIn 200ms;\n animation: Select-animation-fadeIn 200ms;\n color: #999;\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 17px;\n}\n.Select-clear-zone:hover {\n color: #d0021b;\n}\n.Select-clear {\n display: inline-block;\n font-size: 18px;\n line-height: 1;\n}\n.Select--multi .Select-clear-zone {\n width: 17px;\n}\n.Select-arrow-zone {\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 25px;\n padding-right: 5px;\n}\n.Select-arrow {\n border-color: #999 transparent transparent;\n border-style: solid;\n border-width: 5px 5px 2.5px;\n display: inline-block;\n height: 0;\n width: 0;\n}\n.is-open .Select-arrow,\n.Select-arrow-zone:hover > .Select-arrow {\n border-top-color: #666;\n}\n@-webkit-keyframes Select-animation-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n@keyframes Select-animation-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n.Select-menu-outer {\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n background-color: #fff;\n border: 1px solid #ccc;\n border-top-color: #e6e6e6;\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);\n box-sizing: border-box;\n margin-top: -1px;\n max-height: 200px;\n position: absolute;\n top: 100%;\n width: 100%;\n z-index: 1000;\n -webkit-overflow-scrolling: touch;\n}\n.Select-menu {\n max-height: 198px;\n overflow-y: auto;\n}\n.Select-option {\n box-sizing: border-box;\n color: #666666;\n cursor: pointer;\n display: block;\n padding: 8px 10px;\n}\n.Select-option:last-child {\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.Select-option.is-focused {\n background-color: #f2f9fc;\n color: #333;\n}\n.Select-option.is-disabled {\n color: #cccccc;\n cursor: not-allowed;\n}\n.Select-noresults,\n.Select-search-prompt,\n.Select-searching {\n box-sizing: border-box;\n color: #999999;\n cursor: default;\n display: block;\n padding: 8px 10px;\n}\n.Select--multi .Select-input {\n vertical-align: middle;\n margin-left: 10px;\n padding: 0;\n}\n.Select--multi.has-value .Select-input {\n margin-left: 5px;\n}\n.Select-item {\n background-color: #f2f9fc;\n border-radius: 2px;\n border: 1px solid #c9e6f2;\n color: #08c;\n display: inline-block;\n font-size: 0.9em;\n margin-left: 5px;\n margin-top: 5px;\n vertical-align: top;\n}\n.Select-item-icon,\n.Select-item-label {\n display: inline-block;\n vertical-align: middle;\n}\n.Select-item-label {\n border-bottom-right-radius: 2px;\n border-top-right-radius: 2px;\n cursor: default;\n padding: 2px 5px;\n}\n.Select-item-label .Select-item-label__a {\n color: #08c;\n cursor: pointer;\n}\n.Select-item-icon {\n cursor: pointer;\n border-bottom-left-radius: 2px;\n border-top-left-radius: 2px;\n border-right: 1px solid #c9e6f2;\n padding: 1px 5px 3px;\n}\n.Select-item-icon:hover,\n.Select-item-icon:focus {\n background-color: #ddeff7;\n color: #0077b3;\n}\n.Select-item-icon:active {\n background-color: #c9e6f2;\n}\n.Select--multi.is-disabled .Select-item {\n background-color: #f2f2f2;\n border: 1px solid #d9d9d9;\n color: #888;\n}\n.Select--multi.is-disabled .Select-item-icon {\n cursor: not-allowed;\n border-right: 1px solid #d9d9d9;\n}\n.Select--multi.is-disabled .Select-item-icon:hover,\n.Select--multi.is-disabled .Select-item-icon:focus,\n.Select--multi.is-disabled .Select-item-icon:active {\n background-color: #f2f2f2;\n}\n@keyframes Select-animation-spin {\n to {\n transform: rotate(1turn);\n }\n}\n@-webkit-keyframes Select-animation-spin {\n to {\n -webkit-transform: rotate(1turn);\n }\n}\n",""])},function(e,t,n){e.exports=n.p+"ac3f027697c11abd84295888e843f3d2.woff2"},function(e,t,n){e.exports=n.p+"bf3d19297ef12291559b3edae977480c.woff2"},function(e,t,n){e.exports=n.p+"abddffb32a4a35627c3857a06c751424.png"},function(e,t,n){var r,a,o={},l=(r=function(){return window&&document&&document.all&&!window.atob},function(){return void 0===a&&(a=r.apply(this,arguments)),a}),i=function(e){var t={};return function(n){if(void 0===t[n]){var r=e.call(this,n);if(r instanceof window.HTMLIFrameElement)try{r=r.contentDocument.head}catch(e){r=null}t[n]=r}return t[n]}}((function(e){return document.querySelector(e)})),u=null,s=0,c=[],f=n(16);function d(e,t){for(var n=0;n=0&&c.splice(t,1)}function v(e){var t=document.createElement("style");return e.attrs.type="text/css",g(t,e.attrs),h(e,t),t}function g(e,t){Object.keys(t).forEach((function(n){e.setAttribute(n,t[n])}))}function b(e,t){var n,r,a,o;if(t.transform&&e.css){if(!(o=t.transform(e.css)))return function(){};e.css=o}if(t.singleton){var l=s++;n=u||(u=v(t)),r=w.bind(null,n,l,!1),a=w.bind(null,n,l,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=function(e){var t=document.createElement("link");return e.attrs.type="text/css",e.attrs.rel="stylesheet",g(t,e.attrs),h(e,t),t}(t),r=S.bind(null,n,t),a=function(){m(n),n.href&&URL.revokeObjectURL(n.href)}):(n=v(t),r=k.bind(null,n),a=function(){m(n)});return r(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;r(e=t)}else a()}}e.exports=function(e,t){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(t=t||{}).attrs="object"==typeof t.attrs?t.attrs:{},t.singleton||(t.singleton=l()),t.insertInto||(t.insertInto="head"),t.insertAt||(t.insertAt="bottom");var n=p(e,t);return d(n,t),function(e){for(var r=[],a=0;a