From 22462e4d0e002a393246c423ef57103ba084697a Mon Sep 17 00:00:00 2001 From: Core <64542347+coredev-uk@users.noreply.github.com> Date: Tue, 28 Dec 2021 20:50:31 +0000 Subject: [PATCH 01/61] initial --- index.js | 66 +------ src/main/base/store.js | 48 +++++ src/main/base/win.js | 257 +++++++++++++++++++++++++ src/main/cider-base.js | 275 +++------------------------ src/main/{ => plugins}/discordrpc.js | 0 src/main/{ => plugins}/lastfm.js | 2 +- src/main/{ => plugins}/mpris.js | 0 7 files changed, 344 insertions(+), 304 deletions(-) create mode 100644 src/main/base/store.js create mode 100644 src/main/base/win.js rename src/main/{ => plugins}/discordrpc.js (100%) rename src/main/{ => plugins}/lastfm.js (98%) rename src/main/{ => plugins}/mpris.js (100%) diff --git a/index.js b/index.js index 6688ecfc..61dfc939 100644 --- a/index.js +++ b/index.js @@ -7,49 +7,12 @@ const { app } = require('electron'), const ElectronSentry = require("@sentry/electron"); ElectronSentry.init({ dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214" }); -const configSchema = { - "general": { - "close_behavior": 0, // 0 = close, 1 = minimize, 2 = minimize to tray - "startup_behavior": 0, // 0 = nothing, 1 = open on startup - "discord_rpc": 1, // 0 = disabled, 1 = enabled as Cider, 2 = enabled as Apple Music - "discordClearActivityOnPause" : 0, // 0 = disabled, 1 = enabled - "volume": 1 - }, - "audio": { - "quality": "extreme", - "seamless_audio": true - }, - "visual": { - "theme": "", - "scrollbars": 0, // 0 = show on hover, 2 = always hide, 3 = always show - "refresh_rate": 0, - "animated_artwork": "always", // 0 = always, 1 = limited, 2 = never - "animated_artwork_qualityLevel": 1, - "hw_acceleration": "default", // default, webgpu, disabled - "window_transparency": "default" - }, - "lyrics": { - "enable_mxm": false, - "mxm_karaoke" : false, - "mxm_language": "en", - "enable_yt": false, - }, - "lastfm": { - "enabled": false, - "scrobble_after": 30, - "auth_token": "", - "enabledRemoveFeaturingArtists" : true, - "NowPlaying": "true" - } -} - // Enable WebGPU and list adapters (EXPERIMENTAL.) // Note: THIS HAS TO BE BEFORE ANYTHING GETS INITIALIZED. -const Store = require("electron-store"); -app.cfg = new Store({ - defaults: configSchema, -}); +// const {Init} = require("./src/main/cider-base"); +// Init() +CiderBase.Init() switch (app.cfg.get("visual.hw_acceleration")) { default: @@ -66,17 +29,6 @@ switch (app.cfg.get("visual.hw_acceleration")) { break; } -// Creating the Application Window and Calling all the Functions -function CreateWindow() { - if (app.isQuiting) { app.quit(); return; } - - /** CIDER **/ - const ciderwin = require("./src/main/cider-base") - app.win = ciderwin - app.win.Start() - /** CIDER **/ -} - if (process.platform === "linux") { app.commandLine.appendSwitch('disable-features', 'MediaSessionService'); } @@ -99,7 +51,8 @@ app.on('ready', () => { console.info('[Cider] Running in development mode.') require('vue-devtools').install() } - CreateWindow() + const {Start} = require('./src/main/cider-base') + Start() }); app.on('before-quit', () => { @@ -163,20 +116,21 @@ app.on('second-instance', (_e, argv) => { if (argv.includes("--force-quit")) { console.warn('[InstanceHandler][SecondInstanceHandler] Force Quit found. Quitting App.'); - // app.isQuiting = true + app.isQuiting = true app.quit() - } else if (CiderBase.win && true) { // If a Second Instance has Been Started + } else if (app.win && !app.cfg.get('advanced.allowMultipleInstances')) { // If a Second Instance has Been Started console.warn('[InstanceHandler][SecondInstanceHandler] Showing window.'); app.win.show() app.win.focus() } }) -if (!app.requestSingleInstanceLock() && true) { +if (!app.requestSingleInstanceLock() && !app.cfg.get('advanced.allowMultipleInstances')) { console.warn("[InstanceHandler] Existing Instance is Blocking Second Instance."); app.quit(); - // app.isQuiting = true + app.isQuiting = true } + \ No newline at end of file diff --git a/src/main/base/store.js b/src/main/base/store.js new file mode 100644 index 00000000..1f6d3d93 --- /dev/null +++ b/src/main/base/store.js @@ -0,0 +1,48 @@ +const Store = require("electron-store"), + {app} = require("electron"); + +module.exports = { + + defaults: { + "general": { + "close_behavior": 0, // 0 = close, 1 = minimize, 2 = minimize to tray + "startup_behavior": 0, // 0 = nothing, 1 = open on startup + "discord_rpc": 1, // 0 = disabled, 1 = enabled as Cider, 2 = enabled as Apple Music + "discordClearActivityOnPause" : 0, // 0 = disabled, 1 = enabled + "volume": 1 + }, + "audio": { + "quality": "extreme", + "seamless_audio": true + }, + "visual": { + "theme": "", + "scrollbars": 0, // 0 = show on hover, 2 = always hide, 3 = always show + "refresh_rate": 0, + "animated_artwork": "always", // 0 = always, 1 = limited, 2 = never + "animated_artwork_qualityLevel": 1, + "hw_acceleration": "default", // default, webgpu, disabled + "window_transparency": "default" + }, + "lyrics": { + "enable_mxm": false, + "mxm_karaoke" : false, + "mxm_language": "en", + "enable_yt": false, + }, + "lastfm": { + "enabled": false, + "scrobble_after": 30, + "auth_token": "", + "enabledRemoveFeaturingArtists" : true, + "NowPlaying": "true" + } + }, + + init() { + app.cfg = new Store({ + defaults: this.defaults, + }); + } + +} \ No newline at end of file diff --git a/src/main/base/win.js b/src/main/base/win.js new file mode 100644 index 00000000..44d3fa6f --- /dev/null +++ b/src/main/base/win.js @@ -0,0 +1,257 @@ +const {join} = require("path"), + {ipcMain, app, shell, screen} = require("electron"), + express = require("express"), + path = require("path"), + getPort = require("get-port"), + yt = require("youtube-search-without-api-key"), + os = require("os"); + +module.exports = { + + browserWindow: {}, + + clientPort: await getPort({port: 9000}), + + EnvironmentVariables: { + "env": { + platform: os.platform(), + dev: app.isPackaged + } + }, + + //------------------------------------------------------------------------------- + // Public Methods + //------------------------------------------------------------------------------- + + /** + * Creates the BrowserWindow for the application. + * @return {object} Window + */ + createBrowserWindow() { + const windowStateKeeper = require("electron-window-state"), + BrowserWindow = require((process.platform === "win32") ? "electron-acrylic-window" : "electron").BrowserWindow; + + const windowState = windowStateKeeper({ + defaultWidth: 1024, + defaultHeight: 600 + }); + + this.browserWindow = new BrowserWindow({ + icon: join(__dirname, `../../../resources/icons/icon.ico`), + width: windowState.width, + height: windowState.height, + x: windowState.x, + y: windowState.y, + minWidth: 844, + minHeight: 410, + frame: false, + title: "Cider", + vibrancy: 'dark', + transparent: process.platform === "darwin", + hasShadow: false, + webPreferences: { + webviewTag: true, + plugins: true, + nodeIntegration: true, + nodeIntegrationInWorker: false, + webSecurity: false, + allowRunningInsecureContent: true, + enableRemoteModule: true, + sandbox: true, + nativeWindowOpen: true, + contextIsolation: false, + preload: join(__dirname, '../../preload/cider-preload.js') + } + }) + + this.initializeWebServer(); + this.initializeSession(); + this.initializeHandlers(); + + windowState.manage(this.browserWindow); + this.browserWindow.webContents.setZoomFactor(screen.getPrimaryDisplay().scaleFactor) + + return this.browserWindow + }, + + /** + * Initializes the BrowserWindow handlers for the application. + */ + initializeHandlers() { + const self = this; + + this.browserWindow.on('closed', () => { + this.browserWindow = null; + }); + + if (process.platform === "win32") { + let WND_STATE = { + MINIMIZED: 0, + NORMAL: 1, + MAXIMIZED: 2, + FULL_SCREEN: 3 + } + let wndState = WND_STATE.NORMAL + + self.browserWindow.on("resize", (_event) => { + const isMaximized = self.browserWindow.isMaximized() + const isMinimized = self.browserWindow.isMinimized() + const isFullScreen = self.browserWindow.isFullScreen() + const state = wndState; + if (isMinimized && state !== WND_STATE.MINIMIZED) { + wndState = WND_STATE.MINIMIZED + } else if (isFullScreen && state !== WND_STATE.FULL_SCREEN) { + wndState = WND_STATE.FULL_SCREEN + } else if (isMaximized && state !== WND_STATE.MAXIMIZED) { + wndState = WND_STATE.MAXIMIZED + self.browserWindow.webContents.executeJavaScript(`app.chrome.maximized = true`) + } else if (state !== WND_STATE.NORMAL) { + wndState = WND_STATE.NORMAL + self.browserWindow.webContents.executeJavaScript(`app.chrome.maximized = false`) + } + }) + } + + // Set window Handler + this.browserWindow.webContents.setWindowOpenHandler(({url}) => { + if (url.includes("apple") || url.includes("localhost")) { + return {action: "allow"} + } + shell.openExternal(url).catch(() => { + }) + return { + action: 'deny' + } + }) + + //------------------------------------------------------------------------------- + // Renderer IPC Listeners + //------------------------------------------------------------------------------- + + ipcMain.on("cider-platform", (event) => { + event.returnValue = process.platform + }) + + ipcMain.on("get-gpu-mode", (event) => { + event.returnValue = process.platform + }) + + ipcMain.on("is-dev", (event) => { + event.returnValue = !app.isPackaged + }) + + // IPC stuff (listeners) + ipcMain.on('close', () => { // listen for close event + self.browserWindow.close(); + }) + + ipcMain.handle('getYTLyrics', async (event, track, artist) => { + const u = track + " " + artist + " official video"; + const videos = await yt.search(u); + return videos + }) + + ipcMain.handle('getStoreValue', (event, key, defaultValue) => { + return (defaultValue ? app.cfg.get(key, true) : app.cfg.get(key)); + }); + + ipcMain.handle('setStoreValue', (event, key, value) => { + app.cfg.set(key, value); + }); + + ipcMain.on('getStore', (event) => { + event.returnValue = app.cfg.store + }) + + ipcMain.on('setStore', (event, store) => { + app.cfg.store = store + }) + + ipcMain.on('maximize', () => { // listen for maximize event + if (self.browserWindow.isMaximized()) { + self.browserWindow.unmaximize() + } else { + self.browserWindow.maximize() + } + }) + + ipcMain.on('minimize', () => { // listen for minimize event + self.browserWindow.minimize(); + }) + + // Set scale + ipcMain.on('setScreenScale', (event, scale) => { + self.browserWindow.webContents.setZoomFactor(parseFloat(scale)) + }) + }, + + /** + * Starts the webserver + */ + initializeWebServer() { + const self = this; + const webapp = express(), + webRemotePath = path.join(__dirname, '../../renderer/'); + + webapp.set("views", path.join(webRemotePath, "views")); + webapp.set("view engine", "ejs"); + + webapp.use(function (req, res, next) { + // if not localhost + if (req.headers.host.includes("localhost") && req.headers["user-agent"].includes("Cider")) { + next(); + } + }); + + webapp.use(express.static(webRemotePath)); + webapp.get('/', function (req, res) { + //res.sendFile(path.join(webRemotePath, 'index_old.html')); + res.render("main", self.EnvironmentVariables) + }); + webapp.listen(this.clientPort, function () { + console.log(`Cider client port: ${self.clientPort}`); + }); + }, + + /** + * Initializes the application session. + */ + initializeSession() { + const self = this; + + // intercept "https://js-cdn.music.apple.com/hls.js/2.141.0/hls.js/hls.js" and redirect to local file "./apple-hls.js" instead + this.browserWindow.webContents.session.webRequest.onBeforeRequest( + { + urls: ["https://*/*.js"] + }, + (details, callback) => { + if (details.url.includes("hls.js")) { + callback({ + redirectURL: `http://localhost:${self.clientPort}/apple-hls.js` + }) + } else { + callback({ + cancel: false + }) + } + } + ) + + this.browserWindow.webContents.session.webRequest.onBeforeSendHeaders(async (details, callback) => { + if (details.url === "https://buy.itunes.apple.com/account/web/info") { + details.requestHeaders['sec-fetch-site'] = 'same-site'; + details.requestHeaders['DNT'] = '1'; + let itspod = await this.browserWindow.webContents.executeJavaScript(`window.localStorage.getItem("music.ampwebplay.itspod")`) + if (itspod != null) + details.requestHeaders['Cookie'] = `itspod=${itspod}` + } + callback({requestHeaders: details.requestHeaders}) + }) + + let location = `http://localhost:${this.clientPort}/` + this.browserWindow.loadURL(location).catch(err => { + console.log(err) + }) + } + +} \ No newline at end of file diff --git a/src/main/cider-base.js b/src/main/cider-base.js index 52786201..abb14e59 100644 --- a/src/main/cider-base.js +++ b/src/main/cider-base.js @@ -6,243 +6,50 @@ const path = require("path"); const windowStateKeeper = require("electron-window-state"); const os = require('os'); const yt = require('youtube-search-without-api-key'); -const discord = require('./discordrpc'); -const lastfm = require('./lastfm'); -const mpris = require('./mpris'); +const discord = require('./plugins/discordrpc'); +const lastfm = require('./plugins/lastfm'); +const mpris = require('./plugins/mpris'); // Analytics for debugging. const ElectronSentry = require("@sentry/electron"); ElectronSentry.init({dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214"}); -const CiderBase = { - win: null, - async Start() { - this.clientPort = await getPort({port: 9000}); - this.win = this.CreateBrowserWindow() - }, - clientPort: 0, - CreateBrowserWindow() { - // Set default window sizes - const mainWindowState = windowStateKeeper({ - defaultWidth: 1024, - defaultHeight: 600 - }); +module.exports = { - let win = null - const options = { - icon: join(__dirname, `../../resources/icons/icon.ico`), - width: mainWindowState.width, - height: mainWindowState.height, - x: mainWindowState.x, - y: mainWindowState.y, - minWidth: 844, - minHeight: 410, - frame: false, - title: "Cider", - vibrancy: 'dark', - // transparent: true, - hasShadow: false, - webPreferences: { - webviewTag: true, - plugins: true, - nodeIntegration: true, - nodeIntegrationInWorker: false, - webSecurity: false, - allowRunningInsecureContent: true, - enableRemoteModule: true, - sandbox: true, - nativeWindowOpen: true, - contextIsolation: false, - preload: join(__dirname, '../preload/cider-preload.js') - } - } + //------------------------------------------------------------------------------- + // Public Methods + //------------------------------------------------------------------------------- - CiderBase.InitWebServer() - - // Create the BrowserWindow - if (process.platform === "darwin" || process.platform === "linux") { - win = new BrowserWindow(options) - } else { - const {BrowserWindow} = require("electron-acrylic-window"); - win = new BrowserWindow(options) - } - - // intercept "https://js-cdn.music.apple.com/hls.js/2.141.0/hls.js/hls.js" and redirect to local file "./apple-hls.js" instead - win.webContents.session.webRequest.onBeforeRequest( - { - urls: ["https://*/*.js"] - }, - (details, callback) => { - if (details.url.includes("hls.js")) { - callback({ - redirectURL: `http://localhost:${CiderBase.clientPort}/apple-hls.js` - }) - } else { - callback({ - cancel: false - }) - } - } - ) - - win.webContents.session.webRequest.onBeforeSendHeaders(async (details, callback) => { - if (details.url === "https://buy.itunes.apple.com/account/web/info") { - details.requestHeaders['sec-fetch-site'] = 'same-site'; - details.requestHeaders['DNT'] = '1'; - let itspod = await win.webContents.executeJavaScript(`window.localStorage.getItem("music.ampwebplay.itspod")`) - if (itspod != null) - details.requestHeaders['Cookie'] = `itspod=${itspod}` - } - callback({requestHeaders: details.requestHeaders}) - }) - - let location = `http://localhost:${CiderBase.clientPort}/` - win.loadURL(location) - win.on("closed", () => { - win = null - }) - - // Register listeners on Window to track size and position of the Window. - mainWindowState.manage(win); - - // IPC stuff (senders) - ipcMain.on("cider-platform", (event) => { - event.returnValue = process.platform - }) - - ipcMain.on("get-gpu-mode", (event) => { - event.returnValue = process.platform - }) - - ipcMain.on("is-dev", (event) => { - event.returnValue = !app.isPackaged - }) - - // IPC stuff (listeners) - ipcMain.on('close', () => { // listen for close event - win.close(); - }) - - ipcMain.handle('getYTLyrics', async (event, track, artist) => { - var u = track + " " + artist + " official video"; - const videos = await yt.search(u); - return videos - }) - - ipcMain.handle('getStoreValue', (event, key, defaultValue) => { - return (defaultValue ? app.cfg.get(key, true) : app.cfg.get(key)); - }); - - ipcMain.handle('setStoreValue', (event, key, value) => { - app.cfg.set(key, value); - }); - - ipcMain.on('getStore', (event) => { - event.returnValue = app.cfg.store - }) - - ipcMain.on('setStore', (event, store) => { - app.cfg.store = store - }) - - ipcMain.on('maximize', () => { // listen for maximize event - if (win.isMaximized()) { - win.unmaximize() - } else { - win.maximize() - } - }) - - ipcMain.on('minimize', () => { // listen for minimize event - win.minimize(); - }) - - if (process.platform === "win32") { - let WND_STATE = { - MINIMIZED: 0, - NORMAL: 1, - MAXIMIZED: 2, - FULL_SCREEN: 3 - } - let wndState = WND_STATE.NORMAL - - win.on("resize", (_event) => { - const isMaximized = win.isMaximized() - const isMinimized = win.isMinimized() - const isFullScreen = win.isFullScreen() - const state = wndState; - if (isMinimized && state !== WND_STATE.MINIMIZED) { - wndState = WND_STATE.MINIMIZED - } else if (isFullScreen && state !== WND_STATE.FULL_SCREEN) { - wndState = WND_STATE.FULL_SCREEN - } else if (isMaximized && state !== WND_STATE.MAXIMIZED) { - wndState = WND_STATE.MAXIMIZED - win.webContents.executeJavaScript(`app.chrome.maximized = true`) - } else if (state !== WND_STATE.NORMAL) { - wndState = WND_STATE.NORMAL - win.webContents.executeJavaScript(`app.chrome.maximized = false`) - } - }) - } - - // Set window Handler - win.webContents.setWindowOpenHandler(({url}) => { - if (url.includes("apple") || url.includes("localhost")) { - return {action: "allow"} - } - shell.openExternal(url).catch(() => { - }) - return { - action: 'deny' - } - }) - - // Set scale - ipcMain.on('setScreenScale', (event, scale) => { - win.webContents.setZoomFactor(parseFloat(scale)) - }) - - win.webContents.setZoomFactor(screen.getPrimaryDisplay().scaleFactor) - - mpris.connect(win) - - lastfm.authenticate() - // Discord - discord.connect((app.cfg.get("general.discord_rpc") == 1) ? '911790844204437504' : '886578863147192350'); - ipcMain.on('playbackStateDidChange', (_event, a) => { - app.media = a; - discord.updateActivity(a) - mpris.updateState(a) - lastfm.scrobbleSong(a) - lastfm.updateNowPlayingSong(a) - }); - ipcMain.on('nowPlayingItemDidChange', (_event, a) => { - app.media = a; - discord.updateActivity(a) - mpris.updateAttributes(a) - lastfm.scrobbleSong(a) - lastfm.updateNowPlayingSong(a) - }); - - return win + /** + * Starts the application (called on on-ready). - Starts BrowserWindow and WebServer + */ + Start() { + const {createBrowserWindow} = require("./base/win"); + app.win = createBrowserWindow() }, - EnvironmentVariables: { - "env": { - platform: os.platform(), - dev: app.isPackaged - } + /** + * Initializes the main application (run before on-ready) + */ + Init() { + // Initialize the config. + const {init} = require("./base/store"); + init() }, - LinkHandler: (startArgs) => { + + /** + * Handles all links being opened in the application. + */ + LinkHandler(startArgs) { if (!startArgs) return; - console.log("lfmtoken",String(startArgs)) + console.log("lfmtoken", String(startArgs)) if (String(startArgs).includes('auth')) { let authURI = String(startArgs).split('/auth/')[1] if (authURI.startsWith('lastfm')) { // If we wanted more auth options const authKey = authURI.split('lastfm?token=')[1]; app.cfg.set('lastfm.enabled', true); app.cfg.set('lastfm.auth_token', authKey); - CiderBase.win.webContents.send('LastfmAuthenticated', authKey); + app.win.webContents.send('LastfmAuthenticated', authKey); lastfm.authenticate() } } else { @@ -258,30 +65,4 @@ const CiderBase = { } }, - - async InitWebServer() { - const webapp = express(); - const webRemotePath = path.join(__dirname, '../renderer/'); - webapp.set("views", path.join(webRemotePath, "views")); - webapp.set("view engine", "ejs"); - - webapp.use(function (req, res, next) { - // if not localhost - if (req.headers.host.includes("localhost") && req.headers["user-agent"].includes("Cider")) { - next(); - } - }); - - webapp.use(express.static(webRemotePath)); - webapp.get('/', function (req, res) { - //res.sendFile(path.join(webRemotePath, 'index_old.html')); - res.render("main", CiderBase.EnvironmentVariables) - }); - webapp.listen(CiderBase.clientPort, function () { - console.log(`Cider client port: ${CiderBase.clientPort}`); - }); - }, - -} - -module.exports = CiderBase; +} \ No newline at end of file diff --git a/src/main/discordrpc.js b/src/main/plugins/discordrpc.js similarity index 100% rename from src/main/discordrpc.js rename to src/main/plugins/discordrpc.js diff --git a/src/main/lastfm.js b/src/main/plugins/lastfm.js similarity index 98% rename from src/main/lastfm.js rename to src/main/plugins/lastfm.js index 74dfa5b2..541cde82 100644 --- a/src/main/lastfm.js +++ b/src/main/plugins/lastfm.js @@ -2,7 +2,7 @@ const {app, Notification} = require('electron'), fs = require('fs'), {resolve} = require('path'), sessionPath = resolve(app.getPath('userData'), 'session.json'), - apiCredentials = require('../../resources/lfmApiCredentials.json'), + apiCredentials = require('../../../resources/lfmApiCredentials.json'), LastfmAPI = require('lastfmapi'); const lfm = { diff --git a/src/main/mpris.js b/src/main/plugins/mpris.js similarity index 100% rename from src/main/mpris.js rename to src/main/plugins/mpris.js From e6c5c043c375b0c09cb5300cc8cf384f7a2879cd Mon Sep 17 00:00:00 2001 From: Core <64542347+coredev-uk@users.noreply.github.com> Date: Tue, 28 Dec 2021 21:05:25 +0000 Subject: [PATCH 02/61] fix --- index.js | 4 ++-- src/main/base/win.js | 8 +++++--- src/main/cider-base.js | 14 ++------------ 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/index.js b/index.js index 61dfc939..42f86453 100644 --- a/index.js +++ b/index.js @@ -51,8 +51,8 @@ app.on('ready', () => { console.info('[Cider] Running in development mode.') require('vue-devtools').install() } - const {Start} = require('./src/main/cider-base') - Start() + + CiderBase.Start() }); app.on('before-quit', () => { diff --git a/src/main/base/win.js b/src/main/base/win.js index 44d3fa6f..945e0e33 100644 --- a/src/main/base/win.js +++ b/src/main/base/win.js @@ -10,7 +10,7 @@ module.exports = { browserWindow: {}, - clientPort: await getPort({port: 9000}), + clientPort: 0, EnvironmentVariables: { "env": { @@ -25,9 +25,11 @@ module.exports = { /** * Creates the BrowserWindow for the application. - * @return {object} Window + * @return {object} BrowserWindow */ - createBrowserWindow() { + async createBrowserWindow() { + this.clientPort = await getPort({port: 9000}); + const windowStateKeeper = require("electron-window-state"), BrowserWindow = require((process.platform === "win32") ? "electron-acrylic-window" : "electron").BrowserWindow; diff --git a/src/main/cider-base.js b/src/main/cider-base.js index abb14e59..db0a7074 100644 --- a/src/main/cider-base.js +++ b/src/main/cider-base.js @@ -1,14 +1,5 @@ -const {BrowserWindow, ipcMain, shell, app, screen} = require("electron") -const {join} = require("path") -const getPort = require("get-port"); -const express = require("express"); -const path = require("path"); -const windowStateKeeper = require("electron-window-state"); -const os = require('os'); -const yt = require('youtube-search-without-api-key'); -const discord = require('./plugins/discordrpc'); const lastfm = require('./plugins/lastfm'); -const mpris = require('./plugins/mpris'); +const win = require('./base/win') // Analytics for debugging. const ElectronSentry = require("@sentry/electron"); @@ -24,8 +15,7 @@ module.exports = { * Starts the application (called on on-ready). - Starts BrowserWindow and WebServer */ Start() { - const {createBrowserWindow} = require("./base/win"); - app.win = createBrowserWindow() + app.win = win.createBrowserWindow() }, /** From a30297cfb7a0fdbb8b055553bbda8ec2a3bc8302 Mon Sep 17 00:00:00 2001 From: Core <64542347+coredev-uk@users.noreply.github.com> Date: Wed, 29 Dec 2021 18:51:18 +0000 Subject: [PATCH 03/61] moved some stuff --- index.js | 32 ++------------------------------ src/main/cider-base.js | 40 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/index.js b/index.js index 42f86453..0df74743 100644 --- a/index.js +++ b/index.js @@ -7,45 +7,17 @@ const { app } = require('electron'), const ElectronSentry = require("@sentry/electron"); ElectronSentry.init({ dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214" }); -// Enable WebGPU and list adapters (EXPERIMENTAL.) -// Note: THIS HAS TO BE BEFORE ANYTHING GETS INITIALIZED. - // const {Init} = require("./src/main/cider-base"); // Init() -CiderBase.Init() - -switch (app.cfg.get("visual.hw_acceleration")) { - default: - case "default": - - break; - case "webgpu": - console.info("WebGPU is enabled."); - app.commandLine.appendSwitch('enable-unsafe-webgpu') - break; - case "disabled": - console.info("Hardware acceleration is disabled."); - app.commandLine.appendSwitch('disable-gpu') - break; -} - -if (process.platform === "linux") { - app.commandLine.appendSwitch('disable-features', 'MediaSessionService'); -} - +CiderBase.Init().catch(() => {}) /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * App Event Handlers * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ -app.commandLine.appendSwitch('js-flags', '--max-old-space-size=1024') - app.on('ready', () => { if (app.isQuiting) { app.quit(); return; } - app.commandLine.appendSwitch('high-dpi-support', 1) - app.commandLine.appendSwitch('force-device-scale-factor', 1) - app.commandLine.appendSwitch('disable-pinch'); - + console.log('[Cider] Application is Ready. Creating Window.') if (!app.isPackaged) { console.info('[Cider] Running in development mode.') diff --git a/src/main/cider-base.js b/src/main/cider-base.js index db0a7074..0b77d88d 100644 --- a/src/main/cider-base.js +++ b/src/main/cider-base.js @@ -3,6 +3,7 @@ const win = require('./base/win') // Analytics for debugging. const ElectronSentry = require("@sentry/electron"); +const {app} = require("electron"); ElectronSentry.init({dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214"}); module.exports = { @@ -19,12 +20,43 @@ module.exports = { }, /** - * Initializes the main application (run before on-ready) - */ - Init() { + * Initializes the main application (run before on-ready) + */ + async Init() { // Initialize the config. const {init} = require("./base/store"); - init() + await init() + + //------------------------------------------------------------------------------- + // Append Commandline Arguments + //------------------------------------------------------------------------------- + + // Hardware Acceleration + // Enable WebGPU and list adapters (EXPERIMENTAL.) + // Note: THIS HAS TO BE BEFORE ANYTHING GETS INITIALIZED. + switch (app.cfg.get("visual.hw_acceleration")) { + default: + case "default": + + break; + case "webgpu": + console.info("WebGPU is enabled."); + app.commandLine.appendSwitch('enable-unsafe-webgpu') + break; + case "disabled": + console.info("Hardware acceleration is disabled."); + app.commandLine.appendSwitch('disable-gpu') + break; + } + + if (process.platform === "linux") { + app.commandLine.appendSwitch('disable-features', 'MediaSessionService'); + } + + app.commandLine.appendSwitch('high-dpi-support', 'true'); + app.commandLine.appendSwitch('force-device-scale-factor', '1'); + app.commandLine.appendSwitch('disable-pinch'); + app.commandLine.appendSwitch('js-flags', '--max-old-space-size=1024') }, /** From 98ced86c71bfee70650bf9c9f2a650b9fdf561f5 Mon Sep 17 00:00:00 2001 From: Core <64542347+coredev-uk@users.noreply.github.com> Date: Sat, 1 Jan 2022 15:42:39 +0000 Subject: [PATCH 04/61] test --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 0df74743..06d85e73 100644 --- a/index.js +++ b/index.js @@ -3,7 +3,7 @@ const { app } = require('electron'), {resolve} = require("path"), CiderBase = require ('./src/main/cider-base'); -// Analytics for debugging. +// Analytics for debugging fun yeah. const ElectronSentry = require("@sentry/electron"); ElectronSentry.init({ dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214" }); From 08e68f4de8ba12efe38168232ad1adbe7a236d27 Mon Sep 17 00:00:00 2001 From: Core <64542347+coredev-uk@users.noreply.github.com> Date: Sat, 1 Jan 2022 17:03:47 +0000 Subject: [PATCH 05/61] test --- src/main/base/win.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/base/win.js b/src/main/base/win.js index 945e0e33..4003359e 100644 --- a/src/main/base/win.js +++ b/src/main/base/win.js @@ -5,6 +5,7 @@ const {join} = require("path"), getPort = require("get-port"), yt = require("youtube-search-without-api-key"), os = require("os"); + module.exports = { From 84e1ff1d5f94d2200855cfe57861c3259f284391 Mon Sep 17 00:00:00 2001 From: Core Date: Sat, 1 Jan 2022 17:05:42 +0000 Subject: [PATCH 06/61] sorry --- src/main/base/win.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/base/win.js b/src/main/base/win.js index 4003359e..945e0e33 100644 --- a/src/main/base/win.js +++ b/src/main/base/win.js @@ -5,7 +5,6 @@ const {join} = require("path"), getPort = require("get-port"), yt = require("youtube-search-without-api-key"), os = require("os"); - module.exports = { From 1eb2f7e4632e1bafde1ccfcd0a16b69ff7570fcc Mon Sep 17 00:00:00 2001 From: Core Date: Sun, 2 Jan 2022 04:43:36 +0000 Subject: [PATCH 07/61] non-functional atm --- .gitignore | 1 + build/index.js | 140 ++++++++++++++++++++++++++++++++++ build/index.js.map | 1 + package.json | 28 +++---- index.js => src/main/index.ts | 31 ++++---- tsconfig.json | 17 +++++ 6 files changed, 188 insertions(+), 30 deletions(-) create mode 100644 build/index.js create mode 100644 build/index.js.map rename index.js => src/main/index.ts (90%) create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore index e1bcb518..5972eec3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ dist yarn* package-lock.json .yarnclean +build # Misc .idea diff --git a/build/index.js b/build/index.js new file mode 100644 index 00000000..882db786 --- /dev/null +++ b/build/index.js @@ -0,0 +1,140 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require('v8-compile-cache'); +// import { app } from 'electron'; +// import { resolve } from 'path'; +const electron_1 = require("electron"); +const path = require("path"); +function createWindow() { + // Create the browser window. + const mainWindow = new electron_1.BrowserWindow({ + height: 600, + webPreferences: { + preload: path.join(__dirname, "preload.js"), + }, + width: 800, + }); + // and load the index.html of the app. + mainWindow.loadFile(path.join(__dirname, "./src/renderer/index.html")); + // Open the DevTools. + mainWindow.webContents.openDevTools(); +} +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +electron_1.app.on("ready", () => { + createWindow(); + electron_1.app.on("activate", function () { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (electron_1.BrowserWindow.getAllWindows().length === 0) + createWindow(); + }); +}); +// Quit when all windows are closed, except on macOS. There, it's common +// for applications and their menu bar to stay active until the user quits +// explicitly with Cmd + Q. +electron_1.app.on("window-all-closed", () => { + if (process.platform !== "darwin") { + electron_1.app.quit(); + } +}); +// Analytics for debugging fun yeah. +// const ElectronSentry = require("@sentry/electron"); +// ElectronSentry.init({ dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214" }); +// +// // const {Init} = require("./src/main/cider-base"); +// // Init() +// +// /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// * App Event Handlers +// * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +// +// app.on('ready', () => { +// if (app.isQuiting) { app.quit(); return; } +// +// console.log('[Cider] Application is Ready. Creating Window.') +// if (!app.isPackaged) { +// console.info('[Cider] Running in development mode.') +// require('vue-devtools').install() +// } +// +// // CiderBase.Start() +// }); +// +// app.on('before-quit', () => { +// app.isQuiting = true; +// console.warn(`${app.getName()} exited.`); +// }); +// +// // Widevine Stuff +// app.on('widevine-ready', (version, lastVersion) => { +// if (null !== lastVersion) { +// console.log('[Cider][Widevine] Widevine ' + version + ', upgraded from ' + lastVersion + ', is ready to be used!') +// } else { +// console.log('[Cider][Widevine] Widevine ' + version + ' is ready to be used!') +// } +// }) +// +// app.on('widevine-update-pending', (currentVersion, pendingVersion) => { +// console.log('[Cider][Widevine] Widevine ' + currentVersion + ' is ready to be upgraded to ' + pendingVersion + '!') +// }) +// +// app.on('widevine-error', (error) => { +// console.log('[Cider][Widevine] Widevine installation encountered an error: ' + error) +// app.exit() +// }) +// +// if (process.defaultApp) { +// if (process.argv.length >= 2) { +// app.setAsDefaultProtocolClient('cider', process.execPath, [resolve(process.argv[1])]) +// app.setAsDefaultProtocolClient('ame', process.execPath, [resolve(process.argv[1])]) +// app.setAsDefaultProtocolClient('itms', process.execPath, [resolve(process.argv[1])]) +// app.setAsDefaultProtocolClient('itmss', process.execPath, [resolve(process.argv[1])]) +// app.setAsDefaultProtocolClient('musics', process.execPath, [resolve(process.argv[1])]) +// app.setAsDefaultProtocolClient('music', process.execPath, [resolve(process.argv[1])]) +// } +// } else { +// app.setAsDefaultProtocolClient('cider') // Custom AME Protocol +// app.setAsDefaultProtocolClient('ame') // Custom AME Protocol +// app.setAsDefaultProtocolClient('itms') // iTunes HTTP Protocol +// app.setAsDefaultProtocolClient('itmss') // iTunes HTTPS Protocol +// app.setAsDefaultProtocolClient('musics') // macOS Client Protocol +// app.setAsDefaultProtocolClient('music') // macOS Client Protocol +// } +// +// app.on('open-url', (event, url) => { +// event.preventDefault() +// if (url.includes('ame://') || url.includes('itms://') || url.includes('itmss://') || url.includes('musics://') || url.includes('music://')) { +// CiderBase.LinkHandler(url) +// } +// }) +// +// app.on('second-instance', (_e, argv) => { +// console.warn(`[InstanceHandler][SecondInstanceHandler] Second Instance Started with args: [${argv.join(', ')}]`) +// +// // Checks if first instance is authorized and if second instance has protocol args +// argv.forEach((value) => { +// if (value.includes('ame://') || value.includes('itms://') || value.includes('itmss://') || value.includes('musics://') || value.includes('music://')) { +// console.warn(`[InstanceHandler][SecondInstanceHandler] Found Protocol!`) +// CiderBase.LinkHandler(value); +// } +// }) +// +// if (argv.includes("--force-quit")) { +// console.warn('[InstanceHandler][SecondInstanceHandler] Force Quit found. Quitting App.'); +// app.isQuiting = true +// app.quit() +// } else if (app.win && !app.cfg.get('advanced.allowMultipleInstances')) { // If a Second Instance has Been Started +// console.warn('[InstanceHandler][SecondInstanceHandler] Showing window.'); +// app.win.show() +// app.win.focus() +// } +// }) +// +// if (!app.requestSingleInstanceLock() && !app.cfg.get('advanced.allowMultipleInstances')) { +// console.warn("[InstanceHandler] Existing Instance is Blocking Second Instance."); +// app.quit(); +// app.isQuiting = true +// } +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/index.js.map b/build/index.js.map new file mode 100644 index 00000000..2d2ac767 --- /dev/null +++ b/build/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/main/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index a45419e1..83eebac8 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "version": "1.0.0", "description": "A new look into listening and enjoying music in style and performance.", "license": "MIT", + "main": "./build/index.js", "author": "Cider Collective (https://cider.sh)", "repository": "https://github.com/ciderapp/Cider.git", "bugs": { @@ -13,10 +14,12 @@ "homepage": "https://cider.sh/", "buildResources": "resources", "scripts": { - "init": "yarn install --force", - "start": "electron . --enable-accelerated-mjpeg-decode --enable-accelerated-video --disable-gpu-driver-bug-workarounds --ignore-gpu-blacklist --enable-native-gpu-memory-buffers", + "build": "tsc", + "init": "install --force", + "watch": "tsc --watch", + "start": "npm run build && electron ./build/index.js --enable-accelerated-mjpeg-decode --enable-accelerated-video --disable-gpu-driver-bug-workarounds --ignore-gpu-blacklist --enable-native-gpu-memory-buffers", "pack": "electron-builder --dir", - "dist": "electron-builder", + "dist": "npm run build && electron-builder", "msft": "electron-builder -c msft-package.json", "postinstall": "electron-builder install-app-deps" }, @@ -25,19 +28,18 @@ "discord-rpc": "^4.0.1", "ejs": "^3.1.6", "electron-acrylic-window": "^0.5.11", - "electron-log": "^4.4.3", + "electron-log": "^4.4.4", "electron-store": "^8.0.1", "electron-updater": "^4.6.1", "electron-window-state": "^5.0.3", + "es6-promise": "^4.2.8", "express": "^4.17.2", "get-port": "^5.1.1", "lastfmapi": "^0.1.1", "mpris-service": "^2.1.2", - "react": "^17.0.2", - "react-dom": "^17.0.2", "source-map-support": "^0.5.21", "v8-compile-cache": "^2.3.0", - "ws": "^8.3.0", + "ws": "^8.4.0", "xml2js": "^0.4.23", "youtube-search-without-api-key": "^1.0.7" }, @@ -46,6 +48,7 @@ "electron-builder": "^22.14.5", "electron-webpack": "^2.8.2", "musickit-typescript": "^1.2.4", + "typescript": "^4.5.4", "vue-devtools": "^5.1.4", "webpack": "~5.65.0" }, @@ -93,16 +96,12 @@ ], "extends": null, "files": [ - "**/*", - "./src/**/*", + "./build/**/*", "./resources/icons/icon.*" ], "linux": { "target": [ - "AppImage", - "deb", - "snap", - "rpm" + "AppImage" ], "synopsis": "A new look into listening and enjoying music in style and performance. ", "category": "AudioVideo", @@ -124,7 +123,8 @@ "icon": "resources/icons/icon.ico" }, "directories": { - "buildResources": "." + "buildResources": ".", + "output": "dist" }, "mac": { "icon": "./resources/icons/icon.icns", diff --git a/index.js b/src/main/index.ts similarity index 90% rename from index.js rename to src/main/index.ts index 06d85e73..435f39be 100644 --- a/index.js +++ b/src/main/index.ts @@ -1,16 +1,19 @@ require('v8-compile-cache'); -const { app } = require('electron'), - {resolve} = require("path"), - CiderBase = require ('./src/main/cider-base'); + +// import { app } from 'electron'; +// import { resolve } from 'path'; + +import { app, BrowserWindow } from "electron"; +import * as path from "path"; + // Analytics for debugging fun yeah. -const ElectronSentry = require("@sentry/electron"); -ElectronSentry.init({ dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214" }); - -// const {Init} = require("./src/main/cider-base"); -// Init() -CiderBase.Init().catch(() => {}) - +// const ElectronSentry = require("@sentry/electron"); +// ElectronSentry.init({ dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214" }); +// +// // const {Init} = require("./src/main/cider-base"); +// // Init() +// /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * App Event Handlers * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ @@ -24,7 +27,7 @@ app.on('ready', () => { require('vue-devtools').install() } - CiderBase.Start() + // CiderBase.Start() }); app.on('before-quit', () => { @@ -101,8 +104,4 @@ if (!app.requestSingleInstanceLock() && !app.cfg.get('advanced.allowMultipleInst console.warn("[InstanceHandler] Existing Instance is Blocking Second Instance."); app.quit(); app.isQuiting = true -} - - - - \ No newline at end of file +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..a4db4c0d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "noImplicitAny": true, + "strict": true, + "sourceMap": true, + "outDir": "./build", + "baseUrl": ".", + "paths": { + "*": ["node_modules/*"] + } + }, + "include": [ + "src/**/*" + ] +} \ No newline at end of file From ac8115afe6d3ef037274f927f3f5cae75bc55521 Mon Sep 17 00:00:00 2001 From: Core Date: Sun, 2 Jan 2022 07:07:08 +0000 Subject: [PATCH 08/61] Delete build directory --- build/index.js | 140 --------------------------------------------- build/index.js.map | 1 - 2 files changed, 141 deletions(-) delete mode 100644 build/index.js delete mode 100644 build/index.js.map diff --git a/build/index.js b/build/index.js deleted file mode 100644 index 882db786..00000000 --- a/build/index.js +++ /dev/null @@ -1,140 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -require('v8-compile-cache'); -// import { app } from 'electron'; -// import { resolve } from 'path'; -const electron_1 = require("electron"); -const path = require("path"); -function createWindow() { - // Create the browser window. - const mainWindow = new electron_1.BrowserWindow({ - height: 600, - webPreferences: { - preload: path.join(__dirname, "preload.js"), - }, - width: 800, - }); - // and load the index.html of the app. - mainWindow.loadFile(path.join(__dirname, "./src/renderer/index.html")); - // Open the DevTools. - mainWindow.webContents.openDevTools(); -} -// This method will be called when Electron has finished -// initialization and is ready to create browser windows. -// Some APIs can only be used after this event occurs. -electron_1.app.on("ready", () => { - createWindow(); - electron_1.app.on("activate", function () { - // On macOS it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. - if (electron_1.BrowserWindow.getAllWindows().length === 0) - createWindow(); - }); -}); -// Quit when all windows are closed, except on macOS. There, it's common -// for applications and their menu bar to stay active until the user quits -// explicitly with Cmd + Q. -electron_1.app.on("window-all-closed", () => { - if (process.platform !== "darwin") { - electron_1.app.quit(); - } -}); -// Analytics for debugging fun yeah. -// const ElectronSentry = require("@sentry/electron"); -// ElectronSentry.init({ dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214" }); -// -// // const {Init} = require("./src/main/cider-base"); -// // Init() -// -// /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// * App Event Handlers -// * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ -// -// app.on('ready', () => { -// if (app.isQuiting) { app.quit(); return; } -// -// console.log('[Cider] Application is Ready. Creating Window.') -// if (!app.isPackaged) { -// console.info('[Cider] Running in development mode.') -// require('vue-devtools').install() -// } -// -// // CiderBase.Start() -// }); -// -// app.on('before-quit', () => { -// app.isQuiting = true; -// console.warn(`${app.getName()} exited.`); -// }); -// -// // Widevine Stuff -// app.on('widevine-ready', (version, lastVersion) => { -// if (null !== lastVersion) { -// console.log('[Cider][Widevine] Widevine ' + version + ', upgraded from ' + lastVersion + ', is ready to be used!') -// } else { -// console.log('[Cider][Widevine] Widevine ' + version + ' is ready to be used!') -// } -// }) -// -// app.on('widevine-update-pending', (currentVersion, pendingVersion) => { -// console.log('[Cider][Widevine] Widevine ' + currentVersion + ' is ready to be upgraded to ' + pendingVersion + '!') -// }) -// -// app.on('widevine-error', (error) => { -// console.log('[Cider][Widevine] Widevine installation encountered an error: ' + error) -// app.exit() -// }) -// -// if (process.defaultApp) { -// if (process.argv.length >= 2) { -// app.setAsDefaultProtocolClient('cider', process.execPath, [resolve(process.argv[1])]) -// app.setAsDefaultProtocolClient('ame', process.execPath, [resolve(process.argv[1])]) -// app.setAsDefaultProtocolClient('itms', process.execPath, [resolve(process.argv[1])]) -// app.setAsDefaultProtocolClient('itmss', process.execPath, [resolve(process.argv[1])]) -// app.setAsDefaultProtocolClient('musics', process.execPath, [resolve(process.argv[1])]) -// app.setAsDefaultProtocolClient('music', process.execPath, [resolve(process.argv[1])]) -// } -// } else { -// app.setAsDefaultProtocolClient('cider') // Custom AME Protocol -// app.setAsDefaultProtocolClient('ame') // Custom AME Protocol -// app.setAsDefaultProtocolClient('itms') // iTunes HTTP Protocol -// app.setAsDefaultProtocolClient('itmss') // iTunes HTTPS Protocol -// app.setAsDefaultProtocolClient('musics') // macOS Client Protocol -// app.setAsDefaultProtocolClient('music') // macOS Client Protocol -// } -// -// app.on('open-url', (event, url) => { -// event.preventDefault() -// if (url.includes('ame://') || url.includes('itms://') || url.includes('itmss://') || url.includes('musics://') || url.includes('music://')) { -// CiderBase.LinkHandler(url) -// } -// }) -// -// app.on('second-instance', (_e, argv) => { -// console.warn(`[InstanceHandler][SecondInstanceHandler] Second Instance Started with args: [${argv.join(', ')}]`) -// -// // Checks if first instance is authorized and if second instance has protocol args -// argv.forEach((value) => { -// if (value.includes('ame://') || value.includes('itms://') || value.includes('itmss://') || value.includes('musics://') || value.includes('music://')) { -// console.warn(`[InstanceHandler][SecondInstanceHandler] Found Protocol!`) -// CiderBase.LinkHandler(value); -// } -// }) -// -// if (argv.includes("--force-quit")) { -// console.warn('[InstanceHandler][SecondInstanceHandler] Force Quit found. Quitting App.'); -// app.isQuiting = true -// app.quit() -// } else if (app.win && !app.cfg.get('advanced.allowMultipleInstances')) { // If a Second Instance has Been Started -// console.warn('[InstanceHandler][SecondInstanceHandler] Showing window.'); -// app.win.show() -// app.win.focus() -// } -// }) -// -// if (!app.requestSingleInstanceLock() && !app.cfg.get('advanced.allowMultipleInstances')) { -// console.warn("[InstanceHandler] Existing Instance is Blocking Second Instance."); -// app.quit(); -// app.isQuiting = true -// } -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/index.js.map b/build/index.js.map deleted file mode 100644 index 2d2ac767..00000000 --- a/build/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/main/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file From c561bb758944603c2b5cca20ea61ecd73abb77ef Mon Sep 17 00:00:00 2001 From: Core <64542347+coredev-uk@users.noreply.github.com> Date: Tue, 4 Jan 2022 23:27:44 +0000 Subject: [PATCH 09/61] temporary store --- package.json | 1 + src/main/base/win.ts | 160 +++++++++++++++++++++++++++++++++++++ src/main/index.ts | 183 +++++++++++++++++++++++-------------------- tsconfig.json | 2 +- 4 files changed, 258 insertions(+), 88 deletions(-) create mode 100644 src/main/base/win.ts diff --git a/package.json b/package.json index 83eebac8..3e6ec71e 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "youtube-search-without-api-key": "^1.0.7" }, "devDependencies": { + "@types/express": "^4.17.13", "electron": "https://github.com/castlabs/electron-releases.git", "electron-builder": "^22.14.5", "electron-webpack": "^2.8.2", diff --git a/src/main/base/win.ts b/src/main/base/win.ts new file mode 100644 index 00000000..8caffad9 --- /dev/null +++ b/src/main/base/win.ts @@ -0,0 +1,160 @@ +import * as path from "path"; +import {app, ipcMain} from "electron"; +import {join} from "path"; +import * as windowStateKeeper from "electron-window-state"; +import * as express from "express"; +import * as getPort from "get-port"; + +export default class Win { + public win: Electron.BrowserWindow | undefined; + public app: Electron.App | undefined; + + private static port: number = 0; + private static envVars: object = { + "env": { + // @ts-ignore + platform: process.platform, + // @ts-ignore + dev: app.isPackaged + } + }; + private static options: any = { + icon: join(__dirname, `../../../resources/icons/icon.ico`), + width: 1024, + height: 600, + x: undefined, + y: undefined, + minWidth: 850, + minHeight: 400, + frame: false, + title: "Cider", + vibrancy: 'dark', + transparent: process.platform === "darwin", + hasShadow: false, + webPreferences: { + webviewTag: true, + plugins: true, + nodeIntegration: true, + nodeIntegrationInWorker: false, + webSecurity: false, + allowRunningInsecureContent: true, + enableRemoteModule: true, + sandbox: true, + nativeWindowOpen: true, + contextIsolation: false, + preload: join(__dirname, '../../preload/cider-preload.js') + } + }; + + get options() { + return Win.options; + } + + /** + * Creates the browser window + */ + public createWindow(): Electron.BrowserWindow { + let BrowserWindow; + if (process.platform === "win32") { + BrowserWindow = require("electron-acrylic-window").BrowserWindow; + } else { + BrowserWindow = require("electron").BrowserWindow; + } + + // Load the previous state with fallback to defaults + const windowState = windowStateKeeper({ + defaultWidth: 1024, + defaultHeight: 600 + }); + this.options.width = windowState.width; + this.options.height = windowState.height; + + // Create the browser window. + const win = new BrowserWindow(this.options); + + // and load the renderer. + this.startWebServer(win) + .then((url) => { + console.log(url) + this.startSession(win, url); + }) + .catch(console.error); + + + + + this.win = win; + return win; + } + + /** + * Starts the webserver for the renderer process. + * @param win The window to use + */ + private async startWebServer(win: Electron.BrowserWindow): Promise { + Win.port = await getPort({port: 9000}); + + const webapp = express(), + webRemotePath = path.join(__dirname, '../../renderer/'); + + webapp.set("views", path.join(webRemotePath, "views")); + webapp.set("view engine", "ejs"); + + webapp.use((req, res, next) => { + // if not localhost + // @ts-ignore + if (req.headers.host.includes("localhost") && req.headers["user-agent"].includes("Cider")) { + next(); + } + }); + + webapp.use(express.static(webRemotePath)); + webapp.get('/', function (req, res) { + //res.sendFile(path.join(webRemotePath, 'index_old.html')); + res.render("main", Win.envVars) + }); + webapp.listen(Win.port, function () { + console.debug(`Cider client port: ${Win.port}`); + }); + + return "http://localhost:" + Win.port; + } + + /** + * Starts the session for the renderer process. + * @param win The window to use + * @param location The location of the renderer + */ + private startSession(win: Electron.BrowserWindow, location: string) { + // intercept "https://js-cdn.music.apple.com/hls.js/2.141.0/hls.js/hls.js" and redirect to local file "./apple-hls.js" instead + win.webContents.session.webRequest.onBeforeRequest( + { + urls: ["https://*/*.js"] + }, + (details, callback) => { + if (details.url.includes("hls.js")) { + callback({ + redirectURL: `http://localhost:${Win.port}/apple-hls.js` + }) + } else { + callback({ + cancel: false + }) + } + } + ) + + win.webContents.session.webRequest.onBeforeSendHeaders(async (details, callback) => { + if (details.url === "https://buy.itunes.apple.com/account/web/info") { + details.requestHeaders['sec-fetch-site'] = 'same-site'; + details.requestHeaders['DNT'] = '1'; + let ItsPod = await win.webContents.executeJavaScript(`window.localStorage.getItem("music.ampwebplay.itspod")`) + if (ItsPod != null) + details.requestHeaders['Cookie'] = `itspod=${ItsPod}` + } + callback({requestHeaders: details.requestHeaders}) + }) + + win.loadURL(location).catch(console.error); + } +} \ No newline at end of file diff --git a/src/main/index.ts b/src/main/index.ts index 435f39be..770d2f3c 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -14,94 +14,103 @@ import * as path from "path"; // // const {Init} = require("./src/main/cider-base"); // // Init() // + +import Win from "./base/win"; + +const Cider = new Win() + +app.on("ready", () => { + Cider.createWindow(); +}); + /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * App Event Handlers * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ -app.on('ready', () => { - if (app.isQuiting) { app.quit(); return; } - - console.log('[Cider] Application is Ready. Creating Window.') - if (!app.isPackaged) { - console.info('[Cider] Running in development mode.') - require('vue-devtools').install() - } - - // CiderBase.Start() -}); - -app.on('before-quit', () => { - app.isQuiting = true; - console.warn(`${app.getName()} exited.`); -}); - -// Widevine Stuff -app.on('widevine-ready', (version, lastVersion) => { - if (null !== lastVersion) { - console.log('[Cider][Widevine] Widevine ' + version + ', upgraded from ' + lastVersion + ', is ready to be used!') - } else { - console.log('[Cider][Widevine] Widevine ' + version + ' is ready to be used!') - } -}) - -app.on('widevine-update-pending', (currentVersion, pendingVersion) => { - console.log('[Cider][Widevine] Widevine ' + currentVersion + ' is ready to be upgraded to ' + pendingVersion + '!') -}) - -app.on('widevine-error', (error) => { - console.log('[Cider][Widevine] Widevine installation encountered an error: ' + error) - app.exit() -}) - -if (process.defaultApp) { - if (process.argv.length >= 2) { - app.setAsDefaultProtocolClient('cider', process.execPath, [resolve(process.argv[1])]) - app.setAsDefaultProtocolClient('ame', process.execPath, [resolve(process.argv[1])]) - app.setAsDefaultProtocolClient('itms', process.execPath, [resolve(process.argv[1])]) - app.setAsDefaultProtocolClient('itmss', process.execPath, [resolve(process.argv[1])]) - app.setAsDefaultProtocolClient('musics', process.execPath, [resolve(process.argv[1])]) - app.setAsDefaultProtocolClient('music', process.execPath, [resolve(process.argv[1])]) - } -} else { - app.setAsDefaultProtocolClient('cider') // Custom AME Protocol - app.setAsDefaultProtocolClient('ame') // Custom AME Protocol - app.setAsDefaultProtocolClient('itms') // iTunes HTTP Protocol - app.setAsDefaultProtocolClient('itmss') // iTunes HTTPS Protocol - app.setAsDefaultProtocolClient('musics') // macOS Client Protocol - app.setAsDefaultProtocolClient('music') // macOS Client Protocol -} - -app.on('open-url', (event, url) => { - event.preventDefault() - if (url.includes('ame://') || url.includes('itms://') || url.includes('itmss://') || url.includes('musics://') || url.includes('music://')) { - CiderBase.LinkHandler(url) - } -}) - -app.on('second-instance', (_e, argv) => { - console.warn(`[InstanceHandler][SecondInstanceHandler] Second Instance Started with args: [${argv.join(', ')}]`) - - // Checks if first instance is authorized and if second instance has protocol args - argv.forEach((value) => { - if (value.includes('ame://') || value.includes('itms://') || value.includes('itmss://') || value.includes('musics://') || value.includes('music://')) { - console.warn(`[InstanceHandler][SecondInstanceHandler] Found Protocol!`) - CiderBase.LinkHandler(value); - } - }) - - if (argv.includes("--force-quit")) { - console.warn('[InstanceHandler][SecondInstanceHandler] Force Quit found. Quitting App.'); - app.isQuiting = true - app.quit() - } else if (app.win && !app.cfg.get('advanced.allowMultipleInstances')) { // If a Second Instance has Been Started - console.warn('[InstanceHandler][SecondInstanceHandler] Showing window.'); - app.win.show() - app.win.focus() - } -}) - -if (!app.requestSingleInstanceLock() && !app.cfg.get('advanced.allowMultipleInstances')) { - console.warn("[InstanceHandler] Existing Instance is Blocking Second Instance."); - app.quit(); - app.isQuiting = true -} \ No newline at end of file +// app.on('ready', () => { +// if (app.isQuiting) { app.quit(); return; } +// +// console.log('[Cider] Application is Ready. Creating Window.') +// if (!app.isPackaged) { +// console.info('[Cider] Running in development mode.') +// require('vue-devtools').install() +// } +// +// // CiderBase.Start() +// }); +// +// app.on('before-quit', () => { +// app.isQuiting = true; +// console.warn(`${app.getName()} exited.`); +// }); +// +// // Widevine Stuff +// app.on('widevine-ready', (version, lastVersion) => { +// if (null !== lastVersion) { +// console.log('[Cider][Widevine] Widevine ' + version + ', upgraded from ' + lastVersion + ', is ready to be used!') +// } else { +// console.log('[Cider][Widevine] Widevine ' + version + ' is ready to be used!') +// } +// }) +// +// app.on('widevine-update-pending', (currentVersion, pendingVersion) => { +// console.log('[Cider][Widevine] Widevine ' + currentVersion + ' is ready to be upgraded to ' + pendingVersion + '!') +// }) +// +// app.on('widevine-error', (error) => { +// console.log('[Cider][Widevine] Widevine installation encountered an error: ' + error) +// app.exit() +// }) +// +// if (process.defaultApp) { +// if (process.argv.length >= 2) { +// app.setAsDefaultProtocolClient('cider', process.execPath, [resolve(process.argv[1])]) +// app.setAsDefaultProtocolClient('ame', process.execPath, [resolve(process.argv[1])]) +// app.setAsDefaultProtocolClient('itms', process.execPath, [resolve(process.argv[1])]) +// app.setAsDefaultProtocolClient('itmss', process.execPath, [resolve(process.argv[1])]) +// app.setAsDefaultProtocolClient('musics', process.execPath, [resolve(process.argv[1])]) +// app.setAsDefaultProtocolClient('music', process.execPath, [resolve(process.argv[1])]) +// } +// } else { +// app.setAsDefaultProtocolClient('cider') // Custom AME Protocol +// app.setAsDefaultProtocolClient('ame') // Custom AME Protocol +// app.setAsDefaultProtocolClient('itms') // iTunes HTTP Protocol +// app.setAsDefaultProtocolClient('itmss') // iTunes HTTPS Protocol +// app.setAsDefaultProtocolClient('musics') // macOS Client Protocol +// app.setAsDefaultProtocolClient('music') // macOS Client Protocol +// } +// +// app.on('open-url', (event, url) => { +// event.preventDefault() +// if (url.includes('ame://') || url.includes('itms://') || url.includes('itmss://') || url.includes('musics://') || url.includes('music://')) { +// CiderBase.LinkHandler(url) +// } +// }) +// +// app.on('second-instance', (_e, argv) => { +// console.warn(`[InstanceHandler][SecondInstanceHandler] Second Instance Started with args: [${argv.join(', ')}]`) +// +// // Checks if first instance is authorized and if second instance has protocol args +// argv.forEach((value) => { +// if (value.includes('ame://') || value.includes('itms://') || value.includes('itmss://') || value.includes('musics://') || value.includes('music://')) { +// console.warn(`[InstanceHandler][SecondInstanceHandler] Found Protocol!`) +// CiderBase.LinkHandler(value); +// } +// }) +// +// if (argv.includes("--force-quit")) { +// console.warn('[InstanceHandler][SecondInstanceHandler] Force Quit found. Quitting App.'); +// app.isQuiting = true +// app.quit() +// } else if (app.win && !app.cfg.get('advanced.allowMultipleInstances')) { // If a Second Instance has Been Started +// console.warn('[InstanceHandler][SecondInstanceHandler] Showing window.'); +// app.win.show() +// app.win.focus() +// } +// }) +// +// if (!app.requestSingleInstanceLock() && !app.cfg.get('advanced.allowMultipleInstances')) { +// console.warn("[InstanceHandler] Existing Instance is Blocking Second Instance."); +// app.quit(); +// app.isQuiting = true +// } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index a4db4c0d..416aa2c7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es6", + "target": "esnext", "module": "commonjs", "noImplicitAny": true, "strict": true, From d15ee4de30df26b1bb212c3c50c30cc29db42d7f Mon Sep 17 00:00:00 2001 From: Core <64542347+coredev-uk@users.noreply.github.com> Date: Wed, 5 Jan 2022 00:22:32 +0000 Subject: [PATCH 10/61] typescript is hell --- src/main/base/win.ts | 165 +++++++++++++++++++++++++++++++++++-------- tsconfig.json | 3 +- 2 files changed, 139 insertions(+), 29 deletions(-) diff --git a/src/main/base/win.ts b/src/main/base/win.ts index 8caffad9..0e7ea895 100644 --- a/src/main/base/win.ts +++ b/src/main/base/win.ts @@ -1,15 +1,15 @@ import * as path from "path"; -import {app, ipcMain} from "electron"; -import {join} from "path"; +import {app, ipcMain, shell} from "electron"; import * as windowStateKeeper from "electron-window-state"; import * as express from "express"; import * as getPort from "get-port"; +import * as yt from "youtube-search-without-api-key"; export default class Win { - public win: Electron.BrowserWindow | undefined; + public win: null | undefined; public app: Electron.App | undefined; - private static port: number = 0; + private clientPort: number = 0; private static envVars: object = { "env": { // @ts-ignore @@ -19,7 +19,7 @@ export default class Win { } }; private static options: any = { - icon: join(__dirname, `../../../resources/icons/icon.ico`), + icon: path.join(__dirname, `../../../resources/icons/icon.ico`), width: 1024, height: 600, x: undefined, @@ -42,7 +42,7 @@ export default class Win { sandbox: true, nativeWindowOpen: true, contextIsolation: false, - preload: join(__dirname, '../../preload/cider-preload.js') + preload: path.join(__dirname, '../../preload/cider-preload.js') } }; @@ -53,7 +53,9 @@ export default class Win { /** * Creates the browser window */ - public createWindow(): Electron.BrowserWindow { + public async createWindow(): Promise { + this.clientPort = await getPort({port: 9000}); + let BrowserWindow; if (process.platform === "win32") { BrowserWindow = require("electron-acrylic-window").BrowserWindow; @@ -71,29 +73,23 @@ export default class Win { // Create the browser window. const win = new BrowserWindow(this.options); + console.debug('Browser window created'); + this.win = win; // and load the renderer. this.startWebServer(win) - .then((url) => { - console.log(url) - this.startSession(win, url); - }) - .catch(console.error); + this.startSession(win); + this.startHandlers(win); - - - this.win = win; return win; } /** * Starts the webserver for the renderer process. - * @param win The window to use + * @param win The BrowserWindow */ - private async startWebServer(win: Electron.BrowserWindow): Promise { - Win.port = await getPort({port: 9000}); - + private startWebServer(win: Electron.BrowserWindow): void { const webapp = express(), webRemotePath = path.join(__dirname, '../../renderer/'); @@ -113,19 +109,16 @@ export default class Win { //res.sendFile(path.join(webRemotePath, 'index_old.html')); res.render("main", Win.envVars) }); - webapp.listen(Win.port, function () { - console.debug(`Cider client port: ${Win.port}`); + webapp.listen(this.clientPort, () => { + console.debug(`Cider client port: ${this.clientPort}`); }); - - return "http://localhost:" + Win.port; } /** * Starts the session for the renderer process. - * @param win The window to use - * @param location The location of the renderer + * @param win The BrowserWindow */ - private startSession(win: Electron.BrowserWindow, location: string) { + private startSession(win: Electron.BrowserWindow): void { // intercept "https://js-cdn.music.apple.com/hls.js/2.141.0/hls.js/hls.js" and redirect to local file "./apple-hls.js" instead win.webContents.session.webRequest.onBeforeRequest( { @@ -134,7 +127,7 @@ export default class Win { (details, callback) => { if (details.url.includes("hls.js")) { callback({ - redirectURL: `http://localhost:${Win.port}/apple-hls.js` + redirectURL: `http://localhost:${this.clientPort}/apple-hls.js` }) } else { callback({ @@ -155,6 +148,122 @@ export default class Win { callback({requestHeaders: details.requestHeaders}) }) - win.loadURL(location).catch(console.error); + const location = `http://localhost:${this.clientPort}/` + console.log('yeah') + win.loadURL(location) + .then(() => { + console.debug(`Cider client location: ${location}`); + }) + .catch(console.error); + } + + /** + * Initializes the window handlers + * @param win The BrowserWindow + */ + private startHandlers(win: Electron.BrowserWindow): void { + win.on('closed', () => { + this.win = null; + }); + + if (process.platform === "win32") { + let WND_STATE = { + MINIMIZED: 0, + NORMAL: 1, + MAXIMIZED: 2, + FULL_SCREEN: 3 + } + let wndState = WND_STATE.NORMAL + + win.on("resize", (_: any) => { + const isMaximized = win.isMaximized() + const isMinimized = win.isMinimized() + const isFullScreen = win.isFullScreen() + const state = wndState; + if (isMinimized && state !== WND_STATE.MINIMIZED) { + wndState = WND_STATE.MINIMIZED + } else if (isFullScreen && state !== WND_STATE.FULL_SCREEN) { + wndState = WND_STATE.FULL_SCREEN + } else if (isMaximized && state !== WND_STATE.MAXIMIZED) { + wndState = WND_STATE.MAXIMIZED + win.webContents.executeJavaScript(`app.chrome.maximized = true`) + } else if (state !== WND_STATE.NORMAL) { + wndState = WND_STATE.NORMAL + win.webContents.executeJavaScript(`app.chrome.maximized = false`) + } + }) + } + + // Set window Handler + win.webContents.setWindowOpenHandler(({url}) => { + if (url.includes("apple") || url.includes("localhost")) { + return {action: "allow"} + } + shell.openExternal(url).catch(() => { + }) + return { + action: 'deny' + } + }) + + //------------------------------------------------------------------------------- + // Renderer IPC Listeners + //------------------------------------------------------------------------------- + + ipcMain.on("cider-platform", (event) => { + event.returnValue = process.platform + }) + + ipcMain.on("get-gpu-mode", (event) => { + event.returnValue = process.platform + }) + + ipcMain.on("is-dev", (event) => { + event.returnValue = !app.isPackaged + }) + + // IPC stuff (listeners) + ipcMain.on('close', () => { // listen for close event + win.close(); + }) + + ipcMain.handle('getYTLyrics', async (event, track, artist) => { + const u = track + " " + artist + " official video"; + const videos = await yt.search(u); + return videos + }) + + // ipcMain.handle('getStoreValue', (event, key, defaultValue) => { + // return (defaultValue ? app.cfg.get(key, true) : app.cfg.get(key)); + // }); + // + // ipcMain.handle('setStoreValue', (event, key, value) => { + // app.cfg.set(key, value); + // }); + // + // ipcMain.on('getStore', (event) => { + // event.returnValue = app.cfg.store + // }) + // + // ipcMain.on('setStore', (event, store) => { + // app.cfg.store = store + // }) + + ipcMain.on('maximize', () => { // listen for maximize event + if (win.isMaximized()) { + win.unmaximize() + } else { + win.maximize() + } + }) + + ipcMain.on('minimize', () => { // listen for minimize event + win.minimize(); + }) + + // Set scale + ipcMain.on('setScreenScale', (event, scale) => { + win.webContents.setZoomFactor(parseFloat(scale)) + }) } } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 416aa2c7..a3ea67e3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,8 @@ "baseUrl": ".", "paths": { "*": ["node_modules/*"] - } + }, + "allowSyntheticDefaultImports": true }, "include": [ "src/**/*" From 8e1d2dc96b0cc8c9ec50d193352dd8721b583d55 Mon Sep 17 00:00:00 2001 From: Core Date: Fri, 7 Jan 2022 14:50:06 +0000 Subject: [PATCH 11/61] this might not be happening --- src/main/base/win.js | 468 ++++++++++++++++++++++++++++--------------- src/main/base/win.ts | 150 +++++++------- src/main/index.ts | 8 +- 3 files changed, 385 insertions(+), 241 deletions(-) diff --git a/src/main/base/win.js b/src/main/base/win.js index 945e0e33..ad3ec6a3 100644 --- a/src/main/base/win.js +++ b/src/main/base/win.js @@ -1,55 +1,54 @@ -const {join} = require("path"), - {ipcMain, app, shell, screen} = require("electron"), - express = require("express"), - path = require("path"), - getPort = require("get-port"), - yt = require("youtube-search-without-api-key"), - os = require("os"); +const { BrowserWindow, ipcMain, shell, app, screen } = require("electron") +const { join } = require("path") +const getPort = require("get-port"); +const express = require("express"); +const path = require("path"); +const windowStateKeeper = require("electron-window-state"); +const os = require('os'); +const yt = require('youtube-search-without-api-key'); +const discord = require('./discordrpc'); +const lastfm = require('./lastfm'); +const { writeFile, writeFileSync, existsSync, mkdirSync } = require('fs'); +const fs = require('fs'); +const mpris = require('./mpris'); +const mm = require('music-metadata'); +const fetch = require('electron-fetch').default; +const { Stream } = require('stream'); -module.exports = { +// Analytics for debugging. +const ElectronSentry = require("@sentry/electron"); +ElectronSentry.init({ dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214" }); - browserWindow: {}, - - clientPort: 0, - - EnvironmentVariables: { - "env": { - platform: os.platform(), - dev: app.isPackaged - } +const CiderBase = { + win: null, + requests: [], + audiostream: new Stream.PassThrough(), + async Start() { + this.clientPort = await getPort({ port: 9000 }); + this.win = this.CreateBrowserWindow() }, - - //------------------------------------------------------------------------------- - // Public Methods - //------------------------------------------------------------------------------- - - /** - * Creates the BrowserWindow for the application. - * @return {object} BrowserWindow - */ - async createBrowserWindow() { - this.clientPort = await getPort({port: 9000}); - - const windowStateKeeper = require("electron-window-state"), - BrowserWindow = require((process.platform === "win32") ? "electron-acrylic-window" : "electron").BrowserWindow; - - const windowState = windowStateKeeper({ + clientPort: 0, + CreateBrowserWindow() { + this.VerifyFiles() + // Set default window sizes + const mainWindowState = windowStateKeeper({ defaultWidth: 1024, defaultHeight: 600 }); - this.browserWindow = new BrowserWindow({ - icon: join(__dirname, `../../../resources/icons/icon.ico`), - width: windowState.width, - height: windowState.height, - x: windowState.x, - y: windowState.y, + let win = null + const options = { + icon: join(__dirname, `../../resources/icons/icon.ico`), + width: mainWindowState.width, + height: mainWindowState.height, + x: mainWindowState.x, + y: mainWindowState.y, minWidth: 844, minHeight: 410, frame: false, title: "Cider", vibrancy: 'dark', - transparent: process.platform === "darwin", + // transparent: true, hasShadow: false, webPreferences: { webviewTag: true, @@ -62,74 +61,62 @@ module.exports = { sandbox: true, nativeWindowOpen: true, contextIsolation: false, - preload: join(__dirname, '../../preload/cider-preload.js') + preload: join(__dirname, '../preload/cider-preload.js') } - }) - - this.initializeWebServer(); - this.initializeSession(); - this.initializeHandlers(); - - windowState.manage(this.browserWindow); - this.browserWindow.webContents.setZoomFactor(screen.getPrimaryDisplay().scaleFactor) - - return this.browserWindow - }, - - /** - * Initializes the BrowserWindow handlers for the application. - */ - initializeHandlers() { - const self = this; - - this.browserWindow.on('closed', () => { - this.browserWindow = null; - }); - - if (process.platform === "win32") { - let WND_STATE = { - MINIMIZED: 0, - NORMAL: 1, - MAXIMIZED: 2, - FULL_SCREEN: 3 - } - let wndState = WND_STATE.NORMAL - - self.browserWindow.on("resize", (_event) => { - const isMaximized = self.browserWindow.isMaximized() - const isMinimized = self.browserWindow.isMinimized() - const isFullScreen = self.browserWindow.isFullScreen() - const state = wndState; - if (isMinimized && state !== WND_STATE.MINIMIZED) { - wndState = WND_STATE.MINIMIZED - } else if (isFullScreen && state !== WND_STATE.FULL_SCREEN) { - wndState = WND_STATE.FULL_SCREEN - } else if (isMaximized && state !== WND_STATE.MAXIMIZED) { - wndState = WND_STATE.MAXIMIZED - self.browserWindow.webContents.executeJavaScript(`app.chrome.maximized = true`) - } else if (state !== WND_STATE.NORMAL) { - wndState = WND_STATE.NORMAL - self.browserWindow.webContents.executeJavaScript(`app.chrome.maximized = false`) - } - }) } - // Set window Handler - this.browserWindow.webContents.setWindowOpenHandler(({url}) => { - if (url.includes("apple") || url.includes("localhost")) { - return {action: "allow"} + CiderBase.InitWebServer() + + // Create the BrowserWindow + if (process.platform === "darwin" || process.platform === "linux") { + win = new BrowserWindow(options) + } else { + if (app.cfg.get("visual.window_transparency") !== "disabled") { + const { BrowserWindow } = require("electron-acrylic-window"); } - shell.openExternal(url).catch(() => { - }) - return { - action: 'deny' + win = new BrowserWindow(options) + win.setVibrancy("dark") + } + + // intercept "https://js-cdn.music.apple.com/hls.js/2.141.0/hls.js/hls.js" and redirect to local file "./apple-hls.js" instead + win.webContents.session.webRequest.onBeforeRequest( + { + urls: ["https://*/*.js"] + }, + (details, callback) => { + if (details.url.includes("hls.js")) { + callback({ + redirectURL: `http://localhost:${CiderBase.clientPort}/apple-hls.js` + }) + } else { + callback({ + cancel: false + }) + } } + ) + + win.webContents.session.webRequest.onBeforeSendHeaders(async (details, callback) => { + if (details.url === "https://buy.itunes.apple.com/account/web/info") { + details.requestHeaders['sec-fetch-site'] = 'same-site'; + details.requestHeaders['DNT'] = '1'; + let itspod = await win.webContents.executeJavaScript(`window.localStorage.getItem("music.ampwebplay.itspod")`) + if (itspod != null) + details.requestHeaders['Cookie'] = `itspod=${itspod}` + } + callback({ requestHeaders: details.requestHeaders }) }) - //------------------------------------------------------------------------------- - // Renderer IPC Listeners - //------------------------------------------------------------------------------- + let location = `http://localhost:${CiderBase.clientPort}/` + win.loadURL(location) + win.on("closed", () => { + win = null + }) + // Register listeners on Window to track size and position of the Window. + mainWindowState.manage(win); + + // IPC stuff (senders) ipcMain.on("cider-platform", (event) => { event.returnValue = process.platform }) @@ -144,11 +131,56 @@ module.exports = { // IPC stuff (listeners) ipcMain.on('close', () => { // listen for close event - self.browserWindow.close(); + win.close(); + }) + + ipcMain.on('put-library-songs', (event, arg) => { + fs.writeFileSync(join(app.paths.ciderCache, "library-songs.json"), JSON.stringify(arg)) + }) + + ipcMain.on('put-library-artists', (event, arg) => { + fs.writeFileSync(join(app.paths.ciderCache, "library-artists.json"), JSON.stringify(arg)) + }) + + ipcMain.on('put-library-albums', (event, arg) => { + fs.writeFileSync(join(app.paths.ciderCache, "library-albums.json"), JSON.stringify(arg)) + }) + + ipcMain.on('put-library-playlists', (event, arg) => { + fs.writeFileSync(join(app.paths.ciderCache, "library-playlists.json"), JSON.stringify(arg)) + }) + + ipcMain.on('put-library-recentlyAdded', (event, arg) => { + fs.writeFileSync(join(app.paths.ciderCache, "library-recentlyAdded.json"), JSON.stringify(arg)) + }) + + ipcMain.on('get-library-songs', (event) => { + let librarySongs = fs.readFileSync(join(app.paths.ciderCache, "library-songs.json"), "utf8") + event.returnValue = JSON.parse(librarySongs) + }) + + ipcMain.on('get-library-artists', (event) => { + let libraryArtists = fs.readFileSync(join(app.paths.ciderCache, "library-artists.json"), "utf8") + event.returnValue = JSON.parse(libraryArtists) + }) + + ipcMain.on('get-library-albums', (event) => { + let libraryAlbums = fs.readFileSync(join(app.paths.ciderCache, "library-albums.json"), "utf8") + event.returnValue = JSON.parse(libraryAlbums) + }) + + ipcMain.on('get-library-playlists', (event) => { + let libraryPlaylists = fs.readFileSync(join(app.paths.ciderCache, "library-playlists.json"), "utf8") + event.returnValue = JSON.parse(libraryPlaylists) + }) + + ipcMain.on('get-library-recentlyAdded', (event) => { + let libraryRecentlyAdded = fs.readFileSync(join(app.paths.ciderCache, "library-recentlyAdded.json"), "utf8") + event.returnValue = JSON.parse(libraryRecentlyAdded) }) ipcMain.handle('getYTLyrics', async (event, track, artist) => { - const u = track + " " + artist + " official video"; + var u = track + " " + artist + " official video"; const videos = await yt.search(u); return videos }) @@ -169,38 +201,174 @@ module.exports = { app.cfg.store = store }) + ipcMain.handle('setVibrancy', (event, key, value) => { + win.setVibrancy(value) + }); + ipcMain.on('maximize', () => { // listen for maximize event - if (self.browserWindow.isMaximized()) { - self.browserWindow.unmaximize() + if (win.isMaximized()) { + win.unmaximize() } else { - self.browserWindow.maximize() + win.maximize() } }) ipcMain.on('minimize', () => { // listen for minimize event - self.browserWindow.minimize(); + win.minimize(); + }) + + if (process.platform === "win32") { + let WND_STATE = { + MINIMIZED: 0, + NORMAL: 1, + MAXIMIZED: 2, + FULL_SCREEN: 3 + } + let wndState = WND_STATE.NORMAL + + win.on("resize", (_event) => { + const isMaximized = win.isMaximized() + const isMinimized = win.isMinimized() + const isFullScreen = win.isFullScreen() + const state = wndState; + if (isMinimized && state !== WND_STATE.MINIMIZED) { + wndState = WND_STATE.MINIMIZED + } else if (isFullScreen && state !== WND_STATE.FULL_SCREEN) { + wndState = WND_STATE.FULL_SCREEN + } else if (isMaximized && state !== WND_STATE.MAXIMIZED) { + wndState = WND_STATE.MAXIMIZED + win.webContents.executeJavaScript(`app.chrome.maximized = true`) + } else if (state !== WND_STATE.NORMAL) { + wndState = WND_STATE.NORMAL + win.webContents.executeJavaScript(`app.chrome.maximized = false`) + } + }) + } + + // Set window Handler + win.webContents.setWindowOpenHandler(({ url }) => { + if (url.includes("apple") || url.includes("localhost")) { + return { action: "allow" } + } + shell.openExternal(url).catch(() => { + }) + return { + action: 'deny' + } }) // Set scale ipcMain.on('setScreenScale', (event, scale) => { - self.browserWindow.webContents.setZoomFactor(parseFloat(scale)) + win.webContents.setZoomFactor(parseFloat(scale)) }) + + win.webContents.setZoomFactor(screen.getPrimaryDisplay().scaleFactor) + + mpris.connect(win) + + lastfm.authenticate() + // Discord + discord.connect((app.cfg.get("general.discord_rpc") == 1) ? '911790844204437504' : '886578863147192350'); + ipcMain.on('playbackStateDidChange', (_event, a) => { + app.media = a; + discord.updateActivity(a) + mpris.updateState(a) + lastfm.scrobbleSong(a) + lastfm.updateNowPlayingSong(a) + }); + + ipcMain.on('nowPlayingItemDidChange', (_event, a) => { + app.media = a; + discord.updateActivity(a) + mpris.updateAttributes(a) + lastfm.scrobbleSong(a) + lastfm.updateNowPlayingSong(a) + }); + + ipcMain.on("getPreviewURL", (_event, url) => { + fetch(url) + .then(res => res.buffer()) + .then(async (buffer) => { + try { + const metadata = await mm.parseBuffer(buffer, 'audio/x-m4a'); + SoundCheckTag = metadata.native.iTunes[1].value + win.webContents.send('SoundCheckTag', SoundCheckTag) + } catch (error) { + console.error(error.message); + } + }) + }); + + ipcMain.on('writeAudio', function (event, buffer) { + CiderBase.audiostream.write(Buffer.from(buffer)); + }) + + return win + }, + VerifyFiles() { + const expectedDirectories = [ + "CiderCache" + ] + const expectedFiles = [ + "library-songs.json", + "library-artists.json", + "library-albums.json", + "library-playlists.json", + "library-recentlyAdded.json", + ] + for (let i = 0; i < expectedDirectories.length; i++) { + if (!existsSync(path.join(app.getPath("userData"), expectedDirectories[i]))) { + mkdirSync(path.join(app.getPath("userData"), expectedDirectories[i])) + } + } + for (let i = 0; i < expectedFiles.length; i++) { + const file = path.join(app.paths.ciderCache, expectedFiles[i]) + if (!existsSync(file)) { + writeFileSync(file, JSON.stringify([])) + } + } + }, + EnvironmentVariables: { + "env": { + platform: os.platform(), + dev: app.isPackaged + } + }, + LinkHandler: (startArgs) => { + if (!startArgs) return; + console.log("lfmtoken", String(startArgs)) + if (String(startArgs).includes('auth')) { + let authURI = String(startArgs).split('/auth/')[1] + if (authURI.startsWith('lastfm')) { // If we wanted more auth options + const authKey = authURI.split('lastfm?token=')[1]; + app.cfg.set('lastfm.enabled', true); + app.cfg.set('lastfm.auth_token', authKey); + CiderBase.win.webContents.send('LastfmAuthenticated', authKey); + lastfm.authenticate() + } + } else { + const formattedSongID = startArgs.replace('ame://', '').replace('/', ''); + console.warn(`[LinkHandler] Attempting to load song id: ${formattedSongID}`); + + // setQueue can be done with album, song, url, playlist id + this.win.webContents.executeJavaScript(` + MusicKit.getInstance().setQueue({ song: '${formattedSongID}'}).then(function(queue) { + MusicKit.getInstance().play(); + }); + `).catch((err) => console.error(err)); + } + }, - /** - * Starts the webserver - */ - initializeWebServer() { - const self = this; - const webapp = express(), - webRemotePath = path.join(__dirname, '../../renderer/'); - + async InitWebServer() { + const webapp = express(); + const webRemotePath = path.join(__dirname, '../renderer/'); webapp.set("views", path.join(webRemotePath, "views")); webapp.set("view engine", "ejs"); webapp.use(function (req, res, next) { // if not localhost - if (req.headers.host.includes("localhost") && req.headers["user-agent"].includes("Cider")) { + if (req.url.includes("audio.webm") || (req.headers.host.includes("localhost") && req.headers["user-agent"].includes("Cider"))) { next(); } }); @@ -208,52 +376,32 @@ module.exports = { webapp.use(express.static(webRemotePath)); webapp.get('/', function (req, res) { //res.sendFile(path.join(webRemotePath, 'index_old.html')); - res.render("main", self.EnvironmentVariables) + res.render("main", CiderBase.EnvironmentVariables) }); - webapp.listen(this.clientPort, function () { - console.log(`Cider client port: ${self.clientPort}`); + webapp.get('/audio.webm', function (req, res) { + try { + req.connection.setTimeout(Number.MAX_SAFE_INTEGER); + // CiderBase.requests.push({req: req, res: res}); + // var pos = CiderBase.requests.length - 1; + // req.on("close", () => { + // console.info("CLOSED", CiderBase.requests.length); + // requests.splice(pos, 1); + // console.info("CLOSED", CiderBase.requests.length); + // }); + CiderBase.audiostream.on('data', (data) => { + try { + res.write(data); + } catch (ex) { + console.log(ex) + } + }) + } catch (ex) { console.log(ex) } + }); + webapp.listen(CiderBase.clientPort, function () { + console.log(`Cider client port: ${CiderBase.clientPort}`); }); }, - /** - * Initializes the application session. - */ - initializeSession() { - const self = this; +} - // intercept "https://js-cdn.music.apple.com/hls.js/2.141.0/hls.js/hls.js" and redirect to local file "./apple-hls.js" instead - this.browserWindow.webContents.session.webRequest.onBeforeRequest( - { - urls: ["https://*/*.js"] - }, - (details, callback) => { - if (details.url.includes("hls.js")) { - callback({ - redirectURL: `http://localhost:${self.clientPort}/apple-hls.js` - }) - } else { - callback({ - cancel: false - }) - } - } - ) - - this.browserWindow.webContents.session.webRequest.onBeforeSendHeaders(async (details, callback) => { - if (details.url === "https://buy.itunes.apple.com/account/web/info") { - details.requestHeaders['sec-fetch-site'] = 'same-site'; - details.requestHeaders['DNT'] = '1'; - let itspod = await this.browserWindow.webContents.executeJavaScript(`window.localStorage.getItem("music.ampwebplay.itspod")`) - if (itspod != null) - details.requestHeaders['Cookie'] = `itspod=${itspod}` - } - callback({requestHeaders: details.requestHeaders}) - }) - - let location = `http://localhost:${this.clientPort}/` - this.browserWindow.loadURL(location).catch(err => { - console.log(err) - }) - } - -} \ No newline at end of file +module.exports = CiderBase; \ No newline at end of file diff --git a/src/main/base/win.ts b/src/main/base/win.ts index 0e7ea895..1a6d0b3a 100644 --- a/src/main/base/win.ts +++ b/src/main/base/win.ts @@ -1,25 +1,26 @@ import * as path from "path"; -import {app, ipcMain, shell} from "electron"; +import * as electron from "electron"; +import * as electronAcrylic from "electron-acrylic-window" import * as windowStateKeeper from "electron-window-state"; import * as express from "express"; import * as getPort from "get-port"; import * as yt from "youtube-search-without-api-key"; -export default class Win { - public win: null | undefined; - public app: Electron.App | undefined; +export class Win { + win: any | undefined; + app: electron.App | undefined; + private srcPath: string = path.join(__dirname, "../../src"); + private resourcePath: string = path.join(__dirname, "../../resources"); private clientPort: number = 0; - private static envVars: object = { + private EnvironmentVariables: object = { "env": { - // @ts-ignore platform: process.platform, - // @ts-ignore - dev: app.isPackaged + dev: electron.app.isPackaged } }; - private static options: any = { - icon: path.join(__dirname, `../../../resources/icons/icon.ico`), + private options: any = { + icon: path.join(this.resourcePath, `icons/icon.ico`), width: 1024, height: 600, x: undefined, @@ -28,7 +29,6 @@ export default class Win { minHeight: 400, frame: false, title: "Cider", - vibrancy: 'dark', transparent: process.platform === "darwin", hasShadow: false, webPreferences: { @@ -42,27 +42,16 @@ export default class Win { sandbox: true, nativeWindowOpen: true, contextIsolation: false, - preload: path.join(__dirname, '../../preload/cider-preload.js') + preload: path.join(this.srcPath, 'preload/cider-preload.js') } }; - get options() { - return Win.options; - } - /** * Creates the browser window */ - public async createWindow(): Promise { + async createWindow(): Promise { this.clientPort = await getPort({port: 9000}); - let BrowserWindow; - if (process.platform === "win32") { - BrowserWindow = require("electron-acrylic-window").BrowserWindow; - } else { - BrowserWindow = require("electron").BrowserWindow; - } - // Load the previous state with fallback to defaults const windowState = windowStateKeeper({ defaultWidth: 1024, @@ -71,63 +60,79 @@ export default class Win { this.options.width = windowState.width; this.options.height = windowState.height; + this.startWebServer() + + if (process.platform === "win32") { + this.win = new electronAcrylic.BrowserWindow(this.options); + } else { + this.win = new electron.BrowserWindow(this.options); + } + // Create the browser window. - const win = new BrowserWindow(this.options); + console.debug('Browser window created'); - this.win = win; // and load the renderer. - this.startWebServer(win) - this.startSession(win); - this.startHandlers(win); + this.startSession(this.win); + this.startHandlers(this.win); - - return win; + return this.win; } /** * Starts the webserver for the renderer process. - * @param win The BrowserWindow */ - private startWebServer(win: Electron.BrowserWindow): void { - const webapp = express(), - webRemotePath = path.join(__dirname, '../../renderer/'); - + private startWebServer(): void { + const webapp = express(); + const webRemotePath = path.join(this.srcPath, 'renderer'); webapp.set("views", path.join(webRemotePath, "views")); webapp.set("view engine", "ejs"); - webapp.use((req, res, next) => { + webapp.use(function (req, res, next) { // if not localhost // @ts-ignore - if (req.headers.host.includes("localhost") && req.headers["user-agent"].includes("Cider")) { + if (req.url.includes("audio.webm") || (req.headers.host.includes("localhost") && req.headers["user-agent"].includes("Cider"))) { next(); } }); webapp.use(express.static(webRemotePath)); - webapp.get('/', function (req, res) { + webapp.get('/', (req, res) => { //res.sendFile(path.join(webRemotePath, 'index_old.html')); - res.render("main", Win.envVars) + console.log(req) + res.render("main", this.EnvironmentVariables) }); + // webelectron.app.get('/audio.webm', (req, res) => { + // try { + // req.connection.setTimeout(Number.MAX_SAFE_INTEGER); + // this.audiostream.on('data', (data) => { + // try { + // res.write(data); + // } catch (ex) { + // console.log(ex) + // } + // }) + // } catch (ex) { console.log(ex) } + // }); webapp.listen(this.clientPort, () => { - console.debug(`Cider client port: ${this.clientPort}`); + console.log(`Cider client port: ${this.clientPort}`); }); } /** * Starts the session for the renderer process. - * @param win The BrowserWindow */ - private startSession(win: Electron.BrowserWindow): void { + private startSession(win: any): void {const self = this; + // intercept "https://js-cdn.music.apple.com/hls.js/2.141.0/hls.js/hls.js" and redirect to local file "./apple-hls.js" instead win.webContents.session.webRequest.onBeforeRequest( { urls: ["https://*/*.js"] }, - (details, callback) => { + (details: { url: string | string[]; }, callback: (arg0: { redirectURL?: string; cancel?: boolean; }) => void) => { if (details.url.includes("hls.js")) { callback({ - redirectURL: `http://localhost:${this.clientPort}/apple-hls.js` + redirectURL: `http://localhost:${self.clientPort}/apple-hls.js` }) } else { callback({ @@ -137,7 +142,7 @@ export default class Win { } ) - win.webContents.session.webRequest.onBeforeSendHeaders(async (details, callback) => { + win.webContents.session.webRequest.onBeforeSendHeaders(async (details: { url: string; requestHeaders: { [x: string]: string; }; }, callback: (arg0: { requestHeaders: any; }) => void) => { if (details.url === "https://buy.itunes.apple.com/account/web/info") { details.requestHeaders['sec-fetch-site'] = 'same-site'; details.requestHeaders['DNT'] = '1'; @@ -161,11 +166,7 @@ export default class Win { * Initializes the window handlers * @param win The BrowserWindow */ - private startHandlers(win: Electron.BrowserWindow): void { - win.on('closed', () => { - this.win = null; - }); - + private startHandlers(win: any): void { if (process.platform === "win32") { let WND_STATE = { MINIMIZED: 0, @@ -186,20 +187,20 @@ export default class Win { wndState = WND_STATE.FULL_SCREEN } else if (isMaximized && state !== WND_STATE.MAXIMIZED) { wndState = WND_STATE.MAXIMIZED - win.webContents.executeJavaScript(`app.chrome.maximized = true`) + win.webContents.executeJavaScript(`electron.app.chrome.maximized = true`) } else if (state !== WND_STATE.NORMAL) { wndState = WND_STATE.NORMAL - win.webContents.executeJavaScript(`app.chrome.maximized = false`) + win.webContents.executeJavaScript(`electron.app.chrome.maximized = false`) } }) } // Set window Handler - win.webContents.setWindowOpenHandler(({url}) => { - if (url.includes("apple") || url.includes("localhost")) { + win.webContents.setWindowOpenHandler((x: any) => { + if (x.url.includes("apple") || x.url.includes("localhost")) { return {action: "allow"} } - shell.openExternal(url).catch(() => { + electron.shell.openExternal(x.url).catch(() => { }) return { action: 'deny' @@ -210,46 +211,45 @@ export default class Win { // Renderer IPC Listeners //------------------------------------------------------------------------------- - ipcMain.on("cider-platform", (event) => { + electron.ipcMain.on("cider-platform", (event) => { event.returnValue = process.platform }) - ipcMain.on("get-gpu-mode", (event) => { + electron.ipcMain.on("get-gpu-mode", (event) => { event.returnValue = process.platform }) - ipcMain.on("is-dev", (event) => { - event.returnValue = !app.isPackaged + electron.ipcMain.on("is-dev", (event) => { + event.returnValue = !electron.app.isPackaged }) // IPC stuff (listeners) - ipcMain.on('close', () => { // listen for close event + electron.ipcMain.on('close', () => { // listen for close event win.close(); }) - ipcMain.handle('getYTLyrics', async (event, track, artist) => { + electron.ipcMain.handle('getYTLyrics', async (event, track, artist) => { const u = track + " " + artist + " official video"; - const videos = await yt.search(u); - return videos + return await yt.search(u) }) - // ipcMain.handle('getStoreValue', (event, key, defaultValue) => { - // return (defaultValue ? app.cfg.get(key, true) : app.cfg.get(key)); + // electron.ipcMain.handle('getStoreValue', (event, key, defaultValue) => { + // return (defaultValue ? electron.app.cfg.get(key, true) : electron.app.cfg.get(key)); // }); // - // ipcMain.handle('setStoreValue', (event, key, value) => { - // app.cfg.set(key, value); + // electron.ipcMain.handle('setStoreValue', (event, key, value) => { + // electron.app.cfg.set(key, value); // }); // - // ipcMain.on('getStore', (event) => { - // event.returnValue = app.cfg.store + // electron.ipcMain.on('getStore', (event) => { + // event.returnValue = electron.app.cfg.store // }) // - // ipcMain.on('setStore', (event, store) => { - // app.cfg.store = store + // electron.ipcMain.on('setStore', (event, store) => { + // electron.app.cfg.store = store // }) - ipcMain.on('maximize', () => { // listen for maximize event + electron.ipcMain.on('maximize', () => { // listen for maximize event if (win.isMaximized()) { win.unmaximize() } else { @@ -257,12 +257,12 @@ export default class Win { } }) - ipcMain.on('minimize', () => { // listen for minimize event + electron.ipcMain.on('minimize', () => { // listen for minimize event win.minimize(); }) // Set scale - ipcMain.on('setScreenScale', (event, scale) => { + electron.ipcMain.on('setScreenScale', (event, scale) => { win.webContents.setZoomFactor(parseFloat(scale)) }) } diff --git a/src/main/index.ts b/src/main/index.ts index 770d2f3c..96e4f94d 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -1,12 +1,8 @@ require('v8-compile-cache'); -// import { app } from 'electron'; +import { app } from 'electron'; // import { resolve } from 'path'; -import { app, BrowserWindow } from "electron"; -import * as path from "path"; - - // Analytics for debugging fun yeah. // const ElectronSentry = require("@sentry/electron"); // ElectronSentry.init({ dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214" }); @@ -15,7 +11,7 @@ import * as path from "path"; // // Init() // -import Win from "./base/win"; +import {Win} from "./base/win"; const Cider = new Win() From 57c7002b25f940209d09b8bc732b3ec5b2338580 Mon Sep 17 00:00:00 2001 From: Core Date: Fri, 7 Jan 2022 20:47:34 +0000 Subject: [PATCH 12/61] Merged main branch and updates win.ts with some dumb stuff that still hasn't fixed it --- package.json | 13 +- src/main/base/win.js | 407 - src/main/base/win.ts | 308 +- src/main/cider-base.js | 90 - src/main/index.ts | 2 +- src/main/plugins/discordrpc.js | 138 - src/main/plugins/lastfm.js | 153 - src/main/plugins/mpris.js | 113 - src/renderer/ameframework.css | 53 - src/renderer/assets/feather/disc.svg | 1 + src/renderer/assets/feather/folder.svg | 1 + src/renderer/assets/feather/globe.svg | 1 + src/renderer/assets/feather/heart.svg | 1 + src/renderer/assets/feather/home.svg | 1 + src/renderer/assets/feather/list.svg | 1 + src/renderer/assets/feather/music.svg | 1 + src/renderer/assets/feather/play-circle.svg | 1 + src/renderer/assets/feather/play.svg | 1 + src/renderer/assets/feather/plus-circle.svg | 1 + src/renderer/assets/feather/plus.svg | 1 + src/renderer/assets/feather/radio.svg | 1 + src/renderer/assets/feather/share-2.svg | 1 + src/renderer/assets/feather/share.svg | 1 + src/renderer/assets/feather/thumbs-down.svg | 1 + src/renderer/assets/feather/thumbs-up.svg | 1 + src/renderer/assets/feather/user.svg | 1 + src/renderer/assets/feather/x-circle.svg | 1 + src/renderer/assets/spinner.gif | Bin 0 -> 81572 bytes src/renderer/audio/audio.js | 99 + src/renderer/index.js | 924 +- src/renderer/logo-simple.svg | 27 + src/renderer/logotmp.afdesign | Bin 0 -> 640698 bytes src/renderer/logotmp.svg | 29 + src/renderer/style.less | 1119 +- src/renderer/vibrant.min.js | 12492 ++++++++++++++++ src/renderer/views/components/fullscreen.ejs | 137 +- .../views/components/listennow-child.ejs | 2 +- src/renderer/views/components/lyrics-view.ejs | 53 +- .../views/components/mediaitem-artwork.ejs | 6 +- .../views/components/mediaitem-list-item.ejs | 99 +- .../mediaitem-scroller-horizontal-sp.ejs | 12 +- .../components/mediaitem-square-large.ejs | 77 +- .../views/components/mediaitem-square-sp.ejs | 51 +- .../views/components/mediaitem-square.ejs | 257 +- .../views/components/sidebar-playlist.ejs | 221 + .../views/components/spatial-properties.ejs | 355 + src/renderer/views/main.ejs | 81 +- src/renderer/views/pages/artist-feed.ejs | 68 + src/renderer/views/pages/artist.ejs | 36 +- src/renderer/views/pages/cider-playlist.ejs | 71 +- src/renderer/views/pages/collection-list.ejs | 10 +- src/renderer/views/pages/home.ejs | 270 +- .../views/pages/new/library-songs.ejs | 16 + src/renderer/views/pages/settings.ejs | 81 +- src/renderer/views/pages/zoo.ejs | 4 +- src/renderer/views/svg/explicit.svg | 1 + src/renderer/views/svg/list.svg | 1 + src/renderer/views/svg/quote-right.svg | 1 + src/renderer/vuex.min.js | 6 + 59 files changed, 16275 insertions(+), 1626 deletions(-) delete mode 100644 src/main/base/win.js delete mode 100644 src/main/cider-base.js delete mode 100644 src/main/plugins/discordrpc.js delete mode 100644 src/main/plugins/lastfm.js delete mode 100644 src/main/plugins/mpris.js create mode 100644 src/renderer/assets/feather/disc.svg create mode 100644 src/renderer/assets/feather/folder.svg create mode 100644 src/renderer/assets/feather/globe.svg create mode 100644 src/renderer/assets/feather/heart.svg create mode 100644 src/renderer/assets/feather/home.svg create mode 100644 src/renderer/assets/feather/list.svg create mode 100644 src/renderer/assets/feather/music.svg create mode 100644 src/renderer/assets/feather/play-circle.svg create mode 100644 src/renderer/assets/feather/play.svg create mode 100644 src/renderer/assets/feather/plus-circle.svg create mode 100644 src/renderer/assets/feather/plus.svg create mode 100644 src/renderer/assets/feather/radio.svg create mode 100644 src/renderer/assets/feather/share-2.svg create mode 100644 src/renderer/assets/feather/share.svg create mode 100644 src/renderer/assets/feather/thumbs-down.svg create mode 100644 src/renderer/assets/feather/thumbs-up.svg create mode 100644 src/renderer/assets/feather/user.svg create mode 100644 src/renderer/assets/feather/x-circle.svg create mode 100644 src/renderer/assets/spinner.gif create mode 100644 src/renderer/audio/audio.js create mode 100644 src/renderer/logo-simple.svg create mode 100644 src/renderer/logotmp.afdesign create mode 100644 src/renderer/logotmp.svg create mode 100644 src/renderer/vibrant.min.js create mode 100644 src/renderer/views/components/sidebar-playlist.ejs create mode 100644 src/renderer/views/components/spatial-properties.ejs create mode 100644 src/renderer/views/pages/artist-feed.ejs create mode 100644 src/renderer/views/pages/new/library-songs.ejs create mode 100644 src/renderer/views/svg/explicit.svg create mode 100644 src/renderer/views/svg/list.svg create mode 100644 src/renderer/views/svg/quote-right.svg create mode 100644 src/renderer/vuex.min.js diff --git a/package.json b/package.json index 3e6ec71e..ae781f8c 100644 --- a/package.json +++ b/package.json @@ -32,11 +32,13 @@ "electron-store": "^8.0.1", "electron-updater": "^4.6.1", "electron-window-state": "^5.0.3", - "es6-promise": "^4.2.8", "express": "^4.17.2", "get-port": "^5.1.1", "lastfmapi": "^0.1.1", "mpris-service": "^2.1.2", + "music-metadata": "^7.11.4", + "react": "^17.0.2", + "react-dom": "^17.0.2", "source-map-support": "^0.5.21", "v8-compile-cache": "^2.3.0", "ws": "^8.4.0", @@ -76,9 +78,9 @@ } ], "build": { - "electronVersion": "15.3.4", + "electronVersion": "16.0.6", "electronDownload": { - "version": "15.3.4-wvvmp", + "version": "16.0.6+wvcus", "mirror": "https://github.com/castlabs/electron-releases/releases/download/v" }, "appId": "cider", @@ -102,7 +104,10 @@ ], "linux": { "target": [ - "AppImage" + "AppImage", + "deb", + "snap", + "rpm" ], "synopsis": "A new look into listening and enjoying music in style and performance. ", "category": "AudioVideo", diff --git a/src/main/base/win.js b/src/main/base/win.js deleted file mode 100644 index ad3ec6a3..00000000 --- a/src/main/base/win.js +++ /dev/null @@ -1,407 +0,0 @@ -const { BrowserWindow, ipcMain, shell, app, screen } = require("electron") -const { join } = require("path") -const getPort = require("get-port"); -const express = require("express"); -const path = require("path"); -const windowStateKeeper = require("electron-window-state"); -const os = require('os'); -const yt = require('youtube-search-without-api-key'); -const discord = require('./discordrpc'); -const lastfm = require('./lastfm'); -const { writeFile, writeFileSync, existsSync, mkdirSync } = require('fs'); -const fs = require('fs'); -const mpris = require('./mpris'); -const mm = require('music-metadata'); -const fetch = require('electron-fetch').default; -const { Stream } = require('stream'); - -// Analytics for debugging. -const ElectronSentry = require("@sentry/electron"); -ElectronSentry.init({ dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214" }); - -const CiderBase = { - win: null, - requests: [], - audiostream: new Stream.PassThrough(), - async Start() { - this.clientPort = await getPort({ port: 9000 }); - this.win = this.CreateBrowserWindow() - }, - clientPort: 0, - CreateBrowserWindow() { - this.VerifyFiles() - // Set default window sizes - const mainWindowState = windowStateKeeper({ - defaultWidth: 1024, - defaultHeight: 600 - }); - - let win = null - const options = { - icon: join(__dirname, `../../resources/icons/icon.ico`), - width: mainWindowState.width, - height: mainWindowState.height, - x: mainWindowState.x, - y: mainWindowState.y, - minWidth: 844, - minHeight: 410, - frame: false, - title: "Cider", - vibrancy: 'dark', - // transparent: true, - hasShadow: false, - webPreferences: { - webviewTag: true, - plugins: true, - nodeIntegration: true, - nodeIntegrationInWorker: false, - webSecurity: false, - allowRunningInsecureContent: true, - enableRemoteModule: true, - sandbox: true, - nativeWindowOpen: true, - contextIsolation: false, - preload: join(__dirname, '../preload/cider-preload.js') - } - } - - CiderBase.InitWebServer() - - // Create the BrowserWindow - if (process.platform === "darwin" || process.platform === "linux") { - win = new BrowserWindow(options) - } else { - if (app.cfg.get("visual.window_transparency") !== "disabled") { - const { BrowserWindow } = require("electron-acrylic-window"); - } - win = new BrowserWindow(options) - win.setVibrancy("dark") - } - - // intercept "https://js-cdn.music.apple.com/hls.js/2.141.0/hls.js/hls.js" and redirect to local file "./apple-hls.js" instead - win.webContents.session.webRequest.onBeforeRequest( - { - urls: ["https://*/*.js"] - }, - (details, callback) => { - if (details.url.includes("hls.js")) { - callback({ - redirectURL: `http://localhost:${CiderBase.clientPort}/apple-hls.js` - }) - } else { - callback({ - cancel: false - }) - } - } - ) - - win.webContents.session.webRequest.onBeforeSendHeaders(async (details, callback) => { - if (details.url === "https://buy.itunes.apple.com/account/web/info") { - details.requestHeaders['sec-fetch-site'] = 'same-site'; - details.requestHeaders['DNT'] = '1'; - let itspod = await win.webContents.executeJavaScript(`window.localStorage.getItem("music.ampwebplay.itspod")`) - if (itspod != null) - details.requestHeaders['Cookie'] = `itspod=${itspod}` - } - callback({ requestHeaders: details.requestHeaders }) - }) - - let location = `http://localhost:${CiderBase.clientPort}/` - win.loadURL(location) - win.on("closed", () => { - win = null - }) - - // Register listeners on Window to track size and position of the Window. - mainWindowState.manage(win); - - // IPC stuff (senders) - ipcMain.on("cider-platform", (event) => { - event.returnValue = process.platform - }) - - ipcMain.on("get-gpu-mode", (event) => { - event.returnValue = process.platform - }) - - ipcMain.on("is-dev", (event) => { - event.returnValue = !app.isPackaged - }) - - // IPC stuff (listeners) - ipcMain.on('close', () => { // listen for close event - win.close(); - }) - - ipcMain.on('put-library-songs', (event, arg) => { - fs.writeFileSync(join(app.paths.ciderCache, "library-songs.json"), JSON.stringify(arg)) - }) - - ipcMain.on('put-library-artists', (event, arg) => { - fs.writeFileSync(join(app.paths.ciderCache, "library-artists.json"), JSON.stringify(arg)) - }) - - ipcMain.on('put-library-albums', (event, arg) => { - fs.writeFileSync(join(app.paths.ciderCache, "library-albums.json"), JSON.stringify(arg)) - }) - - ipcMain.on('put-library-playlists', (event, arg) => { - fs.writeFileSync(join(app.paths.ciderCache, "library-playlists.json"), JSON.stringify(arg)) - }) - - ipcMain.on('put-library-recentlyAdded', (event, arg) => { - fs.writeFileSync(join(app.paths.ciderCache, "library-recentlyAdded.json"), JSON.stringify(arg)) - }) - - ipcMain.on('get-library-songs', (event) => { - let librarySongs = fs.readFileSync(join(app.paths.ciderCache, "library-songs.json"), "utf8") - event.returnValue = JSON.parse(librarySongs) - }) - - ipcMain.on('get-library-artists', (event) => { - let libraryArtists = fs.readFileSync(join(app.paths.ciderCache, "library-artists.json"), "utf8") - event.returnValue = JSON.parse(libraryArtists) - }) - - ipcMain.on('get-library-albums', (event) => { - let libraryAlbums = fs.readFileSync(join(app.paths.ciderCache, "library-albums.json"), "utf8") - event.returnValue = JSON.parse(libraryAlbums) - }) - - ipcMain.on('get-library-playlists', (event) => { - let libraryPlaylists = fs.readFileSync(join(app.paths.ciderCache, "library-playlists.json"), "utf8") - event.returnValue = JSON.parse(libraryPlaylists) - }) - - ipcMain.on('get-library-recentlyAdded', (event) => { - let libraryRecentlyAdded = fs.readFileSync(join(app.paths.ciderCache, "library-recentlyAdded.json"), "utf8") - event.returnValue = JSON.parse(libraryRecentlyAdded) - }) - - ipcMain.handle('getYTLyrics', async (event, track, artist) => { - var u = track + " " + artist + " official video"; - const videos = await yt.search(u); - return videos - }) - - ipcMain.handle('getStoreValue', (event, key, defaultValue) => { - return (defaultValue ? app.cfg.get(key, true) : app.cfg.get(key)); - }); - - ipcMain.handle('setStoreValue', (event, key, value) => { - app.cfg.set(key, value); - }); - - ipcMain.on('getStore', (event) => { - event.returnValue = app.cfg.store - }) - - ipcMain.on('setStore', (event, store) => { - app.cfg.store = store - }) - - ipcMain.handle('setVibrancy', (event, key, value) => { - win.setVibrancy(value) - }); - - ipcMain.on('maximize', () => { // listen for maximize event - if (win.isMaximized()) { - win.unmaximize() - } else { - win.maximize() - } - }) - - ipcMain.on('minimize', () => { // listen for minimize event - win.minimize(); - }) - - if (process.platform === "win32") { - let WND_STATE = { - MINIMIZED: 0, - NORMAL: 1, - MAXIMIZED: 2, - FULL_SCREEN: 3 - } - let wndState = WND_STATE.NORMAL - - win.on("resize", (_event) => { - const isMaximized = win.isMaximized() - const isMinimized = win.isMinimized() - const isFullScreen = win.isFullScreen() - const state = wndState; - if (isMinimized && state !== WND_STATE.MINIMIZED) { - wndState = WND_STATE.MINIMIZED - } else if (isFullScreen && state !== WND_STATE.FULL_SCREEN) { - wndState = WND_STATE.FULL_SCREEN - } else if (isMaximized && state !== WND_STATE.MAXIMIZED) { - wndState = WND_STATE.MAXIMIZED - win.webContents.executeJavaScript(`app.chrome.maximized = true`) - } else if (state !== WND_STATE.NORMAL) { - wndState = WND_STATE.NORMAL - win.webContents.executeJavaScript(`app.chrome.maximized = false`) - } - }) - } - - // Set window Handler - win.webContents.setWindowOpenHandler(({ url }) => { - if (url.includes("apple") || url.includes("localhost")) { - return { action: "allow" } - } - shell.openExternal(url).catch(() => { - }) - return { - action: 'deny' - } - }) - - // Set scale - ipcMain.on('setScreenScale', (event, scale) => { - win.webContents.setZoomFactor(parseFloat(scale)) - }) - - win.webContents.setZoomFactor(screen.getPrimaryDisplay().scaleFactor) - - mpris.connect(win) - - lastfm.authenticate() - // Discord - discord.connect((app.cfg.get("general.discord_rpc") == 1) ? '911790844204437504' : '886578863147192350'); - ipcMain.on('playbackStateDidChange', (_event, a) => { - app.media = a; - discord.updateActivity(a) - mpris.updateState(a) - lastfm.scrobbleSong(a) - lastfm.updateNowPlayingSong(a) - }); - - ipcMain.on('nowPlayingItemDidChange', (_event, a) => { - app.media = a; - discord.updateActivity(a) - mpris.updateAttributes(a) - lastfm.scrobbleSong(a) - lastfm.updateNowPlayingSong(a) - }); - - ipcMain.on("getPreviewURL", (_event, url) => { - fetch(url) - .then(res => res.buffer()) - .then(async (buffer) => { - try { - const metadata = await mm.parseBuffer(buffer, 'audio/x-m4a'); - SoundCheckTag = metadata.native.iTunes[1].value - win.webContents.send('SoundCheckTag', SoundCheckTag) - } catch (error) { - console.error(error.message); - } - }) - }); - - ipcMain.on('writeAudio', function (event, buffer) { - CiderBase.audiostream.write(Buffer.from(buffer)); - }) - - return win - }, - VerifyFiles() { - const expectedDirectories = [ - "CiderCache" - ] - const expectedFiles = [ - "library-songs.json", - "library-artists.json", - "library-albums.json", - "library-playlists.json", - "library-recentlyAdded.json", - ] - for (let i = 0; i < expectedDirectories.length; i++) { - if (!existsSync(path.join(app.getPath("userData"), expectedDirectories[i]))) { - mkdirSync(path.join(app.getPath("userData"), expectedDirectories[i])) - } - } - for (let i = 0; i < expectedFiles.length; i++) { - const file = path.join(app.paths.ciderCache, expectedFiles[i]) - if (!existsSync(file)) { - writeFileSync(file, JSON.stringify([])) - } - } - }, - EnvironmentVariables: { - "env": { - platform: os.platform(), - dev: app.isPackaged - } - }, - LinkHandler: (startArgs) => { - if (!startArgs) return; - console.log("lfmtoken", String(startArgs)) - if (String(startArgs).includes('auth')) { - let authURI = String(startArgs).split('/auth/')[1] - if (authURI.startsWith('lastfm')) { // If we wanted more auth options - const authKey = authURI.split('lastfm?token=')[1]; - app.cfg.set('lastfm.enabled', true); - app.cfg.set('lastfm.auth_token', authKey); - CiderBase.win.webContents.send('LastfmAuthenticated', authKey); - lastfm.authenticate() - } - } else { - const formattedSongID = startArgs.replace('ame://', '').replace('/', ''); - console.warn(`[LinkHandler] Attempting to load song id: ${formattedSongID}`); - - // setQueue can be done with album, song, url, playlist id - this.win.webContents.executeJavaScript(` - MusicKit.getInstance().setQueue({ song: '${formattedSongID}'}).then(function(queue) { - MusicKit.getInstance().play(); - }); - `).catch((err) => console.error(err)); - } - - }, - - async InitWebServer() { - const webapp = express(); - const webRemotePath = path.join(__dirname, '../renderer/'); - webapp.set("views", path.join(webRemotePath, "views")); - webapp.set("view engine", "ejs"); - - webapp.use(function (req, res, next) { - // if not localhost - if (req.url.includes("audio.webm") || (req.headers.host.includes("localhost") && req.headers["user-agent"].includes("Cider"))) { - next(); - } - }); - - webapp.use(express.static(webRemotePath)); - webapp.get('/', function (req, res) { - //res.sendFile(path.join(webRemotePath, 'index_old.html')); - res.render("main", CiderBase.EnvironmentVariables) - }); - webapp.get('/audio.webm', function (req, res) { - try { - req.connection.setTimeout(Number.MAX_SAFE_INTEGER); - // CiderBase.requests.push({req: req, res: res}); - // var pos = CiderBase.requests.length - 1; - // req.on("close", () => { - // console.info("CLOSED", CiderBase.requests.length); - // requests.splice(pos, 1); - // console.info("CLOSED", CiderBase.requests.length); - // }); - CiderBase.audiostream.on('data', (data) => { - try { - res.write(data); - } catch (ex) { - console.log(ex) - } - }) - } catch (ex) { console.log(ex) } - }); - webapp.listen(CiderBase.clientPort, function () { - console.log(`Cider client port: ${CiderBase.clientPort}`); - }); - }, - -} - -module.exports = CiderBase; \ No newline at end of file diff --git a/src/main/base/win.ts b/src/main/base/win.ts index 1a6d0b3a..00389998 100644 --- a/src/main/base/win.ts +++ b/src/main/base/win.ts @@ -1,17 +1,25 @@ import * as path from "path"; import * as electron from "electron"; -import * as electronAcrylic from "electron-acrylic-window" +// import * as electronAcrylic from "electron-acrylic-window" import * as windowStateKeeper from "electron-window-state"; import * as express from "express"; import * as getPort from "get-port"; import * as yt from "youtube-search-without-api-key"; +import * as fs from "fs"; +import {Stream} from "stream"; export class Win { - win: any | undefined; + win: any | undefined = null; app: electron.App | undefined; - private srcPath: string = path.join(__dirname, "../../src"); - private resourcePath: string = path.join(__dirname, "../../resources"); + private paths: any = { + srcPath: path.join(__dirname, "../../src"), + resourcePath: path.join(__dirname, "../../resources"), + ciderCache: path.resolve(electron.app.getPath("userData"), "CiderCache"), + themes: path.resolve(electron.app.getPath("userData"), "Themes"), + plugins: path.resolve(electron.app.getPath("userData"), "Plugins"), + } + private audioStream: any = new Stream.PassThrough(); private clientPort: number = 0; private EnvironmentVariables: object = { "env": { @@ -20,16 +28,17 @@ export class Win { } }; private options: any = { - icon: path.join(this.resourcePath, `icons/icon.ico`), + icon: path.join(this.paths.resourcePath, `icons/icon.` + (process.platform === "win32" ? "ico" : "png")), width: 1024, height: 600, x: undefined, y: undefined, - minWidth: 850, - minHeight: 400, + minWidth: 844, + minHeight: 410, frame: false, title: "Cider", - transparent: process.platform === "darwin", + vibrancy: 'dark', + // transparent: true, hasShadow: false, webPreferences: { webviewTag: true, @@ -42,16 +51,14 @@ export class Win { sandbox: true, nativeWindowOpen: true, contextIsolation: false, - preload: path.join(this.srcPath, 'preload/cider-preload.js') + preload: path.join(this.paths.srcPath, './preload/cider-preload.js') } }; /** * Creates the browser window */ - async createWindow(): Promise { - this.clientPort = await getPort({port: 9000}); - + createWindow(): void { // Load the previous state with fallback to defaults const windowState = windowStateKeeper({ defaultWidth: 1024, @@ -60,61 +67,75 @@ export class Win { this.options.width = windowState.width; this.options.height = windowState.height; - this.startWebServer() - - if (process.platform === "win32") { - this.win = new electronAcrylic.BrowserWindow(this.options); - } else { - this.win = new electron.BrowserWindow(this.options); - } - - // Create the browser window. - - console.debug('Browser window created'); + // Start the webserver for the browser window to load + this.startWebServer().then(() => { + if (process.platform === "win32") { + // this.win = new electronAcrylic.BrowserWindow(this.options); + } else { + this.win = new electron.BrowserWindow(this.options); + } + }) // and load the renderer. this.startSession(this.win); this.startHandlers(this.win); + // Register listeners on Window to track size and position of the Window. + windowState.manage(this.win); + return this.win; } /** * Starts the webserver for the renderer process. */ - private startWebServer(): void { - const webapp = express(); - const webRemotePath = path.join(this.srcPath, 'renderer'); - webapp.set("views", path.join(webRemotePath, "views")); - webapp.set("view engine", "ejs"); + public async startWebServer(): Promise { + this.clientPort = await getPort({port: 9000}); + const app = express(); - webapp.use(function (req, res, next) { - // if not localhost - // @ts-ignore - if (req.url.includes("audio.webm") || (req.headers.host.includes("localhost") && req.headers["user-agent"].includes("Cider"))) { - next(); - } - }); + // app.use(express.static(path.join(this.paths.srcPath, './renderer/'))); // this breaks everything + app.set("views", path.join(this.paths.srcPath, './renderer/views')); + app.set("view engine", "ejs"); - webapp.use(express.static(webRemotePath)); - webapp.get('/', (req, res) => { - //res.sendFile(path.join(webRemotePath, 'index_old.html')); - console.log(req) + // this is also causing issues + // app.use((req, res, next) => { + // // if not localhost + // + // // @ts-ignore + // if (req.url.includes("audio.webm") || (req.headers.host.includes("localhost") && req.headers["user-agent"].includes("Cider"))) { + // next(); + // } + // }); + + app.get('/', (req, res) => { + // res.send("Hello world!"); + // res.sendFile(path.join(webRemotePath, 'index_old.html')); res.render("main", this.EnvironmentVariables) }); - // webelectron.app.get('/audio.webm', (req, res) => { + + // app.get('/audio.webm', (req, res) => { // try { // req.connection.setTimeout(Number.MAX_SAFE_INTEGER); - // this.audiostream.on('data', (data) => { + // // CiderBase.requests.push({req: req, res: res}); + // // var pos = CiderBase.requests.length - 1; + // // req.on("close", () => { + // // console.info("CLOSED", CiderBase.requests.length); + // // requests.splice(pos, 1); + // // console.info("CLOSED", CiderBase.requests.length); + // // }); + // this.audioStream.on('data', (data: any) => { // try { // res.write(data); // } catch (ex) { // console.log(ex) // } // }) - // } catch (ex) { console.log(ex) } + // } catch (ex) { + // console.log(ex) + // } // }); - webapp.listen(this.clientPort, () => { + + app.listen(this.clientPort, () => { console.log(`Cider client port: ${this.clientPort}`); }); } @@ -122,8 +143,7 @@ export class Win { /** * Starts the session for the renderer process. */ - private startSession(win: any): void {const self = this; - + private startSession(win: any): void { // intercept "https://js-cdn.music.apple.com/hls.js/2.141.0/hls.js/hls.js" and redirect to local file "./apple-hls.js" instead win.webContents.session.webRequest.onBeforeRequest( { @@ -132,7 +152,7 @@ export class Win { (details: { url: string | string[]; }, callback: (arg0: { redirectURL?: string; cancel?: boolean; }) => void) => { if (details.url.includes("hls.js")) { callback({ - redirectURL: `http://localhost:${self.clientPort}/apple-hls.js` + redirectURL: `http://localhost:${this.clientPort}/apple-hls.js` }) } else { callback({ @@ -146,20 +166,15 @@ export class Win { if (details.url === "https://buy.itunes.apple.com/account/web/info") { details.requestHeaders['sec-fetch-site'] = 'same-site'; details.requestHeaders['DNT'] = '1'; - let ItsPod = await win.webContents.executeJavaScript(`window.localStorage.getItem("music.ampwebplay.itspod")`) - if (ItsPod != null) - details.requestHeaders['Cookie'] = `itspod=${ItsPod}` + let itspod = await win.webContents.executeJavaScript(`window.localStorage.getItem("music.ampwebplay.itspod")`) + if (itspod != null) + details.requestHeaders['Cookie'] = `itspod=${itspod}` } callback({requestHeaders: details.requestHeaders}) }) - const location = `http://localhost:${this.clientPort}/` - console.log('yeah') + let location = `http://localhost:${this.clientPort}/` win.loadURL(location) - .then(() => { - console.debug(`Cider client location: ${location}`); - }) - .catch(console.error); } /** @@ -167,6 +182,116 @@ export class Win { * @param win The BrowserWindow */ private startHandlers(win: any): void { + + /********************************************************************************************************************** + * ipcMain Events + ****************************************************************************************************************** */ + electron.ipcMain.on("cider-platform", (event) => { + event.returnValue = process.platform + }) + + electron.ipcMain.on("get-gpu-mode", (event) => { + event.returnValue = process.platform + }) + + electron.ipcMain.on("is-dev", (event) => { + event.returnValue = !electron.app.isPackaged + }) + electron.ipcMain.on('close', () => { // listen for close event + win.close(); + }) + + electron.ipcMain.on('put-library-songs', (event, arg) => { + fs.writeFileSync(path.join(this.paths.ciderCache, "library-songs.json"), JSON.stringify(arg)) + }) + + electron.ipcMain.on('put-library-artists', (event, arg) => { + fs.writeFileSync(path.join(this.paths.ciderCache, "library-artists.json"), JSON.stringify(arg)) + }) + + electron.ipcMain.on('put-library-albums', (event, arg) => { + fs.writeFileSync(path.join(this.paths.ciderCache, "library-albums.json"), JSON.stringify(arg)) + }) + + electron.ipcMain.on('put-library-playlists', (event, arg) => { + fs.writeFileSync(path.join(this.paths.ciderCache, "library-playlists.json"), JSON.stringify(arg)) + }) + + electron.ipcMain.on('put-library-recentlyAdded', (event, arg) => { + fs.writeFileSync(path.join(this.paths.ciderCache, "library-recentlyAdded.json"), JSON.stringify(arg)) + }) + + electron.ipcMain.on('get-library-songs', (event) => { + let librarySongs = fs.readFileSync(path.join(this.paths.ciderCache, "library-songs.json"), "utf8") + event.returnValue = JSON.parse(librarySongs) + }) + + electron.ipcMain.on('get-library-artists', (event) => { + let libraryArtists = fs.readFileSync(path.join(this.paths.ciderCache, "library-artists.json"), "utf8") + event.returnValue = JSON.parse(libraryArtists) + }) + + electron.ipcMain.on('get-library-albums', (event) => { + let libraryAlbums = fs.readFileSync(path.join(this.paths.ciderCache, "library-albums.json"), "utf8") + event.returnValue = JSON.parse(libraryAlbums) + }) + + electron.ipcMain.on('get-library-playlists', (event) => { + let libraryPlaylists = fs.readFileSync(path.join(this.paths.ciderCache, "library-playlists.json"), "utf8") + event.returnValue = JSON.parse(libraryPlaylists) + }) + + electron.ipcMain.on('get-library-recentlyAdded', (event) => { + let libraryRecentlyAdded = fs.readFileSync(path.join(this.paths.ciderCache, "library-recentlyAdded.json"), "utf8") + event.returnValue = JSON.parse(libraryRecentlyAdded) + }) + + electron.ipcMain.handle('getYTLyrics', async (event, track, artist) => { + const u = track + " " + artist + " official video"; + return await yt.search(u) + }) + + // electron.ipcMain.handle('getStoreValue', (event, key, defaultValue) => { + // return (defaultValue ? app.cfg.get(key, true) : app.cfg.get(key)); + // }); + // + // electron.ipcMain.handle('setStoreValue', (event, key, value) => { + // app.cfg.set(key, value); + // }); + // + // electron.ipcMain.on('getStore', (event) => { + // event.returnValue = app.cfg.store + // }) + // + // electron.ipcMain.on('setStore', (event, store) => { + // app.cfg.store = store + // }) + + electron.ipcMain.handle('setVibrancy', (event, key, value) => { + win.setVibrancy(value) + }); + + electron.ipcMain.on('maximize', () => { // listen for maximize event + if (win.isMaximized()) { + win.unmaximize() + } else { + win.maximize() + } + }) + + electron.ipcMain.on('minimize', () => { // listen for minimize event + win.minimize(); + }) + + // Set scale + electron.ipcMain.on('setScreenScale', (event, scale) => { + win.webContents.setZoomFactor(parseFloat(scale)) + }) + + /* ********************************************************************************************* + * Window Events + * **********************************************************************************************/ + if (process.platform === "win32") { let WND_STATE = { MINIMIZED: 0, @@ -187,83 +312,26 @@ export class Win { wndState = WND_STATE.FULL_SCREEN } else if (isMaximized && state !== WND_STATE.MAXIMIZED) { wndState = WND_STATE.MAXIMIZED - win.webContents.executeJavaScript(`electron.app.chrome.maximized = true`) + win.webContents.executeJavaScript(`app.chrome.maximized = true`) } else if (state !== WND_STATE.NORMAL) { wndState = WND_STATE.NORMAL - win.webContents.executeJavaScript(`electron.app.chrome.maximized = false`) + win.webContents.executeJavaScript(`app.chrome.maximized = false`) } }) } + win.on("closed", () => { + this.win = null + }) + // Set window Handler win.webContents.setWindowOpenHandler((x: any) => { if (x.url.includes("apple") || x.url.includes("localhost")) { return {action: "allow"} } - electron.shell.openExternal(x.url).catch(() => { - }) - return { - action: 'deny' - } + electron.shell.openExternal(x.url).catch(console.error) + return {action: 'deny'} }) - //------------------------------------------------------------------------------- - // Renderer IPC Listeners - //------------------------------------------------------------------------------- - - electron.ipcMain.on("cider-platform", (event) => { - event.returnValue = process.platform - }) - - electron.ipcMain.on("get-gpu-mode", (event) => { - event.returnValue = process.platform - }) - - electron.ipcMain.on("is-dev", (event) => { - event.returnValue = !electron.app.isPackaged - }) - - // IPC stuff (listeners) - electron.ipcMain.on('close', () => { // listen for close event - win.close(); - }) - - electron.ipcMain.handle('getYTLyrics', async (event, track, artist) => { - const u = track + " " + artist + " official video"; - return await yt.search(u) - }) - - // electron.ipcMain.handle('getStoreValue', (event, key, defaultValue) => { - // return (defaultValue ? electron.app.cfg.get(key, true) : electron.app.cfg.get(key)); - // }); - // - // electron.ipcMain.handle('setStoreValue', (event, key, value) => { - // electron.app.cfg.set(key, value); - // }); - // - // electron.ipcMain.on('getStore', (event) => { - // event.returnValue = electron.app.cfg.store - // }) - // - // electron.ipcMain.on('setStore', (event, store) => { - // electron.app.cfg.store = store - // }) - - electron.ipcMain.on('maximize', () => { // listen for maximize event - if (win.isMaximized()) { - win.unmaximize() - } else { - win.maximize() - } - }) - - electron.ipcMain.on('minimize', () => { // listen for minimize event - win.minimize(); - }) - - // Set scale - electron.ipcMain.on('setScreenScale', (event, scale) => { - win.webContents.setZoomFactor(parseFloat(scale)) - }) } } \ No newline at end of file diff --git a/src/main/cider-base.js b/src/main/cider-base.js deleted file mode 100644 index 0b77d88d..00000000 --- a/src/main/cider-base.js +++ /dev/null @@ -1,90 +0,0 @@ -const lastfm = require('./plugins/lastfm'); -const win = require('./base/win') - -// Analytics for debugging. -const ElectronSentry = require("@sentry/electron"); -const {app} = require("electron"); -ElectronSentry.init({dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214"}); - -module.exports = { - - //------------------------------------------------------------------------------- - // Public Methods - //------------------------------------------------------------------------------- - - /** - * Starts the application (called on on-ready). - Starts BrowserWindow and WebServer - */ - Start() { - app.win = win.createBrowserWindow() - }, - - /** - * Initializes the main application (run before on-ready) - */ - async Init() { - // Initialize the config. - const {init} = require("./base/store"); - await init() - - //------------------------------------------------------------------------------- - // Append Commandline Arguments - //------------------------------------------------------------------------------- - - // Hardware Acceleration - // Enable WebGPU and list adapters (EXPERIMENTAL.) - // Note: THIS HAS TO BE BEFORE ANYTHING GETS INITIALIZED. - switch (app.cfg.get("visual.hw_acceleration")) { - default: - case "default": - - break; - case "webgpu": - console.info("WebGPU is enabled."); - app.commandLine.appendSwitch('enable-unsafe-webgpu') - break; - case "disabled": - console.info("Hardware acceleration is disabled."); - app.commandLine.appendSwitch('disable-gpu') - break; - } - - if (process.platform === "linux") { - app.commandLine.appendSwitch('disable-features', 'MediaSessionService'); - } - - app.commandLine.appendSwitch('high-dpi-support', 'true'); - app.commandLine.appendSwitch('force-device-scale-factor', '1'); - app.commandLine.appendSwitch('disable-pinch'); - app.commandLine.appendSwitch('js-flags', '--max-old-space-size=1024') - }, - - /** - * Handles all links being opened in the application. - */ - LinkHandler(startArgs) { - if (!startArgs) return; - console.log("lfmtoken", String(startArgs)) - if (String(startArgs).includes('auth')) { - let authURI = String(startArgs).split('/auth/')[1] - if (authURI.startsWith('lastfm')) { // If we wanted more auth options - const authKey = authURI.split('lastfm?token=')[1]; - app.cfg.set('lastfm.enabled', true); - app.cfg.set('lastfm.auth_token', authKey); - app.win.webContents.send('LastfmAuthenticated', authKey); - lastfm.authenticate() - } - } else { - const formattedSongID = startArgs.replace('ame://', '').replace('/', ''); - console.warn(`[LinkHandler] Attempting to load song id: ${formattedSongID}`); - - // setQueue can be done with album, song, url, playlist id - this.win.webContents.executeJavaScript(` - MusicKit.getInstance().setQueue({ song: '${formattedSongID}'}).then(function(queue) { - MusicKit.getInstance().play(); - }); - `).catch((err) => console.error(err)); - } - - }, -} \ No newline at end of file diff --git a/src/main/index.ts b/src/main/index.ts index 96e4f94d..b6fd45a6 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -16,7 +16,7 @@ import {Win} from "./base/win"; const Cider = new Win() app.on("ready", () => { - Cider.createWindow(); + Cider.startWebServer(); }); /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/main/plugins/discordrpc.js b/src/main/plugins/discordrpc.js deleted file mode 100644 index e9bf6871..00000000 --- a/src/main/plugins/discordrpc.js +++ /dev/null @@ -1,138 +0,0 @@ -const {app} = require('electron'), - DiscordRPC = require('discord-rpc') - -module.exports = { - - /** - * Connects to Discord RPC - * @param {string} clientId - */ - connect: function (clientId) { - app.discord = {isConnected: false}; - if (app.cfg.get('general.discord_rpc') == 0) return; - - DiscordRPC.register(clientId) // Apparently needed for ask to join, join, spectate etc. - const client = new DiscordRPC.Client({transport: "ipc"}); - app.discord = Object.assign(client, {error: false, activityCache: null, isConnected: false}); - - // Login to Discord - app.discord.login({clientId}) - .then(() => { - app.discord.isConnected = true; - }) - .catch((e) => console.error(`[DiscordRPC][connect] ${e}`)); - - app.discord.on('ready', () => { - console.log(`[DiscordRPC][connect] Successfully Connected to Discord. Authed for user: ${client.user.username} (${client.user.id})`); - - if (app.discord.activityCache) { - client.setActivity(app.discord.activityCache).catch((e) => console.error(e)); - app.discord.activityCache = null; - } - }) - - // Handles Errors - app.discord.on('error', err => { - console.error(`[DiscordRPC] ${err}`); - this.disconnect() - app.discord.isConnected = false; - }); - }, - - /** - * Disconnects from Discord RPC - */ - disconnect: function () { - if (app.cfg.get('general.discord_rpc') == 0 || !app.discord.isConnected) return; - - try { - app.discord.destroy().then(() => { - app.discord.isConnected = false; - console.log('[DiscordRPC][disconnect] Disconnected from discord.') - }).catch((e) => console.error(`[DiscordRPC][disconnect] ${e}`)); - } catch (err) { - console.error(err) - } - }, - - /** - * Sets the activity of the client - * @param {object} attributes - */ - updateActivity: function (attributes) { - if (app.cfg.get('general.discord_rpc') == 0) return; - - if (!app.discord.isConnected) { - this.connect() - } - - if (!app.discord.isConnected) return; - - // console.log('[DiscordRPC][updateActivity] Updating Discord Activity.') - - const listenURL = `https://applemusicelectron.com/p?id=${attributes.playParams.id}` - //console.log(attributes) - let ActivityObject = { - details: attributes.name, - state: `by ${attributes.artistName}`, - startTimestamp: attributes.startTime, - endTimestamp: attributes.endTime, - largeImageKey: (attributes.artwork.url.replace('{w}', '512').replace('{h}', '512')) ?? 'cider', - largeImageText: attributes.albumName, - smallImageKey: (attributes.status ? 'play' : 'pause'), - smallImageText: (attributes.status ? 'Playing' : 'Paused'), - instance: true, - buttons: [ - {label: "Listen on Cider", url: listenURL}, - ] - }; - if (ActivityObject.largeImageKey == "" || ActivityObject.largeImageKey == null) { - ActivityObject.largeImageKey = (app.cfg.get("general.discord_rpc") == 1) ? "cider" : "logo" - } - // console.log(`[LinkHandler] Listening URL has been set to: ${listenURL}`); - - if (app.cfg.get('general.discordClearActivityOnPause') == 1) { - delete ActivityObject.smallImageKey - delete ActivityObject.smallImageText - } - - // Check all the values work - if (!((new Date(attributes.endTime)).getTime() > 0)) { - delete ActivityObject.startTimestamp - delete ActivityObject.endTimestamp - } - if (!attributes.artistName) { - delete ActivityObject.state - } - if (!ActivityObject.largeImageText || ActivityObject.largeImageText.length < 2) { - delete ActivityObject.largeImageText - } - if (ActivityObject.details.length > 128) { - AcitivityObject.details = ActivityObject.details.substring(0, 125) + '...' - } - - // Clear if if needed - if (!attributes.status) { - if (app.cfg.get('general.discordClearActivityOnPause') == 1) { - app.discord.clearActivity().catch((e) => console.error(`[DiscordRPC][clearActivity] ${e}`)); - ActivityObject = null - } else - { - delete ActivityObject.startTimestamp - delete ActivityObject.endTimestamp - ActivityObject.smallImageKey = 'pause' - ActivityObject.smallImageText = 'Paused' - } - } - - if (ActivityObject) { - try { - // console.log(`[DiscordRPC][setActivity] Setting activity to ${JSON.stringify(ActivityObject)}`); - app.discord.setActivity(ActivityObject) - } catch (err) { - console.error(`[DiscordRPC][setActivity] ${err}`) - } - - } - }, -} \ No newline at end of file diff --git a/src/main/plugins/lastfm.js b/src/main/plugins/lastfm.js deleted file mode 100644 index 541cde82..00000000 --- a/src/main/plugins/lastfm.js +++ /dev/null @@ -1,153 +0,0 @@ -const {app, Notification} = require('electron'), - fs = require('fs'), - {resolve} = require('path'), - sessionPath = resolve(app.getPath('userData'), 'session.json'), - apiCredentials = require('../../../resources/lfmApiCredentials.json'), - LastfmAPI = require('lastfmapi'); - -const lfm = { - authenticateFromFile: function () { - let sessionData = require(sessionPath) - console.log("[LastFM][authenticateFromFile] Logging in with Session Info.") - app.lastfm.setSessionCredentials(sessionData.name, sessionData.key) - console.log("[LastFM][authenticateFromFile] Logged in.") - }, - - authenticate: function () { - if (app.cfg.get('lastfm.auth_token')) { - app.cfg.set('lastfm.enabled', true); - } - - if (!app.cfg.get('lastfm.enabled') || !app.cfg.get('lastfm.auth_token')) { - app.cfg.set('lastfm.enabled', false); - return - } - - const lfmAPI = new LastfmAPI({ - 'api_key': apiCredentials.key, - 'secret': apiCredentials.secret - }); - - app.lastfm = Object.assign(lfmAPI, {cachedAttributes: false, cachedNowPlayingAttributes: false}); - - fs.stat(sessionPath, function (err) { - if (err) { - console.error("[LastFM][Session] Session file couldn't be opened or doesn't exist,", err) - console.log("[LastFM][Auth] Beginning authentication from configuration") - app.lastfm.authenticate(app.cfg.get('lastfm.auth_token'), function (err, session) { - if (err) { - throw err; - } - console.log("[LastFM] Successfully obtained LastFM session info,", session); // {"name": "LASTFM_USERNAME", "key": "THE_USER_SESSION_KEY"} - console.log("[LastFM] Saving session info to disk.") - let tempData = JSON.stringify(session) - fs.writeFile(sessionPath, tempData, (err) => { - if (err) - console.log("[LastFM][fs]", err) - else { - console.log("[LastFM][fs] File was written successfully.") - lfm.authenticateFromFile() - new Notification({ - title: app.getName(), - body: "Successfully logged into LastFM using Authentication Key." - }).show() - } - }) - }); - } else { - lfm.authenticateFromFile() - } - }) - }, - - scrobbleSong: async function (attributes) { - await new Promise(resolve => setTimeout(resolve, app.cfg.get('lastfm.scrobble_after') * 1000)); - const currentAttributes = app.media; - - if (!app.lastfm || app.lastfm.cachedAttributes === attributes ) { - return - } - - if (app.lastfm.cachedAttributes) { - if (app.lastfm.cachedAttributes.playParams.id === attributes.playParams.id) return; - } - - if (currentAttributes.status && currentAttributes === attributes) { - if (fs.existsSync(sessionPath)) { - // Scrobble playing song. - if (attributes.status === true) { - app.lastfm.track.scrobble({ - 'artist': lfm.filterArtistName(attributes.artistName), - 'track': attributes.name, - 'album': attributes.albumName, - 'albumArtist': this.filterArtistName(attributes.artistName), - 'timestamp': new Date().getTime() / 1000 - }, function (err, scrobbled) { - if (err) { - return console.error('[LastFM] An error occurred while scrobbling', err); - } - - console.log('[LastFM] Successfully scrobbled: ', scrobbled); - }); - app.lastfm.cachedAttributes = attributes - } - } else { - this.authenticate(); - } - } else { - return console.log('[LastFM] Did not add ', attributes.name , '-' , lfm.filterArtistName(attributes.artistName), 'because now playing a other song.'); - } - }, - - filterArtistName: function (artist) { - if (!app.cfg.get('lastfm.enabledRemoveFeaturingArtists')) return artist; - - artist = artist.split(' '); - if (artist.includes('&')) { - artist.length = artist.indexOf('&'); - } - if (artist.includes('and')) { - artist.length = artist.indexOf('and'); - } - artist = artist.join(' '); - if (artist.includes(',')) { - artist = artist.split(',') - artist = artist[0] - } - return artist.charAt(0).toUpperCase() + artist.slice(1); - }, - - updateNowPlayingSong: function (attributes) { - if (!app.lastfm ||app.lastfm.cachedNowPlayingAttributes === attributes | !app.cfg.get('lastfm.NowPlaying')) { - return - } - - if (app.lastfm.cachedNowPlayingAttributes) { - if (app.lastfm.cachedNowPlayingAttributes.playParams.id === attributes.playParams.id) return; - } - - if (fs.existsSync(sessionPath)) { - // update Now Playing - if (attributes.status === true) { - app.lastfm.track.updateNowPlaying({ - 'artist': lfm.filterArtistName(attributes.artistName), - 'track': attributes.name, - 'album': attributes.albumName, - 'albumArtist': this.filterArtistName(attributes.artistName) - }, function (err, nowPlaying) { - if (err) { - return console.error('[LastFM] An error occurred while updating nowPlayingSong', err); - } - - console.log('[LastFM] Successfully updated nowPlayingSong', nowPlaying); - }); - app.lastfm.cachedNowPlayingAttributes = attributes - } - - } else { - this.authenticate() - } - } -} - -module.exports = lfm; \ No newline at end of file diff --git a/src/main/plugins/mpris.js b/src/main/plugins/mpris.js deleted file mode 100644 index 3c92e322..00000000 --- a/src/main/plugins/mpris.js +++ /dev/null @@ -1,113 +0,0 @@ -let mediaPlayer = null; - -module.exports = { - - /** - * Connects to the MPRIS interface. - * @param {Object} win - The BrowserWindow. - */ - connect: (win) => { - if (process.platform !== "linux") return; - - const Player = require('mpris-service'); - - mediaPlayer = Player({ - name: 'Cider', - identity: 'Cider', - supportedUriSchemes: [], - supportedMimeTypes: [], - supportedInterfaces: ['player'] - }); - mediaPlayer = Object.assign(mediaPlayer, { canQuit: true, canControl: true, canPause: true, canPlay: true, canGoNext: true }) - - - let pos_atr = {durationInMillis: 0}; - mediaPlayer.getPosition = function () { - const durationInMicro = pos_atr.durationInMillis * 1000; - const percentage = parseFloat("0") || 0; - return durationInMicro * percentage; - } - - mediaPlayer.active = true - - mediaPlayer.on('playpause', async () => { - win.webContents.executeJavaScript('MusicKitInterop.pausePlay()').catch(err => console.error(err)) - }); - - mediaPlayer.on('play', async () => { - win.webContents.executeJavaScript('MusicKitInterop.pausePlay()').catch(err => console.error(err)) - }); - - mediaPlayer.on('pause', async () => { - win.webContents.executeJavaScript('MusicKitInterop.pausePlay()').catch(err => console.error(err)) - }); - - mediaPlayer.on('next', async () => { - win.webContents.executeJavaScript('MusicKitInterop.nextTrack()').catch(err => console.error(err)) - }); - - mediaPlayer.on('previous', async () => { - win.webContents.executeJavaScript('MusicKitInterop.previousTrack()').catch(err => console.error(err)) - }); - }, - - /** - * Updates the MPRIS interface. - * @param {Object} attributes - The attributes of the track. - */ - updateAttributes: (attributes) => { - if (process.platform !== "linux") return; - - const MetaData = { - 'mpris:trackid': mediaPlayer.objectPath(`track/${attributes.playParams.id.replace(/[.]+/g, "")}`), - 'mpris:length': attributes.durationInMillis * 1000, // In microseconds - 'mpris:artUrl': (attributes.artwork.url.replace('/{w}x{h}bb', '/512x512bb')).replace('/2000x2000bb', '/35x35bb'), - 'xesam:title': `${attributes.name}`, - 'xesam:album': `${attributes.albumName}`, - 'xesam:artist': [`${attributes.artistName}`,], - 'xesam:genre': attributes.genreNames - } - - if (mediaPlayer.metadata["mpris:trackid"] === MetaData["mpris:trackid"]) { - return - } - - mediaPlayer.metadata = MetaData - }, - - /** - * Updates the playback state of the MPRIS interface. - * @param {Object} attributes - The attributes of the track. - */ - updateState: (attributes) => { - if (process.platform !== "linux") return; - - function setPlaybackIfNeeded(status) { - if (mediaPlayer.playbackStatus === status) { - return - } - mediaPlayer.playbackStatus = status; - } - - switch (attributes.status) { - case true: // Playing - setPlaybackIfNeeded('Playing'); - break; - case false: // Paused - setPlaybackIfNeeded('Paused'); - break; - default: // Stopped - setPlaybackIfNeeded('Stopped'); - break; - } - }, - - /** - * Closes the MPRIS interface. - */ - clearActivity: () => { - if (process.platform !== "linux") return; - mediaPlayer.metadata = {'mpris:trackid': '/org/mpris/MediaPlayer2/TrackList/NoTrack'} - mediaPlayer.playbackStatus = 'Stopped'; - }, -} \ No newline at end of file diff --git a/src/renderer/ameframework.css b/src/renderer/ameframework.css index d28fe2e6..7da9b6a2 100644 --- a/src/renderer/ameframework.css +++ b/src/renderer/ameframework.css @@ -98,59 +98,7 @@ input[type=range].md-slider::-webkit-slider-runnable-track { } -.md-close-btn { - -webkit-mask-image: url("ameres://icons/webui/close.svg"); - -webkit-mask-repeat: no-repeat; - -webkit-mask-position: center; - background-color: white; - opacity: 0.75; - -webkit-mask-size: contain; - height: 18px; - width: 18px; -} -.md-btn { - background: rgba(100, 100, 100, 0.5); - padding: 8px 16px; - border-radius: 4px; - font-size: 15px; - border: 1px solid rgb(100 100 100 / 35%); - box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 1px 1px rgba(0, 0, 0, 0.4); -} - -.md-btn.md-btn-block { - display: block; -} - -.md-btn:active { - filter: brightness(75%); -} - -.md-select { - padding: 5px 10px; - font-size: 1em; - font-family: inherit; - border-radius: 4px; - border: 1px solid rgb(100 100 100 / 35%); - box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 1px 1px rgba(0, 0, 0, 0.4); - background: #363636; - color: #eee; -} - -.md-select:focus { - outline: none; -} - -.md-select > option { - font-size: 1em; - font-family: inherit; - padding: 8px 16px; -} - -.md-btn.md-btn-primary { - background: var(--keyColor); - color: white; -} .md-transparent { background: transparent; @@ -179,7 +127,6 @@ input[type=range].md-slider::-webkit-slider-runnable-track { @media (prefers-color-scheme: light) { .md-btn { - background: rgb(255 255 255); box-shadow: rgb(0 0 0 / 10%) 0px 0px 1px, rgb(0 0 0 / 20%) 0px 1px 1px; border: 1px solid rgb(0 0 0 / 15%); } diff --git a/src/renderer/assets/feather/disc.svg b/src/renderer/assets/feather/disc.svg new file mode 100644 index 00000000..2595b444 --- /dev/null +++ b/src/renderer/assets/feather/disc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/assets/feather/folder.svg b/src/renderer/assets/feather/folder.svg new file mode 100644 index 00000000..134458b9 --- /dev/null +++ b/src/renderer/assets/feather/folder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/assets/feather/globe.svg b/src/renderer/assets/feather/globe.svg new file mode 100644 index 00000000..0a0586d3 --- /dev/null +++ b/src/renderer/assets/feather/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/assets/feather/heart.svg b/src/renderer/assets/feather/heart.svg new file mode 100644 index 00000000..a083b7e2 --- /dev/null +++ b/src/renderer/assets/feather/heart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/assets/feather/home.svg b/src/renderer/assets/feather/home.svg new file mode 100644 index 00000000..7bb31b23 --- /dev/null +++ b/src/renderer/assets/feather/home.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/assets/feather/list.svg b/src/renderer/assets/feather/list.svg new file mode 100644 index 00000000..0cf5c923 --- /dev/null +++ b/src/renderer/assets/feather/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/assets/feather/music.svg b/src/renderer/assets/feather/music.svg new file mode 100644 index 00000000..7bee2f7e --- /dev/null +++ b/src/renderer/assets/feather/music.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/assets/feather/play-circle.svg b/src/renderer/assets/feather/play-circle.svg new file mode 100644 index 00000000..8766dc7b --- /dev/null +++ b/src/renderer/assets/feather/play-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/assets/feather/play.svg b/src/renderer/assets/feather/play.svg new file mode 100644 index 00000000..fd76e30d --- /dev/null +++ b/src/renderer/assets/feather/play.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/assets/feather/plus-circle.svg b/src/renderer/assets/feather/plus-circle.svg new file mode 100644 index 00000000..4291ff05 --- /dev/null +++ b/src/renderer/assets/feather/plus-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/assets/feather/plus.svg b/src/renderer/assets/feather/plus.svg new file mode 100644 index 00000000..703c5b7b --- /dev/null +++ b/src/renderer/assets/feather/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/assets/feather/radio.svg b/src/renderer/assets/feather/radio.svg new file mode 100644 index 00000000..5abfcd13 --- /dev/null +++ b/src/renderer/assets/feather/radio.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/assets/feather/share-2.svg b/src/renderer/assets/feather/share-2.svg new file mode 100644 index 00000000..09b1c7bc --- /dev/null +++ b/src/renderer/assets/feather/share-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/assets/feather/share.svg b/src/renderer/assets/feather/share.svg new file mode 100644 index 00000000..df38c14d --- /dev/null +++ b/src/renderer/assets/feather/share.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/assets/feather/thumbs-down.svg b/src/renderer/assets/feather/thumbs-down.svg new file mode 100644 index 00000000..3e7bcd6d --- /dev/null +++ b/src/renderer/assets/feather/thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/assets/feather/thumbs-up.svg b/src/renderer/assets/feather/thumbs-up.svg new file mode 100644 index 00000000..5f966cd9 --- /dev/null +++ b/src/renderer/assets/feather/thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/assets/feather/user.svg b/src/renderer/assets/feather/user.svg new file mode 100644 index 00000000..7bb5f291 --- /dev/null +++ b/src/renderer/assets/feather/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/assets/feather/x-circle.svg b/src/renderer/assets/feather/x-circle.svg new file mode 100644 index 00000000..94aad5e5 --- /dev/null +++ b/src/renderer/assets/feather/x-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/assets/spinner.gif b/src/renderer/assets/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..e1b07ea2e5bbd9c1ebf7d719a3892a7d2917f253 GIT binary patch literal 81572 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 literal 0 HcmV?d00001 diff --git a/src/renderer/audio/audio.js b/src/renderer/audio/audio.js new file mode 100644 index 00000000..64118b7c --- /dev/null +++ b/src/renderer/audio/audio.js @@ -0,0 +1,99 @@ +var CiderAudio = { + context : null, + source : null, + audioNodes : { + gainNode : null, + spatialNode : null, + spatialInput: null, + }, + init: function (cb = function () { }) { + //AudioOutputs.fInit = true; + searchInt = setInterval(function () { + if (document.getElementById("apple-music-player")) { + //AudioOutputs.eqReady = true; + document.getElementById("apple-music-player").crossOrigin = "anonymous"; + CiderAudio.connectContext(document.getElementById("apple-music-player"), 0); + + cb(); + clearInterval(searchInt); + } + }, 1000); + }, + off: function(){ + try{ + CiderAudio.audioNodes.gainNode.disconnect(); + CiderAudio.audioNodes.spatialNode.disconnect(); + CiderAudio.source.connect(CiderAudio.context.destination);} catch(e){} + }, + connectContext: function (mediaElem){ + + if (!CiderAudio.context){ + CiderAudio.context = new (window.AudioContext || window.webkitAudioContext); + } + if (!CiderAudio.source){ + CiderAudio.source = CiderAudio.context.createMediaElementSource(mediaElem); + } else {try{CiderAudio.source.disconnect(CiderAudio.context.destination)}catch(e){}} + CiderAudio.audioNodes.gainNode = CiderAudio.context.createGain() + CiderAudio.source.connect(CiderAudio.audioNodes.gainNode); + CiderAudio.audioNodes.gainNode.connect(CiderAudio.context.destination); + if(app.cfg.audio.normalization){ + CiderAudio.normalizerOn() + } + if (app.cfg.audio.spatial){ + CiderAudio.spatialOn() + } + }, + normalizerOn: function (){}, + normalizerOff: function (){ + CiderAudio.audioNodes.gainNode.gain.setTargetAtTime(1, CiderAudio.context.currentTime+ 1, 0.5); + }, + spatialOn: function (){ + try{ + CiderAudio.audioNodes.gainNode.connect(CiderAudio.context.destination);} catch(e){} + CiderAudio.audioNodes.spatialNode = new ResonanceAudio(CiderAudio.context); + CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.context.destination); + let roomDimensions = { + width: 32, + height: 12, + depth: 32, + }; + let roomMaterials = { + // Room wall materials + left: 'metal', + right: 'metal', + front: 'brick-bare', + back: 'brick-bare', + down: 'acoustic-ceiling-tiles', + up: 'acoustic-ceiling-tiles', + }; + CiderAudio.audioNodes.spatialNode.setRoomProperties(roomDimensions, roomMaterials); + CiderAudio.audioNodes.spatialInput = CiderAudio.audioNodes.spatialNode.createSource(); + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input); + }, + spatialOff: function (){ + try{ + CiderAudio.audioNodes.spatialNode.output.disconnect(CiderAudio.context.destination); + CiderAudio.audioNodes.gainNode.disconnect(CiderAudio.audioNodes.spatialInput.input);} catch(e){} + CiderAudio.audioNodes.gainNode.connect(CiderAudio.context.destination); + }, + sendAudio: function (){ + var options = { + mimeType : 'audio/webm; codecs=opus' + }; + var destnode = CiderAudio.context.createMediaStreamDestination(); + CiderAudio.audioNodes.gainNode.connect(destnode) + var mediaRecorder = new MediaRecorder(destnode.stream,options); + mediaRecorder.start(1); + mediaRecorder.ondataavailable = function(e) { + e.data.arrayBuffer().then(buffer => { + ipcRenderer.send('writeAudio',buffer) + } + ); + } + } + +} +if (app.cfg.advanced.AudioContext){ + CiderAudio.init() + +} \ No newline at end of file diff --git a/src/renderer/index.js b/src/renderer/index.js index ccdcd637..7a3f817e 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -5,7 +5,7 @@ var CiderContextMenu = { Menu: function (event) { this.items = [] }, - Create(event, menudata) { + async Create(event, menudata) { var menuBackground = document.createElement("div"); var menu = document.createElement("div"); menu.classList.add("context-menu-body"); @@ -17,7 +17,7 @@ var CiderContextMenu = { menu.style.zIndex = "99909"; menu.addEventListener("animationend", function () { menu.classList.remove("context-menu-open"); - }, { once: true }); + }, {once: true}); function close() { menuBackground.style.pointerEvents = "none"; @@ -25,7 +25,7 @@ var CiderContextMenu = { menu.addEventListener("animationend", function () { menuBackground.remove(); menu.remove(); - }, { once: true }); + }, {once: true}); } // when menubackground is clicked, remove it @@ -37,13 +37,25 @@ var CiderContextMenu = { document.body.appendChild(menuBackground); + if (typeof menudata.items == "object") { + menudata.items = Object.values(menudata.items); + } + + console.log(menudata); // for each item in menudata create a menu item for (var i = 0; i < menudata.items.length; i++) { let item = document.createElement("button") + + if (menudata.items[i]["disabled"] === true) { + continue + } item.tabIndex = 0 item.classList.add("context-menu-item") - item.innerHTML = menudata.items[i].name + if(menudata.items[i]["icon"]) { + item.innerHTML += `` + } + item.innerHTML += menudata.items[i].name item.onclick = menudata.items[i].action menu.appendChild(item) } @@ -62,6 +74,18 @@ var CiderContextMenu = { } } +const MusicKitObjects = { + LibraryPlaylist: function () { + this.id = "" + this.type = "library-playlist-folders" + this.href = "" + this.attributes = { + dateAdded: "", + name: "" + } + this.playlists = [] + } +} const MusicKitTools = { getHeader() { @@ -79,27 +103,28 @@ Array.prototype.limit = function (n) { return this.slice(0, n); }; -// function msToMinSec(ms) { -// let minutes = Math.floor(ms / 60000); -// let seconds = ((ms % 60000) / 1000).toFixed(0); -// return minutes + ":" + (seconds < 10 ? '0' : '') + seconds; -// } - -class NavigationEvent { - constructor(page, onnavigate, scrollPosition) { - this.page = page; - this.onnavigate = onnavigate; - this.scrollPosition = scrollPosition; +const store = new Vuex.Store({ + state: { + library: { + songs: ipcRenderer.sendSync("get-library-songs"), + albums: ipcRenderer.sendSync("get-library-albums"), + recentlyAdded: ipcRenderer.sendSync("get-library-recentlyAdded"), + playlists: ipcRenderer.sendSync("get-library-playlists") + }, + artwork: { + playerLCD: "" + } + }, + mutations: { + setLCDArtwork(state, artwork) { + state.artwork.playerLCD = artwork + } } - - navigate() { - this.onnavigate(); - document.querySelector("#app-content").scrollTop = this.scrollPosition; - } -} +}) const app = new Vue({ el: "#app", + store: store, data: { appMode: "player", ipcRenderer: ipcRenderer, @@ -117,6 +142,7 @@ const app = new Vue({ resultsSocial: {}, limit: 10 }, + fullscreenLyrics: false, playerLCD: { playbackDuration: 0, desiredDuration: 0, @@ -161,7 +187,7 @@ const app = new Vue({ sorting: "name", sortOrder: "asc", listing: [], - meta: { total: 0, progress: 0 }, + meta: {total: 0, progress: 0}, search: "", displayListing: [], downloadState: 0 // 0 = not started, 1 = in progress, 2 = complete, 3 = empty library @@ -177,7 +203,7 @@ const app = new Vue({ sorting: ["dateAdded", "name"], // [0] = recentlyadded page, [1] = albums page sortOrder: ["desc", "asc"], // [0] = recentlyadded page, [1] = albums page listing: [], - meta: { total: 0, progress: 0 }, + meta: {total: 0, progress: 0}, search: "", displayListing: [], downloadState: 0 // 0 = not started, 1 = in progress, 2 = complete, 3 = empty library @@ -193,7 +219,7 @@ const app = new Vue({ sorting: ["dateAdded", "name"], // [0] = recentlyadded page, [1] = albums page sortOrder: ["desc", "asc"], // [0] = recentlyadded page, [1] = albums page listing: [], - meta: { total: 0, progress: 0 }, + meta: {total: 0, progress: 0}, search: "", displayListing: [], downloadState: 0 // 0 = not started, 1 = in progress, 2 = complete, 3 = empty library @@ -206,7 +232,10 @@ const app = new Vue({ id: "" }, mxmtoken: "", + mkIsReady: false, playerReady: false, + animateBackground: false, + currentArtUrl: '', lyricon: false, currentTrackID: '', currentTrackIDBG: '', @@ -230,7 +259,7 @@ const app = new Vue({ "attributes": { "name": "Cider User", "handle": "CiderUser", - "artwork": { "url": "./assets/logocut.png" } + "artwork": {"url": "./assets/logocut.png"} } }, menuOpened: false, @@ -247,7 +276,7 @@ const app = new Vue({ }, prevButtonBackIndicator: false, currentSongInfo: {}, - page: "browse", + page: "", pageHistory: [], songstest: false, hangtimer: null, @@ -255,8 +284,13 @@ const app = new Vue({ routes: ["browse", "listen_now", "radio"], musicBaseUrl: "https://api.music.apple.com/", modals: { - addToPlaylist: false + addToPlaylist: false, + spatialProperties: false }, + socialBadges: { + badgeMap: {}, + version: "" + } }, watch: { cfg: { @@ -280,7 +314,31 @@ const app = new Vue({ }, }, methods: { + async getSvgIcon(url) { + let response = await fetch(url); + let data = await response.text(); + return data; + }, + getSocialBadges(cb = () => { + }) { + let self = this + try { + app.mk.api.socialBadgingMap().then(data => { + self.socialBadges.badgeMap = data.badgingMap + cb(data.badgingMap) + }) + } catch (ex) { + this.socialBadges.badgeMap = {} + } + }, + addFavorite(id, type) { + this.cfg.home.favoriteItems.push({ + id: id, + type: type + }); + }, modularUITest(val = false) { + this.fullscreenLyrics = val; if (val) { document.querySelector("#app-main").classList.add("modular-fs") } else { @@ -299,10 +357,13 @@ const app = new Vue({ default: document.querySelector("html").style.background = ""; document.querySelector("body").style.background = ""; + document.querySelector("body").classList.remove("notransparency") break; case "disabled": document.querySelector("html").style.background = "#222"; - document.querySelector("body").style.background = "#222"; + document.querySelector("body").classList.add("notransparency") + + // document.querySelector("body").style.background = "#222"; break; } }, @@ -315,23 +376,39 @@ const app = new Vue({ promptAddToPlaylist() { app.modals.addToPlaylist = true; }, - addSelectedToPlaylist(playlist_id) { + async addSelectedToPlaylist(playlist_id) { let self = this let pl_items = [] for (let i = 0; i < self.selectedMediaItems.length; i++) { - if (self.selectedMediaItems[i].kind == "song") { + if (self.selectedMediaItems[i].kind == "song" || self.selectedMediaItems[i].kind == "songs") { self.selectedMediaItems[i].kind = "songs" - } else if (self.selectedMediaItems[i].kind == "album") { + pl_items.push({ + id: self.selectedMediaItems[i].id, + type: self.selectedMediaItems[i].kind + }) + } else if ((self.selectedMediaItems[i].kind == "album" || self.selectedMediaItems[i].kind == "albums") && self.selectedMediaItems[i].isLibrary != true ) { self.selectedMediaItems[i].kind = "albums" - } else if (self.selectedMediaItems[i].kind == "library-song") { - self.selectedMediaItems[i].kind = "library-songs" - } else if (self.selectedMediaItems[i].kind == "library-album") { + let res = await self.mk.api.albumRelationship(self.selectedMediaItems[i].id,"tracks"); + let ids = res.map(function(i) {return {id:i.id, type: i.type}}) + pl_items = pl_items.concat(ids) + } else if (self.selectedMediaItems[i].kind == "library-song" || self.selectedMediaItems[i].kind == "library-songs") { + self.selectedMediaItems[i].kind = "library-songs" + pl_items.push({ + id: self.selectedMediaItems[i].id, + type: self.selectedMediaItems[i].kind + }) + } else if ((self.selectedMediaItems[i].kind == "library-album" || self.selectedMediaItems[i].kind == "library-albums") || (self.selectedMediaItems[i].kind == "album" && self.selectedMediaItems[i].isLibrary == true )) { self.selectedMediaItems[i].kind = "library-albums" + let res = await self.mk.api.library.albumRelationship(self.selectedMediaItems[i].id,"tracks"); + let ids = res.map(function(i) {return {id:i.id, type: i.type}}) + pl_items = pl_items.concat(ids) + } else { + pl_items.push({ + id: self.selectedMediaItems[i].id, + type: self.selectedMediaItems[i].kind + }) } - pl_items.push({ - id: self.selectedMediaItems[i].id, - type: self.selectedMediaItems[i].kind - }) + } this.modals.addToPlaylist = false this.mk.api.library.appendTracksToPlaylist(playlist_id, pl_items).then(() => { @@ -344,7 +421,9 @@ const app = new Vue({ let self = this clearTimeout(this.hangtimer) this.mk = MusicKit.getInstance() - this.mk.authorize() + this.mk.authorize().then(() => { + self.mkIsReady = true + }) this.$forceUpdate() if (this.isDev) { this.mk.privateEnabled = true @@ -363,7 +442,7 @@ const app = new Vue({ "attributes": { "name": "Cider User", "handle": "CiderUser", - "artwork": { "url": "./assets/logocut.png" } + "artwork": {"url": "./assets/logocut.png"} } } } @@ -390,6 +469,22 @@ const app = new Vue({ window.localStorage.setItem("currentQueue", JSON.stringify(app.mk.queue.items)) }; + // Load saved quality + switch (app.cfg.audio.quality) { + case "extreme": + app.mk.bitrate = app.cfg.audio.quality = 990 + break; + case "high": + app.mk.bitrate = app.cfg.audio.quality = 256 + break; + case "low": + app.mk.bitrate = app.cfg.audio.quality = 64 + break; + default: + app.mk.bitrate = app.cfg.audio.quality + } + + // load last played track try { let lastItem = window.localStorage.getItem("currentTrack") @@ -399,7 +494,7 @@ const app = new Vue({ lastItem = JSON.parse(lastItem) let kind = lastItem.attributes.playParams.kind; let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind; - app.mk.setQueue({ [truekind]: [lastItem.attributes.playParams.id] }) + app.mk.setQueue({[truekind]: [lastItem.attributes.playParams.id]}) app.mk.mute() setTimeout(() => { app.mk.play().then(() => { @@ -417,8 +512,9 @@ const app = new Vue({ for (id of ids) { if (!(i == 0 && ids[0] == lastItem.attributes.playParams.id)) { try { - app.mk.playLater({ songs: [id] }) - } catch (err) { } + app.mk.playLater({songs: [id]}) + } catch (err) { + } } i++; } @@ -433,10 +529,20 @@ const app = new Vue({ } - } catch (e) { console.log(e) } + } catch (e) { + console.log(e) + } MusicKit.getInstance().videoContainerElement = document.getElementById("apple-music-video-player") + ipcRenderer.on('SoundCheckTag', (event, tag) => { + let replaygain = self.parseSCTagToRG(tag) + try { + CiderAudio.audioNodes.gainNode.gain.value = (Math.min(Math.pow(10, (replaygain.gain / 20)), (1 / replaygain.peak))) + } catch (e) { + + } + }) this.mk.addEventListener(MusicKit.Events.playbackTimeDidChange, (a) => { self.lyriccurrenttime = self.mk.currentPlaybackTime @@ -449,11 +555,35 @@ const app = new Vue({ self.$refs.queue.updateQueue(); } this.currentSongInfo = a + + + if (app.cfg.audio.normalization) { + // get unencrypted audio previews to get SoundCheck's normalization tag + try { + let previewURL = null + try { + previewURL = app.mk.nowPlayingItem.previewURL + } catch (e) { + } + if (!previewURL) { + app.mk.api.song(app.mk.nowPlayingItem._songId ?? app.mk.nowPlayingItem.relationships.catalog.data[0].id).then((response) => { + previewURL = response.attributes.previews[0].url + if (previewURL) + ipcRenderer.send('getPreviewURL', previewURL) + }) + } else { + if (previewURL) + ipcRenderer.send('getPreviewURL', previewURL) + } + + } catch (e) { + } + } + try { a = a.item.attributes; } catch (_) { } - let type = (self.mk.nowPlayingItem != null) ? self.mk.nowPlayingItem["type"] ?? '' : ''; if (type.includes("musicVideo") || type.includes("uploadedVideo") || type.includes("music-movie")) { @@ -466,20 +596,21 @@ const app = new Vue({ self.chrome.artworkReady = false self.lyrics = [] self.richlyrics = [] - app.getNowPlayingArtwork(42); + app.getCurrentArtURL(); + // app.getNowPlayingArtwork(42); app.getNowPlayingArtworkBG(32); - app.loadLyrics() + app.loadLyrics(); // Playback Notifications - if ((app.platform === "darwin" || app.platform === "linux") && !document.hasFocus()) { + if ((app.platform === "darwin" || app.platform === "linux") && !document.hasFocus() && a.artistName && a.artwork && a.name) { if (this.notification) { this.notification.close() } this.notification = new Notification(a.name, { body: a.artistName, - icon: (a.artwork.url.replace('/{w}x{h}bb', '/512x512bb')).replace('/2000x2000bb', '/35x35bb'), - silent: true - }) + icon: a.artwork.url.replace('/{w}x{h}bb', '/512x512bb').replace('/2000x2000bb', '/35x35bb'), + silent: true, + }); } }) @@ -493,9 +624,12 @@ const app = new Vue({ document.body.removeAttribute("loading") if (window.location.hash != "") { this.appRoute(window.location.hash) + } else { + this.page = "home" } setTimeout(() => { + this.getSocialBadges() this.getBrowsePage(); this.$forceUpdate() }, 500) @@ -541,10 +675,32 @@ const app = new Vue({ }) } }, + getPlaylistFolderChildren(id) { + return this.playlists.listing.filter(playlist => { + if (playlist.parent == id) { + return playlist + } + }) + }, async refreshPlaylists() { let self = this this.apiCall('https://api.music.apple.com/v1/me/library/playlist-folders/p.playlistsroot/children/', res => { self.playlists.listing = res.data + self.playlists.listing.forEach(playlist => { + playlist.parent = "p.playlistsroot" + }) + self.sortPlaylists() + }) + }, + sortPlaylists() { + this.playlists.listing.sort((a, b) => { + if (a.type === "library-playlist-folders" && b.type !== "library-playlist-folders") { + return -1 + } else if (a.type !== "library-playlist-folders" && b.type === "library-playlist-folders") { + return 1 + } else { + return 0 + } }) }, playlistHeaderContextMenu(event) { @@ -555,30 +711,54 @@ const app = new Vue({ action: () => { this.newPlaylist() } - } - ] - } - CiderContextMenu.Create(event, menu) - }, - playlistContextMenu(event, playlist_id) { - let menu = { - items: [ + }, { - name: "Delete from library", + name: "New Playlist Folder", action: () => { - this.deletePlaylist(playlist_id) + this.newPlaylistFolder() } } ] } CiderContextMenu.Create(event, menu) }, - async editPlaylist(id, name = "New Playlist") { + async editPlaylistFolder(id, name = "New Playlist") { let self = this - await app.mk.api.library.editPlaylist(id, { name: name }).then(res => { + this.mk.api.v3.music( + `/v1/me/library/playlist-folders/${id}`, + {}, + { + fetchOptions: { + method: "PATCH", + body: JSON.stringify({ + attributes: {name: name} + }) + } + } + ).then(res => { self.refreshPlaylists() }) }, + async editPlaylist(id, name = "New Playlist") { + let self = this + this.mk.api.v3.music( + `/v1/me/library/playlists/${id}`, + {}, + { + fetchOptions: { + method: "PATCH", + body: JSON.stringify({ + attributes: {name: name} + }) + } + } + ).then(res => { + self.refreshPlaylists() + }) + }, + copyToClipboard(str) { + navigator.clipboard.writeText(str) + }, newPlaylist(name = "New Playlist", tracks = []) { let self = this let request = { @@ -592,9 +772,17 @@ const app = new Vue({ self.appRoute(`playlist_` + res.id); self.showingPlaylist = []; self.getPlaylistFromID(app.page.substring(9)) + self.playlists.listing.push({ + id: res.id, + attributes: { + name: name + }, + parent: "p.playlistsroot" + }) + self.sortPlaylists() setTimeout(() => { app.refreshPlaylists() - }, 3000) + }, 8000) }) }, deletePlaylist(id) { @@ -617,11 +805,11 @@ const app = new Vue({ app.appRoute("collection-list") }, async showArtistView(artist, title, view) { - let response = await this.mk.api.artistView(artist, view, {}, { view: view, includeResponseMeta: !0 }) + let response = await this.mk.api.artistView(artist, view, {}, {view: view, includeResponseMeta: !0}) await this.showCollection(response, title, "artists") }, async showRecordLabelView(label, title, view) { - let response = await this.mk.api.recordLabelView(label, view, {}, { view: view, includeResponseMeta: !0 }) + let response = await this.mk.api.recordLabelView(label, view, {}, {view: view, includeResponseMeta: !0}) await this.showCollection(response, title, "record-labels") }, async showSearchView(term, group, title) { @@ -650,7 +838,7 @@ const app = new Vue({ omit: { resource: ["autos"] } - }, { groups: group, includeResponseMeta: !0 }) + }, {groups: group, includeResponseMeta: !0}) console.log(response) let responseFormat = { data: response[group].data.data, @@ -659,10 +847,10 @@ const app = new Vue({ } await this.showCollection(responseFormat, title, "search") }, - async getPlaylistContinuous(response) { + async getPlaylistContinuous(response, transient = false) { let self = this let playlistId = response.id - this.playlists.loadingState = 0 + if (!transient) this.playlists.loadingState = 0 this.showingPlaylist = response if (!response.relationships.tracks.next) { this.playlists.loadingState = 1 @@ -686,7 +874,7 @@ const app = new Vue({ getPlaylistTracks(response.relationships.tracks.next) }, - async getPlaylistFromID(id) { + async getPlaylistFromID(id, transient = false) { let self = this const params = { include: "tracks", @@ -697,19 +885,18 @@ const app = new Vue({ "fields[catalog]": "artistUrl,albumUrl", "fields[songs]": "artistUrl,albumUrl" } - - this.playlists.loadingState = 0 + if (!transient) {this.playlists.loadingState = 0;} let playlistId = '' try { app.mk.api.library.playlist(id, params).then(res => { - self.getPlaylistContinuous(res) + self.getPlaylistContinuous(res, transient) }) } catch (e) { console.log(e); try { app.mk.api.library.playlist(id, params).then(res => { - self.getPlaylistContinuous(res) + self.getPlaylistContinuous(res, transient) }) } catch (err) { console.log(err) @@ -726,7 +913,7 @@ const app = new Vue({ "fields[albums]": "artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url,trackCount", "limit[artists:top-songs]": 20, "art[url]": "f" - }, { includeResponseMeta: !0 }) + }, {includeResponseMeta: !0}) console.log(artistData) this.artistPage.data = artistData.data[0] this.page = "artist-page" @@ -821,7 +1008,7 @@ const app = new Vue({ kind: page, id: id, attributes: { - playParams: { kind: page, id: id } + playParams: {kind: page, id: id} } }) }, @@ -866,8 +1053,9 @@ const app = new Vue({ window.location.hash = `${kind}/${id}` document.querySelector("#app-content").scrollTop = 0 } else if (!kind.toString().includes("radioStation") && !kind.toString().includes("song") && !kind.toString().includes("musicVideo") && !kind.toString().includes("uploadedVideo") && !kind.toString().includes("music-movie")) { + let params = {extend: "editorialVideo"} app.page = (kind) + "_" + (id); - app.getTypeFromID((kind), (id), (isLibrary), { extend: "editorialVideo" }); + app.getTypeFromID((kind), (id), (isLibrary), params); window.location.hash = `${kind}/${id}` document.querySelector("#app-content").scrollTop = 0 } else { @@ -887,7 +1075,7 @@ const app = new Vue({ } }, async getNowPlayingItemDetailed(target) { - let u = await app.mkapi(app.mk.nowPlayingItem.playParams.kind, (app.mk.nowPlayingItem.songId == -1), (app.mk.nowPlayingItem.songId != -1) ? app.mk.nowPlayingItem.songId : app.mk.nowPlayingItem["id"], { "include[songs]": "albums,artists" }); + let u = await app.mkapi(app.mk.nowPlayingItem.playParams.kind, (app.mk.nowPlayingItem.songId == -1), (app.mk.nowPlayingItem.songId != -1) ? app.mk.nowPlayingItem.songId : app.mk.nowPlayingItem["id"], {"include[songs]": "albums,artists"}); app.searchAndNavigate(u, target) }, async searchAndNavigate(item, target) { @@ -986,17 +1174,13 @@ const app = new Vue({ } if (labelId != "") { app.showingPlaylist = [] - await app.getTypeFromID("recordLabel", labelId, false, { views: 'top-releases,latest-releases,top-artists' }); + await app.getTypeFromID("recordLabel", labelId, false, {views: 'top-releases,latest-releases,top-artists'}); app.page = "recordLabel_" + labelId; } break; } }, - pushNavigationEvent(item) { - let self = this - - }, exitMV() { MusicKit.getInstance().stop() document.getElementById("apple-music-video-container").style.display = "none"; @@ -1012,7 +1196,7 @@ const app = new Vue({ let isLibrary = item.attributes.playParams ? (item.attributes.playParams.isLibrary ?? false) : false; console.log(kind, id, isLibrary) if (kind.includes("artist")) { - app.mk.setStationQueue({ artist: 'a-' + id }).then(() => { + app.mk.setStationQueue({artist: 'a-' + id}).then(() => { app.mk.play() }) } else { @@ -1036,8 +1220,7 @@ const app = new Vue({ } finally { if (kind == "appleCurator") { app.appleCurator = a - } - else { + } else { this.getPlaylistContinuous(a) } } @@ -1310,11 +1493,11 @@ const app = new Vue({ } self.library.songs.downloadState = 1 if (downloaded == null) { - app.mk.api.library.songs("", params, { includeResponseMeta: !0 }).then((response) => { + app.mk.api.library.songs("", params, {includeResponseMeta: !0}).then((response) => { processChunk(response) }) } else { - downloaded.next("", params, { includeResponseMeta: !0 }).then((response) => { + downloaded.next("", params, {includeResponseMeta: !0}).then((response) => { processChunk(response) }) } @@ -1386,11 +1569,11 @@ const app = new Vue({ limit: 100, } if (downloaded == null) { - app.mk.api.library.albums("", params, { includeResponseMeta: !0 }).then((response) => { + app.mk.api.library.albums("", params, {includeResponseMeta: !0}).then((response) => { processChunk(response) }) } else { - downloaded.next("", params, { includeResponseMeta: !0 }).then((response) => { + downloaded.next("", params, {includeResponseMeta: !0}).then((response) => { processChunk(response) }) } @@ -1417,7 +1600,7 @@ const app = new Vue({ } if (downloaded.meta.total > library.length || typeof downloaded.meta.next != "undefined") { console.log(`downloading next chunk - ${library.length - } albums so far`) + } albums so far`) downloadChunk() } else { self.library.albums.listing = library @@ -1463,11 +1646,11 @@ const app = new Vue({ limit: 100, } if (downloaded == null) { - app.mk.api.library.artists("", params, { includeResponseMeta: !0 }).then((response) => { + app.mk.api.library.artists("", params, {includeResponseMeta: !0}).then((response) => { processChunk(response) }) } else { - downloaded.next("", "artists", { includeResponseMeta: !0 }).then((response) => { + downloaded.next("", "artists", {includeResponseMeta: !0}).then((response) => { processChunk(response) }) } @@ -1494,7 +1677,7 @@ const app = new Vue({ } if (downloaded.meta.total > library.length || typeof downloaded.meta.next != "undefined") { console.log(`downloading next chunk - ${library.length - } artists so far`) + } artists so far`) downloadChunk() } else { self.library.artists.listing = library @@ -1511,20 +1694,23 @@ const app = new Vue({ getTotalTime() { try { if (app.showingPlaylist.relationships.tracks.data.length > 0) { - time = Math.round([].concat(...app.showingPlaylist.relationships.tracks.data).reduce((a, { attributes: { durationInMillis } }) => a + durationInMillis, 0) / 60000); - return app.showingPlaylist.relationships.tracks.data.length + " tracks, " + time + " mins."; + let time = Math.round([].concat(...app.showingPlaylist.relationships.tracks.data).reduce((a, {attributes: {durationInMillis}}) => a + durationInMillis, 0) / 1000); + let hours = Math.floor(time / 3600) + let mins = Math.floor(time / 60) % 60 + let secs = time % 60 + return app.showingPlaylist.relationships.tracks.data.length + " tracks, " + ((hours > 0) ? (hours + (" hour" + ((hours > 1) ? "s, " : ", "))) : "") + ((mins > 0) ? (mins + (" minute" + ((mins > 1) ? "s, " : ", "))) : "") + secs + (" second" + ((secs > 1) ? "s." : ".")); } else return "" } catch (err) { return "" } }, async getLibrarySongs() { - let response = await this.mkapi("songs", true, "", { limit: 100 }, { includeResponseMeta: !0 }) + let response = await this.mkapi("songs", true, "", {limit: 100}, {includeResponseMeta: !0}) this.library.songs.listing = response.data this.library.songs.meta = response.meta }, async getLibraryAlbums() { - let response = await this.mkapi("albums", true, "", { limit: 100 }, { includeResponseMeta: !0 }) + let response = await this.mkapi("albums", true, "", {limit: 100}, {includeResponseMeta: !0}) this.library.albums.listing = response.data this.library.albums.meta = response.meta }, @@ -1554,7 +1740,7 @@ const app = new Vue({ "fields[artists]": ["name", "url"], "extend[stations]": ["airDate", "supportsAirTimeUpdates"], "meta[stations]": "inflectionPoints", - types: "artists,albums,editorial-items,library-albums,library-playlists,music-movies,music-videos,playlists,stations,uploaded-audios,uploaded-videos,activities,apple-curators,curators,tv-shows,social-profiles,social-upsells", + types: "artists,albums,editorial-items,library-albums,library-playlists,music-movies,music-videos,playlists,stations,uploaded-audios,uploaded-videos,activities,apple-curators,curators,tv-shows,social-upsells", platform: "web" }, { @@ -1618,6 +1804,35 @@ const app = new Vue({ this.getMadeForYou(attempt + 1) } }, + newPlaylistFolder(name = "New Folder") { + let self = this + this.mk.api.v3.music( + "/v1/me/library/playlist-folders/", + {}, + { + fetchOptions: { + method: "POST", + body: JSON.stringify({ + attributes: {name: name} + }) + } + } + ).then((res) => { + let playlist = (res.data.data[0]) + self.playlists.listing.push({ + id: playlist.id, + attributes: { + name: playlist.attributes.name + }, + type: "library-playlist-folders", + parent: "p.playlistsroot" + }) + self.sortPlaylists() + setTimeout(() => { + app.refreshPlaylists() + }, 13000) + }) + }, unauthorize() { this.mk.unauthorize() }, @@ -1632,7 +1847,9 @@ const app = new Vue({ } else { if (app.cfg.lyrics.enable_mxm) { this.loadMXM(); - } else { this.loadAMLyrics(); } + } else { + this.loadAMLyrics(); + } } }, loadAMLyrics() { @@ -1655,7 +1872,7 @@ const app = new Vue({ removeFromLibrary(kind, id) { let self = this let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind; - this.mk.api.library.remove({ [truekind]: id }).then((data) => { + this.mk.api.library.remove({[truekind]: id}).then((data) => { self.getLibrarySongsFull(true) }) }, @@ -1668,8 +1885,12 @@ const app = new Vue({ let ytid = result[0]['id']['videoId']; if (app.cfg.lyrics.enable_yt) { loadYT(ytid, app.cfg.lyrics.mxm_language ?? "en") - } else { app.loadMXM() } - } else { app.loadMXM() } + } else { + app.loadMXM() + } + } else { + app.loadMXM() + } function loadYT(id, lang) { let req = new XMLHttpRequest(); @@ -1945,15 +2166,15 @@ const app = new Vue({ line: "lrcInstrumental" }); } - preLrc.push({ startTime: start, endTime: end, line: element.textContent }); + preLrc.push({startTime: start, endTime: end, line: element.textContent}); endTimes.push(end); } // first line dot if (preLrc.length > 0) - preLrc.unshift({ startTime: 0, endTime: preLrc[0].startTime, line: "lrcInstrumental" }); + preLrc.unshift({startTime: 0, endTime: preLrc[0].startTime, line: "lrcInstrumental"}); } else { for (element of lyricsLines) { - preLrc.push({ startTime: 9999999, endTime: 9999999, line: element.textContent }); + preLrc.push({startTime: 9999999, endTime: 9999999, line: element.textContent}); } } this.lyrics = preLrc; @@ -2021,15 +2242,15 @@ const app = new Vue({ console.log(id, truekind, isLibrary) try { if (truekind.includes("artist")) { - app.mk.setStationQueue({ artist: 'a-' + id }).then(() => { + app.mk.setStationQueue({artist: 'a-' + id}).then(() => { app.mk.play() }) } else if (truekind == "radioStations") { - this.mk.setStationQueue({ url: raurl }).then(function (queue) { + this.mk.setStationQueue({url: raurl}).then(function (queue) { MusicKit.getInstance().play() }); } else { - this.mk.setQueue({ [truekind]: [id] }).then(function (queue) { + this.mk.setQueue({[truekind]: [id]}).then(function (queue) { MusicKit.getInstance().play() }) } @@ -2061,30 +2282,54 @@ const app = new Vue({ if (childIndex != -1) { app.mk.changeToMediaAtIndex(childIndex) } else if (item) { - app.mk.playNext({ [item.attributes.playParams.kind ?? item.type]: item.attributes.playParams.id ?? item.id }).then(function () { + app.mk.playNext({[item.attributes.playParams.kind ?? item.type]: item.attributes.playParams.id ?? item.id}).then(function () { app.mk.changeToMediaAtIndex(app.mk.queue._itemIDs.indexOf(item.id) ?? 1) app.mk.play() }) - } else { app.mk.play() } + } else { + app.mk.play() + } }) } else { try { app.mk.stop() } catch (e) { } - this.mk.setQueue({ [truekind]: [id] }).then(function (queue) { + if (truekind == "playlists" && (id.startsWith("p.") || id.startsWith("pl.u"))){ + app.mk.playNext({[item.attributes.playParams.kind ?? item.type]: item.attributes.playParams.id ?? item.id}).then(function () { + app.mk.changeToMediaAtIndex(app.mk.queue._itemIDs.indexOf(item.id) ?? 1) + app.mk.play().then(function(){ + app.mk.clearQueue().then(function () { + if ((app.showingPlaylist && app.showingPlaylist.id == id)) { + let query = app.showingPlaylist.relationships.tracks.data.map(item => new MusicKit.MediaItem(item)); + app.mk.queue.append(query) + } else { + app.getPlaylistFromID(id, true).then(function () { + let query = app.showingPlaylist.relationships.tracks.data.map(item => new MusicKit.MediaItem(item)); + app.mk.queue.append(query) + }) + } + }) + }) + + }) + } + else{ + this.mk.setQueue({[truekind]: [id]}).then(function (queue) { if (item && ((queue._itemIDs[childIndex] != item.id))) { childIndex = queue._itemIDs.indexOf(item.id) } if (childIndex != -1) { app.mk.changeToMediaAtIndex(childIndex) } else if (item) { - app.mk.playNext({ [item.attributes.playParams.kind ?? item.type]: item.attributes.playParams.id ?? item.id }).then(function () { + app.mk.playNext({[item.attributes.playParams.kind ?? item.type]: item.attributes.playParams.id ?? item.id}).then(function () { app.mk.changeToMediaAtIndex(app.mk.queue._itemIDs.indexOf(item.id) ?? 1) app.mk.play() }) - } else { app.mk.play() } - }) + } else { + app.mk.play() + } + })} } } catch (err) { console.log(err) @@ -2166,18 +2411,39 @@ const app = new Vue({ "platform": "web", limit: 25 }).then(function (results) { - self.search.results = results - }) + self.search.results = results + }) await this.mk.api.socialSearch(this.search.term, { types: ["playlists", "social-profiles"], limit: 25, with: ["serverBubbles", "lyricSnippet"], "art[url]": "f", "art[social-profiles:url]": "c" - }, { includeResponseMeta: !0 }).then(function (results) { + }, {includeResponseMeta: !0}).then(function (results) { self.search.resultsSocial = results }) }, + async inLibrary(items = []) { + let types = [] + + for (let item of items) { + let type = item.type + if (type.slice(-1) != "s") { + type += "s" + } + let id = item.playParams.catalogId ? item.playParams.catalogId : item.id + + let index = types.findIndex(function (type) { + return type.type == this + }, type) + if (index == -1) { + types.push({type: type, id: [id]}) + } else { + types[index].id.push(id) + } + } + return await this.mk.api.catalogResources(types, {"omit[resource]": "autos", relate: "library", fields: "inLibrary"}) + }, isInLibrary(playParams) { let self = this let id = "" @@ -2213,12 +2479,22 @@ const app = new Vue({ } }, getMediaItemArtwork(url, height = 64, width) { + if(typeof url == "undefined" || url == "") { + return "https://beta.music.apple.com/assets/product/MissingArtworkMusic.svg" + } let newurl = `${url.replace('{w}', width ?? height).replace('{h}', height).replace('{f}', "webp").replace('{c}', ((width === 900) ? "sr" : "cc"))}`; - if (newurl.includes("900x516")) { newurl = newurl.replace("900x516cc", "900x516sr").replace("900x516bb", "900x516sr"); } + if (newurl.includes("900x516")) { + newurl = newurl.replace("900x516cc", "900x516sr").replace("900x516bb", "900x516sr"); + } return newurl }, + _rgbToRgb(rgb = [0,0,0]) { + // if rgb + return `rgb(${rgb[0]},${rgb[1]},${rgb[2]})` + }, getNowPlayingArtworkBG(size = 600) { + let self = this if (typeof this.mk.nowPlayingItem === "undefined") return; let bginterval = setInterval(() => { if (!this.mkReady()) { @@ -2233,7 +2509,29 @@ const app = new Vue({ this.currentTrackID = this.mk.nowPlayingItem["id"]; document.querySelector('.bg-artwork').src = ""; if (this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"]) { - document.querySelector('.bg-artwork').src = this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"].replace('{w}', size).replace('{h}', size); + getBase64FromUrl(this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"].replace('{w}', size).replace('{h}', size)).then(img =>{ + document.querySelectorAll('.bg-artwork').forEach(artwork => { + artwork.src = img; + }) + self.$store.commit("setLCDArtwork", img) + }) + + // Vibrant.from(this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"].replace('{w}', size).replace('{h}', size)).getPalette().then(palette=>{ + // let angle = "140deg" + // let gradient = "" + // let colors = Object.values(palette).filter(color=>color!=null) + // if(colors.length > 0){ + // let stops = [] + // colors.forEach(color=>{ + // stops.push(`${self._rgbToRgb(color._rgb)} 0%`) + // }) + // stops.push(`${self._rgbToRgb(colors[0]._rgb)} 100%`) + // gradient = `linear-gradient(${angle}, ${stops.join(", ")}` + // } + // + // document.querySelector("#app").style.setProperty("--bgColor", gradient) + // }).setQuantizer(Vibrant.Quantizer.WebWorker) + try { clearInterval(bginterval); } catch (err) { @@ -2258,46 +2556,72 @@ const app = new Vue({ } }, 200) }, - getNowPlayingArtwork(size = 600) { - if (typeof this.mk.nowPlayingItem === "undefined") return; - let interval = setInterval(() => { - try { - if (this.mk.nowPlayingItem && this.mk.nowPlayingItem["id"] != this.currentTrackIDBG && document.querySelector('.app-playback-controls .artwork')) { - this.currentTrackIDBG = this.mk.nowPlayingItem["id"]; - if (document.querySelector('.app-playback-controls .artwork') != null) { - clearInterval(interval); - } - document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', ''); - if (this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"]) { - document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', `url("${decodeURI((this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"])).replace('{w}', size).replace('{h}', size)}")`); - try { - clearInterval(interval); - } catch (err) { - } - } else { - this.setLibraryArt() - } - } else if (this.mk.nowPlayingItem["id"] == this.currentTrackID) { - try { - clearInterval(interval); - } catch (err) { - } - } - } catch (e) { - if (this.mk.nowPlayingItem && this.mk.nowPlayingItem["id"] && document.querySelector('.app-playback-controls .artwork')) { - this.setLibraryArt() - try { - clearInterval(interval); - } catch (err) { - } + // getNowPlayingArtwork(size = 600) { + // if (typeof this.mk.nowPlayingItem === "undefined") return; + // let interval = setInterval(() => { - } + // try { + // if (this.mk.nowPlayingItem && this.mk.nowPlayingItem["id"] != this.currentTrackIDBG && document.querySelector('.app-playback-controls .artwork')) { + // this.currentTrackIDBG = this.mk.nowPlayingItem["id"]; + // if (document.querySelector('.app-playback-controls .artwork') != null) { + // clearInterval(interval); + // } + // if (app.mk.nowPlayingItem.attributes.artwork != null && app.mk.nowPlayingItem.attributes.artwork.url != null && app.mk.nowPlayingItem.attributes.artwork.url!= '' ) { + // document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', `url("${decodeURI((this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"])).replace('{w}', size).replace('{h}', size)}")`); + // try { + // clearInterval(interval); + // } catch (err) { + // } + // } else { + // this.setLibraryArt() + // } + // } else if (this.mk.nowPlayingItem["id"] == this.currentTrackID) { + // try { + // clearInterval(interval); + // } catch (err) { + // } + // } + // } catch (e) { + // if (this.mk.nowPlayingItem && this.mk.nowPlayingItem["id"] && document.querySelector('.app-playback-controls .artwork')) { + // this.setLibraryArt() + // try { + // clearInterval(interval); + // } catch (err) { + // } + // } + + // } + // }, 200) + + + // }, + async getCurrentArtURL(){ + try{ + this.currentArtUrl = ''; + if (app.mk.nowPlayingItem != null && app.mk.nowPlayingItem.attributes != null && app.mk.nowPlayingItem.attributes.artwork != null && app.mk.nowPlayingItem.attributes.artwork.url != null && app.mk.nowPlayingItem.attributes.artwork.url!= '' ) + { + this.currentArtUrl = (this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"] ?? '').replace('{w}', 50).replace('{h}', 50); + try{ + document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', `url("${this.currentArtUrl}")`);} + catch (e) {} + } else { + let data = await this.mk.api.library.song(this.mk.nowPlayingItem.id); + if (data != null && data !== "" && data.attributes != null && data.attributes.artwork != null) { + this.currentArtUrl = (data["attributes"]["artwork"]["url"] ?? '').replace('{w}', 50).replace('{h}', 50); + try{ + document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', `url("${this.currentArtUrl}")`);} + catch (e) {} + } else {this.currentArtUrl = ''; + try{ + document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', `url("${this.currentArtUrl}")`);} + catch (e) {} } - }, 200) - + } + }catch(e){ + } }, async setLibraryArt() { if (typeof this.mk.nowPlayingItem === "undefined") return; @@ -2320,7 +2644,12 @@ const app = new Vue({ const data = await this.mk.api.library.song(this.mk.nowPlayingItem.id) if (data != null && data !== "") { - document.querySelector('.bg-artwork').src = (data["attributes"]["artwork"]["url"]).toString(); + getBase64FromUrl((data["attributes"]["artwork"]["url"]).toString()).then(img =>{ + document.querySelector('.bg-artwork').forEach(artwork => { + artwork.src = img; + }) + self.$store.commit("setLCDArtwork", img) + }) } } catch (e) { } @@ -2328,8 +2657,8 @@ const app = new Vue({ }, quickPlay(query) { let self = this - MusicKit.getInstance().api.search(query, { limit: 2, types: 'songs' }).then(function (data) { - MusicKit.getInstance().setQueue({ song: data["songs"]['data'][0]["id"] }).then(function (queue) { + MusicKit.getInstance().api.search(query, {limit: 2, types: 'songs'}).then(function (data) { + MusicKit.getInstance().setQueue({song: data["songs"]['data'][0]["id"]}).then(function (queue) { MusicKit.getInstance().play() setTimeout(() => { self.$forceUpdate() @@ -2337,6 +2666,102 @@ const app = new Vue({ }) }) }, + async getRating(item) { + let type = item.type.slice(-1) === "s" ? item.type : item.type + "s" + let id = item.attributes.playParams.catalogId ? item.attributes.playParams.catalogId : item.id + if (item.id.startsWith("i.")) { + if(!type.startsWith("library-")) { + type = "library-" + type + } + id = item.id + } + let response = await this.mk.api.v3.music(`/v1/me/ratings/${type}?platform=web&ids=${id}`) + if(response.data.data.length != 0) { + let value = response.data.data[0].attributes.value + return value + }else{ + return 0 + } + }, + love(item) { + let type = item.type.slice(-1) === "s" ? item.type : item.type + "s" + let id = item.attributes.playParams.catalogId ? item.attributes.playParams.catalogId : item.id + if (item.id.startsWith("i.")) { + if(!type.startsWith("library-")) { + type = "library-" + type + } + id = item.id + } + this.mk.api.v3.music(`/v1/me/ratings/${type}/${id}`, {}, { + fetchOptions: + { + method: "PUT", + body: JSON.stringify( + { + "type": "rating", + "attributes": { + "value": 1 + } + } + ) + } + }) + }, + dislike(item) { + let type = item.type.slice(-1) === "s" ? item.type : item.type + "s" + let id = item.attributes.playParams.catalogId ? item.attributes.playParams.catalogId : item.id + if (item.id.startsWith("i.")) { + if(!type.startsWith("library-")) { + type = "library-" + type + } + id = item.id + } + this.mk.api.v3.music(`/v1/me/ratings/${type}/${id}`, {}, { + fetchOptions: + { + method: "PUT", + body: JSON.stringify( + { + "type": "rating", + "attributes": { + "value": -1 + } + } + ) + } + }) + }, + unlove(item) { + let type = item.type.slice(-1) === "s" ? item.type : item.type + "s" + let id = item.attributes.playParams.catalogId ? item.attributes.playParams.catalogId : item.id + if (item.id.startsWith("i.")) { + if(!type.startsWith("library-")) { + type = "library-" + type + } + id = item.id + } + this.mk.api.v3.music(`/v1/me/ratings/${type}/${id}`, {}, { + fetchOptions: + { + method: "DELETE", + } + }) + }, + volumeWheel(event) { + if (event.deltaY < 0) { + if(this.mk.volume < 1){ + if (this.mk.volume <= 0.9) { + this.mk.volume += 0.1 + } else { this.mk.volume = 1 } + } + } else if (event.deltaY > 0) { + if(this.mk.volume > 0){ + if (this.mk.volume >= 0.1){ + this.mk.volume -= 0.1 + } else {this.mk.volume = 0} + } + } + }, async apiCall(url, callback) { const xmlHttp = new XMLHttpRequest(); @@ -2374,10 +2799,12 @@ const app = new Vue({ document.querySelectorAll(".animated-artwork-video").forEach(el => { el.play() }) + this.animateBackground = true } else { document.querySelectorAll(".animated-artwork-video").forEach(el => { el.pause() }) + this.animateBackground = false } }, async nowPlayingContextMenu(event) { @@ -2388,11 +2815,11 @@ const app = new Vue({ let data_type = this.mk.nowPlayingItem.playParams.kind let item_id = this.mk.nowPlayingItem.attributes.playParams.id ?? this.mk.nowPlayingItem.id let isLibrary = this.mk.nowPlayingItem.attributes.playParams.isLibrary ?? false - let params = { "fields[songs]": "inLibrary", "fields[albums]": "inLibrary", "relate": "library", "t": "1" } - // let res = await app.mkapi(data_type, isLibrary , item_id, params); + let params = {"fields[songs]": "inLibrary", "fields[albums]": "inLibrary", "relate": "library", "t": "1"} + // let res = await app.mkapi(data_type, isLibrary , item_id, params); // if (res && res.relationships && res.relationships.library && res.relationships.library.data && res.relationships.library.data.length > 0) { // item_id = res.relationships.library.data[0].id - // } + // } app.selectedMediaItems = [] app.select_selectMediaItem(item_id, data_type, 0, '12344', isLibrary) let useMenu = "normal" @@ -2403,22 +2830,63 @@ const app = new Vue({ normal: { items: [ { + "icon": "./assets/feather/list.svg", "name": "Add to Playlist...", "action": function () { app.promptAddToPlaylist() } }, { + "icon": "./assets/feather/plus.svg", + "id": "addToLibrary", "name": "Add to Library...", + "disabled": false, "action": function () { app.addToLibrary(item_id); // if (!isLibrary) {app.addToLibrary(item_id); this.mk.nowPlayingItem.attributes.playParams["isLibrary"] = true} else { app.removeFromLibrary(data_type,item_id); this.mk.nowPlayingItem.attributes.playParams["isLibrary"] = false}; } }, { + "icon": "./assets/feather/heart.svg", + "id": "love", + "name": "Love", + "disabled": true, + "action": function () { + app.love(app.mk.nowPlayingItem) + } + }, + { + "icon": "./assets/feather/x-circle.svg", + "id": "unlove", + "name": "Unlove", + "disabled": true, + "action": function () { + app.unlove(app.mk.nowPlayingItem) + } + }, + { + "icon": "./assets/feather/thumbs-down.svg", + "id": "dislike", + "name": "Dislike", + "disabled": true, + "action": function () { + app.dislike(app.mk.nowPlayingItem) + } + }, + { + "icon": "./assets/feather/x-circle.svg", + "id": "undo_dislike", + "name": "Undo dislike", + "disabled": true, + "action": function () { + app.unlove(app.mk.nowPlayingItem) + } + }, + { + "icon": "./assets/feather/radio.svg", "name": "Start Radio", "action": function () { - app.mk.setStationQueue({ song: item_id }).then(() => { + app.mk.setStationQueue({song: item_id}).then(() => { app.mk.play() app.selectedMediaItems = [] }) @@ -2433,48 +2901,107 @@ const app = new Vue({ menus.normal.items = menus.normal.items.concat(this.contextExt.normal) } } + + // isLibrary = await app.inLibrary([this.mk.nowPlayingItem]) + // console.warn(isLibrary) + // if(isLibrary.length != 0) { + // if (isLibrary[0].attributes.inLibrary) { + // menus.normal.items.find(x => x.id == "addToLibrary").disabled = true + // } + // }else{ + // menus.normal.items.find(x => x.id == "addToLibrary").disabled = true + // } + + let rating = await app.getRating(app.mk.nowPlayingItem) + if(rating == 0) { + menus.normal.items.find(x => x.id == 'love').disabled = false + menus.normal.items.find(x => x.id == 'dislike').disabled = false + }else if(rating == 1) { + menus.normal.items.find(x => x.id == 'unlove').disabled = false + }else if(rating == -1) { + menus.normal.items.find(x => x.id == 'undo_dislike').disabled = false + } CiderContextMenu.Create(event, menus[useMenu]) }, - LastFMDeauthorize() { - ipcRenderer.invoke('setStoreValue', 'lastfm.enabled', false).catch((e) => console.error(e)); - ipcRenderer.invoke('setStoreValue', 'lastfm.auth_token', '').catch((e) => console.error(e)); - app.cfg.lastfm.auth_token = ""; - app.cfg.lastfm.enabled = false; - const element = document.getElementById('lfmConnect'); - element.innerHTML = 'Connect'; - element.onclick = app.LastFMAuthenticate; - }, - LastFMAuthenticate() { - console.log("wag") - const element = document.getElementById('lfmConnect'); - window.open('https://www.last.fm/api/auth?api_key=174905d201451602407b428a86e8344d&cb=ame://auth/lastfm'); - element.innerText = 'Connecting...'; + LastFMDeauthorize() { + ipcRenderer.invoke('setStoreValue', 'lastfm.enabled', false).catch((e) => console.error(e)); + ipcRenderer.invoke('setStoreValue', 'lastfm.auth_token', '').catch((e) => console.error(e)); + app.cfg.lastfm.auth_token = ""; + app.cfg.lastfm.enabled = false; + const element = document.getElementById('lfmConnect'); + element.innerHTML = 'Connect'; + element.onclick = app.LastFMAuthenticate; + }, + LastFMAuthenticate() { + console.log("wag") + const element = document.getElementById('lfmConnect'); + window.open('https://www.last.fm/api/auth?api_key=174905d201451602407b428a86e8344d&cb=ame://auth/lastfm'); + element.innerText = 'Connecting...'; - /* Just a timeout for the button */ - setTimeout(() => { - if (element.innerText === 'Connecting...') { - element.innerText = 'Connect'; - console.warn('[LastFM] Attempted connection timed out.'); - } - }, 20000); + /* Just a timeout for the button */ + setTimeout(() => { + if (element.innerText === 'Connecting...') { + element.innerText = 'Connect'; + console.warn('[LastFM] Attempted connection timed out.'); + } + }, 20000); + + ipcRenderer.on('LastfmAuthenticated', function (_event, lfmAuthKey) { + app.cfg.lastfm.auth_token = lfmAuthKey; + app.cfg.lastfm.enabled = true; + element.innerHTML = `Disconnect\n

(Authed: ${lfmAuthKey})

`; + element.onclick = app.LastFMDeauthorize; + }); + }, + parseSCTagToRG: function (tag) { + let soundcheck = tag.split(" ") + let numbers = [] + for (item of soundcheck) { + numbers.push(parseInt(item, 16)) - ipcRenderer.on('LastfmAuthenticated', function (_event, lfmAuthKey) { - app.cfg.lastfm.auth_token = lfmAuthKey; - app.cfg.lastfm.enabled = true; - element.innerHTML = `Disconnect\n

(Authed: ${lfmAuthKey})

`; - element.onclick = app.LastFMDeauthorize; - }); } - + numbers.shift() + let gain = Math.log10((Math.max(numbers[0], numbers[1]) ?? 1000) / 1000.0) * -10 + let peak = Math.max(numbers[6], numbers[7]) / 32768.0 + return { + gain: gain, + peak: peak + } + } + } }) Vue.component('sidebar-library-item', { template: '#sidebar-library-item', - props: ['name', 'page', 'cd-click'], + props: { + name: { + type: String, + required: true + }, + page: { + type: String, + required: true + }, + svgIcon: { + type: String, + required: false, + default: '' + }, + cdClick: { + type: Function, + required: false + } + }, data: function () { return { - app: app + app: app, + svgIconData: "" + } + }, + async mounted() { + if (this.svgIcon) { + this.svgIconData = await this.app.getSvgIcon(this.svgIcon) } }, methods: {} @@ -2538,6 +3065,7 @@ document.addEventListener('musickitloaded', function () { app.init() }, 1000) } + request.addEventListener("load", loadAlternateKey); request.open("GET", "https://raw.githubusercontent.com/lujjjh/LitoMusic/main/token.json"); request.send(); @@ -2556,12 +3084,12 @@ document.addEventListener('musickitloaded', function () { request.send(); }); -// if ('serviceWorker' in navigator) { -// // Use the window load event to keep the page load performant -// window.addEventListener('load', () => { -// navigator.serviceWorker.register('sw.js?v=1'); -// }); -// } +if ('serviceWorker' in navigator) { + // Use the window load event to keep the page load performant + window.addEventListener('load', () => { + navigator.serviceWorker.register('sw.js?v=1'); + }); + } const getBase64FromUrl = async (url) => { const data = await fetch(url); diff --git a/src/renderer/logo-simple.svg b/src/renderer/logo-simple.svg new file mode 100644 index 00000000..9f78bf50 --- /dev/null +++ b/src/renderer/logo-simple.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/renderer/logotmp.afdesign b/src/renderer/logotmp.afdesign new file mode 100644 index 0000000000000000000000000000000000000000..4d426338f0aac880dd0a40034b91660e23ec4b23 GIT binary patch literal 640698 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 }|rD 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

Af@x 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 literal 0 HcmV?d00001 diff --git a/src/renderer/logotmp.svg b/src/renderer/logotmp.svg new file mode 100644 index 00000000..61317b00 --- /dev/null +++ b/src/renderer/logotmp.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/renderer/style.less b/src/renderer/style.less index 1955353d..cb6651ae 100644 --- a/src/renderer/style.less +++ b/src/renderer/style.less @@ -1,6 +1,10 @@ @import url("ameframework.css"); @import url("assets/fonts/Inter/inter.css"); @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@100;300;400;500;700;900&display=swap'); +@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@100;300;400;500;700;900&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+HK:wght@100;300;400;500;700;900&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;300;400;500;700;900&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&display=swap"); :root { --appleEase: cubic-bezier(0.42, 0, 0.58, 1); @@ -50,6 +54,17 @@ body[platform='linux'] { background: #222; } +body.notransparency::before { + content: ""; + position: absolute; + top:0; + left:0; + right:0; + bottom:0; + opacity: 0.5; + background-image: url(data:image/png;base64,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); +} + *, *:before, *:after { @@ -88,6 +103,9 @@ body[platform='linux'] { #app { --color1: rgba(30, 30, 30, 30%); --color2: rgba(15, 15, 15, 30%); + --bgColor: transparent; + --bgWidth: 0px; + --bgHeight: 0px; --chromeHeight: 55px; width: 100%; height: 100%; @@ -97,12 +115,66 @@ body[platform='linux'] { margin: 0 auto; position: relative; overflow: hidden; + background-size: 400% 400%; + + //&::before { + // position: absolute; + // top: -50%; + // left: -50%; + // width: var(--bgWidth); + // height: var(--bgHeight); + // background-image: var(--bgColor); + // content: ""; + // z-index: -1; + // transform: rotateZ(0deg); + // transform-origin: center; + // animation: bgRotate 10s linear infinite; + // filter: brightness(100%) saturate(200%) contrast(1.5); + //} +} + +.bgGradientMaterial-base { + position:relative; +} + +.bgGradientMaterial-base::before { + position: absolute; + top: -50%; + left: -50%; + width: 200%; + height: 250%; + background-image: var(--bgColor); + content: ""; + z-index: -1; + transform: rotateZ(0deg); + transform-origin: center; + animation: bgRotate 10s linear infinite; + filter: brightness(100%) saturate(200%) contrast(1.5); +} + +@keyframes bgRotate { + 0% { + transform: rotateZ(0deg); + } + 100% { + transform: rotateZ(360deg); + } } [hidden] { display: none !important; } +input[type="text"], input[type="number"] { + background: #1c1c1c; + border-radius: 3px; + border: 1px solid rgb(200 200 200 / 25%); + color: #eee; + padding: 6px; + font-size: 1em; + font-family: inherit; +} + .bg-artwork--placeholder { position: absolute; @@ -120,21 +192,54 @@ body[platform='linux'] { .bg-artwork { position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; + width: 200%; background: var(--artwork); - z-index: -1; - object-fit: cover; - object-position: center; - /* filter: blur(60px) saturate(180%); - opacity: 0.70; */ - filter: blur(180px) saturate(280%); - opacity: 0.60; - transition: opacity .25s var(--appleEase); + filter: brightness(200%) blur(180px) saturate(280%) contrast(2); + opacity: 1; + transition: opacity 0.25s var(--appleEase); pointer-events: none; transform: translateZ(0px); + animation: rotateBg 35s linear infinite; + backface-visibility: hidden; +} + +@keyframes rotateBg { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} + + +.bg-artwork-container { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + pointer-events: none; + transform: translateZ(0px); + z-index: -1; + + .bg-artwork.a { + top:0; + left:0; + //mix-blend-mode: luminosity; + } + .bg-artwork.b { + bottom:0; + right:0; + animation-direction: reverse; + animation-delay: 10s; + } + + &.noanimation { + .bg-artwork { + animation: none; + } + } } @@ -249,6 +354,18 @@ input[type=range].web-slider::-webkit-slider-runnable-track { height: 94%; backdrop-filter: blur(40px) saturate(180%); box-shadow: var(--ciderShadow-Generic); + overflow: hidden; + + .bgArtworkMaterial { + display: none; + position: absolute; + width: 100%; + height: 100%; + + .bg-artwork-container .bg-artwork { + filter: brightness(80%) blur(180px) saturate(180%) contrast(1); + } + } } .search-input-container { @@ -340,7 +457,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track { } } -.app-sidebar-button>.sidebar-user-icon { +.app-sidebar-button > .sidebar-user-icon { width: 32px; height: 32px; border-radius: 100%; @@ -351,18 +468,18 @@ input[type=range].web-slider::-webkit-slider-runnable-track { background-size: contain; } -.app-sidebar-button>.sidebar-user-text { +.app-sidebar-button > .sidebar-user-text { width: 100%; display: flex; font-size: 14px; flex-direction: column; } -.app-sidebar-button>.sidebar-user-text .fullname { +.app-sidebar-button > .sidebar-user-text .fullname { text-align: left; } -.app-sidebar-button>.sidebar-user-text .handle-text { +.app-sidebar-button > .sidebar-user-text .handle-text { font-size: 12px; opacity: 0.7; text-align: left; @@ -461,22 +578,26 @@ input[type=range].web-slider::-webkit-slider-runnable-track { .context-menu-item { background: transparent; - display: block; + display: flex; width: 100%; text-align: left; color: #eee; font-family: inherit; - font-size: 15px; - padding: 8px 12px; + font-size: 14px; + padding: 6px 12px; border: 0px; appearance: none; border-radius: 6px; margin: 2px 0px; &:hover { - background: var(--keyColor); + background: var(--selected); cursor: pointer; } + + &:active { + background: var(--selected-click); + } } .context-menu-body { @@ -525,6 +646,23 @@ input[type=range].web-slider::-webkit-slider-runnable-track { } } +.hidden-opacity { + opacity: 0; + height: 0px; + width: 0px; + margin: 0px; +} + +.spinner { + background-image: url("assets/spinner.gif"); + background-position: center; + background-repeat: no-repeat; + background-size: contain; + width: 32px; + height: 32px; + display: inline-block; +} + .app-sidebar-content::-webkit-scrollbar { display: none; } @@ -544,9 +682,15 @@ input[type=range].web-slider::-webkit-slider-runnable-track { border: 1px solid transparent; border-radius: 6px; background: transparent; - color: white; + color: #eee; transition: transform .1s; text-align: left; + + &.app-sidebar-item-playlist { + -webkit-user-drag: element; + overflow: hidden; + text-overflow: ellipsis; + } } .app-sidebar-item:hover { @@ -643,32 +787,32 @@ input[type=range].web-slider::-webkit-slider-runnable-track { } .app-chrome-item.volume-icon { - filter: contrast(0); + opacity: 0.7; background-image: url(http://localhost:9000/assets/volume-up.svg); height: 15px; width: 30px; background-repeat: no-repeat; } -.app-chrome .app-chrome-item.volume>input[type=range]::-webkit-slider-thumb { +.app-chrome .app-chrome-item.volume > input[type=range]::-webkit-slider-thumb { transition: all var(--appleTransition); } -.app-chrome .app-chrome-item.volume>input[type=range]::-webkit-slider-thumb:hover { +.app-chrome .app-chrome-item.volume > input[type=range]::-webkit-slider-thumb:hover { background-image: radial-gradient(var(--keyColor) 2px, transparent 3px, transparent 10px); transform: scale(1.2); } -.app-chrome .app-chrome-item.volume>input[type=range]::-webkit-slider-thumb:active { +.app-chrome .app-chrome-item.volume > input[type=range]::-webkit-slider-thumb:active { background-image: radial-gradient(var(--keyColor) 3px, transparent 4px, transparent 10px); transform: scale(1); } -.app-chrome .app-chrome-item.volume>input[type=range] { +.app-chrome .app-chrome-item.volume > input[type=range] { width: 100%; } -.app-chrome .app-chrome-item.volume>input[type=range] { +.app-chrome .app-chrome-item.volume > input[type=range] { -webkit-appearance: none; height: 4px; background: rgba(255, 255, 255, 0.4); @@ -677,7 +821,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track { background-repeat: no-repeat; } -.app-chrome .app-chrome-item.volume>input[type=range]::-webkit-slider-thumb { +.app-chrome .app-chrome-item.volume > input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; height: 14px; width: 14px; @@ -687,7 +831,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track { box-shadow: inset 0px 0px 0px 1px rgba(255, 255, 255, 0.4); } -.app-chrome .app-chrome-item.volume>input[type=range]::-webkit-slider-runnable-track { +.app-chrome .app-chrome-item.volume > input[type=range]::-webkit-slider-runnable-track { -webkit-appearance: none; box-shadow: none; border: none; @@ -703,10 +847,10 @@ input[type=range].web-slider::-webkit-slider-runnable-track { height: 100%; } -.app-chrome .app-chrome-item>.app-title { +.app-chrome .app-chrome-item > .app-title { width: 100px; font-size: 13px; - background: url("./logotmp.png"); + background: url("./logotmp.svg"); background-size: 90px; background-repeat: no-repeat; background-position: center; @@ -717,23 +861,23 @@ input[type=range].web-slider::-webkit-slider-runnable-track { -webkit-app-region: drag; } -.app-chrome .app-chrome-item>.window-controls { +.app-chrome .app-chrome-item > .window-controls { width: 138px; font-size: 13px; height: 100%; display: flex; } -.app-chrome .app-chrome-item>.window-controls>div { +.app-chrome .app-chrome-item > .window-controls > div { height: 100%; width: 32px; } -.app-chrome .app-chrome-item>.window-controls>div:hover { +.app-chrome .app-chrome-item > .window-controls > div:hover { background: rgb(200 200 200 / 10%); } -.app-chrome .app-chrome-item>.window-controls>div.close { +.app-chrome .app-chrome-item > .window-controls > div.close { width: 100%; height: 100%; background-image: var(--gfx-closeBtn); @@ -746,7 +890,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track { } } -.app-chrome .app-chrome-item>.window-controls>div.minmax { +.app-chrome .app-chrome-item > .window-controls > div.minmax { background-image: var(--gfx-maxBtn); background-position: center; background-repeat: no-repeat; @@ -755,11 +899,11 @@ input[type=range].web-slider::-webkit-slider-runnable-track { height: 100%; } -.app-chrome .app-chrome-item>.window-controls>div.minmax.restore { +.app-chrome .app-chrome-item > .window-controls > div.minmax.restore { background-image: var(--gfx-restoreBtn); } -.app-chrome .app-chrome-item>.window-controls>div.minimize { +.app-chrome .app-chrome-item > .window-controls > div.minimize { background-image: var(--gfx-minBtn); background-position: center; background-repeat: no-repeat; @@ -777,23 +921,34 @@ input[type=range].web-slider::-webkit-slider-runnable-track { border-right: 1px solid rgb(200 200 200 / 8%); } -.app-chrome .app-chrome-item>.app-playback-controls { +.app-chrome .app-chrome-item > .app-playback-controls { display: flex; justify-content: center; align-content: center; width: 100%; } -.app-chrome .app-chrome-item>.app-playback-controls .song-name { +.app-chrome .app-chrome-item > .app-playback-controls .song-name { font-weight: 600; text-align: center; font-size: 13px; height: 1.3em; line-height: 1.3em; overflow: hidden; + max-width: 360px; + + .song-name-normal { + height: inherit; + } + + &.song-artist-marquee { + > marquee { + //margin-bottom: -3px; + } + } } -.app-chrome .app-chrome-item>.app-playback-controls .song-duration p { +.app-chrome .app-chrome-item > .app-playback-controls .song-duration p { font-weight: 400; font-size: 10px; height: 1.2em; @@ -802,7 +957,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track { margin: 0 0 0.5em; } -.app-chrome .app-chrome-item>.app-playback-controls .song-artist { +.app-chrome .app-chrome-item > .app-playback-controls .song-artist { font-weight: 400; font-size: 12px; text-align: center; @@ -810,10 +965,21 @@ input[type=range].web-slider::-webkit-slider-runnable-track { line-height: 1.2em;*/ overflow: hidden; z-index: 1; + max-width: 360px; /* animation: marquee 10s linear infinite; */ + + .song-artist-normal { + height: inherit; + } + + &.song-artist-marquee { + > marquee { + margin-bottom: -3px; + } + } } -.app-chrome .app-chrome-item>.app-playback-controls .song-progress { +.app-chrome .app-chrome-item > .app-playback-controls .song-progress { @bgColor: transparent; //height: 16px; position: absolute; @@ -822,7 +988,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track { background: @bgColor; &:hover { - >input[type=range] { + > input[type=range] { &::-webkit-slider-thumb { opacity: 1; transform: scale(1); @@ -831,7 +997,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track { } } - >input[type=range] { + > input[type=range] { appearance: none; width: 100%; height: 4px; @@ -871,7 +1037,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track { } } -.app-chrome .app-chrome-item>.app-playback-controls .artwork { +.app-chrome .app-chrome-item > .app-playback-controls .artwork { width: 42px; height: 42px; background-image: var(--artwork); @@ -885,7 +1051,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track { image-rendering: -webkit-optimize-contrast; } -.app-chrome .app-chrome-item>.app-playback-controls .actions { +.app-chrome .app-chrome-item > .app-playback-controls .actions { width: 42px; height: 42px; border-radius: 2px; @@ -897,7 +1063,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track { filter: contrast(0.8); } -.app-chrome .app-chrome-item>.app-playback-controls .playback-info { +.app-chrome .app-chrome-item > .app-playback-controls .playback-info { width: 100%; display: flex; justify-content: center; @@ -906,7 +1072,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track { position: relative; } -.app-chrome .app-chrome-item>.app-playback-controls .playback-info>div { +.app-chrome .app-chrome-item > .app-playback-controls .playback-info > div { width: 100%; } @@ -1392,7 +1558,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { overflow-x: hidden; display: flex; flex-flow: column; - font-family: 'Inter', 'Noto Sans JP', sans-serif; + font-family: 'Inter', 'Noto Sans JP','Source Han Sans SC', 'Source Han Sans HK','Noto Sans SC','Noto Sans TC', 'Noto Sans HK', 'Noto Sans KR', sans-serif; } .lyric-body .no-lyrics { @@ -1402,7 +1568,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { font-weight: bold; font-size: 26px; } - + .lyric-line { --bgSpeed: 1s; appearance: none; @@ -1476,7 +1642,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { } -.lyric-line.active .lyricWaiting>div { +.lyric-line.active .lyricWaiting > div { width: 10px; height: 10px; background: white; @@ -1486,7 +1652,42 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { .lyrics-translation { font-size: 1.6rem; - font-weight: 400; + font-weight: 450; + font-family: 'Inter', 'Noto Sans JP','Noto Sans SC','Noto Sans TC', 'Noto Sans HK', 'Noto Sans KR', sans-serif; + filter: contrast(0.5); +} + +.lyric-footer { + bottom: 0; + height: 50px; + width: 100%; + position: absolute; + z-index: 1000; + opacity: 1; + background: rgba(30, 30, 30, 0.8); + justify-content: center; + align-items: center; + display: none; + transition: opacity 0.1s var(--appleEase); +} + +.lyric-body:hover + .lyric-footer, .lyric-footer:hover { + display: flex; +} + +.modular-fs .app-drawer .lyric-footer { + background: unset; + display: flex; + opacity: 0.3; +} + +.modular-fs .app-drawer .lyric-footer:hover { + opacity: 1; +} + +.modular-fs .app-drawer .lyric-body .no-lyrics { + height: 100%; + display: flex; } @keyframes lyricWaitingLine { @@ -1540,27 +1741,146 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { } .home-page { - background: linear-gradient(0deg, black, #4c2c31); top: 0; padding-top: var(--navbarHeight); + .artist-feed-card { + position: absolute; + bottom: 0; + left: 10%; + z-index: 1; + background: black; + width: 80%; + height: 96%; + overflow: scroll; + border-radius: 10px; + } + + .col.madeforyou-col { + width: 420px; + min-width: 0px; + max-width: 420px; + } + + .well.artistfeed-well { + margin-top: 0px; + height: 392px; + align-content: flex-start; + } + + .hint-text { + font-size: 0.9rem; + color: rgb(200 200 200 / 70%); + } + .user-icon { border-radius: 100%; width: 128px; height: 128px; overflow: hidden; box-shadow: var(--mediaItemShadow-Shadow); + margin: 16px; } .well.profile-well { flex-direction: column; justify-content: center; align-items: center; + + .name { + margin: 4px; + font-weight: 500; + } + + .handle { + margin: 4px; + opacity: 0.7; + font-weight: 500; + } } } /* Cider */ +.md-close-btn { + -webkit-mask-image: url("ameres://icons/webui/close.svg"); + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + background-color: white; + opacity: 0.75; + -webkit-mask-size: contain; + height: 18px; + width: 18px; +} + +.md-btn { + background: rgba(100, 100, 100, 0.5); + padding: 4px 12px; + border-radius: 4px; + font-size: 13px; + border: 1px solid rgb(100 100 100 / 35%); + color: #eee; + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 1px 1px rgba(0, 0, 0, 0.4); + transition: transform 0.2s var(--appleEase), box-shadow 0.2s var(--appleEase); + + &.md-btn-block { + display: block; + } + + &.md-btn-primary { + background: var(--keyColor); + color: white; + } + + &:hover { + filter: brightness(125%); + } + + &:active { + filter: brightness(75%); + transform: translateY(2px); + } +} + +.md-select { + padding: 5px 10px; + font-size: 1em; + font-family: inherit; + border-radius: 4px; + border: 1px solid rgb(100 100 100 / 35%); + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 1px 1px rgba(0, 0, 0, 0.4); + background: #363636; + color: #eee; +} + +.md-select:focus { + outline: none; +} + +.md-select > option { + font-size: 1em; + font-family: inherit; + padding: 8px 16px; +} + +.sidebar-playlist { + .folder-button-active { + background: rgb(255 255 255 / 12%); + } + .folder-body { + background: #ffffff0a; + border-radius: 10px; + padding: 1px 6px; + + .spinner { + display: block; + width: 100%; + height: 32px; + background-size: 16px; + } + } +} + .modal-fullscreen { display: flex; justify-content: center; @@ -1610,7 +1930,113 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { overflow-y: overlay; } - .modal-footer {} + .modal-footer { + } + } +} + +.spatialproperties-panel { + .modal-window { + height: 700px; + max-height: 700px; + width: 800px; + max-width: 800px; + overflow: hidden; + + .info-header { + padding-left: 12px; + } + + .visual-container { + display: flex; + justify-content: center; + align-items: center; + overflow: hidden; + } + + .visual { + position: relative; + height: 250px; + width: 300px; + display: inline-flex; + align-items: flex-end; + justify-content: center; + filter: drop-shadow(2px 12px 6px rgb(0 0 0 / 25%)); + margin: 0 auto; + + .face { + position: absolute; + width: calc(12px * 6); + height: calc(12px * 6); + border-radius: 6px; + transform: rotateX(60deg) rotateZ(-45deg); + transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear; + } + + .listener { + position: absolute; + width: 32px; + height: 32px; + border-radius: 6px; + transform: rotateX(60deg) rotateZ(-45deg); + transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear; + background: white; + color: black; + z-index: 2; + } + + .audiosource { + position: absolute; + width: 32px; + height: 32px; + border-radius: 6px; + transform: rotateX(60deg) rotateZ(-45deg); + transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear; + background: yellow; + z-index: 2; + } + + .face:nth-of-type(1) { + background: linear-gradient(45deg, #28223a, #1f2038); + z-index: 1; + } + + .face:nth-of-type(2) { + background: linear-gradient(45deg, #7d53ad, #5763ff); + transform: rotateX(60deg) rotateZ(-45deg) translateZ(30px); + opacity: 0.7; + z-index: 3; + } + } + + .modal-header { + padding: 16px; + position: relative; + overflow: hidden; + + .modal-title { + text-align: center; + } + + .close-btn { + width: 50px; + height: 100%; + background-image: var(--gfx-closeBtn); + background-position: center; + background-repeat: no-repeat; + -webkit-app-region: no-drag; + appearance: none; + border: 0; + background-color: transparent; + position: absolute; + top: 0; + right: 0; + + &:hover { + background-color: rgb(196, 43, 28) + } + } + } } } @@ -1681,7 +2107,8 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { margin-right: 6px; } - .name {} + .name { + } &:hover { background: var(--selected); @@ -1738,7 +2165,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { transition: transform 0s var(--appleEase); } - >svg { + > svg { width: 8px; pointer-events: none; } @@ -1746,7 +2173,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { &:hover { background: var(--selected); - >svg { + > svg { color: rgba(200, 200, 200, 1.0); } } @@ -1770,7 +2197,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { cursor: pointer; } -.reload-btn>svg { +.reload-btn > svg { height: 50%; color: #eee; } @@ -1796,7 +2223,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { flex-flow: wrap; justify-content: center; - >.cd-mediaitem-square { + > .cd-mediaitem-square { width: 220px; height: 260px; display: inline-flex; @@ -1927,6 +2354,37 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { } } + .friends-info { + display: flex; + flex-flow: column; + + .badge-container { + display: flex; + flex-flow: wrap; + + .socialBadge { + width: 40px; + height: 40px; + border-radius: 100%; + overflow: hidden; + box-shadow: var(--mediaItemShadow-ShadowSubtle); + transition: transform .2s var(--appleEase); + margin: 6px; + + &:hover { + transform: scale(1.2); + } + } + } + + .friends-name { + text-align: center; + font-size: 0.9em; + margin: 8px; + } + } + + .playlist-time { font-size: 0.9em; margin: 6px; @@ -1950,7 +2408,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { appearance: none; box-shadow: var(--ciderShadow-Generic); - >svg { + > svg { height: 50%; color: #eee; pointer-events: none; @@ -2065,7 +2523,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { background: var(--selected-click); } - >svg { + > svg { width: 70%; } } @@ -2205,13 +2663,16 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { &.no-shadow { box-shadow: none; + &::after { display: none; } } + &.subtle-shadow { box-shadow: var(--mediaItemShadow-ShadowSubtle); } + &.shadow { box-shadow: var(--mediaItemShadow-Shadow); } @@ -2311,6 +2772,13 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { overflow-x: overlay; height: 210px; } + + &.hmedia-scroller-card { + height: 370px; + .mediaitem-card { + margin: 12px; + } + } } /* mediaitem-list-item */ @@ -2323,7 +2791,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { font-size: 14px; justify-content: center-between; align-items: center; - border-bottom: 1px solid rgb(200 200 200 / 10%); + border-radius: var(--mediaItemRadius); .artwork { height: 42px; @@ -2429,7 +2897,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { &:hover { background: rgb(200 200 200 / 10%); - + box-shadow: var(--mediaItemShadow); .overlay-play { opacity: 1; } @@ -2437,11 +2905,13 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { &.mediaitem-selected { background: var(--selected); + box-shadow: var(--mediaItemShadow); } &:active { background: var(--selected-click); + box-shadow: var(--mediaItemShadow); color: #eee; } } @@ -2540,7 +3010,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { font-size: 12px; } - >.cd-mediaitem-square-large-overlay { + > .cd-mediaitem-square-large-overlay { z-index: 3; &:hover { @@ -2548,11 +3018,11 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { } } - +.cd-mediaitem-square-large-overlay { + + .cd-mediaitem-square-large-overlay { pointer-events: none; } - &:hover+.cd-mediaitem-square-large-overlay { + &:hover + .cd-mediaitem-square-large-overlay { opacity: 1; } @@ -2563,7 +3033,6 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { } - /* mediaitem-square-large */ .cd-mediaitem-square-large { width: 190px; @@ -2578,7 +3047,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { margin-left: 10px; cursor: pointer; - >* { + > * { z-index: inherit; } } @@ -2608,25 +3077,25 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { } -.cd-mediaitem-square-large-overlay>* { +.cd-mediaitem-square-large-overlay > * { pointer-events: auto; } -.cd-mediaitem-square-large>.cd-mediaitem-square-large-overlay { +.cd-mediaitem-square-large > .cd-mediaitem-square-large-overlay { z-index: 3; } -.cd-mediaitem-square-large>.cd-mediaitem-square-large-overlay:hover { +.cd-mediaitem-square-large > .cd-mediaitem-square-large-overlay:hover { opacity: 1; } -.cd-mediaitem-square-large+.cd-mediaitem-square-large-overlay { +.cd-mediaitem-square-large + .cd-mediaitem-square-large-overlay { pointer-events: none; } -.cd-mediaitem-square-large:hover+.cd-mediaitem-square-large-overlay { +.cd-mediaitem-square-large:hover + .cd-mediaitem-square-large-overlay { opacity: 1; } @@ -2663,7 +3132,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { margin-left: 10px; cursor: pointer; - >* { + > * { z-index: inherit; } } @@ -2693,25 +3162,25 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { } -.cd-mediaitem-mvview-overlay>* { +.cd-mediaitem-mvview-overlay > * { pointer-events: auto; } -.cd-mediaitem-mvview>.cd-mediaitem-mvview-overlay { +.cd-mediaitem-mvview > .cd-mediaitem-mvview-overlay { z-index: 3; } -.cd-mediaitem-mvview>.cd-mediaitem-mvview-overlay:hover { +.cd-mediaitem-mvview > .cd-mediaitem-mvview-overlay:hover { opacity: 1; } -.cd-mediaitem-mvview+.cd-mediaitem-mvview-overlay { +.cd-mediaitem-mvview + .cd-mediaitem-mvview-overlay { pointer-events: none; } -.cd-mediaitem-mvview:hover+.cd-mediaitem-mvview-overlay { +.cd-mediaitem-mvview:hover + .cd-mediaitem-mvview-overlay { opacity: 1; } @@ -2764,8 +3233,25 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { } } - >.play-btn, - >.menu-btn { + .badge-container { + transition: opacity 0.1s var(--appleEase); + opacity: 1; + + .socialBadge { + width: 32px; + height: 32px; + position: absolute; + right: 14px; + bottom: 14px; + border-radius: 100%; + overflow: hidden; + z-index: 2; + pointer-events: none; + } + } + + > .play-btn, + > .menu-btn { opacity: 0; appearance: none; padding: 0px; @@ -2775,18 +3261,22 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { border-radius: 50%; background: rgba(50, 50, 50, 0.7); cursor: pointer; - backdrop-filter: blur(32px) saturate(180%); transition: opacity 0.1s var(--appleEase); + :hover{ + border-radius: 50%; + background: rgba(250, 0, 0, 0.7); + } } - >.play-btn { + > .play-btn { position: absolute; bottom: 14px; left: 14px; z-index: 2; + } - >.menu-btn { + > .menu-btn { position: absolute; bottom: 14px; right: 14px; @@ -2794,18 +3284,32 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { } &:hover { + > .badge-container { + opacity: 0; + } - >.play-btn, - >.menu-btn { + > .play-btn, + > .menu-btn { opacity: 1; } } } + .info-rect { + width: 90%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + } + .title { - width: 90%; + width: 100%; text-align: center; + display: flex; + align-content: center; + justify-content: center; } .subtitle { @@ -2843,10 +3347,91 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { width: 128px; } } + + &.mediaitem-card { + background: #ccc; + background: var(--spcolor); + height: 298px; + width: 230px; + max-width: 250px; + max-height: 500px; + overflow: hidden; + position: relative; + border-radius: calc(var(--mediaItemRadius) * 2); + box-shadow: var(--mediaItemShadow-ShadowSubtle); + + .artwork { + width: 230px; + height: 230px; + overflow: hidden; + border-radius: 0px; + margin: 0; + .mediaitem-artwork { + border-radius: 0px; + + &::after { + box-shadow: unset; + } + } + } + + .info-rect-card { + padding: 10px 10px 14px; + position: relative; + width: 100%; + + &::before { + background: var(--bgartwork); + content: ""; + top:0; + left:0; + bottom:0; + right:0; + position:absolute; + background-size: cover; + background-position: bottom; + z-index: 0; + opacity:1; + filter: brightness(0.5) blur(50px) saturate(180%); + } + } + + .title { + height: 100%; + display: flex; + justify-content: center; + align-items: center; + font-size: 0.9em; + font-weight: 500; + z-index: 1; + } + + .subtitle { + height: 100%; + justify-content: center; + align-items: center; + font-size: 0.75em; + width: 100%; + display: flex; + z-index: 1; + } + + &::after { + box-shadow: var(--mediaItemShadow); + content: ""; + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + pointer-events: none; + border-radius: inherit; + } + } } /* mediaitem-square */ -.albums-square-containeru>*>.cd-mediaitem-square { +.albums-square-containeru > * > .cd-mediaitem-square { --frame: max(220px, 15vw); width: var(--frame); height: calc(var(--frame) * 13 / 11); @@ -2877,8 +3462,8 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { } } - >.play-btn, - >.menu-btn { + > .play-btn, + > .menu-btn { opacity: 0; appearance: none; padding: 0px; @@ -2892,14 +3477,14 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { transition: opacity 0.1s var(--appleEase); } - >.play-btn { + > .play-btn { position: absolute; bottom: calc(var(--frame) / 220 * 14); left: calc(var(--frame) / 220 * 14); z-index: 2; } - >.menu-btn { + > .menu-btn { position: absolute; bottom: calc(var(--frame) / 220 * 14); right: calc(var(--frame) / 220 * 14); @@ -2908,8 +3493,8 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { &:hover { - >.play-btn, - >.menu-btn { + > .play-btn, + > .menu-btn { opacity: 1; } } @@ -2990,20 +3575,271 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { flex-grow: 1; } + .playback-button--small.active { + background-color: rgba(200, 200, 200, 0.7); + } + + .right-col{ + height: 50vh; + } + + .background{ + position: absolute; + background-size: cover; + width: 100%; + height: 100%; + + .bgArtworkMaterial { + position: absolute; + width: 100%; + height: 100%; + + .bg-artwork-container{ + z-index: unset; + } + + .bg-artwork-container .bg-artwork { + filter: brightness(80%) saturate(69%) blur(180px) contrast(0.8) opacity(0.8); + } + + .no-animation{ + animation : unset; + } + } + } + + + + .lyrics-col{ + + width: 60vh; + height: 50vh; + + ::-webkit-scrollbar-thumb { + box-shadow: unset; + } + + &:hover ::-webkit-scrollbar-thumb { + box-shadow: inset 0px 0px 10px 10px rgb(200 200 200 / 50%); + } + + .no-lyrics{ + width: 100%; + height: 100%; + display: flex; + justify-content: center; + } + + .lyric-line{ + font-size: 35px; + } + + } + + .queue-col{ + + width: 60vh; + height: 50vh; + + ::-webkit-scrollbar-thumb { + box-shadow: unset; + } + + &:hover ::-webkit-scrollbar-thumb { + box-shadow: inset 0px 0px 10px 10px rgb(200 200 200 / 50%); + } + } + + .tab-toggles{ + display: flex; + position: absolute; + bottom: 0; + right: 0; + width: 15vh; + height: 5vh; + justify-content: space-evenly; + + .queue { + background-image: url("./assets/list.svg") ; + padding: 0.5vh; + width: 2.5vh; + height: 2.5vh; + background-origin: content-box; + background-repeat: no-repeat; + } + + .lyrics { + background-image: url("./assets/quote-right.svg") ; + padding: 0.5vh; + width: 2.5vh; + height: 2.5vh; + background-origin: content-box; + background-repeat: no-repeat; + } + + .active { + background-color: rgba(200, 200, 200, 0.7); + border-radius: 3px; + } + } + .artwork-col { justify-content: center; align-items: center; display: flex; + flex-direction: column; .artwork { width: 50vh; height: 50vh; } - } + + .controls-parents{ + width: 50vh; + } + + .app-playback-controls { + .song-artist , .song-name { + font-weight: 600; + text-align: center; + font-size: 0.9em; + height: 1.2em; + line-height: 0.9em; + overflow: hidden; + text-overflow: ellipsis; + max-width: 360px; + + .song-name-normal { + height: inherit; + } + + &.song-artist-marquee { + > marquee { + //margin-bottom: -3px; + } + } + } + .song-artist { + font-size: 0.875em; + } + .song-name { + margin-top: 0.15vh; + display: contents; + } + } + + .app-playback-controls .playback-info { + margin-top: 0.5vh; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + position: relative; + + input[type="range"] { + width: 100%; + } + >div { + width: 100%; + text-align: center; + } + + + } + + .app-playback-controls .song-progress { + @bgColor: transparent; + //height: 16px; + position: absolute; + bottom: -1.5vh; + left: 0px; + background: @bgColor; + + .song-duration p { + font-weight: 400; + font-size: 10px; + height: 1.2em; + line-height: 1.3em; + overflow: hidden; + margin: 0 0 0.5em; + } + + &:hover { + > input[type=range] { + &::-webkit-slider-thumb { + opacity: 1; + transform: scale(1); + z-index: 1; + } + } + } + + > input[type=range] { + appearance: none; + width: 100%; + height: 4px; + background-color: rgb(200 200 200 / 10%); + border-radius: 2px; + + &::-webkit-slider-thumb { + opacity: 0; + transform: scale(0.5); + -webkit-appearance: none; + appearance: none; + width: 12px; + height: 12px; + border-radius: 100%; + background: var(--keyColor); + cursor: default; + transition: opacity .10s var(--appleEase), transform .10s var(--appleEase); + } + + &::-moz-range-thumb { + width: 8px; + height: 8px; + border-radius: 100%; + background: var(--keyColor); + cursor: default; + } + } + } + + .control-buttons { + margin-top: 2vh; + display: inline-flex; + width: 100%; + justify-content: center; + } + + } } /* Cider */ +// sidebar icon +.sidebar-icon { + width: 18px; + height: 18px; + margin-right: 8px; + + >svg { + width: 100%; + height: 100%; + color: #aaa; + } +} + +@keyframes rotate { + from { + transform: rotate(0deg); + } + + to { + transform: rotate(360deg); + } +} + // Modular .modular-fs { .app-drawer { @@ -3015,14 +3851,39 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { box-shadow: unset; background: black; + .bgArtworkMaterial { + display: block; + &::before { + top: -50%; + left: -20%; + width: 200VH; + height: 200VH; + } + } + .lyric-body { justify-content: center; align-items: center; + padding: 0px; + margin: 0px; + overflow: hidden; .lyric-line { pointer-events: none; font-weight: 500; - font-size: 1.6em; + font-size: 2em; + transform-origin: center; + animation: fsLyricIn var(--appleEase) .2s; + opacity: 0.9; + text-shadow: + -1px -1px 0 #000, + 0 -1px 0 #000, + 1px -1px 0 #000, + 1px 0 0 #000, + 1px 1px 0 #000, + 0 1px 0 #000, + -1px 1px 0 #000, + -1px 0 0 #000; &:not(.active) { display: none; @@ -3039,6 +3900,17 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { } } +@keyframes fsLyricIn { + 0% { + opacity: 0; + transform: scale(0.98) + } + 100% { + opacity: 1; + transform: scale(1); + } +} + // Modular /* Transitions */ @@ -3110,24 +3982,25 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { /* Transitions End */ -@media (prefers-color-scheme: light) { - :root { - /* */ - --gfx-closeBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6MjY6MjgtMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI2OjI4LTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6MjY6MjgtMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PtPY89oAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAEpJREFUGJWNkMENwDAIA1Gh3F7sP0Ty7xD5JgpU+OuTLVvMmQohhRTCnCEK8TpfBl9eBpcBu/HXcsAZ9FQjSrWqW2Pa95gzGofPBQZRG2fS0899AAAAAElFTkSuQmCC'); - --gfx-maxBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6MjU6NTItMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI1OjUyLTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6MjU6NTItMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PntJ23wAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAEhJREFUGJVjYGBgmMzAwPCXgYHhPw78l4GBYTIjlKHHwMDwlAE7EGFgYLjJANUlgEMRDPxnIqAADoaKwn8MkCDABaShaogLcACWZRl4ajKVtAAAAABJRU5ErkJggg=='); - --gfx-restoreBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6MjY6NTMtMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI2OjUzLTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6MjY6NTMtMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PluKsJ0AAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAGlJREFUGJWt0LEOgkAQhOFPShspSWyvMPFxKaDh0XgOq8tZuCqBIzRMMsXmn51slr9GlJVfmHC9LII3LGfoomCGHrnSloM9olnGE+3KKVgbi0oMNX1ZaXYCG50aLBj4HJwqgXuwn47eA95vgSGy6zr7OwAAAABJRU5ErkJggg=='); - --gfx-minBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxMAAAsTAQCanBgAAAaxaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPg0KICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPg0KICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjAtMDItMTdUMTM6MDA6MzJaIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIwLTAyLTE3VDEzOjAwOjMyWiIgeG1wOk1vZGlmeURhdGU9IjIwMjAtMDItMTdUMTM6MDA6MzJaIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjg1ZDBlZGIwLWZkMDAtYjY0Zi05ZWZiLWEyYjQ1ODcwNWE4YSIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmEzMDAxZTFhLTI5MTktZTQ0OS1iOTRjLWMyMTIyNDhhOWY4YSIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjc4N2Y3OTljLTRiMTEtZTU0YS1iMjBkLTY4NjE3ZWQ5YzVlMiIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciPg0KICAgICAgPHhtcE1NOkhpc3Rvcnk+DQogICAgICAgIDxyZGY6U2VxPg0KICAgICAgICAgIDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjc4N2Y3OTljLTRiMTEtZTU0YS1iMjBkLTY4NjE3ZWQ5YzVlMiIgc3RFdnQ6d2hlbj0iMjAyMC0wMi0xN1QxMzowMDozMloiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgLz4NCiAgICAgICAgICA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ODVkMGVkYjAtZmQwMC1iNjRmLTllZmItYTJiNDU4NzA1YThhIiBzdEV2dDp3aGVuPSIyMDIwLTAyLTE3VDEzOjAwOjMyWiIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIiAvPg0KICAgICAgICA8L3JkZjpTZXE+DQogICAgICA8L3htcE1NOkhpc3Rvcnk+DQogICAgICA8cGhvdG9zaG9wOlRleHRMYXllcnM+DQogICAgICAgIDxyZGY6QmFnPg0KICAgICAgICAgIDxyZGY6bGkgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qShIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKEiIC8+DQogICAgICAgIDwvcmRmOkJhZz4NCiAgICAgIDwvcGhvdG9zaG9wOlRleHRMYXllcnM+DQogICAgPC9yZGY6RGVzY3JpcHRpb24+DQogIDwvcmRmOlJERj4NCjwveDp4bXBtZXRhPg0KPD94cGFja2V0IGVuZD0iciI/PmeGdrgAAAAVSURBVChTYxhOgBGI/0OYQx0wMAAAyp4BAZ26NiYAAAAASUVORK5CYII='); - } +// @media (prefers-color-scheme: light) { +// :root { +// /* */ +// --gfx-closeBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6MjY6MjgtMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI2OjI4LTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6MjY6MjgtMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PtPY89oAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAEpJREFUGJWNkMENwDAIA1Gh3F7sP0Ty7xD5JgpU+OuTLVvMmQohhRTCnCEK8TpfBl9eBpcBu/HXcsAZ9FQjSrWqW2Pa95gzGofPBQZRG2fS0899AAAAAElFTkSuQmCC'); +// --gfx-maxBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6MjU6NTItMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI1OjUyLTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6MjU6NTItMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PntJ23wAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAEhJREFUGJVjYGBgmMzAwPCXgYHhPw78l4GBYTIjlKHHwMDwlAE7EGFgYLjJANUlgEMRDPxnIqAADoaKwn8MkCDABaShaogLcACWZRl4ajKVtAAAAABJRU5ErkJggg=='); +// --gfx-restoreBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6MjY6NTMtMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI2OjUzLTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6MjY6NTMtMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PluKsJ0AAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAGlJREFUGJWt0LEOgkAQhOFPShspSWyvMPFxKaDh0XgOq8tZuCqBIzRMMsXmn51slr9GlJVfmHC9LII3LGfoomCGHrnSloM9olnGE+3KKVgbi0oMNX1ZaXYCG50aLBj4HJwqgXuwn47eA95vgSGy6zr7OwAAAABJRU5ErkJggg=='); +// --gfx-minBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxMAAAsTAQCanBgAAAaxaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPg0KICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPg0KICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjAtMDItMTdUMTM6MDA6MzJaIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIwLTAyLTE3VDEzOjAwOjMyWiIgeG1wOk1vZGlmeURhdGU9IjIwMjAtMDItMTdUMTM6MDA6MzJaIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjg1ZDBlZGIwLWZkMDAtYjY0Zi05ZWZiLWEyYjQ1ODcwNWE4YSIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmEzMDAxZTFhLTI5MTktZTQ0OS1iOTRjLWMyMTIyNDhhOWY4YSIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjc4N2Y3OTljLTRiMTEtZTU0YS1iMjBkLTY4NjE3ZWQ5YzVlMiIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciPg0KICAgICAgPHhtcE1NOkhpc3Rvcnk+DQogICAgICAgIDxyZGY6U2VxPg0KICAgICAgICAgIDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjc4N2Y3OTljLTRiMTEtZTU0YS1iMjBkLTY4NjE3ZWQ5YzVlMiIgc3RFdnQ6d2hlbj0iMjAyMC0wMi0xN1QxMzowMDozMloiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgLz4NCiAgICAgICAgICA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ODVkMGVkYjAtZmQwMC1iNjRmLTllZmItYTJiNDU4NzA1YThhIiBzdEV2dDp3aGVuPSIyMDIwLTAyLTE3VDEzOjAwOjMyWiIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIiAvPg0KICAgICAgICA8L3JkZjpTZXE+DQogICAgICA8L3htcE1NOkhpc3Rvcnk+DQogICAgICA8cGhvdG9zaG9wOlRleHRMYXllcnM+DQogICAgICAgIDxyZGY6QmFnPg0KICAgICAgICAgIDxyZGY6bGkgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qShIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKEiIC8+DQogICAgICAgIDwvcmRmOkJhZz4NCiAgICAgIDwvcGhvdG9zaG9wOlRleHRMYXllcnM+DQogICAgPC9yZGY6RGVzY3JpcHRpb24+DQogIDwvcmRmOlJERj4NCjwveDp4bXBtZXRhPg0KPD94cGFja2V0IGVuZD0iciI/PmeGdrgAAAAVSURBVChTYxhOgBGI/0OYQx0wMAAAyp4BAZ26NiYAAAAASUVORK5CYII='); +// } +// } + +@media (prefers-color-scheme: dark) { } -@media (prefers-color-scheme: dark) { - :root { - --gfx-closeBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6Mjc6MzYtMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI3OjM2LTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6Mjc6MzYtMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PmN2D9EAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAEtJREFUGJWNkMENwDAIA1FGY/8hkn8HOAqPfBsFKvz1yZYtbqwAlUIB6saUAH2NJ4MvL4PLgK/x13LAGTSqEaVa1a0x7XvcmI3D1wbntaRbB2haYwAAAABJRU5ErkJggg=='); - --gfx-maxBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6Mjc6NTgtMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI3OjU4LTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6Mjc6NTgtMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PlwQMBUAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAFBJREFUGJXV0LERgCAUBNHVsQADM3uwWWbojQIs47MEGhgAuS/eSw41qeFYqGlRA7iAm74DKLyrfRABoLrOgq+/hJXngi71BOoGZKBMHqhAbtMvQzel9pREAAAAAElFTkSuQmCC'); - --gfx-restoreBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6Mjc6MjQtMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI3OjI0LTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6Mjc6MjQtMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PqiFCFwAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAHNJREFUGJWtkKEOwlAMRc+QM5AwQYJFoPjZCWb2YRPIaeRTLwfTLQs0UxzX3tumtxCog78UdVTbZmM8AmsdXIABeKH2ak221dDuamnUCjyA+WtbB0zAGXgT0ycSFk31kBky/moUeBLpbsl91wi6Nnbfs/g+7XOQq6ifjfkAAAAASUVORK5CYII='); - --gfx-minBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGOmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEzOjAwOjMyWiIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMC0wMi0xN1QxMzowMDozMloiIHhtcDpNb2RpZnlEYXRlPSIyMDIwLTAyLTE3VDEzOjAwOjMyWiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo4NWQwZWRiMC1mZDAwLWI2NGYtOWVmYi1hMmI0NTg3MDVhOGEiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDphMzAwMWUxYS0yOTE5LWU0NDktYjk0Yy1jMjEyMjQ4YTlmOGEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3ODdmNzk5Yy00YjExLWU1NGEtYjIwZC02ODYxN2VkOWM1ZTIiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo3ODdmNzk5Yy00YjExLWU1NGEtYjIwZC02ODYxN2VkOWM1ZTIiIHN0RXZ0OndoZW49IjIwMjAtMDItMTdUMTM6MDA6MzJaIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjg1ZDBlZGIwLWZkMDAtYjY0Zi05ZWZiLWEyYjQ1ODcwNWE4YSIgc3RFdnQ6d2hlbj0iMjAyMC0wMi0xN1QxMzowMDozMloiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPHBob3Rvc2hvcDpUZXh0TGF5ZXJzPiA8cmRmOkJhZz4gPHJkZjpsaSBwaG90b3Nob3A6TGF5ZXJOYW1lPSLupKEiIHBob3Rvc2hvcDpMYXllclRleHQ9Iu6koSIvPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOlRleHRMYXllcnM+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+FwvRXAAAABdJREFUGNNj/P//PwMxgHGIKPw/XDwDAOr1HuzlELLnAAAAAElFTkSuQmCC'); - } +:root { + --gfx-closeBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6Mjc6MzYtMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI3OjM2LTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6Mjc6MzYtMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PmN2D9EAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAEtJREFUGJWNkMENwDAIA1FGY/8hkn8HOAqPfBsFKvz1yZYtbqwAlUIB6saUAH2NJ4MvL4PLgK/x13LAGTSqEaVa1a0x7XvcmI3D1wbntaRbB2haYwAAAABJRU5ErkJggg=='); + --gfx-maxBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6Mjc6NTgtMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI3OjU4LTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6Mjc6NTgtMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PlwQMBUAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAFBJREFUGJXV0LERgCAUBNHVsQADM3uwWWbojQIs47MEGhgAuS/eSw41qeFYqGlRA7iAm74DKLyrfRABoLrOgq+/hJXngi71BOoGZKBMHqhAbtMvQzel9pREAAAAAElFTkSuQmCC'); + --gfx-restoreBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6Mjc6MjQtMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI3OjI0LTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6Mjc6MjQtMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PqiFCFwAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAHNJREFUGJWtkKEOwlAMRc+QM5AwQYJFoPjZCWb2YRPIaeRTLwfTLQs0UxzX3tumtxCog78UdVTbZmM8AmsdXIABeKH2ak221dDuamnUCjyA+WtbB0zAGXgT0ycSFk31kBky/moUeBLpbsl91wi6Nnbfs/g+7XOQq6ifjfkAAAAASUVORK5CYII='); + --gfx-minBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGOmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEzOjAwOjMyWiIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMC0wMi0xN1QxMzowMDozMloiIHhtcDpNb2RpZnlEYXRlPSIyMDIwLTAyLTE3VDEzOjAwOjMyWiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo4NWQwZWRiMC1mZDAwLWI2NGYtOWVmYi1hMmI0NTg3MDVhOGEiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDphMzAwMWUxYS0yOTE5LWU0NDktYjk0Yy1jMjEyMjQ4YTlmOGEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3ODdmNzk5Yy00YjExLWU1NGEtYjIwZC02ODYxN2VkOWM1ZTIiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo3ODdmNzk5Yy00YjExLWU1NGEtYjIwZC02ODYxN2VkOWM1ZTIiIHN0RXZ0OndoZW49IjIwMjAtMDItMTdUMTM6MDA6MzJaIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjg1ZDBlZGIwLWZkMDAtYjY0Zi05ZWZiLWEyYjQ1ODcwNWE4YSIgc3RFdnQ6d2hlbj0iMjAyMC0wMi0xN1QxMzowMDozMloiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPHBob3Rvc2hvcDpUZXh0TGF5ZXJzPiA8cmRmOkJhZz4gPHJkZjpsaSBwaG90b3Nob3A6TGF5ZXJOYW1lPSLupKEiIHBob3Rvc2hvcDpMYXllclRleHQ9Iu6koSIvPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOlRleHRMYXllcnM+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+FwvRXAAAABdJREFUGNNj/P//PwMxgHGIKPw/XDwDAOr1HuzlELLnAAAAAElFTkSuQmCC'); } @@ -3182,7 +4055,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { cursor: pointer; } -#apple-music-video-player-controls #player-pip>svg { +#apple-music-video-player-controls #player-pip > svg { width: 50%; } @@ -3201,7 +4074,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { cursor: pointer; } -#apple-music-video-player-controls #player-fullscreen>svg { +#apple-music-video-player-controls #player-fullscreen > svg { width: 50%; } @@ -3225,6 +4098,7 @@ div#captions { background: rgba(0, 0, 0, 0.6); color: yellow; white-space: pre-line; + font-family: 'Inter', 'Noto Sans JP','Source Han Sans SC', 'Source Han Sans HK','Source Han Sans SC', 'Source Han Sans HK','Noto Sans SC','Noto Sans TC', 'Noto Sans HK', 'Noto Sans KR', sans-serif; } [v-cloak] { @@ -3331,6 +4205,13 @@ input[type=checkbox][switch]:checked:active::before { } body.no-gpu { + --ciderShadow-Generic: var(--mediaItemShadow); + --mediaItemShadow-Shadow: var(--mediaItemShadow); + --mediaItemShadow-ShadowSubtle: var(--mediaItemShadow); + + .bg-artwork-container { + display: none; + } #navigation-bar { backdrop-filter: unset; mix-blend-mode: unset; @@ -3359,4 +4240,14 @@ body.no-gpu { .wpfade-leave-to { opacity: 0; } + + .drawertransition-enter-active, + .drawertransition-leave-active { + transition: right 0s var(--appleEase); + } + + .drawertransition-enter, + .drawertransition-leave-to { + right: -300px; + } } \ No newline at end of file diff --git a/src/renderer/vibrant.min.js b/src/renderer/vibrant.min.js new file mode 100644 index 00000000..5144adb6 --- /dev/null +++ b/src/renderer/vibrant.min.js @@ -0,0 +1,12492 @@ +/******/ (function(modules) { // webpackBootstrap + /******/ // The module cache + /******/ var installedModules = {}; + /******/ + /******/ // The require function + /******/ function __webpack_require__(moduleId) { + /******/ + /******/ // Check if module is in cache + /******/ if(installedModules[moduleId]) + /******/ return installedModules[moduleId].exports; + /******/ + /******/ // Create a new module (and put it into the cache) + /******/ var module = installedModules[moduleId] = { + /******/ i: moduleId, + /******/ l: false, + /******/ exports: {} + /******/ }; + /******/ + /******/ // Execute the module function + /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + /******/ + /******/ // Flag the module as loaded + /******/ module.l = true; + /******/ + /******/ // Return the exports of the module + /******/ return module.exports; + /******/ } + /******/ + /******/ + /******/ // expose the modules object (__webpack_modules__) + /******/ __webpack_require__.m = modules; + /******/ + /******/ // expose the module cache + /******/ __webpack_require__.c = installedModules; + /******/ + /******/ // identity function for calling harmony imports with the correct context + /******/ __webpack_require__.i = function(value) { return value; }; + /******/ + /******/ // define getter function for harmony exports + /******/ __webpack_require__.d = function(exports, name, getter) { + /******/ if(!__webpack_require__.o(exports, name)) { + /******/ Object.defineProperty(exports, name, { + /******/ configurable: false, + /******/ enumerable: true, + /******/ get: getter + /******/ }); + /******/ } + /******/ }; + /******/ + /******/ // getDefaultExport function for compatibility with non-harmony modules + /******/ __webpack_require__.n = function(module) { + /******/ var getter = module && module.__esModule ? + /******/ function getDefault() { return module['default']; } : + /******/ function getModuleExports() { return module; }; + /******/ __webpack_require__.d(getter, 'a', getter); + /******/ return getter; + /******/ }; + /******/ + /******/ // Object.prototype.hasOwnProperty.call + /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; + /******/ + /******/ // __webpack_public_path__ + /******/ __webpack_require__.p = ""; + /******/ + /******/ // Load entry module and return exports + /******/ return __webpack_require__(__webpack_require__.s = 151); + /******/ }) + /************************************************************************/ + /******/ ([ + /* 0 */ + /***/ (function(module, exports, __webpack_require__) { + + var freeGlobal = __webpack_require__(33); + + /** Detect free variable `self`. */ + var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + + /** Used as a reference to the global object. */ + var root = freeGlobal || freeSelf || Function('return this')(); + + module.exports = root; + + + /***/ }), + /* 1 */ + /***/ (function(module, exports, __webpack_require__) { + + var baseIsNative = __webpack_require__(66), + getValue = __webpack_require__(90); + + /** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ + function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; + } + + module.exports = getNative; + + + /***/ }), + /* 2 */ + /***/ (function(module, exports) { + + /** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ + function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); + } + + module.exports = isObject; + + + /***/ }), + /* 3 */ + /***/ (function(module, exports, __webpack_require__) { + + var assignValue = __webpack_require__(28), + baseAssignValue = __webpack_require__(29); + + /** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property identifiers to copy. + * @param {Object} [object={}] The object to copy properties to. + * @param {Function} [customizer] The function to customize copied values. + * @returns {Object} Returns `object`. + */ + function copyObject(source, props, object, customizer) { + var isNew = !object; + object || (object = {}); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + + var newValue = customizer + ? customizer(object[key], source[key], key, object, source) + : undefined; + + if (newValue === undefined) { + newValue = source[key]; + } + if (isNew) { + baseAssignValue(object, key, newValue); + } else { + assignValue(object, key, newValue); + } + } + return object; + } + + module.exports = copyObject; + + + /***/ }), + /* 4 */ + /***/ (function(module, exports, __webpack_require__) { + + var listCacheClear = __webpack_require__(102), + listCacheDelete = __webpack_require__(103), + listCacheGet = __webpack_require__(104), + listCacheHas = __webpack_require__(105), + listCacheSet = __webpack_require__(106); + + /** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function ListCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + +// Add methods to `ListCache`. + ListCache.prototype.clear = listCacheClear; + ListCache.prototype['delete'] = listCacheDelete; + ListCache.prototype.get = listCacheGet; + ListCache.prototype.has = listCacheHas; + ListCache.prototype.set = listCacheSet; + + module.exports = ListCache; + + + /***/ }), + /* 5 */ + /***/ (function(module, exports, __webpack_require__) { + + var eq = __webpack_require__(9); + + /** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; + } + + module.exports = assocIndexOf; + + + /***/ }), + /* 6 */ + /***/ (function(module, exports, __webpack_require__) { + + var Symbol = __webpack_require__(15), + getRawTag = __webpack_require__(88), + objectToString = __webpack_require__(116); + + /** `Object#toString` result references. */ + var nullTag = '[object Null]', + undefinedTag = '[object Undefined]'; + + /** Built-in value references. */ + var symToStringTag = Symbol ? Symbol.toStringTag : undefined; + + /** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag && symToStringTag in Object(value)) + ? getRawTag(value) + : objectToString(value); + } + + module.exports = baseGetTag; + + + /***/ }), + /* 7 */ + /***/ (function(module, exports, __webpack_require__) { + + var isKeyable = __webpack_require__(100); + + /** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ + function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; + } + + module.exports = getMapData; + + + /***/ }), + /* 8 */ + /***/ (function(module, exports, __webpack_require__) { + + var getNative = __webpack_require__(1); + + /* Built-in method references that are verified to be native. */ + var nativeCreate = getNative(Object, 'create'); + + module.exports = nativeCreate; + + + /***/ }), + /* 9 */ + /***/ (function(module, exports) { + + /** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ + function eq(value, other) { + return value === other || (value !== value && other !== other); + } + + module.exports = eq; + + + /***/ }), + /* 10 */ + /***/ (function(module, exports, __webpack_require__) { + + "use strict"; + + Object.defineProperty(exports, "__esModule", { value: true }); + var Bluebird = __webpack_require__(13); + exports.DELTAE94_DIFF_STATUS = { + NA: 0, + PERFECT: 1, + CLOSE: 2, + GOOD: 10, + SIMILAR: 50 + }; + exports.SIGBITS = 5; + exports.RSHIFT = 8 - exports.SIGBITS; + function defer() { + var resolve; + var reject; + var promise = new Bluebird(function (_resolve, _reject) { + resolve = _resolve; + reject = _reject; + }); + return { resolve: resolve, reject: reject, promise: promise }; + } + exports.defer = defer; + function hexToRgb(hex) { + var m = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return m === null ? null : [m[1], m[2], m[3]].map(function (s) { return parseInt(s, 16); }); + } + exports.hexToRgb = hexToRgb; + function rgbToHex(r, g, b) { + return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1, 7); + } + exports.rgbToHex = rgbToHex; + function rgbToHsl(r, g, b) { + r /= 255; + g /= 255; + b /= 255; + var max = Math.max(r, g, b); + var min = Math.min(r, g, b); + var h; + var s; + var l = (max + min) / 2; + if (max === min) { + h = s = 0; + } + else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch (max) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break; + } + h /= 6; + } + return [h, s, l]; + } + exports.rgbToHsl = rgbToHsl; + function hslToRgb(h, s, l) { + var r; + var g; + var b; + function hue2rgb(p, q, t) { + if (t < 0) + t += 1; + if (t > 1) + t -= 1; + if (t < 1 / 6) + return p + (q - p) * 6 * t; + if (t < 1 / 2) + return q; + if (t < 2 / 3) + return p + (q - p) * (2 / 3 - t) * 6; + return p; + } + if (s === 0) { + r = g = b = l; + } + else { + var q = l < 0.5 ? l * (1 + s) : l + s - (l * s); + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1 / 3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - (1 / 3)); + } + return [ + r * 255, + g * 255, + b * 255 + ]; + } + exports.hslToRgb = hslToRgb; + function rgbToXyz(r, g, b) { + r /= 255; + g /= 255; + b /= 255; + r = r > 0.04045 ? Math.pow((r + 0.005) / 1.055, 2.4) : r / 12.92; + g = g > 0.04045 ? Math.pow((g + 0.005) / 1.055, 2.4) : g / 12.92; + b = b > 0.04045 ? Math.pow((b + 0.005) / 1.055, 2.4) : b / 12.92; + r *= 100; + g *= 100; + b *= 100; + var x = r * 0.4124 + g * 0.3576 + b * 0.1805; + var y = r * 0.2126 + g * 0.7152 + b * 0.0722; + var z = r * 0.0193 + g * 0.1192 + b * 0.9505; + return [x, y, z]; + } + exports.rgbToXyz = rgbToXyz; + function xyzToCIELab(x, y, z) { + var REF_X = 95.047; + var REF_Y = 100; + var REF_Z = 108.883; + x /= REF_X; + y /= REF_Y; + z /= REF_Z; + x = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116; + y = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116; + z = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116; + var L = 116 * y - 16; + var a = 500 * (x - y); + var b = 200 * (y - z); + return [L, a, b]; + } + exports.xyzToCIELab = xyzToCIELab; + function rgbToCIELab(r, g, b) { + var _a = rgbToXyz(r, g, b), x = _a[0], y = _a[1], z = _a[2]; + return xyzToCIELab(x, y, z); + } + exports.rgbToCIELab = rgbToCIELab; + function deltaE94(lab1, lab2) { + var WEIGHT_L = 1; + var WEIGHT_C = 1; + var WEIGHT_H = 1; + var L1 = lab1[0], a1 = lab1[1], b1 = lab1[2]; + var L2 = lab2[0], a2 = lab2[1], b2 = lab2[2]; + var dL = L1 - L2; + var da = a1 - a2; + var db = b1 - b2; + var xC1 = Math.sqrt(a1 * a1 + b1 * b1); + var xC2 = Math.sqrt(a2 * a2 + b2 * b2); + var xDL = L2 - L1; + var xDC = xC2 - xC1; + var xDE = Math.sqrt(dL * dL + da * da + db * db); + var xDH = (Math.sqrt(xDE) > Math.sqrt(Math.abs(xDL)) + Math.sqrt(Math.abs(xDC))) + ? Math.sqrt(xDE * xDE - xDL * xDL - xDC * xDC) + : 0; + var xSC = 1 + 0.045 * xC1; + var xSH = 1 + 0.015 * xC1; + xDL /= WEIGHT_L; + xDC /= WEIGHT_C * xSC; + xDH /= WEIGHT_H * xSH; + return Math.sqrt(xDL * xDL + xDC * xDC + xDH * xDH); + } + exports.deltaE94 = deltaE94; + function rgbDiff(rgb1, rgb2) { + var lab1 = rgbToCIELab.apply(undefined, rgb1); + var lab2 = rgbToCIELab.apply(undefined, rgb2); + return deltaE94(lab1, lab2); + } + exports.rgbDiff = rgbDiff; + function hexDiff(hex1, hex2) { + var rgb1 = hexToRgb(hex1); + var rgb2 = hexToRgb(hex2); + return rgbDiff(rgb1, rgb2); + } + exports.hexDiff = hexDiff; + function getColorDiffStatus(d) { + if (d < exports.DELTAE94_DIFF_STATUS.NA) + return 'N/A'; + // Not perceptible by human eyes + if (d <= exports.DELTAE94_DIFF_STATUS.PERFECT) + return 'Perfect'; + // Perceptible through close observation + if (d <= exports.DELTAE94_DIFF_STATUS.CLOSE) + return 'Close'; + // Perceptible at a glance + if (d <= exports.DELTAE94_DIFF_STATUS.GOOD) + return 'Good'; + // Colors are more similar than opposite + if (d < exports.DELTAE94_DIFF_STATUS.SIMILAR) + return 'Similar'; + return 'Wrong'; + } + exports.getColorDiffStatus = getColorDiffStatus; + function getColorIndex(r, g, b) { + return (r << (2 * exports.SIGBITS)) + (g << exports.SIGBITS) + b; + } + exports.getColorIndex = getColorIndex; + + + /***/ }), + /* 11 */ + /***/ (function(module, exports) { + + var g; + +// This works in non-strict mode + g = (function() { + return this; + })(); + + try { + // This works if eval is allowed (see CSP) + g = g || Function("return this")() || (1,eval)("this"); + } catch(e) { + // This works if the window reference is available + if(typeof window === "object") + g = window; + } + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + + module.exports = g; + + + /***/ }), + /* 12 */ + /***/ (function(module, exports) { + + module.exports = function(module) { + if(!module.webpackPolyfill) { + module.deprecate = function() {}; + module.paths = []; + // module.parent = undefined by default + if(!module.children) module.children = []; + Object.defineProperty(module, "loaded", { + enumerable: true, + get: function() { + return module.l; + } + }); + Object.defineProperty(module, "id", { + enumerable: true, + get: function() { + return module.i; + } + }); + module.webpackPolyfill = 1; + } + return module; + }; + + + /***/ }), + /* 13 */ + /***/ (function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process, global, setImmediate) {/* @preserve + * The MIT License (MIT) + * + * Copyright (c) 2013-2015 Petka Antonov + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + /** + * bluebird build version 3.4.7 + * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each + */ + !function(e){if(true)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Promise=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_=="function"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_=="function"&&_dereq_;for(var o=0;o 0) { + var fn = queue.shift(); + if (typeof fn !== "function") { + fn._settlePromises(); + continue; + } + var receiver = queue.shift(); + var arg = queue.shift(); + fn.call(receiver, arg); + } + }; + + Async.prototype._drainQueues = function () { + this._drainQueue(this._normalQueue); + this._reset(); + this._haveDrainedQueues = true; + this._drainQueue(this._lateQueue); + }; + + Async.prototype._queueTick = function () { + if (!this._isTickUsed) { + this._isTickUsed = true; + this._schedule(this.drainQueues); + } + }; + + Async.prototype._reset = function () { + this._isTickUsed = false; + }; + + module.exports = Async; + module.exports.firstLineError = firstLineError; + + },{"./queue":26,"./schedule":29,"./util":36}],3:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) { + var calledBind = false; + var rejectThis = function(_, e) { + this._reject(e); + }; + + var targetRejected = function(e, context) { + context.promiseRejectionQueued = true; + context.bindingPromise._then(rejectThis, rejectThis, null, this, e); + }; + + var bindingResolved = function(thisArg, context) { + if (((this._bitField & 50397184) === 0)) { + this._resolveCallback(context.target); + } + }; + + var bindingRejected = function(e, context) { + if (!context.promiseRejectionQueued) this._reject(e); + }; + + Promise.prototype.bind = function (thisArg) { + if (!calledBind) { + calledBind = true; + Promise.prototype._propagateFrom = debug.propagateFromFunction(); + Promise.prototype._boundValue = debug.boundValueFunction(); + } + var maybePromise = tryConvertToPromise(thisArg); + var ret = new Promise(INTERNAL); + ret._propagateFrom(this, 1); + var target = this._target(); + ret._setBoundTo(maybePromise); + if (maybePromise instanceof Promise) { + var context = { + promiseRejectionQueued: false, + promise: ret, + target: target, + bindingPromise: maybePromise + }; + target._then(INTERNAL, targetRejected, undefined, ret, context); + maybePromise._then( + bindingResolved, bindingRejected, undefined, ret, context); + ret._setOnCancel(maybePromise); + } else { + ret._resolveCallback(target); + } + return ret; + }; + + Promise.prototype._setBoundTo = function (obj) { + if (obj !== undefined) { + this._bitField = this._bitField | 2097152; + this._boundTo = obj; + } else { + this._bitField = this._bitField & (~2097152); + } + }; + + Promise.prototype._isBound = function () { + return (this._bitField & 2097152) === 2097152; + }; + + Promise.bind = function (thisArg, value) { + return Promise.resolve(value).bind(thisArg); + }; + }; + + },{}],4:[function(_dereq_,module,exports){ + "use strict"; + var old; + if (typeof Promise !== "undefined") old = Promise; + function noConflict() { + try { if (Promise === bluebird) Promise = old; } + catch (e) {} + return bluebird; + } + var bluebird = _dereq_("./promise")(); + bluebird.noConflict = noConflict; + module.exports = bluebird; + + },{"./promise":22}],5:[function(_dereq_,module,exports){ + "use strict"; + var cr = Object.create; + if (cr) { + var callerCache = cr(null); + var getterCache = cr(null); + callerCache[" size"] = getterCache[" size"] = 0; + } + + module.exports = function(Promise) { + var util = _dereq_("./util"); + var canEvaluate = util.canEvaluate; + var isIdentifier = util.isIdentifier; + + var getMethodCaller; + var getGetter; + if (false) { + var makeMethodCaller = function (methodName) { + return new Function("ensureMethod", " \n\ + return function(obj) { \n\ + 'use strict' \n\ + var len = this.length; \n\ + ensureMethod(obj, 'methodName'); \n\ + switch(len) { \n\ + case 1: return obj.methodName(this[0]); \n\ + case 2: return obj.methodName(this[0], this[1]); \n\ + case 3: return obj.methodName(this[0], this[1], this[2]); \n\ + case 0: return obj.methodName(); \n\ + default: \n\ + return obj.methodName.apply(obj, this); \n\ + } \n\ + }; \n\ + ".replace(/methodName/g, methodName))(ensureMethod); + }; + + var makeGetter = function (propertyName) { + return new Function("obj", " \n\ + 'use strict'; \n\ + return obj.propertyName; \n\ + ".replace("propertyName", propertyName)); + }; + + var getCompiled = function(name, compiler, cache) { + var ret = cache[name]; + if (typeof ret !== "function") { + if (!isIdentifier(name)) { + return null; + } + ret = compiler(name); + cache[name] = ret; + cache[" size"]++; + if (cache[" size"] > 512) { + var keys = Object.keys(cache); + for (var i = 0; i < 256; ++i) delete cache[keys[i]]; + cache[" size"] = keys.length - 256; + } + } + return ret; + }; + + getMethodCaller = function(name) { + return getCompiled(name, makeMethodCaller, callerCache); + }; + + getGetter = function(name) { + return getCompiled(name, makeGetter, getterCache); + }; + } + + function ensureMethod(obj, methodName) { + var fn; + if (obj != null) fn = obj[methodName]; + if (typeof fn !== "function") { + var message = "Object " + util.classString(obj) + " has no method '" + + util.toString(methodName) + "'"; + throw new Promise.TypeError(message); + } + return fn; + } + + function caller(obj) { + var methodName = this.pop(); + var fn = ensureMethod(obj, methodName); + return fn.apply(obj, this); + } + Promise.prototype.call = function (methodName) { + var args = [].slice.call(arguments, 1);; + if (false) { + if (canEvaluate) { + var maybeCaller = getMethodCaller(methodName); + if (maybeCaller !== null) { + return this._then( + maybeCaller, undefined, undefined, args, undefined); + } + } + } + args.push(methodName); + return this._then(caller, undefined, undefined, args, undefined); + }; + + function namedGetter(obj) { + return obj[this]; + } + function indexedGetter(obj) { + var index = +this; + if (index < 0) index = Math.max(0, index + obj.length); + return obj[index]; + } + Promise.prototype.get = function (propertyName) { + var isIndex = (typeof propertyName === "number"); + var getter; + if (!isIndex) { + if (canEvaluate) { + var maybeGetter = getGetter(propertyName); + getter = maybeGetter !== null ? maybeGetter : namedGetter; + } else { + getter = namedGetter; + } + } else { + getter = indexedGetter; + } + return this._then(getter, undefined, undefined, propertyName, undefined); + }; + }; + + },{"./util":36}],6:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function(Promise, PromiseArray, apiRejection, debug) { + var util = _dereq_("./util"); + var tryCatch = util.tryCatch; + var errorObj = util.errorObj; + var async = Promise._async; + + Promise.prototype["break"] = Promise.prototype.cancel = function() { + if (!debug.cancellation()) return this._warn("cancellation is disabled"); + + var promise = this; + var child = promise; + while (promise._isCancellable()) { + if (!promise._cancelBy(child)) { + if (child._isFollowing()) { + child._followee().cancel(); + } else { + child._cancelBranched(); + } + break; + } + + var parent = promise._cancellationParent; + if (parent == null || !parent._isCancellable()) { + if (promise._isFollowing()) { + promise._followee().cancel(); + } else { + promise._cancelBranched(); + } + break; + } else { + if (promise._isFollowing()) promise._followee().cancel(); + promise._setWillBeCancelled(); + child = promise; + promise = parent; + } + } + }; + + Promise.prototype._branchHasCancelled = function() { + this._branchesRemainingToCancel--; + }; + + Promise.prototype._enoughBranchesHaveCancelled = function() { + return this._branchesRemainingToCancel === undefined || + this._branchesRemainingToCancel <= 0; + }; + + Promise.prototype._cancelBy = function(canceller) { + if (canceller === this) { + this._branchesRemainingToCancel = 0; + this._invokeOnCancel(); + return true; + } else { + this._branchHasCancelled(); + if (this._enoughBranchesHaveCancelled()) { + this._invokeOnCancel(); + return true; + } + } + return false; + }; + + Promise.prototype._cancelBranched = function() { + if (this._enoughBranchesHaveCancelled()) { + this._cancel(); + } + }; + + Promise.prototype._cancel = function() { + if (!this._isCancellable()) return; + this._setCancelled(); + async.invoke(this._cancelPromises, this, undefined); + }; + + Promise.prototype._cancelPromises = function() { + if (this._length() > 0) this._settlePromises(); + }; + + Promise.prototype._unsetOnCancel = function() { + this._onCancelField = undefined; + }; + + Promise.prototype._isCancellable = function() { + return this.isPending() && !this._isCancelled(); + }; + + Promise.prototype.isCancellable = function() { + return this.isPending() && !this.isCancelled(); + }; + + Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) { + if (util.isArray(onCancelCallback)) { + for (var i = 0; i < onCancelCallback.length; ++i) { + this._doInvokeOnCancel(onCancelCallback[i], internalOnly); + } + } else if (onCancelCallback !== undefined) { + if (typeof onCancelCallback === "function") { + if (!internalOnly) { + var e = tryCatch(onCancelCallback).call(this._boundValue()); + if (e === errorObj) { + this._attachExtraTrace(e.e); + async.throwLater(e.e); + } + } + } else { + onCancelCallback._resultCancelled(this); + } + } + }; + + Promise.prototype._invokeOnCancel = function() { + var onCancelCallback = this._onCancel(); + this._unsetOnCancel(); + async.invoke(this._doInvokeOnCancel, this, onCancelCallback); + }; + + Promise.prototype._invokeInternalOnCancel = function() { + if (this._isCancellable()) { + this._doInvokeOnCancel(this._onCancel(), true); + this._unsetOnCancel(); + } + }; + + Promise.prototype._resultCancelled = function() { + this.cancel(); + }; + + }; + + },{"./util":36}],7:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function(NEXT_FILTER) { + var util = _dereq_("./util"); + var getKeys = _dereq_("./es5").keys; + var tryCatch = util.tryCatch; + var errorObj = util.errorObj; + + function catchFilter(instances, cb, promise) { + return function(e) { + var boundTo = promise._boundValue(); + predicateLoop: for (var i = 0; i < instances.length; ++i) { + var item = instances[i]; + + if (item === Error || + (item != null && item.prototype instanceof Error)) { + if (e instanceof item) { + return tryCatch(cb).call(boundTo, e); + } + } else if (typeof item === "function") { + var matchesPredicate = tryCatch(item).call(boundTo, e); + if (matchesPredicate === errorObj) { + return matchesPredicate; + } else if (matchesPredicate) { + return tryCatch(cb).call(boundTo, e); + } + } else if (util.isObject(e)) { + var keys = getKeys(item); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + if (item[key] != e[key]) { + continue predicateLoop; + } + } + return tryCatch(cb).call(boundTo, e); + } + } + return NEXT_FILTER; + }; + } + + return catchFilter; + }; + + },{"./es5":13,"./util":36}],8:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function(Promise) { + var longStackTraces = false; + var contextStack = []; + + Promise.prototype._promiseCreated = function() {}; + Promise.prototype._pushContext = function() {}; + Promise.prototype._popContext = function() {return null;}; + Promise._peekContext = Promise.prototype._peekContext = function() {}; + + function Context() { + this._trace = new Context.CapturedTrace(peekContext()); + } + Context.prototype._pushContext = function () { + if (this._trace !== undefined) { + this._trace._promiseCreated = null; + contextStack.push(this._trace); + } + }; + + Context.prototype._popContext = function () { + if (this._trace !== undefined) { + var trace = contextStack.pop(); + var ret = trace._promiseCreated; + trace._promiseCreated = null; + return ret; + } + return null; + }; + + function createContext() { + if (longStackTraces) return new Context(); + } + + function peekContext() { + var lastIndex = contextStack.length - 1; + if (lastIndex >= 0) { + return contextStack[lastIndex]; + } + return undefined; + } + Context.CapturedTrace = null; + Context.create = createContext; + Context.deactivateLongStackTraces = function() {}; + Context.activateLongStackTraces = function() { + var Promise_pushContext = Promise.prototype._pushContext; + var Promise_popContext = Promise.prototype._popContext; + var Promise_PeekContext = Promise._peekContext; + var Promise_peekContext = Promise.prototype._peekContext; + var Promise_promiseCreated = Promise.prototype._promiseCreated; + Context.deactivateLongStackTraces = function() { + Promise.prototype._pushContext = Promise_pushContext; + Promise.prototype._popContext = Promise_popContext; + Promise._peekContext = Promise_PeekContext; + Promise.prototype._peekContext = Promise_peekContext; + Promise.prototype._promiseCreated = Promise_promiseCreated; + longStackTraces = false; + }; + longStackTraces = true; + Promise.prototype._pushContext = Context.prototype._pushContext; + Promise.prototype._popContext = Context.prototype._popContext; + Promise._peekContext = Promise.prototype._peekContext = peekContext; + Promise.prototype._promiseCreated = function() { + var ctx = this._peekContext(); + if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this; + }; + }; + return Context; + }; + + },{}],9:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function(Promise, Context) { + var getDomain = Promise._getDomain; + var async = Promise._async; + var Warning = _dereq_("./errors").Warning; + var util = _dereq_("./util"); + var canAttachTrace = util.canAttachTrace; + var unhandledRejectionHandled; + var possiblyUnhandledRejection; + var bluebirdFramePattern = + /[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/; + var nodeFramePattern = /\((?:timers\.js):\d+:\d+\)/; + var parseLinePattern = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/; + var stackFramePattern = null; + var formatStack = null; + var indentStackFrames = false; + var printWarning; + var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 && + (true || + util.env("BLUEBIRD_DEBUG") || + util.env("NODE_ENV") === "development")); + + var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 && + (debugging || util.env("BLUEBIRD_WARNINGS"))); + + var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 && + (debugging || util.env("BLUEBIRD_LONG_STACK_TRACES"))); + + var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 && + (warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN")); + + Promise.prototype.suppressUnhandledRejections = function() { + var target = this._target(); + target._bitField = ((target._bitField & (~1048576)) | + 524288); + }; + + Promise.prototype._ensurePossibleRejectionHandled = function () { + if ((this._bitField & 524288) !== 0) return; + this._setRejectionIsUnhandled(); + async.invokeLater(this._notifyUnhandledRejection, this, undefined); + }; + + Promise.prototype._notifyUnhandledRejectionIsHandled = function () { + fireRejectionEvent("rejectionHandled", + unhandledRejectionHandled, undefined, this); + }; + + Promise.prototype._setReturnedNonUndefined = function() { + this._bitField = this._bitField | 268435456; + }; + + Promise.prototype._returnedNonUndefined = function() { + return (this._bitField & 268435456) !== 0; + }; + + Promise.prototype._notifyUnhandledRejection = function () { + if (this._isRejectionUnhandled()) { + var reason = this._settledValue(); + this._setUnhandledRejectionIsNotified(); + fireRejectionEvent("unhandledRejection", + possiblyUnhandledRejection, reason, this); + } + }; + + Promise.prototype._setUnhandledRejectionIsNotified = function () { + this._bitField = this._bitField | 262144; + }; + + Promise.prototype._unsetUnhandledRejectionIsNotified = function () { + this._bitField = this._bitField & (~262144); + }; + + Promise.prototype._isUnhandledRejectionNotified = function () { + return (this._bitField & 262144) > 0; + }; + + Promise.prototype._setRejectionIsUnhandled = function () { + this._bitField = this._bitField | 1048576; + }; + + Promise.prototype._unsetRejectionIsUnhandled = function () { + this._bitField = this._bitField & (~1048576); + if (this._isUnhandledRejectionNotified()) { + this._unsetUnhandledRejectionIsNotified(); + this._notifyUnhandledRejectionIsHandled(); + } + }; + + Promise.prototype._isRejectionUnhandled = function () { + return (this._bitField & 1048576) > 0; + }; + + Promise.prototype._warn = function(message, shouldUseOwnTrace, promise) { + return warn(message, shouldUseOwnTrace, promise || this); + }; + + Promise.onPossiblyUnhandledRejection = function (fn) { + var domain = getDomain(); + possiblyUnhandledRejection = + typeof fn === "function" ? (domain === null ? + fn : util.domainBind(domain, fn)) + : undefined; + }; + + Promise.onUnhandledRejectionHandled = function (fn) { + var domain = getDomain(); + unhandledRejectionHandled = + typeof fn === "function" ? (domain === null ? + fn : util.domainBind(domain, fn)) + : undefined; + }; + + var disableLongStackTraces = function() {}; + Promise.longStackTraces = function () { + if (async.haveItemsQueued() && !config.longStackTraces) { + throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + if (!config.longStackTraces && longStackTracesIsSupported()) { + var Promise_captureStackTrace = Promise.prototype._captureStackTrace; + var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace; + config.longStackTraces = true; + disableLongStackTraces = function() { + if (async.haveItemsQueued() && !config.longStackTraces) { + throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + Promise.prototype._captureStackTrace = Promise_captureStackTrace; + Promise.prototype._attachExtraTrace = Promise_attachExtraTrace; + Context.deactivateLongStackTraces(); + async.enableTrampoline(); + config.longStackTraces = false; + }; + Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace; + Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace; + Context.activateLongStackTraces(); + async.disableTrampolineIfNecessary(); + } + }; + + Promise.hasLongStackTraces = function () { + return config.longStackTraces && longStackTracesIsSupported(); + }; + + var fireDomEvent = (function() { + try { + if (typeof CustomEvent === "function") { + var event = new CustomEvent("CustomEvent"); + util.global.dispatchEvent(event); + return function(name, event) { + var domEvent = new CustomEvent(name.toLowerCase(), { + detail: event, + cancelable: true + }); + return !util.global.dispatchEvent(domEvent); + }; + } else if (typeof Event === "function") { + var event = new Event("CustomEvent"); + util.global.dispatchEvent(event); + return function(name, event) { + var domEvent = new Event(name.toLowerCase(), { + cancelable: true + }); + domEvent.detail = event; + return !util.global.dispatchEvent(domEvent); + }; + } else { + var event = document.createEvent("CustomEvent"); + event.initCustomEvent("testingtheevent", false, true, {}); + util.global.dispatchEvent(event); + return function(name, event) { + var domEvent = document.createEvent("CustomEvent"); + domEvent.initCustomEvent(name.toLowerCase(), false, true, + event); + return !util.global.dispatchEvent(domEvent); + }; + } + } catch (e) {} + return function() { + return false; + }; + })(); + + var fireGlobalEvent = (function() { + if (util.isNode) { + return function() { + return process.emit.apply(process, arguments); + }; + } else { + if (!util.global) { + return function() { + return false; + }; + } + return function(name) { + var methodName = "on" + name.toLowerCase(); + var method = util.global[methodName]; + if (!method) return false; + method.apply(util.global, [].slice.call(arguments, 1)); + return true; + }; + } + })(); + + function generatePromiseLifecycleEventObject(name, promise) { + return {promise: promise}; + } + + var eventToObjectGenerator = { + promiseCreated: generatePromiseLifecycleEventObject, + promiseFulfilled: generatePromiseLifecycleEventObject, + promiseRejected: generatePromiseLifecycleEventObject, + promiseResolved: generatePromiseLifecycleEventObject, + promiseCancelled: generatePromiseLifecycleEventObject, + promiseChained: function(name, promise, child) { + return {promise: promise, child: child}; + }, + warning: function(name, warning) { + return {warning: warning}; + }, + unhandledRejection: function (name, reason, promise) { + return {reason: reason, promise: promise}; + }, + rejectionHandled: generatePromiseLifecycleEventObject + }; + + var activeFireEvent = function (name) { + var globalEventFired = false; + try { + globalEventFired = fireGlobalEvent.apply(null, arguments); + } catch (e) { + async.throwLater(e); + globalEventFired = true; + } + + var domEventFired = false; + try { + domEventFired = fireDomEvent(name, + eventToObjectGenerator[name].apply(null, arguments)); + } catch (e) { + async.throwLater(e); + domEventFired = true; + } + + return domEventFired || globalEventFired; + }; + + Promise.config = function(opts) { + opts = Object(opts); + if ("longStackTraces" in opts) { + if (opts.longStackTraces) { + Promise.longStackTraces(); + } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) { + disableLongStackTraces(); + } + } + if ("warnings" in opts) { + var warningsOption = opts.warnings; + config.warnings = !!warningsOption; + wForgottenReturn = config.warnings; + + if (util.isObject(warningsOption)) { + if ("wForgottenReturn" in warningsOption) { + wForgottenReturn = !!warningsOption.wForgottenReturn; + } + } + } + if ("cancellation" in opts && opts.cancellation && !config.cancellation) { + if (async.haveItemsQueued()) { + throw new Error( + "cannot enable cancellation after promises are in use"); + } + Promise.prototype._clearCancellationData = + cancellationClearCancellationData; + Promise.prototype._propagateFrom = cancellationPropagateFrom; + Promise.prototype._onCancel = cancellationOnCancel; + Promise.prototype._setOnCancel = cancellationSetOnCancel; + Promise.prototype._attachCancellationCallback = + cancellationAttachCancellationCallback; + Promise.prototype._execute = cancellationExecute; + propagateFromFunction = cancellationPropagateFrom; + config.cancellation = true; + } + if ("monitoring" in opts) { + if (opts.monitoring && !config.monitoring) { + config.monitoring = true; + Promise.prototype._fireEvent = activeFireEvent; + } else if (!opts.monitoring && config.monitoring) { + config.monitoring = false; + Promise.prototype._fireEvent = defaultFireEvent; + } + } + return Promise; + }; + + function defaultFireEvent() { return false; } + + Promise.prototype._fireEvent = defaultFireEvent; + Promise.prototype._execute = function(executor, resolve, reject) { + try { + executor(resolve, reject); + } catch (e) { + return e; + } + }; + Promise.prototype._onCancel = function () {}; + Promise.prototype._setOnCancel = function (handler) { ; }; + Promise.prototype._attachCancellationCallback = function(onCancel) { + ; + }; + Promise.prototype._captureStackTrace = function () {}; + Promise.prototype._attachExtraTrace = function () {}; + Promise.prototype._clearCancellationData = function() {}; + Promise.prototype._propagateFrom = function (parent, flags) { + ; + ; + }; + + function cancellationExecute(executor, resolve, reject) { + var promise = this; + try { + executor(resolve, reject, function(onCancel) { + if (typeof onCancel !== "function") { + throw new TypeError("onCancel must be a function, got: " + + util.toString(onCancel)); + } + promise._attachCancellationCallback(onCancel); + }); + } catch (e) { + return e; + } + } + + function cancellationAttachCancellationCallback(onCancel) { + if (!this._isCancellable()) return this; + + var previousOnCancel = this._onCancel(); + if (previousOnCancel !== undefined) { + if (util.isArray(previousOnCancel)) { + previousOnCancel.push(onCancel); + } else { + this._setOnCancel([previousOnCancel, onCancel]); + } + } else { + this._setOnCancel(onCancel); + } + } + + function cancellationOnCancel() { + return this._onCancelField; + } + + function cancellationSetOnCancel(onCancel) { + this._onCancelField = onCancel; + } + + function cancellationClearCancellationData() { + this._cancellationParent = undefined; + this._onCancelField = undefined; + } + + function cancellationPropagateFrom(parent, flags) { + if ((flags & 1) !== 0) { + this._cancellationParent = parent; + var branchesRemainingToCancel = parent._branchesRemainingToCancel; + if (branchesRemainingToCancel === undefined) { + branchesRemainingToCancel = 0; + } + parent._branchesRemainingToCancel = branchesRemainingToCancel + 1; + } + if ((flags & 2) !== 0 && parent._isBound()) { + this._setBoundTo(parent._boundTo); + } + } + + function bindingPropagateFrom(parent, flags) { + if ((flags & 2) !== 0 && parent._isBound()) { + this._setBoundTo(parent._boundTo); + } + } + var propagateFromFunction = bindingPropagateFrom; + + function boundValueFunction() { + var ret = this._boundTo; + if (ret !== undefined) { + if (ret instanceof Promise) { + if (ret.isFulfilled()) { + return ret.value(); + } else { + return undefined; + } + } + } + return ret; + } + + function longStackTracesCaptureStackTrace() { + this._trace = new CapturedTrace(this._peekContext()); + } + + function longStackTracesAttachExtraTrace(error, ignoreSelf) { + if (canAttachTrace(error)) { + var trace = this._trace; + if (trace !== undefined) { + if (ignoreSelf) trace = trace._parent; + } + if (trace !== undefined) { + trace.attachExtraTrace(error); + } else if (!error.__stackCleaned__) { + var parsed = parseStackAndMessage(error); + util.notEnumerableProp(error, "stack", + parsed.message + "\n" + parsed.stack.join("\n")); + util.notEnumerableProp(error, "__stackCleaned__", true); + } + } + } + + function checkForgottenReturns(returnValue, promiseCreated, name, promise, + parent) { + if (returnValue === undefined && promiseCreated !== null && + wForgottenReturn) { + if (parent !== undefined && parent._returnedNonUndefined()) return; + if ((promise._bitField & 65535) === 0) return; + + if (name) name = name + " "; + var handlerLine = ""; + var creatorLine = ""; + if (promiseCreated._trace) { + var traceLines = promiseCreated._trace.stack.split("\n"); + var stack = cleanStack(traceLines); + for (var i = stack.length - 1; i >= 0; --i) { + var line = stack[i]; + if (!nodeFramePattern.test(line)) { + var lineMatches = line.match(parseLinePattern); + if (lineMatches) { + handlerLine = "at " + lineMatches[1] + + ":" + lineMatches[2] + ":" + lineMatches[3] + " "; + } + break; + } + } + + if (stack.length > 0) { + var firstUserLine = stack[0]; + for (var i = 0; i < traceLines.length; ++i) { + + if (traceLines[i] === firstUserLine) { + if (i > 0) { + creatorLine = "\n" + traceLines[i - 1]; + } + break; + } + } + + } + } + var msg = "a promise was created in a " + name + + "handler " + handlerLine + "but was not returned from it, " + + "see http://goo.gl/rRqMUw" + + creatorLine; + promise._warn(msg, true, promiseCreated); + } + } + + function deprecated(name, replacement) { + var message = name + + " is deprecated and will be removed in a future version."; + if (replacement) message += " Use " + replacement + " instead."; + return warn(message); + } + + function warn(message, shouldUseOwnTrace, promise) { + if (!config.warnings) return; + var warning = new Warning(message); + var ctx; + if (shouldUseOwnTrace) { + promise._attachExtraTrace(warning); + } else if (config.longStackTraces && (ctx = Promise._peekContext())) { + ctx.attachExtraTrace(warning); + } else { + var parsed = parseStackAndMessage(warning); + warning.stack = parsed.message + "\n" + parsed.stack.join("\n"); + } + + if (!activeFireEvent("warning", warning)) { + formatAndLogError(warning, "", true); + } + } + + function reconstructStack(message, stacks) { + for (var i = 0; i < stacks.length - 1; ++i) { + stacks[i].push("From previous event:"); + stacks[i] = stacks[i].join("\n"); + } + if (i < stacks.length) { + stacks[i] = stacks[i].join("\n"); + } + return message + "\n" + stacks.join("\n"); + } + + function removeDuplicateOrEmptyJumps(stacks) { + for (var i = 0; i < stacks.length; ++i) { + if (stacks[i].length === 0 || + ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) { + stacks.splice(i, 1); + i--; + } + } + } + + function removeCommonRoots(stacks) { + var current = stacks[0]; + for (var i = 1; i < stacks.length; ++i) { + var prev = stacks[i]; + var currentLastIndex = current.length - 1; + var currentLastLine = current[currentLastIndex]; + var commonRootMeetPoint = -1; + + for (var j = prev.length - 1; j >= 0; --j) { + if (prev[j] === currentLastLine) { + commonRootMeetPoint = j; + break; + } + } + + for (var j = commonRootMeetPoint; j >= 0; --j) { + var line = prev[j]; + if (current[currentLastIndex] === line) { + current.pop(); + currentLastIndex--; + } else { + break; + } + } + current = prev; + } + } + + function cleanStack(stack) { + var ret = []; + for (var i = 0; i < stack.length; ++i) { + var line = stack[i]; + var isTraceLine = " (No stack trace)" === line || + stackFramePattern.test(line); + var isInternalFrame = isTraceLine && shouldIgnore(line); + if (isTraceLine && !isInternalFrame) { + if (indentStackFrames && line.charAt(0) !== " ") { + line = " " + line; + } + ret.push(line); + } + } + return ret; + } + + function stackFramesAsArray(error) { + var stack = error.stack.replace(/\s+$/g, "").split("\n"); + for (var i = 0; i < stack.length; ++i) { + var line = stack[i]; + if (" (No stack trace)" === line || stackFramePattern.test(line)) { + break; + } + } + if (i > 0 && error.name != "SyntaxError") { + stack = stack.slice(i); + } + return stack; + } + + function parseStackAndMessage(error) { + var stack = error.stack; + var message = error.toString(); + stack = typeof stack === "string" && stack.length > 0 + ? stackFramesAsArray(error) : [" (No stack trace)"]; + return { + message: message, + stack: error.name == "SyntaxError" ? stack : cleanStack(stack) + }; + } + + function formatAndLogError(error, title, isSoft) { + if (typeof console !== "undefined") { + var message; + if (util.isObject(error)) { + var stack = error.stack; + message = title + formatStack(stack, error); + } else { + message = title + String(error); + } + if (typeof printWarning === "function") { + printWarning(message, isSoft); + } else if (typeof console.log === "function" || + typeof console.log === "object") { + console.log(message); + } + } + } + + function fireRejectionEvent(name, localHandler, reason, promise) { + var localEventFired = false; + try { + if (typeof localHandler === "function") { + localEventFired = true; + if (name === "rejectionHandled") { + localHandler(promise); + } else { + localHandler(reason, promise); + } + } + } catch (e) { + async.throwLater(e); + } + + if (name === "unhandledRejection") { + if (!activeFireEvent(name, reason, promise) && !localEventFired) { + formatAndLogError(reason, "Unhandled rejection "); + } + } else { + activeFireEvent(name, promise); + } + } + + function formatNonError(obj) { + var str; + if (typeof obj === "function") { + str = "[function " + + (obj.name || "anonymous") + + "]"; + } else { + str = obj && typeof obj.toString === "function" + ? obj.toString() : util.toString(obj); + var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/; + if (ruselessToString.test(str)) { + try { + var newStr = JSON.stringify(obj); + str = newStr; + } + catch(e) { + + } + } + if (str.length === 0) { + str = "(empty array)"; + } + } + return ("(<" + snip(str) + ">, no stack trace)"); + } + + function snip(str) { + var maxChars = 41; + if (str.length < maxChars) { + return str; + } + return str.substr(0, maxChars - 3) + "..."; + } + + function longStackTracesIsSupported() { + return typeof captureStackTrace === "function"; + } + + var shouldIgnore = function() { return false; }; + var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/; + function parseLineInfo(line) { + var matches = line.match(parseLineInfoRegex); + if (matches) { + return { + fileName: matches[1], + line: parseInt(matches[2], 10) + }; + } + } + + function setBounds(firstLineError, lastLineError) { + if (!longStackTracesIsSupported()) return; + var firstStackLines = firstLineError.stack.split("\n"); + var lastStackLines = lastLineError.stack.split("\n"); + var firstIndex = -1; + var lastIndex = -1; + var firstFileName; + var lastFileName; + for (var i = 0; i < firstStackLines.length; ++i) { + var result = parseLineInfo(firstStackLines[i]); + if (result) { + firstFileName = result.fileName; + firstIndex = result.line; + break; + } + } + for (var i = 0; i < lastStackLines.length; ++i) { + var result = parseLineInfo(lastStackLines[i]); + if (result) { + lastFileName = result.fileName; + lastIndex = result.line; + break; + } + } + if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName || + firstFileName !== lastFileName || firstIndex >= lastIndex) { + return; + } + + shouldIgnore = function(line) { + if (bluebirdFramePattern.test(line)) return true; + var info = parseLineInfo(line); + if (info) { + if (info.fileName === firstFileName && + (firstIndex <= info.line && info.line <= lastIndex)) { + return true; + } + } + return false; + }; + } + + function CapturedTrace(parent) { + this._parent = parent; + this._promisesCreated = 0; + var length = this._length = 1 + (parent === undefined ? 0 : parent._length); + captureStackTrace(this, CapturedTrace); + if (length > 32) this.uncycle(); + } + util.inherits(CapturedTrace, Error); + Context.CapturedTrace = CapturedTrace; + + CapturedTrace.prototype.uncycle = function() { + var length = this._length; + if (length < 2) return; + var nodes = []; + var stackToIndex = {}; + + for (var i = 0, node = this; node !== undefined; ++i) { + nodes.push(node); + node = node._parent; + } + length = this._length = i; + for (var i = length - 1; i >= 0; --i) { + var stack = nodes[i].stack; + if (stackToIndex[stack] === undefined) { + stackToIndex[stack] = i; + } + } + for (var i = 0; i < length; ++i) { + var currentStack = nodes[i].stack; + var index = stackToIndex[currentStack]; + if (index !== undefined && index !== i) { + if (index > 0) { + nodes[index - 1]._parent = undefined; + nodes[index - 1]._length = 1; + } + nodes[i]._parent = undefined; + nodes[i]._length = 1; + var cycleEdgeNode = i > 0 ? nodes[i - 1] : this; + + if (index < length - 1) { + cycleEdgeNode._parent = nodes[index + 1]; + cycleEdgeNode._parent.uncycle(); + cycleEdgeNode._length = + cycleEdgeNode._parent._length + 1; + } else { + cycleEdgeNode._parent = undefined; + cycleEdgeNode._length = 1; + } + var currentChildLength = cycleEdgeNode._length + 1; + for (var j = i - 2; j >= 0; --j) { + nodes[j]._length = currentChildLength; + currentChildLength++; + } + return; + } + } + }; + + CapturedTrace.prototype.attachExtraTrace = function(error) { + if (error.__stackCleaned__) return; + this.uncycle(); + var parsed = parseStackAndMessage(error); + var message = parsed.message; + var stacks = [parsed.stack]; + + var trace = this; + while (trace !== undefined) { + stacks.push(cleanStack(trace.stack.split("\n"))); + trace = trace._parent; + } + removeCommonRoots(stacks); + removeDuplicateOrEmptyJumps(stacks); + util.notEnumerableProp(error, "stack", reconstructStack(message, stacks)); + util.notEnumerableProp(error, "__stackCleaned__", true); + }; + + var captureStackTrace = (function stackDetection() { + var v8stackFramePattern = /^\s*at\s*/; + var v8stackFormatter = function(stack, error) { + if (typeof stack === "string") return stack; + + if (error.name !== undefined && + error.message !== undefined) { + return error.toString(); + } + return formatNonError(error); + }; + + if (typeof Error.stackTraceLimit === "number" && + typeof Error.captureStackTrace === "function") { + Error.stackTraceLimit += 6; + stackFramePattern = v8stackFramePattern; + formatStack = v8stackFormatter; + var captureStackTrace = Error.captureStackTrace; + + shouldIgnore = function(line) { + return bluebirdFramePattern.test(line); + }; + return function(receiver, ignoreUntil) { + Error.stackTraceLimit += 6; + captureStackTrace(receiver, ignoreUntil); + Error.stackTraceLimit -= 6; + }; + } + var err = new Error(); + + if (typeof err.stack === "string" && + err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) { + stackFramePattern = /@/; + formatStack = v8stackFormatter; + indentStackFrames = true; + return function captureStackTrace(o) { + o.stack = new Error().stack; + }; + } + + var hasStackAfterThrow; + try { throw new Error(); } + catch(e) { + hasStackAfterThrow = ("stack" in e); + } + if (!("stack" in err) && hasStackAfterThrow && + typeof Error.stackTraceLimit === "number") { + stackFramePattern = v8stackFramePattern; + formatStack = v8stackFormatter; + return function captureStackTrace(o) { + Error.stackTraceLimit += 6; + try { throw new Error(); } + catch(e) { o.stack = e.stack; } + Error.stackTraceLimit -= 6; + }; + } + + formatStack = function(stack, error) { + if (typeof stack === "string") return stack; + + if ((typeof error === "object" || + typeof error === "function") && + error.name !== undefined && + error.message !== undefined) { + return error.toString(); + } + return formatNonError(error); + }; + + return null; + + })([]); + + if (typeof console !== "undefined" && typeof console.warn !== "undefined") { + printWarning = function (message) { + console.warn(message); + }; + if (util.isNode && process.stderr.isTTY) { + printWarning = function(message, isSoft) { + var color = isSoft ? "\u001b[33m" : "\u001b[31m"; + console.warn(color + message + "\u001b[0m\n"); + }; + } else if (!util.isNode && typeof (new Error().stack) === "string") { + printWarning = function(message, isSoft) { + console.warn("%c" + message, + isSoft ? "color: darkorange" : "color: red"); + }; + } + } + + var config = { + warnings: warnings, + longStackTraces: false, + cancellation: false, + monitoring: false + }; + + if (longStackTraces) Promise.longStackTraces(); + + return { + longStackTraces: function() { + return config.longStackTraces; + }, + warnings: function() { + return config.warnings; + }, + cancellation: function() { + return config.cancellation; + }, + monitoring: function() { + return config.monitoring; + }, + propagateFromFunction: function() { + return propagateFromFunction; + }, + boundValueFunction: function() { + return boundValueFunction; + }, + checkForgottenReturns: checkForgottenReturns, + setBounds: setBounds, + warn: warn, + deprecated: deprecated, + CapturedTrace: CapturedTrace, + fireDomEvent: fireDomEvent, + fireGlobalEvent: fireGlobalEvent + }; + }; + + },{"./errors":12,"./util":36}],10:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function(Promise) { + function returner() { + return this.value; + } + function thrower() { + throw this.reason; + } + + Promise.prototype["return"] = + Promise.prototype.thenReturn = function (value) { + if (value instanceof Promise) value.suppressUnhandledRejections(); + return this._then( + returner, undefined, undefined, {value: value}, undefined); + }; + + Promise.prototype["throw"] = + Promise.prototype.thenThrow = function (reason) { + return this._then( + thrower, undefined, undefined, {reason: reason}, undefined); + }; + + Promise.prototype.catchThrow = function (reason) { + if (arguments.length <= 1) { + return this._then( + undefined, thrower, undefined, {reason: reason}, undefined); + } else { + var _reason = arguments[1]; + var handler = function() {throw _reason;}; + return this.caught(reason, handler); + } + }; + + Promise.prototype.catchReturn = function (value) { + if (arguments.length <= 1) { + if (value instanceof Promise) value.suppressUnhandledRejections(); + return this._then( + undefined, returner, undefined, {value: value}, undefined); + } else { + var _value = arguments[1]; + if (_value instanceof Promise) _value.suppressUnhandledRejections(); + var handler = function() {return _value;}; + return this.caught(value, handler); + } + }; + }; + + },{}],11:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function(Promise, INTERNAL) { + var PromiseReduce = Promise.reduce; + var PromiseAll = Promise.all; + + function promiseAllThis() { + return PromiseAll(this); + } + + function PromiseMapSeries(promises, fn) { + return PromiseReduce(promises, fn, INTERNAL, INTERNAL); + } + + Promise.prototype.each = function (fn) { + return PromiseReduce(this, fn, INTERNAL, 0) + ._then(promiseAllThis, undefined, undefined, this, undefined); + }; + + Promise.prototype.mapSeries = function (fn) { + return PromiseReduce(this, fn, INTERNAL, INTERNAL); + }; + + Promise.each = function (promises, fn) { + return PromiseReduce(promises, fn, INTERNAL, 0) + ._then(promiseAllThis, undefined, undefined, promises, undefined); + }; + + Promise.mapSeries = PromiseMapSeries; + }; + + + },{}],12:[function(_dereq_,module,exports){ + "use strict"; + var es5 = _dereq_("./es5"); + var Objectfreeze = es5.freeze; + var util = _dereq_("./util"); + var inherits = util.inherits; + var notEnumerableProp = util.notEnumerableProp; + + function subError(nameProperty, defaultMessage) { + function SubError(message) { + if (!(this instanceof SubError)) return new SubError(message); + notEnumerableProp(this, "message", + typeof message === "string" ? message : defaultMessage); + notEnumerableProp(this, "name", nameProperty); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } else { + Error.call(this); + } + } + inherits(SubError, Error); + return SubError; + } + + var _TypeError, _RangeError; + var Warning = subError("Warning", "warning"); + var CancellationError = subError("CancellationError", "cancellation error"); + var TimeoutError = subError("TimeoutError", "timeout error"); + var AggregateError = subError("AggregateError", "aggregate error"); + try { + _TypeError = TypeError; + _RangeError = RangeError; + } catch(e) { + _TypeError = subError("TypeError", "type error"); + _RangeError = subError("RangeError", "range error"); + } + + var methods = ("join pop push shift unshift slice filter forEach some " + + "every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" "); + + for (var i = 0; i < methods.length; ++i) { + if (typeof Array.prototype[methods[i]] === "function") { + AggregateError.prototype[methods[i]] = Array.prototype[methods[i]]; + } + } + + es5.defineProperty(AggregateError.prototype, "length", { + value: 0, + configurable: false, + writable: true, + enumerable: true + }); + AggregateError.prototype["isOperational"] = true; + var level = 0; + AggregateError.prototype.toString = function() { + var indent = Array(level * 4 + 1).join(" "); + var ret = "\n" + indent + "AggregateError of:" + "\n"; + level++; + indent = Array(level * 4 + 1).join(" "); + for (var i = 0; i < this.length; ++i) { + var str = this[i] === this ? "[Circular AggregateError]" : this[i] + ""; + var lines = str.split("\n"); + for (var j = 0; j < lines.length; ++j) { + lines[j] = indent + lines[j]; + } + str = lines.join("\n"); + ret += str + "\n"; + } + level--; + return ret; + }; + + function OperationalError(message) { + if (!(this instanceof OperationalError)) + return new OperationalError(message); + notEnumerableProp(this, "name", "OperationalError"); + notEnumerableProp(this, "message", message); + this.cause = message; + this["isOperational"] = true; + + if (message instanceof Error) { + notEnumerableProp(this, "message", message.message); + notEnumerableProp(this, "stack", message.stack); + } else if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + } + inherits(OperationalError, Error); + + var errorTypes = Error["__BluebirdErrorTypes__"]; + if (!errorTypes) { + errorTypes = Objectfreeze({ + CancellationError: CancellationError, + TimeoutError: TimeoutError, + OperationalError: OperationalError, + RejectionError: OperationalError, + AggregateError: AggregateError + }); + es5.defineProperty(Error, "__BluebirdErrorTypes__", { + value: errorTypes, + writable: false, + enumerable: false, + configurable: false + }); + } + + module.exports = { + Error: Error, + TypeError: _TypeError, + RangeError: _RangeError, + CancellationError: errorTypes.CancellationError, + OperationalError: errorTypes.OperationalError, + TimeoutError: errorTypes.TimeoutError, + AggregateError: errorTypes.AggregateError, + Warning: Warning + }; + + },{"./es5":13,"./util":36}],13:[function(_dereq_,module,exports){ + var isES5 = (function(){ + "use strict"; + return this === undefined; + })(); + + if (isES5) { + module.exports = { + freeze: Object.freeze, + defineProperty: Object.defineProperty, + getDescriptor: Object.getOwnPropertyDescriptor, + keys: Object.keys, + names: Object.getOwnPropertyNames, + getPrototypeOf: Object.getPrototypeOf, + isArray: Array.isArray, + isES5: isES5, + propertyIsWritable: function(obj, prop) { + var descriptor = Object.getOwnPropertyDescriptor(obj, prop); + return !!(!descriptor || descriptor.writable || descriptor.set); + } + }; + } else { + var has = {}.hasOwnProperty; + var str = {}.toString; + var proto = {}.constructor.prototype; + + var ObjectKeys = function (o) { + var ret = []; + for (var key in o) { + if (has.call(o, key)) { + ret.push(key); + } + } + return ret; + }; + + var ObjectGetDescriptor = function(o, key) { + return {value: o[key]}; + }; + + var ObjectDefineProperty = function (o, key, desc) { + o[key] = desc.value; + return o; + }; + + var ObjectFreeze = function (obj) { + return obj; + }; + + var ObjectGetPrototypeOf = function (obj) { + try { + return Object(obj).constructor.prototype; + } + catch (e) { + return proto; + } + }; + + var ArrayIsArray = function (obj) { + try { + return str.call(obj) === "[object Array]"; + } + catch(e) { + return false; + } + }; + + module.exports = { + isArray: ArrayIsArray, + keys: ObjectKeys, + names: ObjectKeys, + defineProperty: ObjectDefineProperty, + getDescriptor: ObjectGetDescriptor, + freeze: ObjectFreeze, + getPrototypeOf: ObjectGetPrototypeOf, + isES5: isES5, + propertyIsWritable: function() { + return true; + } + }; + } + + },{}],14:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function(Promise, INTERNAL) { + var PromiseMap = Promise.map; + + Promise.prototype.filter = function (fn, options) { + return PromiseMap(this, fn, options, INTERNAL); + }; + + Promise.filter = function (promises, fn, options) { + return PromiseMap(promises, fn, options, INTERNAL); + }; + }; + + },{}],15:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function(Promise, tryConvertToPromise) { + var util = _dereq_("./util"); + var CancellationError = Promise.CancellationError; + var errorObj = util.errorObj; + + function PassThroughHandlerContext(promise, type, handler) { + this.promise = promise; + this.type = type; + this.handler = handler; + this.called = false; + this.cancelPromise = null; + } + + PassThroughHandlerContext.prototype.isFinallyHandler = function() { + return this.type === 0; + }; + + function FinallyHandlerCancelReaction(finallyHandler) { + this.finallyHandler = finallyHandler; + } + + FinallyHandlerCancelReaction.prototype._resultCancelled = function() { + checkCancel(this.finallyHandler); + }; + + function checkCancel(ctx, reason) { + if (ctx.cancelPromise != null) { + if (arguments.length > 1) { + ctx.cancelPromise._reject(reason); + } else { + ctx.cancelPromise._cancel(); + } + ctx.cancelPromise = null; + return true; + } + return false; + } + + function succeed() { + return finallyHandler.call(this, this.promise._target()._settledValue()); + } + function fail(reason) { + if (checkCancel(this, reason)) return; + errorObj.e = reason; + return errorObj; + } + function finallyHandler(reasonOrValue) { + var promise = this.promise; + var handler = this.handler; + + if (!this.called) { + this.called = true; + var ret = this.isFinallyHandler() + ? handler.call(promise._boundValue()) + : handler.call(promise._boundValue(), reasonOrValue); + if (ret !== undefined) { + promise._setReturnedNonUndefined(); + var maybePromise = tryConvertToPromise(ret, promise); + if (maybePromise instanceof Promise) { + if (this.cancelPromise != null) { + if (maybePromise._isCancelled()) { + var reason = + new CancellationError("late cancellation observer"); + promise._attachExtraTrace(reason); + errorObj.e = reason; + return errorObj; + } else if (maybePromise.isPending()) { + maybePromise._attachCancellationCallback( + new FinallyHandlerCancelReaction(this)); + } + } + return maybePromise._then( + succeed, fail, undefined, this, undefined); + } + } + } + + if (promise.isRejected()) { + checkCancel(this); + errorObj.e = reasonOrValue; + return errorObj; + } else { + checkCancel(this); + return reasonOrValue; + } + } + + Promise.prototype._passThrough = function(handler, type, success, fail) { + if (typeof handler !== "function") return this.then(); + return this._then(success, + fail, + undefined, + new PassThroughHandlerContext(this, type, handler), + undefined); + }; + + Promise.prototype.lastly = + Promise.prototype["finally"] = function (handler) { + return this._passThrough(handler, + 0, + finallyHandler, + finallyHandler); + }; + + Promise.prototype.tap = function (handler) { + return this._passThrough(handler, 1, finallyHandler); + }; + + return PassThroughHandlerContext; + }; + + },{"./util":36}],16:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function(Promise, + apiRejection, + INTERNAL, + tryConvertToPromise, + Proxyable, + debug) { + var errors = _dereq_("./errors"); + var TypeError = errors.TypeError; + var util = _dereq_("./util"); + var errorObj = util.errorObj; + var tryCatch = util.tryCatch; + var yieldHandlers = []; + + function promiseFromYieldHandler(value, yieldHandlers, traceParent) { + for (var i = 0; i < yieldHandlers.length; ++i) { + traceParent._pushContext(); + var result = tryCatch(yieldHandlers[i])(value); + traceParent._popContext(); + if (result === errorObj) { + traceParent._pushContext(); + var ret = Promise.reject(errorObj.e); + traceParent._popContext(); + return ret; + } + var maybePromise = tryConvertToPromise(result, traceParent); + if (maybePromise instanceof Promise) return maybePromise; + } + return null; + } + + function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) { + if (debug.cancellation()) { + var internal = new Promise(INTERNAL); + var _finallyPromise = this._finallyPromise = new Promise(INTERNAL); + this._promise = internal.lastly(function() { + return _finallyPromise; + }); + internal._captureStackTrace(); + internal._setOnCancel(this); + } else { + var promise = this._promise = new Promise(INTERNAL); + promise._captureStackTrace(); + } + this._stack = stack; + this._generatorFunction = generatorFunction; + this._receiver = receiver; + this._generator = undefined; + this._yieldHandlers = typeof yieldHandler === "function" + ? [yieldHandler].concat(yieldHandlers) + : yieldHandlers; + this._yieldedPromise = null; + this._cancellationPhase = false; + } + util.inherits(PromiseSpawn, Proxyable); + + PromiseSpawn.prototype._isResolved = function() { + return this._promise === null; + }; + + PromiseSpawn.prototype._cleanup = function() { + this._promise = this._generator = null; + if (debug.cancellation() && this._finallyPromise !== null) { + this._finallyPromise._fulfill(); + this._finallyPromise = null; + } + }; + + PromiseSpawn.prototype._promiseCancelled = function() { + if (this._isResolved()) return; + var implementsReturn = typeof this._generator["return"] !== "undefined"; + + var result; + if (!implementsReturn) { + var reason = new Promise.CancellationError( + "generator .return() sentinel"); + Promise.coroutine.returnSentinel = reason; + this._promise._attachExtraTrace(reason); + this._promise._pushContext(); + result = tryCatch(this._generator["throw"]).call(this._generator, + reason); + this._promise._popContext(); + } else { + this._promise._pushContext(); + result = tryCatch(this._generator["return"]).call(this._generator, + undefined); + this._promise._popContext(); + } + this._cancellationPhase = true; + this._yieldedPromise = null; + this._continue(result); + }; + + PromiseSpawn.prototype._promiseFulfilled = function(value) { + this._yieldedPromise = null; + this._promise._pushContext(); + var result = tryCatch(this._generator.next).call(this._generator, value); + this._promise._popContext(); + this._continue(result); + }; + + PromiseSpawn.prototype._promiseRejected = function(reason) { + this._yieldedPromise = null; + this._promise._attachExtraTrace(reason); + this._promise._pushContext(); + var result = tryCatch(this._generator["throw"]) + .call(this._generator, reason); + this._promise._popContext(); + this._continue(result); + }; + + PromiseSpawn.prototype._resultCancelled = function() { + if (this._yieldedPromise instanceof Promise) { + var promise = this._yieldedPromise; + this._yieldedPromise = null; + promise.cancel(); + } + }; + + PromiseSpawn.prototype.promise = function () { + return this._promise; + }; + + PromiseSpawn.prototype._run = function () { + this._generator = this._generatorFunction.call(this._receiver); + this._receiver = + this._generatorFunction = undefined; + this._promiseFulfilled(undefined); + }; + + PromiseSpawn.prototype._continue = function (result) { + var promise = this._promise; + if (result === errorObj) { + this._cleanup(); + if (this._cancellationPhase) { + return promise.cancel(); + } else { + return promise._rejectCallback(result.e, false); + } + } + + var value = result.value; + if (result.done === true) { + this._cleanup(); + if (this._cancellationPhase) { + return promise.cancel(); + } else { + return promise._resolveCallback(value); + } + } else { + var maybePromise = tryConvertToPromise(value, this._promise); + if (!(maybePromise instanceof Promise)) { + maybePromise = + promiseFromYieldHandler(maybePromise, + this._yieldHandlers, + this._promise); + if (maybePromise === null) { + this._promiseRejected( + new TypeError( + "A value %s was yielded that could not be treated as a promise\u000a\u000a See http://goo.gl/MqrFmX\u000a\u000a".replace("%s", value) + + "From coroutine:\u000a" + + this._stack.split("\n").slice(1, -7).join("\n") + ) + ); + return; + } + } + maybePromise = maybePromise._target(); + var bitField = maybePromise._bitField; + ; + if (((bitField & 50397184) === 0)) { + this._yieldedPromise = maybePromise; + maybePromise._proxy(this, null); + } else if (((bitField & 33554432) !== 0)) { + Promise._async.invoke( + this._promiseFulfilled, this, maybePromise._value() + ); + } else if (((bitField & 16777216) !== 0)) { + Promise._async.invoke( + this._promiseRejected, this, maybePromise._reason() + ); + } else { + this._promiseCancelled(); + } + } + }; + + Promise.coroutine = function (generatorFunction, options) { + if (typeof generatorFunction !== "function") { + throw new TypeError("generatorFunction must be a function\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + var yieldHandler = Object(options).yieldHandler; + var PromiseSpawn$ = PromiseSpawn; + var stack = new Error().stack; + return function () { + var generator = generatorFunction.apply(this, arguments); + var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler, + stack); + var ret = spawn.promise(); + spawn._generator = generator; + spawn._promiseFulfilled(undefined); + return ret; + }; + }; + + Promise.coroutine.addYieldHandler = function(fn) { + if (typeof fn !== "function") { + throw new TypeError("expecting a function but got " + util.classString(fn)); + } + yieldHandlers.push(fn); + }; + + Promise.spawn = function (generatorFunction) { + debug.deprecated("Promise.spawn()", "Promise.coroutine()"); + if (typeof generatorFunction !== "function") { + return apiRejection("generatorFunction must be a function\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + var spawn = new PromiseSpawn(generatorFunction, this); + var ret = spawn.promise(); + spawn._run(Promise.spawn); + return ret; + }; + }; + + },{"./errors":12,"./util":36}],17:[function(_dereq_,module,exports){ + "use strict"; + module.exports = + function(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async, + getDomain) { + var util = _dereq_("./util"); + var canEvaluate = util.canEvaluate; + var tryCatch = util.tryCatch; + var errorObj = util.errorObj; + var reject; + + if (false) { + if (canEvaluate) { + var thenCallback = function(i) { + return new Function("value", "holder", " \n\ + 'use strict'; \n\ + holder.pIndex = value; \n\ + holder.checkFulfillment(this); \n\ + ".replace(/Index/g, i)); + }; + + var promiseSetter = function(i) { + return new Function("promise", "holder", " \n\ + 'use strict'; \n\ + holder.pIndex = promise; \n\ + ".replace(/Index/g, i)); + }; + + var generateHolderClass = function(total) { + var props = new Array(total); + for (var i = 0; i < props.length; ++i) { + props[i] = "this.p" + (i+1); + } + var assignment = props.join(" = ") + " = null;"; + var cancellationCode= "var promise;\n" + props.map(function(prop) { + return " \n\ + promise = " + prop + "; \n\ + if (promise instanceof Promise) { \n\ + promise.cancel(); \n\ + } \n\ + "; + }).join("\n"); + var passedArguments = props.join(", "); + var name = "Holder$" + total; + + + var code = "return function(tryCatch, errorObj, Promise, async) { \n\ + 'use strict'; \n\ + function [TheName](fn) { \n\ + [TheProperties] \n\ + this.fn = fn; \n\ + this.asyncNeeded = true; \n\ + this.now = 0; \n\ + } \n\ + \n\ + [TheName].prototype._callFunction = function(promise) { \n\ + promise._pushContext(); \n\ + var ret = tryCatch(this.fn)([ThePassedArguments]); \n\ + promise._popContext(); \n\ + if (ret === errorObj) { \n\ + promise._rejectCallback(ret.e, false); \n\ + } else { \n\ + promise._resolveCallback(ret); \n\ + } \n\ + }; \n\ + \n\ + [TheName].prototype.checkFulfillment = function(promise) { \n\ + var now = ++this.now; \n\ + if (now === [TheTotal]) { \n\ + if (this.asyncNeeded) { \n\ + async.invoke(this._callFunction, this, promise); \n\ + } else { \n\ + this._callFunction(promise); \n\ + } \n\ + \n\ + } \n\ + }; \n\ + \n\ + [TheName].prototype._resultCancelled = function() { \n\ + [CancellationCode] \n\ + }; \n\ + \n\ + return [TheName]; \n\ + }(tryCatch, errorObj, Promise, async); \n\ + "; + + code = code.replace(/\[TheName\]/g, name) + .replace(/\[TheTotal\]/g, total) + .replace(/\[ThePassedArguments\]/g, passedArguments) + .replace(/\[TheProperties\]/g, assignment) + .replace(/\[CancellationCode\]/g, cancellationCode); + + return new Function("tryCatch", "errorObj", "Promise", "async", code) + (tryCatch, errorObj, Promise, async); + }; + + var holderClasses = []; + var thenCallbacks = []; + var promiseSetters = []; + + for (var i = 0; i < 8; ++i) { + holderClasses.push(generateHolderClass(i + 1)); + thenCallbacks.push(thenCallback(i + 1)); + promiseSetters.push(promiseSetter(i + 1)); + } + + reject = function (reason) { + this._reject(reason); + }; + }} + + Promise.join = function () { + var last = arguments.length - 1; + var fn; + if (last > 0 && typeof arguments[last] === "function") { + fn = arguments[last]; + if (false) { + if (last <= 8 && canEvaluate) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + var HolderClass = holderClasses[last - 1]; + var holder = new HolderClass(fn); + var callbacks = thenCallbacks; + + for (var i = 0; i < last; ++i) { + var maybePromise = tryConvertToPromise(arguments[i], ret); + if (maybePromise instanceof Promise) { + maybePromise = maybePromise._target(); + var bitField = maybePromise._bitField; + ; + if (((bitField & 50397184) === 0)) { + maybePromise._then(callbacks[i], reject, + undefined, ret, holder); + promiseSetters[i](maybePromise, holder); + holder.asyncNeeded = false; + } else if (((bitField & 33554432) !== 0)) { + callbacks[i].call(ret, + maybePromise._value(), holder); + } else if (((bitField & 16777216) !== 0)) { + ret._reject(maybePromise._reason()); + } else { + ret._cancel(); + } + } else { + callbacks[i].call(ret, maybePromise, holder); + } + } + + if (!ret._isFateSealed()) { + if (holder.asyncNeeded) { + var domain = getDomain(); + if (domain !== null) { + holder.fn = util.domainBind(domain, holder.fn); + } + } + ret._setAsyncGuaranteed(); + ret._setOnCancel(holder); + } + return ret; + } + } + } + var args = [].slice.call(arguments);; + if (fn) args.pop(); + var ret = new PromiseArray(args).promise(); + return fn !== undefined ? ret.spread(fn) : ret; + }; + + }; + + },{"./util":36}],18:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function(Promise, + PromiseArray, + apiRejection, + tryConvertToPromise, + INTERNAL, + debug) { + var getDomain = Promise._getDomain; + var util = _dereq_("./util"); + var tryCatch = util.tryCatch; + var errorObj = util.errorObj; + var async = Promise._async; + + function MappingPromiseArray(promises, fn, limit, _filter) { + this.constructor$(promises); + this._promise._captureStackTrace(); + var domain = getDomain(); + this._callback = domain === null ? fn : util.domainBind(domain, fn); + this._preservedValues = _filter === INTERNAL + ? new Array(this.length()) + : null; + this._limit = limit; + this._inFlight = 0; + this._queue = []; + async.invoke(this._asyncInit, this, undefined); + } + util.inherits(MappingPromiseArray, PromiseArray); + + MappingPromiseArray.prototype._asyncInit = function() { + this._init$(undefined, -2); + }; + + MappingPromiseArray.prototype._init = function () {}; + + MappingPromiseArray.prototype._promiseFulfilled = function (value, index) { + var values = this._values; + var length = this.length(); + var preservedValues = this._preservedValues; + var limit = this._limit; + + if (index < 0) { + index = (index * -1) - 1; + values[index] = value; + if (limit >= 1) { + this._inFlight--; + this._drainQueue(); + if (this._isResolved()) return true; + } + } else { + if (limit >= 1 && this._inFlight >= limit) { + values[index] = value; + this._queue.push(index); + return false; + } + if (preservedValues !== null) preservedValues[index] = value; + + var promise = this._promise; + var callback = this._callback; + var receiver = promise._boundValue(); + promise._pushContext(); + var ret = tryCatch(callback).call(receiver, value, index, length); + var promiseCreated = promise._popContext(); + debug.checkForgottenReturns( + ret, + promiseCreated, + preservedValues !== null ? "Promise.filter" : "Promise.map", + promise + ); + if (ret === errorObj) { + this._reject(ret.e); + return true; + } + + var maybePromise = tryConvertToPromise(ret, this._promise); + if (maybePromise instanceof Promise) { + maybePromise = maybePromise._target(); + var bitField = maybePromise._bitField; + ; + if (((bitField & 50397184) === 0)) { + if (limit >= 1) this._inFlight++; + values[index] = maybePromise; + maybePromise._proxy(this, (index + 1) * -1); + return false; + } else if (((bitField & 33554432) !== 0)) { + ret = maybePromise._value(); + } else if (((bitField & 16777216) !== 0)) { + this._reject(maybePromise._reason()); + return true; + } else { + this._cancel(); + return true; + } + } + values[index] = ret; + } + var totalResolved = ++this._totalResolved; + if (totalResolved >= length) { + if (preservedValues !== null) { + this._filter(values, preservedValues); + } else { + this._resolve(values); + } + return true; + } + return false; + }; + + MappingPromiseArray.prototype._drainQueue = function () { + var queue = this._queue; + var limit = this._limit; + var values = this._values; + while (queue.length > 0 && this._inFlight < limit) { + if (this._isResolved()) return; + var index = queue.pop(); + this._promiseFulfilled(values[index], index); + } + }; + + MappingPromiseArray.prototype._filter = function (booleans, values) { + var len = values.length; + var ret = new Array(len); + var j = 0; + for (var i = 0; i < len; ++i) { + if (booleans[i]) ret[j++] = values[i]; + } + ret.length = j; + this._resolve(ret); + }; + + MappingPromiseArray.prototype.preservedValues = function () { + return this._preservedValues; + }; + + function map(promises, fn, options, _filter) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + + var limit = 0; + if (options !== undefined) { + if (typeof options === "object" && options !== null) { + if (typeof options.concurrency !== "number") { + return Promise.reject( + new TypeError("'concurrency' must be a number but it is " + + util.classString(options.concurrency))); + } + limit = options.concurrency; + } else { + return Promise.reject(new TypeError( + "options argument must be an object but it is " + + util.classString(options))); + } + } + limit = typeof limit === "number" && + isFinite(limit) && limit >= 1 ? limit : 0; + return new MappingPromiseArray(promises, fn, limit, _filter).promise(); + } + + Promise.prototype.map = function (fn, options) { + return map(this, fn, options, null); + }; + + Promise.map = function (promises, fn, options, _filter) { + return map(promises, fn, options, _filter); + }; + + + }; + + },{"./util":36}],19:[function(_dereq_,module,exports){ + "use strict"; + module.exports = + function(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) { + var util = _dereq_("./util"); + var tryCatch = util.tryCatch; + + Promise.method = function (fn) { + if (typeof fn !== "function") { + throw new Promise.TypeError("expecting a function but got " + util.classString(fn)); + } + return function () { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._pushContext(); + var value = tryCatch(fn).apply(this, arguments); + var promiseCreated = ret._popContext(); + debug.checkForgottenReturns( + value, promiseCreated, "Promise.method", ret); + ret._resolveFromSyncValue(value); + return ret; + }; + }; + + Promise.attempt = Promise["try"] = function (fn) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._pushContext(); + var value; + if (arguments.length > 1) { + debug.deprecated("calling Promise.try with more than 1 argument"); + var arg = arguments[1]; + var ctx = arguments[2]; + value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg) + : tryCatch(fn).call(ctx, arg); + } else { + value = tryCatch(fn)(); + } + var promiseCreated = ret._popContext(); + debug.checkForgottenReturns( + value, promiseCreated, "Promise.try", ret); + ret._resolveFromSyncValue(value); + return ret; + }; + + Promise.prototype._resolveFromSyncValue = function (value) { + if (value === util.errorObj) { + this._rejectCallback(value.e, false); + } else { + this._resolveCallback(value, true); + } + }; + }; + + },{"./util":36}],20:[function(_dereq_,module,exports){ + "use strict"; + var util = _dereq_("./util"); + var maybeWrapAsError = util.maybeWrapAsError; + var errors = _dereq_("./errors"); + var OperationalError = errors.OperationalError; + var es5 = _dereq_("./es5"); + + function isUntypedError(obj) { + return obj instanceof Error && + es5.getPrototypeOf(obj) === Error.prototype; + } + + var rErrorKey = /^(?:name|message|stack|cause)$/; + function wrapAsOperationalError(obj) { + var ret; + if (isUntypedError(obj)) { + ret = new OperationalError(obj); + ret.name = obj.name; + ret.message = obj.message; + ret.stack = obj.stack; + var keys = es5.keys(obj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (!rErrorKey.test(key)) { + ret[key] = obj[key]; + } + } + return ret; + } + util.markAsOriginatingFromRejection(obj); + return obj; + } + + function nodebackForPromise(promise, multiArgs) { + return function(err, value) { + if (promise === null) return; + if (err) { + var wrapped = wrapAsOperationalError(maybeWrapAsError(err)); + promise._attachExtraTrace(wrapped); + promise._reject(wrapped); + } else if (!multiArgs) { + promise._fulfill(value); + } else { + var args = [].slice.call(arguments, 1);; + promise._fulfill(args); + } + promise = null; + }; + } + + module.exports = nodebackForPromise; + + },{"./errors":12,"./es5":13,"./util":36}],21:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function(Promise) { + var util = _dereq_("./util"); + var async = Promise._async; + var tryCatch = util.tryCatch; + var errorObj = util.errorObj; + + function spreadAdapter(val, nodeback) { + var promise = this; + if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback); + var ret = + tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val)); + if (ret === errorObj) { + async.throwLater(ret.e); + } + } + + function successAdapter(val, nodeback) { + var promise = this; + var receiver = promise._boundValue(); + var ret = val === undefined + ? tryCatch(nodeback).call(receiver, null) + : tryCatch(nodeback).call(receiver, null, val); + if (ret === errorObj) { + async.throwLater(ret.e); + } + } + function errorAdapter(reason, nodeback) { + var promise = this; + if (!reason) { + var newReason = new Error(reason + ""); + newReason.cause = reason; + reason = newReason; + } + var ret = tryCatch(nodeback).call(promise._boundValue(), reason); + if (ret === errorObj) { + async.throwLater(ret.e); + } + } + + Promise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback, + options) { + if (typeof nodeback == "function") { + var adapter = successAdapter; + if (options !== undefined && Object(options).spread) { + adapter = spreadAdapter; + } + this._then( + adapter, + errorAdapter, + undefined, + this, + nodeback + ); + } + return this; + }; + }; + + },{"./util":36}],22:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function() { + var makeSelfResolutionError = function () { + return new TypeError("circular promise resolution chain\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + }; + var reflectHandler = function() { + return new Promise.PromiseInspection(this._target()); + }; + var apiRejection = function(msg) { + return Promise.reject(new TypeError(msg)); + }; + function Proxyable() {} + var UNDEFINED_BINDING = {}; + var util = _dereq_("./util"); + + var getDomain; + if (util.isNode) { + getDomain = function() { + var ret = process.domain; + if (ret === undefined) ret = null; + return ret; + }; + } else { + getDomain = function() { + return null; + }; + } + util.notEnumerableProp(Promise, "_getDomain", getDomain); + + var es5 = _dereq_("./es5"); + var Async = _dereq_("./async"); + var async = new Async(); + es5.defineProperty(Promise, "_async", {value: async}); + var errors = _dereq_("./errors"); + var TypeError = Promise.TypeError = errors.TypeError; + Promise.RangeError = errors.RangeError; + var CancellationError = Promise.CancellationError = errors.CancellationError; + Promise.TimeoutError = errors.TimeoutError; + Promise.OperationalError = errors.OperationalError; + Promise.RejectionError = errors.OperationalError; + Promise.AggregateError = errors.AggregateError; + var INTERNAL = function(){}; + var APPLY = {}; + var NEXT_FILTER = {}; + var tryConvertToPromise = _dereq_("./thenables")(Promise, INTERNAL); + var PromiseArray = + _dereq_("./promise_array")(Promise, INTERNAL, + tryConvertToPromise, apiRejection, Proxyable); + var Context = _dereq_("./context")(Promise); + /*jshint unused:false*/ + var createContext = Context.create; + var debug = _dereq_("./debuggability")(Promise, Context); + var CapturedTrace = debug.CapturedTrace; + var PassThroughHandlerContext = + _dereq_("./finally")(Promise, tryConvertToPromise); + var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER); + var nodebackForPromise = _dereq_("./nodeback"); + var errorObj = util.errorObj; + var tryCatch = util.tryCatch; + function check(self, executor) { + if (typeof executor !== "function") { + throw new TypeError("expecting a function but got " + util.classString(executor)); + } + if (self.constructor !== Promise) { + throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + } + + function Promise(executor) { + this._bitField = 0; + this._fulfillmentHandler0 = undefined; + this._rejectionHandler0 = undefined; + this._promise0 = undefined; + this._receiver0 = undefined; + if (executor !== INTERNAL) { + check(this, executor); + this._resolveFromExecutor(executor); + } + this._promiseCreated(); + this._fireEvent("promiseCreated", this); + } + + Promise.prototype.toString = function () { + return "[object Promise]"; + }; + + Promise.prototype.caught = Promise.prototype["catch"] = function (fn) { + var len = arguments.length; + if (len > 1) { + var catchInstances = new Array(len - 1), + j = 0, i; + for (i = 0; i < len - 1; ++i) { + var item = arguments[i]; + if (util.isObject(item)) { + catchInstances[j++] = item; + } else { + return apiRejection("expecting an object but got " + + "A catch statement predicate " + util.classString(item)); + } + } + catchInstances.length = j; + fn = arguments[i]; + return this.then(undefined, catchFilter(catchInstances, fn, this)); + } + return this.then(undefined, fn); + }; + + Promise.prototype.reflect = function () { + return this._then(reflectHandler, + reflectHandler, undefined, this, undefined); + }; + + Promise.prototype.then = function (didFulfill, didReject) { + if (debug.warnings() && arguments.length > 0 && + typeof didFulfill !== "function" && + typeof didReject !== "function") { + var msg = ".then() only accepts functions but was passed: " + + util.classString(didFulfill); + if (arguments.length > 1) { + msg += ", " + util.classString(didReject); + } + this._warn(msg); + } + return this._then(didFulfill, didReject, undefined, undefined, undefined); + }; + + Promise.prototype.done = function (didFulfill, didReject) { + var promise = + this._then(didFulfill, didReject, undefined, undefined, undefined); + promise._setIsFinal(); + }; + + Promise.prototype.spread = function (fn) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + return this.all()._then(fn, undefined, undefined, APPLY, undefined); + }; + + Promise.prototype.toJSON = function () { + var ret = { + isFulfilled: false, + isRejected: false, + fulfillmentValue: undefined, + rejectionReason: undefined + }; + if (this.isFulfilled()) { + ret.fulfillmentValue = this.value(); + ret.isFulfilled = true; + } else if (this.isRejected()) { + ret.rejectionReason = this.reason(); + ret.isRejected = true; + } + return ret; + }; + + Promise.prototype.all = function () { + if (arguments.length > 0) { + this._warn(".all() was passed arguments but it does not take any"); + } + return new PromiseArray(this).promise(); + }; + + Promise.prototype.error = function (fn) { + return this.caught(util.originatesFromRejection, fn); + }; + + Promise.getNewLibraryCopy = module.exports; + + Promise.is = function (val) { + return val instanceof Promise; + }; + + Promise.fromNode = Promise.fromCallback = function(fn) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs + : false; + var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs)); + if (result === errorObj) { + ret._rejectCallback(result.e, true); + } + if (!ret._isFateSealed()) ret._setAsyncGuaranteed(); + return ret; + }; + + Promise.all = function (promises) { + return new PromiseArray(promises).promise(); + }; + + Promise.cast = function (obj) { + var ret = tryConvertToPromise(obj); + if (!(ret instanceof Promise)) { + ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._setFulfilled(); + ret._rejectionHandler0 = obj; + } + return ret; + }; + + Promise.resolve = Promise.fulfilled = Promise.cast; + + Promise.reject = Promise.rejected = function (reason) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._rejectCallback(reason, true); + return ret; + }; + + Promise.setScheduler = function(fn) { + if (typeof fn !== "function") { + throw new TypeError("expecting a function but got " + util.classString(fn)); + } + return async.setScheduler(fn); + }; + + Promise.prototype._then = function ( + didFulfill, + didReject, + _, receiver, + internalData + ) { + var haveInternalData = internalData !== undefined; + var promise = haveInternalData ? internalData : new Promise(INTERNAL); + var target = this._target(); + var bitField = target._bitField; + + if (!haveInternalData) { + promise._propagateFrom(this, 3); + promise._captureStackTrace(); + if (receiver === undefined && + ((this._bitField & 2097152) !== 0)) { + if (!((bitField & 50397184) === 0)) { + receiver = this._boundValue(); + } else { + receiver = target === this ? undefined : this._boundTo; + } + } + this._fireEvent("promiseChained", this, promise); + } + + var domain = getDomain(); + if (!((bitField & 50397184) === 0)) { + var handler, value, settler = target._settlePromiseCtx; + if (((bitField & 33554432) !== 0)) { + value = target._rejectionHandler0; + handler = didFulfill; + } else if (((bitField & 16777216) !== 0)) { + value = target._fulfillmentHandler0; + handler = didReject; + target._unsetRejectionIsUnhandled(); + } else { + settler = target._settlePromiseLateCancellationObserver; + value = new CancellationError("late cancellation observer"); + target._attachExtraTrace(value); + handler = didReject; + } + + async.invoke(settler, target, { + handler: domain === null ? handler + : (typeof handler === "function" && + util.domainBind(domain, handler)), + promise: promise, + receiver: receiver, + value: value + }); + } else { + target._addCallbacks(didFulfill, didReject, promise, receiver, domain); + } + + return promise; + }; + + Promise.prototype._length = function () { + return this._bitField & 65535; + }; + + Promise.prototype._isFateSealed = function () { + return (this._bitField & 117506048) !== 0; + }; + + Promise.prototype._isFollowing = function () { + return (this._bitField & 67108864) === 67108864; + }; + + Promise.prototype._setLength = function (len) { + this._bitField = (this._bitField & -65536) | + (len & 65535); + }; + + Promise.prototype._setFulfilled = function () { + this._bitField = this._bitField | 33554432; + this._fireEvent("promiseFulfilled", this); + }; + + Promise.prototype._setRejected = function () { + this._bitField = this._bitField | 16777216; + this._fireEvent("promiseRejected", this); + }; + + Promise.prototype._setFollowing = function () { + this._bitField = this._bitField | 67108864; + this._fireEvent("promiseResolved", this); + }; + + Promise.prototype._setIsFinal = function () { + this._bitField = this._bitField | 4194304; + }; + + Promise.prototype._isFinal = function () { + return (this._bitField & 4194304) > 0; + }; + + Promise.prototype._unsetCancelled = function() { + this._bitField = this._bitField & (~65536); + }; + + Promise.prototype._setCancelled = function() { + this._bitField = this._bitField | 65536; + this._fireEvent("promiseCancelled", this); + }; + + Promise.prototype._setWillBeCancelled = function() { + this._bitField = this._bitField | 8388608; + }; + + Promise.prototype._setAsyncGuaranteed = function() { + if (async.hasCustomScheduler()) return; + this._bitField = this._bitField | 134217728; + }; + + Promise.prototype._receiverAt = function (index) { + var ret = index === 0 ? this._receiver0 : this[ + index * 4 - 4 + 3]; + if (ret === UNDEFINED_BINDING) { + return undefined; + } else if (ret === undefined && this._isBound()) { + return this._boundValue(); + } + return ret; + }; + + Promise.prototype._promiseAt = function (index) { + return this[ + index * 4 - 4 + 2]; + }; + + Promise.prototype._fulfillmentHandlerAt = function (index) { + return this[ + index * 4 - 4 + 0]; + }; + + Promise.prototype._rejectionHandlerAt = function (index) { + return this[ + index * 4 - 4 + 1]; + }; + + Promise.prototype._boundValue = function() {}; + + Promise.prototype._migrateCallback0 = function (follower) { + var bitField = follower._bitField; + var fulfill = follower._fulfillmentHandler0; + var reject = follower._rejectionHandler0; + var promise = follower._promise0; + var receiver = follower._receiverAt(0); + if (receiver === undefined) receiver = UNDEFINED_BINDING; + this._addCallbacks(fulfill, reject, promise, receiver, null); + }; + + Promise.prototype._migrateCallbackAt = function (follower, index) { + var fulfill = follower._fulfillmentHandlerAt(index); + var reject = follower._rejectionHandlerAt(index); + var promise = follower._promiseAt(index); + var receiver = follower._receiverAt(index); + if (receiver === undefined) receiver = UNDEFINED_BINDING; + this._addCallbacks(fulfill, reject, promise, receiver, null); + }; + + Promise.prototype._addCallbacks = function ( + fulfill, + reject, + promise, + receiver, + domain + ) { + var index = this._length(); + + if (index >= 65535 - 4) { + index = 0; + this._setLength(0); + } + + if (index === 0) { + this._promise0 = promise; + this._receiver0 = receiver; + if (typeof fulfill === "function") { + this._fulfillmentHandler0 = + domain === null ? fulfill : util.domainBind(domain, fulfill); + } + if (typeof reject === "function") { + this._rejectionHandler0 = + domain === null ? reject : util.domainBind(domain, reject); + } + } else { + var base = index * 4 - 4; + this[base + 2] = promise; + this[base + 3] = receiver; + if (typeof fulfill === "function") { + this[base + 0] = + domain === null ? fulfill : util.domainBind(domain, fulfill); + } + if (typeof reject === "function") { + this[base + 1] = + domain === null ? reject : util.domainBind(domain, reject); + } + } + this._setLength(index + 1); + return index; + }; + + Promise.prototype._proxy = function (proxyable, arg) { + this._addCallbacks(undefined, undefined, arg, proxyable, null); + }; + + Promise.prototype._resolveCallback = function(value, shouldBind) { + if (((this._bitField & 117506048) !== 0)) return; + if (value === this) + return this._rejectCallback(makeSelfResolutionError(), false); + var maybePromise = tryConvertToPromise(value, this); + if (!(maybePromise instanceof Promise)) return this._fulfill(value); + + if (shouldBind) this._propagateFrom(maybePromise, 2); + + var promise = maybePromise._target(); + + if (promise === this) { + this._reject(makeSelfResolutionError()); + return; + } + + var bitField = promise._bitField; + if (((bitField & 50397184) === 0)) { + var len = this._length(); + if (len > 0) promise._migrateCallback0(this); + for (var i = 1; i < len; ++i) { + promise._migrateCallbackAt(this, i); + } + this._setFollowing(); + this._setLength(0); + this._setFollowee(promise); + } else if (((bitField & 33554432) !== 0)) { + this._fulfill(promise._value()); + } else if (((bitField & 16777216) !== 0)) { + this._reject(promise._reason()); + } else { + var reason = new CancellationError("late cancellation observer"); + promise._attachExtraTrace(reason); + this._reject(reason); + } + }; + + Promise.prototype._rejectCallback = + function(reason, synchronous, ignoreNonErrorWarnings) { + var trace = util.ensureErrorObject(reason); + var hasStack = trace === reason; + if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) { + var message = "a promise was rejected with a non-error: " + + util.classString(reason); + this._warn(message, true); + } + this._attachExtraTrace(trace, synchronous ? hasStack : false); + this._reject(reason); + }; + + Promise.prototype._resolveFromExecutor = function (executor) { + var promise = this; + this._captureStackTrace(); + this._pushContext(); + var synchronous = true; + var r = this._execute(executor, function(value) { + promise._resolveCallback(value); + }, function (reason) { + promise._rejectCallback(reason, synchronous); + }); + synchronous = false; + this._popContext(); + + if (r !== undefined) { + promise._rejectCallback(r, true); + } + }; + + Promise.prototype._settlePromiseFromHandler = function ( + handler, receiver, value, promise + ) { + var bitField = promise._bitField; + if (((bitField & 65536) !== 0)) return; + promise._pushContext(); + var x; + if (receiver === APPLY) { + if (!value || typeof value.length !== "number") { + x = errorObj; + x.e = new TypeError("cannot .spread() a non-array: " + + util.classString(value)); + } else { + x = tryCatch(handler).apply(this._boundValue(), value); + } + } else { + x = tryCatch(handler).call(receiver, value); + } + var promiseCreated = promise._popContext(); + bitField = promise._bitField; + if (((bitField & 65536) !== 0)) return; + + if (x === NEXT_FILTER) { + promise._reject(value); + } else if (x === errorObj) { + promise._rejectCallback(x.e, false); + } else { + debug.checkForgottenReturns(x, promiseCreated, "", promise, this); + promise._resolveCallback(x); + } + }; + + Promise.prototype._target = function() { + var ret = this; + while (ret._isFollowing()) ret = ret._followee(); + return ret; + }; + + Promise.prototype._followee = function() { + return this._rejectionHandler0; + }; + + Promise.prototype._setFollowee = function(promise) { + this._rejectionHandler0 = promise; + }; + + Promise.prototype._settlePromise = function(promise, handler, receiver, value) { + var isPromise = promise instanceof Promise; + var bitField = this._bitField; + var asyncGuaranteed = ((bitField & 134217728) !== 0); + if (((bitField & 65536) !== 0)) { + if (isPromise) promise._invokeInternalOnCancel(); + + if (receiver instanceof PassThroughHandlerContext && + receiver.isFinallyHandler()) { + receiver.cancelPromise = promise; + if (tryCatch(handler).call(receiver, value) === errorObj) { + promise._reject(errorObj.e); + } + } else if (handler === reflectHandler) { + promise._fulfill(reflectHandler.call(receiver)); + } else if (receiver instanceof Proxyable) { + receiver._promiseCancelled(promise); + } else if (isPromise || promise instanceof PromiseArray) { + promise._cancel(); + } else { + receiver.cancel(); + } + } else if (typeof handler === "function") { + if (!isPromise) { + handler.call(receiver, value, promise); + } else { + if (asyncGuaranteed) promise._setAsyncGuaranteed(); + this._settlePromiseFromHandler(handler, receiver, value, promise); + } + } else if (receiver instanceof Proxyable) { + if (!receiver._isResolved()) { + if (((bitField & 33554432) !== 0)) { + receiver._promiseFulfilled(value, promise); + } else { + receiver._promiseRejected(value, promise); + } + } + } else if (isPromise) { + if (asyncGuaranteed) promise._setAsyncGuaranteed(); + if (((bitField & 33554432) !== 0)) { + promise._fulfill(value); + } else { + promise._reject(value); + } + } + }; + + Promise.prototype._settlePromiseLateCancellationObserver = function(ctx) { + var handler = ctx.handler; + var promise = ctx.promise; + var receiver = ctx.receiver; + var value = ctx.value; + if (typeof handler === "function") { + if (!(promise instanceof Promise)) { + handler.call(receiver, value, promise); + } else { + this._settlePromiseFromHandler(handler, receiver, value, promise); + } + } else if (promise instanceof Promise) { + promise._reject(value); + } + }; + + Promise.prototype._settlePromiseCtx = function(ctx) { + this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value); + }; + + Promise.prototype._settlePromise0 = function(handler, value, bitField) { + var promise = this._promise0; + var receiver = this._receiverAt(0); + this._promise0 = undefined; + this._receiver0 = undefined; + this._settlePromise(promise, handler, receiver, value); + }; + + Promise.prototype._clearCallbackDataAtIndex = function(index) { + var base = index * 4 - 4; + this[base + 2] = + this[base + 3] = + this[base + 0] = + this[base + 1] = undefined; + }; + + Promise.prototype._fulfill = function (value) { + var bitField = this._bitField; + if (((bitField & 117506048) >>> 16)) return; + if (value === this) { + var err = makeSelfResolutionError(); + this._attachExtraTrace(err); + return this._reject(err); + } + this._setFulfilled(); + this._rejectionHandler0 = value; + + if ((bitField & 65535) > 0) { + if (((bitField & 134217728) !== 0)) { + this._settlePromises(); + } else { + async.settlePromises(this); + } + } + }; + + Promise.prototype._reject = function (reason) { + var bitField = this._bitField; + if (((bitField & 117506048) >>> 16)) return; + this._setRejected(); + this._fulfillmentHandler0 = reason; + + if (this._isFinal()) { + return async.fatalError(reason, util.isNode); + } + + if ((bitField & 65535) > 0) { + async.settlePromises(this); + } else { + this._ensurePossibleRejectionHandled(); + } + }; + + Promise.prototype._fulfillPromises = function (len, value) { + for (var i = 1; i < len; i++) { + var handler = this._fulfillmentHandlerAt(i); + var promise = this._promiseAt(i); + var receiver = this._receiverAt(i); + this._clearCallbackDataAtIndex(i); + this._settlePromise(promise, handler, receiver, value); + } + }; + + Promise.prototype._rejectPromises = function (len, reason) { + for (var i = 1; i < len; i++) { + var handler = this._rejectionHandlerAt(i); + var promise = this._promiseAt(i); + var receiver = this._receiverAt(i); + this._clearCallbackDataAtIndex(i); + this._settlePromise(promise, handler, receiver, reason); + } + }; + + Promise.prototype._settlePromises = function () { + var bitField = this._bitField; + var len = (bitField & 65535); + + if (len > 0) { + if (((bitField & 16842752) !== 0)) { + var reason = this._fulfillmentHandler0; + this._settlePromise0(this._rejectionHandler0, reason, bitField); + this._rejectPromises(len, reason); + } else { + var value = this._rejectionHandler0; + this._settlePromise0(this._fulfillmentHandler0, value, bitField); + this._fulfillPromises(len, value); + } + this._setLength(0); + } + this._clearCancellationData(); + }; + + Promise.prototype._settledValue = function() { + var bitField = this._bitField; + if (((bitField & 33554432) !== 0)) { + return this._rejectionHandler0; + } else if (((bitField & 16777216) !== 0)) { + return this._fulfillmentHandler0; + } + }; + + function deferResolve(v) {this.promise._resolveCallback(v);} + function deferReject(v) {this.promise._rejectCallback(v, false);} + + Promise.defer = Promise.pending = function() { + debug.deprecated("Promise.defer", "new Promise"); + var promise = new Promise(INTERNAL); + return { + promise: promise, + resolve: deferResolve, + reject: deferReject + }; + }; + + util.notEnumerableProp(Promise, + "_makeSelfResolutionError", + makeSelfResolutionError); + + _dereq_("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection, + debug); + _dereq_("./bind")(Promise, INTERNAL, tryConvertToPromise, debug); + _dereq_("./cancel")(Promise, PromiseArray, apiRejection, debug); + _dereq_("./direct_resolve")(Promise); + _dereq_("./synchronous_inspection")(Promise); + _dereq_("./join")( + Promise, PromiseArray, tryConvertToPromise, INTERNAL, async, getDomain); + Promise.Promise = Promise; + Promise.version = "3.4.7"; + _dereq_('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug); + _dereq_('./call_get.js')(Promise); + _dereq_('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug); + _dereq_('./timers.js')(Promise, INTERNAL, debug); + _dereq_('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug); + _dereq_('./nodeify.js')(Promise); + _dereq_('./promisify.js')(Promise, INTERNAL); + _dereq_('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection); + _dereq_('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection); + _dereq_('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug); + _dereq_('./settle.js')(Promise, PromiseArray, debug); + _dereq_('./some.js')(Promise, PromiseArray, apiRejection); + _dereq_('./filter.js')(Promise, INTERNAL); + _dereq_('./each.js')(Promise, INTERNAL); + _dereq_('./any.js')(Promise); + + util.toFastProperties(Promise); + util.toFastProperties(Promise.prototype); + function fillTypes(value) { + var p = new Promise(INTERNAL); + p._fulfillmentHandler0 = value; + p._rejectionHandler0 = value; + p._promise0 = value; + p._receiver0 = value; + } + // Complete slack tracking, opt out of field-type tracking and + // stabilize map + fillTypes({a: 1}); + fillTypes({b: 2}); + fillTypes({c: 3}); + fillTypes(1); + fillTypes(function(){}); + fillTypes(undefined); + fillTypes(false); + fillTypes(new Promise(INTERNAL)); + debug.setBounds(Async.firstLineError, util.lastLineError); + return Promise; + + }; + + },{"./any.js":1,"./async":2,"./bind":3,"./call_get.js":5,"./cancel":6,"./catch_filter":7,"./context":8,"./debuggability":9,"./direct_resolve":10,"./each.js":11,"./errors":12,"./es5":13,"./filter.js":14,"./finally":15,"./generators.js":16,"./join":17,"./map.js":18,"./method":19,"./nodeback":20,"./nodeify.js":21,"./promise_array":23,"./promisify.js":24,"./props.js":25,"./race.js":27,"./reduce.js":28,"./settle.js":30,"./some.js":31,"./synchronous_inspection":32,"./thenables":33,"./timers.js":34,"./using.js":35,"./util":36}],23:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function(Promise, INTERNAL, tryConvertToPromise, + apiRejection, Proxyable) { + var util = _dereq_("./util"); + var isArray = util.isArray; + + function toResolutionValue(val) { + switch(val) { + case -2: return []; + case -3: return {}; + } + } + + function PromiseArray(values) { + var promise = this._promise = new Promise(INTERNAL); + if (values instanceof Promise) { + promise._propagateFrom(values, 3); + } + promise._setOnCancel(this); + this._values = values; + this._length = 0; + this._totalResolved = 0; + this._init(undefined, -2); + } + util.inherits(PromiseArray, Proxyable); + + PromiseArray.prototype.length = function () { + return this._length; + }; + + PromiseArray.prototype.promise = function () { + return this._promise; + }; + + PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) { + var values = tryConvertToPromise(this._values, this._promise); + if (values instanceof Promise) { + values = values._target(); + var bitField = values._bitField; + ; + this._values = values; + + if (((bitField & 50397184) === 0)) { + this._promise._setAsyncGuaranteed(); + return values._then( + init, + this._reject, + undefined, + this, + resolveValueIfEmpty + ); + } else if (((bitField & 33554432) !== 0)) { + values = values._value(); + } else if (((bitField & 16777216) !== 0)) { + return this._reject(values._reason()); + } else { + return this._cancel(); + } + } + values = util.asArray(values); + if (values === null) { + var err = apiRejection( + "expecting an array or an iterable object but got " + util.classString(values)).reason(); + this._promise._rejectCallback(err, false); + return; + } + + if (values.length === 0) { + if (resolveValueIfEmpty === -5) { + this._resolveEmptyArray(); + } + else { + this._resolve(toResolutionValue(resolveValueIfEmpty)); + } + return; + } + this._iterate(values); + }; + + PromiseArray.prototype._iterate = function(values) { + var len = this.getActualLength(values.length); + this._length = len; + this._values = this.shouldCopyValues() ? new Array(len) : this._values; + var result = this._promise; + var isResolved = false; + var bitField = null; + for (var i = 0; i < len; ++i) { + var maybePromise = tryConvertToPromise(values[i], result); + + if (maybePromise instanceof Promise) { + maybePromise = maybePromise._target(); + bitField = maybePromise._bitField; + } else { + bitField = null; + } + + if (isResolved) { + if (bitField !== null) { + maybePromise.suppressUnhandledRejections(); + } + } else if (bitField !== null) { + if (((bitField & 50397184) === 0)) { + maybePromise._proxy(this, i); + this._values[i] = maybePromise; + } else if (((bitField & 33554432) !== 0)) { + isResolved = this._promiseFulfilled(maybePromise._value(), i); + } else if (((bitField & 16777216) !== 0)) { + isResolved = this._promiseRejected(maybePromise._reason(), i); + } else { + isResolved = this._promiseCancelled(i); + } + } else { + isResolved = this._promiseFulfilled(maybePromise, i); + } + } + if (!isResolved) result._setAsyncGuaranteed(); + }; + + PromiseArray.prototype._isResolved = function () { + return this._values === null; + }; + + PromiseArray.prototype._resolve = function (value) { + this._values = null; + this._promise._fulfill(value); + }; + + PromiseArray.prototype._cancel = function() { + if (this._isResolved() || !this._promise._isCancellable()) return; + this._values = null; + this._promise._cancel(); + }; + + PromiseArray.prototype._reject = function (reason) { + this._values = null; + this._promise._rejectCallback(reason, false); + }; + + PromiseArray.prototype._promiseFulfilled = function (value, index) { + this._values[index] = value; + var totalResolved = ++this._totalResolved; + if (totalResolved >= this._length) { + this._resolve(this._values); + return true; + } + return false; + }; + + PromiseArray.prototype._promiseCancelled = function() { + this._cancel(); + return true; + }; + + PromiseArray.prototype._promiseRejected = function (reason) { + this._totalResolved++; + this._reject(reason); + return true; + }; + + PromiseArray.prototype._resultCancelled = function() { + if (this._isResolved()) return; + var values = this._values; + this._cancel(); + if (values instanceof Promise) { + values.cancel(); + } else { + for (var i = 0; i < values.length; ++i) { + if (values[i] instanceof Promise) { + values[i].cancel(); + } + } + } + }; + + PromiseArray.prototype.shouldCopyValues = function () { + return true; + }; + + PromiseArray.prototype.getActualLength = function (len) { + return len; + }; + + return PromiseArray; + }; + + },{"./util":36}],24:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function(Promise, INTERNAL) { + var THIS = {}; + var util = _dereq_("./util"); + var nodebackForPromise = _dereq_("./nodeback"); + var withAppended = util.withAppended; + var maybeWrapAsError = util.maybeWrapAsError; + var canEvaluate = util.canEvaluate; + var TypeError = _dereq_("./errors").TypeError; + var defaultSuffix = "Async"; + var defaultPromisified = {__isPromisified__: true}; + var noCopyProps = [ + "arity", "length", + "name", + "arguments", + "caller", + "callee", + "prototype", + "__isPromisified__" + ]; + var noCopyPropsPattern = new RegExp("^(?:" + noCopyProps.join("|") + ")$"); + + var defaultFilter = function(name) { + return util.isIdentifier(name) && + name.charAt(0) !== "_" && + name !== "constructor"; + }; + + function propsFilter(key) { + return !noCopyPropsPattern.test(key); + } + + function isPromisified(fn) { + try { + return fn.__isPromisified__ === true; + } + catch (e) { + return false; + } + } + + function hasPromisified(obj, key, suffix) { + var val = util.getDataPropertyOrDefault(obj, key + suffix, + defaultPromisified); + return val ? isPromisified(val) : false; + } + function checkValid(ret, suffix, suffixRegexp) { + for (var i = 0; i < ret.length; i += 2) { + var key = ret[i]; + if (suffixRegexp.test(key)) { + var keyWithoutAsyncSuffix = key.replace(suffixRegexp, ""); + for (var j = 0; j < ret.length; j += 2) { + if (ret[j] === keyWithoutAsyncSuffix) { + throw new TypeError("Cannot promisify an API that has normal methods with '%s'-suffix\u000a\u000a See http://goo.gl/MqrFmX\u000a" + .replace("%s", suffix)); + } + } + } + } + } + + function promisifiableMethods(obj, suffix, suffixRegexp, filter) { + var keys = util.inheritedDataKeys(obj); + var ret = []; + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + var value = obj[key]; + var passesDefaultFilter = filter === defaultFilter + ? true : defaultFilter(key, value, obj); + if (typeof value === "function" && + !isPromisified(value) && + !hasPromisified(obj, key, suffix) && + filter(key, value, obj, passesDefaultFilter)) { + ret.push(key, value); + } + } + checkValid(ret, suffix, suffixRegexp); + return ret; + } + + var escapeIdentRegex = function(str) { + return str.replace(/([$])/, "\\$"); + }; + + var makeNodePromisifiedEval; + if (false) { + var switchCaseArgumentOrder = function(likelyArgumentCount) { + var ret = [likelyArgumentCount]; + var min = Math.max(0, likelyArgumentCount - 1 - 3); + for(var i = likelyArgumentCount - 1; i >= min; --i) { + ret.push(i); + } + for(var i = likelyArgumentCount + 1; i <= 3; ++i) { + ret.push(i); + } + return ret; + }; + + var argumentSequence = function(argumentCount) { + return util.filledRange(argumentCount, "_arg", ""); + }; + + var parameterDeclaration = function(parameterCount) { + return util.filledRange( + Math.max(parameterCount, 3), "_arg", ""); + }; + + var parameterCount = function(fn) { + if (typeof fn.length === "number") { + return Math.max(Math.min(fn.length, 1023 + 1), 0); + } + return 0; + }; + + makeNodePromisifiedEval = + function(callback, receiver, originalName, fn, _, multiArgs) { + var newParameterCount = Math.max(0, parameterCount(fn) - 1); + var argumentOrder = switchCaseArgumentOrder(newParameterCount); + var shouldProxyThis = typeof callback === "string" || receiver === THIS; + + function generateCallForArgumentCount(count) { + var args = argumentSequence(count).join(", "); + var comma = count > 0 ? ", " : ""; + var ret; + if (shouldProxyThis) { + ret = "ret = callback.call(this, {{args}}, nodeback); break;\n"; + } else { + ret = receiver === undefined + ? "ret = callback({{args}}, nodeback); break;\n" + : "ret = callback.call(receiver, {{args}}, nodeback); break;\n"; + } + return ret.replace("{{args}}", args).replace(", ", comma); + } + + function generateArgumentSwitchCase() { + var ret = ""; + for (var i = 0; i < argumentOrder.length; ++i) { + ret += "case " + argumentOrder[i] +":" + + generateCallForArgumentCount(argumentOrder[i]); + } + + ret += " \n\ + default: \n\ + var args = new Array(len + 1); \n\ + var i = 0; \n\ + for (var i = 0; i < len; ++i) { \n\ + args[i] = arguments[i]; \n\ + } \n\ + args[i] = nodeback; \n\ + [CodeForCall] \n\ + break; \n\ + ".replace("[CodeForCall]", (shouldProxyThis + ? "ret = callback.apply(this, args);\n" + : "ret = callback.apply(receiver, args);\n")); + return ret; + } + + var getFunctionCode = typeof callback === "string" + ? ("this != null ? this['"+callback+"'] : fn") + : "fn"; + var body = "'use strict'; \n\ + var ret = function (Parameters) { \n\ + 'use strict'; \n\ + var len = arguments.length; \n\ + var promise = new Promise(INTERNAL); \n\ + promise._captureStackTrace(); \n\ + var nodeback = nodebackForPromise(promise, " + multiArgs + "); \n\ + var ret; \n\ + var callback = tryCatch([GetFunctionCode]); \n\ + switch(len) { \n\ + [CodeForSwitchCase] \n\ + } \n\ + if (ret === errorObj) { \n\ + promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\n\ + } \n\ + if (!promise._isFateSealed()) promise._setAsyncGuaranteed(); \n\ + return promise; \n\ + }; \n\ + notEnumerableProp(ret, '__isPromisified__', true); \n\ + return ret; \n\ + ".replace("[CodeForSwitchCase]", generateArgumentSwitchCase()) + .replace("[GetFunctionCode]", getFunctionCode); + body = body.replace("Parameters", parameterDeclaration(newParameterCount)); + return new Function("Promise", + "fn", + "receiver", + "withAppended", + "maybeWrapAsError", + "nodebackForPromise", + "tryCatch", + "errorObj", + "notEnumerableProp", + "INTERNAL", + body)( + Promise, + fn, + receiver, + withAppended, + maybeWrapAsError, + nodebackForPromise, + util.tryCatch, + util.errorObj, + util.notEnumerableProp, + INTERNAL); + }; + } + + function makeNodePromisifiedClosure(callback, receiver, _, fn, __, multiArgs) { + var defaultThis = (function() {return this;})(); + var method = callback; + if (typeof method === "string") { + callback = fn; + } + function promisified() { + var _receiver = receiver; + if (receiver === THIS) _receiver = this; + var promise = new Promise(INTERNAL); + promise._captureStackTrace(); + var cb = typeof method === "string" && this !== defaultThis + ? this[method] : callback; + var fn = nodebackForPromise(promise, multiArgs); + try { + cb.apply(_receiver, withAppended(arguments, fn)); + } catch(e) { + promise._rejectCallback(maybeWrapAsError(e), true, true); + } + if (!promise._isFateSealed()) promise._setAsyncGuaranteed(); + return promise; + } + util.notEnumerableProp(promisified, "__isPromisified__", true); + return promisified; + } + + var makeNodePromisified = canEvaluate + ? makeNodePromisifiedEval + : makeNodePromisifiedClosure; + + function promisifyAll(obj, suffix, filter, promisifier, multiArgs) { + var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + "$"); + var methods = + promisifiableMethods(obj, suffix, suffixRegexp, filter); + + for (var i = 0, len = methods.length; i < len; i+= 2) { + var key = methods[i]; + var fn = methods[i+1]; + var promisifiedKey = key + suffix; + if (promisifier === makeNodePromisified) { + obj[promisifiedKey] = + makeNodePromisified(key, THIS, key, fn, suffix, multiArgs); + } else { + var promisified = promisifier(fn, function() { + return makeNodePromisified(key, THIS, key, + fn, suffix, multiArgs); + }); + util.notEnumerableProp(promisified, "__isPromisified__", true); + obj[promisifiedKey] = promisified; + } + } + util.toFastProperties(obj); + return obj; + } + + function promisify(callback, receiver, multiArgs) { + return makeNodePromisified(callback, receiver, undefined, + callback, null, multiArgs); + } + + Promise.promisify = function (fn, options) { + if (typeof fn !== "function") { + throw new TypeError("expecting a function but got " + util.classString(fn)); + } + if (isPromisified(fn)) { + return fn; + } + options = Object(options); + var receiver = options.context === undefined ? THIS : options.context; + var multiArgs = !!options.multiArgs; + var ret = promisify(fn, receiver, multiArgs); + util.copyDescriptors(fn, ret, propsFilter); + return ret; + }; + + Promise.promisifyAll = function (target, options) { + if (typeof target !== "function" && typeof target !== "object") { + throw new TypeError("the target of promisifyAll must be an object or a function\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + options = Object(options); + var multiArgs = !!options.multiArgs; + var suffix = options.suffix; + if (typeof suffix !== "string") suffix = defaultSuffix; + var filter = options.filter; + if (typeof filter !== "function") filter = defaultFilter; + var promisifier = options.promisifier; + if (typeof promisifier !== "function") promisifier = makeNodePromisified; + + if (!util.isIdentifier(suffix)) { + throw new RangeError("suffix must be a valid identifier\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + + var keys = util.inheritedDataKeys(target); + for (var i = 0; i < keys.length; ++i) { + var value = target[keys[i]]; + if (keys[i] !== "constructor" && + util.isClass(value)) { + promisifyAll(value.prototype, suffix, filter, promisifier, + multiArgs); + promisifyAll(value, suffix, filter, promisifier, multiArgs); + } + } + + return promisifyAll(target, suffix, filter, promisifier, multiArgs); + }; + }; + + + },{"./errors":12,"./nodeback":20,"./util":36}],25:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function( + Promise, PromiseArray, tryConvertToPromise, apiRejection) { + var util = _dereq_("./util"); + var isObject = util.isObject; + var es5 = _dereq_("./es5"); + var Es6Map; + if (typeof Map === "function") Es6Map = Map; + + var mapToEntries = (function() { + var index = 0; + var size = 0; + + function extractEntry(value, key) { + this[index] = value; + this[index + size] = key; + index++; + } + + return function mapToEntries(map) { + size = map.size; + index = 0; + var ret = new Array(map.size * 2); + map.forEach(extractEntry, ret); + return ret; + }; + })(); + + var entriesToMap = function(entries) { + var ret = new Es6Map(); + var length = entries.length / 2 | 0; + for (var i = 0; i < length; ++i) { + var key = entries[length + i]; + var value = entries[i]; + ret.set(key, value); + } + return ret; + }; + + function PropertiesPromiseArray(obj) { + var isMap = false; + var entries; + if (Es6Map !== undefined && obj instanceof Es6Map) { + entries = mapToEntries(obj); + isMap = true; + } else { + var keys = es5.keys(obj); + var len = keys.length; + entries = new Array(len * 2); + for (var i = 0; i < len; ++i) { + var key = keys[i]; + entries[i] = obj[key]; + entries[i + len] = key; + } + } + this.constructor$(entries); + this._isMap = isMap; + this._init$(undefined, -3); + } + util.inherits(PropertiesPromiseArray, PromiseArray); + + PropertiesPromiseArray.prototype._init = function () {}; + + PropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) { + this._values[index] = value; + var totalResolved = ++this._totalResolved; + if (totalResolved >= this._length) { + var val; + if (this._isMap) { + val = entriesToMap(this._values); + } else { + val = {}; + var keyOffset = this.length(); + for (var i = 0, len = this.length(); i < len; ++i) { + val[this._values[i + keyOffset]] = this._values[i]; + } + } + this._resolve(val); + return true; + } + return false; + }; + + PropertiesPromiseArray.prototype.shouldCopyValues = function () { + return false; + }; + + PropertiesPromiseArray.prototype.getActualLength = function (len) { + return len >> 1; + }; + + function props(promises) { + var ret; + var castValue = tryConvertToPromise(promises); + + if (!isObject(castValue)) { + return apiRejection("cannot await properties of a non-object\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } else if (castValue instanceof Promise) { + ret = castValue._then( + Promise.props, undefined, undefined, undefined, undefined); + } else { + ret = new PropertiesPromiseArray(castValue).promise(); + } + + if (castValue instanceof Promise) { + ret._propagateFrom(castValue, 2); + } + return ret; + } + + Promise.prototype.props = function () { + return props(this); + }; + + Promise.props = function (promises) { + return props(promises); + }; + }; + + },{"./es5":13,"./util":36}],26:[function(_dereq_,module,exports){ + "use strict"; + function arrayMove(src, srcIndex, dst, dstIndex, len) { + for (var j = 0; j < len; ++j) { + dst[j + dstIndex] = src[j + srcIndex]; + src[j + srcIndex] = void 0; + } + } + + function Queue(capacity) { + this._capacity = capacity; + this._length = 0; + this._front = 0; + } + + Queue.prototype._willBeOverCapacity = function (size) { + return this._capacity < size; + }; + + Queue.prototype._pushOne = function (arg) { + var length = this.length(); + this._checkCapacity(length + 1); + var i = (this._front + length) & (this._capacity - 1); + this[i] = arg; + this._length = length + 1; + }; + + Queue.prototype.push = function (fn, receiver, arg) { + var length = this.length() + 3; + if (this._willBeOverCapacity(length)) { + this._pushOne(fn); + this._pushOne(receiver); + this._pushOne(arg); + return; + } + var j = this._front + length - 3; + this._checkCapacity(length); + var wrapMask = this._capacity - 1; + this[(j + 0) & wrapMask] = fn; + this[(j + 1) & wrapMask] = receiver; + this[(j + 2) & wrapMask] = arg; + this._length = length; + }; + + Queue.prototype.shift = function () { + var front = this._front, + ret = this[front]; + + this[front] = undefined; + this._front = (front + 1) & (this._capacity - 1); + this._length--; + return ret; + }; + + Queue.prototype.length = function () { + return this._length; + }; + + Queue.prototype._checkCapacity = function (size) { + if (this._capacity < size) { + this._resizeTo(this._capacity << 1); + } + }; + + Queue.prototype._resizeTo = function (capacity) { + var oldCapacity = this._capacity; + this._capacity = capacity; + var front = this._front; + var length = this._length; + var moveItemsCount = (front + length) & (oldCapacity - 1); + arrayMove(this, 0, this, oldCapacity, moveItemsCount); + }; + + module.exports = Queue; + + },{}],27:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function( + Promise, INTERNAL, tryConvertToPromise, apiRejection) { + var util = _dereq_("./util"); + + var raceLater = function (promise) { + return promise.then(function(array) { + return race(array, promise); + }); + }; + + function race(promises, parent) { + var maybePromise = tryConvertToPromise(promises); + + if (maybePromise instanceof Promise) { + return raceLater(maybePromise); + } else { + promises = util.asArray(promises); + if (promises === null) + return apiRejection("expecting an array or an iterable object but got " + util.classString(promises)); + } + + var ret = new Promise(INTERNAL); + if (parent !== undefined) { + ret._propagateFrom(parent, 3); + } + var fulfill = ret._fulfill; + var reject = ret._reject; + for (var i = 0, len = promises.length; i < len; ++i) { + var val = promises[i]; + + if (val === undefined && !(i in promises)) { + continue; + } + + Promise.cast(val)._then(fulfill, reject, undefined, ret, null); + } + return ret; + } + + Promise.race = function (promises) { + return race(promises, undefined); + }; + + Promise.prototype.race = function () { + return race(this, undefined); + }; + + }; + + },{"./util":36}],28:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function(Promise, + PromiseArray, + apiRejection, + tryConvertToPromise, + INTERNAL, + debug) { + var getDomain = Promise._getDomain; + var util = _dereq_("./util"); + var tryCatch = util.tryCatch; + + function ReductionPromiseArray(promises, fn, initialValue, _each) { + this.constructor$(promises); + var domain = getDomain(); + this._fn = domain === null ? fn : util.domainBind(domain, fn); + if (initialValue !== undefined) { + initialValue = Promise.resolve(initialValue); + initialValue._attachCancellationCallback(this); + } + this._initialValue = initialValue; + this._currentCancellable = null; + if(_each === INTERNAL) { + this._eachValues = Array(this._length); + } else if (_each === 0) { + this._eachValues = null; + } else { + this._eachValues = undefined; + } + this._promise._captureStackTrace(); + this._init$(undefined, -5); + } + util.inherits(ReductionPromiseArray, PromiseArray); + + ReductionPromiseArray.prototype._gotAccum = function(accum) { + if (this._eachValues !== undefined && + this._eachValues !== null && + accum !== INTERNAL) { + this._eachValues.push(accum); + } + }; + + ReductionPromiseArray.prototype._eachComplete = function(value) { + if (this._eachValues !== null) { + this._eachValues.push(value); + } + return this._eachValues; + }; + + ReductionPromiseArray.prototype._init = function() {}; + + ReductionPromiseArray.prototype._resolveEmptyArray = function() { + this._resolve(this._eachValues !== undefined ? this._eachValues + : this._initialValue); + }; + + ReductionPromiseArray.prototype.shouldCopyValues = function () { + return false; + }; + + ReductionPromiseArray.prototype._resolve = function(value) { + this._promise._resolveCallback(value); + this._values = null; + }; + + ReductionPromiseArray.prototype._resultCancelled = function(sender) { + if (sender === this._initialValue) return this._cancel(); + if (this._isResolved()) return; + this._resultCancelled$(); + if (this._currentCancellable instanceof Promise) { + this._currentCancellable.cancel(); + } + if (this._initialValue instanceof Promise) { + this._initialValue.cancel(); + } + }; + + ReductionPromiseArray.prototype._iterate = function (values) { + this._values = values; + var value; + var i; + var length = values.length; + if (this._initialValue !== undefined) { + value = this._initialValue; + i = 0; + } else { + value = Promise.resolve(values[0]); + i = 1; + } + + this._currentCancellable = value; + + if (!value.isRejected()) { + for (; i < length; ++i) { + var ctx = { + accum: null, + value: values[i], + index: i, + length: length, + array: this + }; + value = value._then(gotAccum, undefined, undefined, ctx, undefined); + } + } + + if (this._eachValues !== undefined) { + value = value + ._then(this._eachComplete, undefined, undefined, this, undefined); + } + value._then(completed, completed, undefined, value, this); + }; + + Promise.prototype.reduce = function (fn, initialValue) { + return reduce(this, fn, initialValue, null); + }; + + Promise.reduce = function (promises, fn, initialValue, _each) { + return reduce(promises, fn, initialValue, _each); + }; + + function completed(valueOrReason, array) { + if (this.isFulfilled()) { + array._resolve(valueOrReason); + } else { + array._reject(valueOrReason); + } + } + + function reduce(promises, fn, initialValue, _each) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + var array = new ReductionPromiseArray(promises, fn, initialValue, _each); + return array.promise(); + } + + function gotAccum(accum) { + this.accum = accum; + this.array._gotAccum(accum); + var value = tryConvertToPromise(this.value, this.array._promise); + if (value instanceof Promise) { + this.array._currentCancellable = value; + return value._then(gotValue, undefined, undefined, this, undefined); + } else { + return gotValue.call(this, value); + } + } + + function gotValue(value) { + var array = this.array; + var promise = array._promise; + var fn = tryCatch(array._fn); + promise._pushContext(); + var ret; + if (array._eachValues !== undefined) { + ret = fn.call(promise._boundValue(), value, this.index, this.length); + } else { + ret = fn.call(promise._boundValue(), + this.accum, value, this.index, this.length); + } + if (ret instanceof Promise) { + array._currentCancellable = ret; + } + var promiseCreated = promise._popContext(); + debug.checkForgottenReturns( + ret, + promiseCreated, + array._eachValues !== undefined ? "Promise.each" : "Promise.reduce", + promise + ); + return ret; + } + }; + + },{"./util":36}],29:[function(_dereq_,module,exports){ + "use strict"; + var util = _dereq_("./util"); + var schedule; + var noAsyncScheduler = function() { + throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + }; + var NativePromise = util.getNativePromise(); + if (util.isNode && typeof MutationObserver === "undefined") { + var GlobalSetImmediate = global.setImmediate; + var ProcessNextTick = process.nextTick; + schedule = util.isRecentNode + ? function(fn) { GlobalSetImmediate.call(global, fn); } + : function(fn) { ProcessNextTick.call(process, fn); }; + } else if (typeof NativePromise === "function" && + typeof NativePromise.resolve === "function") { + var nativePromise = NativePromise.resolve(); + schedule = function(fn) { + nativePromise.then(fn); + }; + } else if ((typeof MutationObserver !== "undefined") && + !(typeof window !== "undefined" && + window.navigator && + (window.navigator.standalone || window.cordova))) { + schedule = (function() { + var div = document.createElement("div"); + var opts = {attributes: true}; + var toggleScheduled = false; + var div2 = document.createElement("div"); + var o2 = new MutationObserver(function() { + div.classList.toggle("foo"); + toggleScheduled = false; + }); + o2.observe(div2, opts); + + var scheduleToggle = function() { + if (toggleScheduled) return; + toggleScheduled = true; + div2.classList.toggle("foo"); + }; + + return function schedule(fn) { + var o = new MutationObserver(function() { + o.disconnect(); + fn(); + }); + o.observe(div, opts); + scheduleToggle(); + }; + })(); + } else if (typeof setImmediate !== "undefined") { + schedule = function (fn) { + setImmediate(fn); + }; + } else if (typeof setTimeout !== "undefined") { + schedule = function (fn) { + setTimeout(fn, 0); + }; + } else { + schedule = noAsyncScheduler; + } + module.exports = schedule; + + },{"./util":36}],30:[function(_dereq_,module,exports){ + "use strict"; + module.exports = + function(Promise, PromiseArray, debug) { + var PromiseInspection = Promise.PromiseInspection; + var util = _dereq_("./util"); + + function SettledPromiseArray(values) { + this.constructor$(values); + } + util.inherits(SettledPromiseArray, PromiseArray); + + SettledPromiseArray.prototype._promiseResolved = function (index, inspection) { + this._values[index] = inspection; + var totalResolved = ++this._totalResolved; + if (totalResolved >= this._length) { + this._resolve(this._values); + return true; + } + return false; + }; + + SettledPromiseArray.prototype._promiseFulfilled = function (value, index) { + var ret = new PromiseInspection(); + ret._bitField = 33554432; + ret._settledValueField = value; + return this._promiseResolved(index, ret); + }; + SettledPromiseArray.prototype._promiseRejected = function (reason, index) { + var ret = new PromiseInspection(); + ret._bitField = 16777216; + ret._settledValueField = reason; + return this._promiseResolved(index, ret); + }; + + Promise.settle = function (promises) { + debug.deprecated(".settle()", ".reflect()"); + return new SettledPromiseArray(promises).promise(); + }; + + Promise.prototype.settle = function () { + return Promise.settle(this); + }; + }; + + },{"./util":36}],31:[function(_dereq_,module,exports){ + "use strict"; + module.exports = + function(Promise, PromiseArray, apiRejection) { + var util = _dereq_("./util"); + var RangeError = _dereq_("./errors").RangeError; + var AggregateError = _dereq_("./errors").AggregateError; + var isArray = util.isArray; + var CANCELLATION = {}; + + + function SomePromiseArray(values) { + this.constructor$(values); + this._howMany = 0; + this._unwrap = false; + this._initialized = false; + } + util.inherits(SomePromiseArray, PromiseArray); + + SomePromiseArray.prototype._init = function () { + if (!this._initialized) { + return; + } + if (this._howMany === 0) { + this._resolve([]); + return; + } + this._init$(undefined, -5); + var isArrayResolved = isArray(this._values); + if (!this._isResolved() && + isArrayResolved && + this._howMany > this._canPossiblyFulfill()) { + this._reject(this._getRangeError(this.length())); + } + }; + + SomePromiseArray.prototype.init = function () { + this._initialized = true; + this._init(); + }; + + SomePromiseArray.prototype.setUnwrap = function () { + this._unwrap = true; + }; + + SomePromiseArray.prototype.howMany = function () { + return this._howMany; + }; + + SomePromiseArray.prototype.setHowMany = function (count) { + this._howMany = count; + }; + + SomePromiseArray.prototype._promiseFulfilled = function (value) { + this._addFulfilled(value); + if (this._fulfilled() === this.howMany()) { + this._values.length = this.howMany(); + if (this.howMany() === 1 && this._unwrap) { + this._resolve(this._values[0]); + } else { + this._resolve(this._values); + } + return true; + } + return false; + + }; + SomePromiseArray.prototype._promiseRejected = function (reason) { + this._addRejected(reason); + return this._checkOutcome(); + }; + + SomePromiseArray.prototype._promiseCancelled = function () { + if (this._values instanceof Promise || this._values == null) { + return this._cancel(); + } + this._addRejected(CANCELLATION); + return this._checkOutcome(); + }; + + SomePromiseArray.prototype._checkOutcome = function() { + if (this.howMany() > this._canPossiblyFulfill()) { + var e = new AggregateError(); + for (var i = this.length(); i < this._values.length; ++i) { + if (this._values[i] !== CANCELLATION) { + e.push(this._values[i]); + } + } + if (e.length > 0) { + this._reject(e); + } else { + this._cancel(); + } + return true; + } + return false; + }; + + SomePromiseArray.prototype._fulfilled = function () { + return this._totalResolved; + }; + + SomePromiseArray.prototype._rejected = function () { + return this._values.length - this.length(); + }; + + SomePromiseArray.prototype._addRejected = function (reason) { + this._values.push(reason); + }; + + SomePromiseArray.prototype._addFulfilled = function (value) { + this._values[this._totalResolved++] = value; + }; + + SomePromiseArray.prototype._canPossiblyFulfill = function () { + return this.length() - this._rejected(); + }; + + SomePromiseArray.prototype._getRangeError = function (count) { + var message = "Input array must contain at least " + + this._howMany + " items but contains only " + count + " items"; + return new RangeError(message); + }; + + SomePromiseArray.prototype._resolveEmptyArray = function () { + this._reject(this._getRangeError(0)); + }; + + function some(promises, howMany) { + if ((howMany | 0) !== howMany || howMany < 0) { + return apiRejection("expecting a positive integer\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + var ret = new SomePromiseArray(promises); + var promise = ret.promise(); + ret.setHowMany(howMany); + ret.init(); + return promise; + } + + Promise.some = function (promises, howMany) { + return some(promises, howMany); + }; + + Promise.prototype.some = function (howMany) { + return some(this, howMany); + }; + + Promise._SomePromiseArray = SomePromiseArray; + }; + + },{"./errors":12,"./util":36}],32:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function(Promise) { + function PromiseInspection(promise) { + if (promise !== undefined) { + promise = promise._target(); + this._bitField = promise._bitField; + this._settledValueField = promise._isFateSealed() + ? promise._settledValue() : undefined; + } + else { + this._bitField = 0; + this._settledValueField = undefined; + } + } + + PromiseInspection.prototype._settledValue = function() { + return this._settledValueField; + }; + + var value = PromiseInspection.prototype.value = function () { + if (!this.isFulfilled()) { + throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + return this._settledValue(); + }; + + var reason = PromiseInspection.prototype.error = + PromiseInspection.prototype.reason = function () { + if (!this.isRejected()) { + throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + return this._settledValue(); + }; + + var isFulfilled = PromiseInspection.prototype.isFulfilled = function() { + return (this._bitField & 33554432) !== 0; + }; + + var isRejected = PromiseInspection.prototype.isRejected = function () { + return (this._bitField & 16777216) !== 0; + }; + + var isPending = PromiseInspection.prototype.isPending = function () { + return (this._bitField & 50397184) === 0; + }; + + var isResolved = PromiseInspection.prototype.isResolved = function () { + return (this._bitField & 50331648) !== 0; + }; + + PromiseInspection.prototype.isCancelled = function() { + return (this._bitField & 8454144) !== 0; + }; + + Promise.prototype.__isCancelled = function() { + return (this._bitField & 65536) === 65536; + }; + + Promise.prototype._isCancelled = function() { + return this._target().__isCancelled(); + }; + + Promise.prototype.isCancelled = function() { + return (this._target()._bitField & 8454144) !== 0; + }; + + Promise.prototype.isPending = function() { + return isPending.call(this._target()); + }; + + Promise.prototype.isRejected = function() { + return isRejected.call(this._target()); + }; + + Promise.prototype.isFulfilled = function() { + return isFulfilled.call(this._target()); + }; + + Promise.prototype.isResolved = function() { + return isResolved.call(this._target()); + }; + + Promise.prototype.value = function() { + return value.call(this._target()); + }; + + Promise.prototype.reason = function() { + var target = this._target(); + target._unsetRejectionIsUnhandled(); + return reason.call(target); + }; + + Promise.prototype._value = function() { + return this._settledValue(); + }; + + Promise.prototype._reason = function() { + this._unsetRejectionIsUnhandled(); + return this._settledValue(); + }; + + Promise.PromiseInspection = PromiseInspection; + }; + + },{}],33:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function(Promise, INTERNAL) { + var util = _dereq_("./util"); + var errorObj = util.errorObj; + var isObject = util.isObject; + + function tryConvertToPromise(obj, context) { + if (isObject(obj)) { + if (obj instanceof Promise) return obj; + var then = getThen(obj); + if (then === errorObj) { + if (context) context._pushContext(); + var ret = Promise.reject(then.e); + if (context) context._popContext(); + return ret; + } else if (typeof then === "function") { + if (isAnyBluebirdPromise(obj)) { + var ret = new Promise(INTERNAL); + obj._then( + ret._fulfill, + ret._reject, + undefined, + ret, + null + ); + return ret; + } + return doThenable(obj, then, context); + } + } + return obj; + } + + function doGetThen(obj) { + return obj.then; + } + + function getThen(obj) { + try { + return doGetThen(obj); + } catch (e) { + errorObj.e = e; + return errorObj; + } + } + + var hasProp = {}.hasOwnProperty; + function isAnyBluebirdPromise(obj) { + try { + return hasProp.call(obj, "_promise0"); + } catch (e) { + return false; + } + } + + function doThenable(x, then, context) { + var promise = new Promise(INTERNAL); + var ret = promise; + if (context) context._pushContext(); + promise._captureStackTrace(); + if (context) context._popContext(); + var synchronous = true; + var result = util.tryCatch(then).call(x, resolve, reject); + synchronous = false; + + if (promise && result === errorObj) { + promise._rejectCallback(result.e, true, true); + promise = null; + } + + function resolve(value) { + if (!promise) return; + promise._resolveCallback(value); + promise = null; + } + + function reject(reason) { + if (!promise) return; + promise._rejectCallback(reason, synchronous, true); + promise = null; + } + return ret; + } + + return tryConvertToPromise; + }; + + },{"./util":36}],34:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function(Promise, INTERNAL, debug) { + var util = _dereq_("./util"); + var TimeoutError = Promise.TimeoutError; + + function HandleWrapper(handle) { + this.handle = handle; + } + + HandleWrapper.prototype._resultCancelled = function() { + clearTimeout(this.handle); + }; + + var afterValue = function(value) { return delay(+this).thenReturn(value); }; + var delay = Promise.delay = function (ms, value) { + var ret; + var handle; + if (value !== undefined) { + ret = Promise.resolve(value) + ._then(afterValue, null, null, ms, undefined); + if (debug.cancellation() && value instanceof Promise) { + ret._setOnCancel(value); + } + } else { + ret = new Promise(INTERNAL); + handle = setTimeout(function() { ret._fulfill(); }, +ms); + if (debug.cancellation()) { + ret._setOnCancel(new HandleWrapper(handle)); + } + ret._captureStackTrace(); + } + ret._setAsyncGuaranteed(); + return ret; + }; + + Promise.prototype.delay = function (ms) { + return delay(ms, this); + }; + + var afterTimeout = function (promise, message, parent) { + var err; + if (typeof message !== "string") { + if (message instanceof Error) { + err = message; + } else { + err = new TimeoutError("operation timed out"); + } + } else { + err = new TimeoutError(message); + } + util.markAsOriginatingFromRejection(err); + promise._attachExtraTrace(err); + promise._reject(err); + + if (parent != null) { + parent.cancel(); + } + }; + + function successClear(value) { + clearTimeout(this.handle); + return value; + } + + function failureClear(reason) { + clearTimeout(this.handle); + throw reason; + } + + Promise.prototype.timeout = function (ms, message) { + ms = +ms; + var ret, parent; + + var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() { + if (ret.isPending()) { + afterTimeout(ret, message, parent); + } + }, ms)); + + if (debug.cancellation()) { + parent = this.then(); + ret = parent._then(successClear, failureClear, + undefined, handleWrapper, undefined); + ret._setOnCancel(handleWrapper); + } else { + ret = this._then(successClear, failureClear, + undefined, handleWrapper, undefined); + } + + return ret; + }; + + }; + + },{"./util":36}],35:[function(_dereq_,module,exports){ + "use strict"; + module.exports = function (Promise, apiRejection, tryConvertToPromise, + createContext, INTERNAL, debug) { + var util = _dereq_("./util"); + var TypeError = _dereq_("./errors").TypeError; + var inherits = _dereq_("./util").inherits; + var errorObj = util.errorObj; + var tryCatch = util.tryCatch; + var NULL = {}; + + function thrower(e) { + setTimeout(function(){throw e;}, 0); + } + + function castPreservingDisposable(thenable) { + var maybePromise = tryConvertToPromise(thenable); + if (maybePromise !== thenable && + typeof thenable._isDisposable === "function" && + typeof thenable._getDisposer === "function" && + thenable._isDisposable()) { + maybePromise._setDisposable(thenable._getDisposer()); + } + return maybePromise; + } + function dispose(resources, inspection) { + var i = 0; + var len = resources.length; + var ret = new Promise(INTERNAL); + function iterator() { + if (i >= len) return ret._fulfill(); + var maybePromise = castPreservingDisposable(resources[i++]); + if (maybePromise instanceof Promise && + maybePromise._isDisposable()) { + try { + maybePromise = tryConvertToPromise( + maybePromise._getDisposer().tryDispose(inspection), + resources.promise); + } catch (e) { + return thrower(e); + } + if (maybePromise instanceof Promise) { + return maybePromise._then(iterator, thrower, + null, null, null); + } + } + iterator(); + } + iterator(); + return ret; + } + + function Disposer(data, promise, context) { + this._data = data; + this._promise = promise; + this._context = context; + } + + Disposer.prototype.data = function () { + return this._data; + }; + + Disposer.prototype.promise = function () { + return this._promise; + }; + + Disposer.prototype.resource = function () { + if (this.promise().isFulfilled()) { + return this.promise().value(); + } + return NULL; + }; + + Disposer.prototype.tryDispose = function(inspection) { + var resource = this.resource(); + var context = this._context; + if (context !== undefined) context._pushContext(); + var ret = resource !== NULL + ? this.doDispose(resource, inspection) : null; + if (context !== undefined) context._popContext(); + this._promise._unsetDisposable(); + this._data = null; + return ret; + }; + + Disposer.isDisposer = function (d) { + return (d != null && + typeof d.resource === "function" && + typeof d.tryDispose === "function"); + }; + + function FunctionDisposer(fn, promise, context) { + this.constructor$(fn, promise, context); + } + inherits(FunctionDisposer, Disposer); + + FunctionDisposer.prototype.doDispose = function (resource, inspection) { + var fn = this.data(); + return fn.call(resource, resource, inspection); + }; + + function maybeUnwrapDisposer(value) { + if (Disposer.isDisposer(value)) { + this.resources[this.index]._setDisposable(value); + return value.promise(); + } + return value; + } + + function ResourceList(length) { + this.length = length; + this.promise = null; + this[length-1] = null; + } + + ResourceList.prototype._resultCancelled = function() { + var len = this.length; + for (var i = 0; i < len; ++i) { + var item = this[i]; + if (item instanceof Promise) { + item.cancel(); + } + } + }; + + Promise.using = function () { + var len = arguments.length; + if (len < 2) return apiRejection( + "you must pass at least 2 arguments to Promise.using"); + var fn = arguments[len - 1]; + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + var input; + var spreadArgs = true; + if (len === 2 && Array.isArray(arguments[0])) { + input = arguments[0]; + len = input.length; + spreadArgs = false; + } else { + input = arguments; + len--; + } + var resources = new ResourceList(len); + for (var i = 0; i < len; ++i) { + var resource = input[i]; + if (Disposer.isDisposer(resource)) { + var disposer = resource; + resource = resource.promise(); + resource._setDisposable(disposer); + } else { + var maybePromise = tryConvertToPromise(resource); + if (maybePromise instanceof Promise) { + resource = + maybePromise._then(maybeUnwrapDisposer, null, null, { + resources: resources, + index: i + }, undefined); + } + } + resources[i] = resource; + } + + var reflectedResources = new Array(resources.length); + for (var i = 0; i < reflectedResources.length; ++i) { + reflectedResources[i] = Promise.resolve(resources[i]).reflect(); + } + + var resultPromise = Promise.all(reflectedResources) + .then(function(inspections) { + for (var i = 0; i < inspections.length; ++i) { + var inspection = inspections[i]; + if (inspection.isRejected()) { + errorObj.e = inspection.error(); + return errorObj; + } else if (!inspection.isFulfilled()) { + resultPromise.cancel(); + return; + } + inspections[i] = inspection.value(); + } + promise._pushContext(); + + fn = tryCatch(fn); + var ret = spreadArgs + ? fn.apply(undefined, inspections) : fn(inspections); + var promiseCreated = promise._popContext(); + debug.checkForgottenReturns( + ret, promiseCreated, "Promise.using", promise); + return ret; + }); + + var promise = resultPromise.lastly(function() { + var inspection = new Promise.PromiseInspection(resultPromise); + return dispose(resources, inspection); + }); + resources.promise = promise; + promise._setOnCancel(resources); + return promise; + }; + + Promise.prototype._setDisposable = function (disposer) { + this._bitField = this._bitField | 131072; + this._disposer = disposer; + }; + + Promise.prototype._isDisposable = function () { + return (this._bitField & 131072) > 0; + }; + + Promise.prototype._getDisposer = function () { + return this._disposer; + }; + + Promise.prototype._unsetDisposable = function () { + this._bitField = this._bitField & (~131072); + this._disposer = undefined; + }; + + Promise.prototype.disposer = function (fn) { + if (typeof fn === "function") { + return new FunctionDisposer(fn, this, createContext()); + } + throw new TypeError(); + }; + + }; + + },{"./errors":12,"./util":36}],36:[function(_dereq_,module,exports){ + "use strict"; + var es5 = _dereq_("./es5"); + var canEvaluate = typeof navigator == "undefined"; + + var errorObj = {e: {}}; + var tryCatchTarget; + var globalObject = typeof self !== "undefined" ? self : + typeof window !== "undefined" ? window : + typeof global !== "undefined" ? global : + this !== undefined ? this : null; + + function tryCatcher() { + try { + var target = tryCatchTarget; + tryCatchTarget = null; + return target.apply(this, arguments); + } catch (e) { + errorObj.e = e; + return errorObj; + } + } + function tryCatch(fn) { + tryCatchTarget = fn; + return tryCatcher; + } + + var inherits = function(Child, Parent) { + var hasProp = {}.hasOwnProperty; + + function T() { + this.constructor = Child; + this.constructor$ = Parent; + for (var propertyName in Parent.prototype) { + if (hasProp.call(Parent.prototype, propertyName) && + propertyName.charAt(propertyName.length-1) !== "$" + ) { + this[propertyName + "$"] = Parent.prototype[propertyName]; + } + } + } + T.prototype = Parent.prototype; + Child.prototype = new T(); + return Child.prototype; + }; + + + function isPrimitive(val) { + return val == null || val === true || val === false || + typeof val === "string" || typeof val === "number"; + + } + + function isObject(value) { + return typeof value === "function" || + typeof value === "object" && value !== null; + } + + function maybeWrapAsError(maybeError) { + if (!isPrimitive(maybeError)) return maybeError; + + return new Error(safeToString(maybeError)); + } + + function withAppended(target, appendee) { + var len = target.length; + var ret = new Array(len + 1); + var i; + for (i = 0; i < len; ++i) { + ret[i] = target[i]; + } + ret[i] = appendee; + return ret; + } + + function getDataPropertyOrDefault(obj, key, defaultValue) { + if (es5.isES5) { + var desc = Object.getOwnPropertyDescriptor(obj, key); + + if (desc != null) { + return desc.get == null && desc.set == null + ? desc.value + : defaultValue; + } + } else { + return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined; + } + } + + function notEnumerableProp(obj, name, value) { + if (isPrimitive(obj)) return obj; + var descriptor = { + value: value, + configurable: true, + enumerable: false, + writable: true + }; + es5.defineProperty(obj, name, descriptor); + return obj; + } + + function thrower(r) { + throw r; + } + + var inheritedDataKeys = (function() { + var excludedPrototypes = [ + Array.prototype, + Object.prototype, + Function.prototype + ]; + + var isExcludedProto = function(val) { + for (var i = 0; i < excludedPrototypes.length; ++i) { + if (excludedPrototypes[i] === val) { + return true; + } + } + return false; + }; + + if (es5.isES5) { + var getKeys = Object.getOwnPropertyNames; + return function(obj) { + var ret = []; + var visitedKeys = Object.create(null); + while (obj != null && !isExcludedProto(obj)) { + var keys; + try { + keys = getKeys(obj); + } catch (e) { + return ret; + } + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (visitedKeys[key]) continue; + visitedKeys[key] = true; + var desc = Object.getOwnPropertyDescriptor(obj, key); + if (desc != null && desc.get == null && desc.set == null) { + ret.push(key); + } + } + obj = es5.getPrototypeOf(obj); + } + return ret; + }; + } else { + var hasProp = {}.hasOwnProperty; + return function(obj) { + if (isExcludedProto(obj)) return []; + var ret = []; + + /*jshint forin:false */ + enumeration: for (var key in obj) { + if (hasProp.call(obj, key)) { + ret.push(key); + } else { + for (var i = 0; i < excludedPrototypes.length; ++i) { + if (hasProp.call(excludedPrototypes[i], key)) { + continue enumeration; + } + } + ret.push(key); + } + } + return ret; + }; + } + + })(); + + var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/; + function isClass(fn) { + try { + if (typeof fn === "function") { + var keys = es5.names(fn.prototype); + + var hasMethods = es5.isES5 && keys.length > 1; + var hasMethodsOtherThanConstructor = keys.length > 0 && + !(keys.length === 1 && keys[0] === "constructor"); + var hasThisAssignmentAndStaticMethods = + thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0; + + if (hasMethods || hasMethodsOtherThanConstructor || + hasThisAssignmentAndStaticMethods) { + return true; + } + } + return false; + } catch (e) { + return false; + } + } + + function toFastProperties(obj) { + /*jshint -W027,-W055,-W031*/ + function FakeConstructor() {} + FakeConstructor.prototype = obj; + var l = 8; + while (l--) new FakeConstructor(); + return obj; + eval(obj); + } + + var rident = /^[a-z$_][a-z$_0-9]*$/i; + function isIdentifier(str) { + return rident.test(str); + } + + function filledRange(count, prefix, suffix) { + var ret = new Array(count); + for(var i = 0; i < count; ++i) { + ret[i] = prefix + i + suffix; + } + return ret; + } + + function safeToString(obj) { + try { + return obj + ""; + } catch (e) { + return "[no string representation]"; + } + } + + function isError(obj) { + return obj !== null && + typeof obj === "object" && + typeof obj.message === "string" && + typeof obj.name === "string"; + } + + function markAsOriginatingFromRejection(e) { + try { + notEnumerableProp(e, "isOperational", true); + } + catch(ignore) {} + } + + function originatesFromRejection(e) { + if (e == null) return false; + return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) || + e["isOperational"] === true); + } + + function canAttachTrace(obj) { + return isError(obj) && es5.propertyIsWritable(obj, "stack"); + } + + var ensureErrorObject = (function() { + if (!("stack" in new Error())) { + return function(value) { + if (canAttachTrace(value)) return value; + try {throw new Error(safeToString(value));} + catch(err) {return err;} + }; + } else { + return function(value) { + if (canAttachTrace(value)) return value; + return new Error(safeToString(value)); + }; + } + })(); + + function classString(obj) { + return {}.toString.call(obj); + } + + function copyDescriptors(from, to, filter) { + var keys = es5.names(from); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (filter(key)) { + try { + es5.defineProperty(to, key, es5.getDescriptor(from, key)); + } catch (ignore) {} + } + } + } + + var asArray = function(v) { + if (es5.isArray(v)) { + return v; + } + return null; + }; + + if (typeof Symbol !== "undefined" && Symbol.iterator) { + var ArrayFrom = typeof Array.from === "function" ? function(v) { + return Array.from(v); + } : function(v) { + var ret = []; + var it = v[Symbol.iterator](); + var itResult; + while (!((itResult = it.next()).done)) { + ret.push(itResult.value); + } + return ret; + }; + + asArray = function(v) { + if (es5.isArray(v)) { + return v; + } else if (v != null && typeof v[Symbol.iterator] === "function") { + return ArrayFrom(v); + } + return null; + }; + } + + var isNode = typeof process !== "undefined" && + classString(process).toLowerCase() === "[object process]"; + + var hasEnvVariables = typeof process !== "undefined" && + typeof process.env !== "undefined"; + + function env(key) { + return hasEnvVariables ? process.env[key] : undefined; + } + + function getNativePromise() { + if (typeof Promise === "function") { + try { + var promise = new Promise(function(){}); + if ({}.toString.call(promise) === "[object Promise]") { + return Promise; + } + } catch (e) {} + } + } + + function domainBind(self, cb) { + return self.bind(cb); + } + + var ret = { + isClass: isClass, + isIdentifier: isIdentifier, + inheritedDataKeys: inheritedDataKeys, + getDataPropertyOrDefault: getDataPropertyOrDefault, + thrower: thrower, + isArray: es5.isArray, + asArray: asArray, + notEnumerableProp: notEnumerableProp, + isPrimitive: isPrimitive, + isObject: isObject, + isError: isError, + canEvaluate: canEvaluate, + errorObj: errorObj, + tryCatch: tryCatch, + inherits: inherits, + withAppended: withAppended, + maybeWrapAsError: maybeWrapAsError, + toFastProperties: toFastProperties, + filledRange: filledRange, + toString: safeToString, + canAttachTrace: canAttachTrace, + ensureErrorObject: ensureErrorObject, + originatesFromRejection: originatesFromRejection, + markAsOriginatingFromRejection: markAsOriginatingFromRejection, + classString: classString, + copyDescriptors: copyDescriptors, + hasDevTools: typeof chrome !== "undefined" && chrome && + typeof chrome.loadTimes === "function", + isNode: isNode, + hasEnvVariables: hasEnvVariables, + env: env, + global: globalObject, + getNativePromise: getNativePromise, + domainBind: domainBind + }; + ret.isRecentNode = ret.isNode && (function() { + var version = process.versions.node.split(".").map(Number); + return (version[0] === 0 && version[1] > 10) || (version[0] > 0); + })(); + + if (ret.isNode) ret.toFastProperties(process); + + try {throw new Error(); } catch (e) {ret.lastLineError = e;} + module.exports = ret; + + },{"./es5":13}]},{},[4])(4) + }); ;if (typeof window !== 'undefined' && window !== null) { window.P = window.Promise; } else if (typeof self !== 'undefined' && self !== null) { self.P = self.Promise; } + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(45), __webpack_require__(11), __webpack_require__(137).setImmediate)) + + /***/ }), + /* 14 */ + /***/ (function(module, exports, __webpack_require__) { + + var getNative = __webpack_require__(1), + root = __webpack_require__(0); + + /* Built-in method references that are verified to be native. */ + var Map = getNative(root, 'Map'); + + module.exports = Map; + + + /***/ }), + /* 15 */ + /***/ (function(module, exports, __webpack_require__) { + + var root = __webpack_require__(0); + + /** Built-in value references. */ + var Symbol = root.Symbol; + + module.exports = Symbol; + + + /***/ }), + /* 16 */ + /***/ (function(module, exports, __webpack_require__) { + + var Uint8Array = __webpack_require__(55); + + /** + * Creates a clone of `arrayBuffer`. + * + * @private + * @param {ArrayBuffer} arrayBuffer The array buffer to clone. + * @returns {ArrayBuffer} Returns the cloned array buffer. + */ + function cloneArrayBuffer(arrayBuffer) { + var result = new arrayBuffer.constructor(arrayBuffer.byteLength); + new Uint8Array(result).set(new Uint8Array(arrayBuffer)); + return result; + } + + module.exports = cloneArrayBuffer; + + + /***/ }), + /* 17 */ + /***/ (function(module, exports, __webpack_require__) { + + var arrayFilter = __webpack_require__(60), + stubArray = __webpack_require__(44); + + /** Used for built-in method references. */ + var objectProto = Object.prototype; + + /** Built-in value references. */ + var propertyIsEnumerable = objectProto.propertyIsEnumerable; + + /* Built-in method references for those with the same name as other `lodash` methods. */ + var nativeGetSymbols = Object.getOwnPropertySymbols; + + /** + * Creates an array of the own enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ + var getSymbols = !nativeGetSymbols ? stubArray : function(object) { + if (object == null) { + return []; + } + object = Object(object); + return arrayFilter(nativeGetSymbols(object), function(symbol) { + return propertyIsEnumerable.call(object, symbol); + }); + }; + + module.exports = getSymbols; + + + /***/ }), + /* 18 */ + /***/ (function(module, exports) { + + /** Used for built-in method references. */ + var objectProto = Object.prototype; + + /** + * Checks if `value` is likely a prototype object. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. + */ + function isPrototype(value) { + var Ctor = value && value.constructor, + proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; + + return value === proto; + } + + module.exports = isPrototype; + + + /***/ }), + /* 19 */ + /***/ (function(module, exports) { + + /** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ + var isArray = Array.isArray; + + module.exports = isArray; + + + /***/ }), + /* 20 */ + /***/ (function(module, exports, __webpack_require__) { + + var isFunction = __webpack_require__(42), + isLength = __webpack_require__(43); + + /** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ + function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); + } + + module.exports = isArrayLike; + + + /***/ }), + /* 21 */ + /***/ (function(module, exports) { + + /** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ + function isObjectLike(value) { + return value != null && typeof value == 'object'; + } + + module.exports = isObjectLike; + + + /***/ }), + /* 22 */ + /***/ (function(module, exports, __webpack_require__) { + + var arrayLikeKeys = __webpack_require__(25), + baseKeys = __webpack_require__(68), + isArrayLike = __webpack_require__(20); + + /** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * for more details. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ + function keys(object) { + return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); + } + + module.exports = keys; + + + /***/ }), + /* 23 */ + /***/ (function(module, exports, __webpack_require__) { + + var arrayLikeKeys = __webpack_require__(25), + baseKeysIn = __webpack_require__(69), + isArrayLike = __webpack_require__(20); + + /** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ + function keysIn(object) { + return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); + } + + module.exports = keysIn; + + + /***/ }), + /* 24 */ + /***/ (function(module, exports) { + + /** + * A faster alternative to `Function#apply`, this function invokes `func` + * with the `this` binding of `thisArg` and the arguments of `args`. + * + * @private + * @param {Function} func The function to invoke. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} args The arguments to invoke `func` with. + * @returns {*} Returns the result of `func`. + */ + function apply(func, thisArg, args) { + switch (args.length) { + case 0: return func.call(thisArg); + case 1: return func.call(thisArg, args[0]); + case 2: return func.call(thisArg, args[0], args[1]); + case 3: return func.call(thisArg, args[0], args[1], args[2]); + } + return func.apply(thisArg, args); + } + + module.exports = apply; + + + /***/ }), + /* 25 */ + /***/ (function(module, exports, __webpack_require__) { + + var baseTimes = __webpack_require__(71), + isArguments = __webpack_require__(129), + isArray = __webpack_require__(19), + isBuffer = __webpack_require__(41), + isIndex = __webpack_require__(36), + isTypedArray = __webpack_require__(130); + + /** Used for built-in method references. */ + var objectProto = Object.prototype; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** + * Creates an array of the enumerable property names of the array-like `value`. + * + * @private + * @param {*} value The value to query. + * @param {boolean} inherited Specify returning inherited property names. + * @returns {Array} Returns the array of property names. + */ + function arrayLikeKeys(value, inherited) { + var isArr = isArray(value), + isArg = !isArr && isArguments(value), + isBuff = !isArr && !isArg && isBuffer(value), + isType = !isArr && !isArg && !isBuff && isTypedArray(value), + skipIndexes = isArr || isArg || isBuff || isType, + result = skipIndexes ? baseTimes(value.length, String) : [], + length = result.length; + + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && + !(skipIndexes && ( + // Safari 9 has enumerable `arguments.length` in strict mode. + key == 'length' || + // Node.js 0.10 has enumerable non-index properties on buffers. + (isBuff && (key == 'offset' || key == 'parent')) || + // PhantomJS 2 has enumerable non-index properties on typed arrays. + (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || + // Skip index properties. + isIndex(key, length) + ))) { + result.push(key); + } + } + return result; + } + + module.exports = arrayLikeKeys; + + + /***/ }), + /* 26 */ + /***/ (function(module, exports) { + + /** + * Appends the elements of `values` to `array`. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to append. + * @returns {Array} Returns `array`. + */ + function arrayPush(array, values) { + var index = -1, + length = values.length, + offset = array.length; + + while (++index < length) { + array[offset + index] = values[index]; + } + return array; + } + + module.exports = arrayPush; + + + /***/ }), + /* 27 */ + /***/ (function(module, exports) { + + /** + * A specialized version of `_.reduce` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the first element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ + function arrayReduce(array, iteratee, accumulator, initAccum) { + var index = -1, + length = array == null ? 0 : array.length; + + if (initAccum && length) { + accumulator = array[++index]; + } + while (++index < length) { + accumulator = iteratee(accumulator, array[index], index, array); + } + return accumulator; + } + + module.exports = arrayReduce; + + + /***/ }), + /* 28 */ + /***/ (function(module, exports, __webpack_require__) { + + var baseAssignValue = __webpack_require__(29), + eq = __webpack_require__(9); + + /** Used for built-in method references. */ + var objectProto = Object.prototype; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } + + module.exports = assignValue; + + + /***/ }), + /* 29 */ + /***/ (function(module, exports, __webpack_require__) { + + var defineProperty = __webpack_require__(32); + + /** + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function baseAssignValue(object, key, value) { + if (key == '__proto__' && defineProperty) { + defineProperty(object, key, { + 'configurable': true, + 'enumerable': true, + 'value': value, + 'writable': true + }); + } else { + object[key] = value; + } + } + + module.exports = baseAssignValue; + + + /***/ }), + /* 30 */ + /***/ (function(module, exports, __webpack_require__) { + + var arrayPush = __webpack_require__(26), + isArray = __webpack_require__(19); + + /** + * The base implementation of `getAllKeys` and `getAllKeysIn` which uses + * `keysFunc` and `symbolsFunc` to get the enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Function} keysFunc The function to get the keys of `object`. + * @param {Function} symbolsFunc The function to get the symbols of `object`. + * @returns {Array} Returns the array of property names and symbols. + */ + function baseGetAllKeys(object, keysFunc, symbolsFunc) { + var result = keysFunc(object); + return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); + } + + module.exports = baseGetAllKeys; + + + /***/ }), + /* 31 */ + /***/ (function(module, exports, __webpack_require__) { + + var identity = __webpack_require__(40), + overRest = __webpack_require__(117), + setToString = __webpack_require__(119); + + /** + * The base implementation of `_.rest` which doesn't validate or coerce arguments. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + */ + function baseRest(func, start) { + return setToString(overRest(func, start, identity), func + ''); + } + + module.exports = baseRest; + + + /***/ }), + /* 32 */ + /***/ (function(module, exports, __webpack_require__) { + + var getNative = __webpack_require__(1); + + var defineProperty = (function() { + try { + var func = getNative(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} + }()); + + module.exports = defineProperty; + + + /***/ }), + /* 33 */ + /***/ (function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */ + var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + + module.exports = freeGlobal; + + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(11))) + + /***/ }), + /* 34 */ + /***/ (function(module, exports, __webpack_require__) { + + var overArg = __webpack_require__(37); + + /** Built-in value references. */ + var getPrototype = overArg(Object.getPrototypeOf, Object); + + module.exports = getPrototype; + + + /***/ }), + /* 35 */ + /***/ (function(module, exports, __webpack_require__) { + + var arrayPush = __webpack_require__(26), + getPrototype = __webpack_require__(34), + getSymbols = __webpack_require__(17), + stubArray = __webpack_require__(44); + + /* Built-in method references for those with the same name as other `lodash` methods. */ + var nativeGetSymbols = Object.getOwnPropertySymbols; + + /** + * Creates an array of the own and inherited enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ + var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { + var result = []; + while (object) { + arrayPush(result, getSymbols(object)); + object = getPrototype(object); + } + return result; + }; + + module.exports = getSymbolsIn; + + + /***/ }), + /* 36 */ + /***/ (function(module, exports) { + + /** Used as references for various `Number` constants. */ + var MAX_SAFE_INTEGER = 9007199254740991; + + /** Used to detect unsigned integer values. */ + var reIsUint = /^(?:0|[1-9]\d*)$/; + + /** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ + function isIndex(value, length) { + length = length == null ? MAX_SAFE_INTEGER : length; + return !!length && + (typeof value == 'number' || reIsUint.test(value)) && + (value > -1 && value % 1 == 0 && value < length); + } + + module.exports = isIndex; + + + /***/ }), + /* 37 */ + /***/ (function(module, exports) { + + /** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ + function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; + } + + module.exports = overArg; + + + /***/ }), + /* 38 */ + /***/ (function(module, exports) { + + /** Used for built-in method references. */ + var funcProto = Function.prototype; + + /** Used to resolve the decompiled source of functions. */ + var funcToString = funcProto.toString; + + /** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to convert. + * @returns {string} Returns the source code. + */ + function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; + } + + module.exports = toSource; + + + /***/ }), + /* 39 */ + /***/ (function(module, exports, __webpack_require__) { + + var apply = __webpack_require__(24), + assignInWith = __webpack_require__(126), + baseRest = __webpack_require__(31), + customDefaultsAssignIn = __webpack_require__(85); + + /** + * Assigns own and inherited enumerable string keyed properties of source + * objects to the destination object for all destination properties that + * resolve to `undefined`. Source objects are applied from left to right. + * Once a property is set, additional values of the same property are ignored. + * + * **Note:** This method mutates `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaultsDeep + * @example + * + * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var defaults = baseRest(function(args) { + args.push(undefined, customDefaultsAssignIn); + return apply(assignInWith, undefined, args); + }); + + module.exports = defaults; + + + /***/ }), + /* 40 */ + /***/ (function(module, exports) { + + /** + * This method returns the first argument it receives. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Util + * @param {*} value Any value. + * @returns {*} Returns `value`. + * @example + * + * var object = { 'a': 1 }; + * + * console.log(_.identity(object) === object); + * // => true + */ + function identity(value) { + return value; + } + + module.exports = identity; + + + /***/ }), + /* 41 */ + /***/ (function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(module) {var root = __webpack_require__(0), + stubFalse = __webpack_require__(131); + + /** Detect free variable `exports`. */ + var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; + + /** Detect free variable `module`. */ + var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + + /** Detect the popular CommonJS extension `module.exports`. */ + var moduleExports = freeModule && freeModule.exports === freeExports; + + /** Built-in value references. */ + var Buffer = moduleExports ? root.Buffer : undefined; + + /* Built-in method references for those with the same name as other `lodash` methods. */ + var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined; + + /** + * Checks if `value` is a buffer. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. + * @example + * + * _.isBuffer(new Buffer(2)); + * // => true + * + * _.isBuffer(new Uint8Array(2)); + * // => false + */ + var isBuffer = nativeIsBuffer || stubFalse; + + module.exports = isBuffer; + + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(12)(module))) + + /***/ }), + /* 42 */ + /***/ (function(module, exports, __webpack_require__) { + + var baseGetTag = __webpack_require__(6), + isObject = __webpack_require__(2); + + /** `Object#toString` result references. */ + var asyncTag = '[object AsyncFunction]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + proxyTag = '[object Proxy]'; + + /** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ + function isFunction(value) { + if (!isObject(value)) { + return false; + } + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + } + + module.exports = isFunction; + + + /***/ }), + /* 43 */ + /***/ (function(module, exports) { + + /** Used as references for various `Number` constants. */ + var MAX_SAFE_INTEGER = 9007199254740991; + + /** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ + function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; + } + + module.exports = isLength; + + + /***/ }), + /* 44 */ + /***/ (function(module, exports) { + + /** + * This method returns a new empty array. + * + * @static + * @memberOf _ + * @since 4.13.0 + * @category Util + * @returns {Array} Returns the new empty array. + * @example + * + * var arrays = _.times(2, _.stubArray); + * + * console.log(arrays); + * // => [[], []] + * + * console.log(arrays[0] === arrays[1]); + * // => false + */ + function stubArray() { + return []; + } + + module.exports = stubArray; + + + /***/ }), + /* 45 */ + /***/ (function(module, exports) { + +// shim for using process in browser + var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + + var cachedSetTimeout; + var cachedClearTimeout; + + function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); + } + function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); + } + (function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } + } ()) + function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + + } + function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + + } + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; + + function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + + function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); + } + + process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } + }; + +// v8 likes predictible objects + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + Item.prototype.run = function () { + this.fun.apply(null, this.array); + }; + process.title = 'browser'; + process.browser = true; + process.env = {}; + process.argv = []; + process.version = ''; // empty string to avoid regexp issues + process.versions = {}; + + function noop() {} + + process.on = noop; + process.addListener = noop; + process.once = noop; + process.off = noop; + process.removeListener = noop; + process.removeAllListeners = noop; + process.emit = noop; + + process.binding = function (name) { + throw new Error('process.binding is not supported'); + }; + + process.cwd = function () { return '/' }; + process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); + }; + process.umask = function() { return 0; }; + + + /***/ }), + /* 46 */ + /***/ (function(module, exports, __webpack_require__) { + + "use strict"; + + Object.defineProperty(exports, "__esModule", { value: true }); + var util_1 = __webpack_require__(10); + var Swatch = (function () { + function Swatch(rgb, population) { + this._rgb = rgb; + this._population = population; + } + Swatch.prototype.getRgb = function () { return this._rgb; }; + Swatch.prototype.getHsl = function () { + if (!this._hsl) { + var _a = this._rgb, r = _a[0], g = _a[1], b = _a[2]; + this._hsl = util_1.rgbToHsl(r, g, b); + } + return this._hsl; + }; + Swatch.prototype.getPopulation = function () { return this._population; }; + Swatch.prototype.getHex = function () { + if (!this._hex) { + var _a = this._rgb, r = _a[0], g = _a[1], b = _a[2]; + this._hex = util_1.rgbToHex(r, g, b); + } + return this._hex; + }; + Swatch.prototype.getYiq = function () { + if (!this._yiq) { + var rgb = this._rgb; + this._yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; + } + return this._yiq; + }; + Swatch.prototype.getTitleTextColor = function () { + return this.getYiq() < 200 ? '#fff' : '#000'; + }; + Swatch.prototype.getBodyTextColor = function () { + return this.getYiq() < 150 ? '#fff' : '#000'; + }; + return Swatch; + }()); + exports.Swatch = Swatch; + + + /***/ }), + /* 47 */ + /***/ (function(module, exports, __webpack_require__) { + + "use strict"; + + Object.defineProperty(exports, "__esModule", { value: true }); + var Bluebird = __webpack_require__(13); + var defaults = __webpack_require__(39); + var builder_1 = __webpack_require__(138); + var Util = __webpack_require__(10); + var Quantizer = __webpack_require__(145); + var Generator = __webpack_require__(142); + var Filter = __webpack_require__(140); + var Vibrant = (function () { + function Vibrant(_src, opts) { + this._src = _src; + this.opts = defaults({}, opts, Vibrant.DefaultOpts); + } + Vibrant.from = function (src) { + return new builder_1.default(src); + }; + Vibrant.prototype._process = function (image) { + var _this = this; + var opts = this.opts; + var quantizer = opts.quantizer, generator = opts.generator; + image.scaleDown(opts); + var imageData = image.getImageData(); + return Bluebird.resolve(quantizer(imageData.data, opts)) + .then(function (colors) { return Bluebird.resolve(generator(colors)); }) + .tap(function (palette) { return _this._palette = palette; }) + .finally(function () { return image.remove(); }); + }; + Vibrant.prototype.palette = function () { + return this.swatches(); + }; + Vibrant.prototype.swatches = function () { + return this._palette; + }; + Vibrant.prototype.getPalette = function (cb) { + var _this = this; + var image = new this.opts.ImageClass(); + return image.load(this._src) + .then(function (image) { return _this._process(image); }) + .asCallback(cb); + }; + return Vibrant; + }()); + Vibrant.Builder = builder_1.default; + Vibrant.Quantizer = Quantizer; + Vibrant.Generator = Generator; + Vibrant.Filter = Filter; + Vibrant.Util = Util; + Vibrant.DefaultOpts = { + colorCount: 64, + quality: 5, + generator: Generator.Default, + ImageClass: null, + quantizer: Quantizer.MMCQ, + filters: [Filter.Default] + }; + exports.default = Vibrant; + + + /***/ }), + /* 48 */ + /***/ (function(module, exports, __webpack_require__) { + + "use strict"; + + var vibrant_1 = __webpack_require__(47); + var browser_1 = __webpack_require__(144); + vibrant_1.default.DefaultOpts.ImageClass = browser_1.default; + module.exports = vibrant_1.default; + + + /***/ }), + /* 49 */ + /***/ (function(module, exports, __webpack_require__) { + + var getNative = __webpack_require__(1), + root = __webpack_require__(0); + + /* Built-in method references that are verified to be native. */ + var DataView = getNative(root, 'DataView'); + + module.exports = DataView; + + + /***/ }), + /* 50 */ + /***/ (function(module, exports, __webpack_require__) { + + var hashClear = __webpack_require__(91), + hashDelete = __webpack_require__(92), + hashGet = __webpack_require__(93), + hashHas = __webpack_require__(94), + hashSet = __webpack_require__(95); + + /** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Hash(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + +// Add methods to `Hash`. + Hash.prototype.clear = hashClear; + Hash.prototype['delete'] = hashDelete; + Hash.prototype.get = hashGet; + Hash.prototype.has = hashHas; + Hash.prototype.set = hashSet; + + module.exports = Hash; + + + /***/ }), + /* 51 */ + /***/ (function(module, exports, __webpack_require__) { + + var mapCacheClear = __webpack_require__(107), + mapCacheDelete = __webpack_require__(108), + mapCacheGet = __webpack_require__(109), + mapCacheHas = __webpack_require__(110), + mapCacheSet = __webpack_require__(111); + + /** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function MapCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + +// Add methods to `MapCache`. + MapCache.prototype.clear = mapCacheClear; + MapCache.prototype['delete'] = mapCacheDelete; + MapCache.prototype.get = mapCacheGet; + MapCache.prototype.has = mapCacheHas; + MapCache.prototype.set = mapCacheSet; + + module.exports = MapCache; + + + /***/ }), + /* 52 */ + /***/ (function(module, exports, __webpack_require__) { + + var getNative = __webpack_require__(1), + root = __webpack_require__(0); + + /* Built-in method references that are verified to be native. */ + var Promise = getNative(root, 'Promise'); + + module.exports = Promise; + + + /***/ }), + /* 53 */ + /***/ (function(module, exports, __webpack_require__) { + + var getNative = __webpack_require__(1), + root = __webpack_require__(0); + + /* Built-in method references that are verified to be native. */ + var Set = getNative(root, 'Set'); + + module.exports = Set; + + + /***/ }), + /* 54 */ + /***/ (function(module, exports, __webpack_require__) { + + var ListCache = __webpack_require__(4), + stackClear = __webpack_require__(121), + stackDelete = __webpack_require__(122), + stackGet = __webpack_require__(123), + stackHas = __webpack_require__(124), + stackSet = __webpack_require__(125); + + /** + * Creates a stack cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Stack(entries) { + var data = this.__data__ = new ListCache(entries); + this.size = data.size; + } + +// Add methods to `Stack`. + Stack.prototype.clear = stackClear; + Stack.prototype['delete'] = stackDelete; + Stack.prototype.get = stackGet; + Stack.prototype.has = stackHas; + Stack.prototype.set = stackSet; + + module.exports = Stack; + + + /***/ }), + /* 55 */ + /***/ (function(module, exports, __webpack_require__) { + + var root = __webpack_require__(0); + + /** Built-in value references. */ + var Uint8Array = root.Uint8Array; + + module.exports = Uint8Array; + + + /***/ }), + /* 56 */ + /***/ (function(module, exports, __webpack_require__) { + + var getNative = __webpack_require__(1), + root = __webpack_require__(0); + + /* Built-in method references that are verified to be native. */ + var WeakMap = getNative(root, 'WeakMap'); + + module.exports = WeakMap; + + + /***/ }), + /* 57 */ + /***/ (function(module, exports) { + + /** + * Adds the key-value `pair` to `map`. + * + * @private + * @param {Object} map The map to modify. + * @param {Array} pair The key-value pair to add. + * @returns {Object} Returns `map`. + */ + function addMapEntry(map, pair) { + // Don't return `map.set` because it's not chainable in IE 11. + map.set(pair[0], pair[1]); + return map; + } + + module.exports = addMapEntry; + + + /***/ }), + /* 58 */ + /***/ (function(module, exports) { + + /** + * Adds `value` to `set`. + * + * @private + * @param {Object} set The set to modify. + * @param {*} value The value to add. + * @returns {Object} Returns `set`. + */ + function addSetEntry(set, value) { + // Don't return `set.add` because it's not chainable in IE 11. + set.add(value); + return set; + } + + module.exports = addSetEntry; + + + /***/ }), + /* 59 */ + /***/ (function(module, exports) { + + /** + * A specialized version of `_.forEach` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ + function arrayEach(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (iteratee(array[index], index, array) === false) { + break; + } + } + return array; + } + + module.exports = arrayEach; + + + /***/ }), + /* 60 */ + /***/ (function(module, exports) { + + /** + * A specialized version of `_.filter` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ + function arrayFilter(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result[resIndex++] = value; + } + } + return result; + } + + module.exports = arrayFilter; + + + /***/ }), + /* 61 */ + /***/ (function(module, exports, __webpack_require__) { + + var copyObject = __webpack_require__(3), + keys = __webpack_require__(22); + + /** + * The base implementation of `_.assign` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssign(object, source) { + return object && copyObject(source, keys(source), object); + } + + module.exports = baseAssign; + + + /***/ }), + /* 62 */ + /***/ (function(module, exports, __webpack_require__) { + + var copyObject = __webpack_require__(3), + keysIn = __webpack_require__(23); + + /** + * The base implementation of `_.assignIn` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssignIn(object, source) { + return object && copyObject(source, keysIn(source), object); + } + + module.exports = baseAssignIn; + + + /***/ }), + /* 63 */ + /***/ (function(module, exports, __webpack_require__) { + + var Stack = __webpack_require__(54), + arrayEach = __webpack_require__(59), + assignValue = __webpack_require__(28), + baseAssign = __webpack_require__(61), + baseAssignIn = __webpack_require__(62), + cloneBuffer = __webpack_require__(73), + copyArray = __webpack_require__(80), + copySymbols = __webpack_require__(81), + copySymbolsIn = __webpack_require__(82), + getAllKeys = __webpack_require__(86), + getAllKeysIn = __webpack_require__(87), + getTag = __webpack_require__(89), + initCloneArray = __webpack_require__(96), + initCloneByTag = __webpack_require__(97), + initCloneObject = __webpack_require__(98), + isArray = __webpack_require__(19), + isBuffer = __webpack_require__(41), + isObject = __webpack_require__(2), + keys = __webpack_require__(22); + + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1, + CLONE_FLAT_FLAG = 2, + CLONE_SYMBOLS_FLAG = 4; + + /** `Object#toString` result references. */ + var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + mapTag = '[object Map]', + numberTag = '[object Number]', + objectTag = '[object Object]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + symbolTag = '[object Symbol]', + weakMapTag = '[object WeakMap]'; + + var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + + /** Used to identify `toStringTag` values supported by `_.clone`. */ + var cloneableTags = {}; + cloneableTags[argsTag] = cloneableTags[arrayTag] = + cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = + cloneableTags[boolTag] = cloneableTags[dateTag] = + cloneableTags[float32Tag] = cloneableTags[float64Tag] = + cloneableTags[int8Tag] = cloneableTags[int16Tag] = + cloneableTags[int32Tag] = cloneableTags[mapTag] = + cloneableTags[numberTag] = cloneableTags[objectTag] = + cloneableTags[regexpTag] = cloneableTags[setTag] = + cloneableTags[stringTag] = cloneableTags[symbolTag] = + cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = + cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; + cloneableTags[errorTag] = cloneableTags[funcTag] = + cloneableTags[weakMapTag] = false; + + /** + * The base implementation of `_.clone` and `_.cloneDeep` which tracks + * traversed objects. + * + * @private + * @param {*} value The value to clone. + * @param {boolean} bitmask The bitmask flags. + * 1 - Deep clone + * 2 - Flatten inherited properties + * 4 - Clone symbols + * @param {Function} [customizer] The function to customize cloning. + * @param {string} [key] The key of `value`. + * @param {Object} [object] The parent object of `value`. + * @param {Object} [stack] Tracks traversed objects and their clone counterparts. + * @returns {*} Returns the cloned value. + */ + function baseClone(value, bitmask, customizer, key, object, stack) { + var result, + isDeep = bitmask & CLONE_DEEP_FLAG, + isFlat = bitmask & CLONE_FLAT_FLAG, + isFull = bitmask & CLONE_SYMBOLS_FLAG; + + if (customizer) { + result = object ? customizer(value, key, object, stack) : customizer(value); + } + if (result !== undefined) { + return result; + } + if (!isObject(value)) { + return value; + } + var isArr = isArray(value); + if (isArr) { + result = initCloneArray(value); + if (!isDeep) { + return copyArray(value, result); + } + } else { + var tag = getTag(value), + isFunc = tag == funcTag || tag == genTag; + + if (isBuffer(value)) { + return cloneBuffer(value, isDeep); + } + if (tag == objectTag || tag == argsTag || (isFunc && !object)) { + result = (isFlat || isFunc) ? {} : initCloneObject(value); + if (!isDeep) { + return isFlat + ? copySymbolsIn(value, baseAssignIn(result, value)) + : copySymbols(value, baseAssign(result, value)); + } + } else { + if (!cloneableTags[tag]) { + return object ? value : {}; + } + result = initCloneByTag(value, tag, baseClone, isDeep); + } + } + // Check for circular references and return its corresponding clone. + stack || (stack = new Stack); + var stacked = stack.get(value); + if (stacked) { + return stacked; + } + stack.set(value, result); + + var keysFunc = isFull + ? (isFlat ? getAllKeysIn : getAllKeys) + : (isFlat ? keysIn : keys); + + var props = isArr ? undefined : keysFunc(value); + arrayEach(props || value, function(subValue, key) { + if (props) { + key = subValue; + subValue = value[key]; + } + // Recursively populate clone (susceptible to call stack limits). + assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + return result; + } + + module.exports = baseClone; + + + /***/ }), + /* 64 */ + /***/ (function(module, exports, __webpack_require__) { + + var isObject = __webpack_require__(2); + + /** Built-in value references. */ + var objectCreate = Object.create; + + /** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} proto The object to inherit from. + * @returns {Object} Returns the new object. + */ + var baseCreate = (function() { + function object() {} + return function(proto) { + if (!isObject(proto)) { + return {}; + } + if (objectCreate) { + return objectCreate(proto); + } + object.prototype = proto; + var result = new object; + object.prototype = undefined; + return result; + }; + }()); + + module.exports = baseCreate; + + + /***/ }), + /* 65 */ + /***/ (function(module, exports, __webpack_require__) { + + var baseGetTag = __webpack_require__(6), + isObjectLike = __webpack_require__(21); + + /** `Object#toString` result references. */ + var argsTag = '[object Arguments]'; + + /** + * The base implementation of `_.isArguments`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + */ + function baseIsArguments(value) { + return isObjectLike(value) && baseGetTag(value) == argsTag; + } + + module.exports = baseIsArguments; + + + /***/ }), + /* 66 */ + /***/ (function(module, exports, __webpack_require__) { + + var isFunction = __webpack_require__(42), + isMasked = __webpack_require__(101), + isObject = __webpack_require__(2), + toSource = __webpack_require__(38); + + /** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ + var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + + /** Used to detect host constructors (Safari). */ + var reIsHostCtor = /^\[object .+?Constructor\]$/; + + /** Used for built-in method references. */ + var funcProto = Function.prototype, + objectProto = Object.prototype; + + /** Used to resolve the decompiled source of functions. */ + var funcToString = funcProto.toString; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** Used to detect if a method is native. */ + var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' + ); + + /** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ + function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = isFunction(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); + } + + module.exports = baseIsNative; + + + /***/ }), + /* 67 */ + /***/ (function(module, exports, __webpack_require__) { + + var baseGetTag = __webpack_require__(6), + isLength = __webpack_require__(43), + isObjectLike = __webpack_require__(21); + + /** `Object#toString` result references. */ + var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + mapTag = '[object Map]', + numberTag = '[object Number]', + objectTag = '[object Object]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + weakMapTag = '[object WeakMap]'; + + var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + + /** Used to identify `toStringTag` values of typed arrays. */ + var typedArrayTags = {}; + typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = + typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = + typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = + typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = + typedArrayTags[uint32Tag] = true; + typedArrayTags[argsTag] = typedArrayTags[arrayTag] = + typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = + typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = + typedArrayTags[errorTag] = typedArrayTags[funcTag] = + typedArrayTags[mapTag] = typedArrayTags[numberTag] = + typedArrayTags[objectTag] = typedArrayTags[regexpTag] = + typedArrayTags[setTag] = typedArrayTags[stringTag] = + typedArrayTags[weakMapTag] = false; + + /** + * The base implementation of `_.isTypedArray` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + */ + function baseIsTypedArray(value) { + return isObjectLike(value) && + isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; + } + + module.exports = baseIsTypedArray; + + + /***/ }), + /* 68 */ + /***/ (function(module, exports, __webpack_require__) { + + var isPrototype = __webpack_require__(18), + nativeKeys = __webpack_require__(113); + + /** Used for built-in method references. */ + var objectProto = Object.prototype; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** + * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function baseKeys(object) { + if (!isPrototype(object)) { + return nativeKeys(object); + } + var result = []; + for (var key in Object(object)) { + if (hasOwnProperty.call(object, key) && key != 'constructor') { + result.push(key); + } + } + return result; + } + + module.exports = baseKeys; + + + /***/ }), + /* 69 */ + /***/ (function(module, exports, __webpack_require__) { + + var isObject = __webpack_require__(2), + isPrototype = __webpack_require__(18), + nativeKeysIn = __webpack_require__(114); + + /** Used for built-in method references. */ + var objectProto = Object.prototype; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** + * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function baseKeysIn(object) { + if (!isObject(object)) { + return nativeKeysIn(object); + } + var isProto = isPrototype(object), + result = []; + + for (var key in object) { + if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; + } + + module.exports = baseKeysIn; + + + /***/ }), + /* 70 */ + /***/ (function(module, exports, __webpack_require__) { + + var constant = __webpack_require__(128), + defineProperty = __webpack_require__(32), + identity = __webpack_require__(40); + + /** + * The base implementation of `setToString` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ + var baseSetToString = !defineProperty ? identity : function(func, string) { + return defineProperty(func, 'toString', { + 'configurable': true, + 'enumerable': false, + 'value': constant(string), + 'writable': true + }); + }; + + module.exports = baseSetToString; + + + /***/ }), + /* 71 */ + /***/ (function(module, exports) { + + /** + * The base implementation of `_.times` without support for iteratee shorthands + * or max array length checks. + * + * @private + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the array of results. + */ + function baseTimes(n, iteratee) { + var index = -1, + result = Array(n); + + while (++index < n) { + result[index] = iteratee(index); + } + return result; + } + + module.exports = baseTimes; + + + /***/ }), + /* 72 */ + /***/ (function(module, exports) { + + /** + * The base implementation of `_.unary` without support for storing metadata. + * + * @private + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + */ + function baseUnary(func) { + return function(value) { + return func(value); + }; + } + + module.exports = baseUnary; + + + /***/ }), + /* 73 */ + /***/ (function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(module) {var root = __webpack_require__(0); + + /** Detect free variable `exports`. */ + var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; + + /** Detect free variable `module`. */ + var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + + /** Detect the popular CommonJS extension `module.exports`. */ + var moduleExports = freeModule && freeModule.exports === freeExports; + + /** Built-in value references. */ + var Buffer = moduleExports ? root.Buffer : undefined, + allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined; + + /** + * Creates a clone of `buffer`. + * + * @private + * @param {Buffer} buffer The buffer to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Buffer} Returns the cloned buffer. + */ + function cloneBuffer(buffer, isDeep) { + if (isDeep) { + return buffer.slice(); + } + var length = buffer.length, + result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); + + buffer.copy(result); + return result; + } + + module.exports = cloneBuffer; + + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(12)(module))) + + /***/ }), + /* 74 */ + /***/ (function(module, exports, __webpack_require__) { + + var cloneArrayBuffer = __webpack_require__(16); + + /** + * Creates a clone of `dataView`. + * + * @private + * @param {Object} dataView The data view to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned data view. + */ + function cloneDataView(dataView, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; + return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); + } + + module.exports = cloneDataView; + + + /***/ }), + /* 75 */ + /***/ (function(module, exports, __webpack_require__) { + + var addMapEntry = __webpack_require__(57), + arrayReduce = __webpack_require__(27), + mapToArray = __webpack_require__(112); + + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1; + + /** + * Creates a clone of `map`. + * + * @private + * @param {Object} map The map to clone. + * @param {Function} cloneFunc The function to clone values. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned map. + */ + function cloneMap(map, isDeep, cloneFunc) { + var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG) : mapToArray(map); + return arrayReduce(array, addMapEntry, new map.constructor); + } + + module.exports = cloneMap; + + + /***/ }), + /* 76 */ + /***/ (function(module, exports) { + + /** Used to match `RegExp` flags from their coerced string values. */ + var reFlags = /\w*$/; + + /** + * Creates a clone of `regexp`. + * + * @private + * @param {Object} regexp The regexp to clone. + * @returns {Object} Returns the cloned regexp. + */ + function cloneRegExp(regexp) { + var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); + result.lastIndex = regexp.lastIndex; + return result; + } + + module.exports = cloneRegExp; + + + /***/ }), + /* 77 */ + /***/ (function(module, exports, __webpack_require__) { + + var addSetEntry = __webpack_require__(58), + arrayReduce = __webpack_require__(27), + setToArray = __webpack_require__(118); + + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1; + + /** + * Creates a clone of `set`. + * + * @private + * @param {Object} set The set to clone. + * @param {Function} cloneFunc The function to clone values. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned set. + */ + function cloneSet(set, isDeep, cloneFunc) { + var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG) : setToArray(set); + return arrayReduce(array, addSetEntry, new set.constructor); + } + + module.exports = cloneSet; + + + /***/ }), + /* 78 */ + /***/ (function(module, exports, __webpack_require__) { + + var Symbol = __webpack_require__(15); + + /** Used to convert symbols to primitives and strings. */ + var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; + + /** + * Creates a clone of the `symbol` object. + * + * @private + * @param {Object} symbol The symbol object to clone. + * @returns {Object} Returns the cloned symbol object. + */ + function cloneSymbol(symbol) { + return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; + } + + module.exports = cloneSymbol; + + + /***/ }), + /* 79 */ + /***/ (function(module, exports, __webpack_require__) { + + var cloneArrayBuffer = __webpack_require__(16); + + /** + * Creates a clone of `typedArray`. + * + * @private + * @param {Object} typedArray The typed array to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned typed array. + */ + function cloneTypedArray(typedArray, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; + return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); + } + + module.exports = cloneTypedArray; + + + /***/ }), + /* 80 */ + /***/ (function(module, exports) { + + /** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ + function copyArray(source, array) { + var index = -1, + length = source.length; + + array || (array = Array(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; + } + + module.exports = copyArray; + + + /***/ }), + /* 81 */ + /***/ (function(module, exports, __webpack_require__) { + + var copyObject = __webpack_require__(3), + getSymbols = __webpack_require__(17); + + /** + * Copies own symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ + function copySymbols(source, object) { + return copyObject(source, getSymbols(source), object); + } + + module.exports = copySymbols; + + + /***/ }), + /* 82 */ + /***/ (function(module, exports, __webpack_require__) { + + var copyObject = __webpack_require__(3), + getSymbolsIn = __webpack_require__(35); + + /** + * Copies own and inherited symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ + function copySymbolsIn(source, object) { + return copyObject(source, getSymbolsIn(source), object); + } + + module.exports = copySymbolsIn; + + + /***/ }), + /* 83 */ + /***/ (function(module, exports, __webpack_require__) { + + var root = __webpack_require__(0); + + /** Used to detect overreaching core-js shims. */ + var coreJsData = root['__core-js_shared__']; + + module.exports = coreJsData; + + + /***/ }), + /* 84 */ + /***/ (function(module, exports, __webpack_require__) { + + var baseRest = __webpack_require__(31), + isIterateeCall = __webpack_require__(99); + + /** + * Creates a function like `_.assign`. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ + function createAssigner(assigner) { + return baseRest(function(object, sources) { + var index = -1, + length = sources.length, + customizer = length > 1 ? sources[length - 1] : undefined, + guard = length > 2 ? sources[2] : undefined; + + customizer = (assigner.length > 3 && typeof customizer == 'function') + ? (length--, customizer) + : undefined; + + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; + } + object = Object(object); + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, index, customizer); + } + } + return object; + }); + } + + module.exports = createAssigner; + + + /***/ }), + /* 85 */ + /***/ (function(module, exports, __webpack_require__) { + + var eq = __webpack_require__(9); + + /** Used for built-in method references. */ + var objectProto = Object.prototype; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** + * Used by `_.defaults` to customize its `_.assignIn` use to assign properties + * of source objects to the destination object for all destination properties + * that resolve to `undefined`. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to assign. + * @param {Object} object The parent object of `objValue`. + * @returns {*} Returns the value to assign. + */ + function customDefaultsAssignIn(objValue, srcValue, key, object) { + if (objValue === undefined || + (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) { + return srcValue; + } + return objValue; + } + + module.exports = customDefaultsAssignIn; + + + /***/ }), + /* 86 */ + /***/ (function(module, exports, __webpack_require__) { + + var baseGetAllKeys = __webpack_require__(30), + getSymbols = __webpack_require__(17), + keys = __webpack_require__(22); + + /** + * Creates an array of own enumerable property names and symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ + function getAllKeys(object) { + return baseGetAllKeys(object, keys, getSymbols); + } + + module.exports = getAllKeys; + + + /***/ }), + /* 87 */ + /***/ (function(module, exports, __webpack_require__) { + + var baseGetAllKeys = __webpack_require__(30), + getSymbolsIn = __webpack_require__(35), + keysIn = __webpack_require__(23); + + /** + * Creates an array of own and inherited enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ + function getAllKeysIn(object) { + return baseGetAllKeys(object, keysIn, getSymbolsIn); + } + + module.exports = getAllKeysIn; + + + /***/ }), + /* 88 */ + /***/ (function(module, exports, __webpack_require__) { + + var Symbol = __webpack_require__(15); + + /** Used for built-in method references. */ + var objectProto = Object.prototype; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ + var nativeObjectToString = objectProto.toString; + + /** Built-in value references. */ + var symToStringTag = Symbol ? Symbol.toStringTag : undefined; + + /** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ + function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), + tag = value[symToStringTag]; + + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; + } + + module.exports = getRawTag; + + + /***/ }), + /* 89 */ + /***/ (function(module, exports, __webpack_require__) { + + var DataView = __webpack_require__(49), + Map = __webpack_require__(14), + Promise = __webpack_require__(52), + Set = __webpack_require__(53), + WeakMap = __webpack_require__(56), + baseGetTag = __webpack_require__(6), + toSource = __webpack_require__(38); + + /** `Object#toString` result references. */ + var mapTag = '[object Map]', + objectTag = '[object Object]', + promiseTag = '[object Promise]', + setTag = '[object Set]', + weakMapTag = '[object WeakMap]'; + + var dataViewTag = '[object DataView]'; + + /** Used to detect maps, sets, and weakmaps. */ + var dataViewCtorString = toSource(DataView), + mapCtorString = toSource(Map), + promiseCtorString = toSource(Promise), + setCtorString = toSource(Set), + weakMapCtorString = toSource(WeakMap); + + /** + * Gets the `toStringTag` of `value`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + var getTag = baseGetTag; + +// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. + if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || + (Map && getTag(new Map) != mapTag) || + (Promise && getTag(Promise.resolve()) != promiseTag) || + (Set && getTag(new Set) != setTag) || + (WeakMap && getTag(new WeakMap) != weakMapTag)) { + getTag = function(value) { + var result = baseGetTag(value), + Ctor = result == objectTag ? value.constructor : undefined, + ctorString = Ctor ? toSource(Ctor) : ''; + + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: return dataViewTag; + case mapCtorString: return mapTag; + case promiseCtorString: return promiseTag; + case setCtorString: return setTag; + case weakMapCtorString: return weakMapTag; + } + } + return result; + }; + } + + module.exports = getTag; + + + /***/ }), + /* 90 */ + /***/ (function(module, exports) { + + /** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function getValue(object, key) { + return object == null ? undefined : object[key]; + } + + module.exports = getValue; + + + /***/ }), + /* 91 */ + /***/ (function(module, exports, __webpack_require__) { + + var nativeCreate = __webpack_require__(8); + + /** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ + function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + this.size = 0; + } + + module.exports = hashClear; + + + /***/ }), + /* 92 */ + /***/ (function(module, exports) { + + /** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; + } + + module.exports = hashDelete; + + + /***/ }), + /* 93 */ + /***/ (function(module, exports, __webpack_require__) { + + var nativeCreate = __webpack_require__(8); + + /** Used to stand-in for `undefined` hash values. */ + var HASH_UNDEFINED = '__lodash_hash_undefined__'; + + /** Used for built-in method references. */ + var objectProto = Object.prototype; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; + } + + module.exports = hashGet; + + + /***/ }), + /* 94 */ + /***/ (function(module, exports, __webpack_require__) { + + var nativeCreate = __webpack_require__(8); + + /** Used for built-in method references. */ + var objectProto = Object.prototype; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function hashHas(key) { + var data = this.__data__; + return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); + } + + module.exports = hashHas; + + + /***/ }), + /* 95 */ + /***/ (function(module, exports, __webpack_require__) { + + var nativeCreate = __webpack_require__(8); + + /** Used to stand-in for `undefined` hash values. */ + var HASH_UNDEFINED = '__lodash_hash_undefined__'; + + /** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ + function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; + } + + module.exports = hashSet; + + + /***/ }), + /* 96 */ + /***/ (function(module, exports) { + + /** Used for built-in method references. */ + var objectProto = Object.prototype; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** + * Initializes an array clone. + * + * @private + * @param {Array} array The array to clone. + * @returns {Array} Returns the initialized clone. + */ + function initCloneArray(array) { + var length = array.length, + result = array.constructor(length); + + // Add properties assigned by `RegExp#exec`. + if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { + result.index = array.index; + result.input = array.input; + } + return result; + } + + module.exports = initCloneArray; + + + /***/ }), + /* 97 */ + /***/ (function(module, exports, __webpack_require__) { + + var cloneArrayBuffer = __webpack_require__(16), + cloneDataView = __webpack_require__(74), + cloneMap = __webpack_require__(75), + cloneRegExp = __webpack_require__(76), + cloneSet = __webpack_require__(77), + cloneSymbol = __webpack_require__(78), + cloneTypedArray = __webpack_require__(79); + + /** `Object#toString` result references. */ + var boolTag = '[object Boolean]', + dateTag = '[object Date]', + mapTag = '[object Map]', + numberTag = '[object Number]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + symbolTag = '[object Symbol]'; + + var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + + /** + * Initializes an object clone based on its `toStringTag`. + * + * **Note:** This function only supports cloning values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to clone. + * @param {string} tag The `toStringTag` of the object to clone. + * @param {Function} cloneFunc The function to clone values. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the initialized clone. + */ + function initCloneByTag(object, tag, cloneFunc, isDeep) { + var Ctor = object.constructor; + switch (tag) { + case arrayBufferTag: + return cloneArrayBuffer(object); + + case boolTag: + case dateTag: + return new Ctor(+object); + + case dataViewTag: + return cloneDataView(object, isDeep); + + case float32Tag: case float64Tag: + case int8Tag: case int16Tag: case int32Tag: + case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: + return cloneTypedArray(object, isDeep); + + case mapTag: + return cloneMap(object, isDeep, cloneFunc); + + case numberTag: + case stringTag: + return new Ctor(object); + + case regexpTag: + return cloneRegExp(object); + + case setTag: + return cloneSet(object, isDeep, cloneFunc); + + case symbolTag: + return cloneSymbol(object); + } + } + + module.exports = initCloneByTag; + + + /***/ }), + /* 98 */ + /***/ (function(module, exports, __webpack_require__) { + + var baseCreate = __webpack_require__(64), + getPrototype = __webpack_require__(34), + isPrototype = __webpack_require__(18); + + /** + * Initializes an object clone. + * + * @private + * @param {Object} object The object to clone. + * @returns {Object} Returns the initialized clone. + */ + function initCloneObject(object) { + return (typeof object.constructor == 'function' && !isPrototype(object)) + ? baseCreate(getPrototype(object)) + : {}; + } + + module.exports = initCloneObject; + + + /***/ }), + /* 99 */ + /***/ (function(module, exports, __webpack_require__) { + + var eq = __webpack_require__(9), + isArrayLike = __webpack_require__(20), + isIndex = __webpack_require__(36), + isObject = __webpack_require__(2); + + /** + * Checks if the given arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, + * else `false`. + */ + function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object) + ) { + return eq(object[index], value); + } + return false; + } + + module.exports = isIterateeCall; + + + /***/ }), + /* 100 */ + /***/ (function(module, exports) { + + /** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ + function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); + } + + module.exports = isKeyable; + + + /***/ }), + /* 101 */ + /***/ (function(module, exports, __webpack_require__) { + + var coreJsData = __webpack_require__(83); + + /** Used to detect methods masquerading as native. */ + var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; + }()); + + /** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ + function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); + } + + module.exports = isMasked; + + + /***/ }), + /* 102 */ + /***/ (function(module, exports) { + + /** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ + function listCacheClear() { + this.__data__ = []; + this.size = 0; + } + + module.exports = listCacheClear; + + + /***/ }), + /* 103 */ + /***/ (function(module, exports, __webpack_require__) { + + var assocIndexOf = __webpack_require__(5); + + /** Used for built-in method references. */ + var arrayProto = Array.prototype; + + /** Built-in value references. */ + var splice = arrayProto.splice; + + /** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; + } + + module.exports = listCacheDelete; + + + /***/ }), + /* 104 */ + /***/ (function(module, exports, __webpack_require__) { + + var assocIndexOf = __webpack_require__(5); + + /** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; + } + + module.exports = listCacheGet; + + + /***/ }), + /* 105 */ + /***/ (function(module, exports, __webpack_require__) { + + var assocIndexOf = __webpack_require__(5); + + /** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; + } + + module.exports = listCacheHas; + + + /***/ }), + /* 106 */ + /***/ (function(module, exports, __webpack_require__) { + + var assocIndexOf = __webpack_require__(5); + + /** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ + function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; + } + + module.exports = listCacheSet; + + + /***/ }), + /* 107 */ + /***/ (function(module, exports, __webpack_require__) { + + var Hash = __webpack_require__(50), + ListCache = __webpack_require__(4), + Map = __webpack_require__(14); + + /** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ + function mapCacheClear() { + this.size = 0; + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; + } + + module.exports = mapCacheClear; + + + /***/ }), + /* 108 */ + /***/ (function(module, exports, __webpack_require__) { + + var getMapData = __webpack_require__(7); + + /** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function mapCacheDelete(key) { + var result = getMapData(this, key)['delete'](key); + this.size -= result ? 1 : 0; + return result; + } + + module.exports = mapCacheDelete; + + + /***/ }), + /* 109 */ + /***/ (function(module, exports, __webpack_require__) { + + var getMapData = __webpack_require__(7); + + /** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function mapCacheGet(key) { + return getMapData(this, key).get(key); + } + + module.exports = mapCacheGet; + + + /***/ }), + /* 110 */ + /***/ (function(module, exports, __webpack_require__) { + + var getMapData = __webpack_require__(7); + + /** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function mapCacheHas(key) { + return getMapData(this, key).has(key); + } + + module.exports = mapCacheHas; + + + /***/ }), + /* 111 */ + /***/ (function(module, exports, __webpack_require__) { + + var getMapData = __webpack_require__(7); + + /** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ + function mapCacheSet(key, value) { + var data = getMapData(this, key), + size = data.size; + + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; + } + + module.exports = mapCacheSet; + + + /***/ }), + /* 112 */ + /***/ (function(module, exports) { + + /** + * Converts `map` to its key-value pairs. + * + * @private + * @param {Object} map The map to convert. + * @returns {Array} Returns the key-value pairs. + */ + function mapToArray(map) { + var index = -1, + result = Array(map.size); + + map.forEach(function(value, key) { + result[++index] = [key, value]; + }); + return result; + } + + module.exports = mapToArray; + + + /***/ }), + /* 113 */ + /***/ (function(module, exports, __webpack_require__) { + + var overArg = __webpack_require__(37); + + /* Built-in method references for those with the same name as other `lodash` methods. */ + var nativeKeys = overArg(Object.keys, Object); + + module.exports = nativeKeys; + + + /***/ }), + /* 114 */ + /***/ (function(module, exports) { + + /** + * This function is like + * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * except that it includes inherited enumerable properties. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function nativeKeysIn(object) { + var result = []; + if (object != null) { + for (var key in Object(object)) { + result.push(key); + } + } + return result; + } + + module.exports = nativeKeysIn; + + + /***/ }), + /* 115 */ + /***/ (function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(module) {var freeGlobal = __webpack_require__(33); + + /** Detect free variable `exports`. */ + var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; + + /** Detect free variable `module`. */ + var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + + /** Detect the popular CommonJS extension `module.exports`. */ + var moduleExports = freeModule && freeModule.exports === freeExports; + + /** Detect free variable `process` from Node.js. */ + var freeProcess = moduleExports && freeGlobal.process; + + /** Used to access faster Node.js helpers. */ + var nodeUtil = (function() { + try { + return freeProcess && freeProcess.binding && freeProcess.binding('util'); + } catch (e) {} + }()); + + module.exports = nodeUtil; + + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(12)(module))) + + /***/ }), + /* 116 */ + /***/ (function(module, exports) { + + /** Used for built-in method references. */ + var objectProto = Object.prototype; + + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ + var nativeObjectToString = objectProto.toString; + + /** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ + function objectToString(value) { + return nativeObjectToString.call(value); + } + + module.exports = objectToString; + + + /***/ }), + /* 117 */ + /***/ (function(module, exports, __webpack_require__) { + + var apply = __webpack_require__(24); + + /* Built-in method references for those with the same name as other `lodash` methods. */ + var nativeMax = Math.max; + + /** + * A specialized version of `baseRest` which transforms the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @param {Function} transform The rest array transform. + * @returns {Function} Returns the new function. + */ + function overRest(func, start, transform) { + start = nativeMax(start === undefined ? (func.length - 1) : start, 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + array = Array(length); + + while (++index < length) { + array[index] = args[start + index]; + } + index = -1; + var otherArgs = Array(start + 1); + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = transform(array); + return apply(func, this, otherArgs); + }; + } + + module.exports = overRest; + + + /***/ }), + /* 118 */ + /***/ (function(module, exports) { + + /** + * Converts `set` to an array of its values. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the values. + */ + function setToArray(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = value; + }); + return result; + } + + module.exports = setToArray; + + + /***/ }), + /* 119 */ + /***/ (function(module, exports, __webpack_require__) { + + var baseSetToString = __webpack_require__(70), + shortOut = __webpack_require__(120); + + /** + * Sets the `toString` method of `func` to return `string`. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ + var setToString = shortOut(baseSetToString); + + module.exports = setToString; + + + /***/ }), + /* 120 */ + /***/ (function(module, exports) { + + /** Used to detect hot functions by number of calls within a span of milliseconds. */ + var HOT_COUNT = 800, + HOT_SPAN = 16; + + /* Built-in method references for those with the same name as other `lodash` methods. */ + var nativeNow = Date.now; + + /** + * Creates a function that'll short out and invoke `identity` instead + * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` + * milliseconds. + * + * @private + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new shortable function. + */ + function shortOut(func) { + var count = 0, + lastCalled = 0; + + return function() { + var stamp = nativeNow(), + remaining = HOT_SPAN - (stamp - lastCalled); + + lastCalled = stamp; + if (remaining > 0) { + if (++count >= HOT_COUNT) { + return arguments[0]; + } + } else { + count = 0; + } + return func.apply(undefined, arguments); + }; + } + + module.exports = shortOut; + + + /***/ }), + /* 121 */ + /***/ (function(module, exports, __webpack_require__) { + + var ListCache = __webpack_require__(4); + + /** + * Removes all key-value entries from the stack. + * + * @private + * @name clear + * @memberOf Stack + */ + function stackClear() { + this.__data__ = new ListCache; + this.size = 0; + } + + module.exports = stackClear; + + + /***/ }), + /* 122 */ + /***/ (function(module, exports) { + + /** + * Removes `key` and its value from the stack. + * + * @private + * @name delete + * @memberOf Stack + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function stackDelete(key) { + var data = this.__data__, + result = data['delete'](key); + + this.size = data.size; + return result; + } + + module.exports = stackDelete; + + + /***/ }), + /* 123 */ + /***/ (function(module, exports) { + + /** + * Gets the stack value for `key`. + * + * @private + * @name get + * @memberOf Stack + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function stackGet(key) { + return this.__data__.get(key); + } + + module.exports = stackGet; + + + /***/ }), + /* 124 */ + /***/ (function(module, exports) { + + /** + * Checks if a stack value for `key` exists. + * + * @private + * @name has + * @memberOf Stack + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function stackHas(key) { + return this.__data__.has(key); + } + + module.exports = stackHas; + + + /***/ }), + /* 125 */ + /***/ (function(module, exports, __webpack_require__) { + + var ListCache = __webpack_require__(4), + Map = __webpack_require__(14), + MapCache = __webpack_require__(51); + + /** Used as the size to enable large array optimizations. */ + var LARGE_ARRAY_SIZE = 200; + + /** + * Sets the stack `key` to `value`. + * + * @private + * @name set + * @memberOf Stack + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the stack cache instance. + */ + function stackSet(key, value) { + var data = this.__data__; + if (data instanceof ListCache) { + var pairs = data.__data__; + if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { + pairs.push([key, value]); + this.size = ++data.size; + return this; + } + data = this.__data__ = new MapCache(pairs); + } + data.set(key, value); + this.size = data.size; + return this; + } + + module.exports = stackSet; + + + /***/ }), + /* 126 */ + /***/ (function(module, exports, __webpack_require__) { + + var copyObject = __webpack_require__(3), + createAssigner = __webpack_require__(84), + keysIn = __webpack_require__(23); + + /** + * This method is like `_.assignIn` except that it accepts `customizer` + * which is invoked to produce the assigned values. If `customizer` returns + * `undefined`, assignment is handled by the method instead. The `customizer` + * is invoked with five arguments: (objValue, srcValue, key, object, source). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extendWith + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @see _.assignWith + * @example + * + * function customizer(objValue, srcValue) { + * return _.isUndefined(objValue) ? srcValue : objValue; + * } + * + * var defaults = _.partialRight(_.assignInWith, customizer); + * + * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var assignInWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keysIn(source), object, customizer); + }); + + module.exports = assignInWith; + + + /***/ }), + /* 127 */ + /***/ (function(module, exports, __webpack_require__) { + + var baseClone = __webpack_require__(63); + + /** Used to compose bitmasks for cloning. */ + var CLONE_SYMBOLS_FLAG = 4; + + /** + * Creates a shallow clone of `value`. + * + * **Note:** This method is loosely based on the + * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) + * and supports cloning arrays, array buffers, booleans, date objects, maps, + * numbers, `Object` objects, regexes, sets, strings, symbols, and typed + * arrays. The own enumerable properties of `arguments` objects are cloned + * as plain objects. An empty object is returned for uncloneable values such + * as error objects, functions, DOM nodes, and WeakMaps. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to clone. + * @returns {*} Returns the cloned value. + * @see _.cloneDeep + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var shallow = _.clone(objects); + * console.log(shallow[0] === objects[0]); + * // => true + */ + function clone(value) { + return baseClone(value, CLONE_SYMBOLS_FLAG); + } + + module.exports = clone; + + + /***/ }), + /* 128 */ + /***/ (function(module, exports) { + + /** + * Creates a function that returns `value`. + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Util + * @param {*} value The value to return from the new function. + * @returns {Function} Returns the new constant function. + * @example + * + * var objects = _.times(2, _.constant({ 'a': 1 })); + * + * console.log(objects); + * // => [{ 'a': 1 }, { 'a': 1 }] + * + * console.log(objects[0] === objects[1]); + * // => true + */ + function constant(value) { + return function() { + return value; + }; + } + + module.exports = constant; + + + /***/ }), + /* 129 */ + /***/ (function(module, exports, __webpack_require__) { + + var baseIsArguments = __webpack_require__(65), + isObjectLike = __webpack_require__(21); + + /** Used for built-in method references. */ + var objectProto = Object.prototype; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** Built-in value references. */ + var propertyIsEnumerable = objectProto.propertyIsEnumerable; + + /** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ + var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { + return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && + !propertyIsEnumerable.call(value, 'callee'); + }; + + module.exports = isArguments; + + + /***/ }), + /* 130 */ + /***/ (function(module, exports, __webpack_require__) { + + var baseIsTypedArray = __webpack_require__(67), + baseUnary = __webpack_require__(72), + nodeUtil = __webpack_require__(115); + + /* Node.js helper references. */ + var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; + + /** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ + var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; + + module.exports = isTypedArray; + + + /***/ }), + /* 131 */ + /***/ (function(module, exports) { + + /** + * This method returns `false`. + * + * @static + * @memberOf _ + * @since 4.13.0 + * @category Util + * @returns {boolean} Returns `false`. + * @example + * + * _.times(2, _.stubFalse); + * // => [false, false] + */ + function stubFalse() { + return false; + } + + module.exports = stubFalse; + + + /***/ }), + /* 132 */ + /***/ (function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(module, global) {var __WEBPACK_AMD_DEFINE_RESULT__;/*! https://mths.be/punycode v1.4.1 by @mathias */ + ;(function(root) { + + /** Detect free variables */ + var freeExports = typeof exports == 'object' && exports && + !exports.nodeType && exports; + var freeModule = typeof module == 'object' && module && + !module.nodeType && module; + var freeGlobal = typeof global == 'object' && global; + if ( + freeGlobal.global === freeGlobal || + freeGlobal.window === freeGlobal || + freeGlobal.self === freeGlobal + ) { + root = freeGlobal; + } + + /** + * The `punycode` object. + * @name punycode + * @type Object + */ + var punycode, + + /** Highest positive signed 32-bit float value */ + maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1 + + /** Bootstring parameters */ + base = 36, + tMin = 1, + tMax = 26, + skew = 38, + damp = 700, + initialBias = 72, + initialN = 128, // 0x80 + delimiter = '-', // '\x2D' + + /** Regular expressions */ + regexPunycode = /^xn--/, + regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars + regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators + + /** Error messages */ + errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' + }, + + /** Convenience shortcuts */ + baseMinusTMin = base - tMin, + floor = Math.floor, + stringFromCharCode = String.fromCharCode, + + /** Temporary variable */ + key; + + /*--------------------------------------------------------------------------*/ + + /** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ + function error(type) { + throw new RangeError(errors[type]); + } + + /** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ + function map(array, fn) { + var length = array.length; + var result = []; + while (length--) { + result[length] = fn(array[length]); + } + return result; + } + + /** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ + function mapDomain(string, fn) { + var parts = string.split('@'); + var result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + var labels = string.split('.'); + var encoded = map(labels, fn).join('.'); + return result + encoded; + } + + /** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ + function ucs2decode(string) { + var output = [], + counter = 0, + length = string.length, + value, + extra; + while (counter < length) { + value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // high surrogate, and there is a next character + extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { // low surrogate + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // unmatched surrogate; only append this code unit, in case the next + // code unit is the high surrogate of a surrogate pair + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; + } + + /** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ + function ucs2encode(array) { + return map(array, function(value) { + var output = ''; + if (value > 0xFFFF) { + value -= 0x10000; + output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); + value = 0xDC00 | value & 0x3FF; + } + output += stringFromCharCode(value); + return output; + }).join(''); + } + + /** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ + function basicToDigit(codePoint) { + if (codePoint - 48 < 10) { + return codePoint - 22; + } + if (codePoint - 65 < 26) { + return codePoint - 65; + } + if (codePoint - 97 < 26) { + return codePoint - 97; + } + return base; + } + + /** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ + function digitToBasic(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); + } + + /** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ + function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); + } + + /** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ + function decode(input) { + // Don't use UCS-2 + var output = [], + inputLength = input.length, + out, + i = 0, + n = initialN, + bias = initialBias, + basic, + j, + index, + oldi, + w, + k, + digit, + t, + /** Cached calculation results */ + baseMinusT; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + for (oldi = i, w = 1, k = base; /* no condition */; k += base) { + + if (index >= inputLength) { + error('invalid-input'); + } + + digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error('overflow'); + } + + i += digit * w; + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + + if (digit < t) { + break; + } + + baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error('overflow'); + } + + w *= baseMinusT; + + } + + out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output + output.splice(i++, 0, n); + + } + + return ucs2encode(output); + } + + /** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ + function encode(input) { + var n, + delta, + handledCPCount, + basicLength, + bias, + j, + m, + q, + k, + t, + currentValue, + output = [], + /** `inputLength` will hold the number of code points in `input`. */ + inputLength, + /** Cached calculation results */ + handledCPCountPlusOne, + baseMinusT, + qMinusT; + + // Convert the input in UCS-2 to Unicode + input = ucs2decode(input); + + // Cache the length + inputLength = input.length; + + // Initialize the state + n = initialN; + delta = 0; + bias = initialBias; + + // Handle the basic code points + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + handledCPCount = basicLength = output.length; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string - if it is not empty - with a delimiter + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + for (m = maxInt, j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow + handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + + if (currentValue < n && ++delta > maxInt) { + error('overflow'); + } + + if (currentValue == n) { + // Represent delta as a generalized variable-length integer + for (q = delta, k = base; /* no condition */; k += base) { + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + if (q < t) { + break; + } + qMinusT = q - t; + baseMinusT = base - t; + output.push( + stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) + ); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + + } + return output.join(''); + } + + /** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ + function toUnicode(input) { + return mapDomain(input, function(string) { + return regexPunycode.test(string) + ? decode(string.slice(4).toLowerCase()) + : string; + }); + } + + /** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ + function toASCII(input) { + return mapDomain(input, function(string) { + return regexNonASCII.test(string) + ? 'xn--' + encode(string) + : string; + }); + } + + /*--------------------------------------------------------------------------*/ + + /** Define the public API */ + punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '1.4.1', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode + }; + + /** Expose `punycode` */ + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + true + ) { + !(__WEBPACK_AMD_DEFINE_RESULT__ = function() { + return punycode; + }.call(exports, __webpack_require__, exports, module), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else if (freeExports && freeModule) { + if (module.exports == freeExports) { + // in Node.js, io.js, or RingoJS v0.8.0+ + freeModule.exports = punycode; + } else { + // in Narwhal or RingoJS v0.7.0- + for (key in punycode) { + punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]); + } + } + } else { + // in Rhino or a web browser + root.punycode = punycode; + } + + }(this)); + + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(12)(module), __webpack_require__(11))) + + /***/ }), + /* 133 */ + /***/ (function(module, exports, __webpack_require__) { + + "use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + + + +// If obj.hasOwnProperty has been overridden, then calling +// obj.hasOwnProperty(prop) will break. +// See: https://github.com/joyent/node/issues/1707 + function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); + } + + module.exports = function(qs, sep, eq, options) { + sep = sep || '&'; + eq = eq || '='; + var obj = {}; + + if (typeof qs !== 'string' || qs.length === 0) { + return obj; + } + + var regexp = /\+/g; + qs = qs.split(sep); + + var maxKeys = 1000; + if (options && typeof options.maxKeys === 'number') { + maxKeys = options.maxKeys; + } + + var len = qs.length; + // maxKeys <= 0 means that we should not limit keys count + if (maxKeys > 0 && len > maxKeys) { + len = maxKeys; + } + + for (var i = 0; i < len; ++i) { + var x = qs[i].replace(regexp, '%20'), + idx = x.indexOf(eq), + kstr, vstr, k, v; + + if (idx >= 0) { + kstr = x.substr(0, idx); + vstr = x.substr(idx + 1); + } else { + kstr = x; + vstr = ''; + } + + k = decodeURIComponent(kstr); + v = decodeURIComponent(vstr); + + if (!hasOwnProperty(obj, k)) { + obj[k] = v; + } else if (isArray(obj[k])) { + obj[k].push(v); + } else { + obj[k] = [obj[k], v]; + } + } + + return obj; + }; + + var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; + }; + + + /***/ }), + /* 134 */ + /***/ (function(module, exports, __webpack_require__) { + + "use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + + + + var stringifyPrimitive = function(v) { + switch (typeof v) { + case 'string': + return v; + + case 'boolean': + return v ? 'true' : 'false'; + + case 'number': + return isFinite(v) ? v : ''; + + default: + return ''; + } + }; + + module.exports = function(obj, sep, eq, name) { + sep = sep || '&'; + eq = eq || '='; + if (obj === null) { + obj = undefined; + } + + if (typeof obj === 'object') { + return map(objectKeys(obj), function(k) { + var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; + if (isArray(obj[k])) { + return map(obj[k], function(v) { + return ks + encodeURIComponent(stringifyPrimitive(v)); + }).join(sep); + } else { + return ks + encodeURIComponent(stringifyPrimitive(obj[k])); + } + }).join(sep); + + } + + if (!name) return ''; + return encodeURIComponent(stringifyPrimitive(name)) + eq + + encodeURIComponent(stringifyPrimitive(obj)); + }; + + var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; + }; + + function map (xs, f) { + if (xs.map) return xs.map(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + res.push(f(xs[i], i)); + } + return res; + } + + var objectKeys = Object.keys || function (obj) { + var res = []; + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key); + } + return res; + }; + + + /***/ }), + /* 135 */ + /***/ (function(module, exports, __webpack_require__) { + + "use strict"; + + + exports.decode = exports.parse = __webpack_require__(133); + exports.encode = exports.stringify = __webpack_require__(134); + + + /***/ }), + /* 136 */ + /***/ (function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) { + "use strict"; + + if (global.setImmediate) { + return; + } + + var nextHandle = 1; // Spec says greater than zero + var tasksByHandle = {}; + var currentlyRunningATask = false; + var doc = global.document; + var registerImmediate; + + function setImmediate(callback) { + // Callback can either be a function or a string + if (typeof callback !== "function") { + callback = new Function("" + callback); + } + // Copy function arguments + var args = new Array(arguments.length - 1); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i + 1]; + } + // Store and register the task + var task = { callback: callback, args: args }; + tasksByHandle[nextHandle] = task; + registerImmediate(nextHandle); + return nextHandle++; + } + + function clearImmediate(handle) { + delete tasksByHandle[handle]; + } + + function run(task) { + var callback = task.callback; + var args = task.args; + switch (args.length) { + case 0: + callback(); + break; + case 1: + callback(args[0]); + break; + case 2: + callback(args[0], args[1]); + break; + case 3: + callback(args[0], args[1], args[2]); + break; + default: + callback.apply(undefined, args); + break; + } + } + + function runIfPresent(handle) { + // From the spec: "Wait until any invocations of this algorithm started before this one have completed." + // So if we're currently running a task, we'll need to delay this invocation. + if (currentlyRunningATask) { + // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a + // "too much recursion" error. + setTimeout(runIfPresent, 0, handle); + } else { + var task = tasksByHandle[handle]; + if (task) { + currentlyRunningATask = true; + try { + run(task); + } finally { + clearImmediate(handle); + currentlyRunningATask = false; + } + } + } + } + + function installNextTickImplementation() { + registerImmediate = function(handle) { + process.nextTick(function () { runIfPresent(handle); }); + }; + } + + function canUsePostMessage() { + // The test against `importScripts` prevents this implementation from being installed inside a web worker, + // where `global.postMessage` means something completely different and can't be used for this purpose. + if (global.postMessage && !global.importScripts) { + var postMessageIsAsynchronous = true; + var oldOnMessage = global.onmessage; + global.onmessage = function() { + postMessageIsAsynchronous = false; + }; + global.postMessage("", "*"); + global.onmessage = oldOnMessage; + return postMessageIsAsynchronous; + } + } + + function installPostMessageImplementation() { + // Installs an event handler on `global` for the `message` event: see + // * https://developer.mozilla.org/en/DOM/window.postMessage + // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages + + var messagePrefix = "setImmediate$" + Math.random() + "$"; + var onGlobalMessage = function(event) { + if (event.source === global && + typeof event.data === "string" && + event.data.indexOf(messagePrefix) === 0) { + runIfPresent(+event.data.slice(messagePrefix.length)); + } + }; + + if (global.addEventListener) { + global.addEventListener("message", onGlobalMessage, false); + } else { + global.attachEvent("onmessage", onGlobalMessage); + } + + registerImmediate = function(handle) { + global.postMessage(messagePrefix + handle, "*"); + }; + } + + function installMessageChannelImplementation() { + var channel = new MessageChannel(); + channel.port1.onmessage = function(event) { + var handle = event.data; + runIfPresent(handle); + }; + + registerImmediate = function(handle) { + channel.port2.postMessage(handle); + }; + } + + function installReadyStateChangeImplementation() { + var html = doc.documentElement; + registerImmediate = function(handle) { + // Create a \ No newline at end of file diff --git a/src/renderer/views/components/mediaitem-artwork.ejs b/src/renderer/views/components/mediaitem-artwork.ejs index 7c96e926..7e169943 100644 --- a/src/renderer/views/components/mediaitem-artwork.ejs +++ b/src/renderer/views/components/mediaitem-artwork.ejs @@ -1,5 +1,5 @@ \ No newline at end of file + diff --git a/src/renderer/views/components/mediaitem-square-large.ejs b/src/renderer/views/components/mediaitem-square-large.ejs index 04b713b1..4bb1098f 100644 --- a/src/renderer/views/components/mediaitem-square-large.ejs +++ b/src/renderer/views/components/mediaitem-square-large.ejs @@ -1,5 +1,4 @@ @@ -43,8 +55,9 @@ }, size: { type: String, - default: '300' - } + default: '190' + }, + 'contextExt': {type: Object, required: false}, }, data: function () { return { @@ -53,16 +66,105 @@ guid: this.uuidv4(), noplay: ["apple-curators"], nomenu: ["artists", "stations", "apple-curators"], - app: this.$root + app: this.$root, + badges: this.$root.socialBadges.badgeMap, + itemBadges: [] } }, + async mounted() { + await this.getBadges() + }, methods: { + getBgColor() { + let color = `#${(this.item.attributes.artwork.bgColor != null) ? (this.item.attributes.artwork.bgColor) : `333333`}` + let c = color.substring(1); // strip # + var rgb = parseInt(c, 16); // convert rrggbb to decimal + var r = (rgb >> 16) & 0xff; // extract red + var g = (rgb >> 8) & 0xff; // extract green + var b = (rgb >> 0) & 0xff; // extract blue + + var luma = 0.2126 * r + 0.7152 * g + 0.0722 * b; // per ITU-R BT.709 + + console.log(color) + console.log(luma) + if (luma > 140) { + return "#aaaaaa" + }else{ + return color + } + + + }, + getSubtitle() { + if(this.kind == 'card') { + try { + if (typeof this.item.attributes.artistNames != "undefined") { + return this.item.attributes.artistNames + } else if (typeof this.item.attributes.editorialNotes != "undefined") { + return this.item.attributes.editorialNotes.short + } else if (typeof this.item.attributes.artistName != "undefined") { + return this.item.attributes.artistName + } else { + return '' + } + }catch(e) { + return '' + } + }else { + if (typeof this.item.attributes.artistName != "undefined") { + return this.item.attributes.artistName + } else { + return '' + } + } + }, + getSubtitleNavigation() { + if(this.kind == 'card') { + try { + if (typeof this.item.attributes.artistNames != "undefined") { + return app.routeView(this.item) + } else if (typeof this.item.attributes.editorialNotes != "undefined") { + return app.routeView(this.item) + } else if (typeof this.item.attributes.artistName != "undefined") { + return app.searchAndNavigate(this.item,'artist') + } else { + return app.routeView(this.item) + } + }catch(e) { + return app.routeView(this.item) + } + }else { + if (typeof this.item.attributes.artistName != "undefined") { + return app.searchAndNavigate(this.item,'artist') + } else { + return app.routeView(this.item) + } + } + }, + async getBadges() { + let self = this + if (this.badges[this.item.attributes.playParams.id ?? this.item.id]) { + let friends = this.badges[this.item.attributes.playParams.id ?? this.item.id] + if (friends) { + friends.forEach(function (friend) { + self.app.mk.api.socialProfile(friend).then(data => { + self.itemBadges.push(data) + }) + }) + } + } + }, revisedRandId() { return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(2, 10); }, async isInLibrary() { if (this.item.type && !this.item.type.includes("library")) { - var params = {"fields[playlists]": "inLibrary", "fields[albums]": "inLibrary", "relate": "library", "extend": this.revisedRandId()} + var params = { + "fields[playlists]": "inLibrary", + "fields[albums]": "inLibrary", + "relate": "library", + "extend": this.revisedRandId() + } var res = await app.mkapi(this.item.attributes.playParams.kind ?? this.item.type, this.item.attributes.playParams.isLibrary ?? false, this.item.attributes.playParams.id ?? this.item.id, params); this.addedToLibrary = (res && res.attributes && res.attributes.inLibrary) ? res.attributes.inLibrary : false } else { @@ -70,7 +172,13 @@ } }, async removeFromLibrary(id) { - var params = {"fields[playlists]": "inLibrary","fields[songs]": "inLibrary", "fields[albums]": "inLibrary", "relate": "library", "extend": this.revisedRandId()} + var params = { + "fields[playlists]": "inLibrary", + "fields[songs]": "inLibrary", + "fields[albums]": "inLibrary", + "relate": "library", + "extend": this.revisedRandId() + } var id = this.item.id ?? this.item.attributes.playParams.id var res = await app.mkapi(this.item.attributes.playParams.kind ?? this.item.type, this.item.attributes.playParams.isLibrary ?? false, this.item.attributes.playParams.id ?? this.item.id, params); if (res && res.relationships && res.relationships.library && res.relationships.library.data && res.relationships.library.data.length > 0) { @@ -86,14 +194,21 @@ (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) ); }, - getArtworkUrl() { + getArtworkUrl(size = -1, includeUrl = false) { let artwork = this.item.attributes.artwork ? this.item.attributes.artwork.url : '' + if(size != -1) { + artwork = artwork.replace('{w}', size).replace('{h}', size).replace('{f}', "webp").replace('{c}', ((size === 900) ? "sr" : "cc")) + } switch (this.kind) { case "385": artwork = this.item.attributes.editorialArtwork.subscriptionHero.url break; } - return artwork + if(!includeUrl) { + return artwork + }else{ + return `url("${artwork}")` + } }, getClasses() { let type = this.item.type @@ -104,12 +219,15 @@ default: return [] break; + case "card": + return ["mediaitem-card"] + break; case "385": // editorial return ["mediaitem-brick"] break; case "small": return ["mediaitem-small"] - break; + break; case "music-videos": case "uploadedVideo": case "uploaded-videos": @@ -120,7 +238,7 @@ visibilityChanged: function (isVisible, entry) { this.isVisible = isVisible }, - async contextMenu(event) { + async contextMenu(event) { if (this.nomenu.includes(this.item.type)) { return } @@ -134,7 +252,7 @@ let useMenu = "normal" if (app.selectedMediaItems.length <= 1) { app.selectedMediaItems = [] - app.select_selectMediaItem(this.item.attributes.playParams.id ?? this.item.id, this.item.attributes.playParams.kind ?? this.item.type, this.index, this.guid) + app.select_selectMediaItem(this.item.attributes.playParams.id ?? this.item.id, this.item.attributes.playParams.kind ?? this.item.type, this.index, this.guid, this.item.attributes.playParams.isLibrary ?? false) } else { useMenu = "multiple" } @@ -186,6 +304,14 @@ }, normal: { items: [ + { + "icon": "./assets/feather/list.svg", + "id": "addToPlaylist", + "name": "Add to Playlist...", + "action": function () { + app.promptAddToPlaylist() + } + }, { "name": "Play Next", "action": function () { @@ -203,31 +329,100 @@ } }, { - "name": "Add to Playlist...", - "action": function () { - app.promptAddToPlaylist() - } - }, - { - "name": (this.addedToLibrary) ? "Remove from Library..." : "Add to Library...", + "icon": "./assets/feather/plus.svg", + "name": (this.addedToLibrary) ? "Remove from Library..." : "Add to Library...", "action": async function () { let item_id = self.item.attributes.playParams.id ?? self.item.id; let data_type = self.item.attributes.playParams.kind ?? self.item.type; - if (self.addedToLibrary != true) { console.log("add"); app.addToLibrary(item_id); self.addedToLibrary = true} - else { console.log("remove"); await self.removeFromLibrary(item_id); self.addedToLibrary = false}; + if (self.addedToLibrary != true) { + console.log("add"); + app.addToLibrary(item_id); + self.addedToLibrary = true + } else { + console.log("remove"); + await self.removeFromLibrary(item_id); + self.addedToLibrary = false + } + ; } }, + { + "icon": "./assets/feather/heart.svg", + "id": "love", + "name": "Love", + "disabled": true, + "action": function () { + app.love(self.item) + } + }, + { + "icon": "./assets/feather/x-circle.svg", + "id": "unlove", + "name": "Unlove", + "disabled": true, + "action": function () { + app.unlove(self.item) + } + }, + { + "icon": "./assets/feather/thumbs-down.svg", + "id": "dislike", + "name": "Dislike", + "disabled": true, + "action": function () { + app.dislike(self.item) + } + }, + { + "icon": "./assets/feather/x-circle.svg", + "id": "undo_dislike", + "name": "Undo dislike", + "disabled": true, + "action": function () { + app.unlove(self.item) + } + }, + { + "icon": "./assets/feather/share.svg", + "name": "Share", + "action": function () { + self.app.copyToClipboard(self.item.attributes.url) + } + } ] } } - if ((self.item.attributes.playParams.kind ?? self.item.type).includes("playlist")) { menus.normal.items.splice(2, 1);} + if ((self.item.attributes.playParams.kind ?? self.item.type).includes("playlist")) { + // remove the add to playlist option by id "addToPlaylist" using the .filter() method + menus.normal.items = menus.normal.items.filter(function (item) { + return item.id != "addToPlaylist" + }) + } + let rating = await app.getRating(self.item) + if (rating == 0) { + menus.normal.items.find(x => x.id == 'love').disabled = false + menus.normal.items.find(x => x.id == 'dislike').disabled = false + } else if (rating == 1) { + menus.normal.items.find(x => x.id == 'unlove').disabled = false + } else if (rating == -1) { + menus.normal.items.find(x => x.id == 'undo_dislike').disabled = false + } + + if (this.contextExt) { + if (this.contextExt.normal) { + menus.normal.items = menus.normal.items.concat(this.contextExt.normal) + } + if (this.contextExt.multiple) { + menus.multiple.items = menus.multiple.items.concat(this.contextExt.multiple) + } + } CiderContextMenu.Create(event, menus[useMenu]) }, }, beforeDestroy: function () { - this.item = null; - this.kind = null; - this.size = null; + // this.item = null; + // this.kind = null; + // this.size = null; } }); \ No newline at end of file diff --git a/src/renderer/views/components/sidebar-playlist.ejs b/src/renderer/views/components/sidebar-playlist.ejs new file mode 100644 index 00000000..b5ba0271 --- /dev/null +++ b/src/renderer/views/components/sidebar-playlist.ejs @@ -0,0 +1,221 @@ + + + \ No newline at end of file diff --git a/src/renderer/views/components/spatial-properties.ejs b/src/renderer/views/components/spatial-properties.ejs new file mode 100644 index 00000000..4627f8f6 --- /dev/null +++ b/src/renderer/views/components/spatial-properties.ejs @@ -0,0 +1,355 @@ + + + \ No newline at end of file diff --git a/src/renderer/views/main.ejs b/src/renderer/views/main.ejs index f914890d..e0d409a3 100644 --- a/src/renderer/views/main.ejs +++ b/src/renderer/views/main.ejs @@ -18,9 +18,11 @@ + + @@ -67,7 +69,9 @@ + + + + diff --git a/src/renderer/views/svg/explicit.svg b/src/renderer/views/svg/explicit.svg new file mode 100644 index 00000000..b9f347b4 --- /dev/null +++ b/src/renderer/views/svg/explicit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/views/svg/list.svg b/src/renderer/views/svg/list.svg new file mode 100644 index 00000000..5a8ca2c3 --- /dev/null +++ b/src/renderer/views/svg/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/views/svg/quote-right.svg b/src/renderer/views/svg/quote-right.svg new file mode 100644 index 00000000..629ab4ee --- /dev/null +++ b/src/renderer/views/svg/quote-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/vuex.min.js b/src/renderer/vuex.min.js new file mode 100644 index 00000000..0ffa5978 --- /dev/null +++ b/src/renderer/vuex.min.js @@ -0,0 +1,6 @@ +/** + * vuex v2.0.0 + * (c) 2016 Evan You + * @license MIT + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.Vuex=e()}(this,function(){"use strict";function t(t){b&&(t._devtoolHook=b,b.emit("vuex:init",t),b.on("vuex:travel-to-state",function(e){t.replaceState(e)}),t.subscribe(function(t,e){b.emit("vuex:mutation",t,e)}))}function e(t){function e(){var t=this.$options;t.store?this.$store=t.store:t.parent&&t.parent.$store&&(this.$store=t.parent.$store)}var n=Number(t.version.split(".")[0]);if(n>=2){var o=t.config._lifecycleHooks.indexOf("init")>-1;t.mixin(o?{init:e}:{beforeCreate:e})}else{var i=t.prototype._init;t.prototype._init=function(t){void 0===t&&(t={}),t.init=t.init?[e].concat(t.init):e,i.call(this,t)}}}function n(t){var e={};return s(t).forEach(function(t){var n=t.key,o=t.val;e[n]=function(){return"function"==typeof o?o.call(this,this.$store.state,this.$store.getters):this.$store.state[o]}}),e}function o(t){var e={};return s(t).forEach(function(t){var n=t.key,o=t.val;e[n]=function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];return this.$store.commit.apply(this.$store,[o].concat(t))}}),e}function i(t){var e={};return s(t).forEach(function(t){var n=t.key,o=t.val;e[n]=function(){return o in this.$store.getters||console.error("[vuex] unknown getter: "+o),this.$store.getters[o]}}),e}function r(t){var e={};return s(t).forEach(function(t){var n=t.key,o=t.val;e[n]=function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];return this.$store.dispatch.apply(this.$store,[o].concat(t))}}),e}function s(t){return Array.isArray(t)?t.map(function(t){return{key:t,val:t}}):Object.keys(t).map(function(e){return{key:e,val:t[e]}})}function u(t){return null!==t&&"object"==typeof t}function a(t){return t&&"function"==typeof t.then}function c(t,e){if(!t)throw new Error("[vuex] "+e)}function f(t,e){if(e.actions&&(t.actions=e.actions),e.mutations&&(t.mutations=e.mutations),e.getters&&(t.getters=e.getters),e.modules)for(var n in e.modules){if(!t.modules||!t.modules[n])return void console.warn("[vuex] trying to add a new module '"+n+"' on hot reloading, manual reload is needed");f(t.modules[n],e.modules[n])}}function l(t){t._actions=Object.create(null),t._mutations=Object.create(null),t._wrappedGetters=Object.create(null);var e=t.state;p(t,e,[],t._options,!0),Object.keys(t._runtimeModules).forEach(function(n){p(t,e,n.split("."),t._runtimeModules[n],!0)}),h(t,e)}function h(t,e){var n=t._vm;t.getters={};var o=t._wrappedGetters,i={};Object.keys(o).forEach(function(e){var n=o[e];i[e]=function(){return n(t)},Object.defineProperty(t.getters,e,{get:function(){return t._vm[e]}})});var r=w.config.silent;w.config.silent=!0,t._vm=new w({data:{state:e},computed:i}),w.config.silent=r,t.strict&&y(t),n&&(t._withCommit(function(){n.state=null}),w.nextTick(function(){return n.$destroy()}))}function p(t,e,n,o,i){var r=!n.length,s=o.state,u=o.actions,a=o.mutations,c=o.getters,f=o.modules;if(!r&&!i){var l=_(e,n.slice(0,-1)),h=n[n.length-1];t._withCommit(function(){w.set(l,h,s||{})})}a&&Object.keys(a).forEach(function(e){d(t,e,a[e],n)}),u&&Object.keys(u).forEach(function(e){m(t,e,u[e],n)}),c&&v(t,c,n),f&&Object.keys(f).forEach(function(o){p(t,e,n.concat(o),f[o],i)})}function d(t,e,n,o){void 0===o&&(o=[]);var i=t._mutations[e]||(t._mutations[e]=[]);i.push(function(e){n(_(t.state,o),e)})}function m(t,e,n,o){void 0===o&&(o=[]);var i=t._actions[e]||(t._actions[e]=[]),r=t.dispatch,s=t.commit;i.push(function(e,i){var u=n({dispatch:r,commit:s,getters:t.getters,state:_(t.state,o),rootState:t.state},e,i);return a(u)||(u=Promise.resolve(u)),t._devtoolHook?u.catch(function(e){throw t._devtoolHook.emit("vuex:error",e),e}):u})}function v(t,e,n){Object.keys(e).forEach(function(o){var i=e[o];return t._wrappedGetters[o]?void console.error("[vuex] duplicate getter key: "+o):void(t._wrappedGetters[o]=function(t){return i(_(t.state,n),t.getters,t.state)})})}function y(t){t._vm.$watch("state",function(){c(t._committing,"Do not mutate vuex store state outside mutation handlers.")},{deep:!0,sync:!0})}function _(t,e){return e.length?e.reduce(function(t,e){return t[e]},t):t}function g(t){return w?void console.error("[vuex] already installed. Vue.use(Vuex) should be called only once."):(w=t,void e(w))}var w,b="undefined"!=typeof window&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__,x=function(e){var n=this;void 0===e&&(e={}),c(w,"must call Vue.use(Vuex) before creating a store instance."),c("undefined"!=typeof Promise,"vuex requires a Promise polyfill in this browser.");var o=e.state;void 0===o&&(o={});var i=e.plugins;void 0===i&&(i=[]);var r=e.strict;void 0===r&&(r=!1),this._options=e,this._committing=!1,this._actions=Object.create(null),this._mutations=Object.create(null),this._wrappedGetters=Object.create(null),this._runtimeModules=Object.create(null),this._subscribers=[],this._watcherVM=new w;var s=this,u=this,a=u.dispatch,f=u.commit;this.dispatch=function(t,e){return a.call(s,t,e)},this.commit=function(t,e,n){return f.call(s,t,e,n)},this.strict=r,p(this,o,[],e),h(this,o),i.concat(t).forEach(function(t){return t(n)})},O={state:{}};O.state.get=function(){return this._vm.state},O.state.set=function(t){c(!1,"Use store.replaceState() to explicit replace store state.")},x.prototype.commit=function(t,e,n){var o=this;u(t)&&t.type&&(n=e,e=t,t=t.type);var i={type:t,payload:e},r=this._mutations[t];return r?(this._withCommit(function(){r.forEach(function(t){t(e)})}),void(n&&n.silent||this._subscribers.forEach(function(t){return t(i,o.state)}))):void console.error("[vuex] unknown mutation type: "+t)},x.prototype.dispatch=function(t,e){u(t)&&t.type&&(e=t,t=t.type);var n=this._actions[t];return n?n.length>1?Promise.all(n.map(function(t){return t(e)})):n[0](e):void console.error("[vuex] unknown action type: "+t)},x.prototype.subscribe=function(t){var e=this._subscribers;return e.indexOf(t)<0&&e.push(t),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}},x.prototype.watch=function(t,e,n){var o=this;return c("function"==typeof t,"store.watch only accepts a function."),this._watcherVM.$watch(function(){return t(o.state)},e,n)},x.prototype.replaceState=function(t){var e=this;this._withCommit(function(){e._vm.state=t})},x.prototype.registerModule=function(t,e){"string"==typeof t&&(t=[t]),c(Array.isArray(t),"module path must be a string or an Array."),this._runtimeModules[t.join(".")]=e,p(this,this.state,t,e),h(this,this.state)},x.prototype.unregisterModule=function(t){var e=this;"string"==typeof t&&(t=[t]),c(Array.isArray(t),"module path must be a string or an Array."),delete this._runtimeModules[t.join(".")],this._withCommit(function(){var n=_(e.state,t.slice(0,-1));w.delete(n,t[t.length-1])}),l(this)},x.prototype.hotUpdate=function(t){f(this._options,t),l(this)},x.prototype._withCommit=function(t){var e=this._committing;this._committing=!0,t(),this._committing=e},Object.defineProperties(x.prototype,O),"undefined"!=typeof window&&window.Vue&&g(window.Vue);var k={Store:x,install:g,mapState:n,mapMutations:o,mapGetters:i,mapActions:r};return k}); \ No newline at end of file From 7cdb0afaa4dbf509be2b653fdba4f9db731bbea9 Mon Sep 17 00:00:00 2001 From: Core Date: Fri, 7 Jan 2022 22:48:36 +0000 Subject: [PATCH 13/61] Tweaked win.ts again, now able to successfully launch webserver. Static content fails. --- src/main/base/store.js | 48 ---------- src/main/base/win.ts | 196 +++++++++++++++++++++++------------------ src/main/index.ts | 2 +- 3 files changed, 113 insertions(+), 133 deletions(-) delete mode 100644 src/main/base/store.js diff --git a/src/main/base/store.js b/src/main/base/store.js deleted file mode 100644 index 1f6d3d93..00000000 --- a/src/main/base/store.js +++ /dev/null @@ -1,48 +0,0 @@ -const Store = require("electron-store"), - {app} = require("electron"); - -module.exports = { - - defaults: { - "general": { - "close_behavior": 0, // 0 = close, 1 = minimize, 2 = minimize to tray - "startup_behavior": 0, // 0 = nothing, 1 = open on startup - "discord_rpc": 1, // 0 = disabled, 1 = enabled as Cider, 2 = enabled as Apple Music - "discordClearActivityOnPause" : 0, // 0 = disabled, 1 = enabled - "volume": 1 - }, - "audio": { - "quality": "extreme", - "seamless_audio": true - }, - "visual": { - "theme": "", - "scrollbars": 0, // 0 = show on hover, 2 = always hide, 3 = always show - "refresh_rate": 0, - "animated_artwork": "always", // 0 = always, 1 = limited, 2 = never - "animated_artwork_qualityLevel": 1, - "hw_acceleration": "default", // default, webgpu, disabled - "window_transparency": "default" - }, - "lyrics": { - "enable_mxm": false, - "mxm_karaoke" : false, - "mxm_language": "en", - "enable_yt": false, - }, - "lastfm": { - "enabled": false, - "scrobble_after": 30, - "auth_token": "", - "enabledRemoveFeaturingArtists" : true, - "NowPlaying": "true" - } - }, - - init() { - app.cfg = new Store({ - defaults: this.defaults, - }); - } - -} \ No newline at end of file diff --git a/src/main/base/win.ts b/src/main/base/win.ts index 00389998..de07aaff 100644 --- a/src/main/base/win.ts +++ b/src/main/base/win.ts @@ -11,6 +11,7 @@ import {Stream} from "stream"; export class Win { win: any | undefined = null; app: electron.App | undefined; + devMode: boolean = !electron.app.isPackaged; private paths: any = { srcPath: path.join(__dirname, "../../src"), @@ -58,7 +59,10 @@ export class Win { /** * Creates the browser window */ - createWindow(): void { + async createWindow(): Promise { + this.clientPort = await getPort({port: 9000}); + this.verifyFiles(); + // Load the previous state with fallback to defaults const windowState = windowStateKeeper({ defaultWidth: 1024, @@ -68,72 +72,94 @@ export class Win { this.options.height = windowState.height; // Start the webserver for the browser window to load - this.startWebServer().then(() => { - if (process.platform === "win32") { - // this.win = new electronAcrylic.BrowserWindow(this.options); - } else { - this.win = new electron.BrowserWindow(this.options); - } - }) + this.startWebServer() + + if (process.platform === "win32") { + // this.win = new electronAcrylic.BrowserWindow(this.options); + } else { + this.win = new electron.BrowserWindow(this.options); + } // and load the renderer. - this.startSession(this.win); - this.startHandlers(this.win); + this.startSession(); + this.startHandlers(); // Register listeners on Window to track size and position of the Window. windowState.manage(this.win); + return this.win; } + /** + * Verifies the files for the renderer to use (Cache, library info, etc.) + */ + private verifyFiles(): void { + const expectedDirectories = [ + "CiderCache" + ] + const expectedFiles = [ + "library-songs.json", + "library-artists.json", + "library-albums.json", + "library-playlists.json", + "library-recentlyAdded.json", + ] + for (let i = 0; i < expectedDirectories.length; i++) { + if (!fs.existsSync(path.join(electron.app.getPath("userData"), expectedDirectories[i]))) { + fs.mkdirSync(path.join(electron.app.getPath("userData"), expectedDirectories[i])) + } + } + for (let i = 0; i < expectedFiles.length; i++) { + const file = path.join(this.paths.ciderCache, expectedFiles[i]) + if (!fs.existsSync(file)) { + fs.writeFileSync(file, JSON.stringify([])) + } + } + } + /** * Starts the webserver for the renderer process. */ - public async startWebServer(): Promise { - this.clientPort = await getPort({port: 9000}); + private startWebServer(): void { const app = express(); - // app.use(express.static(path.join(this.paths.srcPath, './renderer/'))); // this breaks everything + // TODO: app.use(express.static(path.join(this.paths.srcPath, './renderer/'))); app.set("views", path.join(this.paths.srcPath, './renderer/views')); app.set("view engine", "ejs"); - - // this is also causing issues - // app.use((req, res, next) => { - // // if not localhost - // - // // @ts-ignore - // if (req.url.includes("audio.webm") || (req.headers.host.includes("localhost") && req.headers["user-agent"].includes("Cider"))) { - // next(); - // } - // }); + + app.use((req, res, next) => { + // @ts-ignore + if (req.url.includes("audio.webm") || (req.headers.host.includes("localhost") && (this.devMode || req.headers["user-agent"].includes("Electron")))) { + next(); + } + }); app.get('/', (req, res) => { - // res.send("Hello world!"); - // res.sendFile(path.join(webRemotePath, 'index_old.html')); res.render("main", this.EnvironmentVariables) }); - // app.get('/audio.webm', (req, res) => { - // try { - // req.connection.setTimeout(Number.MAX_SAFE_INTEGER); - // // CiderBase.requests.push({req: req, res: res}); - // // var pos = CiderBase.requests.length - 1; - // // req.on("close", () => { - // // console.info("CLOSED", CiderBase.requests.length); - // // requests.splice(pos, 1); - // // console.info("CLOSED", CiderBase.requests.length); - // // }); - // this.audioStream.on('data', (data: any) => { - // try { - // res.write(data); - // } catch (ex) { - // console.log(ex) - // } - // }) - // } catch (ex) { - // console.log(ex) - // } - // }); + app.get('/audio.webm', (req, res) => { + try { + req.socket.setTimeout(Number.MAX_SAFE_INTEGER); + // CiderBase.requests.push({req: req, res: res}); + // var pos = CiderBase.requests.length - 1; + // req.on("close", () => { + // console.info("CLOSED", CiderBase.requests.length); + // requests.splice(pos, 1); + // console.info("CLOSED", CiderBase.requests.length); + // }); + this.audioStream.on('data', (data: any) => { + try { + res.write(data); + } catch (ex) { + console.log(ex) + } + }) + } catch (ex) { + console.log(ex) + } + }); app.listen(this.clientPort, () => { console.log(`Cider client port: ${this.clientPort}`); @@ -143,9 +169,9 @@ export class Win { /** * Starts the session for the renderer process. */ - private startSession(win: any): void { + private startSession(): void { // intercept "https://js-cdn.music.apple.com/hls.js/2.141.0/hls.js/hls.js" and redirect to local file "./apple-hls.js" instead - win.webContents.session.webRequest.onBeforeRequest( + this.win.webContents.session.webRequest.onBeforeRequest( { urls: ["https://*/*.js"] }, @@ -162,11 +188,11 @@ export class Win { } ) - win.webContents.session.webRequest.onBeforeSendHeaders(async (details: { url: string; requestHeaders: { [x: string]: string; }; }, callback: (arg0: { requestHeaders: any; }) => void) => { + this.win.webContents.session.webRequest.onBeforeSendHeaders(async (details: { url: string; requestHeaders: { [x: string]: string; }; }, callback: (arg0: { requestHeaders: any; }) => void) => { if (details.url === "https://buy.itunes.apple.com/account/web/info") { details.requestHeaders['sec-fetch-site'] = 'same-site'; details.requestHeaders['DNT'] = '1'; - let itspod = await win.webContents.executeJavaScript(`window.localStorage.getItem("music.ampwebplay.itspod")`) + let itspod = await this.win.webContents.executeJavaScript(`window.localStorage.getItem("music.ampwebplay.itspod")`) if (itspod != null) details.requestHeaders['Cookie'] = `itspod=${itspod}` } @@ -174,14 +200,13 @@ export class Win { }) let location = `http://localhost:${this.clientPort}/` - win.loadURL(location) + this.win.loadURL(location) } /** * Initializes the window handlers - * @param win The BrowserWindow */ - private startHandlers(win: any): void { + private startHandlers(): void { /********************************************************************************************************************** * ipcMain Events @@ -195,10 +220,11 @@ export class Win { }) electron.ipcMain.on("is-dev", (event) => { - event.returnValue = !electron.app.isPackaged + event.returnValue = this.devMode }) + electron.ipcMain.on('close', () => { // listen for close event - win.close(); + this.win.close(); }) electron.ipcMain.on('put-library-songs', (event, arg) => { @@ -251,41 +277,43 @@ export class Win { return await yt.search(u) }) - // electron.ipcMain.handle('getStoreValue', (event, key, defaultValue) => { - // return (defaultValue ? app.cfg.get(key, true) : app.cfg.get(key)); - // }); - // - // electron.ipcMain.handle('setStoreValue', (event, key, value) => { - // app.cfg.set(key, value); - // }); - // - // electron.ipcMain.on('getStore', (event) => { - // event.returnValue = app.cfg.store - // }) - // - // electron.ipcMain.on('setStore', (event, store) => { - // app.cfg.store = store - // }) + electron.ipcMain.handle('getStoreValue', (event, key, defaultValue) => { + // return (defaultValue ? app.cfg.get(key, true) : app.cfg.get(key)); + return null + }); + + electron.ipcMain.handle('setStoreValue', (event, key, value) => { + // app.cfg.set(key, value); + }); + + electron.ipcMain.on('getStore', (event) => { + // event.returnValue = app.cfg.store + event.returnValue = null + }) + + electron.ipcMain.on('setStore', (event, store) => { + // app.cfg.store = store + }) electron.ipcMain.handle('setVibrancy', (event, key, value) => { - win.setVibrancy(value) + this.win.setVibrancy(value) }); electron.ipcMain.on('maximize', () => { // listen for maximize event - if (win.isMaximized()) { - win.unmaximize() + if (this.win.isMaximized()) { + this.win.unmaximize() } else { - win.maximize() + this.win.maximize() } }) electron.ipcMain.on('minimize', () => { // listen for minimize event - win.minimize(); + this.win.minimize(); }) // Set scale electron.ipcMain.on('setScreenScale', (event, scale) => { - win.webContents.setZoomFactor(parseFloat(scale)) + this.win.webContents.setZoomFactor(parseFloat(scale)) }) /* ********************************************************************************************* @@ -301,10 +329,10 @@ export class Win { } let wndState = WND_STATE.NORMAL - win.on("resize", (_: any) => { - const isMaximized = win.isMaximized() - const isMinimized = win.isMinimized() - const isFullScreen = win.isFullScreen() + this.win.on("resize", (_: any) => { + const isMaximized = this.win.isMaximized() + const isMinimized = this.win.isMinimized() + const isFullScreen = this.win.isFullScreen() const state = wndState; if (isMinimized && state !== WND_STATE.MINIMIZED) { wndState = WND_STATE.MINIMIZED @@ -312,20 +340,20 @@ export class Win { wndState = WND_STATE.FULL_SCREEN } else if (isMaximized && state !== WND_STATE.MAXIMIZED) { wndState = WND_STATE.MAXIMIZED - win.webContents.executeJavaScript(`app.chrome.maximized = true`) + this.win.webContents.executeJavaScript(`app.chrome.maximized = true`) } else if (state !== WND_STATE.NORMAL) { wndState = WND_STATE.NORMAL - win.webContents.executeJavaScript(`app.chrome.maximized = false`) + this.win.webContents.executeJavaScript(`app.chrome.maximized = false`) } }) } - win.on("closed", () => { + this.win.on("closed", () => { this.win = null }) // Set window Handler - win.webContents.setWindowOpenHandler((x: any) => { + this.win.webContents.setWindowOpenHandler((x: any) => { if (x.url.includes("apple") || x.url.includes("localhost")) { return {action: "allow"} } diff --git a/src/main/index.ts b/src/main/index.ts index b6fd45a6..96e4f94d 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -16,7 +16,7 @@ import {Win} from "./base/win"; const Cider = new Win() app.on("ready", () => { - Cider.startWebServer(); + Cider.createWindow(); }); /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From a7b5b365902f1e1280886c84e0b584da01cf34d5 Mon Sep 17 00:00:00 2001 From: Core Date: Fri, 7 Jan 2022 23:53:59 +0000 Subject: [PATCH 14/61] Bread has been achieved. - Window now creates and loads properly (Due to config not being created halted vue) - Foundation for app.ts created for functions to run in certain stages of the app (start/init, ready, exit) - Electron-Store created in class ConfigStore. Store instance stored in ConfigStore.store. Gets a bit compilicated and might change the class or variable name later on. --- src/main/base/app.ts | 48 ++++++++++++++++ src/main/base/store.ts | 123 +++++++++++++++++++++++++++++++++++++++++ src/main/base/win.ts | 28 +++------- src/main/index.ts | 32 ++++++----- 4 files changed, 196 insertions(+), 35 deletions(-) create mode 100644 src/main/base/app.ts create mode 100644 src/main/base/store.ts diff --git a/src/main/base/app.ts b/src/main/base/app.ts new file mode 100644 index 00000000..bed8b814 --- /dev/null +++ b/src/main/base/app.ts @@ -0,0 +1,48 @@ +import * as electron from 'electron'; + +export class App { + constructor() { + console.log('App started'); + } + + /** + * Handles all actions that occur for the app on start (Mainly commandline arguments) + * @returns {void} + */ + public start(store: any): void { + console.log('App started'); + + switch (store.get("visual.hw_acceleration")) { + default: + case "default": + electron.app.commandLine.appendSwitch('enable-accelerated-mjpeg-decode') + electron.app.commandLine.appendSwitch('enable-accelerated-video') + electron.app.commandLine.appendSwitch('disable-gpu-driver-bug-workarounds') + electron.app.commandLine.appendSwitch('ignore-gpu-blacklist') + electron.app.commandLine.appendSwitch('enable-native-gpu-memory-buffers') + electron.app.commandLine.appendSwitch('enable-accelerated-video-decode'); + electron.app.commandLine.appendSwitch('enable-gpu-rasterization'); + electron.app.commandLine.appendSwitch('enable-native-gpu-memory-buffers'); + electron.app.commandLine.appendSwitch('enable-oop-rasterization'); + break; + + case "webgpu": + console.info("WebGPU is enabled."); + electron.app.commandLine.appendSwitch('enable-unsafe-webgpu') + break; + + case "disabled": + console.info("Hardware acceleration is disabled."); + electron.app.commandLine.appendSwitch('disable-gpu') + break; + } + } + + public stop() { + console.log('App stopped'); + } + + public ready() { + console.log('App ready'); + } +} \ No newline at end of file diff --git a/src/main/base/store.ts b/src/main/base/store.ts new file mode 100644 index 00000000..1a6c887a --- /dev/null +++ b/src/main/base/store.ts @@ -0,0 +1,123 @@ +import * as Store from 'electron-store'; +import * as electron from "electron"; + +export class ConfigStore { + public store: Store | undefined; + + private defaults: any = { + "general": { + "close_behavior": 0, // 0 = close, 1 = minimize, 2 = minimize to tray + "startup_behavior": 0, // 0 = nothing, 1 = open on startup + "discord_rpc": 1, // 0 = disabled, 1 = enabled as Cider, 2 = enabled as Apple Music + "discordClearActivityOnPause": 1, // 0 = disabled, 1 = enabled + "volume": 1 + }, + "home": { + "followedArtists": [], + "favoriteItems": [] + }, + "audio": { + "quality": "990", + "seamless_audio": true, + "normalization": false, + "spatial": false, + "spatial_properties": { + "presets": [], + "gain": 0.8, + "listener_position": [0, 0, 0], + "audio_position": [0, 0, 0], + "room_dimensions": { + "width": 32, + "height": 12, + "depth": 32 + }, + "room_materials": { + "left": 'metal', + "right": 'metal', + "front": 'brick-bare', + "back": 'brick-bare', + "down": 'acoustic-ceiling-tiles', + "up": 'acoustic-ceiling-tiles', + } + } + }, + "visual": { + "theme": "", + "scrollbars": 0, // 0 = show on hover, 2 = always hide, 3 = always show + "refresh_rate": 0, + "animated_artwork": "limited", // 0 = always, 1 = limited, 2 = never + "animated_artwork_qualityLevel": 1, + "bg_artwork_rotation": false, + "hw_acceleration": "default", // default, webgpu, disabled + "window_transparency": "disabled" + }, + "lyrics": { + "enable_mxm": false, + "mxm_karaoke": false, + "mxm_language": "en", + "enable_yt": false, + }, + "lastfm": { + "enabled": false, + "scrobble_after": 30, + "auth_token": "", + "enabledRemoveFeaturingArtists": true, + "NowPlaying": "true" + }, + "advanced": { + "AudioContext": false, + } + } + private migrations: any = {} + + constructor() { + this.store = new Store({ + name: 'cider-config', + defaults: this.defaults, + migrations: this.migrations, + }); + + this.store.set(this.mergeStore(this.defaults, this.store.store)) + this.ipcHandler(this.store); + } + + /** + * Merge Configurations + * @param target The target configuration + * @param source The source configuration + */ + private mergeStore = (target: { [x: string]: any; }, source: { [x: string]: any; }) => { + // Iterate through `source` properties and if an `Object` set property to merge of `target` and `source` properties + for (const key of Object.keys(source)) { + if (key.includes('migrations')) { + continue; + } + if (source[key] instanceof Object) Object.assign(source[key], this.mergeStore(target[key], source[key])) + } + // Join `target` and modified `source` + Object.assign(target || {}, source) + return target + } + + /** + * IPC Handler + */ + private ipcHandler(cfg: Store | any): void { + electron.ipcMain.handle('getStoreValue', (event, key, defaultValue) => { + return (defaultValue ? cfg.get(key, true) : cfg.get(key)); + }); + + electron.ipcMain.handle('setStoreValue', (event, key, value) => { + cfg.set(key, value); + }); + + electron.ipcMain.on('getStore', (event) => { + event.returnValue = cfg.store + }) + + electron.ipcMain.on('setStore', (event, store) => { + cfg.store = store + }) + } + +} \ No newline at end of file diff --git a/src/main/base/win.ts b/src/main/base/win.ts index de07aaff..4e19a37d 100644 --- a/src/main/base/win.ts +++ b/src/main/base/win.ts @@ -10,9 +10,15 @@ import {Stream} from "stream"; export class Win { win: any | undefined = null; - app: electron.App | undefined; + app: any | undefined = null; + store: any | undefined = null; devMode: boolean = !electron.app.isPackaged; + constructor(app: electron.App, store: any) { + this.app = app; + this.store = store; + } + private paths: any = { srcPath: path.join(__dirname, "../../src"), resourcePath: path.join(__dirname, "../../resources"), @@ -124,7 +130,7 @@ export class Win { private startWebServer(): void { const app = express(); - // TODO: app.use(express.static(path.join(this.paths.srcPath, './renderer/'))); + app.use(express.static(path.join(this.paths.srcPath, './renderer/'))); app.set("views", path.join(this.paths.srcPath, './renderer/views')); app.set("view engine", "ejs"); @@ -277,24 +283,6 @@ export class Win { return await yt.search(u) }) - electron.ipcMain.handle('getStoreValue', (event, key, defaultValue) => { - // return (defaultValue ? app.cfg.get(key, true) : app.cfg.get(key)); - return null - }); - - electron.ipcMain.handle('setStoreValue', (event, key, value) => { - // app.cfg.set(key, value); - }); - - electron.ipcMain.on('getStore', (event) => { - // event.returnValue = app.cfg.store - event.returnValue = null - }) - - electron.ipcMain.on('setStore', (event, store) => { - // app.cfg.store = store - }) - electron.ipcMain.handle('setVibrancy', (event, key, value) => { this.win.setVibrancy(value) }); diff --git a/src/main/index.ts b/src/main/index.ts index 96e4f94d..6940004c 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -12,28 +12,30 @@ import { app } from 'electron'; // import {Win} from "./base/win"; +import {ConfigStore} from "./base/store"; -const Cider = new Win() +const config = new ConfigStore(); +console.log(config) -app.on("ready", () => { - Cider.createWindow(); -}); +const Cider = new Win(app, config.store) /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * App Event Handlers * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ -// app.on('ready', () => { -// if (app.isQuiting) { app.quit(); return; } -// -// console.log('[Cider] Application is Ready. Creating Window.') -// if (!app.isPackaged) { -// console.info('[Cider] Running in development mode.') -// require('vue-devtools').install() -// } -// -// // CiderBase.Start() -// }); +app.on('ready', () => { + + + console.log('[Cider] Application is Ready. Creating Window.') + if (!app.isPackaged) { + console.info('[Cider] Running in development mode.') + require('vue-devtools').install() + } + + Cider.createWindow(); + + // CiderBase.Start() +}); // // app.on('before-quit', () => { // app.isQuiting = true; From 7318aa8aabdc2c4698e24c6fdd04e41123fed7be Mon Sep 17 00:00:00 2001 From: Core Date: Sat, 8 Jan 2022 22:42:27 +0000 Subject: [PATCH 15/61] Added Cider useragent for testing --- src/main/base/win.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/base/win.ts b/src/main/base/win.ts index 4e19a37d..67013ba4 100644 --- a/src/main/base/win.ts +++ b/src/main/base/win.ts @@ -206,7 +206,13 @@ export class Win { }) let location = `http://localhost:${this.clientPort}/` - this.win.loadURL(location) + + if (electron.app.isPackaged) { + this.win.loadURL(location) + } else { + this.win.loadURL(location, {userAgent: 'Cider Development Environment'}) + } + } /** From 6dad815d4892b5f063f6779e1ee1c64916347ae5 Mon Sep 17 00:00:00 2001 From: Core Date: Sun, 9 Jan 2022 01:20:08 +0000 Subject: [PATCH 16/61] Slight tweaks to app.ts, added environment var that displays renderer logs in console --- package.json | 3 +-- src/main/base/app.ts | 10 ++++++---- src/main/index.ts | 23 ++++++++--------------- 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 41339395..71e9cbc8 100644 --- a/package.json +++ b/package.json @@ -15,9 +15,8 @@ "buildResources": "resources", "scripts": { "build": "tsc", - "init": "install --force", "watch": "tsc --watch", - "start": "npm run build && electron ./build/index.js --enable-accelerated-mjpeg-decode --enable-accelerated-video --disable-gpu-driver-bug-workarounds --ignore-gpu-blacklist --enable-native-gpu-memory-buffers", + "start": "npm run build && ELECTRON_ENABLE_LOGGING=true electron ./build/index.js --enable-accelerated-mjpeg-decode --enable-accelerated-video --disable-gpu-driver-bug-workarounds --ignore-gpu-blacklist --enable-native-gpu-memory-buffers", "pack": "electron-builder --dir", "dist": "npm run build && electron-builder", "msft": "electron-builder -c msft-package.json", diff --git a/src/main/base/app.ts b/src/main/base/app.ts index bed8b814..4ca9e187 100644 --- a/src/main/base/app.ts +++ b/src/main/base/app.ts @@ -1,15 +1,17 @@ import * as electron from 'electron'; -export class App { - constructor() { +export class AppEvents { + constructor(store: any) { console.log('App started'); + + AppEvents.start(store); } /** * Handles all actions that occur for the app on start (Mainly commandline arguments) * @returns {void} */ - public start(store: any): void { + private static start(store: any): void { console.log('App started'); switch (store.get("visual.hw_acceleration")) { @@ -38,7 +40,7 @@ export class App { } } - public stop() { + public quit() { console.log('App stopped'); } diff --git a/src/main/index.ts b/src/main/index.ts index 6940004c..6a2532e2 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -1,22 +1,16 @@ require('v8-compile-cache'); -import { app } from 'electron'; -// import { resolve } from 'path'; - // Analytics for debugging fun yeah. -// const ElectronSentry = require("@sentry/electron"); -// ElectronSentry.init({ dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214" }); -// -// // const {Init} = require("./src/main/cider-base"); -// // Init() -// +const ElectronSentry = require("@sentry/electron"); +ElectronSentry.init({dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214"}); +import {app} from 'electron'; import {Win} from "./base/win"; import {ConfigStore} from "./base/store"; +import {AppEvents} from "./base/app"; const config = new ConfigStore(); -console.log(config) - +const App = new AppEvents(config.store); const Cider = new Win(app, config.store) /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -24,7 +18,7 @@ const Cider = new Win(app, config.store) * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ app.on('ready', () => { - + App.ready(); console.log('[Cider] Application is Ready. Creating Window.') if (!app.isPackaged) { @@ -32,10 +26,9 @@ app.on('ready', () => { require('vue-devtools').install() } - Cider.createWindow(); - - // CiderBase.Start() + Cider.createWindow(); }); + // // app.on('before-quit', () => { // app.isQuiting = true; From 312a5a7b707bda884ddd019f8088d715764d88c7 Mon Sep 17 00:00:00 2001 From: Core Date: Sun, 9 Jan 2022 15:24:42 +0000 Subject: [PATCH 17/61] - Small change to preload to define global.ipcRenderer early. - Changed BW options and removed redundant options that (I think) are no longer used by the renderer. - Added launch args to app.ts --- package.json | 3 ++- src/main/base/app.ts | 23 +++++++++++++++++++++++ src/main/base/win.ts | 11 ++--------- src/preload/cider-preload.js | 4 +--- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 71e9cbc8..944f6bf3 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,8 @@ "extends": null, "files": [ "./build/**/*", - "./resources/icons/icon.*" + "./resources/icons/icon.*", + "./src/**/*" ], "linux": { "target": [ diff --git a/src/main/base/app.ts b/src/main/base/app.ts index 4ca9e187..9e1e54e1 100644 --- a/src/main/base/app.ts +++ b/src/main/base/app.ts @@ -1,4 +1,5 @@ import * as electron from 'electron'; +import * as path from 'path'; export class AppEvents { constructor(store: any) { @@ -14,6 +15,28 @@ export class AppEvents { private static start(store: any): void { console.log('App started'); + /********************************************************************************************************************** + * Startup arguments handling + **********************************************************************************************************************/ + if (electron.app.commandLine.hasSwitch('version') || electron.app.commandLine.hasSwitch('v')) { + console.log(electron.app.getVersion()) + electron.app.exit() + } + + // Verbose Check + if (electron.app.commandLine.hasSwitch('verbose')) { + console.log("[Apple-Music-Electron] User has launched the application with --verbose"); + } + + // Log File Location + if (electron.app.commandLine.hasSwitch('log') || electron.app.commandLine.hasSwitch('l')) { + console.log(path.join(electron.app.getPath('userData'), 'logs')) + electron.app.exit() + } + + /*********************************************************************************************************************** + * Commandline arguments + **********************************************************************************************************************/ switch (store.get("visual.hw_acceleration")) { default: case "default": diff --git a/src/main/base/win.ts b/src/main/base/win.ts index 67013ba4..ff49c3fe 100644 --- a/src/main/base/win.ts +++ b/src/main/base/win.ts @@ -45,18 +45,11 @@ export class Win { frame: false, title: "Cider", vibrancy: 'dark', - // transparent: true, + transparent: (process.platform === "darwin"), hasShadow: false, webPreferences: { - webviewTag: true, - plugins: true, nodeIntegration: true, - nodeIntegrationInWorker: false, - webSecurity: false, - allowRunningInsecureContent: true, - enableRemoteModule: true, sandbox: true, - nativeWindowOpen: true, contextIsolation: false, preload: path.join(this.paths.srcPath, './preload/cider-preload.js') } @@ -133,7 +126,7 @@ export class Win { app.use(express.static(path.join(this.paths.srcPath, './renderer/'))); app.set("views", path.join(this.paths.srcPath, './renderer/views')); app.set("view engine", "ejs"); - + app.use((req, res, next) => { // @ts-ignore if (req.url.includes("audio.webm") || (req.headers.host.includes("localhost") && (this.devMode || req.headers["user-agent"].includes("Electron")))) { diff --git a/src/preload/cider-preload.js b/src/preload/cider-preload.js index c0246916..e3db8bd5 100644 --- a/src/preload/cider-preload.js +++ b/src/preload/cider-preload.js @@ -1,5 +1,4 @@ -const electron = require('electron') - +global.ipcRenderer = require('electron').ipcRenderer; console.log('Loaded Preload') let cache = {playParams: {id: 0}, status: null, remainingTime: 0}, @@ -91,6 +90,5 @@ const MusicKitInterop = { process.once('loaded', () => { console.log("Setting ipcRenderer") - global.ipcRenderer = electron.ipcRenderer; global.MusicKitInterop = MusicKitInterop; }); \ No newline at end of file From 576f44fa86d5870430d2039de44d3bb59f96cf9a Mon Sep 17 00:00:00 2001 From: Core <64542347+coredev-uk@users.noreply.github.com> Date: Mon, 10 Jan 2022 09:40:40 +0000 Subject: [PATCH 18/61] baseline plugin system (Non-functional) --- src/main/base/plugins.ts | 43 +++++++++++++++++++++++++++++++ src/main/index.ts | 3 +++ src/main/plugins/examplePlugin.ts | 33 ++++++++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 src/main/base/plugins.ts create mode 100644 src/main/plugins/examplePlugin.ts diff --git a/src/main/base/plugins.ts b/src/main/base/plugins.ts new file mode 100644 index 00000000..6e5aebfe --- /dev/null +++ b/src/main/base/plugins.ts @@ -0,0 +1,43 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import * as electron from 'electron' + +export default class PluginHandler { + private basePluginsPath = path.join(__dirname, '../plugins'); + private userPluginsPath = path.join(electron.app.getPath('userData'), 'plugins'); + private pluginsList: any = []; + + constructor() { + + this.pluginsList = this.getPlugins(); + console.log(this.pluginsList); + } + + public getPlugins(): any { + let plugins: any = []; + + + if (fs.existsSync(this.basePluginsPath)) { + fs.readdirSync(this.basePluginsPath).forEach(file => { + if (file.endsWith('.ts') || file.endsWith('.js')) { + const plugin = require(path.join(this.basePluginsPath, file)); + plugins.push(new plugin()); + } + }); + } + + + if (fs.existsSync(this.userPluginsPath)) { + fs.readdirSync(this.userPluginsPath).forEach(file => { + if (file.endsWith('.ts') || file.endsWith('.js')) { + const plugin = require(path.join(this.userPluginsPath, file)); + console.log(plugin); + plugins.push(new plugin()); + } + }); + } + + return plugins; + } + +} \ No newline at end of file diff --git a/src/main/index.ts b/src/main/index.ts index 6a2532e2..7ef76e08 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -8,6 +8,9 @@ import {app} from 'electron'; import {Win} from "./base/win"; import {ConfigStore} from "./base/store"; import {AppEvents} from "./base/app"; +// import PluginHandler from "./base/plugins"; + +// const test = new PluginHandler(); const config = new ConfigStore(); const App = new AppEvents(config.store); diff --git a/src/main/plugins/examplePlugin.ts b/src/main/plugins/examplePlugin.ts new file mode 100644 index 00000000..8a8d6d30 --- /dev/null +++ b/src/main/plugins/examplePlugin.ts @@ -0,0 +1,33 @@ +export default class ExamplePlugin { + + public name: string = 'examplePlugin'; + public description: string = 'Example plugin'; + public version: string = '1.0.0'; + public author: string = 'Example author'; + + constructor() { + this.name = 'coolPlugin'; + this.description = 'A pretty cool plugin'; + this.version = '1.0.0'; + this.author = 'Core'; + } + + onStart(): void { + console.log('Example plugin started'); + } + + onReady(): void { + console.log('Example plugin ready'); + } + + onStop(): void { + console.log('Example plugin stopped'); + } + + OnPlaybackStateChanged(attributes: object): void { + } + + OnMediaStateChanged(attributes: object): void { + } + +} \ No newline at end of file From 88a4fcd3805c052d013c91ba78e34f3977b5ead9 Mon Sep 17 00:00:00 2001 From: Core Date: Mon, 10 Jan 2022 23:27:08 +0000 Subject: [PATCH 19/61] Moved volume to audio.volume --- src/main/base/store.ts | 4 ++-- src/renderer/index.js | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/base/store.ts b/src/main/base/store.ts index 1a6c887a..88ead0b7 100644 --- a/src/main/base/store.ts +++ b/src/main/base/store.ts @@ -9,14 +9,14 @@ export class ConfigStore { "close_behavior": 0, // 0 = close, 1 = minimize, 2 = minimize to tray "startup_behavior": 0, // 0 = nothing, 1 = open on startup "discord_rpc": 1, // 0 = disabled, 1 = enabled as Cider, 2 = enabled as Apple Music - "discordClearActivityOnPause": 1, // 0 = disabled, 1 = enabled - "volume": 1 + "discordClearActivityOnPause": 1 // 0 = disabled, 1 = enabled }, "home": { "followedArtists": [], "favoriteItems": [] }, "audio": { + "volume": 1, "quality": "990", "seamless_audio": true, "normalization": false, diff --git a/src/renderer/index.js b/src/renderer/index.js index 215705f3..f1320cae 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -449,8 +449,8 @@ const app = new Vue({ } MusicKitInterop.init() // Set the volume - this.mk.volume = this.cfg.general.volume - // ipcRenderer.invoke('getStoreValue', 'general.volume').then((value) => { + this.mk.volume = this.cfg.audio.volume + // ipcRenderer.invoke('getStoreValue', 'audio.volume').then((value) => { // self.mk.volume = value // }) @@ -618,7 +618,7 @@ const app = new Vue({ this.mk.addEventListener(MusicKit.Events.playbackVolumeDidChange, (_a) => { - this.cfg.general.volume = this.mk.volume + this.cfg.audio.volume = this.mk.volume }) this.refreshPlaylists() From b4086ff8f9c1a3899d52cca344c39c44170b0914 Mon Sep 17 00:00:00 2001 From: vapormusic Date: Fri, 14 Jan 2022 21:03:49 +0700 Subject: [PATCH 20/61] v3 --- src/renderer/index.js | 17 ++++- .../views/components/mediaitem-list-item.ejs | 13 ++-- .../views/components/mediaitem-square.ejs | 4 +- src/renderer/views/pages/artist-feed.ejs | 12 +--- src/renderer/views/pages/cider-playlist.ejs | 4 +- src/renderer/views/pages/home.ejs | 63 +++++-------------- 6 files changed, 42 insertions(+), 71 deletions(-) diff --git a/src/renderer/index.js b/src/renderer/index.js index 2f600323..ef1a6a4d 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -3175,7 +3175,22 @@ const app = new Vue({ ipcRenderer.send('setFullScreen', false); app.appMode = 'player'; } - } + }, + formatTimezoneOffset : (e=new Date)=>{ + let leadingZeros = (e,s=2)=>{ + let n = "" + e; + for (; n.length < s; ) + n = "0" + n; + return n + } + + const s = e.getTimezoneOffset() + , n = Math.floor(Math.abs(s) / 60) + , d = Math.round(Math.abs(s) % 60); + let h = "+"; + return 0 !== s && (h = s > 0 ? "-" : "+"), + `${h}${leadingZeros(n, 2)}:${leadingZeros(d, 2)}` + }, } }) diff --git a/src/renderer/views/components/mediaitem-list-item.ejs b/src/renderer/views/components/mediaitem-list-item.ejs index a41abd87..6bbde991 100644 --- a/src/renderer/views/components/mediaitem-list-item.ejs +++ b/src/renderer/views/components/mediaitem-list-item.ejs @@ -502,22 +502,21 @@ app.mk.setQueue({[truekind]: [item.attributes.playParams.id ?? item.id]}).then(function () { app.mk.play().then(function (){ var playlistId = id - function getPlaylist(id, params, isLibrary){ + function getPlaylist(id, isLibrary){ if (isLibrary){ - return app.mk.api.library.playlist(id, params) - } else { return app.mk.api.playlist(id, params)} + return this.app.mk.api.v3.music(`/v1/me/library/playlists/${id}`) + } else { return this.app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/playlists/${id}`)} } try { - - getPlaylist(id, params, isLibrary).then(res => { + getPlaylist(id, isLibrary).then(res => { //let query = res.relationships.tracks.data.map(item => new MusicKit.MediaItem(item)); //if (app.mk.shuffleMode == 1){shuffleArray(query); } // console.log(query) // app.mk.queue.append(query) - if (!res.relationships.tracks.next) { + if (!res.data.relationships.tracks.next) { return } else { - getPlaylistTracks(res.relationships.tracks.next) + getPlaylistTracks(res.data.relationships.tracks.next) } function getPlaylistTracks(next) { diff --git a/src/renderer/views/components/mediaitem-square.ejs b/src/renderer/views/components/mediaitem-square.ejs index 859ef0b7..267e7fd2 100644 --- a/src/renderer/views/components/mediaitem-square.ejs +++ b/src/renderer/views/components/mediaitem-square.ejs @@ -145,8 +145,8 @@ let friends = this.badges[this.item.attributes.playParams.id ?? this.item.id] if (friends) { friends.forEach(function (friend) { - self.app.mk.api.socialProfile(friend).then(data => { - self.itemBadges.push(data) + self.app.mk.api.v3.music(`/v1/social/${app.mk.storefrontId}/social-profiles/${friend}`).then(data => { + self.itemBadges.push(data.data.data[0]) }) }) } diff --git a/src/renderer/views/pages/artist-feed.ejs b/src/renderer/views/pages/artist-feed.ejs index a7cfce52..b1147153 100644 --- a/src/renderer/views/pages/artist-feed.ejs +++ b/src/renderer/views/pages/artist-feed.ejs @@ -40,16 +40,8 @@ async getArtistFeed() { let artists = this.followedArtists let self = this - this.app.mk.api.artists(artists, { - "views": "featured-release,full-albums,appears-on-albums,featured-albums,featured-on-albums,singles,compilation-albums,live-albums,latest-release,top-music-videos,similar-artists,top-songs,playlists,more-to-hear,more-to-see", - "extend": "artistBio,bornOrFormed,editorialArtwork,editorialVideo,isGroup,origin,hero", - "extend[playlists]": "trackCount", - "include[songs]": "albums", - "fields[albums]": "artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url,trackCount", - "limit[artists:top-songs]": 20, - "art[url]": "f" - }, {includeResponseMeta: !0}).then(artistData => { - artistData.data.forEach(item => { + this.app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/artists?ids=${artists.toString()}&views=featured-release,full-albums,appears-on-albums,featured-albums,featured-on-albums,singles,compilation-albums,live-albums,latest-release,top-music-videos,similar-artists,top-songs,playlists,more-to-hear,more-to-see&extend=artistBio,bornOrFormed,editorialArtwork,editorialVideo,isGroup,origin,hero&extend[playlists]=trackCount&include[songs]=albums&fields[albums]=artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url,trackCount&limit[artists:top-songs]=20&art[url]=f`).then(artistData => { + artistData.data.data.forEach(item => { if (item.views["latest-release"].data.length != 0) { self.artistFeed.push(item.views["latest-release"].data[0]) } diff --git a/src/renderer/views/pages/cider-playlist.ejs b/src/renderer/views/pages/cider-playlist.ejs index 1f31a8be..26aa8daf 100644 --- a/src/renderer/views/pages/cider-playlist.ejs +++ b/src/renderer/views/pages/cider-playlist.ejs @@ -169,8 +169,8 @@ let friends = badges[id] if (friends) { friends.forEach(function (friend) { - self.app.mk.api.socialProfile(friend).then(data => { - self.itemBadges.push(data) + self.app.mk.api.v3.music(`/v1/social/${app.mk.storefrontId}/social-profiles/${friend}`).then(data => { + self.itemBadges.push(data.data.data[0]) }) }) } diff --git a/src/renderer/views/pages/home.ejs b/src/renderer/views/pages/home.ejs index cb8519f2..48de707a 100644 --- a/src/renderer/views/pages/home.ejs +++ b/src/renderer/views/pages/home.ejs @@ -131,32 +131,22 @@ playlists.push(item.id) } } - if (playlists.length != 0) { - this.app.mk.api.playlists(playlists).then(playlistsData => { - self.favorites.push(...playlistsData) + if (playlists.length != 0) { + this.app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/playlists/${playlists.toString()}`).then(playlistsData => { + self.favorites.push(...playlistsData.data) }) } - if (libraryPlaylists.length != 0) { - this.app.mk.api.library.playlists(libraryPlaylists).then(playlistsData => { - self.favorites.push(...playlistsData) + if (libraryPlaylists.length != 0) { + this.app.mk.api.v3.music(`v1/me/library/playlists/${playlists.toString()}`).then(playlistsData => { + self.favorites.push(...playlistsData.data) }) } }, async getArtistFeed() { let artists = this.followedArtists let self = this - this.app.mk.api.artists(artists, { - "views": "featured-release,full-albums,appears-on-albums,featured-albums,featured-on-albums,singles,compilation-albums,live-albums,latest-release,top-music-videos,similar-artists,top-songs,playlists,more-to-hear,more-to-see", - "extend": "artistBio,bornOrFormed,editorialArtwork,editorialVideo,isGroup,origin,hero", - "extend[playlists]": "trackCount", - "include[songs]": "albums", - "fields[albums]": "artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url,trackCount", - "limit[artists:top-songs]": 20, - "art[url]": "f" - }, { - includeResponseMeta: !0 - }).then(artistData => { - artistData.data.forEach(item => { + this.app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/artists?ids=${artists.toString()}&views=featured-release,full-albums,appears-on-albums,featured-albums,featured-on-albums,singles,compilation-albums,live-albums,latest-release,top-music-videos,similar-artists,top-songs,playlists,more-to-hear,more-to-see&extend=artistBio,bornOrFormed,editorialArtwork,editorialVideo,isGroup,origin,hero&extend[playlists]=trackCount&include[songs]=albums&fields[albums]=artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url,trackCount&limit[artists:top-songs]=20&art[url]=f`).then(artistData => { + artistData.data.data.forEach(item => { if (item.views["latest-release"].data.length != 0) { self.artistFeed.push(item.views["latest-release"].data[0]) } @@ -176,35 +166,10 @@ }, async getListenNowData() { let self = this - this.app.mk.api.personalRecommendations("", { - name: "listen-now", - with: "friendsMix,library,social", - "art[social-profiles:url]": "c", - "art[url]": "c,f", - "omit[resource]": "autos", - "relate[editorial-items]": "contents", - extend: ["editorialCard", "editorialVideo"], - "extend[albums]": ["artistUrl"], - "extend[library-albums]": ["artistUrl", "editorialVideo"], - "extend[playlists]": ["artistNames", "editorialArtwork", "editorialVideo"], - "extend[library-playlists]": ["artistNames", "editorialArtwork", "editorialVideo"], - "extend[social-profiles]": "topGenreNames", - "include[albums]": "artists", - "include[songs]": "artists", - "include[music-videos]": "artists", - "fields[albums]": ["artistName", "artistUrl", "artwork", "contentRating", "editorialArtwork", "editorialVideo", "name", "playParams", "releaseDate", "url"], - "fields[artists]": ["name", "url"], - "extend[stations]": ["airDate", "supportsAirTimeUpdates"], - "meta[stations]": "inflectionPoints", - types: "artists,albums,editorial-items,library-albums,library-playlists,music-movies,music-videos,playlists,stations,uploaded-audios,uploaded-videos,activities,apple-curators,curators,tv-shows,social-profiles,social-upsells", - platform: "web" - }, { - includeResponseMeta: !0, - reload: !0 - }).then((data) => { - console.log(data.data[1]) + this.app.mk.api.v3.music(`/v1/me/recommendations?timezone=${encodeURIComponent(app.formatTimezoneOffset())}&name=listen-now&with=friendsMix,library,social&art[social-profiles:url]=c&art[url]=c,f&omit[resource]=autos&relate[editorial-items]=contents&extend=editorialCard,editorialVideo&extend[albums]=artistUrl&extend[library-albums]=artistUrl,editorialVideo&extend[playlists]=artistNames,editorialArtwork,editorialVideo&extend[library-playlists]=artistNames,editorialArtwork,editorialVideo&extend[social-profiles]=topGenreNames&include[albums]=artists&include[songs]=artists&include[music-videos]=artists&fields[albums]=artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url&fields[artists]=name,url&extend[stations]=airDate,supportsAirTimeUpdates&meta[stations]=inflectionPoints&types=artists,albums,editorial-items,library-albums,library-playlists,music-movies,music-videos,playlists,stations,uploaded-audios,uploaded-videos,activities,apple-curators,curators,tv-shows,social-upsells&platform=web`).then((data) => { + console.log(data.data.data[1]) try { - self.madeForYou = data.data.filter(section => { + self.madeForYou = data.data.data.filter(section => { if (section.meta.metrics.moduleType == "6") { return section }; @@ -213,8 +178,8 @@ self.sectionsReady.push("madeForYou") try { - self.recentlyPlayed = data.data[1].relationships.contents.data - self.friendsListeningTo = data.data.filter(section => { + self.recentlyPlayed = data.data.data[1].relationships.contents.data + self.friendsListeningTo = data.data.data.filter(section => { if (section.meta.metrics.moduleType == "11") { return section }; @@ -228,7 +193,7 @@ self.profile = response.data.data[0] }) - } + } } }); \ No newline at end of file From 352819f877af4aa9e983ba583a0fbf797e5fc233 Mon Sep 17 00:00:00 2001 From: vapormusic Date: Sat, 15 Jan 2022 14:10:27 +0700 Subject: [PATCH 21/61] add categories in search --- src/renderer/views/pages/search.ejs | 152 ++++++++++++++++------------ 1 file changed, 88 insertions(+), 64 deletions(-) diff --git a/src/renderer/views/pages/search.ejs b/src/renderer/views/pages/search.ejs index f056ecdb..e2b69f2c 100644 --- a/src/renderer/views/pages/search.ejs +++ b/src/renderer/views/pages/search.ejs @@ -1,82 +1,97 @@ @@ -86,8 +101,10 @@ props: ['search'], data: function () { return { - app: this.$root - } + app: this.$root, + categoriesView : [], + categoriesReady : false, + } }, methods: { getTopResult() { @@ -96,6 +113,13 @@ } else { return false; } + }, + async getCategories() { + if(this.categoriesView != [] && this.categoriesView.length > 0) {this.categoriesReady = true; return await true;} else { + let response = await this.app.mk.api.v3.music(`/v1/recommendations/${this.app.mk.storefrontId}?timezone=${encodeURIComponent(this.app.formatTimezoneOffset())}&name=search-landing&platform=web&extend=editorialArtwork&art%5Burl%5D=f%2Cc&types=editorial-items%2Capple-curators%2Cactivities`); + this.categoriesView = response.data.data; + this.categoriesReady = true; + return await true;} } } }) From 5de86d3233c280f50536004bd3ea0a6c676d0bdb Mon Sep 17 00:00:00 2001 From: vapormusic Date: Sat, 15 Jan 2022 18:02:44 +0700 Subject: [PATCH 22/61] socialBadgingMap --- src/renderer/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/renderer/index.js b/src/renderer/index.js index ef1a6a4d..2562a49b 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -382,9 +382,9 @@ const app = new Vue({ }) { let self = this try { - app.mk.api.socialBadgingMap().then(data => { - self.socialBadges.badgeMap = data.badgingMap - cb(data.badgingMap) + app.mk.api.v3.music("/v1/social/badging-map").then(data => { + self.socialBadges.badgeMap = data.data.results.badgingMap + cb(data.data.results.badgingMap) }) } catch (ex) { this.socialBadges.badgeMap = {} From e3d7d6b4b3c61a3ed3917614b2a522db980aab26 Mon Sep 17 00:00:00 2001 From: vapormusic Date: Sat, 15 Jan 2022 20:58:13 +0700 Subject: [PATCH 23/61] some v3 --- src/renderer/index.js | 105 ++++++++++-------- .../views/components/libraryartist-item.ejs | 4 +- .../components/mediaitem-square-large.ejs | 6 +- .../views/components/mediaitem-square-sp.ejs | 6 +- .../views/components/mediaitem-square.ejs | 6 +- .../views/components/sidebar-playlist.ejs | 4 +- src/renderer/views/pages/cider-playlist.ejs | 6 +- 7 files changed, 82 insertions(+), 55 deletions(-) diff --git a/src/renderer/index.js b/src/renderer/index.js index 2562a49b..0e85b3cf 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -435,9 +435,9 @@ const app = new Vue({ type: self.selectedMediaItems[i].kind }) } else if ((self.selectedMediaItems[i].kind == "album" || self.selectedMediaItems[i].kind == "albums") && self.selectedMediaItems[i].isLibrary != true) { - self.selectedMediaItems[i].kind = "albums" - let res = await self.mk.api.albumRelationship(self.selectedMediaItems[i].id, "tracks"); - let ids = res.map(function (i) { + self.selectedMediaItems[i].kind = "albums" + let res = await self.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/albums/${self.selectedMediaItems[i].id}/tracks`); + let ids = res.data.data.map(function (i) { return {id: i.id, type: i.type} }) pl_items = pl_items.concat(ids) @@ -449,8 +449,8 @@ const app = new Vue({ }) } else if ((self.selectedMediaItems[i].kind == "library-album" || self.selectedMediaItems[i].kind == "library-albums") || (self.selectedMediaItems[i].kind == "album" && self.selectedMediaItems[i].isLibrary == true)) { self.selectedMediaItems[i].kind = "library-albums" - let res = await self.mk.api.library.albumRelationship(self.selectedMediaItems[i].id, "tracks"); - let ids = res.map(function (i) { + let res = await self.mk.api.v3.music(`/v1/me/library/albums/${self.selectedMediaItems[i].id}/tracks`); + let ids = res.data.data.map(function (i) { return {id: i.id, type: i.type} }) pl_items = pl_items.concat(ids) @@ -618,8 +618,8 @@ const app = new Vue({ } catch (e) { } if (!previewURL) { - app.mk.api.song(app.mk.nowPlayingItem._songId ?? app.mk.nowPlayingItem.relationships.catalog.data[0].id).then((response) => { - previewURL = response.attributes.previews[0].url + app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/songs/${app.mk.nowPlayingItem._songId ?? app.mk.nowPlayingItem.relationships.catalog.data[0].id}`).then((response) => { + previewURL = response.data.data[0].attributes.previews[0].url if (previewURL) ipcRenderer.send('getPreviewURL', previewURL) }) @@ -947,15 +947,15 @@ const app = new Vue({ } let playlistId = '' - try { - app.mk.api.library.playlist(id, params).then(res => { - self.getPlaylistContinuous(res, transient) + try { + app.mk.api.v3.music(`/v1/me/library/playlists/${id}`, params).then(res => { + self.getPlaylistContinuous(res.data.data[0], transient) }) } catch (e) { console.log(e); try { - app.mk.api.library.playlist(id, params).then(res => { - self.getPlaylistContinuous(res, transient) + app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/playlists/${id}`,params).then(res => { + self.getPlaylistContinuous(res.data.data[0], transient) }) } catch (err) { console.log(err) @@ -1625,14 +1625,14 @@ const app = new Vue({ } self.library.songs.downloadState = 1 if (downloaded == null) { - app.mk.api.library.songs("", params, {includeResponseMeta: !0}).then((response) => { - processChunk(response) + app.mk.api.v3.music(`/v1/me/library/songs/`, params).then((response) => { + processChunk(response.data) }) } else { - if (downloaded.next != null && typeof downloaded.next === "function") { - downloaded.next("", params, {includeResponseMeta: !0}).then((response) => { - processChunk(response) + if (downloaded.next != null) { + app.mk.api.v3.music(downloaded.next, params).then((response) => { + processChunk(response.data) }) } else { console.log("Download next", downloaded.next) @@ -1706,13 +1706,13 @@ const app = new Vue({ limit: 100, } if (downloaded == null) { - app.mk.api.library.albums("", params, {includeResponseMeta: !0}).then((response) => { - processChunk(response) + app.mk.api.v3.music(`/v1/me/library/albums/`, params).then((response) => { + processChunk(response.data) }) } else { - if (downloaded.next != null && typeof downloaded.next === "function") { - downloaded.next("", params, {includeResponseMeta: !0}).then((response) => { - processChunk(response) + if (downloaded.next != null) { + app.mk.api.v3.music(downloaded.next, params).then((response) => { + processChunk(response.data) }) } else { console.log("Download next", downloaded.next) @@ -1787,13 +1787,14 @@ const app = new Vue({ limit: 100, } if (downloaded == null) { - app.mk.api.library.artists("", params, {includeResponseMeta: !0}).then((response) => { - processChunk(response) + app.mk.api.v3.music(`/v1/me/library/artists/`, params).then((response) => { + processChunk(response.data) }) + } else { - if (downloaded.next != null && typeof downloaded.next === "function") { - downloaded.next("", "artists", {includeResponseMeta: !0}).then((response) => { - processChunk(response) + if (downloaded.next != null) { + app.mk.api.v3.music(downloaded.next, params).then((response) => { + processChunk(response.data) }) } else { console.log("Download next", downloaded.next) @@ -1865,7 +1866,7 @@ const app = new Vue({ return } try { - this.listennow = await this.mk.api.personalRecommendations("", + this.listennow = (await this.mk.api.v3.music(`v1/me/recommendations?timezone=${encodeURIComponent(this.formatTimezoneOffset())}`, { name: "listen-now", with: "friendsMix,library,social", @@ -1892,7 +1893,7 @@ const app = new Vue({ { includeResponseMeta: !0, reload: !0 - }); + })).data; console.log(this.listennow) } catch (e) { console.log(e) @@ -1904,19 +1905,18 @@ const app = new Vue({ return } try { - let browse = await this.mk.api.groupings("", - { - platform: "web", - name: "music", - "omit[resource:artists]": "relationships", - "include[albums]": "artists", - "include[songs]": "artists", - "include[music-videos]": "artists", - extend: "editorialArtwork,artistUrl", - "fields[artists]": "name,url,artwork,editorialArtwork,genreNames,editorialNotes", - "art[url]": "f" - }); - this.browsepage = browse[0]; + let browse = await app.mk.api.v3.music(`/v1/editorial/${app.mk.storefrontId}/groupings`, { + platform: "web", + name: "music", + "omit[resource:artists]": "relationships", + "include[albums]": "artists", + "include[songs]": "artists", + "include[music-videos]": "artists", + extend: "editorialArtwork,artistUrl", + "fields[artists]": "name,url,artwork,editorialArtwork,genreNames,editorialNotes", + "art[url]": "f" + }); + this.browsepage = browse.data.data[0]; console.log(this.browsepage) } catch (e) { console.log(e) @@ -2018,7 +2018,11 @@ const app = new Vue({ removeFromLibrary(kind, id) { let self = this let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind; - this.mk.api.library.remove({[truekind]: id}).then((data) => { + app.mk.api.v3.music(`v1/me/library/${truekind}/${id.toString()}`,{}, + { + fetchOptions: { + method: "DELETE" + }}).then((data) => { self.getLibrarySongsFull(true) }) }, @@ -2558,6 +2562,7 @@ const app = new Vue({ if (term == "") { return } + //this.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/search?term=${this.search.term}` this.mk.api.search(this.search.term, { types: "activities,albums,apple-curators,artists,curators,editorial-items,music-movies,music-videos,playlists,songs,stations,tv-episodes,uploaded-videos,record-labels", @@ -2777,7 +2782,8 @@ const app = new Vue({ } catch (e) { } } else { - let data = await this.mk.api.library.song(this.mk.nowPlayingItem.id); + let data = await this.mk.api.v3.music(`/v1/me/library/songs/${this.mk.nowPlayingItem.id}`); + data = data.data.data[0]; if (data != null && data !== "" && data.attributes != null && data.attributes.artwork != null) { this.currentArtUrl = (data["attributes"]["artwork"]["url"] ?? '').replace('{w}', 50).replace('{h}', 50); try { @@ -2800,7 +2806,8 @@ const app = new Vue({ if (typeof this.mk.nowPlayingItem === "undefined") return; const data = await this.mk.api.library.song(this.mk.nowPlayingItem["id"]) try { - const data = await this.mk.api.library.song(this.mk.nowPlayingItem.id) + const data = await this.mk.api.v3.music(`/v1/me/library/songs/${this.mk.nowPlayingItem.id}`); + data = data.data.data[0]; if (data != null && data !== "") { document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', 'url("' + (data["attributes"]["artwork"]["url"]).toString() + '")'); @@ -2814,7 +2821,8 @@ const app = new Vue({ if (typeof this.mk.nowPlayingItem === "undefined") return; const data = await this.mk.api.library.song(this.mk.nowPlayingItem["id"]) try { - const data = await this.mk.api.library.song(this.mk.nowPlayingItem.id) + const data = await this.mk.api.v3.music(`/v1/me/library/songs/${this.mk.nowPlayingItem.id}`); + data = data.data.data[0]; if (data != null && data !== "") { getBase64FromUrl((data["attributes"]["artwork"]["url"]).toString()).then(img => { @@ -2965,8 +2973,9 @@ const app = new Vue({ }, fetchPlaylist(id, callback) { // id can be found in playlist.attributes.playParams.globalId - this.mk.api.playlist(id).then(res => { - callback(res) + // this.mk.api. + this.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/playlists/${id}`).then(res => { + callback(res.data.data[0]) }) // tracks are found in relationship.data diff --git a/src/renderer/views/components/libraryartist-item.ejs b/src/renderer/views/components/libraryartist-item.ejs index 34ca1b3b..686a62f1 100644 --- a/src/renderer/views/components/libraryartist-item.ejs +++ b/src/renderer/views/components/libraryartist-item.ejs @@ -70,14 +70,14 @@ }, async select(e) { let u = this.item - let u1 = await app.mk.api.library.artistRelationship(u.id,"albums", + let u1 = await app.mk.api.v3.music(`/v1/me/library/artists/${u.id}/albums`, {platform: "web", "include[library-albums]": "artists,tracks", "include[library-artists]": "catalog", "fields[artists]": "url", "includeOnly": "catalog,artists"} ) - app.showCollection({data : Object.assign({},u1)}, u.attributes.name?? '', ''); + app.showCollection({data : Object.assign({},u1.data.data)}, u.attributes.name?? '', ''); }, getArtwork(){ let u = "" diff --git a/src/renderer/views/components/mediaitem-square-large.ejs b/src/renderer/views/components/mediaitem-square-large.ejs index 4bb1098f..d87e8a51 100644 --- a/src/renderer/views/components/mediaitem-square-large.ejs +++ b/src/renderer/views/components/mediaitem-square-large.ejs @@ -122,7 +122,11 @@ } let kind = this.item.attributes.playParams.kind ?? this.item.type ?? ''; var truekind = (!kind.endsWith("s")) ? (kind + "s") : kind; - app.mk.api.library.remove({[truekind]: id}) + app.mk.api.v3.music(`v1/me/library/${truekind}/${id.toString()}`,{}, + { + fetchOptions: { + method: "DELETE" + }}) this.addedToLibrary = true }, async contextMenu(event) { diff --git a/src/renderer/views/components/mediaitem-square-sp.ejs b/src/renderer/views/components/mediaitem-square-sp.ejs index c7ce2b6b..dbf9ae95 100644 --- a/src/renderer/views/components/mediaitem-square-sp.ejs +++ b/src/renderer/views/components/mediaitem-square-sp.ejs @@ -110,7 +110,11 @@ } let kind = this.item.attributes.playParams.kind ?? this.item.type ?? ''; var truekind = (!kind.endsWith("s")) ? (kind + "s") : kind; - app.mk.api.library.remove({[truekind]: id}) + app.mk.api.v3.music(`v1/me/library/${truekind}/${id.toString()}`,{}, + { + fetchOptions: { + method: "DELETE" + }}) this.addedToLibrary = true }, subtitleSearchNavigate(item) { diff --git a/src/renderer/views/components/mediaitem-square.ejs b/src/renderer/views/components/mediaitem-square.ejs index 039e717b..aff2ff66 100644 --- a/src/renderer/views/components/mediaitem-square.ejs +++ b/src/renderer/views/components/mediaitem-square.ejs @@ -185,7 +185,11 @@ } let kind = this.item.attributes.playParams.kind ?? this.item.type ?? ''; var truekind = (!kind.endsWith("s")) ? (kind + "s") : kind; - app.mk.api.library.remove({[truekind]: id}) + app.mk.api.v3.music(`v1/me/library/${truekind}/${id.toString()}`,{}, + { + fetchOptions: { + method: "DELETE" + }}) this.addedToLibrary = true }, uuidv4() { diff --git a/src/renderer/views/components/sidebar-playlist.ejs b/src/renderer/views/components/sidebar-playlist.ejs index 6756288a..5f263eb2 100644 --- a/src/renderer/views/components/sidebar-playlist.ejs +++ b/src/renderer/views/components/sidebar-playlist.ejs @@ -181,7 +181,9 @@ this.children = [] this.getChildren() this.toggleFolder() - this.$root.mk.api.library.playlistFolderChildren(item.id).then(children => { + + this.$root.mk.api.v3.music(`v1/me/library/playlist-folders/${item.id}/children`).then(data => { + let children = data.data.data; children.forEach(child => { if(!self.$root.playlists.listing.find(listing => listing.id == child.id)) { child.parent = self.item.id diff --git a/src/renderer/views/pages/cider-playlist.ejs b/src/renderer/views/pages/cider-playlist.ejs index 42f6b042..6b377bc7 100644 --- a/src/renderer/views/pages/cider-playlist.ejs +++ b/src/renderer/views/pages/cider-playlist.ejs @@ -234,7 +234,11 @@ } let kind = this.data.attributes.playParams.kind ?? this.data.type ?? ''; const truekind = (!kind.endsWith("s")) ? (kind + "s") : kind; - app.mk.api.library.remove({[truekind]: id}) + app.mk.api.v3.music(`v1/me/library/${truekind}/${id.toString()}`,{}, + { + fetchOptions: { + method: "DELETE" + }}) this.inLibrary = false this.confirm = false }, From b0118dff5bc06dc6141e25772f3fb2a60a6ad703 Mon Sep 17 00:00:00 2001 From: Core Date: Sat, 15 Jan 2022 14:43:33 +0000 Subject: [PATCH 24/61] Fix to make it operational again --- src/main/base/store.ts | 11 +++++++++-- src/main/base/win.ts | 14 ++++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/base/store.ts b/src/main/base/store.ts index 88ead0b7..766fddb0 100644 --- a/src/main/base/store.ts +++ b/src/main/base/store.ts @@ -15,6 +15,13 @@ export class ConfigStore { "followedArtists": [], "favoriteItems": [] }, + "libraryPrefs": { + "songs": { + "sort": "name", + "sortOrder": "asc", + "size": "normal" + } + }, "audio": { "volume": 1, "quality": "990", @@ -48,8 +55,7 @@ export class ConfigStore { "animated_artwork": "limited", // 0 = always, 1 = limited, 2 = never "animated_artwork_qualityLevel": 1, "bg_artwork_rotation": false, - "hw_acceleration": "default", // default, webgpu, disabled - "window_transparency": "disabled" + "hw_acceleration": "default" // default, webgpu, disabled }, "lyrics": { "enable_mxm": false, @@ -66,6 +72,7 @@ export class ConfigStore { }, "advanced": { "AudioContext": false, + "experiments": [] } } private migrations: any = {} diff --git a/src/main/base/win.ts b/src/main/base/win.ts index ff49c3fe..b0de8a35 100644 --- a/src/main/base/win.ts +++ b/src/main/base/win.ts @@ -1,6 +1,5 @@ import * as path from "path"; import * as electron from "electron"; -// import * as electronAcrylic from "electron-acrylic-window" import * as windowStateKeeper from "electron-window-state"; import * as express from "express"; import * as getPort from "get-port"; @@ -50,7 +49,14 @@ export class Win { webPreferences: { nodeIntegration: true, sandbox: true, + allowRunningInsecureContent: true, contextIsolation: false, + + webviewTag: true, + plugins: true, + nodeIntegrationInWorker: false, + webSecurity: false, + preload: path.join(this.paths.srcPath, './preload/cider-preload.js') } }; @@ -73,11 +79,7 @@ export class Win { // Start the webserver for the browser window to load this.startWebServer() - if (process.platform === "win32") { - // this.win = new electronAcrylic.BrowserWindow(this.options); - } else { - this.win = new electron.BrowserWindow(this.options); - } + this.win = new electron.BrowserWindow(this.options); // and load the renderer. this.startSession(); From 1fa046d0ecb036e5310b2ad0a99b551606be677f Mon Sep 17 00:00:00 2001 From: vapormusic Date: Sun, 16 Jan 2022 16:08:14 +0700 Subject: [PATCH 25/61] more v3 calls --- src/renderer/index.js | 168 +++++++++++------- .../views/components/mediaitem-square-sp.ejs | 2 + .../views/components/mediaitem-square.ejs | 2 + src/renderer/views/pages/cider-playlist.ejs | 20 ++- src/renderer/views/pages/search.ejs | 12 +- 5 files changed, 134 insertions(+), 70 deletions(-) diff --git a/src/renderer/index.js b/src/renderer/index.js index 0e85b3cf..a22108db 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -463,7 +463,18 @@ const app = new Vue({ } this.modals.addToPlaylist = false - this.mk.api.library.appendTracksToPlaylist(playlist_id, pl_items).then(() => { + await app.mk.api.v3.music( + `/v1/me/library/playlists/${playlist_id}/tracks`, + {}, + { + fetchOptions: { + method: "POST", + body: JSON.stringify({ + data: pl_items + }) + } + } + ).then(() => { if (this.page == 'playlist_' + this.showingPlaylist.id) { this.getPlaylistFromID(this.showingPlaylist.id) } @@ -485,8 +496,12 @@ const app = new Vue({ } this.mk._services.timing.mode = 0 this.platform = ipcRenderer.sendSync('cider-platform'); - // Set profile name - this.chrome.userinfo = await this.mkapi("personalSocialProfile", false, "") + + try{ + // Set profile name + this.chrome.userinfo = (await app.mk.api.v3.music(`/v1/me/social-profile`)).data.data[0] + } catch (err) {} + // API Fallback if (!this.chrome.userinfo) { this.chrome.userinfo = { @@ -824,7 +839,24 @@ const app = new Vue({ if (tracks.length > 0) { request.tracks = tracks } - app.mk.api.library.createPlaylist(request).then(res => { + app.mk.api.v3.music(`/v1/me/library/playlists`, {}, + { + fetchOptions: { + method: "POST", + body: JSON.stringify( + { + "attributes": + { "name": name }, + "relationships": + { "tracks": + { "data": tracks }, + } + } + ) + } + } + ).then(res => { + res = res.data.data[0] console.log(res) self.appRoute(`playlist_` + res.id); self.showingPlaylist = []; @@ -845,7 +877,13 @@ const app = new Vue({ deletePlaylist(id) { let self = this if (confirm(`Are you sure you want to delete this playlist?`)) { - app.mk.api.library.deletePlaylist(id).then(res => { + app.mk.api.v3.music(`/v1/me/library/playlists/${id}`, {}, + { + fetchOptions: { + method: "DELETE" + } + } + ).then(res => { // remove this playlist from playlists.listing if it exists let found = self.playlists.listing.find(item => item.id == id) if (found) { @@ -862,15 +900,16 @@ const app = new Vue({ app.appRoute("collection-list") }, async showArtistView(artist, title, view) { - let response = await this.mk.api.artistView(artist, view, {}, {view: view, includeResponseMeta: !0}) + let response = (await app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/artists/${artist}/view/${view}`)).data + console.log(response) await this.showCollection(response, title, "artists") }, - async showRecordLabelView(label, title, view) { - let response = await this.mk.api.recordLabelView(label, view, {}, {view: view, includeResponseMeta: !0}) + async showRecordLabelView(label, title, view) { + let response = (await app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/record-labels/${label}/view/${view}`)).data await this.showCollection(response, title, "record-labels") }, async showSearchView(term, group, title) { - let response = await this.mk.api.search(term, { + let response = await app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/search?term=${term}`, { platform: "web", groups: group, types: "activities,albums,apple-curators,artists,curators,editorial-items,music-movies,music-videos,playlists,songs,stations,tv-episodes,uploaded-videos,record-labels", @@ -894,17 +933,19 @@ const app = new Vue({ }, omit: { resource: ["autos"] - } - }, {groups: group, includeResponseMeta: !0}) - console.log(response) + }, + groups: group + }) + console.log('searchres',response) let responseFormat = { - data: response[group].data.data, - next: response[group].next, + data: response.data.results[group].data, + next: response.data.results[group].data, groups: group } await this.showCollection(responseFormat, title, "search") }, async getPlaylistContinuous(response, transient = false) { + response = response.data.data[0] let self = this let playlistId = response.id if (!transient) this.playlists.loadingState = 0 @@ -937,30 +978,26 @@ const app = new Vue({ include: "tracks", platform: "web", "include[library-playlists]": "catalog,tracks", - "fields[playlists]": "curatorName,playlistType,name,artwork,url", - "include[library-songs]": "catalog,artists,albums", - "fields[catalog]": "artistUrl,albumUrl", - "fields[songs]": "artistUrl,albumUrl" + "fields[playlists]": "curatorName,playlistType,name,artwork,url,playParams", + "include[library-songs]": "catalog,artists,albums,playParams,name,artwork,url", + "fields[catalog]": "artistUrl,albumUrl,url", + "fields[songs]": "artistUrl,albumUrl,playParams,name,artwork,url,artistName,albumName,durationInMillis" } if (!transient) { this.playlists.loadingState = 0; - } - let playlistId = '' - - try { + } app.mk.api.v3.music(`/v1/me/library/playlists/${id}`, params).then(res => { - self.getPlaylistContinuous(res.data.data[0], transient) - }) - } catch (e) { + self.getPlaylistContinuous(res, transient) + }).catch((e) => { console.log(e); try { app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/playlists/${id}`,params).then(res => { - self.getPlaylistContinuous(res.data.data[0], transient) + self.getPlaylistContinuous(res, transient) }) } catch (err) { console.log(err) } - } + }) }, async getArtistFromID(id) { @@ -973,8 +1010,8 @@ const app = new Vue({ "limit[artists:top-songs]": 20, "art[url]": "f" }, {includeResponseMeta: !0}) - console.log(artistData) - this.artistPage.data = artistData.data[0] + console.log(artistData.data.data[0]) + this.artistPage.data = artistData.data.data[0] this.page = "artist-page" }, progressBarStyle() { @@ -1023,7 +1060,7 @@ const app = new Vue({ this.search.hints = [] return } - let hints = await app.mkapi("searchHints", false, this.search.term) + let hints = await (await app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/search/hints?term=${this.search.term}`)).data.results this.search.hints = hints ? hints.terms : [] }, getSongProgress() { @@ -1137,7 +1174,7 @@ const app = new Vue({ }, async getNowPlayingItemDetailed(target) { let u = await app.mkapi(app.mk.nowPlayingItem.playParams.kind, (app.mk.nowPlayingItem.songId == -1), (app.mk.nowPlayingItem.songId != -1) ? app.mk.nowPlayingItem.songId : app.mk.nowPlayingItem["id"], {"include[songs]": "albums,artists"}); - app.searchAndNavigate(u, target) + app.searchAndNavigate(u.data.data[0], target) }, async searchAndNavigate(item, target) { let self = this @@ -1162,10 +1199,10 @@ const app = new Vue({ } if (artistId == "") { - let artistQuery = await app.mk.api.search(item.attributes.artistName, { + let artistQuery =(await app.mk.api.v3.music(`v1/catalog/${app.mk.storefrontId}/search?term=${item.attributes.artistName}`,{ limit: 1, types: 'artists' - }) + })).data.results; try { if (artistQuery.artists.data.length > 0) { artistId = artistQuery.artists.data[0].id; @@ -1198,10 +1235,10 @@ const app = new Vue({ if (albumId == "") { try { - let albumQuery = await app.mk.api.search(item.attributes.albumName + " " + (item.attributes.artistName ?? ""), { + let albumQuery =(await app.mk.api.v3.music(`v1/catalog/${app.mk.storefrontId}/search?term=${item.attributes.albumName + " " + (item.attributes.artistName ?? "")}`,{ limit: 1, types: 'albums' - }) + })).data.results; if (albumQuery.albums.data.length > 0) { albumId = albumQuery.albums.data[0].id; console.log(albumId) @@ -1222,10 +1259,10 @@ const app = new Vue({ if (labelId == "") { try { - let labelQuery = await app.mk.api.search(item.attributes.recordLabel, { + let labelQuery =(await app.mk.api.v3.music(`v1/catalog/${app.mk.storefrontId}/search?term=${item.attributes.recordLabel}`,{ limit: 1, types: 'record-labels' - }) + })).data.results; if (labelQuery["record-labels"].data.length > 0) { labelId = labelQuery["record-labels"].data[0].id; console.log(labelId) @@ -1350,14 +1387,14 @@ const app = new Vue({ a = [] } finally { if (kind == "appleCurator") { - app.appleCurator = a + app.appleCurator = a.data.data[0] } else { this.getPlaylistContinuous(a) } } } finally { if (kind == "appleCurator") { - app.appleCurator = a + app.appleCurator = a.data.data[0] } else { this.getPlaylistContinuous(a) } @@ -1566,14 +1603,17 @@ const app = new Vue({ } }, async mkapi(method, library = false, term, params = {}, params2 = {}, attempts = 0) { + if (method.includes(`recordLabel`)){method = `record-labels`} + if (method.includes(`appleCurator`)){method = `apple-curators`} if (attempts > 3) { return } + let truemethod = (!method.endsWith("s")) ? (method + "s") : method; try { if (library) { - return await this.mk.api.library[method](term, params, params2) - } else { - return await this.mk.api[method](term, params, params2) + return await this.mk.api.v3.music(`v1/me/library/${truemethod}/${term.toString()}`, params, params2) + } else { + return await this.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/${truemethod}/${term.toString()}`, params, params2) } } catch (e) { console.log(e) @@ -1853,13 +1893,13 @@ const app = new Vue({ }, async getLibrarySongs() { let response = await this.mkapi("songs", true, "", {limit: 100}, {includeResponseMeta: !0}) - this.library.songs.listing = response.data - this.library.songs.meta = response.meta + this.library.songs.listing = response.data.data + this.library.songs.meta = response.data.meta }, async getLibraryAlbums() { let response = await this.mkapi("albums", true, "", {limit: 100}, {includeResponseMeta: !0}) - this.library.albums.listing = response.data - this.library.albums.meta = response.meta + this.library.albums.listing = response.data.data + this.library.albums.meta = response.data.meta }, async getListenNow(attempt = 0) { if (attempt > 3) { @@ -1928,11 +1968,11 @@ const app = new Vue({ return } try { - this.radio.personal = await this.mkapi("recentRadioStations", false, "", - { - "platform": "web", - "art[url]": "f" - }); + this.radio.personal = (await app.mk.api.v3.music(`/v1/me/recent/radio-stations`, + { + "platform": "web", + "art[url]": "f" + })).data.data; } catch (e) { console.log(e) this.getRadioStations(attempt + 1) @@ -2563,7 +2603,7 @@ const app = new Vue({ return } //this.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/search?term=${this.search.term}` - this.mk.api.search(this.search.term, + this.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/search?term=${this.search.term}`, { types: "activities,albums,apple-curators,artists,curators,editorial-items,music-movies,music-videos,playlists,songs,stations,tv-episodes,uploaded-videos,record-labels", "relate[editorial-items]": "contents", @@ -2581,16 +2621,19 @@ const app = new Vue({ "platform": "web", limit: 25 }).then(function (results) { - self.search.results = results + results.data.results["meta"] = results.data.meta + self.search.results = results.data.results }) - await this.mk.api.socialSearch(this.search.term, { + + await app.mk.api.v3.music(`v1/social/${app.mk.storefrontId}/search?term=${app.search.term}`, { types: ["playlists", "social-profiles"], limit: 25, with: ["serverBubbles", "lyricSnippet"], "art[url]": "f", "art[social-profiles:url]": "c" }, {includeResponseMeta: !0}).then(function (results) { - self.search.resultsSocial = results + results.data.results["meta"] = results.data.meta + self.search.resultsSocial = results.data.results }) }, async inLibrary(items = []) { @@ -2613,11 +2656,18 @@ const app = new Vue({ types[index].id.push(id) } } - return await this.mk.api.catalogResources(types, { + types2 = types.map(function(item){return {[`ids[${item.type}]`]: [item.id]}}) + types2 = types2.reduce(function(result, item) { + var key = Object.keys(item)[0]; //first property: a, b, c + result[key] = item[key]; + return result; + }, {}); + return (await + this.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}`, {...{ "omit[resource]": "autos", relate: "library", fields: "inLibrary" - }) + },...types2})).data.data }, isInLibrary(playParams) { let self = this @@ -2804,7 +2854,6 @@ const app = new Vue({ }, async setLibraryArt() { if (typeof this.mk.nowPlayingItem === "undefined") return; - const data = await this.mk.api.library.song(this.mk.nowPlayingItem["id"]) try { const data = await this.mk.api.v3.music(`/v1/me/library/songs/${this.mk.nowPlayingItem.id}`); data = data.data.data[0]; @@ -2819,7 +2868,6 @@ const app = new Vue({ }, async setLibraryArtBG() { if (typeof this.mk.nowPlayingItem === "undefined") return; - const data = await this.mk.api.library.song(this.mk.nowPlayingItem["id"]) try { const data = await this.mk.api.v3.music(`/v1/me/library/songs/${this.mk.nowPlayingItem.id}`); data = data.data.data[0]; @@ -2856,7 +2904,7 @@ const app = new Vue({ } id = item.id } - let response = await this.mk.api.v3.music(`/v1/me/ratings/${type}?platform=web&ids=${id}`) + let response = await this.mk.api.v3.music(`/v1/me/ratings/${type}?platform=web&ids=${type.includes('library') ? item.id : id}}`) if (response.data.data.length != 0) { let value = response.data.data[0].attributes.value return value diff --git a/src/renderer/views/components/mediaitem-square-sp.ejs b/src/renderer/views/components/mediaitem-square-sp.ejs index dbf9ae95..4d69ea21 100644 --- a/src/renderer/views/components/mediaitem-square-sp.ejs +++ b/src/renderer/views/components/mediaitem-square-sp.ejs @@ -96,6 +96,7 @@ if (this.item.type && !this.item.type.includes("library")) { var params = {"fields[playlists]": "inLibrary", "fields[albums]": "inLibrary", "relate": "library", "extend": this.revisedRandId()} var res = await app.mkapi(this.item.attributes.playParams.kind ?? this.item.type, this.item.attributes.playParams.isLibrary ?? false, this.item.attributes.playParams.id ?? this.item.id, params); + res = res.data.data[0] this.addedToLibrary = (res && res.attributes && res.attributes.inLibrary) ? res.attributes.inLibrary : false } else { this.addedToLibrary = true @@ -105,6 +106,7 @@ var params = {"fields[playlists]": "inLibrary","fields[songs]": "inLibrary", "fields[albums]": "inLibrary", "relate": "library", "extend": this.revisedRandId()} var id = this.item.id ?? this.item.attributes.playParams.id var res = await app.mkapi(this.item.attributes.playParams.kind ?? this.item.type, this.item.attributes.playParams.isLibrary ?? false, this.item.attributes.playParams.id ?? this.item.id, params); + res = res.data.data[0] if (res && res.relationships && res.relationships.library && res.relationships.library.data && res.relationships.library.data.length > 0) { id = res.relationships.library.data[0].id } diff --git a/src/renderer/views/components/mediaitem-square.ejs b/src/renderer/views/components/mediaitem-square.ejs index aff2ff66..041bd4fd 100644 --- a/src/renderer/views/components/mediaitem-square.ejs +++ b/src/renderer/views/components/mediaitem-square.ejs @@ -165,6 +165,7 @@ "extend": this.revisedRandId() } var res = await app.mkapi(this.item.attributes.playParams.kind ?? this.item.type, this.item.attributes.playParams.isLibrary ?? false, this.item.attributes.playParams.id ?? this.item.id, params); + res = res.data.data[0] this.addedToLibrary = (res && res.attributes && res.attributes.inLibrary) ? res.attributes.inLibrary : false } else { this.addedToLibrary = true @@ -180,6 +181,7 @@ } var id = this.item.id ?? this.item.attributes.playParams.id var res = await app.mkapi(this.item.attributes.playParams.kind ?? this.item.type, this.item.attributes.playParams.isLibrary ?? false, this.item.attributes.playParams.id ?? this.item.id, params); + res= res.data.data[0] if (res && res.relationships && res.relationships.library && res.relationships.library.data && res.relationships.library.data.length > 0) { id = res.relationships.library.data[0].id } diff --git a/src/renderer/views/pages/cider-playlist.ejs b/src/renderer/views/pages/cider-playlist.ejs index 6b377bc7..cfc4dc79 100644 --- a/src/renderer/views/pages/cider-playlist.ejs +++ b/src/renderer/views/pages/cider-playlist.ejs @@ -205,7 +205,7 @@ "relate": "library" }; const res = await app.mkapi(this.data.attributes.playParams.kind ?? this.data.type, this.data.attributes.playParams.isLibrary ?? false, this.data.attributes.playParams.id ?? this.data.id, params); - this.inLibrary = (res && res.attributes && res.attributes.inLibrary) ? res.attributes.inLibrary : false + this.inLibrary = (res.data.data[0] && res.data.data[0].attributes && res.data.data[0].attributes.inLibrary) ? res.data.data[0].attributes.inLibrary : false console.log(res) } else { this.inLibrary = true @@ -229,8 +229,8 @@ const params = {"fields[somgs]": "inLibrary", "fields[albums]": "inLibrary", "relate": "library"}; var id = this.data.id ?? this.data.attributes.playParams.id const res = await app.mkapi(this.data.attributes.playParams.kind ?? this.data.type, this.data.attributes.playParams.isLibrary ?? false, this.data.attributes.playParams.id ?? this.data.id, params); - if (res && res.relationships && res.relationships.library && res.relationships.library.data && res.relationships.library.data.length > 0) { - id = res.relationships.library.data[0].id + if (res.data.data[0] && res.data.data[0].relationships && res.data.data[0].relationships.library && res.data.data[0].relationships.library.data && res.data.data[0].relationships.library.data.length > 0) { + id = res.data.data[0].relationships.library.data[0].id } let kind = this.data.attributes.playParams.kind ?? this.data.type ?? ''; const truekind = (!kind.endsWith("s")) ? (kind + "s") : kind; @@ -278,7 +278,19 @@ if (!this.data.attributes.canEdit) { return } - await app.mk.api.library.putPlaylistTracklisting(this.data.attributes.playParams.id, this.convert()) + console.log('sds',this.convert()) + await app.mk.api.v3.music( + `/v1/me/library/playlists/${this.data.attributes.playParams.id}/tracks`, + {}, + { + fetchOptions: { + method: "PUT", + body: JSON.stringify({ + data: this.convert() + }) + } + } + ) }, async remove() { if (!this.data.attributes.canEdit) { diff --git a/src/renderer/views/pages/search.ejs b/src/renderer/views/pages/search.ejs index e2b69f2c..6d433fc1 100644 --- a/src/renderer/views/pages/search.ejs +++ b/src/renderer/views/pages/search.ejs @@ -55,28 +55,28 @@

-
+
+ :items="search.resultsSocial.playlist.data.limit(10)">
From 89e867ffabe39fd7719f932678a037a1eb7ebb78 Mon Sep 17 00:00:00 2001 From: Core Date: Sun, 16 Jan 2022 16:14:40 +0000 Subject: [PATCH 26/61] Plugins system using typescript and/or ts classes --- src/main/base/plugins.ts | 28 ++++++++++++++++------ src/main/index.ts | 24 +++++++++++++++---- src/main/plugins/examplePlugin.ts | 40 ++++++++++++++++++++++--------- 3 files changed, 69 insertions(+), 23 deletions(-) diff --git a/src/main/base/plugins.ts b/src/main/base/plugins.ts index 6e5aebfe..34980706 100644 --- a/src/main/base/plugins.ts +++ b/src/main/base/plugins.ts @@ -5,23 +5,26 @@ import * as electron from 'electron' export default class PluginHandler { private basePluginsPath = path.join(__dirname, '../plugins'); private userPluginsPath = path.join(electron.app.getPath('userData'), 'plugins'); - private pluginsList: any = []; + private pluginsList: any = {}; constructor() { this.pluginsList = this.getPlugins(); - console.log(this.pluginsList); } public getPlugins(): any { - let plugins: any = []; + let plugins: any = {}; if (fs.existsSync(this.basePluginsPath)) { fs.readdirSync(this.basePluginsPath).forEach(file => { if (file.endsWith('.ts') || file.endsWith('.js')) { - const plugin = require(path.join(this.basePluginsPath, file)); - plugins.push(new plugin()); + const plugin = require(path.join(this.basePluginsPath, file)).default; + if (plugins[file] || plugin.name in plugins) { + console.log(`[${plugin.name}] Plugin already loaded / Duplicate Class Name`); + } else { + plugins[file] = new plugin(); + } } }); } @@ -31,8 +34,11 @@ export default class PluginHandler { fs.readdirSync(this.userPluginsPath).forEach(file => { if (file.endsWith('.ts') || file.endsWith('.js')) { const plugin = require(path.join(this.userPluginsPath, file)); - console.log(plugin); - plugins.push(new plugin()); + if (plugins[file] || plugin in plugins) { + console.log(`[${plugin.default}] Plugin already loaded / Duplicate Class Name`); + } else { + plugins[file] = new plugin.default(); + } } }); } @@ -40,4 +46,12 @@ export default class PluginHandler { return plugins; } + public callPlugins(event: string, ...args: any[]) { + for (const plugin in this.pluginsList) { + if (this.pluginsList[plugin][event]) { + this.pluginsList[plugin][event](...args); + } + } + } + } \ No newline at end of file diff --git a/src/main/index.ts b/src/main/index.ts index 7ef76e08..9befcf00 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -4,27 +4,29 @@ require('v8-compile-cache'); const ElectronSentry = require("@sentry/electron"); ElectronSentry.init({dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214"}); -import {app} from 'electron'; +import * as electron from 'electron'; import {Win} from "./base/win"; import {ConfigStore} from "./base/store"; import {AppEvents} from "./base/app"; -// import PluginHandler from "./base/plugins"; +import PluginHandler from "./base/plugins"; // const test = new PluginHandler(); const config = new ConfigStore(); const App = new AppEvents(config.store); -const Cider = new Win(app, config.store) +const Cider = new Win(electron.app, config.store) +const plug = new PluginHandler(); /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * App Event Handlers * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ -app.on('ready', () => { +electron.app.on('ready', () => { App.ready(); + plug.callPlugins('onReady'); console.log('[Cider] Application is Ready. Creating Window.') - if (!app.isPackaged) { + if (!electron.app.isPackaged) { console.info('[Cider] Running in development mode.') require('vue-devtools').install() } @@ -32,6 +34,18 @@ app.on('ready', () => { Cider.createWindow(); }); +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +* Renderer Event Handlers +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +electron.ipcMain.on('playbackStateDidChange', (event, attributes) => { + plug.callPlugins('onPlaybackStateDidChange', attributes); +}); + +electron.ipcMain.on('nowPlayingItemDidChange', (event, attributes) => { + plug.callPlugins('onNowPlayingItemDidChange', attributes); +}); + // // app.on('before-quit', () => { // app.isQuiting = true; diff --git a/src/main/plugins/examplePlugin.ts b/src/main/plugins/examplePlugin.ts index 8a8d6d30..b463bbf5 100644 --- a/src/main/plugins/examplePlugin.ts +++ b/src/main/plugins/examplePlugin.ts @@ -1,33 +1,51 @@ +let i = 1, k = 1; export default class ExamplePlugin { + /** + * Base Plugin Details (Eventually implemented into a GUI in settings) + */ public name: string = 'examplePlugin'; public description: string = 'Example plugin'; public version: string = '1.0.0'; public author: string = 'Example author'; - + + /** + * Runs on plugin load (Currently run on application start) + */ constructor() { - this.name = 'coolPlugin'; - this.description = 'A pretty cool plugin'; - this.version = '1.0.0'; - this.author = 'Core'; + } - onStart(): void { - console.log('Example plugin started'); - } - + /** + * Runs on app ready + */ onReady(): void { console.log('Example plugin ready'); } + /** + * Runs on app stop + */ onStop(): void { console.log('Example plugin stopped'); } - OnPlaybackStateChanged(attributes: object): void { + /** + * Runs on playback State Change + * @param attributes Music Attributes (attributes.state = current state) + */ + onPlaybackStateDidChange(attributes: object): void { + console.log('onPlaybackStateDidChange has been called ' + i +' times'); + i++ } - OnMediaStateChanged(attributes: object): void { + /** + * Runs on song change + * @param attributes Music Attributes + */ + onNowPlayingItemDidChange(attributes: object): void { + console.log('onNowPlayingDidChange has been called ' + k +' times'); + k++ } } \ No newline at end of file From a501a83a964d3a966149b39c04fc378c302b7562 Mon Sep 17 00:00:00 2001 From: Core Date: Sun, 16 Jan 2022 16:57:37 +0000 Subject: [PATCH 27/61] Rename --- src/main/index.ts | 25 ++++--------------------- src/main/plugins/examplePlugin.ts | 2 +- 2 files changed, 5 insertions(+), 22 deletions(-) diff --git a/src/main/index.ts b/src/main/index.ts index 9befcf00..208f7bb8 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -47,10 +47,10 @@ electron.ipcMain.on('nowPlayingItemDidChange', (event, attributes) => { }); // -// app.on('before-quit', () => { -// app.isQuiting = true; -// console.warn(`${app.getName()} exited.`); -// }); +electron.app.on('before-quit', () => { + plug.callPlugins('onBeforeQuit'); + console.warn(`${electron.app.getName()} exited.`); +}); // // // Widevine Stuff // app.on('widevine-ready', (version, lastVersion) => { @@ -70,23 +70,6 @@ electron.ipcMain.on('nowPlayingItemDidChange', (event, attributes) => { // app.exit() // }) // -// if (process.defaultApp) { -// if (process.argv.length >= 2) { -// app.setAsDefaultProtocolClient('cider', process.execPath, [resolve(process.argv[1])]) -// app.setAsDefaultProtocolClient('ame', process.execPath, [resolve(process.argv[1])]) -// app.setAsDefaultProtocolClient('itms', process.execPath, [resolve(process.argv[1])]) -// app.setAsDefaultProtocolClient('itmss', process.execPath, [resolve(process.argv[1])]) -// app.setAsDefaultProtocolClient('musics', process.execPath, [resolve(process.argv[1])]) -// app.setAsDefaultProtocolClient('music', process.execPath, [resolve(process.argv[1])]) -// } -// } else { -// app.setAsDefaultProtocolClient('cider') // Custom AME Protocol -// app.setAsDefaultProtocolClient('ame') // Custom AME Protocol -// app.setAsDefaultProtocolClient('itms') // iTunes HTTP Protocol -// app.setAsDefaultProtocolClient('itmss') // iTunes HTTPS Protocol -// app.setAsDefaultProtocolClient('musics') // macOS Client Protocol -// app.setAsDefaultProtocolClient('music') // macOS Client Protocol -// } // // app.on('open-url', (event, url) => { // event.preventDefault() diff --git a/src/main/plugins/examplePlugin.ts b/src/main/plugins/examplePlugin.ts index b463bbf5..9c7bb8e4 100644 --- a/src/main/plugins/examplePlugin.ts +++ b/src/main/plugins/examplePlugin.ts @@ -26,7 +26,7 @@ export default class ExamplePlugin { /** * Runs on app stop */ - onStop(): void { + onBeforeQuit(): void { console.log('Example plugin stopped'); } From ff368570f0925ac3d041c92af592d61bd2665149 Mon Sep 17 00:00:00 2001 From: child_duckling <19170969+quacksire@users.noreply.github.com> Date: Sun, 16 Jan 2022 14:23:15 -0800 Subject: [PATCH 28/61] import frontend remote --- src/web-remote/assets/Grabber.svg | 22 + src/web-remote/assets/arrow-left.svg | 1 + src/web-remote/assets/backward.svg | 1 + src/web-remote/assets/forward.svg | 1 + src/web-remote/assets/infinity.svg | 1 + src/web-remote/assets/list.svg | 1 + src/web-remote/assets/pause.svg | 1 + src/web-remote/assets/play.svg | 1 + src/web-remote/assets/quote-right.svg | 1 + src/web-remote/assets/repeat.svg | 47 ++ src/web-remote/assets/search.svg | 1 + src/web-remote/assets/shuffle.svg | 45 + src/web-remote/assets/volume-down.svg | 1 + src/web-remote/assets/volume-up.svg | 1 + src/web-remote/ciderframework.css | 1044 ++++++++++++++++++++++++ src/web-remote/icon-192x192.png | Bin 0 -> 17166 bytes src/web-remote/icon-256x256.png | Bin 0 -> 16442 bytes src/web-remote/icon-384x384.png | Bin 0 -> 43738 bytes src/web-remote/icon-512x512.png | Bin 0 -> 38363 bytes src/web-remote/index.html | 861 ++++++++++++++++++- src/web-remote/index.js | 619 ++++++++++++++ src/web-remote/manifest.json | 32 + src/web-remote/sortable.min.js | 2 + src/web-remote/style.css | 1023 +++++++++++++++++++++++ src/web-remote/vue.js | 6 + src/web-remote/vuedraggable.umd.min.js | 2 + 26 files changed, 3713 insertions(+), 1 deletion(-) create mode 100644 src/web-remote/assets/Grabber.svg create mode 100644 src/web-remote/assets/arrow-left.svg create mode 100644 src/web-remote/assets/backward.svg create mode 100644 src/web-remote/assets/forward.svg create mode 100644 src/web-remote/assets/infinity.svg create mode 100644 src/web-remote/assets/list.svg create mode 100644 src/web-remote/assets/pause.svg create mode 100644 src/web-remote/assets/play.svg create mode 100644 src/web-remote/assets/quote-right.svg create mode 100644 src/web-remote/assets/repeat.svg create mode 100644 src/web-remote/assets/search.svg create mode 100644 src/web-remote/assets/shuffle.svg create mode 100644 src/web-remote/assets/volume-down.svg create mode 100644 src/web-remote/assets/volume-up.svg create mode 100644 src/web-remote/ciderframework.css create mode 100644 src/web-remote/icon-192x192.png create mode 100644 src/web-remote/icon-256x256.png create mode 100644 src/web-remote/icon-384x384.png create mode 100644 src/web-remote/icon-512x512.png create mode 100644 src/web-remote/index.js create mode 100644 src/web-remote/manifest.json create mode 100644 src/web-remote/sortable.min.js create mode 100644 src/web-remote/style.css create mode 100644 src/web-remote/vue.js create mode 100644 src/web-remote/vuedraggable.umd.min.js diff --git a/src/web-remote/assets/Grabber.svg b/src/web-remote/assets/Grabber.svg new file mode 100644 index 00000000..287eb001 --- /dev/null +++ b/src/web-remote/assets/Grabber.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/web-remote/assets/arrow-left.svg b/src/web-remote/assets/arrow-left.svg new file mode 100644 index 00000000..41098a56 --- /dev/null +++ b/src/web-remote/assets/arrow-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/web-remote/assets/backward.svg b/src/web-remote/assets/backward.svg new file mode 100644 index 00000000..4c445c05 --- /dev/null +++ b/src/web-remote/assets/backward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/web-remote/assets/forward.svg b/src/web-remote/assets/forward.svg new file mode 100644 index 00000000..37b509f1 --- /dev/null +++ b/src/web-remote/assets/forward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/web-remote/assets/infinity.svg b/src/web-remote/assets/infinity.svg new file mode 100644 index 00000000..4d06c7b8 --- /dev/null +++ b/src/web-remote/assets/infinity.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/web-remote/assets/list.svg b/src/web-remote/assets/list.svg new file mode 100644 index 00000000..5a8ca2c3 --- /dev/null +++ b/src/web-remote/assets/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/web-remote/assets/pause.svg b/src/web-remote/assets/pause.svg new file mode 100644 index 00000000..2e9ab6fd --- /dev/null +++ b/src/web-remote/assets/pause.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/web-remote/assets/play.svg b/src/web-remote/assets/play.svg new file mode 100644 index 00000000..f6296da5 --- /dev/null +++ b/src/web-remote/assets/play.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/web-remote/assets/quote-right.svg b/src/web-remote/assets/quote-right.svg new file mode 100644 index 00000000..629ab4ee --- /dev/null +++ b/src/web-remote/assets/quote-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/web-remote/assets/repeat.svg b/src/web-remote/assets/repeat.svg new file mode 100644 index 00000000..0c283cf4 --- /dev/null +++ b/src/web-remote/assets/repeat.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/web-remote/assets/search.svg b/src/web-remote/assets/search.svg new file mode 100644 index 00000000..62953986 --- /dev/null +++ b/src/web-remote/assets/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/web-remote/assets/shuffle.svg b/src/web-remote/assets/shuffle.svg new file mode 100644 index 00000000..5ac0b6ae --- /dev/null +++ b/src/web-remote/assets/shuffle.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/web-remote/assets/volume-down.svg b/src/web-remote/assets/volume-down.svg new file mode 100644 index 00000000..87c9f9fc --- /dev/null +++ b/src/web-remote/assets/volume-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/web-remote/assets/volume-up.svg b/src/web-remote/assets/volume-up.svg new file mode 100644 index 00000000..05db44e8 --- /dev/null +++ b/src/web-remote/assets/volume-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/web-remote/ciderframework.css b/src/web-remote/ciderframework.css new file mode 100644 index 00000000..b62db157 --- /dev/null +++ b/src/web-remote/ciderframework.css @@ -0,0 +1,1044 @@ +/* Simple CSS framework for Cider */ + +.md-labeltext { + font-size: 14px; + text-transform: uppercase; + opacity: 0.75; + font-weight: 500; +} + +.md-option-container { + border-radius: 10px; + overflow: hidden; +} + +.md-option-line { + display: flex; + width: 100%; + padding: 14px; + background: var(--opaquePageBGColor); + font-size: 0.85em; +} + +.md-option-segment.md-option-segment_auto { + width: auto; +} + +.md-option-container .md-option-line:not(:last-child) { + border-bottom: 1px solid rgb(0 0 0 / 15%); +} + +input[type="range"].md-slider { + -webkit-appearance: none; + height: 7px; + background: rgba(255, 255, 255, 0.6); + border-radius: 5px; + background-size: 70% 100%; + background-repeat: no-repeat; +} + +input[type="range"].md-slider::-webkit-slider-thumb { + -webkit-appearance: none; + height: 20px; + width: 20px; + border-radius: 50%; + background: rgb(255 255 255); + cursor: ew-resize; + box-shadow: 0 0 2px 0 #555; +} + +input[type=range].md-slider::-webkit-slider-runnable-track { + -webkit-appearance: none; + box-shadow: none; + border: none; + background: transparent; +} + +.md-option-segment { + width: 100%; + display: flex; + justify-content: center; + flex-direction: column; +} + +.md-h1 { + font-size: 3em; + text-align: center; +} + +.md-header { + padding: 16px; +} + +.md-header-title { + padding: 18px; + font-weight: 600; + font-size: 16px; + height: 55px; + background: var(--opaquePageBGColor); + border-bottom: 1px solid rgb(0 0 0 / 15%); +} + +.md-footer { + padding: 16px; + text-align: center; +} + +.md-close-btn { + -webkit-mask-image: url("ameres://icons/webui/close.svg"); + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + background-color: white; + opacity: 0.75; + -webkit-mask-size: contain; + height: 18px; + width: 18px; +} + +.md-btn { + background: rgba(100, 100, 100, 0.5); + padding: 8px 16px; + border-radius: 4px; + font-size: 15px; + border: 1px solid rgb(100 100 100 / 35%); + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 1px 1px rgba(0, 0, 0, 0.4); +} + +.md-btn.md-btn-block { + display: block; +} + +.md-btn:active { + filter: brightness(75%); +} + +.md-select { + padding: 5px 10px; + font-size: 1em; + font-family: inherit; + border-radius: 4px; + border: 1px solid rgb(100 100 100 / 35%); + box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.3), 0px 1px 1px rgba(0, 0, 0, 0.4); +} + +.md-select:focus { + outline: none; +} + +.md-select>option { + font-size: 1em; + font-family: inherit; + padding: 8px 16px; +} + +.md-btn.md-btn-primary { + background: var(--keyColor); + color: white; +} + +.md-transparent { + background: transparent; +} + +.md-container { + display: flex; + flex-direction: column; + height: 100%; + position: absolute; + top: 0px; + left: 0px; + width: 100%; + padding: 32px; +} + +.md-container_panel { + padding: 0px; +} + +.md-body { + height: 100%; + padding: 16px; + font-size: 1.25em; +} + +@media (prefers-color-scheme: light) { + .md-btn { + background: rgb(255 255 255); + box-shadow: rgb(0 0 0 / 10%) 0px 0px 1px, rgb(0 0 0 / 20%) 0px 1px 1px; + border: 1px solid rgb(0 0 0 / 15%); + } + .md-close-btn { + background-color: #000; + } +} + + +/* Vue transitions */ + +.fade_simple-enter-active, +.fade_simple-leave-active { + transition: all .5s; +} + +.fade_simple-enter, +.fade_simple-leave-to { + opacity: 0; +} + +.fade-enter-active, +.fade-leave-active { + transition: all .5s; +} + +.fade-enter, +.fade-leave-to { + opacity: 0; + transform: scale(0.95); +} + + +/* CSS Grids */ + +.container, +.container-fluid, +.container-xxl, +.container-xl, +.container-lg, +.container-md, +.container-sm { + width: 100%; + padding-right: var(--bs-gutter-x, 0.75rem); + padding-left: var(--bs-gutter-x, 0.75rem); + margin-right: auto; + margin-left: auto; +} + +.row { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + display: flex; + flex-wrap: wrap; + margin-top: calc(-1 * var(--bs-gutter-y)); + margin-right: calc(-0.5 * var(--bs-gutter-x)); + margin-left: calc(-0.5 * var(--bs-gutter-x)); +} + +.row>* { + box-sizing: border-box; + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + margin-top: var(--bs-gutter-y); +} + +.col { + flex: 1 0 0%; +} + +.row-cols-auto>* { + flex: 0 0 auto; + width: auto; +} + +.row-cols-1>* { + flex: 0 0 auto; + width: 100%; +} + +.row-cols-2>* { + flex: 0 0 auto; + width: 50%; +} + +.row-cols-3>* { + flex: 0 0 auto; + width: 33.3333333333%; +} + +.row-cols-4>* { + flex: 0 0 auto; + width: 25%; +} + +.row-cols-5>* { + flex: 0 0 auto; + width: 20%; +} + +.row-cols-6>* { + flex: 0 0 auto; + width: 16.6666666667%; +} + +.col-auto { + flex: 0 0 auto; + width: auto; +} + +.col-1 { + flex: 0 0 auto; + width: 8.33333333%; +} + +.col-2 { + flex: 0 0 auto; + width: 16.66666667%; +} + +.col-3 { + flex: 0 0 auto; + width: 25%; +} + +.col-4 { + flex: 0 0 auto; + width: 33.33333333%; +} + +.col-5 { + flex: 0 0 auto; + width: 41.66666667%; +} + +.col-6 { + flex: 0 0 auto; + width: 50%; +} + +.col-7 { + flex: 0 0 auto; + width: 58.33333333%; +} + +.col-8 { + flex: 0 0 auto; + width: 66.66666667%; +} + +.col-9 { + flex: 0 0 auto; + width: 75%; +} + +.col-10 { + flex: 0 0 auto; + width: 83.33333333%; +} + +.col-11 { + flex: 0 0 auto; + width: 91.66666667%; +} + +.col-12 { + flex: 0 0 auto; + width: 100%; +} + +.offset-1 { + margin-left: 8.33333333%; +} + +.offset-2 { + margin-left: 16.66666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.33333333%; +} + +.offset-5 { + margin-left: 41.66666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.33333333%; +} + +.offset-8 { + margin-left: 66.66666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.33333333%; +} + +.offset-11 { + margin-left: 91.66666667%; +} + +.g-0, +.gx-0 { + --bs-gutter-x: 0; +} + +.g-0, +.gy-0 { + --bs-gutter-y: 0; +} + +.g-1, +.gx-1 { + --bs-gutter-x: 0.25rem; +} + +.g-1, +.gy-1 { + --bs-gutter-y: 0.25rem; +} + +.g-2, +.gx-2 { + --bs-gutter-x: 0.5rem; +} + +.g-2, +.gy-2 { + --bs-gutter-y: 0.5rem; +} + +.g-3, +.gx-3 { + --bs-gutter-x: 1rem; +} + +.g-3, +.gy-3 { + --bs-gutter-y: 1rem; +} + +.g-4, +.gx-4 { + --bs-gutter-x: 1.5rem; +} + +.g-4, +.gy-4 { + --bs-gutter-y: 1.5rem; +} + +.g-5, +.gx-5 { + --bs-gutter-x: 3rem; +} + +.g-5, +.gy-5 { + --bs-gutter-y: 3rem; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-grid { + display: grid !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline-flex { + display: inline-flex !important; +} + +.d-none { + display: none !important; +} + +.flex-fill { + flex: 1 1 auto !important; +} + +.flex-row { + flex-direction: row !important; +} + +.flex-column { + flex-direction: column !important; +} + +.flex-row-reverse { + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + flex-direction: column-reverse !important; +} + +.flex-grow-0 { + flex-grow: 0 !important; +} + +.flex-grow-1 { + flex-grow: 1 !important; +} + +.flex-shrink-0 { + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + flex-shrink: 1 !important; +} + +.flex-wrap { + flex-wrap: wrap !important; +} + +.flex-nowrap { + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} + +.justify-content-start { + justify-content: flex-start !important; +} + +.justify-content-end { + justify-content: flex-end !important; +} + +.justify-content-center { + justify-content: center !important; +} + +.justify-content-between { + justify-content: space-between !important; +} + +.justify-content-around { + justify-content: space-around !important; +} + +.justify-content-evenly { + justify-content: space-evenly !important; +} + +.align-items-start { + align-items: flex-start !important; +} + +.align-items-end { + align-items: flex-end !important; +} + +.align-items-center { + align-items: center !important; +} + +.align-items-baseline { + align-items: baseline !important; +} + +.align-items-stretch { + align-items: stretch !important; +} + +.align-content-start { + align-content: flex-start !important; +} + +.align-content-end { + align-content: flex-end !important; +} + +.align-content-center { + align-content: center !important; +} + +.align-content-between { + align-content: space-between !important; +} + +.align-content-around { + align-content: space-around !important; +} + +.align-content-stretch { + align-content: stretch !important; +} + +.align-self-auto { + align-self: auto !important; +} + +.align-self-start { + align-self: flex-start !important; +} + +.align-self-end { + align-self: flex-end !important; +} + +.align-self-center { + align-self: center !important; +} + +.align-self-baseline { + align-self: baseline !important; +} + +.align-self-stretch { + align-self: stretch !important; +} + +.order-first { + order: -1 !important; +} + +.order-0 { + order: 0 !important; +} + +.order-1 { + order: 1 !important; +} + +.order-2 { + order: 2 !important; +} + +.order-3 { + order: 3 !important; +} + +.order-4 { + order: 4 !important; +} + +.order-5 { + order: 5 !important; +} + +.order-last { + order: 6 !important; +} + +.m-0 { + margin: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} + +.mx-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} + +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} + +.mx-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} + +.mx-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} + +.mx-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} + +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} + +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} + +.my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} + +.my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} + +.my-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} + +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} + +.mt-0 { + margin-top: 0 !important; +} + +.mt-1 { + margin-top: 0.25rem !important; +} + +.mt-2 { + margin-top: 0.5rem !important; +} + +.mt-3 { + margin-top: 1rem !important; +} + +.mt-4 { + margin-top: 1.5rem !important; +} + +.mt-5 { + margin-top: 3rem !important; +} + +.mt-auto { + margin-top: auto !important; +} + +.me-0 { + margin-right: 0 !important; +} + +.me-1 { + margin-right: 0.25rem !important; +} + +.me-2 { + margin-right: 0.5rem !important; +} + +.me-3 { + margin-right: 1rem !important; +} + +.me-4 { + margin-right: 1.5rem !important; +} + +.me-5 { + margin-right: 3rem !important; +} + +.me-auto { + margin-right: auto !important; +} + +.mb-0 { + margin-bottom: 0 !important; +} + +.mb-1 { + margin-bottom: 0.25rem !important; +} + +.mb-2 { + margin-bottom: 0.5rem !important; +} + +.mb-3 { + margin-bottom: 1rem !important; +} + +.mb-4 { + margin-bottom: 1.5rem !important; +} + +.mb-5 { + margin-bottom: 3rem !important; +} + +.mb-auto { + margin-bottom: auto !important; +} + +.ms-0 { + margin-left: 0 !important; +} + +.ms-1 { + margin-left: 0.25rem !important; +} + +.ms-2 { + margin-left: 0.5rem !important; +} + +.ms-3 { + margin-left: 1rem !important; +} + +.ms-4 { + margin-left: 1.5rem !important; +} + +.ms-5 { + margin-left: 3rem !important; +} + +.ms-auto { + margin-left: auto !important; +} + +.p-0 { + padding: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} + +.px-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} + +.px-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} + +.px-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} + +.px-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} + +.px-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} + +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} + +.py-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} + +.py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} + +.py-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} + +.pt-0 { + padding-top: 0 !important; +} + +.pt-1 { + padding-top: 0.25rem !important; +} + +.pt-2 { + padding-top: 0.5rem !important; +} + +.pt-3 { + padding-top: 1rem !important; +} + +.pt-4 { + padding-top: 1.5rem !important; +} + +.pt-5 { + padding-top: 3rem !important; +} + +.pe-0 { + padding-right: 0 !important; +} + +.pe-1 { + padding-right: 0.25rem !important; +} + +.pe-2 { + padding-right: 0.5rem !important; +} + +.pe-3 { + padding-right: 1rem !important; +} + +.pe-4 { + padding-right: 1.5rem !important; +} + +.pe-5 { + padding-right: 3rem !important; +} + +.pb-0 { + padding-bottom: 0 !important; +} + +.pb-1 { + padding-bottom: 0.25rem !important; +} + +.pb-2 { + padding-bottom: 0.5rem !important; +} + +.pb-3 { + padding-bottom: 1rem !important; +} + +.pb-4 { + padding-bottom: 1.5rem !important; +} + +.pb-5 { + padding-bottom: 3rem !important; +} + +.ps-0 { + padding-left: 0 !important; +} + +.ps-1 { + padding-left: 0.25rem !important; +} + +.ps-2 { + padding-left: 0.5rem !important; +} + +.ps-3 { + padding-left: 1rem !important; +} + +.ps-4 { + padding-left: 1.5rem !important; +} + +.ps-5 { + padding-left: 3rem !important; +} \ No newline at end of file diff --git a/src/web-remote/icon-192x192.png b/src/web-remote/icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..05834da24a8b7a426d6f5b3359b3dbe4e71f4775 GIT binary patch literal 17166 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 N002ovPDHLkV1nLt@(=(3 literal 0 HcmV?d00001 diff --git a/src/web-remote/icon-256x256.png b/src/web-remote/icon-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..cb75e71b666f0fe9e72e6d3dab70a576b3d621d6 GIT binary patch literal 16442 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

3zQXJO!S%09#+j;K`l~YG+Q<+xp#A-u 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 literal 0 HcmV?d00001 diff --git a/src/web-remote/icon-512x512.png b/src/web-remote/icon-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..f4a96312fa1083f04c62446eedd61120c942f445 GIT binary patch literal 38363 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

MA!? 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 literal 0 HcmV?d00001 diff --git a/src/web-remote/index.html b/src/web-remote/index.html index 74bb16bc..18695a58 100644 --- a/src/web-remote/index.html +++ b/src/web-remote/index.html @@ -1 +1,860 @@ -Web Remote \ No newline at end of file + + + + + + + + Web Remote + + + + + + + + +

+ + + + +
+
+ +
+
+
+ Loading... +
+
+

Connection Interrupted

+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+ +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/web-remote/index.js b/src/web-remote/index.js new file mode 100644 index 00000000..902ba770 --- /dev/null +++ b/src/web-remote/index.js @@ -0,0 +1,619 @@ +var socket; + +Vue.component('footer-player', { + template: '#footer-player' +}); + +// vue instance +var app = new Vue({ + el: '#app', + data: { + screen: "player", + player: { + currentMediaItem: {}, + songActions: false, + lyrics: {}, + lyricsMediaItem: {}, + lyricsDebug: { + current: 0, + start: 0, + end: 0 + }, + queue: {}, + lowerPanelState: "controls", + userInteraction: false + }, + queue: { + temp: [] + }, + artistPage: { + data: {}, + editorsNotes: false + }, + albumPage: { + data: {}, + editorsNotes: false + }, + search: { + query: "", + results: [], + state: 0, + tab: "all", + searchType: "applemusic", + trackSelect: false, + selected: {}, + queue: {}, + lastPage: "search", + lastY: 0 + }, + lastPage: "player", + connectedState: 0, + url: window.location.hostname, + mode: "default", + // url: "localhost", + }, + methods: { + searchScroll(e) { + this.search.lastY = e.target.scrollTop; + }, + musicKitAPI(method, id, params) { + socket.send( + JSON.stringify({ + action: "musickit-api", + method: method, + id: id, + params: params + }) + ) + }, + resetPlayerUI() { + this.player.lowerPanelState = "controls"; + }, + musicAppVariant() { + if (navigator.userAgent.match(/Android/i)) { + return "Apple Music"; + } else if (navigator.userAgent.match(/iPhone|iPad|iPod/i)) { + return "Music"; + } else { + if (navigator.userAgent.indexOf('Mac') > 0) { + return 'Music'; + } else if (navigator.userAgent.indexOf('Win') > 0) { + return 'Apple Music Electron'; + } else { + return 'Apple Music Electron'; + } + } + }, + checkOrientation() { + // check orientation of device + if (window.innerHeight > window.innerWidth) { + return 'portrait' + } else { + return 'landscape'; + } + }, + checkPlatformMD() { + // check if platfom is desktop or mobile + if (navigator.userAgent.match(/Android/i)) { + return "mobile"; + } else if (navigator.userAgent.match(/iPhone|iPad|iPod/i)) { + return "mobile"; + } else { + if (navigator.userAgent.indexOf('Mac') > 0) { + return 'desktop'; + } else if (navigator.userAgent.indexOf('Win') > 0) { + return 'desktop'; + } else { + return 'desktop'; + } + } + }, + checkPlatform() { + if (navigator.userAgent.match(/Android/i)) { + return "android"; + } else if (navigator.userAgent.match(/iPhone|iPad|iPod/i)) { + return "ios"; + } else { + if (navigator.userAgent.indexOf('Mac') > 0) { + return 'mac'; + } else if (navigator.userAgent.indexOf('Win') > 0) { + return 'win'; + } else { + return 'linux'; + } + } + }, + artworkPlaying() { + if (this.player.currentMediaItem.status) { + return + } else { + return ["paused"] + } + }, + setAutoplay(value) { + socket.send(JSON.stringify({ + "action": "set-autoplay", + "autoplay": value + })); + this.getCurrentMediaItem() + if (value) { + setTimeout(() => { + this.getQueue() + }, 1000) + } else { + this.getQueue() + } + }, + seekTo(time, adjust = true) { + if (adjust) { + time = parseInt(time / 1000) + } + socket.send(JSON.stringify({ + action: "seek", + time: time + })); + }, + setVolume(volume) { + socket.send(JSON.stringify({ + action: "volume", + volume: volume + })); + }, + getQueue() { + socket.send(JSON.stringify({ + action: "get-queue" + })) + }, + play() { + socket.send(JSON.stringify({ + action: "play" + })) + }, + pause() { + socket.send(JSON.stringify({ + action: "pause" + })) + }, + next() { + socket.send(JSON.stringify({ + action: "next" + })) + }, + previous() { + socket.send(JSON.stringify({ + action: "previous" + })) + }, + searchArtist() { + this.search.query = this.player.currentMediaItem.artistName; + this.screen = "search"; + this.searchQuery(); + }, + trackSelect(song) { + this.search.selected = song; + this.search.trackSelect = true + }, + clearSelectedTrack() { + this.search.selected = {} + this.search.trackSelect = false + }, + getArtworkColor(hex) { + return `#${hex}` + }, + playMediaItemById(id, kind = "song") { + socket.send(JSON.stringify({ + action: "play-mediaitem", + id: id, + kind: kind + })) + this.screen = "player"; + }, + playNext(type, id) { + socket.send(JSON.stringify({ + action: "play-next", + type: type, + id: id + })) + }, + playLater(type, id) { + socket.send(JSON.stringify({ + action: "play-later", + type: type, + id: id + })) + }, + searchQuery() { + if (this.search.query.length == 0) { + this.search.state = 0; + return; + } + this.search.state = 1; + var actionType = "search" + if (this.search.searchType == "library") { + actionType = "library-search" + } + socket.send(JSON.stringify({ + "action": actionType, + "term": this.search.query, + "limit": 20 + })) + }, + quickSearch() { + var search = prompt("Search for a song", "") + if (search == null || search == "") { + return + } + + socket.send(JSON.stringify({ + action: "quick-play", + term: search + })) + }, + parseTime(value) { + var minutes = Math.floor(value / 60000); + var seconds = ((value % 60000) / 1000).toFixed(0); + return minutes + ":" + (seconds < 10 ? '0' : '') + seconds; + }, + parseTimeDecimal(value) { + var minutes = Math.floor(value / 60000); + var seconds = ((value % 60000) / 1000).toFixed(0); + return minutes + "." + (seconds < 10 ? '0' : '') + seconds; + }, + hmsToSecondsOnly(str) { + var p = str.split(':'), + s = 0, + m = 1; + + while (p.length > 0) { + s += m * parseInt(p.pop(), 10); + m *= 60; + } + + return s; + }, + getCurrentTime() { + return parseFloat(this.hmsToSecondsOnly(this.parseTime(this.player.currentMediaItem.durationInMillis - this.player.currentMediaItem.remainingTime))); + }, + percentage(partial, full) { + return (100 * partial) / full + }, + getLyricBGStyle(start, end) { + var currentTime = this.getCurrentTime(); + var duration = this.player.currentMediaItem.durationInMillis + var start2 = this.hmsToSecondsOnly(start) + var end2 = this.hmsToSecondsOnly(end) + var currentProgress = ((100 * (currentTime)) / (end2)) + // check if currenttime is between start and end + this.player.lyricsDebug.start = start2 + this.player.lyricsDebug.end = end2 + this.player.lyricsDebug.current = currentTime + if (currentTime >= start2 && currentTime <= end2) { + return { + "--bgSpeed": `${(end2 - start2)}s` + } + } else { + return {} + } + }, + getLyricClass(start, end) { + var currentTime = this.getCurrentTime(); + // check if currenttime is between start and end + if (currentTime >= start && currentTime <= end) { + setTimeout(() => { + if (document.querySelector(".lyric-line.active")) { + document.querySelector(".lyric-line.active").scrollIntoView({ + behavior: "smooth", + block: "center" + }) + } + }, 200) + return "active" + } else { + return "" + } + }, + getAlbumArtUrl(size = 600) { + if (this.player.currentMediaItem.artwork) { + return `url("${this.player.currentMediaItem.artwork.url.replace('{w}', size).replace('{h}', size)}")`; + } else { + return ""; + } + }, + getAlbumArtUrlList(url, size = 64) { + return `url("${url.replace('{w}', size).replace('{h}', size)}")`; + }, + searchTabClass(tab) { + if (tab == this.search.tab) { + return "active"; + } + }, + searchTypeClass(type) { + if (type == this.search.searchType) { + return "active"; + } + }, + getQueuePositionClass(position) { + if (this.player.queue["_position"] == position) { + return ["playing", "passed"] + } else if (this.player.queue["_position"] > position) { + return ["passed"] + } + }, + showSearch(reset = false) { + if(reset) { + this.search.lastPage = "search" + } + switch(this.search.lastPage) { + case "search": + this.screen = "search" + break; + case "album": + this.screen = "album-page" + break; + case "artist": + this.screen = "artist-page" + break; + case "playlist": + this.screen = "playlist-page" + break; + } + }, + showArtistByName(name) { + this.musicKitAPI("search", name, {types: "artists"}) + }, + showAlbum(id) { + this.search.lastPage = "album" + this.screen = "album-page" + this.musicKitAPI("album", id, {}) + }, + showArtist(id) { + this.search.lastPage = "artist" + this.screen = "artist-page" + this.musicKitAPI("artist", id, {include: "songs,playlists,albums"}) + }, + showQueue() { + this.queue.temp = this.player["queue"]["_queueItems"] + this.screen = "queue" + this.getQueue() + }, + queueMove(evt) { + console.log(evt) + console.log(`new: ${evt.moved.newIndex} old: ${evt.moved.oldIndex}`) + this.queue.temp.splice(evt.moved.newIndex, 0, this.queue.temp.splice(evt.moved.oldIndex, 1)[0]) + socket.send(JSON.stringify({ + action: "queue-move", + from: evt.moved.oldIndex, + to: evt.moved.newIndex + })) + this.getQueue() + return true + }, + repeat() { + socket.send(JSON.stringify({ + action: "repeat" + })) + this.getCurrentMediaItem() + }, + shuffle() { + socket.send(JSON.stringify({ + action: "shuffle" + })) + this.getCurrentMediaItem() + }, + setShuffle(val) { + socket.send(JSON.stringify({ + action: "set-shuffle", + shuffle: val + })) + this.getCurrentMediaItem() + }, + getMediaPalette(data) { + var palette = { + '--bgColor': `#${data['artwork']['bgColor']}`, + '--textColor1': `#${data['artwork']['textColor1']}`, + '--textColor2': `#${data['artwork']['textColor2']}`, + '--textColor3': `#${data['artwork']['textColor3']}`, + '--textColor4': `#${data['artwork']['textColor4']}` + } + return palette + }, + playAlbum(id, shuffle = false) { + if(shuffle) { + this.setShuffle(true) + }else{ + this.setShuffle(false) + } + this.playMediaItemById(id, 'album'); + }, + getLyrics() { + socket.send(JSON.stringify({ + action: "get-lyrics", + })) + }, + showLyrics() { + this.getLyrics() + this.screen = "lyrics" + }, + showLyricsInline() { + this.getLyrics() + this.player.lowerPanelState = "lyrics" + }, + parseLyrics() { + var xml = this.stringToXml(this.player.lyricsMediaItem.ttml) + var json = xmlToJson(xml); + this.player.lyrics = json + }, + stringToXml(st) { + // string to xml + var xml = (new DOMParser()).parseFromString(st, "text/xml"); + return xml; + }, + canShowSearchTab(tab) { + if (tab == this.search.tab || this.search.tab == "all") { + return true; + } else { + return false; + } + }, + getCurrentMediaItem() { + socket.send(JSON.stringify({ + action: "get-currentmediaitem" + })) + }, + setStreamerOverlay() { + document.body.classList.add("streamer-overlay") + }, + setMode(mode) { + switch(mode) { + default: + this.screen = "player" + break; + case "miniplayer": + this.screen = "miniplayer" + break; + } + }, + connect() { + let self = this; + this.connectedState = 0; + if (this.url === "") { + this.url = prompt("Host IP", "localhost") + } + socket = new WebSocket(`ws://${this.url}:26369`); + socket.onopen = (e) => { + console.log(e); + console.log('connected'); + app.connectedState = 1; + if(getParameterByName("mode")) { + self.setMode(getParameterByName("mode")) + }else{ + self.setMode("default") + } + self.clearSelectedTrack() + } + + socket.onclose = (e) => { + console.log(e); + console.log('disconnected'); + app.connectedState = 2; + } + + socket.onerror = (e) => { + console.log(e); + console.log('error'); + app.connectedState = 2; + } + + socket.onmessage = (e) => { + const response = JSON.parse(e.data); + switch (response.type) { + default: + console.log(response); + break; + case "musickitapi.search": + self.showArtist(response.data["artists"][0]["id"]); + break; + case "musickitapi.album": + if(self.screen == "album-page") { + self.albumPage.data = response.data + } + break; + case "musickitapi.artist": + if(self.screen == "artist-page") { + self.artistPage.data = response.data + } + break; + case "queue": + self.player.queue = response.data; + self.queue.temp = response.data["_queueItems"]; + self.$forceUpdate() + break; + case "lyrics": + self.player.lyrics = response.data; + self.$forceUpdate() + break; + case "searchResultsLibrary": + self.search.results = response.data; + self.search.state = 2; + break; + case "searchResults": + self.search.results = response.data; + self.search.state = 2; + break; + case "playbackStateUpdate": + if (!self.player.userInteraction) { + self.updatePlaybackState(response.data) + } + break; + } + // console.log(e.data); + } + }, + updatePlaybackState(mediaitem) { + var lyricsDisplayed = this.screen == "lyrics" || this.player.lowerPanelState == "lyrics" + if (this.player.currentMediaItem["isrc"] != mediaitem["isrc"]) { + if (lyricsDisplayed) { + this.getLyrics() + } + if (this.screen == "queue") { + this.getQueue() + } + } + this.player.currentMediaItem = mediaitem + } + }, +}); + +function getParameterByName(name, url) { + if (!url) url = window.location.href; + name = name.replace(/[\[\]]/g, '\\$&'); + var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'), + results = regex.exec(url); + if (!results) return null; + if (!results[2]) return ''; + return decodeURIComponent(results[2].replace(/\+/g, ' ')); +} + +function xmlToJson(xml) { + + // Create the return object + var obj = {}; + + if (xml.nodeType == 1) { // element + // do attributes + if (xml.attributes.length > 0) { + obj["@attributes"] = {}; + for (var j = 0; j < xml.attributes.length; j++) { + var attribute = xml.attributes.item(j); + obj["@attributes"][attribute.nodeName] = attribute.nodeValue; + } + } + } else if (xml.nodeType == 3) { // text + obj = xml.nodeValue; + } + + // do children + if (xml.hasChildNodes()) { + for (var i = 0; i < xml.childNodes.length; i++) { + var item = xml.childNodes.item(i); + var nodeName = item.nodeName; + if (typeof (obj[nodeName]) == "undefined") { + obj[nodeName] = xmlToJson(item); + } else { + if (typeof (obj[nodeName].push) == "undefined") { + var old = obj[nodeName]; + obj[nodeName] = []; + obj[nodeName].push(old); + } + obj[nodeName].push(xmlToJson(item)); + } + } + } + return obj; +}; + +window.onresize = function () { + app.resetPlayerUI() +} + +app.connect() \ No newline at end of file diff --git a/src/web-remote/manifest.json b/src/web-remote/manifest.json new file mode 100644 index 00000000..3e68fce5 --- /dev/null +++ b/src/web-remote/manifest.json @@ -0,0 +1,32 @@ +{ + "theme_color": "#000000", + "background_color": "#000000", + "display": "standalone", + "scope": "/", + "start_url": "/", + "name": "AME Remote", + "short_name": "AME Remote", + "description": "Apple Music Electron Remote", + "icons": [ + { + "src": "/icon-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/icon-256x256.png", + "sizes": "256x256", + "type": "image/png" + }, + { + "src": "/icon-384x384.png", + "sizes": "384x384", + "type": "image/png" + }, + { + "src": "/icon-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} \ No newline at end of file diff --git a/src/web-remote/sortable.min.js b/src/web-remote/sortable.min.js new file mode 100644 index 00000000..7ba6b590 --- /dev/null +++ b/src/web-remote/sortable.min.js @@ -0,0 +1,2 @@ +/*! Sortable 1.14.0 - MIT | git://github.com/SortableJS/Sortable.git */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Sortable=e()}(this,function(){"use strict";function e(e,t){var n,o=Object.keys(e);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(e),t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),o.push.apply(o,n)),o}function A(o){for(var t=1;tt.length)&&(e=t.length);for(var n=0,o=new Array(e);n"===e[0]&&(e=e.substring(1)),t))try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch(t){return}}function N(t,e,n,o){if(t){n=n||document;do{if(null!=e&&(">"!==e[0]||t.parentNode===n)&&p(t,e)||o&&t===n)return t}while(t!==n&&(t=(i=t).host&&i!==document&&i.host.nodeType?i.host:i.parentNode))}var i;return null}var g,m=/\s+/g;function I(t,e,n){var o;t&&e&&(t.classList?t.classList[n?"add":"remove"](e):(o=(" "+t.className+" ").replace(m," ").replace(" "+e+" "," "),t.className=(o+(n?" "+e:"")).replace(m," ")))}function P(t,e,n){var o=t&&t.style;if(o){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(t,""):t.currentStyle&&(n=t.currentStyle),void 0===e?n:n[e];o[e=!(e in o||-1!==e.indexOf("webkit"))?"-webkit-"+e:e]=n+("string"==typeof n?"":"px")}}function v(t,e){var n="";if("string"==typeof t)n=t;else do{var o=P(t,"transform")}while(o&&"none"!==o&&(n=o+" "+n),!e&&(t=t.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function b(t,e,n){if(t){var o=t.getElementsByTagName(e),i=0,r=o.length;if(n)for(;i=n.left-e&&i<=n.right+e,e=r>=n.top-e&&r<=n.bottom+e;return o&&e?a=t:void 0}}),a);if(e){var n,o={};for(n in t)t.hasOwnProperty(n)&&(o[n]=t[n]);o.target=o.rootEl=e,o.preventDefault=void 0,o.stopPropagation=void 0,e[j]._onDragOver(o)}}var i,r,a}function Yt(t){q&&q.parentNode[j]._isOutsideThisEl(t.target)}function Bt(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(t));this.el=t,this.options=e=a({},e),t[j]=this;var n,o,i={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(t.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return It(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==Bt.supportPointer&&"PointerEvent"in window&&!u,emptyInsertThreshold:5};for(n in K.initializePlugins(this,t,i),i)n in e||(e[n]=i[n]);for(o in Pt(e),this)"_"===o.charAt(0)&&"function"==typeof this[o]&&(this[o]=this[o].bind(this));this.nativeDraggable=!e.forceFallback&&At,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?h(t,"pointerdown",this._onTapStart):(h(t,"mousedown",this._onTapStart),h(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(h(t,"dragover",this),h(t,"dragenter",this)),Et.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),a(this,x())}function Ft(t,e,n,o,i,r,a,l){var s,c,u=t[j],d=u.options.onMove;return!window.CustomEvent||y||w?(s=document.createEvent("Event")).initEvent("move",!0,!0):s=new CustomEvent("move",{bubbles:!0,cancelable:!0}),s.to=e,s.from=t,s.dragged=n,s.draggedRect=o,s.related=i||e,s.relatedRect=r||k(e),s.willInsertAfter=l,s.originalEvent=a,t.dispatchEvent(s),c=d?d.call(u,s,a):c}function jt(t){t.draggable=!1}function Ht(){Ct=!1}function Lt(t){return setTimeout(t,0)}function Kt(t){return clearTimeout(t)}Bt.prototype={constructor:Bt,_isOutsideThisEl:function(t){this.el.contains(t)||t===this.el||(gt=null)},_getDirection:function(t,e){return"function"==typeof this.options.direction?this.options.direction.call(this,t,e,q):this.options.direction},_onTapStart:function(e){if(e.cancelable){var n=this,o=this.el,t=this.options,i=t.preventOnFilter,r=e.type,a=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,l=(a||e).target,s=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||l,c=t.filter;if(!function(t){Tt.length=0;var e=t.getElementsByTagName("input"),n=e.length;for(;n--;){var o=e[n];o.checked&&Tt.push(o)}}(o),!q&&!(/mousedown|pointerdown/.test(r)&&0!==e.button||t.disabled)&&!s.isContentEditable&&(this.nativeDraggable||!u||!l||"SELECT"!==l.tagName.toUpperCase())&&!((l=N(l,t.draggable,o,!1))&&l.animated||J===l)){if(nt=B(l),it=B(l,t.draggable),"function"==typeof c){if(c.call(this,e,l,this))return U({sortable:n,rootEl:s,name:"filter",targetEl:l,toEl:o,fromEl:o}),z("filter",n,{evt:e}),void(i&&e.cancelable&&e.preventDefault())}else if(c=c&&c.split(",").some(function(t){if(t=N(s,t.trim(),o,!1))return U({sortable:n,rootEl:t,name:"filter",targetEl:l,fromEl:o,toEl:o}),z("filter",n,{evt:e}),!0}))return void(i&&e.cancelable&&e.preventDefault());t.handle&&!N(s,t.handle,o,!1)||this._prepareDragStart(e,a,l)}}},_prepareDragStart:function(t,e,n){var o,i=this,r=i.el,a=i.options,l=r.ownerDocument;n&&!q&&n.parentNode===r&&(o=k(n),$=r,V=(q=n).parentNode,Q=q.nextSibling,J=n,at=a.group,st={target:Bt.dragged=q,clientX:(e||t).clientX,clientY:(e||t).clientY},ht=st.clientX-o.left,ft=st.clientY-o.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,q.style["will-change"]="all",o=function(){z("delayEnded",i,{evt:t}),Bt.eventCanceled?i._onDrop():(i._disableDelayedDragEvents(),!s&&i.nativeDraggable&&(q.draggable=!0),i._triggerDragStart(t,e),U({sortable:i,name:"choose",originalEvent:t}),I(q,a.chosenClass,!0))},a.ignore.split(",").forEach(function(t){b(q,t.trim(),jt)}),h(l,"dragover",Xt),h(l,"mousemove",Xt),h(l,"touchmove",Xt),h(l,"mouseup",i._onDrop),h(l,"touchend",i._onDrop),h(l,"touchcancel",i._onDrop),s&&this.nativeDraggable&&(this.options.touchStartThreshold=4,q.draggable=!0),z("delayStart",this,{evt:t}),!a.delay||a.delayOnTouchOnly&&!e||this.nativeDraggable&&(w||y)?o():Bt.eventCanceled?this._onDrop():(h(l,"mouseup",i._disableDelayedDrag),h(l,"touchend",i._disableDelayedDrag),h(l,"touchcancel",i._disableDelayedDrag),h(l,"mousemove",i._delayedDragTouchMoveHandler),h(l,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&h(l,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(o,a.delay)))},_delayedDragTouchMoveHandler:function(t){t=t.touches?t.touches[0]:t;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){q&&jt(q),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;f(t,"mouseup",this._disableDelayedDrag),f(t,"touchend",this._disableDelayedDrag),f(t,"touchcancel",this._disableDelayedDrag),f(t,"mousemove",this._delayedDragTouchMoveHandler),f(t,"touchmove",this._delayedDragTouchMoveHandler),f(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||"touch"==t.pointerType&&t,!this.nativeDraggable||e?this.options.supportPointer?h(document,"pointermove",this._onTouchMove):h(document,e?"touchmove":"mousemove",this._onTouchMove):(h(q,"dragend",this),h($,"dragstart",this._onDragStart));try{document.selection?Lt(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(t,e){var n;yt=!1,$&&q?(z("dragStarted",this,{evt:e}),this.nativeDraggable&&h(document,"dragover",Yt),n=this.options,t||I(q,n.dragClass,!1),I(q,n.ghostClass,!0),Bt.active=this,t&&this._appendGhost(),U({sortable:this,name:"start",originalEvent:e})):this._nulling()},_emulateDragOver:function(){if(ct){this._lastX=ct.clientX,this._lastY=ct.clientY,kt();for(var t=document.elementFromPoint(ct.clientX,ct.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(ct.clientX,ct.clientY))!==e;)e=t;if(q.parentNode[j]._isOutsideThisEl(t),e)do{if(e[j])if(e[j]._onDragOver({clientX:ct.clientX,clientY:ct.clientY,target:t,rootEl:e})&&!this.options.dragoverBubble)break}while(e=(t=e).parentNode);Rt()}},_onTouchMove:function(t){if(st){var e=this.options,n=e.fallbackTolerance,o=e.fallbackOffset,i=t.touches?t.touches[0]:t,r=Z&&v(Z,!0),a=Z&&r&&r.a,l=Z&&r&&r.d,e=Ot&&bt&&E(bt),a=(i.clientX-st.clientX+o.x)/(a||1)+(e?e[0]-_t[0]:0)/(a||1),l=(i.clientY-st.clientY+o.y)/(l||1)+(e?e[1]-_t[1]:0)/(l||1);if(!Bt.active&&!yt){if(n&&Math.max(Math.abs(i.clientX-this._lastX),Math.abs(i.clientY-this._lastY))n.right+10||t.clientX<=n.right&&t.clientY>n.bottom&&t.clientX>=n.left:t.clientX>n.right&&t.clientY>n.top||t.clientX<=n.right&&t.clientY>n.bottom+10}(n,r,this)&&!g.animated){if(g===q)return O(!1);if((l=g&&a===n.target?g:l)&&(w=k(l)),!1!==Ft($,a,q,o,l,w,n,!!l))return x(),a.appendChild(q),V=a,M(),O(!0)}else if(g&&function(t,e,n){n=k(X(n.el,0,n.options,!0));return e?t.clientX.notes-preview { + height: 60px; + overflow: hidden; + -webkit-mask-image: -webkit-gradient(linear, left 95%, left bottom, from(rgba(0, 0, 0, 1)), to(rgba(0, 0, 0, 0))); +} + +.albumpage-album-notes>.notes-more { + position: absolute; + bottom: 0px; + right: 0px; + appearance: none; + background: transparent; + color: var(--keyColor); + font-weight: bold; + font-family: inherit; + text-transform: uppercase; + height: 100%; + width: 100%; + padding: 0px; + border: 0px; + display: flex; + justify-content: flex-end; + align-items: flex-end; +} + +.album-page-fullnotes-body { + padding: 22px; + font-size: 17px; + overflow-y: scroll; + overflow-y: overlay; +} + +.albumpage-album-name { + margin: 0 auto; + font-size: 17px; + width: 100%; + text-align: center; + font-weight: 600; +} + +.albumpage-artist-name { + margin: 0 auto; + width: 100%; + text-align: center; + font-size: 18px; + color: var(--keyColor); +} + +.albumpage-artist-name:hover { + text-decoration: underline; + cursor: pointer; +} + +.artist-header { + height: 400px; + width: 100%; + margin: 12px auto; + display: flex; + justify-content: center; + align-items: center; + padding: 12px; + flex-direction: column; + background: rgb(0 0 0 / 40%); +} + +.artist-header .artist-header-portrait { + height: 200px; + width: 200px; + background: var(--artwork); + background-size: contain; + background-repeat: no-repeat; + border-radius: 100%; + box-shadow: var(--mediaItemShadow); +} + +.search-body { + position: absolute; + width: 100%; + height: 100%; + padding-top: 220px; +} + +.artist-body { + position: absolute; + width: 100%; + height: 100%; +} + +.search-tab { + background: rgb(20 20 20 / 0.85); + border-radius: 50px; + color: white; + border: 0px; + box-shadow: unset; + font-family: inherit; + padding: 8px 16px; + font-size: 14px; + font-weight: 500; +} + +.search-tab.active { + background: var(--keyColor); +} + +.context-menu { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); + z-index: 100; +} + +.context-menu .context-menu-item { + --borderRadius: 10px; + appearance: none; + width: 100%; + display: block; + font-size: 1.10em; + padding: 18px 20px; + font-family: inherit; + border: 0px; + font-weight: 600; + border-radius: 0px; + border-bottom: 1px solid rgb(200 200 200 / 15%); + margin: 0px; + background: rgb(60 60 60 / 80%); + backdrop-filter: blur(16px) saturate(180%); + -webkit-backdrop-filter: blur(16px) saturate(180%); + color: #ccc; +} + +.context-menu .context-menu-item:hover { + cursor: pointer; +} + +.context-menu .context-menu-item:active { + filter: brightness(75%); +} + +.context-menu .context-menu-item:first-child { + border-radius: 0px; + border-top-left-radius: var(--borderRadius); + border-top-right-radius: var(--borderRadius); +} + +.context-menu .context-menu-item:last-child { + border-radius: 0px; + border-bottom-left-radius: var(--borderRadius); + border-bottom-right-radius: var(--borderRadius); + border-bottom: 0px; +} + +.context-menu .context-menu-item:only-child { + border-radius: var(--borderRadius); +} + +.context-menu .context-menu-item.context-menu-item--left { + text-align: left; +} + +.context-menu .context-menu-body { + display: flex; + align-items: flex-end; + justify-content: flex-end; + flex-direction: column; +} + +.lyric-body { + -webkit-mask-image: -webkit-gradient(linear, left 95%, left bottom, from(rgba(0, 0, 0, 1)), to(rgba(0, 0, 0, 0))); + overflow-y: scroll; + overflow-x: hidden; + display: flex; + flex-flow: column; +} + +.lyric-line { + --bgSpeed: 1s; + appearance: none; + color: white; + font-size: 2rem; + transform: scale(0.8); + transform-origin: left center; + transition: transform 0.2s var(--appleEase); + opacity: 0.75; + width: auto; + display: inline-block; + margin: 10px; + margin-left: 5%; + margin-right: 0px; +} + +.lyric-line:hover { + cursor: pointer; +} + +.lyric-line:hover::after { + content: ' '; + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + transform: scale(1.06); + background: rgba(200, 200, 200, 0.1); + pointer-events: none; + border-radius: 10px; + -webkit-backface-visibility: hidden; +} + +.lyric-line.active { + --bgSpeed: 1s; + opacity: 1; + transform: scale(1); + /*background: var(--keyColor);*/ + transition: transform 0.2s var(--appleEase); +} + +.lyric-line:not(.active) { + filter: blur(1px) +} + +.lyricWaiting { + margin-top: 8px; + display: none; +} + +.lyric-line.active .lyricWaiting { + display: inline-flex; + animation: lyricWaitingLine 6s cubic-bezier(0.42, 0, 0.58, 1) infinite; +} + +.lyric-line.active .lyricWaiting>div { + width: 10px; + height: 10px; + background: white; + border-radius: 50%; + margin: 3px; +} + +@keyframes lyricWaitingLine { + 0% { + opacity: 0; + transform: scale(0.85); + } + 50% { + opacity: 1; + transform: scale(1); + } + 100% { + opacity: 0; + transform: scale(0.85); + } +} + +.lyric-line2:before { + background: var(--keyColor); + content: ''; + width: 0%; + height: 6px; + position: absolute; + bottom: -8px; + left: 0; + border-radius: 10px; + z-index: -1; + transition: width var(--bgSpeed); +} + +.lyric-line2.active:before { + width: 100%; + transition: width var(--bgSpeed); +} + +.player_top { + height: 100%; +} + +.miniplayer-main { + width: 100%; + height: 100%; + position: relative; +} + +.miniplayer-main .miniplayer-controls { + position: absolute; + bottom: 0px; + left: 0px; + background: rgb(0 0 0 / 50%); + height: 80px; + z-index: 2; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + backdrop-filter: blur(16px) saturate(180%); +} + +.miniplayer-main .miniplayer-draggable { + position: absolute; + top: 0; + left: 0; + height: calc(100% - 80px); + width: 100%; +} + +.miniplayer-main .miniplayer-controls .md-btn { + width: 40px; + background-size: 16px; +} + +.media-artwork--miniplayer { + width: 100%; + height: 100%; + background: var(--artwork); + background-size: cover; + background-position: center; + background-repeat: no-repeat; +} + + +/* Small Screen */ + +@media only screen and (max-height: 668px) { + #app { + zoom: 0.8; + } +} + + +/* Big Screen */ + +@media only screen and (orientation: landscape) { + #app { + max-width: 100%; + } + .album-body-container { + display: flex; + flex-wrap: wrap; + } + .album-body-container>.md-header { + min-width: 300px; + flex: 0 0 auto; + /*! max-width: 300px; */ + margin: 0 auto; + } + .artist-body { + position: relative; + /*! flex: 0 0 auto; */ + } + .player-panel { + display: flex; + flex-direction: row; + } + .player_top { + width: 100%; + } + .player_bottom { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + width: 100%; + margin: 0 auto; + } + .media-artwork { + width: 45vw; + height: 45vw; + margin: 60px; + } + .player-song-title { + font-size: 2em; + } + .player-song-artist { + font-size: 1.25em; + } + .search-panel {} + .md-footer { + width: 100%; + } +} + + +/* Transitions */ + +.wpfade-enter-active, +.wpfade-leave-active { + transition: opacity .1s var(--appleEase); +} + +.wpfade-enter, +.wpfade-leave-to { + opacity: 0; +} \ No newline at end of file diff --git a/src/web-remote/vue.js b/src/web-remote/vue.js new file mode 100644 index 00000000..d998ff72 --- /dev/null +++ b/src/web-remote/vue.js @@ -0,0 +1,6 @@ +/*! + * Vue.js v2.6.14 + * (c) 2014-2021 Evan You + * Released under the MIT License. + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Vue=t()}(this,function(){"use strict";var e=Object.freeze({});function t(e){return null==e}function n(e){return null!=e}function r(e){return!0===e}function i(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function o(e){return null!==e&&"object"==typeof e}var a=Object.prototype.toString;function s(e){return"[object Object]"===a.call(e)}function c(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function u(e){return n(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function l(e){return null==e?"":Array.isArray(e)||s(e)&&e.toString===a?JSON.stringify(e,null,2):String(e)}function f(e){var t=parseFloat(e);return isNaN(t)?e:t}function p(e,t){for(var n=Object.create(null),r=e.split(","),i=0;i-1)return e.splice(n,1)}}var m=Object.prototype.hasOwnProperty;function y(e,t){return m.call(e,t)}function g(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var _=/-(\w)/g,b=g(function(e){return e.replace(_,function(e,t){return t?t.toUpperCase():""})}),$=g(function(e){return e.charAt(0).toUpperCase()+e.slice(1)}),w=/\B([A-Z])/g,C=g(function(e){return e.replace(w,"-$1").toLowerCase()});var x=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function k(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function A(e,t){for(var n in t)e[n]=t[n];return e}function O(e){for(var t={},n=0;n0,Z=J&&J.indexOf("edge/")>0,G=(J&&J.indexOf("android"),J&&/iphone|ipad|ipod|ios/.test(J)||"ios"===K),X=(J&&/chrome\/\d+/.test(J),J&&/phantomjs/.test(J),J&&J.match(/firefox\/(\d+)/)),Y={}.watch,Q=!1;if(V)try{var ee={};Object.defineProperty(ee,"passive",{get:function(){Q=!0}}),window.addEventListener("test-passive",null,ee)}catch(e){}var te=function(){return void 0===B&&(B=!V&&!z&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),B},ne=V&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function re(e){return"function"==typeof e&&/native code/.test(e.toString())}var ie,oe="undefined"!=typeof Symbol&&re(Symbol)&&"undefined"!=typeof Reflect&&re(Reflect.ownKeys);ie="undefined"!=typeof Set&&re(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var ae=S,se=0,ce=function(){this.id=se++,this.subs=[]};ce.prototype.addSub=function(e){this.subs.push(e)},ce.prototype.removeSub=function(e){h(this.subs,e)},ce.prototype.depend=function(){ce.target&&ce.target.addDep(this)},ce.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t-1)if(o&&!y(i,"default"))a=!1;else if(""===a||a===C(e)){var c=Re(String,i.type);(c<0||s0&&(ct((u=e(u,(a||"")+"_"+c))[0])&&ct(f)&&(s[l]=he(f.text+u[0].text),u.shift()),s.push.apply(s,u)):i(u)?ct(f)?s[l]=he(f.text+u):""!==u&&s.push(he(u)):ct(u)&&ct(f)?s[l]=he(f.text+u.text):(r(o._isVList)&&n(u.tag)&&t(u.key)&&n(a)&&(u.key="__vlist"+a+"_"+c+"__"),s.push(u)));return s}(e):void 0}function ct(e){return n(e)&&n(e.text)&&!1===e.isComment}function ut(e,t){if(e){for(var n=Object.create(null),r=oe?Reflect.ownKeys(e):Object.keys(e),i=0;i0,a=t?!!t.$stable:!o,s=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(a&&r&&r!==e&&s===r.$key&&!o&&!r.$hasNormal)return r;for(var c in i={},t)t[c]&&"$"!==c[0]&&(i[c]=vt(n,c,t[c]))}else i={};for(var u in n)u in i||(i[u]=ht(n,u));return t&&Object.isExtensible(t)&&(t._normalized=i),R(i,"$stable",a),R(i,"$key",s),R(i,"$hasNormal",o),i}function vt(e,t,n){var r=function(){var e=arguments.length?n.apply(null,arguments):n({}),t=(e=e&&"object"==typeof e&&!Array.isArray(e)?[e]:st(e))&&e[0];return e&&(!t||1===e.length&&t.isComment&&!pt(t))?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:r,enumerable:!0,configurable:!0}),r}function ht(e,t){return function(){return e[t]}}function mt(e,t){var r,i,a,s,c;if(Array.isArray(e)||"string"==typeof e)for(r=new Array(e.length),i=0,a=e.length;idocument.createEvent("Event").timeStamp&&(cn=function(){return un.now()})}function ln(){var e,t;for(sn=cn(),on=!0,en.sort(function(e,t){return e.id-t.id}),an=0;anan&&en[n].id>e.id;)n--;en.splice(n+1,0,e)}else en.push(e);rn||(rn=!0,Qe(ln))}}(this)},pn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||o(e)||this.deep){var t=this.value;if(this.value=e,this.user){var n='callback for watcher "'+this.expression+'"';Be(this.cb,this.vm,[e,t],this.vm,n)}else this.cb.call(this.vm,e,t)}}},pn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},pn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},pn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||h(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var dn={enumerable:!0,configurable:!0,get:S,set:S};function vn(e,t,n){dn.get=function(){return this[t][n]},dn.set=function(e){this[t][n]=e},Object.defineProperty(e,n,dn)}function hn(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},r=e._props={},i=e.$options._propKeys=[];e.$parent&&$e(!1);var o=function(o){i.push(o);var a=Ie(o,t,n,e);xe(r,o,a),o in e||vn(e,"_props",o)};for(var a in t)o(a);$e(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]="function"!=typeof t[n]?S:x(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;s(t=e._data="function"==typeof t?function(e,t){le();try{return e.call(t,t)}catch(e){return He(e,t,"data()"),{}}finally{fe()}}(t,e):t||{})||(t={});var n=Object.keys(t),r=e.$options.props,i=(e.$options.methods,n.length);for(;i--;){var o=n[i];r&&y(r,o)||(a=void 0,36!==(a=(o+"").charCodeAt(0))&&95!==a&&vn(e,"_data",o))}var a;Ce(t,!0)}(e):Ce(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=te();for(var i in t){var o=t[i],a="function"==typeof o?o:o.get;r||(n[i]=new pn(e,a||S,S,mn)),i in e||yn(e,i,o)}}(e,t.computed),t.watch&&t.watch!==Y&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var i=0;i-1:"string"==typeof e?e.split(",").indexOf(t)>-1:(n=e,"[object RegExp]"===a.call(n)&&e.test(t));var n}function On(e,t){var n=e.cache,r=e.keys,i=e._vnode;for(var o in n){var a=n[o];if(a){var s=a.name;s&&!t(s)&&Sn(n,o,r,i)}}}function Sn(e,t,n,r){var i=e[t];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),e[t]=null,h(n,t)}!function(t){t.prototype._init=function(t){var n=this;n._uid=$n++,n._isVue=!0,t&&t._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r;var i=r.componentOptions;n.propsData=i.propsData,n._parentListeners=i.listeners,n._renderChildren=i.children,n._componentTag=i.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(n,t):n.$options=De(wn(n.constructor),t||{},n),n._renderProxy=n,n._self=n,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(n),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&Wt(e,t)}(n),function(t){t._vnode=null,t._staticTrees=null;var n=t.$options,r=t.$vnode=n._parentVnode,i=r&&r.context;t.$slots=lt(n._renderChildren,i),t.$scopedSlots=e,t._c=function(e,n,r,i){return Ht(t,e,n,r,i,!1)},t.$createElement=function(e,n,r,i){return Ht(t,e,n,r,i,!0)};var o=r&&r.data;xe(t,"$attrs",o&&o.attrs||e,null,!0),xe(t,"$listeners",n._parentListeners||e,null,!0)}(n),Qt(n,"beforeCreate"),function(e){var t=ut(e.$options.inject,e);t&&($e(!1),Object.keys(t).forEach(function(n){xe(e,n,t[n])}),$e(!0))}(n),hn(n),function(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}(n),Qt(n,"created"),n.$options.el&&n.$mount(n.$options.el)}}(Cn),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=ke,e.prototype.$delete=Ae,e.prototype.$watch=function(e,t,n){if(s(t))return bn(this,e,t,n);(n=n||{}).user=!0;var r=new pn(this,e,t,n);if(n.immediate){var i='callback for immediate watcher "'+r.expression+'"';le(),Be(t,this,[r.value],this,i),fe()}return function(){r.teardown()}}}(Cn),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var r=this;if(Array.isArray(e))for(var i=0,o=e.length;i1?k(t):t;for(var n=k(arguments,1),r='event handler for "'+e+'"',i=0,o=t.length;iparseInt(this.max)&&Sn(e,t[0],t,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)Sn(this.cache,e,this.keys)},mounted:function(){var e=this;this.cacheVNode(),this.$watch("include",function(t){On(e,function(e){return An(t,e)})}),this.$watch("exclude",function(t){On(e,function(e){return!An(t,e)})})},updated:function(){this.cacheVNode()},render:function(){var e=this.$slots.default,t=zt(e),n=t&&t.componentOptions;if(n){var r=kn(n),i=this.include,o=this.exclude;if(i&&(!r||!An(i,r))||o&&r&&An(o,r))return t;var a=this.cache,s=this.keys,c=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;a[c]?(t.componentInstance=a[c].componentInstance,h(s,c),s.push(c)):(this.vnodeToCache=t,this.keyToCache=c),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return F}};Object.defineProperty(e,"config",t),e.util={warn:ae,extend:A,mergeOptions:De,defineReactive:xe},e.set=ke,e.delete=Ae,e.nextTick=Qe,e.observable=function(e){return Ce(e),e},e.options=Object.create(null),I.forEach(function(t){e.options[t+"s"]=Object.create(null)}),e.options._base=e,A(e.options.components,Nn),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=k(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=De(this.options,e),this}}(e),xn(e),function(e){I.forEach(function(t){e[t]=function(e,n){return n?("component"===t&&s(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}})}(e)}(Cn),Object.defineProperty(Cn.prototype,"$isServer",{get:te}),Object.defineProperty(Cn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Cn,"FunctionalRenderContext",{value:Et}),Cn.version="2.6.14";var En=p("style,class"),jn=p("input,textarea,option,select,progress"),Dn=function(e,t,n){return"value"===n&&jn(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},Ln=p("contenteditable,draggable,spellcheck"),In=p("events,caret,typing,plaintext-only"),Mn=function(e,t){return Bn(t)||"false"===t?"false":"contenteditable"===e&&In(t)?t:"true"},Fn=p("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),Pn="http://www.w3.org/1999/xlink",Rn=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Hn=function(e){return Rn(e)?e.slice(6,e.length):""},Bn=function(e){return null==e||!1===e};function Un(e){for(var t=e.data,r=e,i=e;n(i.componentInstance);)(i=i.componentInstance._vnode)&&i.data&&(t=Vn(i.data,t));for(;n(r=r.parent);)r&&r.data&&(t=Vn(t,r.data));return function(e,t){if(n(e)||n(t))return zn(e,Kn(t));return""}(t.staticClass,t.class)}function Vn(e,t){return{staticClass:zn(e.staticClass,t.staticClass),class:n(e.class)?[e.class,t.class]:t.class}}function zn(e,t){return e?t?e+" "+t:e:t||""}function Kn(e){return Array.isArray(e)?function(e){for(var t,r="",i=0,o=e.length;i-1?mr(e,t,n):Fn(t)?Bn(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Ln(t)?e.setAttribute(t,Mn(t,n)):Rn(t)?Bn(n)?e.removeAttributeNS(Pn,Hn(t)):e.setAttributeNS(Pn,t,n):mr(e,t,n)}function mr(e,t,n){if(Bn(n))e.removeAttribute(t);else{if(q&&!W&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var r=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",r)};e.addEventListener("input",r),e.__ieph=!0}e.setAttribute(t,n)}}var yr={create:vr,update:vr};function gr(e,r){var i=r.elm,o=r.data,a=e.data;if(!(t(o.staticClass)&&t(o.class)&&(t(a)||t(a.staticClass)&&t(a.class)))){var s=Un(r),c=i._transitionClasses;n(c)&&(s=zn(s,Kn(c))),s!==i._prevClass&&(i.setAttribute("class",s),i._prevClass=s)}}var _r,br,$r,wr,Cr,xr,kr={create:gr,update:gr},Ar=/[\w).+\-_$\]]/;function Or(e){var t,n,r,i,o,a=!1,s=!1,c=!1,u=!1,l=0,f=0,p=0,d=0;for(r=0;r=0&&" "===(h=e.charAt(v));v--);h&&Ar.test(h)||(u=!0)}}else void 0===i?(d=r+1,i=e.slice(0,r).trim()):m();function m(){(o||(o=[])).push(e.slice(d,r).trim()),d=r+1}if(void 0===i?i=e.slice(0,r).trim():0!==d&&m(),o)for(r=0;r-1?{exp:e.slice(0,wr),key:'"'+e.slice(wr+1)+'"'}:{exp:e,key:null};br=e,wr=Cr=xr=0;for(;!zr();)Kr($r=Vr())?qr($r):91===$r&&Jr($r);return{exp:e.slice(0,Cr),key:e.slice(Cr+1,xr)}}(e);return null===n.key?e+"="+t:"$set("+n.exp+", "+n.key+", "+t+")"}function Vr(){return br.charCodeAt(++wr)}function zr(){return wr>=_r}function Kr(e){return 34===e||39===e}function Jr(e){var t=1;for(Cr=wr;!zr();)if(Kr(e=Vr()))qr(e);else if(91===e&&t++,93===e&&t--,0===t){xr=wr;break}}function qr(e){for(var t=e;!zr()&&(e=Vr())!==t;);}var Wr,Zr="__r",Gr="__c";function Xr(e,t,n){var r=Wr;return function i(){null!==t.apply(null,arguments)&&ei(e,i,n,r)}}var Yr=Ke&&!(X&&Number(X[1])<=53);function Qr(e,t,n,r){if(Yr){var i=sn,o=t;t=o._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=i||e.timeStamp<=0||e.target.ownerDocument!==document)return o.apply(this,arguments)}}Wr.addEventListener(e,t,Q?{capture:n,passive:r}:n)}function ei(e,t,n,r){(r||Wr).removeEventListener(e,t._wrapper||t,n)}function ti(e,r){if(!t(e.data.on)||!t(r.data.on)){var i=r.data.on||{},o=e.data.on||{};Wr=r.elm,function(e){if(n(e[Zr])){var t=q?"change":"input";e[t]=[].concat(e[Zr],e[t]||[]),delete e[Zr]}n(e[Gr])&&(e.change=[].concat(e[Gr],e.change||[]),delete e[Gr])}(i),it(i,o,Qr,ei,Xr,r.context),Wr=void 0}}var ni,ri={create:ti,update:ti};function ii(e,r){if(!t(e.data.domProps)||!t(r.data.domProps)){var i,o,a=r.elm,s=e.data.domProps||{},c=r.data.domProps||{};for(i in n(c.__ob__)&&(c=r.data.domProps=A({},c)),s)i in c||(a[i]="");for(i in c){if(o=c[i],"textContent"===i||"innerHTML"===i){if(r.children&&(r.children.length=0),o===s[i])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===i&&"PROGRESS"!==a.tagName){a._value=o;var u=t(o)?"":String(o);oi(a,u)&&(a.value=u)}else if("innerHTML"===i&&Wn(a.tagName)&&t(a.innerHTML)){(ni=ni||document.createElement("div")).innerHTML=""+o+"";for(var l=ni.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;l.firstChild;)a.appendChild(l.firstChild)}else if(o!==s[i])try{a[i]=o}catch(e){}}}}function oi(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var r=e.value,i=e._vModifiers;if(n(i)){if(i.number)return f(r)!==f(t);if(i.trim)return r.trim()!==t.trim()}return r!==t}(e,t))}var ai={create:ii,update:ii},si=g(function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach(function(e){if(e){var r=e.split(n);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t});function ci(e){var t=ui(e.style);return e.staticStyle?A(e.staticStyle,t):t}function ui(e){return Array.isArray(e)?O(e):"string"==typeof e?si(e):e}var li,fi=/^--/,pi=/\s*!important$/,di=function(e,t,n){if(fi.test(t))e.style.setProperty(t,n);else if(pi.test(n))e.style.setProperty(C(t),n.replace(pi,""),"important");else{var r=hi(t);if(Array.isArray(n))for(var i=0,o=n.length;i-1?t.split(gi).forEach(function(t){return e.classList.add(t)}):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function bi(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(gi).forEach(function(t){return e.classList.remove(t)}):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" "+(e.getAttribute("class")||"")+" ",r=" "+t+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function $i(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&A(t,wi(e.name||"v")),A(t,e),t}return"string"==typeof e?wi(e):void 0}}var wi=g(function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}}),Ci=V&&!W,xi="transition",ki="animation",Ai="transition",Oi="transitionend",Si="animation",Ti="animationend";Ci&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Ai="WebkitTransition",Oi="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Si="WebkitAnimation",Ti="webkitAnimationEnd"));var Ni=V?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Ei(e){Ni(function(){Ni(e)})}function ji(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),_i(e,t))}function Di(e,t){e._transitionClasses&&h(e._transitionClasses,t),bi(e,t)}function Li(e,t,n){var r=Mi(e,t),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===xi?Oi:Ti,c=0,u=function(){e.removeEventListener(s,l),n()},l=function(t){t.target===e&&++c>=a&&u()};setTimeout(function(){c0&&(n=xi,l=a,f=o.length):t===ki?u>0&&(n=ki,l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?xi:ki:null)?n===xi?o.length:c.length:0,{type:n,timeout:l,propCount:f,hasTransform:n===xi&&Ii.test(r[Ai+"Property"])}}function Fi(e,t){for(;e.length1}function Vi(e,t){!0!==t.data.show&&Ri(t)}var zi=function(e){var o,a,s={},c=e.modules,u=e.nodeOps;for(o=0;ov?_(e,t(i[y+1])?null:i[y+1].elm,i,d,y,o):d>y&&$(r,p,v)}(p,h,y,o,l):n(y)?(n(e.text)&&u.setTextContent(p,""),_(p,null,y,0,y.length-1,o)):n(h)?$(h,0,h.length-1):n(e.text)&&u.setTextContent(p,""):e.text!==i.text&&u.setTextContent(p,i.text),n(v)&&n(d=v.hook)&&n(d=d.postpatch)&&d(e,i)}}}function k(e,t,i){if(r(i)&&n(e.parent))e.parent.data.pendingInsert=t;else for(var o=0;o-1,a.selected!==o&&(a.selected=o);else if(E(Zi(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));i||(e.selectedIndex=-1)}}function Wi(e,t){return t.every(function(t){return!E(t,e)})}function Zi(e){return"_value"in e?e._value:e.value}function Gi(e){e.target.composing=!0}function Xi(e){e.target.composing&&(e.target.composing=!1,Yi(e.target,"input"))}function Yi(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function Qi(e){return!e.componentInstance||e.data&&e.data.transition?e:Qi(e.componentInstance._vnode)}var eo={model:Ki,show:{bind:function(e,t,n){var r=t.value,i=(n=Qi(n)).data&&n.data.transition,o=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;r&&i?(n.data.show=!0,Ri(n,function(){e.style.display=o})):e.style.display=r?o:"none"},update:function(e,t,n){var r=t.value;!r!=!t.oldValue&&((n=Qi(n)).data&&n.data.transition?(n.data.show=!0,r?Ri(n,function(){e.style.display=e.__vOriginalDisplay}):Hi(n,function(){e.style.display="none"})):e.style.display=r?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,r,i){i||(e.style.display=e.__vOriginalDisplay)}}},to={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function no(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?no(zt(t.children)):e}function ro(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var i=n._parentListeners;for(var o in i)t[b(o)]=i[o];return t}function io(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var oo=function(e){return e.tag||pt(e)},ao=function(e){return"show"===e.name},so={name:"transition",props:to,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(oo)).length){var r=this.mode,o=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return o;var a=no(o);if(!a)return o;if(this._leaving)return io(e,o);var s="__transition-"+this._uid+"-";a.key=null==a.key?a.isComment?s+"comment":s+a.tag:i(a.key)?0===String(a.key).indexOf(s)?a.key:s+a.key:a.key;var c=(a.data||(a.data={})).transition=ro(this),u=this._vnode,l=no(u);if(a.data.directives&&a.data.directives.some(ao)&&(a.data.show=!0),l&&l.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(a,l)&&!pt(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=A({},c);if("out-in"===r)return this._leaving=!0,ot(f,"afterLeave",function(){t._leaving=!1,t.$forceUpdate()}),io(e,o);if("in-out"===r){if(pt(a))return u;var p,d=function(){p()};ot(c,"afterEnter",d),ot(c,"enterCancelled",d),ot(f,"delayLeave",function(e){p=e})}}return o}}},co=A({tag:String,moveClass:String},to);function uo(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function lo(e){e.data.newPos=e.elm.getBoundingClientRect()}function fo(e){var t=e.data.pos,n=e.data.newPos,r=t.left-n.left,i=t.top-n.top;if(r||i){e.data.moved=!0;var o=e.elm.style;o.transform=o.WebkitTransform="translate("+r+"px,"+i+"px)",o.transitionDuration="0s"}}delete co.mode;var po={Transition:so,TransitionGroup:{props:co,beforeMount:function(){var e=this,t=this._update;this._update=function(n,r){var i=Gt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,i(),t.call(e,n,r)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,i=this.$slots.default||[],o=this.children=[],a=ro(this),s=0;s-1?Xn[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Xn[e]=/HTMLUnknownElement/.test(t.toString())},A(Cn.options.directives,eo),A(Cn.options.components,po),Cn.prototype.__patch__=V?zi:S,Cn.prototype.$mount=function(e,t){return function(e,t,n){var r;return e.$el=t,e.$options.render||(e.$options.render=ve),Qt(e,"beforeMount"),r=function(){e._update(e._render(),n)},new pn(e,r,S,{before:function(){e._isMounted&&!e._isDestroyed&&Qt(e,"beforeUpdate")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,Qt(e,"mounted")),e}(this,e=e&&V?Qn(e):void 0,t)},V&&setTimeout(function(){F.devtools&&ne&&ne.emit("init",Cn)},0);var vo=/\{\{((?:.|\r?\n)+?)\}\}/g,ho=/[-.*+?^${}()|[\]\/\\]/g,mo=g(function(e){var t=e[0].replace(ho,"\\$&"),n=e[1].replace(ho,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")});var yo={staticKeys:["staticClass"],transformNode:function(e,t){t.warn;var n=Pr(e,"class");n&&(e.staticClass=JSON.stringify(n));var r=Fr(e,"class",!1);r&&(e.classBinding=r)},genData:function(e){var t="";return e.staticClass&&(t+="staticClass:"+e.staticClass+","),e.classBinding&&(t+="class:"+e.classBinding+","),t}};var go,_o={staticKeys:["staticStyle"],transformNode:function(e,t){t.warn;var n=Pr(e,"style");n&&(e.staticStyle=JSON.stringify(si(n)));var r=Fr(e,"style",!1);r&&(e.styleBinding=r)},genData:function(e){var t="";return e.staticStyle&&(t+="staticStyle:"+e.staticStyle+","),e.styleBinding&&(t+="style:("+e.styleBinding+"),"),t}},bo=function(e){return(go=go||document.createElement("div")).innerHTML=e,go.textContent},$o=p("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),wo=p("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),Co=p("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),xo=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,ko=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+?\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,Ao="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+P.source+"]*",Oo="((?:"+Ao+"\\:)?"+Ao+")",So=new RegExp("^<"+Oo),To=/^\s*(\/?)>/,No=new RegExp("^<\\/"+Oo+"[^>]*>"),Eo=/^]+>/i,jo=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},Fo=/&(?:lt|gt|quot|amp|#39);/g,Po=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,Ro=p("pre,textarea",!0),Ho=function(e,t){return e&&Ro(e)&&"\n"===t[0]};function Bo(e,t){var n=t?Po:Fo;return e.replace(n,function(e){return Mo[e]})}var Uo,Vo,zo,Ko,Jo,qo,Wo,Zo,Go=/^@|^v-on:/,Xo=/^v-|^@|^:|^#/,Yo=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,Qo=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,ea=/^\(|\)$/g,ta=/^\[.*\]$/,na=/:(.*)$/,ra=/^:|^\.|^v-bind:/,ia=/\.[^.\]]+(?=[^\]]*$)/g,oa=/^v-slot(:|$)|^#/,aa=/[\r\n]/,sa=/[ \f\t\r\n]+/g,ca=g(bo),ua="_empty_";function la(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:ya(t),rawAttrsMap:{},parent:n,children:[]}}function fa(e,t){Uo=t.warn||Tr,qo=t.isPreTag||T,Wo=t.mustUseProp||T,Zo=t.getTagNamespace||T;t.isReservedTag;zo=Nr(t.modules,"transformNode"),Ko=Nr(t.modules,"preTransformNode"),Jo=Nr(t.modules,"postTransformNode"),Vo=t.delimiters;var n,r,i=[],o=!1!==t.preserveWhitespace,a=t.whitespace,s=!1,c=!1;function u(e){if(l(e),s||e.processed||(e=pa(e,t)),i.length||e===n||n.if&&(e.elseif||e.else)&&va(n,{exp:e.elseif,block:e}),r&&!e.forbidden)if(e.elseif||e.else)a=e,(u=function(e){var t=e.length;for(;t--;){if(1===e[t].type)return e[t];e.pop()}}(r.children))&&u.if&&va(u,{exp:a.elseif,block:a});else{if(e.slotScope){var o=e.slotTarget||'"default"';(r.scopedSlots||(r.scopedSlots={}))[o]=e}r.children.push(e),e.parent=r}var a,u;e.children=e.children.filter(function(e){return!e.slotScope}),l(e),e.pre&&(s=!1),qo(e.tag)&&(c=!1);for(var f=0;f]*>)","i")),p=e.replace(f,function(e,n,r){return u=r.length,Lo(l)||"noscript"===l||(n=n.replace(//g,"$1").replace(//g,"$1")),Ho(l,n)&&(n=n.slice(1)),t.chars&&t.chars(n),""});c+=e.length-p.length,e=p,A(l,c-u,c)}else{var d=e.indexOf("<");if(0===d){if(jo.test(e)){var v=e.indexOf("--\x3e");if(v>=0){t.shouldKeepComment&&t.comment(e.substring(4,v),c,c+v+3),C(v+3);continue}}if(Do.test(e)){var h=e.indexOf("]>");if(h>=0){C(h+2);continue}}var m=e.match(Eo);if(m){C(m[0].length);continue}var y=e.match(No);if(y){var g=c;C(y[0].length),A(y[1],g,c);continue}var _=x();if(_){k(_),Ho(_.tagName,e)&&C(1);continue}}var b=void 0,$=void 0,w=void 0;if(d>=0){for($=e.slice(d);!(No.test($)||So.test($)||jo.test($)||Do.test($)||(w=$.indexOf("<",1))<0);)d+=w,$=e.slice(d);b=e.substring(0,d)}d<0&&(b=e),b&&C(b.length),t.chars&&b&&t.chars(b,c-b.length,c)}if(e===n){t.chars&&t.chars(e);break}}function C(t){c+=t,e=e.substring(t)}function x(){var t=e.match(So);if(t){var n,r,i={tagName:t[1],attrs:[],start:c};for(C(t[0].length);!(n=e.match(To))&&(r=e.match(ko)||e.match(xo));)r.start=c,C(r[0].length),r.end=c,i.attrs.push(r);if(n)return i.unarySlash=n[1],C(n[0].length),i.end=c,i}}function k(e){var n=e.tagName,c=e.unarySlash;o&&("p"===r&&Co(n)&&A(r),s(n)&&r===n&&A(n));for(var u=a(n)||!!c,l=e.attrs.length,f=new Array(l),p=0;p=0&&i[a].lowerCasedTag!==s;a--);else a=0;if(a>=0){for(var u=i.length-1;u>=a;u--)t.end&&t.end(i[u].tag,n,o);i.length=a,r=a&&i[a-1].tag}else"br"===s?t.start&&t.start(e,[],!0,n,o):"p"===s&&(t.start&&t.start(e,[],!1,n,o),t.end&&t.end(e,n,o))}A()}(e,{warn:Uo,expectHTML:t.expectHTML,isUnaryTag:t.isUnaryTag,canBeLeftOpenTag:t.canBeLeftOpenTag,shouldDecodeNewlines:t.shouldDecodeNewlines,shouldDecodeNewlinesForHref:t.shouldDecodeNewlinesForHref,shouldKeepComment:t.comments,outputSourceRange:t.outputSourceRange,start:function(e,o,a,l,f){var p=r&&r.ns||Zo(e);q&&"svg"===p&&(o=function(e){for(var t=[],n=0;nc&&(s.push(o=e.slice(c,i)),a.push(JSON.stringify(o)));var u=Or(r[1].trim());a.push("_s("+u+")"),s.push({"@binding":u}),c=i+r[0].length}return c-1"+("true"===o?":("+t+")":":_q("+t+","+o+")")),Mr(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+o+"):("+a+");if(Array.isArray($$a)){var $$v="+(r?"_n("+i+")":i)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+Ur(t,"$$a.concat([$$v])")+")}else{$$i>-1&&("+Ur(t,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+Ur(t,"$$c")+"}",null,!0)}(e,r,i);else if("input"===o&&"radio"===a)!function(e,t,n){var r=n&&n.number,i=Fr(e,"value")||"null";Er(e,"checked","_q("+t+","+(i=r?"_n("+i+")":i)+")"),Mr(e,"change",Ur(t,i),null,!0)}(e,r,i);else if("input"===o||"textarea"===o)!function(e,t,n){var r=e.attrsMap.type,i=n||{},o=i.lazy,a=i.number,s=i.trim,c=!o&&"range"!==r,u=o?"change":"range"===r?Zr:"input",l="$event.target.value";s&&(l="$event.target.value.trim()"),a&&(l="_n("+l+")");var f=Ur(t,l);c&&(f="if($event.target.composing)return;"+f),Er(e,"value","("+t+")"),Mr(e,u,f,null,!0),(s||a)&&Mr(e,"blur","$forceUpdate()")}(e,r,i);else if(!F.isReservedTag(o))return Br(e,r,i),!1;return!0},text:function(e,t){t.value&&Er(e,"textContent","_s("+t.value+")",t)},html:function(e,t){t.value&&Er(e,"innerHTML","_s("+t.value+")",t)}},isPreTag:function(e){return"pre"===e},isUnaryTag:$o,mustUseProp:Dn,canBeLeftOpenTag:wo,isReservedTag:Zn,getTagNamespace:Gn,staticKeys:function(e){return e.reduce(function(e,t){return e.concat(t.staticKeys||[])},[]).join(",")}($a)},ka=g(function(e){return p("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(e?","+e:""))});function Aa(e,t){e&&(wa=ka(t.staticKeys||""),Ca=t.isReservedTag||T,function e(t){t.static=function(e){if(2===e.type)return!1;if(3===e.type)return!0;return!(!e.pre&&(e.hasBindings||e.if||e.for||d(e.tag)||!Ca(e.tag)||function(e){for(;e.parent;){if("template"!==(e=e.parent).tag)return!1;if(e.for)return!0}return!1}(e)||!Object.keys(e).every(wa)))}(t);if(1===t.type){if(!Ca(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var n=0,r=t.children.length;n|^function(?:\s+[\w$]+)?\s*\(/,Sa=/\([^)]*?\);*$/,Ta=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,Na={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Ea={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},ja=function(e){return"if("+e+")return null;"},Da={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:ja("$event.target !== $event.currentTarget"),ctrl:ja("!$event.ctrlKey"),shift:ja("!$event.shiftKey"),alt:ja("!$event.altKey"),meta:ja("!$event.metaKey"),left:ja("'button' in $event && $event.button !== 0"),middle:ja("'button' in $event && $event.button !== 1"),right:ja("'button' in $event && $event.button !== 2")};function La(e,t){var n=t?"nativeOn:":"on:",r="",i="";for(var o in e){var a=Ia(e[o]);e[o]&&e[o].dynamic?i+=o+","+a+",":r+='"'+o+'":'+a+","}return r="{"+r.slice(0,-1)+"}",i?n+"_d("+r+",["+i.slice(0,-1)+"])":n+r}function Ia(e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map(function(e){return Ia(e)}).join(",")+"]";var t=Ta.test(e.value),n=Oa.test(e.value),r=Ta.test(e.value.replace(Sa,""));if(e.modifiers){var i="",o="",a=[];for(var s in e.modifiers)if(Da[s])o+=Da[s],Na[s]&&a.push(s);else if("exact"===s){var c=e.modifiers;o+=ja(["ctrl","shift","alt","meta"].filter(function(e){return!c[e]}).map(function(e){return"$event."+e+"Key"}).join("||"))}else a.push(s);return a.length&&(i+=function(e){return"if(!$event.type.indexOf('key')&&"+e.map(Ma).join("&&")+")return null;"}(a)),o&&(i+=o),"function($event){"+i+(t?"return "+e.value+".apply(null, arguments)":n?"return ("+e.value+").apply(null, arguments)":r?"return "+e.value:e.value)+"}"}return t||n?e.value:"function($event){"+(r?"return "+e.value:e.value)+"}"}function Ma(e){var t=parseInt(e,10);if(t)return"$event.keyCode!=="+t;var n=Na[e],r=Ea[e];return"_k($event.keyCode,"+JSON.stringify(e)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(r)+")"}var Fa={on:function(e,t){e.wrapListeners=function(e){return"_g("+e+","+t.value+")"}},bind:function(e,t){e.wrapData=function(n){return"_b("+n+",'"+e.tag+"',"+t.value+","+(t.modifiers&&t.modifiers.prop?"true":"false")+(t.modifiers&&t.modifiers.sync?",true":"")+")"}},cloak:S},Pa=function(e){this.options=e,this.warn=e.warn||Tr,this.transforms=Nr(e.modules,"transformCode"),this.dataGenFns=Nr(e.modules,"genData"),this.directives=A(A({},Fa),e.directives);var t=e.isReservedTag||T;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function Ra(e,t){var n=new Pa(t);return{render:"with(this){return "+(e?"script"===e.tag?"null":Ha(e,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function Ha(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return Ba(e,t);if(e.once&&!e.onceProcessed)return Ua(e,t);if(e.for&&!e.forProcessed)return za(e,t);if(e.if&&!e.ifProcessed)return Va(e,t);if("template"!==e.tag||e.slotTarget||t.pre){if("slot"===e.tag)return function(e,t){var n=e.slotName||'"default"',r=Wa(e,t),i="_t("+n+(r?",function(){return "+r+"}":""),o=e.attrs||e.dynamicAttrs?Xa((e.attrs||[]).concat(e.dynamicAttrs||[]).map(function(e){return{name:b(e.name),value:e.value,dynamic:e.dynamic}})):null,a=e.attrsMap["v-bind"];!o&&!a||r||(i+=",null");o&&(i+=","+o);a&&(i+=(o?"":",null")+","+a);return i+")"}(e,t);var n;if(e.component)n=function(e,t,n){var r=t.inlineTemplate?null:Wa(t,n,!0);return"_c("+e+","+Ka(t,n)+(r?","+r:"")+")"}(e.component,e,t);else{var r;(!e.plain||e.pre&&t.maybeComponent(e))&&(r=Ka(e,t));var i=e.inlineTemplate?null:Wa(e,t,!0);n="_c('"+e.tag+"'"+(r?","+r:"")+(i?","+i:"")+")"}for(var o=0;o>>0}(a):"")+")"}(e,e.scopedSlots,t)+","),e.model&&(n+="model:{value:"+e.model.value+",callback:"+e.model.callback+",expression:"+e.model.expression+"},"),e.inlineTemplate){var o=function(e,t){var n=e.children[0];if(n&&1===n.type){var r=Ra(n,t.options);return"inlineTemplate:{render:function(){"+r.render+"},staticRenderFns:["+r.staticRenderFns.map(function(e){return"function(){"+e+"}"}).join(",")+"]}"}}(e,t);o&&(n+=o+",")}return n=n.replace(/,$/,"")+"}",e.dynamicAttrs&&(n="_b("+n+',"'+e.tag+'",'+Xa(e.dynamicAttrs)+")"),e.wrapData&&(n=e.wrapData(n)),e.wrapListeners&&(n=e.wrapListeners(n)),n}function Ja(e){return 1===e.type&&("slot"===e.tag||e.children.some(Ja))}function qa(e,t){var n=e.attrsMap["slot-scope"];if(e.if&&!e.ifProcessed&&!n)return Va(e,t,qa,"null");if(e.for&&!e.forProcessed)return za(e,t,qa);var r=e.slotScope===ua?"":String(e.slotScope),i="function("+r+"){return "+("template"===e.tag?e.if&&n?"("+e.if+")?"+(Wa(e,t)||"undefined")+":undefined":Wa(e,t)||"undefined":Ha(e,t))+"}",o=r?"":",proxy:true";return"{key:"+(e.slotTarget||'"default"')+",fn:"+i+o+"}"}function Wa(e,t,n,r,i){var o=e.children;if(o.length){var a=o[0];if(1===o.length&&a.for&&"template"!==a.tag&&"slot"!==a.tag){var s=n?t.maybeComponent(a)?",1":",0":"";return""+(r||Ha)(a,t)+s}var c=n?function(e,t){for(var n=0,r=0;r':'
',ns.innerHTML.indexOf(" ")>0}var as=!!V&&os(!1),ss=!!V&&os(!0),cs=g(function(e){var t=Qn(e);return t&&t.innerHTML}),us=Cn.prototype.$mount;return Cn.prototype.$mount=function(e,t){if((e=e&&Qn(e))===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template;if(r)if("string"==typeof r)"#"===r.charAt(0)&&(r=cs(r));else{if(!r.nodeType)return this;r=r.innerHTML}else e&&(r=function(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}(e));if(r){var i=is(r,{outputSourceRange:!1,shouldDecodeNewlines:as,shouldDecodeNewlinesForHref:ss,delimiters:n.delimiters,comments:n.comments},this),o=i.render,a=i.staticRenderFns;n.render=o,n.staticRenderFns=a}}return us.call(this,e,t)},Cn.compile=is,Cn}); \ No newline at end of file diff --git a/src/web-remote/vuedraggable.umd.min.js b/src/web-remote/vuedraggable.umd.min.js new file mode 100644 index 00000000..dee16afe --- /dev/null +++ b/src/web-remote/vuedraggable.umd.min.js @@ -0,0 +1,2 @@ +(function(t,n){"object"===typeof exports&&"object"===typeof module?module.exports=n(require("sortablejs")):"function"===typeof define&&define.amd?define(["sortablejs"],n):"object"===typeof exports?exports["vuedraggable"]=n(require("sortablejs")):t["vuedraggable"]=n(t["Sortable"])})("undefined"!==typeof self?self:this,function(t){return function(t){var n={};function e(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&"object"===typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var o in t)e.d(r,o,function(n){return t[n]}.bind(null,o));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t["default"]}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p="",e(e.s="fb15")}({"02f4":function(t,n,e){var r=e("4588"),o=e("be13");t.exports=function(t){return function(n,e){var i,u,c=String(o(n)),a=r(e),f=c.length;return a<0||a>=f?t?"":void 0:(i=c.charCodeAt(a),i<55296||i>56319||a+1===f||(u=c.charCodeAt(a+1))<56320||u>57343?t?c.charAt(a):i:t?c.slice(a,a+2):u-56320+(i-55296<<10)+65536)}}},"0390":function(t,n,e){"use strict";var r=e("02f4")(!0);t.exports=function(t,n,e){return n+(e?r(t,n).length:1)}},"07e3":function(t,n){var e={}.hasOwnProperty;t.exports=function(t,n){return e.call(t,n)}},"0bfb":function(t,n,e){"use strict";var r=e("cb7c");t.exports=function(){var t=r(this),n="";return t.global&&(n+="g"),t.ignoreCase&&(n+="i"),t.multiline&&(n+="m"),t.unicode&&(n+="u"),t.sticky&&(n+="y"),n}},"0fc9":function(t,n,e){var r=e("3a38"),o=Math.max,i=Math.min;t.exports=function(t,n){return t=r(t),t<0?o(t+n,0):i(t,n)}},1654:function(t,n,e){"use strict";var r=e("71c1")(!0);e("30f1")(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,n=this._t,e=this._i;return e>=n.length?{value:void 0,done:!0}:(t=r(n,e),this._i+=t.length,{value:t,done:!1})})},1691:function(t,n){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},"1af6":function(t,n,e){var r=e("63b6");r(r.S,"Array",{isArray:e("9003")})},"1bc3":function(t,n,e){var r=e("f772");t.exports=function(t,n){if(!r(t))return t;var e,o;if(n&&"function"==typeof(e=t.toString)&&!r(o=e.call(t)))return o;if("function"==typeof(e=t.valueOf)&&!r(o=e.call(t)))return o;if(!n&&"function"==typeof(e=t.toString)&&!r(o=e.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},"1ec9":function(t,n,e){var r=e("f772"),o=e("e53d").document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},"20fd":function(t,n,e){"use strict";var r=e("d9f6"),o=e("aebd");t.exports=function(t,n,e){n in t?r.f(t,n,o(0,e)):t[n]=e}},"214f":function(t,n,e){"use strict";e("b0c5");var r=e("2aba"),o=e("32e9"),i=e("79e5"),u=e("be13"),c=e("2b4c"),a=e("520a"),f=c("species"),s=!i(function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")}),l=function(){var t=/(?:)/,n=t.exec;t.exec=function(){return n.apply(this,arguments)};var e="ab".split(t);return 2===e.length&&"a"===e[0]&&"b"===e[1]}();t.exports=function(t,n,e){var p=c(t),d=!i(function(){var n={};return n[p]=function(){return 7},7!=""[t](n)}),v=d?!i(function(){var n=!1,e=/a/;return e.exec=function(){return n=!0,null},"split"===t&&(e.constructor={},e.constructor[f]=function(){return e}),e[p](""),!n}):void 0;if(!d||!v||"replace"===t&&!s||"split"===t&&!l){var h=/./[p],b=e(u,p,""[t],function(t,n,e,r,o){return n.exec===a?d&&!o?{done:!0,value:h.call(n,e,r)}:{done:!0,value:t.call(e,n,r)}:{done:!1}}),g=b[0],y=b[1];r(String.prototype,t,g),o(RegExp.prototype,p,2==n?function(t,n){return y.call(t,this,n)}:function(t){return y.call(t,this)})}}},"230e":function(t,n,e){var r=e("d3f4"),o=e("7726").document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},"23c6":function(t,n,e){var r=e("2d95"),o=e("2b4c")("toStringTag"),i="Arguments"==r(function(){return arguments}()),u=function(t,n){try{return t[n]}catch(e){}};t.exports=function(t){var n,e,c;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(e=u(n=Object(t),o))?e:i?r(n):"Object"==(c=r(n))&&"function"==typeof n.callee?"Arguments":c}},"241e":function(t,n,e){var r=e("25eb");t.exports=function(t){return Object(r(t))}},"25eb":function(t,n){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},"294c":function(t,n){t.exports=function(t){try{return!!t()}catch(n){return!0}}},"2aba":function(t,n,e){var r=e("7726"),o=e("32e9"),i=e("69a8"),u=e("ca5a")("src"),c=e("fa5b"),a="toString",f=(""+c).split(a);e("8378").inspectSource=function(t){return c.call(t)},(t.exports=function(t,n,e,c){var a="function"==typeof e;a&&(i(e,"name")||o(e,"name",n)),t[n]!==e&&(a&&(i(e,u)||o(e,u,t[n]?""+t[n]:f.join(String(n)))),t===r?t[n]=e:c?t[n]?t[n]=e:o(t,n,e):(delete t[n],o(t,n,e)))})(Function.prototype,a,function(){return"function"==typeof this&&this[u]||c.call(this)})},"2b4c":function(t,n,e){var r=e("5537")("wks"),o=e("ca5a"),i=e("7726").Symbol,u="function"==typeof i,c=t.exports=function(t){return r[t]||(r[t]=u&&i[t]||(u?i:o)("Symbol."+t))};c.store=r},"2d00":function(t,n){t.exports=!1},"2d95":function(t,n){var e={}.toString;t.exports=function(t){return e.call(t).slice(8,-1)}},"2fdb":function(t,n,e){"use strict";var r=e("5ca1"),o=e("d2c8"),i="includes";r(r.P+r.F*e("5147")(i),"String",{includes:function(t){return!!~o(this,t,i).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},"30f1":function(t,n,e){"use strict";var r=e("b8e3"),o=e("63b6"),i=e("9138"),u=e("35e8"),c=e("481b"),a=e("8f60"),f=e("45f2"),s=e("53e2"),l=e("5168")("iterator"),p=!([].keys&&"next"in[].keys()),d="@@iterator",v="keys",h="values",b=function(){return this};t.exports=function(t,n,e,g,y,x,m){a(e,n,g);var w,O,S,j=function(t){if(!p&&t in C)return C[t];switch(t){case v:return function(){return new e(this,t)};case h:return function(){return new e(this,t)}}return function(){return new e(this,t)}},_=n+" Iterator",M=y==h,T=!1,C=t.prototype,E=C[l]||C[d]||y&&C[y],A=E||j(y),P=y?M?j("entries"):A:void 0,I="Array"==n&&C.entries||E;if(I&&(S=s(I.call(new t)),S!==Object.prototype&&S.next&&(f(S,_,!0),r||"function"==typeof S[l]||u(S,l,b))),M&&E&&E.name!==h&&(T=!0,A=function(){return E.call(this)}),r&&!m||!p&&!T&&C[l]||u(C,l,A),c[n]=A,c[_]=b,y)if(w={values:M?A:j(h),keys:x?A:j(v),entries:P},m)for(O in w)O in C||i(C,O,w[O]);else o(o.P+o.F*(p||T),n,w);return w}},"32a6":function(t,n,e){var r=e("241e"),o=e("c3a1");e("ce7e")("keys",function(){return function(t){return o(r(t))}})},"32e9":function(t,n,e){var r=e("86cc"),o=e("4630");t.exports=e("9e1e")?function(t,n,e){return r.f(t,n,o(1,e))}:function(t,n,e){return t[n]=e,t}},"32fc":function(t,n,e){var r=e("e53d").document;t.exports=r&&r.documentElement},"335c":function(t,n,e){var r=e("6b4c");t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},"355d":function(t,n){n.f={}.propertyIsEnumerable},"35e8":function(t,n,e){var r=e("d9f6"),o=e("aebd");t.exports=e("8e60")?function(t,n,e){return r.f(t,n,o(1,e))}:function(t,n,e){return t[n]=e,t}},"36c3":function(t,n,e){var r=e("335c"),o=e("25eb");t.exports=function(t){return r(o(t))}},3702:function(t,n,e){var r=e("481b"),o=e("5168")("iterator"),i=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||i[o]===t)}},"3a38":function(t,n){var e=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:e)(t)}},"40c3":function(t,n,e){var r=e("6b4c"),o=e("5168")("toStringTag"),i="Arguments"==r(function(){return arguments}()),u=function(t,n){try{return t[n]}catch(e){}};t.exports=function(t){var n,e,c;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(e=u(n=Object(t),o))?e:i?r(n):"Object"==(c=r(n))&&"function"==typeof n.callee?"Arguments":c}},4588:function(t,n){var e=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:e)(t)}},"45f2":function(t,n,e){var r=e("d9f6").f,o=e("07e3"),i=e("5168")("toStringTag");t.exports=function(t,n,e){t&&!o(t=e?t:t.prototype,i)&&r(t,i,{configurable:!0,value:n})}},4630:function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},"469f":function(t,n,e){e("6c1c"),e("1654"),t.exports=e("7d7b")},"481b":function(t,n){t.exports={}},"4aa6":function(t,n,e){t.exports=e("dc62")},"4bf8":function(t,n,e){var r=e("be13");t.exports=function(t){return Object(r(t))}},"4ee1":function(t,n,e){var r=e("5168")("iterator"),o=!1;try{var i=[7][r]();i["return"]=function(){o=!0},Array.from(i,function(){throw 2})}catch(u){}t.exports=function(t,n){if(!n&&!o)return!1;var e=!1;try{var i=[7],c=i[r]();c.next=function(){return{done:e=!0}},i[r]=function(){return c},t(i)}catch(u){}return e}},"50ed":function(t,n){t.exports=function(t,n){return{value:n,done:!!t}}},5147:function(t,n,e){var r=e("2b4c")("match");t.exports=function(t){var n=/./;try{"/./"[t](n)}catch(e){try{return n[r]=!1,!"/./"[t](n)}catch(o){}}return!0}},5168:function(t,n,e){var r=e("dbdb")("wks"),o=e("62a0"),i=e("e53d").Symbol,u="function"==typeof i,c=t.exports=function(t){return r[t]||(r[t]=u&&i[t]||(u?i:o)("Symbol."+t))};c.store=r},5176:function(t,n,e){t.exports=e("51b6")},"51b6":function(t,n,e){e("a3c3"),t.exports=e("584a").Object.assign},"520a":function(t,n,e){"use strict";var r=e("0bfb"),o=RegExp.prototype.exec,i=String.prototype.replace,u=o,c="lastIndex",a=function(){var t=/a/,n=/b*/g;return o.call(t,"a"),o.call(n,"a"),0!==t[c]||0!==n[c]}(),f=void 0!==/()??/.exec("")[1],s=a||f;s&&(u=function(t){var n,e,u,s,l=this;return f&&(e=new RegExp("^"+l.source+"$(?!\\s)",r.call(l))),a&&(n=l[c]),u=o.call(l,t),a&&u&&(l[c]=l.global?u.index+u[0].length:n),f&&u&&u.length>1&&i.call(u[0],e,function(){for(s=1;s1?arguments[1]:void 0,b=void 0!==h,g=0,y=s(p);if(b&&(h=r(h,v>2?arguments[2]:void 0,2)),void 0==y||d==Array&&c(y))for(n=a(p.length),e=new d(n);n>g;g++)f(e,g,b?h(p[g],g):p[g]);else for(l=y.call(p),e=new d;!(o=l.next()).done;g++)f(e,g,b?u(l,h,[o.value,g],!0):o.value);return e.length=g,e}})},"54a1":function(t,n,e){e("6c1c"),e("1654"),t.exports=e("95d5")},5537:function(t,n,e){var r=e("8378"),o=e("7726"),i="__core-js_shared__",u=o[i]||(o[i]={});(t.exports=function(t,n){return u[t]||(u[t]=void 0!==n?n:{})})("versions",[]).push({version:r.version,mode:e("2d00")?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},5559:function(t,n,e){var r=e("dbdb")("keys"),o=e("62a0");t.exports=function(t){return r[t]||(r[t]=o(t))}},"584a":function(t,n){var e=t.exports={version:"2.6.5"};"number"==typeof __e&&(__e=e)},"5b4e":function(t,n,e){var r=e("36c3"),o=e("b447"),i=e("0fc9");t.exports=function(t){return function(n,e,u){var c,a=r(n),f=o(a.length),s=i(u,f);if(t&&e!=e){while(f>s)if(c=a[s++],c!=c)return!0}else for(;f>s;s++)if((t||s in a)&&a[s]===e)return t||s||0;return!t&&-1}}},"5ca1":function(t,n,e){var r=e("7726"),o=e("8378"),i=e("32e9"),u=e("2aba"),c=e("9b43"),a="prototype",f=function(t,n,e){var s,l,p,d,v=t&f.F,h=t&f.G,b=t&f.S,g=t&f.P,y=t&f.B,x=h?r:b?r[n]||(r[n]={}):(r[n]||{})[a],m=h?o:o[n]||(o[n]={}),w=m[a]||(m[a]={});for(s in h&&(e=n),e)l=!v&&x&&void 0!==x[s],p=(l?x:e)[s],d=y&&l?c(p,r):g&&"function"==typeof p?c(Function.call,p):p,x&&u(x,s,p,t&f.U),m[s]!=p&&i(m,s,d),g&&w[s]!=p&&(w[s]=p)};r.core=o,f.F=1,f.G=2,f.S=4,f.P=8,f.B=16,f.W=32,f.U=64,f.R=128,t.exports=f},"5d73":function(t,n,e){t.exports=e("469f")},"5f1b":function(t,n,e){"use strict";var r=e("23c6"),o=RegExp.prototype.exec;t.exports=function(t,n){var e=t.exec;if("function"===typeof e){var i=e.call(t,n);if("object"!==typeof i)throw new TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==r(t))throw new TypeError("RegExp#exec called on incompatible receiver");return o.call(t,n)}},"626a":function(t,n,e){var r=e("2d95");t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},"62a0":function(t,n){var e=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++e+r).toString(36))}},"63b6":function(t,n,e){var r=e("e53d"),o=e("584a"),i=e("d864"),u=e("35e8"),c=e("07e3"),a="prototype",f=function(t,n,e){var s,l,p,d=t&f.F,v=t&f.G,h=t&f.S,b=t&f.P,g=t&f.B,y=t&f.W,x=v?o:o[n]||(o[n]={}),m=x[a],w=v?r:h?r[n]:(r[n]||{})[a];for(s in v&&(e=n),e)l=!d&&w&&void 0!==w[s],l&&c(x,s)||(p=l?w[s]:e[s],x[s]=v&&"function"!=typeof w[s]?e[s]:g&&l?i(p,r):y&&w[s]==p?function(t){var n=function(n,e,r){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(n);case 2:return new t(n,e)}return new t(n,e,r)}return t.apply(this,arguments)};return n[a]=t[a],n}(p):b&&"function"==typeof p?i(Function.call,p):p,b&&((x.virtual||(x.virtual={}))[s]=p,t&f.R&&m&&!m[s]&&u(m,s,p)))};f.F=1,f.G=2,f.S=4,f.P=8,f.B=16,f.W=32,f.U=64,f.R=128,t.exports=f},6762:function(t,n,e){"use strict";var r=e("5ca1"),o=e("c366")(!0);r(r.P,"Array",{includes:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),e("9c6c")("includes")},6821:function(t,n,e){var r=e("626a"),o=e("be13");t.exports=function(t){return r(o(t))}},"69a8":function(t,n){var e={}.hasOwnProperty;t.exports=function(t,n){return e.call(t,n)}},"6a99":function(t,n,e){var r=e("d3f4");t.exports=function(t,n){if(!r(t))return t;var e,o;if(n&&"function"==typeof(e=t.toString)&&!r(o=e.call(t)))return o;if("function"==typeof(e=t.valueOf)&&!r(o=e.call(t)))return o;if(!n&&"function"==typeof(e=t.toString)&&!r(o=e.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},"6b4c":function(t,n){var e={}.toString;t.exports=function(t){return e.call(t).slice(8,-1)}},"6c1c":function(t,n,e){e("c367");for(var r=e("e53d"),o=e("35e8"),i=e("481b"),u=e("5168")("toStringTag"),c="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),a=0;a=f?t?"":void 0:(i=c.charCodeAt(a),i<55296||i>56319||a+1===f||(u=c.charCodeAt(a+1))<56320||u>57343?t?c.charAt(a):i:t?c.slice(a,a+2):u-56320+(i-55296<<10)+65536)}}},7726:function(t,n){var e=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=e)},"774e":function(t,n,e){t.exports=e("d2d5")},"77f1":function(t,n,e){var r=e("4588"),o=Math.max,i=Math.min;t.exports=function(t,n){return t=r(t),t<0?o(t+n,0):i(t,n)}},"794b":function(t,n,e){t.exports=!e("8e60")&&!e("294c")(function(){return 7!=Object.defineProperty(e("1ec9")("div"),"a",{get:function(){return 7}}).a})},"79aa":function(t,n){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},"79e5":function(t,n){t.exports=function(t){try{return!!t()}catch(n){return!0}}},"7cd6":function(t,n,e){var r=e("40c3"),o=e("5168")("iterator"),i=e("481b");t.exports=e("584a").getIteratorMethod=function(t){if(void 0!=t)return t[o]||t["@@iterator"]||i[r(t)]}},"7d7b":function(t,n,e){var r=e("e4ae"),o=e("7cd6");t.exports=e("584a").getIterator=function(t){var n=o(t);if("function"!=typeof n)throw TypeError(t+" is not iterable!");return r(n.call(t))}},"7e90":function(t,n,e){var r=e("d9f6"),o=e("e4ae"),i=e("c3a1");t.exports=e("8e60")?Object.defineProperties:function(t,n){o(t);var e,u=i(n),c=u.length,a=0;while(c>a)r.f(t,e=u[a++],n[e]);return t}},8378:function(t,n){var e=t.exports={version:"2.6.5"};"number"==typeof __e&&(__e=e)},8436:function(t,n){t.exports=function(){}},"86cc":function(t,n,e){var r=e("cb7c"),o=e("c69a"),i=e("6a99"),u=Object.defineProperty;n.f=e("9e1e")?Object.defineProperty:function(t,n,e){if(r(t),n=i(n,!0),r(e),o)try{return u(t,n,e)}catch(c){}if("get"in e||"set"in e)throw TypeError("Accessors not supported!");return"value"in e&&(t[n]=e.value),t}},"8aae":function(t,n,e){e("32a6"),t.exports=e("584a").Object.keys},"8e60":function(t,n,e){t.exports=!e("294c")(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},"8f60":function(t,n,e){"use strict";var r=e("a159"),o=e("aebd"),i=e("45f2"),u={};e("35e8")(u,e("5168")("iterator"),function(){return this}),t.exports=function(t,n,e){t.prototype=r(u,{next:o(1,e)}),i(t,n+" Iterator")}},9003:function(t,n,e){var r=e("6b4c");t.exports=Array.isArray||function(t){return"Array"==r(t)}},9138:function(t,n,e){t.exports=e("35e8")},9306:function(t,n,e){"use strict";var r=e("c3a1"),o=e("9aa9"),i=e("355d"),u=e("241e"),c=e("335c"),a=Object.assign;t.exports=!a||e("294c")(function(){var t={},n={},e=Symbol(),r="abcdefghijklmnopqrst";return t[e]=7,r.split("").forEach(function(t){n[t]=t}),7!=a({},t)[e]||Object.keys(a({},n)).join("")!=r})?function(t,n){var e=u(t),a=arguments.length,f=1,s=o.f,l=i.f;while(a>f){var p,d=c(arguments[f++]),v=s?r(d).concat(s(d)):r(d),h=v.length,b=0;while(h>b)l.call(d,p=v[b++])&&(e[p]=d[p])}return e}:a},9427:function(t,n,e){var r=e("63b6");r(r.S,"Object",{create:e("a159")})},"95d5":function(t,n,e){var r=e("40c3"),o=e("5168")("iterator"),i=e("481b");t.exports=e("584a").isIterable=function(t){var n=Object(t);return void 0!==n[o]||"@@iterator"in n||i.hasOwnProperty(r(n))}},"9aa9":function(t,n){n.f=Object.getOwnPropertySymbols},"9b43":function(t,n,e){var r=e("d8e8");t.exports=function(t,n,e){if(r(t),void 0===n)return t;switch(e){case 1:return function(e){return t.call(n,e)};case 2:return function(e,r){return t.call(n,e,r)};case 3:return function(e,r,o){return t.call(n,e,r,o)}}return function(){return t.apply(n,arguments)}}},"9c6c":function(t,n,e){var r=e("2b4c")("unscopables"),o=Array.prototype;void 0==o[r]&&e("32e9")(o,r,{}),t.exports=function(t){o[r][t]=!0}},"9def":function(t,n,e){var r=e("4588"),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},"9e1e":function(t,n,e){t.exports=!e("79e5")(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},a159:function(t,n,e){var r=e("e4ae"),o=e("7e90"),i=e("1691"),u=e("5559")("IE_PROTO"),c=function(){},a="prototype",f=function(){var t,n=e("1ec9")("iframe"),r=i.length,o="<",u=">";n.style.display="none",e("32fc").appendChild(n),n.src="javascript:",t=n.contentWindow.document,t.open(),t.write(o+"script"+u+"document.F=Object"+o+"/script"+u),t.close(),f=t.F;while(r--)delete f[a][i[r]];return f()};t.exports=Object.create||function(t,n){var e;return null!==t?(c[a]=r(t),e=new c,c[a]=null,e[u]=t):e=f(),void 0===n?e:o(e,n)}},a352:function(n,e){n.exports=t},a3c3:function(t,n,e){var r=e("63b6");r(r.S+r.F,"Object",{assign:e("9306")})},a481:function(t,n,e){"use strict";var r=e("cb7c"),o=e("4bf8"),i=e("9def"),u=e("4588"),c=e("0390"),a=e("5f1b"),f=Math.max,s=Math.min,l=Math.floor,p=/\$([$&`']|\d\d?|<[^>]*>)/g,d=/\$([$&`']|\d\d?)/g,v=function(t){return void 0===t?t:String(t)};e("214f")("replace",2,function(t,n,e,h){return[function(r,o){var i=t(this),u=void 0==r?void 0:r[n];return void 0!==u?u.call(r,i,o):e.call(String(i),r,o)},function(t,n){var o=h(e,t,this,n);if(o.done)return o.value;var l=r(t),p=String(this),d="function"===typeof n;d||(n=String(n));var g=l.global;if(g){var y=l.unicode;l.lastIndex=0}var x=[];while(1){var m=a(l,p);if(null===m)break;if(x.push(m),!g)break;var w=String(m[0]);""===w&&(l.lastIndex=c(p,i(l.lastIndex),y))}for(var O="",S=0,j=0;j=S&&(O+=p.slice(S,M)+P,S=M+_.length)}return O+p.slice(S)}];function b(t,n,r,i,u,c){var a=r+t.length,f=i.length,s=d;return void 0!==u&&(u=o(u),s=p),e.call(c,s,function(e,o){var c;switch(o.charAt(0)){case"$":return"$";case"&":return t;case"`":return n.slice(0,r);case"'":return n.slice(a);case"<":c=u[o.slice(1,-1)];break;default:var s=+o;if(0===s)return e;if(s>f){var p=l(s/10);return 0===p?e:p<=f?void 0===i[p-1]?o.charAt(1):i[p-1]+o.charAt(1):e}c=i[s-1]}return void 0===c?"":c})}})},a4bb:function(t,n,e){t.exports=e("8aae")},a745:function(t,n,e){t.exports=e("f410")},aae3:function(t,n,e){var r=e("d3f4"),o=e("2d95"),i=e("2b4c")("match");t.exports=function(t){var n;return r(t)&&(void 0!==(n=t[i])?!!n:"RegExp"==o(t))}},aebd:function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},b0c5:function(t,n,e){"use strict";var r=e("520a");e("5ca1")({target:"RegExp",proto:!0,forced:r!==/./.exec},{exec:r})},b0dc:function(t,n,e){var r=e("e4ae");t.exports=function(t,n,e,o){try{return o?n(r(e)[0],e[1]):n(e)}catch(u){var i=t["return"];throw void 0!==i&&r(i.call(t)),u}}},b447:function(t,n,e){var r=e("3a38"),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},b8e3:function(t,n){t.exports=!0},be13:function(t,n){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},c366:function(t,n,e){var r=e("6821"),o=e("9def"),i=e("77f1");t.exports=function(t){return function(n,e,u){var c,a=r(n),f=o(a.length),s=i(u,f);if(t&&e!=e){while(f>s)if(c=a[s++],c!=c)return!0}else for(;f>s;s++)if((t||s in a)&&a[s]===e)return t||s||0;return!t&&-1}}},c367:function(t,n,e){"use strict";var r=e("8436"),o=e("50ed"),i=e("481b"),u=e("36c3");t.exports=e("30f1")(Array,"Array",function(t,n){this._t=u(t),this._i=0,this._k=n},function(){var t=this._t,n=this._k,e=this._i++;return!t||e>=t.length?(this._t=void 0,o(1)):o(0,"keys"==n?e:"values"==n?t[e]:[e,t[e]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},c3a1:function(t,n,e){var r=e("e6f3"),o=e("1691");t.exports=Object.keys||function(t){return r(t,o)}},c649:function(t,n,e){"use strict";(function(t){e.d(n,"c",function(){return l}),e.d(n,"a",function(){return f}),e.d(n,"b",function(){return u}),e.d(n,"d",function(){return s});e("a481");var r=e("4aa6"),o=e.n(r);function i(){return"undefined"!==typeof window?window.console:t.console}var u=i();function c(t){var n=o()(null);return function(e){var r=n[e];return r||(n[e]=t(e))}}var a=/-(\w)/g,f=c(function(t){return t.replace(a,function(t,n){return n?n.toUpperCase():""})});function s(t){null!==t.parentElement&&t.parentElement.removeChild(t)}function l(t,n,e){var r=0===e?t.children[0]:t.children[e-1].nextSibling;t.insertBefore(n,r)}}).call(this,e("c8ba"))},c69a:function(t,n,e){t.exports=!e("9e1e")&&!e("79e5")(function(){return 7!=Object.defineProperty(e("230e")("div"),"a",{get:function(){return 7}}).a})},c8ba:function(t,n){var e;e=function(){return this}();try{e=e||new Function("return this")()}catch(r){"object"===typeof window&&(e=window)}t.exports=e},c8bb:function(t,n,e){t.exports=e("54a1")},ca5a:function(t,n){var e=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++e+r).toString(36))}},cb7c:function(t,n,e){var r=e("d3f4");t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},ce7e:function(t,n,e){var r=e("63b6"),o=e("584a"),i=e("294c");t.exports=function(t,n){var e=(o.Object||{})[t]||Object[t],u={};u[t]=n(e),r(r.S+r.F*i(function(){e(1)}),"Object",u)}},d2c8:function(t,n,e){var r=e("aae3"),o=e("be13");t.exports=function(t,n,e){if(r(n))throw TypeError("String#"+e+" doesn't accept regex!");return String(o(t))}},d2d5:function(t,n,e){e("1654"),e("549b"),t.exports=e("584a").Array.from},d3f4:function(t,n){t.exports=function(t){return"object"===typeof t?null!==t:"function"===typeof t}},d864:function(t,n,e){var r=e("79aa");t.exports=function(t,n,e){if(r(t),void 0===n)return t;switch(e){case 1:return function(e){return t.call(n,e)};case 2:return function(e,r){return t.call(n,e,r)};case 3:return function(e,r,o){return t.call(n,e,r,o)}}return function(){return t.apply(n,arguments)}}},d8e8:function(t,n){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},d9f6:function(t,n,e){var r=e("e4ae"),o=e("794b"),i=e("1bc3"),u=Object.defineProperty;n.f=e("8e60")?Object.defineProperty:function(t,n,e){if(r(t),n=i(n,!0),r(e),o)try{return u(t,n,e)}catch(c){}if("get"in e||"set"in e)throw TypeError("Accessors not supported!");return"value"in e&&(t[n]=e.value),t}},dbdb:function(t,n,e){var r=e("584a"),o=e("e53d"),i="__core-js_shared__",u=o[i]||(o[i]={});(t.exports=function(t,n){return u[t]||(u[t]=void 0!==n?n:{})})("versions",[]).push({version:r.version,mode:e("b8e3")?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},dc62:function(t,n,e){e("9427");var r=e("584a").Object;t.exports=function(t,n){return r.create(t,n)}},e4ae:function(t,n,e){var r=e("f772");t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},e53d:function(t,n){var e=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=e)},e6f3:function(t,n,e){var r=e("07e3"),o=e("36c3"),i=e("5b4e")(!1),u=e("5559")("IE_PROTO");t.exports=function(t,n){var e,c=o(t),a=0,f=[];for(e in c)e!=u&&r(c,e)&&f.push(e);while(n.length>a)r(c,e=n[a++])&&(~i(f,e)||f.push(e));return f}},f410:function(t,n,e){e("1af6"),t.exports=e("584a").Array.isArray},f559:function(t,n,e){"use strict";var r=e("5ca1"),o=e("9def"),i=e("d2c8"),u="startsWith",c=""[u];r(r.P+r.F*e("5147")(u),"String",{startsWith:function(t){var n=i(this,t,u),e=o(Math.min(arguments.length>1?arguments[1]:void 0,n.length)),r=String(t);return c?c.call(n,r,e):n.slice(e,e+r.length)===r}})},f772:function(t,n){t.exports=function(t){return"object"===typeof t?null!==t:"function"===typeof t}},fa5b:function(t,n,e){t.exports=e("5537")("native-function-to-string",Function.toString)},fb15:function(t,n,e){"use strict";var r;(e.r(n),"undefined"!==typeof window)&&((r=window.document.currentScript)&&(r=r.src.match(/(.+\/)[^\/]+\.js(\?.*)?$/))&&(e.p=r[1]));var o=e("5176"),i=e.n(o),u=(e("f559"),e("a4bb")),c=e.n(u),a=(e("6762"),e("2fdb"),e("a745")),f=e.n(a);function s(t){if(f()(t))return t}var l=e("5d73"),p=e.n(l);function d(t,n){var e=[],r=!0,o=!1,i=void 0;try{for(var u,c=p()(t);!(r=(u=c.next()).done);r=!0)if(e.push(u.value),n&&e.length===n)break}catch(a){o=!0,i=a}finally{try{r||null==c["return"]||c["return"]()}finally{if(o)throw i}}return e}function v(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function h(t,n){return s(t)||d(t,n)||v()}function b(t){if(f()(t)){for(var n=0,e=new Array(t.length);n=i?o.length:o.indexOf(t)});return e?u.filter(function(t){return-1!==t}):u}function A(t,n){var e=this;this.$nextTick(function(){return e.$emit(t.toLowerCase(),n)})}function P(t){var n=this;return function(e){null!==n.realList&&n["onDrag"+t](e),A.call(n,t,e)}}function I(t){if(!t||1!==t.length)return!1;var n=h(t,1),e=n[0].componentOptions;return!!e&&["transition-group","TransitionGroup"].includes(e.tag)}function L(t,n){var e=n.header,r=n.footer,o=0,i=0;return e&&(o=e.length,t=t?[].concat(S(e),S(t)):S(e)),r&&(i=r.length,t=t?[].concat(S(t),S(r)):S(r)),{children:t,headerOffset:o,footerOffset:i}}function F(t,n){var e=null,r=function(t,n){e=T(e,t,n)},o=c()(t).filter(function(t){return"id"===t||t.startsWith("data-")}).reduce(function(n,e){return n[e]=t[e],n},{});if(r("attrs",o),!n)return e;var u=n.on,a=n.props,f=n.attrs;return r("on",u),r("props",a),i()(e.attrs,f),e}var $=["Start","Add","Remove","Update","End"],k=["Choose","Sort","Filter","Clone"],D=["Move"].concat($,k).map(function(t){return"on"+t}),R=null,V={options:Object,list:{type:Array,required:!1,default:null},value:{type:Array,required:!1,default:null},noTransitionOnDrag:{type:Boolean,default:!1},clone:{type:Function,default:function(t){return t}},element:{type:String,default:"div"},tag:{type:String,default:null},move:{type:Function,default:null},componentData:{type:Object,required:!1,default:null}},N={name:"draggable",inheritAttrs:!1,props:V,data:function(){return{transitionMode:!1,noneFunctionalComponentMode:!1,init:!1}},render:function(t){var n=this.$slots.default;this.transitionMode=I(n);var e=L(n,this.$slots),r=e.children,o=e.headerOffset,i=e.footerOffset;this.headerOffset=o,this.footerOffset=i;var u=F(this.$attrs,this.componentData);return t(this.getTag(),u,r)},created:function(){null!==this.list&&null!==this.value&&M["b"].error("Value and list props are mutually exclusive! Please set one or another."),"div"!==this.element&&M["b"].warn("Element props is deprecated please use tag props instead. See https://github.com/SortableJS/Vue.Draggable/blob/master/documentation/migrate.md#element-props"),void 0!==this.options&&M["b"].warn("Options props is deprecated, add sortable options directly as vue.draggable item, or use v-bind. See https://github.com/SortableJS/Vue.Draggable/blob/master/documentation/migrate.md#options-props")},mounted:function(){var t=this;if(this.noneFunctionalComponentMode=this.getTag().toLowerCase()!==this.$el.nodeName.toLowerCase(),this.noneFunctionalComponentMode&&this.transitionMode)throw new Error("Transition-group inside component is not supported. Please alter tag value or remove transition-group. Current tag value: ".concat(this.getTag()));var n={};$.forEach(function(e){n["on"+e]=P.call(t,e)}),k.forEach(function(e){n["on"+e]=A.bind(t,e)});var e=c()(this.$attrs).reduce(function(n,e){return n[Object(M["a"])(e)]=t.$attrs[e],n},{}),r=i()({},this.options,e,n,{onMove:function(n,e){return t.onDragMove(n,e)}});!("draggable"in r)&&(r.draggable=">*"),this._sortable=new _.a(this.rootContainer,r),this.computeIndexes()},beforeDestroy:function(){void 0!==this._sortable&&this._sortable.destroy()},computed:{rootContainer:function(){return this.transitionMode?this.$el.children[0]:this.$el},realList:function(){return this.list?this.list:this.value}},watch:{options:{handler:function(t){this.updateOptions(t)},deep:!0},$attrs:{handler:function(t){this.updateOptions(t)},deep:!0},realList:function(){this.computeIndexes()}},methods:{getTag:function(){return this.tag||this.element},updateOptions:function(t){for(var n in t){var e=Object(M["a"])(n);-1===D.indexOf(e)&&this._sortable.option(e,t[n])}},getChildrenNodes:function(){if(this.init||(this.noneFunctionalComponentMode=this.noneFunctionalComponentMode&&1===this.$children.length,this.init=!0),this.noneFunctionalComponentMode)return this.$children[0].$slots.default;var t=this.$slots.default;return this.transitionMode?t[0].child.$slots.default:t},computeIndexes:function(){var t=this;this.$nextTick(function(){t.visibleIndexes=E(t.getChildrenNodes(),t.rootContainer.children,t.transitionMode,t.footerOffset)})},getUnderlyingVm:function(t){var n=C(this.getChildrenNodes()||[],t);if(-1===n)return null;var e=this.realList[n];return{index:n,element:e}},getUnderlyingPotencialDraggableComponent:function(t){var n=t.__vue__;return n&&n.$options&&"transition-group"===n.$options._componentTag?n.$parent:n},emitChanges:function(t){var n=this;this.$nextTick(function(){n.$emit("change",t)})},alterList:function(t){if(this.list)t(this.list);else{var n=S(this.value);t(n),this.$emit("input",n)}},spliceList:function(){var t=arguments,n=function(n){return n.splice.apply(n,S(t))};this.alterList(n)},updatePosition:function(t,n){var e=function(e){return e.splice(n,0,e.splice(t,1)[0])};this.alterList(e)},getRelatedContextFromMoveEvent:function(t){var n=t.to,e=t.related,r=this.getUnderlyingPotencialDraggableComponent(n);if(!r)return{component:r};var o=r.realList,u={list:o,component:r};if(n!==e&&o&&r.getUnderlyingVm){var c=r.getUnderlyingVm(e);if(c)return i()(c,u)}return u},getVmIndex:function(t){var n=this.visibleIndexes,e=n.length;return t>e-1?e:n[t]},getComponent:function(){return this.$slots.default[0].componentInstance},resetTransitionData:function(t){if(this.noTransitionOnDrag&&this.transitionMode){var n=this.getChildrenNodes();n[t].data=null;var e=this.getComponent();e.children=[],e.kept=void 0}},onDragStart:function(t){this.context=this.getUnderlyingVm(t.item),t.item._underlying_vm_=this.clone(this.context.element),R=t.item},onDragAdd:function(t){var n=t.item._underlying_vm_;if(void 0!==n){Object(M["d"])(t.item);var e=this.getVmIndex(t.newIndex);this.spliceList(e,0,n),this.computeIndexes();var r={element:n,newIndex:e};this.emitChanges({added:r})}},onDragRemove:function(t){if(Object(M["c"])(this.rootContainer,t.item,t.oldIndex),"clone"!==t.pullMode){var n=this.context.index;this.spliceList(n,1);var e={element:this.context.element,oldIndex:n};this.resetTransitionData(n),this.emitChanges({removed:e})}else Object(M["d"])(t.clone)},onDragUpdate:function(t){Object(M["d"])(t.item),Object(M["c"])(t.from,t.item,t.oldIndex);var n=this.context.index,e=this.getVmIndex(t.newIndex);this.updatePosition(n,e);var r={element:this.context.element,oldIndex:n,newIndex:e};this.emitChanges({moved:r})},updateProperty:function(t,n){t.hasOwnProperty(n)&&(t[n]+=this.headerOffset)},computeFutureIndex:function(t,n){if(!t.element)return 0;var e=S(n.to.children).filter(function(t){return"none"!==t.style["display"]}),r=e.indexOf(n.related),o=t.component.getVmIndex(r),i=-1!==e.indexOf(R);return i||!n.willInsertAfter?o:o+1},onDragMove:function(t,n){var e=this.move;if(!e||!this.realList)return!0;var r=this.getRelatedContextFromMoveEvent(t),o=this.context,u=this.computeFutureIndex(r,t);i()(o,{futureIndex:u});var c=i()({},t,{relatedContext:r,draggedContext:o});return e(c,n)},onDragEnd:function(){this.computeIndexes(),R=null}}};"undefined"!==typeof window&&"Vue"in window&&window.Vue.component("draggable",N);var U=N;n["default"]=U}})["default"]}); +//# sourceMappingURL=vuedraggable.umd.min.js.map \ No newline at end of file From e8b6dd3180ca66fae4fc6ebe4bc17c6b69cf5bfd Mon Sep 17 00:00:00 2001 From: Core Date: Sun, 16 Jan 2022 23:33:46 +0000 Subject: [PATCH 29/61] Added protocols --- src/main/base/app.ts | 69 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/src/main/base/app.ts b/src/main/base/app.ts index 9e1e54e1..5e2d46bd 100644 --- a/src/main/base/app.ts +++ b/src/main/base/app.ts @@ -2,9 +2,21 @@ import * as electron from 'electron'; import * as path from 'path'; export class AppEvents { + private static protocols: any = [ + "ame", + "cider", + "itms", + "itmss", + "musics", + "music" + ] + + private static store: any = null; + constructor(store: any) { console.log('App started'); + AppEvents.store = store AppEvents.start(store); } @@ -61,6 +73,28 @@ export class AppEvents { electron.app.commandLine.appendSwitch('disable-gpu') break; } + + /*********************************************************************************************************************** + * Protocols + **********************************************************************************************************************/ + if (process.defaultApp) { + if (process.argv.length >= 2) { + this.protocols.forEach((protocol: string) => { + electron.app.setAsDefaultProtocolClient(protocol, process.execPath, [path.resolve(process.argv[1])]) + }) + } + } else { + this.protocols.forEach((protocol: string) => { + electron.app.setAsDefaultProtocolClient(protocol) + }) + } + + electron.app.on('open-url', (event, url) => { + event.preventDefault() + if (this.protocols.some((protocol: string) => url.includes(protocol))) { + AppEvents.LinkHandler(url) + } + }) } public quit() { @@ -70,4 +104,39 @@ export class AppEvents { public ready() { console.log('App ready'); } + + /*********************************************************************************************************************** + * Private methods + **********************************************************************************************************************/ + + private static LinkHandler(arg: string) { + if (!arg) return; + + // LastFM Auth URL + if (arg.includes('auth')) { + let authURI = String(arg).split('/auth/')[1] + if (authURI.startsWith('lastfm')) { // If we wanted more auth options + const authKey = authURI.split('lastfm?token=')[1]; + AppEvents.store.set('lastfm.enabled', true); + AppEvents.store.set('lastfm.auth_token', authKey); + // AppEvents.window.webContents.send('LastfmAuthenticated', authKey); + // lastfm.authenticate() + } + } + // Play + else if (arg.includes('/play/')) { //Steer away from protocol:// specific conditionals + + const playParam = arg.split('/play/')[1] + if (playParam.includes('s/')) { // setQueue can be done with album, song, url, playlist id + console.log(playParam) + let song = playParam.split('s/')[1] + console.warn(`[LinkHandler] Attempting to load song by id: ${song}`); + // AppEvents.window.webContents.executeJavaScript(` + // MusicKit.getInstance().setQueue({ song: '${song}'}).then(function(queue) { + // MusicKit.getInstance().play(); + // }); + // `) + } + } + } } \ No newline at end of file From d7a8b31684bea93044069943c9204a49d33fae77 Mon Sep 17 00:00:00 2001 From: child_duckling <19170969+quacksire@users.noreply.github.com> Date: Sun, 16 Jan 2022 18:02:46 -0800 Subject: [PATCH 30/61] Remote integrated with express. Ready for backend --- src/main/base/win.ts | 399 +++++++++++++++++++++++--------------- src/web-remote/index.html | 283 ++++++++++----------------- 2 files changed, 344 insertions(+), 338 deletions(-) diff --git a/src/main/base/win.ts b/src/main/base/win.ts index b0de8a35..4bd9be78 100644 --- a/src/main/base/win.ts +++ b/src/main/base/win.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import * as path from "path"; import * as electron from "electron"; import * as windowStateKeeper from "electron-window-state"; @@ -5,8 +6,9 @@ import * as express from "express"; import * as getPort from "get-port"; import * as yt from "youtube-search-without-api-key"; import * as fs from "fs"; -import {Stream} from "stream"; - +import { Stream } from "stream"; +import * as qrcode from "qrcode-terminal"; +import * as os from "os"; export class Win { win: any | undefined = null; app: any | undefined = null; @@ -24,17 +26,21 @@ export class Win { ciderCache: path.resolve(electron.app.getPath("userData"), "CiderCache"), themes: path.resolve(electron.app.getPath("userData"), "Themes"), plugins: path.resolve(electron.app.getPath("userData"), "Plugins"), - } + }; private audioStream: any = new Stream.PassThrough(); private clientPort: number = 0; + private remotePort: number = 6942; private EnvironmentVariables: object = { - "env": { + env: { platform: process.platform, - dev: electron.app.isPackaged - } + dev: electron.app.isPackaged, + }, }; private options: any = { - icon: path.join(this.paths.resourcePath, `icons/icon.` + (process.platform === "win32" ? "ico" : "png")), + icon: path.join( + this.paths.resourcePath, + `icons/icon.` + (process.platform === "win32" ? "ico" : "png") + ), width: 1024, height: 600, x: undefined, @@ -43,8 +49,8 @@ export class Win { minHeight: 410, frame: false, title: "Cider", - vibrancy: 'dark', - transparent: (process.platform === "darwin"), + vibrancy: "dark", + transparent: process.platform === "darwin", hasShadow: false, webPreferences: { nodeIntegration: true, @@ -57,27 +63,27 @@ export class Win { nodeIntegrationInWorker: false, webSecurity: false, - preload: path.join(this.paths.srcPath, './preload/cider-preload.js') - } + preload: path.join(this.paths.srcPath, "./preload/cider-preload.js"), + }, }; /** * Creates the browser window */ async createWindow(): Promise { - this.clientPort = await getPort({port: 9000}); + this.clientPort = await getPort({ port: 9000 }); this.verifyFiles(); // Load the previous state with fallback to defaults const windowState = windowStateKeeper({ defaultWidth: 1024, - defaultHeight: 600 + defaultHeight: 600, }); this.options.width = windowState.width; this.options.height = windowState.height; // Start the webserver for the browser window to load - this.startWebServer() + this.startWebServer(); this.win = new electron.BrowserWindow(this.options); @@ -88,7 +94,6 @@ export class Win { // Register listeners on Window to track size and position of the Window. windowState.manage(this.win); - return this.win; } @@ -96,25 +101,29 @@ export class Win { * Verifies the files for the renderer to use (Cache, library info, etc.) */ private verifyFiles(): void { - const expectedDirectories = [ - "CiderCache" - ] + const expectedDirectories = ["CiderCache"]; const expectedFiles = [ "library-songs.json", "library-artists.json", "library-albums.json", "library-playlists.json", "library-recentlyAdded.json", - ] + ]; for (let i = 0; i < expectedDirectories.length; i++) { - if (!fs.existsSync(path.join(electron.app.getPath("userData"), expectedDirectories[i]))) { - fs.mkdirSync(path.join(electron.app.getPath("userData"), expectedDirectories[i])) + if ( + !fs.existsSync( + path.join(electron.app.getPath("userData"), expectedDirectories[i]) + ) + ) { + fs.mkdirSync( + path.join(electron.app.getPath("userData"), expectedDirectories[i]) + ); } } for (let i = 0; i < expectedFiles.length; i++) { - const file = path.join(this.paths.ciderCache, expectedFiles[i]) + const file = path.join(this.paths.ciderCache, expectedFiles[i]); if (!fs.existsSync(file)) { - fs.writeFileSync(file, JSON.stringify([])) + fs.writeFileSync(file, JSON.stringify([])); } } } @@ -124,23 +133,31 @@ export class Win { */ private startWebServer(): void { const app = express(); - - app.use(express.static(path.join(this.paths.srcPath, './renderer/'))); - app.set("views", path.join(this.paths.srcPath, './renderer/views')); + + app.use(express.static(path.join(this.paths.srcPath, "./renderer/"))); + app.set("views", path.join(this.paths.srcPath, "./renderer/views")); app.set("view engine", "ejs"); - + let firstRequest = true; app.use((req, res, next) => { // @ts-ignore - if (req.url.includes("audio.webm") || (req.headers.host.includes("localhost") && (this.devMode || req.headers["user-agent"].includes("Electron")))) { + if ( + req.url.includes("audio.webm") || + (req.headers.host.includes("localhost") && + (this.devMode || req.headers["user-agent"].includes("Electron"))) + ) { next(); + } else { + res.redirect("https://discord.gg/applemusic"); } }); + + app.get("/", (req, res) => { - app.get('/', (req, res) => { - res.render("main", this.EnvironmentVariables) + + res.render("main", this.EnvironmentVariables); }); - app.get('/audio.webm', (req, res) => { + app.get("/audio.webm", (req, res) => { try { req.socket.setTimeout(Number.MAX_SAFE_INTEGER); // CiderBase.requests.push({req: req, res: res}); @@ -150,21 +167,43 @@ export class Win { // requests.splice(pos, 1); // console.info("CLOSED", CiderBase.requests.length); // }); - this.audioStream.on('data', (data: any) => { + this.audioStream.on("data", (data: any) => { try { res.write(data); } catch (ex) { - console.log(ex) + console.log(ex); } - }) + }); } catch (ex) { - console.log(ex) + console.log(ex); } }); + //app.use(express.static()) app.listen(this.clientPort, () => { console.log(`Cider client port: ${this.clientPort}`); }); + + /* + * Remote Client (I had no idea how to add it to our existing express server, so I just made another one) -@quacksire + */ + const remote = express(); + remote.use(express.static(path.join(this.paths.srcPath, "./web-remote/"))) + remote.listen(this.remotePort, () => { + console.log(`Cider remote port: ${this.clientPort}`); + if (firstRequest) { + console.log("---- Ignore Me ;) ---"); + qrcode.generate(`http://${os.hostname}:${this.clientPort}/remote`); + console.log("---- Ignore Me ;) ---"); + /* + * + * USING https://www.npmjs.com/package/qrcode-terminal for terminal + * WE SHOULD USE https://www.npmjs.com/package/qrcode for the remote (or others) for showing to user via an in-app dialog + * -@quacksire + */ + } + firstRequest = false; + }) } /** @@ -174,181 +213,225 @@ export class Win { // intercept "https://js-cdn.music.apple.com/hls.js/2.141.0/hls.js/hls.js" and redirect to local file "./apple-hls.js" instead this.win.webContents.session.webRequest.onBeforeRequest( { - urls: ["https://*/*.js"] + urls: ["https://*/*.js"], }, - (details: { url: string | string[]; }, callback: (arg0: { redirectURL?: string; cancel?: boolean; }) => void) => { + ( + details: { url: string | string[] }, + callback: (arg0: { redirectURL?: string; cancel?: boolean }) => void + ) => { if (details.url.includes("hls.js")) { callback({ - redirectURL: `http://localhost:${this.clientPort}/apple-hls.js` - }) + redirectURL: `http://localhost:${this.clientPort}/apple-hls.js`, + }); } else { callback({ - cancel: false - }) + cancel: false, + }); } } - ) + ); - this.win.webContents.session.webRequest.onBeforeSendHeaders(async (details: { url: string; requestHeaders: { [x: string]: string; }; }, callback: (arg0: { requestHeaders: any; }) => void) => { - if (details.url === "https://buy.itunes.apple.com/account/web/info") { - details.requestHeaders['sec-fetch-site'] = 'same-site'; - details.requestHeaders['DNT'] = '1'; - let itspod = await this.win.webContents.executeJavaScript(`window.localStorage.getItem("music.ampwebplay.itspod")`) - if (itspod != null) - details.requestHeaders['Cookie'] = `itspod=${itspod}` + this.win.webContents.session.webRequest.onBeforeSendHeaders( + async ( + details: { url: string; requestHeaders: { [x: string]: string } }, + callback: (arg0: { requestHeaders: any }) => void + ) => { + if (details.url === "https://buy.itunes.apple.com/account/web/info") { + details.requestHeaders["sec-fetch-site"] = "same-site"; + details.requestHeaders["DNT"] = "1"; + let itspod = await this.win.webContents.executeJavaScript( + `window.localStorage.getItem("music.ampwebplay.itspod")` + ); + if (itspod != null) + details.requestHeaders["Cookie"] = `itspod=${itspod}`; + } + callback({ requestHeaders: details.requestHeaders }); } - callback({requestHeaders: details.requestHeaders}) - }) + ); - let location = `http://localhost:${this.clientPort}/` + let location = `http://localhost:${this.clientPort}/`; if (electron.app.isPackaged) { - this.win.loadURL(location) + this.win.loadURL(location); } else { - this.win.loadURL(location, {userAgent: 'Cider Development Environment'}) + this.win.loadURL(location, { + userAgent: "Cider Development Environment", + }); } - } /** * Initializes the window handlers */ private startHandlers(): void { - /********************************************************************************************************************** * ipcMain Events ****************************************************************************************************************** */ electron.ipcMain.on("cider-platform", (event) => { - event.returnValue = process.platform - }) - - electron.ipcMain.on("get-gpu-mode", (event) => { - event.returnValue = process.platform - }) - - electron.ipcMain.on("is-dev", (event) => { - event.returnValue = this.devMode - }) - - electron.ipcMain.on('close', () => { // listen for close event - this.win.close(); - }) - - electron.ipcMain.on('put-library-songs', (event, arg) => { - fs.writeFileSync(path.join(this.paths.ciderCache, "library-songs.json"), JSON.stringify(arg)) - }) - - electron.ipcMain.on('put-library-artists', (event, arg) => { - fs.writeFileSync(path.join(this.paths.ciderCache, "library-artists.json"), JSON.stringify(arg)) - }) - - electron.ipcMain.on('put-library-albums', (event, arg) => { - fs.writeFileSync(path.join(this.paths.ciderCache, "library-albums.json"), JSON.stringify(arg)) - }) - - electron.ipcMain.on('put-library-playlists', (event, arg) => { - fs.writeFileSync(path.join(this.paths.ciderCache, "library-playlists.json"), JSON.stringify(arg)) - }) - - electron.ipcMain.on('put-library-recentlyAdded', (event, arg) => { - fs.writeFileSync(path.join(this.paths.ciderCache, "library-recentlyAdded.json"), JSON.stringify(arg)) - }) - - electron.ipcMain.on('get-library-songs', (event) => { - let librarySongs = fs.readFileSync(path.join(this.paths.ciderCache, "library-songs.json"), "utf8") - event.returnValue = JSON.parse(librarySongs) - }) - - electron.ipcMain.on('get-library-artists', (event) => { - let libraryArtists = fs.readFileSync(path.join(this.paths.ciderCache, "library-artists.json"), "utf8") - event.returnValue = JSON.parse(libraryArtists) - }) - - electron.ipcMain.on('get-library-albums', (event) => { - let libraryAlbums = fs.readFileSync(path.join(this.paths.ciderCache, "library-albums.json"), "utf8") - event.returnValue = JSON.parse(libraryAlbums) - }) - - electron.ipcMain.on('get-library-playlists', (event) => { - let libraryPlaylists = fs.readFileSync(path.join(this.paths.ciderCache, "library-playlists.json"), "utf8") - event.returnValue = JSON.parse(libraryPlaylists) - }) - - electron.ipcMain.on('get-library-recentlyAdded', (event) => { - let libraryRecentlyAdded = fs.readFileSync(path.join(this.paths.ciderCache, "library-recentlyAdded.json"), "utf8") - event.returnValue = JSON.parse(libraryRecentlyAdded) - }) - - electron.ipcMain.handle('getYTLyrics', async (event, track, artist) => { - const u = track + " " + artist + " official video"; - return await yt.search(u) - }) - - electron.ipcMain.handle('setVibrancy', (event, key, value) => { - this.win.setVibrancy(value) + event.returnValue = process.platform; }); - electron.ipcMain.on('maximize', () => { // listen for maximize event - if (this.win.isMaximized()) { - this.win.unmaximize() - } else { - this.win.maximize() - } - }) + electron.ipcMain.on("get-gpu-mode", (event) => { + event.returnValue = process.platform; + }); - electron.ipcMain.on('minimize', () => { // listen for minimize event + electron.ipcMain.on("is-dev", (event) => { + event.returnValue = this.devMode; + }); + + electron.ipcMain.on("close", () => { + // listen for close event + this.win.close(); + }); + + electron.ipcMain.on("put-library-songs", (event, arg) => { + fs.writeFileSync( + path.join(this.paths.ciderCache, "library-songs.json"), + JSON.stringify(arg) + ); + }); + + electron.ipcMain.on("put-library-artists", (event, arg) => { + fs.writeFileSync( + path.join(this.paths.ciderCache, "library-artists.json"), + JSON.stringify(arg) + ); + }); + + electron.ipcMain.on("put-library-albums", (event, arg) => { + fs.writeFileSync( + path.join(this.paths.ciderCache, "library-albums.json"), + JSON.stringify(arg) + ); + }); + + electron.ipcMain.on("put-library-playlists", (event, arg) => { + fs.writeFileSync( + path.join(this.paths.ciderCache, "library-playlists.json"), + JSON.stringify(arg) + ); + }); + + electron.ipcMain.on("put-library-recentlyAdded", (event, arg) => { + fs.writeFileSync( + path.join(this.paths.ciderCache, "library-recentlyAdded.json"), + JSON.stringify(arg) + ); + }); + + electron.ipcMain.on("get-library-songs", (event) => { + let librarySongs = fs.readFileSync( + path.join(this.paths.ciderCache, "library-songs.json"), + "utf8" + ); + event.returnValue = JSON.parse(librarySongs); + }); + + electron.ipcMain.on("get-library-artists", (event) => { + let libraryArtists = fs.readFileSync( + path.join(this.paths.ciderCache, "library-artists.json"), + "utf8" + ); + event.returnValue = JSON.parse(libraryArtists); + }); + + electron.ipcMain.on("get-library-albums", (event) => { + let libraryAlbums = fs.readFileSync( + path.join(this.paths.ciderCache, "library-albums.json"), + "utf8" + ); + event.returnValue = JSON.parse(libraryAlbums); + }); + + electron.ipcMain.on("get-library-playlists", (event) => { + let libraryPlaylists = fs.readFileSync( + path.join(this.paths.ciderCache, "library-playlists.json"), + "utf8" + ); + event.returnValue = JSON.parse(libraryPlaylists); + }); + + electron.ipcMain.on("get-library-recentlyAdded", (event) => { + let libraryRecentlyAdded = fs.readFileSync( + path.join(this.paths.ciderCache, "library-recentlyAdded.json"), + "utf8" + ); + event.returnValue = JSON.parse(libraryRecentlyAdded); + }); + + electron.ipcMain.handle("getYTLyrics", async (event, track, artist) => { + const u = track + " " + artist + " official video"; + return await yt.search(u); + }); + + electron.ipcMain.handle("setVibrancy", (event, key, value) => { + this.win.setVibrancy(value); + }); + + electron.ipcMain.on("maximize", () => { + // listen for maximize event + if (this.win.isMaximized()) { + this.win.unmaximize(); + } else { + this.win.maximize(); + } + }); + + electron.ipcMain.on("minimize", () => { + // listen for minimize event this.win.minimize(); - }) + }); // Set scale - electron.ipcMain.on('setScreenScale', (event, scale) => { - this.win.webContents.setZoomFactor(parseFloat(scale)) - }) + electron.ipcMain.on("setScreenScale", (event, scale) => { + this.win.webContents.setZoomFactor(parseFloat(scale)); + }); /* ********************************************************************************************* - * Window Events - * **********************************************************************************************/ + * Window Events + * **********************************************************************************************/ if (process.platform === "win32") { let WND_STATE = { MINIMIZED: 0, NORMAL: 1, MAXIMIZED: 2, - FULL_SCREEN: 3 - } - let wndState = WND_STATE.NORMAL + FULL_SCREEN: 3, + }; + let wndState = WND_STATE.NORMAL; this.win.on("resize", (_: any) => { - const isMaximized = this.win.isMaximized() - const isMinimized = this.win.isMinimized() - const isFullScreen = this.win.isFullScreen() + const isMaximized = this.win.isMaximized(); + const isMinimized = this.win.isMinimized(); + const isFullScreen = this.win.isFullScreen(); const state = wndState; if (isMinimized && state !== WND_STATE.MINIMIZED) { - wndState = WND_STATE.MINIMIZED + wndState = WND_STATE.MINIMIZED; } else if (isFullScreen && state !== WND_STATE.FULL_SCREEN) { - wndState = WND_STATE.FULL_SCREEN + wndState = WND_STATE.FULL_SCREEN; } else if (isMaximized && state !== WND_STATE.MAXIMIZED) { - wndState = WND_STATE.MAXIMIZED - this.win.webContents.executeJavaScript(`app.chrome.maximized = true`) + wndState = WND_STATE.MAXIMIZED; + this.win.webContents.executeJavaScript(`app.chrome.maximized = true`); } else if (state !== WND_STATE.NORMAL) { - wndState = WND_STATE.NORMAL - this.win.webContents.executeJavaScript(`app.chrome.maximized = false`) + wndState = WND_STATE.NORMAL; + this.win.webContents.executeJavaScript( + `app.chrome.maximized = false` + ); } - }) + }); } this.win.on("closed", () => { - this.win = null - }) + this.win = null; + }); // Set window Handler this.win.webContents.setWindowOpenHandler((x: any) => { if (x.url.includes("apple") || x.url.includes("localhost")) { - return {action: "allow"} + return { action: "allow" }; } - electron.shell.openExternal(x.url).catch(console.error) - return {action: 'deny'} - }) - + electron.shell.openExternal(x.url).catch(console.error); + return { action: "deny" }; + }); } -} \ No newline at end of file +} diff --git a/src/web-remote/index.html b/src/web-remote/index.html index 18695a58..8fd381a9 100644 --- a/src/web-remote/index.html +++ b/src/web-remote/index.html @@ -14,9 +14,9 @@ -
- -

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%0Ap(|Zcd?V=-Bx!lcH$h;)j-h#E1c~zSP!5lD)*@1 zw$8*J)FZ*)vaYggMZqiy!)cXT4mMD%&ZBsqV?zFFT1yDmARL3m6a(G zkB&!Gm9k&ITvdzf>sEtnE(7%S!wA3Ml{!w6AOgLL94Y2Eu1X!JX9H`!%=I2bH_bY7 zODjJdJ5aSa%LK z^ETlRV;r$zV7B+mep<>l47ao9J0I5(+RwNPL)R8=qO2|nfjH4-;|Hfliju;_L+Bj ziD8-sxWJMZK|3-2;$*VwW45QMgyCfk z@%P*uan3b@PgOH$eCcjF`}EjDk?kAj)TD%0!hq4I(@8>)@72tD9Dd0Hvv2F3iy?%c z#Cw8jc~<7$JY)&Ri20LJd=lQRNKaR*nw1FIG&MszTl-D&S;%fv%co1*9b0|Uz0^*R z`6byA2jz5kzKLQHMwu=p zvK(qWaixVa%H6zM9*zswO6fiQ;G~bGxQ{<$LPX}PT%SsuEbhr=`OfVPEWUWydleK&{pUCHI__1#@+0NV)5`7Dfpf|q?Agz2H;zu&U2&OS z{S6dle;7J+xGis!q#*H>Vp-~|;azr`(8H$*Z7x44uBc`KLecO56brpAG-T}zS#+N= z78nU=L#BSvAu&40jt$kFlfYsw#>{X(=vg09TD?X>Ruv&zuCr^Ntm)spaPwr)9Wfi`% zF5#-~UCQ%Mt6$5L6F;Az-v@q&+9?gF?3ej1II#SJ=lD%cfIm@o_y5++-;R$jMd5yV zGOxoLr;R$O%Vm0%N~ z(x{vPOxvnvyb~L}q14w4#S6u4wg8C?w|y7t*RnHpL&y81ltyh&F2ar4o8HR;jm^BU z$ye=SA)_EczYKwTpD)dH^?~F{FlyTZ-GL_5L-O+?fAZ{TXE?lG&3=Orh0kti z-Xcu(XmJzD}*^F&|q zbhjai*^j_g^NmFl(+=L`gq+J;EKba!C{4`oZCSBH3c_@>eY|hxp2N?nTrIOK*+#+b zJ0X$caI+^oM+}8vM^H~WbdP2U=K|Zpo^(Uoj6-Gw3VmHIT#=K-@V*Ca zZtt`G22C5sVVJ1X@8Xy(QkYxWP)D_6NN%hW19+a+cE#QBP$62Dl^sT6abz7 zqJ!BRaAPb?qwiY^$!F5^POzWn$`ooMseK`hHsX%~hPIN;BHqI)(Oqx$`(?FE+=EnYhj9C@24D>+dqLT)vF{ zJS4hic@oh4wpHf@zgO>}`{WA(%5a=P!qz3}(RJT-aT(0)6Jz&Ku5boEmdSuPz=G(D z2)`~9YDfm!=1q0=&U@tZvh%l_I<91iZWp8- zJ}ZaZ5i#Qr>`vya6mhwVex_?oVTv`Q z;k*}=Muf|B%^KwGuv@=%krs)HFdQTmoAyK{HX-%4OWq2w)bHIII+IWL2P{^^^YPv1 z8pu|c+4v_3KY;qb_X)@qrzUWc8r&iK&kdgm=K69jUlugw5A$(EH@*8UEBww`Jo&d@ z9-l>G>&*lc2j?b7;G!Dm%V_Zj{ z?pIFV+?yNvTc5+i_F)bv4R$ou9y9V9S`BVn6X#Um-+1@)f3_p7!QQ400sPwcT6tlh2-{^I?t`5Q(SFxP=a z)iN!w&8GHd>ULtGAHPIHdyr)9D);)GW5Fol`_Bwv&Qk|>QaKw9T7~wBlwJ$5PmB8A z^G)jw>*Cn;O7mrAYhdN_TX9YYN=JQs7uxieBh#X_-|+{nCpXO$E6&_8*3q5Kg1kLe zRin~XU|nL=UI<p=<)YpLO8J6KJ_nMBE}IV9k8;h%{@ILJCYahI1-irKfV~A!azDWRrNDoysm4&dA9KAm&(xm>0t=TTSiQq?x zWja*ze9o072V*bdm-kNZ=n_35?kk*H&UGQ5cB{jxETn0X4v0cGy(fvV@dqvS1bD8y zuDs0J+i9%b1)&qZSk5`%>kslbpn3#$jB?(D@d% z*)zKp32jzp_10HxW(Q6!E-s~&6&?u_)Y2<#m8tTP*sb5)#$25UNRHXA#*T>&PSukH z-3p4)F3f$MpQlT4w8i&<*A#h@*j7}X55O_AboFB53Q@|-YRT*o)zq@meP6LC--~ScUCVOjPNxvo2YAISTtQM zRV%~>Sol}iOT~)yV>oT2z2G>w(3jlOP_hp%uc*2>yM-3sj~dey%SF< z#79ijQcyk+L^cP-?LJhE3vvy~C{C@Fpy|?OftAS*8l!FPwv$O+4}C`+KWxOZ2IzLa z1Qqb5K-vrfPJRxn5dJW}i9x|YnWYzpBwBSLTsh+=nlQdC94HvQVbE`<%g@Z^kFI_m zAu@?$gz_rZwdQfM*(a;{WoF4Yk$$rFrzh#Yiv$FQB<<{uQ5=Aw&1@+{LA#6ycX^yNwH;#&v7C zfTvHbeheKg;)hclxaj20%(QfVxPd-u77+tVPz|4bs~kfX=FX&4Qck9+)M=LR z{NvFh;$Q`N#Dhsw1THtM^u1hkBdIC)@snmelS=Y$ur618M9rk9(h=g}4taoC6wsfG zZc*6uiMTqtV=_+DkhDoO5|(%$kBs0YAjiLBU=~K4i}ictvrR{LjK*mtDsX+wYT>WJ z%%_1r1V@o2+0LIFIs&@|$1!ajn{k}OJ_RPD!_+Cvu5&N+f6e@A|`|V9Gg@58<&f#CnWy5M!3JSA8aD0Ft z8w=C}!04Y)AR~Bq7!XS`G(Nm=WZnAzzkva=Xv;CS0pri8<(OEmRM0)+u){pbEJpZa z2+(Qfem%9+Jd*xyNrq6wJvzpb_*8}ACmR}MDKFpPr!08+`j&^Ug<#cz<9!Z;z)@ORQs~sPs;6Z)WXDInJ2L|*)VU&tw;;tmpLu300iba(%pR8 z!@Ul~$Zd?{mSNBD+K(F^QH8w)V@hNRJs&&zP$ao5x|vYprX`N4&S{wHRAJq1M8ZwtIw^LE z9UnqFXE^s#chH^T)4Sk{PU zFEsT?0z=<6j#U`MfN(u}3{T%*_tM@t5Xy*np&c42J|+lGTOZ#jLQy#94P;4Gum>7I zb-7pXrq0W7a!9ft94;_2;d7I`b)|$`QGa`)>LoF69c(d2j{*#;*3i{zcMaP?ZhZO8 zWmDbFm*IAa39%YK!i6dDoS}rAD96E0JyQ$0hS@rBmc5-fX=)LcCzm8rrs*^=v@2tN zJeI|o&oK}@mJj)n!1+FTTl|dwG81%who-Y$?E+>RwuK8Ws4A^}N|?t}LG{)M1<(<1 zMCYa#h416S!9JN_NzYMk5w|<-JSJjv1qBOR2h?<`-=o)@X7F7yRW<+QR5hZr6uNll zYCArmwzGzB^-p#s_BQQ>H`FQ)TuKFlp8Q`dDagw%3@WG^B&RhQV8CR!V^z{#EC|xMc zSe!vocO{3duj^|M?WrVFrZx!Jo3R~|?~-1;c*l7#L0D?UGQ_W1X6i@9O{eglA7ZHd zeVD+N1qrbsuU;e44Y8T}6>saSInaEC*IMb(!|~?q(gls!pn1+BIL6)&hY^tRCUu)B z?v#SeRGH>+D~F)@oT31z=Z9_*Zv4r-Oz|s27lmhbiL)GxDKAC-Rs@1=Ny-tpD58%u@x!tQ)phD=;_Em8hdtSjpwC=&pd)$e z$@gELsy{utKWTxJ?f3pTFRb5df0=mC4+T*Oyq}e1OB9!!j0*_E{;|_E-Wb0wT-L+3lNSvawc%Iw)CfECD78sB0$uM^L+M$6%HBm#GfCu~C zCh%#v0@AFw8Uv;?5;V4lji8g-<3o4+bmXPZ=0Q}Jg>jz@qQJH6di_;IxPw+&CRt01 zq+v_$AE_+k^xwUeTIIw0o`gX!z@&76?r-nixlswKrxzM)@sxhC439tI&s3S%&b0$Z zXkx=zD6}YLYZ{>zN*Da8#)g;+uX?adc*FJ`dYTykrtDgfqqwnB1??XIvwZ@z9Px*P zM)?(|8=Z!jELaEeN{5yaL%By!ipH_FmhO~bjLQB^ci$YwPYy!yyMa)RF@^kGMK=4Q z532FXb^_T@K}aFUwZbmA1;wG<&1J)$X+!Y>72szU=`k3a$L}4&E5PIx6Jd*RW8e*8 zzA@3)1G8m`x7B)qzxSModcJ&ub_TiW>!&;Y#(Ba>A^U21R~dr3pJAc0FagCtv9}1T zS}oA?4nf&~P$u?yHpD2Z3GT@@g$+pID!bK7OpzJ2VJflGL&r0rR$MYP$Uq&VRFmEF zy#49;nynigw{!jwm`$U0p`y`sk5R%WiE8lSA`;70r%6 zIl1X0#sVIOw2?L5g1vV9(i&Ad z&gkGV{Zi$OPOltFvlNTz;xh3kBt8QlXubZj0+b;;eC_$r+($WeF#&eu(+#-nz$eR@*@Ki2HCi)q{s z-x^gg{p}H8dGj$J(hQ?n9-_VB+a;WaSeH98W+ z6>S4p#1Vl2#w=L?0J*%y1gJmC0f1o!9)OW-#Zkp!l#K;IqCN2|6quS>0m(W-K)(IifD7AtKXDI&BPmvH*;(6jSBS5togfT}Cguem!kf5Jb&`465avp`BCUTg9;Tl(7PP?qr<|4t0Holg1_6F$W$gjzFJ5r~*JX(_0KTIu3Gmn+ z(*qECI^h6=p`QUfFPCp`z5wX1-UL9W-xvTgjid$;<$jxhaEdT+6&rH}Jb-}>w+19r zslnwJ0G#=zBk4-L)@#7|>r5oV)@mR4{h}LqhzLUfz-N;K;D`1!aA8#mAVR_cpxF8r z=+-^~rj>VqRmC5`Z-qr*Pi_wQD?115$}9rgQft5uiEUtB@(Actx(2EZ9)W1TN2`3` z20jG*!)1MyxkIwB9(C)0L*8FNzsv&?(|Id03CsxH0-+(dg0sMoI08x7I%3(^DVIUP zQW18EyMP>D;2~*u!RR0~Q1}LUbdM$PJ7m1KOwxZgI3e%$$83>#;MLw@on6<_^sJ_4 zx0$5>#oqLyVI9rw-`y&n;4c63MOL0gzm46r^fzHNZhWE3-0}*tL07#O1-%Lk8)m2< zMpCE#E@AS`$fhiujP9))&@jDo4Ezm8Z4tbg% zV4vv!VH<}A%{^iM{vXyD`v6s=5lD8K=OEbuA<@9^JO{*4PtbWM0ju03*Bw&AeL&=! zX;E-UzWEoKWtI~h^hqVh`x^GlK1OP!sn2^Z5@3eqP3DU5~klg=zO#on= zgN47rm;^pywGgDv&;fw01OXhmybinP0Zz?66c#ePt9 z=u4mJN}nloUlf@?)O@^|t_!+AmI}=uAkxZ}(t+(O+e@b1 zx4TZX=d+8*eBbUW$eUlbW|72UzZTd<&Vs|#)mL^nZv#(nXv_J6ey>O$b7VF`QK}rw zZE=Z=u+44T7c6#h-}Oo3T_SqY5uw}{&{ia?cUju41OZ24e%Y^~h5NV?4boFc7%{;^ zDAOG@o=gbur!`R?+5-aKa|@BahKjAzE)7a2((mbnXCXo-2Hvr zt$p0;zqm-s@Pt&(BI>&2p=h!|@M6~$`xo7iJ({c4CbNsx0Nkt9fP{cKxw@h;Q1eye zC$sbFE1HXiaI?#WxOM;aqILhHl6C*T`jh?zX~@1`W~U2sug<5Chlf&V{N}}Z&PFJU zAXvmZa43l?C2`tctr?-6(qof_QA z1fWybFZC!m0Th~FQyl=W-!HQvLAg0EkI8NT-P&sXOOgvfzq-WqkmLc7>W}st7etWm z0|r%TPP5zyf)haLb6`Y+)-RezqC-Hs&mkklwOx6Q=^p(apx=028t0vF*{InkJ;Srk zxI_LAqI-vifIJc(APA2QD<6f%0qZ>Ah{Z8|SnO74CNu=8Fi4^Ck3wn=QhJaIl;k!D zzxyM&eIq-FR4AlW^($T@g$t=)eRyS}Eh01wsfI{V z{QP|XpGf{O{nBLp7pa{{2|e>mdqj%r19-!|9x1o~sV&I#E!BVeiv*~<`rsoq87a}& zLvOl>Je;uy!`lC8_&*8%r|Q>bNz)(&XI02nR^}eHwI$7e+K+SxS~!nWB_%uP>V_&9 zi&f=||2dBT{03N1N#QBl@6OMk_c2AKBm}V^SHJc3tw5d#{c}P8p9lKSNgmKBkSzv-m>j>M~!Fqi2Y~BIC>=0p&966$8IuE1F7<`uQ1|7kpc`1p6VWpw?wej zda(JSL=(Qpfb&3n2GtC{r}CVa7bq=KLFqw&Um{{Y=^S-8I}3f@4>T2Cx-5dJ+wpcU~KSWLXT*yCw`Ors$t& zlQ^p-hCL9JTJ$Ee8}SbjRb!Q)YRWnEu1;|nxnr1cZMn+=^wI#y_BYE#Zm!h6$(EGJ zIV-1vx~`%#sE2CshQSHcks;W^;2dft7QCT<1vQ}vwm`njq_AE=RgwF8N4OE;5}DFd z(|3^U{(&v2jB_YAYH)txC6wi5FkRs>ltw=|zu*!|LL5woe8EAEcH*2-?OlWE^3S0N z=ivP35B9-yW#`btnW$6fcC|E~-7VzR0*7b&=X6gkL~Y6 z6<27Dni25A16(ST;QXmeC|V6N6Zj4?`4?C4Rj`HML+I84ZuKIq@~hwtlB?;i7TklP zuI7)I1%b`!mxX~=HJ0R#KWVGR$ngm-~;hgE^AuWqe=T+IZoJq>JFymFvDUk++c zxGOc^zmwXD>-vKG@7?ggAJB(Jo`1VxU-sj^?2`sAlOhk?l}?3}Mh3;dy~&AY{oitz z%LBYU@L);=VFR7d<>fJki&G`&x3rMqCuEHpG6r=O!}QX2B+vgS@W=%4L_WUtYPr0q zcBa$b)C+A3eW=PNA50x;efarGykA92>@i|eU;As;B_}aPO`U;Wx*qzmVaMg8p_xQLNNa>0`)IUWs@)I5Qlx7xf!iMVE zZL^;;pj$kwBx`}|SS7fNhCP2L+k+CPX;{4s4AFEDGT`o@2cbhd4 zbC)9E)}w68)t8%2ym~26$FtC#itP5-kS*VrK}k8@e)+W=q_&RFXNm26*NQP&Si_*@ z9`90hgdia#jabnDnT0%N4HiK@FCIoe0PEoezyQ_&FA<6k9#jU)I+_ng21%7wKLUhM zSZ6bKT?pcyJr&-`=Mx>XdK&0(G&8$HAIO+FnSU39tayk z@2=5%^Mn!&P<`3**U{41WzA3q)H`TGW9TnaoD9@fGVlCoD6QXhy$tNq%12@7^GHyf zX+UupAl|7fazic)V$kIX1iw=JD0Nc?)IiBv>JIwL&!2va+dc}S)jGJs4T8Eg>EYQw z@cphJQ1-t%umO+aFd~rMJ14P}w9`|um*PXs*JKX1&F8`*3T5*zY3l<9n9maV(~FD$ z?%-v9#0TPwMk(^J0y0b;56CEe*g9qL#HdnB7GB`h_rDeRNpJXa2ZQqy(G)Mvm`oE{ zJ>zu%EOjbc$@Wt+O{#wnCccPH2w*rt)<p5$qM;L76|r6drSQufgOCtQd+bqF>LvO)<8 zf4ub=lsYsdgMD8fn?u(@bt8~Er0+v}D+qdXxVxMC_ST~XjI;mb>|Ua`uhK;5_aqW3XlTgdyxqb+W;;!?(^<@r68 z$)jG+d_6Ie{iS2vYid{sw*Lm@+ycpP#jFBbB*`zTY{HXDB#k=BFI}?;wT!Fy(Y)G{F)-sx{lu( z1waFtD%mR+RZ*=w$42Pk;zoV8rD~LMrKMWd=LSPH z9`fL*-e2!rj+#W^fEWl99n@w;*M!k-*F*P^HAF%7<_Ux#FT^Ml#L-iao@UeXSt9Ds zFKF@ipF@k)bQ%=ssUWEkf#^av)MBr=M@~_)pfv4EV%w3zL?&zUArTaAJv}`jwBh$M znEluLOTzmTUOl_dXCZA`@IbTOkT~uk#<+$V)rZ$f&tCKz8bVD_WEJaFWe_%Kw+2FO zOuQQ~GKT!(Cq^!yK_xAJ5YP#L;##cXVMcUczQY{wgq}K+z+d94V$X1=E<(mV7M>Qk zon1&z;{57XISCs3KdtIr%mI!ZEE)xXL;wU@XIBRVKIu2Cg*ToW4kR6_l-H))I>;yr z;wV6vJUnpEPw8nke%^oMjcbdo5vnLC{MDP9mdKQh^cKuV;y*yMpe)cX2>vAD2JwgJ z)(c#bx`UXke~9a#hkr4+{%Kl&UInXGv65BrDR0N0geHy5qaaRo+NvV}C&CZ%Jk*MXEnd$Y*EL(cC&N)%A&hE^|}Mi3P~g z!>&Pk@$dnzD!8jCG->ZpiCO+y8rSKLt}*YJJvF#Jyx>tENx|EgdVt6>UYVC&7lF7P zm=4gi2P*gcHN|kI9v&5=wMy3*j4XobH8-Q^dF)>@jwBVxyLVI-)`2N3trB)jDZIoh z$RTZ7GulMzrW~Vd6`1*-JHH*Mto#v)l_1s8>N9^empi((Fv!9_V`_YOxWgD-ZfVU- zE%?xnQYo9wW=%u z7PbCndPBRinxLi12v9|=sz6TU&BbRD{@USBEIY^sHr&?fnfAThH;%G)&lkz&m>a^p zW6ebGm^^DNxmP1;-mg`&9Br&S{kAXtAyRGWlyy{Hd!mtGXf4L!$$0a?2W`t=Roa%p zUk_rnEyL^YawG)O%a2kNmK#XK^cj>)IUEswF zhll7b`P;|!`GxGB%Of*4zYnJlU*d{CE{2W1IZeQQ_1IO#_M`Qsd4Pz-HG9H#S?H9s zly>Ne{wls+(2?rj>4kfYcOgTbU09EJ?g(-ThAs1=Cj0dd3yZuvq}i>G>c3wu1t%}n zeW5T7Hpx|!6sG&s_VBrk(7Wz~HQOVfYWLxA?3}c`9>fYEfgjK8DE3F!uvq9|X1X{I0_c0xi}))kRoQJrrtzt3N)=H}@0Gk?3G4 z(j3S!4*+g$XTw&oJ<0Ck8s-zvShvi>yWX?EZ1Nr#NBtjzrxyntseg`M zM!ozH^t)yXzGse~{orK?q<)AP9eHInj+ll18b11%oT=U&t3j(w&2yMz(-Vf*y_ct6 zZt}kK>*e2CjCVT*ku%c4PkZ#}r3%iaU$6 zINZv|Z|Avi_^m^SC?y_uUiV>IB#Ulg`5OnaCak)?Qd-1C z$u=hn)4E8ZxEI;iESuoLXh%85O!jp6!7bPnj8H_+4ETVrKFKd!5>~l^wq(cGf*mS&KT2hn_ z+voa1)TlNrejI~5E1Als^7_#m&9k%aGlWyc&yN$HF}E2Jl}&4^cosN7Xc&luM_G|S zrb6og&ztuF8oc_(vwwa*a1WzkWZpb5;^a`=& z>izGTYr9RecZQ?QPCeb?egdjbmQnLEm%g+=HO*~<3teKI~ypDSV| zYCKqSCAIxsO2B%#OZ$;n9x+$|wt$(tbKt{3OVz?^RXX!(`Il=X==P^k)aTh5us zW^lYv4+`UZ-rdFJbI2$zKyfH~|CdY-wM>Z9r91waDR#Bob`uXl=)KoF0)ZBJl6G@H zUCTmmSydj^AmV@*wdWZRlPvTvNYM+K&Ol)n<&Bmc(Z&kzbPf7LfK%*uA!P6o;%Nv$ zJ~Bz*Uo`|>ELi4UAKg2KK_vJdNos>c%M6BG;Ft}p?90TmNXX9M#5+h4PlmWqr$5(l zodwfMA^va*<)1Pt`EWA&Dz#c|IT=eO)Z?;@-E2XlIO}+#Z!9OU?Hcl=9$G!b^y#y! z(P7;)o&CV-w4OyJhr`_4#86SMjEt}T{t@=3@7@!LFO!rNeu&X*Zi^5~^R-G2`}z|< zUh93UqvFKrp~G4OblHziACeHkAhE7a9o_h!ttS) zjG9=N5lRD9Yf+wXX8(90o4g4w-=A70qwk2n{oTS-_w{*0tfv2mqKN+)*~iM@Md!|H z=mD1e{_yG;d~!<5=8#C+5JGOU^kU^8IQcnP?_+$VY8uwDK@bLg0dD9s{)zq^ghpKhnx7^p~zy#z6zA;s)hMrzn)8ray$G**BXWT(iwcE1tDiK9Ph+_2WLjYg^R(SCl?`Z~yi!gH;zMMVEPa=uwP zS@8=&<0{KR6Z+SXbTopHhGjw?4~hfNR@Rh|boIuV+$Y}g(7a;+MPysfsC6dN)8s}W zSD0qn2<1wVCgFU>N#k+(A}mQtS=gRdt(28Of_8|!<# z`T)xPt1)=_L7tZ?Kd@zLt2jmK`Ib)(hb>|TCxpk;U?}`4>Y7|qyckLsHQxM#WfnO; zE3O%QbTb4(@}Usj1|>K{w-u7g#MVhG;(1^!0q{WvL%v)}LWbBqZ3d@_%l!U+=C#Afb74~gGVcTnLDMHA3f@K9-6 z>y$xu)$8=LRpH*@!hH6NVz7s;NfoOloBDS(u8Tm0ksPenPRfiD7HEPf>xnVt^m>-c{PN2KS0BpL*c0CZ(E`|G*w?Bkw!NXj#`O4!ipWlnq;1dd z$(C9?p6Yb1P;@p=b-A~W3;cny8YC>HcY zYaAh064QfkuEDWETvEwhX-JQ{!1X~ChR8MbI(hamqrym+Girz91$om&4kvTF`S^MP z!sxs4ezxkmc;e416M?oId?CeC!ne@{dE5=JdVQx*?m|XCJi`tQ$2rZetwjsCZ|#T| zM0c4}Y2a4u_~@&dP~aG6w( zvYibzf2*={V*L@LO@~@lB+#mY7Qs&NJTut@xm2_j_(%K;s14K!(rV{!^TX4+=g2Hi zj!tt;Jg42JgYj<*tZXYDEGAa$DPPwO`xUo?@`iZT+tR=K-Rax#=Yvl$#S#$u&dFe^ zralUc74xs_bNG41Vh$90Y3dKL;4JqzdvFLNpKF92wp}Q$hNVDg4iDH&(p#2jM$6qK?acexI&P^2k3QMI%pW zRpZiEvBo8ApS~XvFmoXsPg(pe?3zXRI^ade6R$;P^Y*_O0-qvzf^dCa^g9UdRUKt@ zagXO#daij1+iZ~vfD?UTp=xVweSw(^ZRAPJRFv|K8Azp ztn!C;a#NGJ*C&4q+qRrHaaRHw`o0`iZ>6p5d*@#(l+}NAyn7-sY)$8J`tZ+U zGkm4{%J8t$=a`h2xPB_tTj-o)JPnq2%qj6$G;28zS=snuMBUBk&*1XN+jaJOe+J+o zN`e`U6Ky=++@X8V%3dar*z0nU3iOObQ(3@H&@Onmsuy%L?QC%;WOGZWBNcD!Zj0a$ zbB}RsX1T6<#-TQ=UxqTwCH+6w-Y9-z_iVsoIrP>P=BiF&8gWvh5sV-Wq zoA(@2k-IXdS<(~3s@T*utM%`K+U58|al(Uk36n2~L?|nq%)gfMs@vLL3b7W&#mD0G zt~LExTua0@%iqM!&N9`{j5FW2Y`|B*A&d05{(wG|Obi9*R0!LedkVKj-%QhJtbS?k z+O~Ov|L23uYvg>R0@!z^PN<>8c_^Gsr4-u72}Mj9zQk~jU0Zvhg5KQE6HJQLaB4dq zv^qTs|LI(V=kDB~J>`DR{U8-1>9=8JZp@5zy?jbFr5Tl=5`Vi_w`qvbEp zUlBaCvGR&`$@a^m{7F|ghW8D6lg5}ke`a7beEF97@cxuFGDMg$8FqMBn}3fxKnpI? zazC&oIEm_cqGN84TM{_zcFnbnZ?-I9)eTz(k1@cMj$|#*FVtvB@V@egi6X^2=_W9lw3 zblhll`t>cUt4lRV@|V@a-%QV_t*=wwO$dn&9oq+!N4sRl2Md#rcBbtMbz4VcjH_ev=U^Hou1OSt%w<+Q#1`K`aHzNlA$J=Szd_qXKr z;OnjKsP=@N_a#T#TO6+im`d&aK=K7APF)4;-i-ca#7YBTHtuUIHdWtLg3(68Yz%*!bWTu z9R}Ip$Owd>2Tq0~OBajGg}TkfBnb78!*8zObZ$_ep$6z_lC+egRkPd4gD>&1JXcQ8kGpdb2SAhTu@?Ra|^= z*NAK@TLtNgCYxNIYpmr=^ovHQd0sy5RNudnxg~a~GIqcl9`P=(oNUDqvSGh^qj7%i zo&w;!FTYEB9EsS&(v#^u$L5s0Ymfp_d;jo($Jd4F;PxVTsbx1`$I7^ztEdUac9CYg z#^8ytt=!b|g($&3VZ-wWYKfJ#i;manyfMG2XX305O`?WSsIv#zqxT-Cen9snnK%|w zUJn02c(Cg^+zu6F#Ux{TK8PCoUQ))Nr3O><-IpnAX4}QMF>zN+b zM6tZ0{EE+Yuq`*{6z)WyulDow6q0Nl&%n;2!_w!vYR|~mHy%jK z6_twqVkDg@h;~)rT&5e6Oyr|KP9xszjrmN(J$xZ2AkFzBIv!+63(&ua?PVWSjr_ta z6ZS^+TdtMa9J{Q)vJw=nz6>BBIu*H zP3KjS-N-z)sB_tLEPl*-)*&i}!MJSyl{0bc`}w!Yzmi0&C4|ZVs@AmalNF(I{P>E) zpf-K=$`iC-eL4_EOP|-csUt51yCdG4bI$$F%q)E=BqH)PHUgjg0GNNt`3t8J&1_CC zIr}>T`1&D_zLqgb;mHG<#_?e_%ENkARUcNE%*sR6^+rTIPYLyuH|mFPj?)}jn0j&Z zmohpa)ldoyH?CpdW!l#=Ebe+-Z1_bSVSjY^EV`?n#k6Rmgmgk@e@hNg$(kFYWkmnf zfBTZ5TwzfjJ(^ZSiwg+dqh13i+GmSV_khCz@~g5jqUP732_R5Ht~Bf&sJx$!mkz?v z4uTQ;qOkSL;MqL8w9c(mN<#2BfD?uG0b7R9;c=4j?vKT2^?uqJR8HZS#GJU%$e9as!Dz!zs|>+70TvpmKbPCv47= zWLk=(QZi z9mwrs08prqZQ02P@i3tf#O>wD(eB?zfQg@*orxYBxY=A?nwy-x2RP+r#0i1R(caFX zI{+-D`-}!SZmVs%1X!(}Qv&C;AA10>hN}z+SV}3l08q@lS%HHOiAMnVc?bh=k`R9e zz!P|Z-N0M~Ko)N_WvRCjUDUvhVFSR_b8A4;fAj1!;Q-r(><=D&QLf;7{F24V5E%SL#=$IT0+70tk42*2@LnJHcTv;Mpg6%yjT9!2>kK4O}z* z)~QK;H6jFD((X(41x6s#Ft=&%$u@Os0k7Crwds4xy(e={X+fdD7dc>55V#{bCi$aZ zjZA9GvdgpuzRz+3kEDOGkJMWL35T>w!(^9P?pBpctj9$*vfWc`!EuZWwN|QMFN&Q% z2oHP5Ne71k!@_`eEkLkHf{+0uzMukt$NNSt0AT8+FhKT(CCPqv8js8;L49#n$Eg4p zBf1>z>-={2@5(UKVc%@7E#i_B{JUrmccF6Sd>E06AtViocmNhKH3veXFv$Mpi2;C& zEFB)*f1GA89xoE`#)~B%%A5TId|rR8_LhRu!NEw*Ix|5Vt`2I9NzPaHw$kZWRpn50 zGp4r%Q$VKneI~@jdQN1%;_=FFz+)A3VOn(gu^+2{2JqDwNz9Z^yp8ebpR7X5N5y_( zSNykV4I)B;u?gzf+w$B*?|c-Q2!g-OpQXm_ao>{OSV*C@FpOqIn?v>$&wT`WZqU;G zSqWLX9SR1j@1UK%(mn4VAm7h%E$n5bAO?XH`FgYmw286ErsLPpoS)J?u%Fzk0$w9I zpaEm(V@Sa*6t+i;x3r<_Vl-U!0HQs|b=#$#>O%k|cMyYkEUjy*M34h@Nid-J0AfAD z<=v&#vI+*!Ng#@wT98%JXuido3h6V(RZhuT#;u?>0gAd3}=*NbQ z6Sd5Kkz>$OK1kx`Ny3IPV!2nb!(twt`TT>5GT~fcm#@+1YH-sHCSzm4{{7xRoxV|w!@1FMf(^A`%F_R00`dwo$whu{h>J_=K zce3l%La8o{OgrC5l72#^YXla8g|q`&VSL|cIx3{2b4=>jGFh2R;J^*^CVHhw1wqD)n5mE;#%ov-LPJHLu1sj0)Ip9Fkt;`pRJNx(^xlrtG^*tl#;! zD?7O#uSR4Pht^2pIO&HQHp~+ck!WRqK985l^PIKh6@jU4*ksqGC(2b=!hepHt0Lx3 zJwz5yI^48~GtOy0yUB3#^Qlh@$;sV0Wsm-iBMJv_ZT(=Y624!6Jva9=FX89zS+!S6 zZZl&0hi;UM7QcK{xP%YAV-)Bl07rPN*u`2YINC|}v`Bmr08j!%I{A z&19U)IVuktH1g+`{o`NA}@7blIt)j7xIpbVtEE@Y$~l_X|M?v;T7%xb%F^}BRS{I!?ue6Dxw&<^VmP@ zW}iL4vr-;e%L>ho#_O2{svg<8I}lCNN$UtlYX=eyhRyNaXeHS;@*eHN(-k?|9lvK; z!Cx}nlCwWIR(|5Wp7=7-sI>&kp2%1G)+ct2m-()wHS=mbp0A&q`V%ysFWh`Z;j@}Puhfe389UHnFmSdMSY@Fkwx@3Tap%BNGXu*epJ0c+P=?F1 z#}6S@s_&;XOnhYHy)-_xb6CXqdySANeeIdPTGZ8yHQ%@ul5~sK@B*wAZo~qzp_kr3 zId-w1p@}n>vb5+5iG)t5nP9b8PE{SLVe%WtxK(ly%JaT24F~ZgRgR@ymo4-dtBn7- z?dhff@K7UxR8pyu0RQw!Zg^%fYR+-8)LbP?ld=2!1wLKrhhxDjY9n{Q*qYz+Dk4m! zsC(nB|ADitAaD^e1@r=2fMbeDRrmO#Tik*Yh8iVDRs)R>w3yi zvn49QG>g@K_7tstwWeAmp&xVM$qH#<|w+0;i_ed=lZs3e`J4n_^!qke_ku@rlq8X~ zhcjuDT@ue{IzIVOQ_?tlsP6449O?u)eyw?G_d|bIQ_ZYWvUY&&2N&Uf!v2e}S7bRO zr_a{`6Z}T)=7Igy3cAo_q7bq88CU$R_&*WMV~THbu8MFhghXGrCnwCllqJ{l;ZdxU z(ttD&o1us?!Tl3zcAXOOAA|N}AHrKXrcW;9ka7pY9yP zP+VR0mO)wc5TERrhKVY6Fi@9dG)!dMfSevUu1Zxz{sD%Q8scqr+a!0 zf^piRTplg+OUR}G_2a-WEU(-X3nC)t;jfBM%aPp_RG%oyw5!a0;2yAWBBd@gfyBhNaS;H}$t zt`7~g!A(B#6wR)pp^hs~gg7YPfv*RZo3}z^maCW-lux}Pn3oKX}@&DY%68t{WoW^UUME*ue)KN?_m-kgZ;GH7U zsI^j|&)Hp2c$^>Y)Q=->c46Q>$$%Gv^5iSlob>CtQe0{J$|)T4Bt_q21i2bTr^;~O zf*Tegf#ZAoG;yYY&5%225me>P=iH7R=c zH2Hq}_5Km+-ZCzujYk;>yxFxbl$d_HYpX?&RkFkS=VNrl7T>!$E2Vuq@?NW`)h7|` zFY0aVY{Fj#yY88c69%Uk3G(HjLQO+Wg%PsFgAO=ugajpOIj;2Yd9Lzh^ht`v_8|tz z;?#OqHqR0&tRM@B!0jKsf+)1+BQ|F-`!E4%R)%%82QxVkjFr=(eduODFMN!4JPpkPcNiRm&=mK5!ni{S+}V1Y?igXz_qosFkNJ2<<-rJ zdo3g=ZugO!YMABd)6&sY+IqpF#p=fSI2<{%%gev$+EE7PvYI;M(pOjJ94k+RsZ zJ^td=`g#VLjDUMz?-k{?X*M_ITV}CoF24)&ReD2w2HOfM6C`&6Vkez8CF7+czMd}p zKK}W2BCU&*H8I{IOZqjr!vp z@x;P&q)fTK59>lLuPpyLjT$%h(j-(7{FHIkG@_$L?xbb@L9MyBwI%DbaL%2D-!uCk zUcLcL(_bcVsU@rq+|qvbQTa9x#kZ*8dgC&pb2i_f$Mq41#`w`RL{tX0d*XgbdT;fI z+&JUYbtdA|0wczjs(p;A!($(t zi?S$pf8}23HE$PYwMsFSH9Q|-gmvLtl(9}7VH&Ge)^;CvUvWo(zX4AE0H?x*gw^o| zqPb;Dw`ZRpZ)=GQJiQVGkEc(?a{eHHgn`*m@(MJ`g z(e&3^xV~0t6HY5sZcq&fkfW|%E#=uWLf)dxXD9c1^yA9KrfW1vWl@8?)`}|+zf|Q# z7jsDNx>luVY;>v+)pT|Fs~{wqR*NL@NxW-)9dmvS=AP@HUbz3p+oRv>Emjz5`FrXz zVwo#gtgHw&Jgju3Pqg3?21*k2_}U4|04;o10tWy-04!M8Yo@y%=Usst z>}-!{9J)quk``DK=3+@$&92OP2tO=g3v4pXku?`(!-@HEi-i_D{oSq?fGZF{NYGV3 z?fdELknLVK(j7Oa@`;TZA&1FtO~&mp0i5+n{y6sU1M3npE5<{+D4fmMMA392M%QNy z^@}6@X64ol+qdpi9j5?Fp;Grv5Kn&f*k#_zx=*{1A56R%`8jxxiMu4(5Sx0U-#1)r z9nmui^vCXH5j2Q>$sx`ZHTgmw#2yl&`_Lz`)cXZ-e#QLGIc%TdOfG|2Mg;g~carB5 z%Ce3Ad3=5KqLG?A!d;^ns3 z5qOyAd5JUtIE@1^3vn`05g`w@mcLJY*apaTwUy|A<4;Ys?I(b$i!L6pP?R$V=!b{` zhmRws0O1UI;2=G82fzurjRSmlXablkrGb;!K$&WqI&rxWFEKd=LQE&mTQ>lJ5k*as@^Klxv8W`oP8aGwcqz$AkyqED!5<@Bv=2;amss z*{pm!@Ik9=7eJ;b_BO!(**g)SS_gnFGQM%37lqs;26AoyR;2&{zIT9e5diqd`at_1 zguIi%55Oa3pJ^5PgX{-su}#dK6QMDxN%B%FV3%(WyI;gF0TAlN?@&4h0N2bl@gD&2 z$nij{1-wb8=F*8xDM5|;iOVCr$3_SCWmr*nR!rOUbE#V`7iiN=wgWTN;zW;%f)IK> z@`yhr36p?;l`+Rrdqu@2_;ox=(t=!MCqE~KyIMC%sEM!+f3F^fz9|naGyz{I7>dLq zCkLP6Ev%-+W&`lSDL{PMP=FmD2*1zD1|F@flpvxrV*tn_uw3Pn*Vsdwts=0wGyf#K z%fSEpgK$-~>f&=(rN$6k6{3Kz4}9w*i&3xm#v4Zc^Q5cK@eJ1(JmYaP!TqLT%RN9( z*Kej#s9%RriF=7U+)NAMYx_cND*l&F-<`+j?R>9EDcQJhuOR(>_2w^2i9vikgJ|!!Hf}H*6boUuD24DB%hjtCMn8kb6vA9b28_u)l^kF$no4vnf z0g#-g6NlSL^M_d>13&dRdVMn^!HTR0B#6itbAXnGG;>d#t2EUp9q>`ner(lt)r2h% z2Zv>$WrP^=WdEuzOS3}`67fqxBr#>X?_!mqD6ir8^)Z5q%=K5l1}P%$=RZrzU6ums zo~)6%t>d(d9d4y98x@m0u;-rj`-Ia*y&7qNHQk^jX?ZK60EPb$=y!5pLl zZaev_7v_)>=9d-oN$_>$#4n|%n7n$G4t#doc_$i5ETq*Xsa$rh&gFd4)1Y$^9D+9< z^xIJzUR94Z<2mBDWHgYh8W73b2qL=y*n$6~2K-&?`1{{%v#>6u{^|bV+c*opiR)=! z6)yI^@p=8H&I)bb`VZBomOITd{L(VK;->C2)Rmdi_P(8e`WrzRdIG+PTjNNgL++1o!?|M*^~zp_ zg3}9XjIu}B^~;KQ8JyYg9+U1I`G}^@9wV<;DpK;ZMhJJ?7rsic4gPB2a_O5i^I&dH zHXGO8{*94KheU4=eoyoDC9gkG4XHVLgFSrX`>_Kj#kwap!OtV{cJ=W;ojQBr-T7D& z!42O-))ddFTW;DKd7c!64k&F>KdDVVwhNT`kZ7XjuX1Xo%90mylJzyjC3Lgps&3IQ zZ0b{s(A)keiUTDlDq?D?17%MHZSXvV(-xrB2IG(bS%dE7fGfx>^kNoHe)V zsR^>#zdy#$Zjkc)4bmTcm>)hN*5dhOTS(Me)ju7r;P43{sInN6z2I(PqgFr_!f$*I*=)ko7Pss3)fRXWmlr+*nie5%e&5_LK)<#jrfYU#!|d+C>A3?=Rt8xMvr zig*SQ{lc;QBEd(cM_N`JC+1C9bq$$@{X;fkLJc7#j8e6yY&CRyZX=v)i05Cm|NPzE zthQao9bTKMOWWc}O8Mzi9Mvh6uD(}~h zsI(2^H$Uf_9#P@o|MrLyPmaOsLXL%?` zDe1TGZzErY#dEISznto6%xM|tS>c8}KX|)pt@zWD^@?=Iqm%bYV+Rsj*Pb?eM5Kkg zj>9{75vI{lAF?rABXT0_SE-p}NcLZ1!VgVIbPXL+L$RL35 z6Ltx)LbqR0H=Kg#eV?;lpqtBwu$Z~ zK#_HJ7m-Xb)l%{5p>C{lGSd3=Nwv-Z^@H9V_Fh`!IR-md-uZa;UGNNq)7n*_Sn^<6#D$-e?YDXhMNc-*7eCNY79 z2r$>7NKWAkPZ3uqO?%uhGEq+dWd3|zvJ__M7qEfiZZgVN0#;!9Z72!;H7ZIKr=C7oTD=&DxkFVzGjB@S1Wa=?_PeI-mK-N2oGR9H#RE8Tdtb7o0B5;Mu;TI68fLys(CQ z5~A@XDkT46I%3MyK+7U}cv(`MkvMHhj{SRGOv?@OHNS)GM1fx2iOAY=@{4L%Ijk?J zo~*F(zu0aIm{9*Q8{hJF)v?4}U$b3=fY6PR%HxYt6B)mxKuP*D2bU?nt0W&^3Ej;V zJET)OlAt5@xKKS&8jrH=lgN0rC6%~Vxoe=cgO#spQ7R?;>`1iEn~Haz1{hK;jF2sq zM->thD&fX$XwbTcs*kxVg~30FUt!@`DKRWYtO04=*M=jtdfL z*V}Vg`*I%<#dBc1h>$vtKXtR`(LQ=n8`5$id+NwtgyI8M;7mgv)wfMqWc0=Q{F9uF z*BT8WBK8u7!p02u+jb zQRH-zeeI@qzdMcz%Q;|BwGb&+XuwF0JFbN2Q^K2eREMMSp5CAi`r*CCRLyHk!s|xD z`-p^h#7fB^4vJH`1m38HoqQ`6W|(f`0$4H3yqc_~zMJe1OwSgH`4 zx`f1pNC4{{g3FfGQ>jd*aENdY@lUHdhy`?Dfo&)_-+Kz2f***}6Y%#K`xtows<4i+ zP5>|)R7|H6SFTRsOK^Nb>7TWcHT zI8p#JjtWTN6*jm63=*_Hn+|wUFrP5NXqSh272kM3yB@%;)c^^ww?UeLhr9(ypaf2hf(f)slp%2&xMA*~ z*G}(4_<>KzPT`+yG(~`~c>zvOu)usgMx27@MBoWCF0i$kOL`opf;et1?qV`nAT75S zVflAtXN3Tl<^aN2PUeGw`&b8vAmBRg(Ov-{%y_&!4B(IhYhF#072Z$!^7wJLYcTT^ zeJuUSTqKZ;I0XEFAe`faXuy>2bgAn9=~%_AeTQLS^a9YL0t|{ly|75){;kRXpJQA0J8x-886Amzil0O02rT`^Rr=qAM!8};AbA42e8S( zg{-XR_!6H;C@KCEQ1k(m3t>Pcaz7MI(PGvA!vSO#r8|I2HkiM}2G9QfUk@;m0CO1@ z^Nf#n&>vkv;Ie9<$eW*i!W-a!73e=&SO9Q=0l*8|ZJeQCak$%7Lvu#_Xdro%k3 zd!amRU-CM%BTWyJ7bHI8J+qcc|cmVq&9RTSO zEtoubTM#TG%4uRSuiA2%7~)aV7SN8*&_yv=&H@Rpiw29E+Q|XT>)vtx2JzC8me7tr zJea&U+W-6cYAi5+x9!Nm{$#@&O{D?bOs~`4X`XpAfBxqlaEL9>2Lk%U_Lfab{OJiqyr)TRR<>Dg^p*YfL9yLFU`uU zLA;%`E5svxG5IHG`@zo*U&8!C4qG|Iqoi&_yu~X_9)Y%>c5cxQ=B?xodm&yz`Ub=! z+%WkA^yayW2SqS{V^r@p#7j##K>W4}CO-fvL8*BAo)_kQZcwB{yr`5Xq?e4wu|dGxuWhk0B)}t4ht! zVScwW@+rhSNMD8YlN^{l1-g9d?Ez=ypTYSV6~v#5=c~!Lih=e6tnCE)&D*)m}q#Pl>TNRUs8a_yL#l8{1eCz1lyAUrX0t72(DAW-l#>hd+?SWSAYMZ18pQAZ=P=lHK(Y`24*>qe$w4rG&2tiN-()16pk2f2 znD&p*?N!6V{dJh%j~{A+?2AiTL%gj3CjS%7TajP73iD|lIk5i@l5P4Dd%m0D?+{5I<|0~aJzg=NIpp1GQ;_ak7AigdNlfQ%JuRX6m>yNG?3nU=kQR+U# z5AR^|WN1FYF!v2?-=nzTI>bw$q9Ok0E+(&xZV!tDr1oJxtx*SVKP6G25RW^6$^Sx^ z=l%H4YcL<>w_6R_cajc=cwhpP=SBMyW@UX=UrL2fKSR6-Dh$F8hcWqMc!~pDL$hl) z0JeW+CsGvRouwlnUgQfVpO5x`afHVl=JUwE*g?D~DiY$yr!e{d$}^Q_%nHoMZHqEP zycjA5;)VZf0MYg3J-R%*&-%WGdGQKt8Hkrcg+TnkKkbhgy8bFgv@pYbYIGGf#5+ny zLHyTwOn-i%$1~=2dhsx?SLja!@!}{ra$3+qpkRad4?>bna^_H79!U=tH2$gfqN~LN z96cO_9PND1L5LV0I)>;Z1f#RSo`w4k{1t7rTxV5SR1xCai!gaOUqF3^%<_Af-xD=R zgOeam1M&6vnEW-g{d0RkLogrLbD{(B5~55HKShkmD?v(7zR@HP!n_gQ?M8^V7iEX^ z?9`Y%E2IP^#EeK5<|zUgQz2eNj1AJ?qQK;zqO-s|^_C&bGhF72hj?dE9*8gE#^m3k zHmpGA8ei{0VU@w5ny<&Kp3ygE%ESj+WGQ*H|h?fxumvsh9KOrU$kJ3QB`GMP6gKl6y z3>P;^QTWaAh5zu;kP%Rxj+34ZfXvECb0GUtqWqA)R~pm4FS_=g^ZdO7`*Ycc*Bjzd zV!{yL@=rX6AtfkNLmhu$zGs524dNZeL?Jz)7N-3V=y;Cq_l&`O^OxaGh<6qP7XSu; zIq+_TGdatzkLaymO>f0vevwDJ0pdl(m7rZZ#hAPXx;9+>t&k7%hNJ|Y5bq?e0P)