├── LICENSE.md ├── archive ├── electron-boilerplate │ ├── gulpfile.js │ ├── resources │ │ ├── icon.png │ │ ├── osx │ │ │ ├── icon.icns │ │ │ ├── dmg-icon.icns │ │ │ ├── dmg-background.png │ │ │ ├── dmg-background@2x.png │ │ │ ├── appdmg.json │ │ │ ├── helper_apps │ │ │ │ ├── Info.plist │ │ │ │ ├── Info EH.plist │ │ │ │ └── Info NP.plist │ │ │ └── Info.plist │ │ ├── windows │ │ │ ├── icon.ico │ │ │ ├── setup-icon.ico │ │ │ ├── setup-banner.bmp │ │ │ └── installer.nsi │ │ └── linux │ │ │ ├── DEBIAN │ │ │ └── control │ │ │ └── app.desktop │ ├── config │ │ ├── env_test.json │ │ ├── env_production.json │ │ └── env_development.json │ ├── .gitignore │ ├── app │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ └── glyphicons-halflings-regular.woff2 │ │ ├── env.js │ │ ├── stylesheets │ │ │ ├── main.less │ │ │ └── simple-sidebar.css │ │ ├── package.json │ │ ├── spec.html │ │ ├── app.js │ │ ├── vendor │ │ │ ├── electron_boilerplate │ │ │ │ ├── dev_helper.js │ │ │ │ ├── context_menu.js │ │ │ │ ├── window_state.js │ │ │ │ └── external_links.js │ │ │ ├── jasmine │ │ │ │ ├── boot.js │ │ │ │ ├── jasmine-html.js │ │ │ │ └── jasmine.css │ │ │ └── bootstrap.min.js │ │ ├── background.js │ │ └── app.html │ ├── README.md │ ├── .editorconfig │ ├── tasks │ │ ├── release.js │ │ ├── generate_specs_import.js │ │ ├── utils.js │ │ ├── rebuild_native.js │ │ ├── start.js │ │ ├── release_linux.js │ │ ├── release_windows.js │ │ ├── build.js │ │ └── release_osx.js │ ├── package.json │ └── BOILERPLATE.md └── chrome-app-prototype │ ├── icon128.png │ ├── icon16.png │ ├── icon48.png │ ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.ttf │ ├── glyphicons-halflings-regular.woff │ └── glyphicons-halflings-regular.woff2 │ ├── manifest.json │ ├── background.js │ ├── css │ └── simple-sidebar.css │ ├── index.html │ └── js │ └── bootstrap.min.js ├── README.md └── npm-debug.log /LICENSE.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/gulpfile.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./tasks/build'); 4 | require('./tasks/release'); 5 | -------------------------------------------------------------------------------- /archive/chrome-app-prototype/icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sup/taskmeter/master/archive/chrome-app-prototype/icon128.png -------------------------------------------------------------------------------- /archive/chrome-app-prototype/icon16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sup/taskmeter/master/archive/chrome-app-prototype/icon16.png -------------------------------------------------------------------------------- /archive/chrome-app-prototype/icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sup/taskmeter/master/archive/chrome-app-prototype/icon48.png -------------------------------------------------------------------------------- /archive/electron-boilerplate/resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/resources/icon.png -------------------------------------------------------------------------------- /archive/electron-boilerplate/config/env_test.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test", 3 | "description": "Add here any environment specific stuff you like." 4 | } 5 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/resources/osx/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/resources/osx/icon.icns -------------------------------------------------------------------------------- /archive/electron-boilerplate/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | .DS_Store 4 | Thumbs.db 5 | 6 | /app/spec.js 7 | /build/ 8 | /releases/ 9 | /tmp/ 10 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/resources/osx/dmg-icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/resources/osx/dmg-icon.icns -------------------------------------------------------------------------------- /archive/electron-boilerplate/resources/windows/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/resources/windows/icon.ico -------------------------------------------------------------------------------- /archive/electron-boilerplate/config/env_production.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "production", 3 | "description": "Add here any environment specific stuff you like." 4 | } 5 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/config/env_development.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "development", 3 | "description": "Add here any environment specific stuff you like." 4 | } 5 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/resources/osx/dmg-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/resources/osx/dmg-background.png -------------------------------------------------------------------------------- /archive/electron-boilerplate/resources/windows/setup-icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/resources/windows/setup-icon.ico -------------------------------------------------------------------------------- /archive/electron-boilerplate/resources/windows/setup-banner.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/resources/windows/setup-banner.bmp -------------------------------------------------------------------------------- /archive/electron-boilerplate/resources/osx/dmg-background@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/resources/osx/dmg-background@2x.png -------------------------------------------------------------------------------- /archive/chrome-app-prototype/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sup/taskmeter/master/archive/chrome-app-prototype/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /archive/chrome-app-prototype/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sup/taskmeter/master/archive/chrome-app-prototype/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /archive/chrome-app-prototype/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sup/taskmeter/master/archive/chrome-app-prototype/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # taskmeter 2 | Arbitrary progress based todo list 3 | 4 | ## Feature Lists 5 | * Progress Bars 6 | * Automatic increments for comparison 7 | * Todoist/Google/Apple integrations 8 | -------------------------------------------------------------------------------- /archive/chrome-app-prototype/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sup/taskmeter/master/archive/chrome-app-prototype/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/app/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/app/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/app/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sup/taskmeter/master/archive/electron-boilerplate/app/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /archive/electron-boilerplate/resources/linux/DEBIAN/control: -------------------------------------------------------------------------------- 1 | Package: {{name}} 2 | Version: {{version}} 3 | Maintainer: {{author}} 4 | Priority: optional 5 | Architecture: amd64 6 | Installed-Size: {{size}} 7 | Description: {{description}} 8 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/README.md: -------------------------------------------------------------------------------- 1 | ## Product 2 | Electron app based off electron-boilerplate. A more mature dev/prod environment dichotomy, tests, and more. 3 | 4 | ## Resources 5 | * http://www.dontpaniclabs.com/blog/post/2015/08/04/github-electron-tutorial-using-electron-boilerplate/ 6 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/resources/linux/app.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Version=1.0 3 | Type=Application 4 | Encoding=UTF-8 5 | Name={{productName}} 6 | Comment={{description}} 7 | Exec=/opt/{{name}}/{{name}} 8 | Path=/opt/{{name}}/ 9 | Icon=/opt/{{name}}/icon.png 10 | Terminal=false 11 | Categories=Application; 12 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 4 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.json] 13 | indent_size = 2 14 | 15 | [*.md] 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /archive/chrome-app-prototype/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Sample App", 3 | "version": "1", 4 | "manifest_version": 2, 5 | "minimum_chrome_version": "23", 6 | "icons": { 7 | "128": "icon128.png" 8 | }, 9 | "app": { 10 | "background": { 11 | "scripts": ["background.js"] 12 | } 13 | }, 14 | "permissions": [ 15 | ] 16 | } -------------------------------------------------------------------------------- /archive/electron-boilerplate/resources/osx/appdmg.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "{{productName}}", 3 | "icon": "{{dmgIcon}}", 4 | "background": "{{dmgBackground}}", 5 | "icon-size": 128, 6 | "contents": [ 7 | { "x": 410, "y": 220, "type": "link", "path": "/Applications" }, 8 | { "x": 130, "y": 220, "type": "file", "path": "{{appPath}}" } 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/tasks/release.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var gulp = require('gulp'); 4 | var utils = require('./utils'); 5 | 6 | var releaseForOs = { 7 | osx: require('./release_osx'), 8 | linux: require('./release_linux'), 9 | windows: require('./release_windows'), 10 | }; 11 | 12 | gulp.task('release', ['build'], function () { 13 | return releaseForOs[utils.os()](); 14 | }); 15 | -------------------------------------------------------------------------------- /archive/chrome-app-prototype/background.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Listens for the app launching then creates the window 3 | * 4 | * @see http://developer.chrome.com/trunk/apps/app.runtime.html 5 | * @see http://developer.chrome.com/trunk/apps/app.window.html 6 | */ 7 | chrome.app.runtime.onLaunched.addListener(function() { 8 | chrome.app.window.create('index.html', { 9 | bounds: { 10 | width: 1280, 11 | height: 800 12 | } 13 | }); 14 | }); -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/env.js: -------------------------------------------------------------------------------- 1 | // Simple module exposes environment variables to rest of the code. 2 | 3 | import jetpack from 'fs-jetpack'; 4 | 5 | var app; 6 | if (process.type === 'renderer') { 7 | app = require('electron').remote.app; 8 | } else { 9 | app = require('electron').app; 10 | } 11 | var appDir = jetpack.cwd(app.getAppPath()); 12 | 13 | var manifest = appDir.read('package.json', 'json'); 14 | 15 | export default manifest.env; 16 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/stylesheets/main.less: -------------------------------------------------------------------------------- 1 | html, body { 2 | width: 100%; 3 | height: 100%; 4 | margin: 0; 5 | padding: 0; 6 | } 7 | 8 | body { 9 | display: flex; 10 | justify-content: center; 11 | align-items: center; 12 | font-family: sans-serif; 13 | } 14 | 15 | a { 16 | text-decoration: none; 17 | } 18 | 19 | .container { 20 | text-align: center; 21 | } 22 | 23 | .subtitle { 24 | color: gray; 25 | } 26 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "electron-boilerplate", 3 | "productName": "Electron Boilerplate", 4 | "identifier": "com.example.electron-boilerplate", 5 | "description": "Starter for your Electron application. Out of the box ready for serious stuff.", 6 | "version": "0.1.0", 7 | "author": "Mr Gumby", 8 | "copyright": "© 2016, your company here", 9 | "main": "background.js", 10 | "dependencies": { 11 | "fs-jetpack": "^0.7.0" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/spec.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Jasmine Spec Runner 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/resources/osx/helper_apps/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleIdentifier 6 | {{identifier}}.helper 7 | CFBundleName 8 | {{productName}} Helper 9 | CFBundlePackageType 10 | APPL 11 | DTSDKName 12 | macosx 13 | LSUIElement 14 | 15 | NSSupportsAutomaticGraphicsSwitching 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "asar": "^0.7.2", 4 | "electron-prebuilt": "^0.36.0", 5 | "fs-jetpack": "^0.7.0", 6 | "gulp": "^3.9.0", 7 | "gulp-less": "^3.0.3", 8 | "gulp-util": "^3.0.6", 9 | "q": "^1.4.1", 10 | "rollup": "^0.21.0", 11 | "tree-kill": "^0.1.1", 12 | "yargs": "^3.15.0" 13 | }, 14 | "optionalDependencies": { 15 | "appdmg": "^0.3.2", 16 | "rcedit": "^0.3.0" 17 | }, 18 | "scripts": { 19 | "postinstall": "cd app && npm install", 20 | "build": "gulp build", 21 | "release": "gulp release --env=production", 22 | "start": "node ./tasks/start", 23 | "test": "node ./tasks/start --env=test" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/app.js: -------------------------------------------------------------------------------- 1 | // Here is the starting point for your application code. 2 | // All stuff below is just to show you how it works. You can delete all of it. 3 | 4 | // Use new ES6 modules syntax for everything. 5 | import os from 'os'; // native node.js module 6 | import { remote } from 'electron'; // native electron module 7 | import jetpack from 'fs-jetpack'; // module loaded from npm 8 | import env from './env'; 9 | 10 | console.log('Loaded environment variables:', env); 11 | 12 | var app = remote.app; 13 | var appDir = jetpack.cwd(app.getAppPath()); 14 | 15 | // Holy crap! This is browser window with HTML and stuff, but I can read 16 | // here files like it is node.js! Welcome to Electron world :) 17 | console.log('The author of this app is:', appDir.read('package.json', 'json').author); 18 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/resources/osx/helper_apps/Info EH.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDisplayName 6 | {{productName}} Helper EH 7 | CFBundleExecutable 8 | {{productName}} Helper EH 9 | CFBundleIdentifier 10 | {{identifier}}.helper.EH 11 | CFBundleName 12 | {{productName}} Helper EH 13 | CFBundlePackageType 14 | APPL 15 | DTSDKName 16 | macosx 17 | LSUIElement 18 | 19 | NSSupportsAutomaticGraphicsSwitching 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/resources/osx/helper_apps/Info NP.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDisplayName 6 | {{productName}} Helper NP 7 | CFBundleExecutable 8 | {{productName}} Helper NP 9 | CFBundleIdentifier 10 | {{identifier}}.helper.NP 11 | CFBundleName 12 | {{productName}} Helper NP 13 | CFBundlePackageType 14 | APPL 15 | DTSDKName 16 | macosx 17 | LSUIElement 18 | 19 | NSSupportsAutomaticGraphicsSwitching 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /npm-debug.log: -------------------------------------------------------------------------------- 1 | 0 info it worked if it ends with ok 2 | 1 verbose cli [ 'node', '/usr/local/bin/npm', 'start' ] 3 | 2 info using npm@3.7.2 4 | 3 info using node@v0.10.24 5 | 4 verbose stack Error: ENOENT, open '/Users/charleslai/Documents/Programming/other-projects/taskmeter/package.json' 6 | 5 verbose cwd /Users/charleslai/Documents/Programming/other-projects/taskmeter 7 | 6 error Darwin 15.2.0 8 | 7 error argv "node" "/usr/local/bin/npm" "start" 9 | 8 error node v0.10.24 10 | 9 error npm v3.7.2 11 | 10 error path /Users/charleslai/Documents/Programming/other-projects/taskmeter/package.json 12 | 11 error code ENOENT 13 | 12 error errno 34 14 | 13 error enoent ENOENT, open '/Users/charleslai/Documents/Programming/other-projects/taskmeter/package.json' 15 | 14 error enoent ENOENT, open '/Users/charleslai/Documents/Programming/other-projects/taskmeter/package.json' 16 | 14 error enoent This is most likely not a problem with npm itself 17 | 14 error enoent and is related to npm not being able to find a file. 18 | 15 verbose exit [ 34, true ] 19 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/vendor/electron_boilerplate/dev_helper.js: -------------------------------------------------------------------------------- 1 | import { app, Menu, BrowserWindow } from 'electron'; 2 | 3 | var setDevMenu = function () { 4 | var devMenu = Menu.buildFromTemplate([{ 5 | label: 'Development', 6 | submenu: [{ 7 | label: 'Reload', 8 | accelerator: 'CmdOrCtrl+R', 9 | click: function () { 10 | BrowserWindow.getFocusedWindow().webContents.reloadIgnoringCache(); 11 | } 12 | },{ 13 | label: 'Toggle DevTools', 14 | accelerator: 'Alt+CmdOrCtrl+I', 15 | click: function () { 16 | BrowserWindow.getFocusedWindow().toggleDevTools(); 17 | } 18 | },{ 19 | label: 'Quit', 20 | accelerator: 'CmdOrCtrl+Q', 21 | click: function () { 22 | app.quit(); 23 | } 24 | }] 25 | }]); 26 | Menu.setApplicationMenu(devMenu); 27 | }; 28 | 29 | export default { 30 | setDevMenu: setDevMenu, 31 | } 32 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/tasks/generate_specs_import.js: -------------------------------------------------------------------------------- 1 | // Spec files are scattered through the whole project. Here we're searching 2 | // for them and generate one entry file which will run all the tests. 3 | 4 | 'use strict'; 5 | 6 | var jetpack = require('fs-jetpack'); 7 | var srcDir = jetpack.cwd('app'); 8 | 9 | var fileName = 'spec.js'; 10 | var fileBanner = "// This file is generated automatically.\n" 11 | + "// All your modifications to it will be lost (so don't do it).\n"; 12 | var whatToInclude = [ 13 | '*.spec.js', 14 | '!node_modules/**', 15 | ]; 16 | 17 | module.exports = function () { 18 | return srcDir.findAsync('.', { matching: whatToInclude }, 'relativePath') 19 | .then(function (specPaths) { 20 | var fileContent = specPaths.map(function (path) { 21 | return 'import "' + path + '";'; 22 | }).join('\n'); 23 | return srcDir.writeAsync(fileName, fileBanner + fileContent); 24 | }) 25 | .then(function () { 26 | return srcDir.path(fileName); 27 | }); 28 | }; 29 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/tasks/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var argv = require('yargs').argv; 4 | var os = require('os'); 5 | var jetpack = require('fs-jetpack'); 6 | 7 | module.exports.os = function () { 8 | switch (os.platform()) { 9 | case 'darwin': 10 | return 'osx'; 11 | case 'linux': 12 | return 'linux'; 13 | case 'win32': 14 | return 'windows'; 15 | } 16 | return 'unsupported'; 17 | }; 18 | 19 | module.exports.replace = function (str, patterns) { 20 | Object.keys(patterns).forEach(function (pattern) { 21 | var matcher = new RegExp('{{' + pattern + '}}', 'g'); 22 | str = str.replace(matcher, patterns[pattern]); 23 | }); 24 | return str; 25 | }; 26 | 27 | module.exports.getEnvName = function () { 28 | return argv.env || 'development'; 29 | }; 30 | 31 | module.exports.getSigningId = function () { 32 | return argv.sign; 33 | }; 34 | 35 | module.exports.getElectronVersion = function () { 36 | var manifest = jetpack.read(__dirname + '/../package.json', 'json'); 37 | return manifest.devDependencies['electron-prebuilt'].substring(1); 38 | }; 39 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/resources/osx/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDisplayName 6 | {{productName}} 7 | CFBundleExecutable 8 | {{productName}} 9 | CFBundleIconFile 10 | icon.icns 11 | CFBundleIdentifier 12 | {{identifier}} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | {{productName}} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleVersion 20 | {{version}} 21 | CFBundleGetInfoString 22 | {{version}} 23 | LSMinimumSystemVersion 24 | 10.8.0 25 | NSMainNibFile 26 | MainMenu 27 | NSPrincipalClass 28 | AtomApplication 29 | NSSupportsAutomaticGraphicsSwitching 30 | 31 | NSHumanReadableCopyright 32 | {{copyright}} 33 | 34 | 35 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/vendor/electron_boilerplate/context_menu.js: -------------------------------------------------------------------------------- 1 | // This gives you default context menu (cut, copy, paste) 2 | // in all input fields and textareas across your app. 3 | 4 | (function () { 5 | 'use strict'; 6 | 7 | var remote = require('electron').remote; 8 | var Menu = remote.Menu; 9 | var MenuItem = remote.MenuItem; 10 | 11 | var cut = new MenuItem({ 12 | label: "Cut", 13 | click: function () { 14 | document.execCommand("cut"); 15 | } 16 | }); 17 | 18 | var copy = new MenuItem({ 19 | label: "Copy", 20 | click: function () { 21 | document.execCommand("copy"); 22 | } 23 | }); 24 | 25 | var paste = new MenuItem({ 26 | label: "Paste", 27 | click: function () { 28 | document.execCommand("paste"); 29 | } 30 | }); 31 | 32 | var textMenu = new Menu(); 33 | textMenu.append(cut); 34 | textMenu.append(copy); 35 | textMenu.append(paste); 36 | 37 | document.addEventListener('contextmenu', function (e) { 38 | 39 | switch (e.target.nodeName) { 40 | case 'TEXTAREA': 41 | case 'INPUT': 42 | e.preventDefault(); 43 | textMenu.popup(remote.getCurrentWindow()); 44 | break; 45 | } 46 | 47 | }, false); 48 | 49 | }()); 50 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/vendor/electron_boilerplate/window_state.js: -------------------------------------------------------------------------------- 1 | // Simple module to help you remember the size and position of windows. 2 | // Can be used for more than one window, just construct many 3 | // instances of it and give each different name. 4 | 5 | import { app } from 'electron'; 6 | import jetpack from 'fs-jetpack'; 7 | 8 | export default function (name, defaults) { 9 | 10 | var userDataDir = jetpack.cwd(app.getPath('userData')); 11 | var stateStoreFile = 'window-state-' + name +'.json'; 12 | 13 | var state = userDataDir.read(stateStoreFile, 'json') || { 14 | width: defaults.width, 15 | height: defaults.height 16 | }; 17 | 18 | var saveState = function (win) { 19 | if (!win.isMaximized() && !win.isMinimized()) { 20 | var position = win.getPosition(); 21 | var size = win.getSize(); 22 | state.x = position[0]; 23 | state.y = position[1]; 24 | state.width = size[0]; 25 | state.height = size[1]; 26 | } 27 | state.isMaximized = win.isMaximized(); 28 | userDataDir.write(stateStoreFile, state, { atomic: true }); 29 | }; 30 | 31 | return { 32 | get x() { return state.x; }, 33 | get y() { return state.y; }, 34 | get width() { return state.width; }, 35 | get height() { return state.height; }, 36 | get isMaximized() { return state.isMaximized; }, 37 | saveState: saveState 38 | }; 39 | } 40 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/vendor/electron_boilerplate/external_links.js: -------------------------------------------------------------------------------- 1 | // Convenient way for opening links in external browser, not in the app. 2 | // Useful especially if you have a lot of links to deal with. 3 | // 4 | // Usage: 5 | // 6 | // Every link with class ".js-external-link" will be opened in external browser. 7 | // google 8 | // 9 | // The same behaviour for many links can be achieved by adding 10 | // this class to any parent tag of an anchor tag. 11 | // 15 | 16 | (function () { 17 | 'use strict'; 18 | 19 | var shell = require('electron').shell; 20 | 21 | var supportExternalLinks = function (e) { 22 | var href; 23 | var isExternal = false; 24 | 25 | var checkDomElement = function (element) { 26 | if (element.nodeName === 'A') { 27 | href = element.getAttribute('href'); 28 | } 29 | if (element.classList.contains('js-external-link')) { 30 | isExternal = true; 31 | } 32 | if (href && isExternal) { 33 | shell.openExternal(href); 34 | e.preventDefault(); 35 | } else if (element.parentElement) { 36 | checkDomElement(element.parentElement); 37 | } 38 | } 39 | 40 | checkDomElement(e.target); 41 | } 42 | 43 | document.addEventListener('click', supportExternalLinks, false); 44 | }()); 45 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/background.js: -------------------------------------------------------------------------------- 1 | // This is main process of Electron, started as first thing when your 2 | // app starts. This script is running through entire life of your application. 3 | // It doesn't have any windows which you can see on screen, but we can open 4 | // window from here. 5 | 6 | import { app, BrowserWindow } from 'electron'; 7 | import devHelper from './vendor/electron_boilerplate/dev_helper'; 8 | import windowStateKeeper from './vendor/electron_boilerplate/window_state'; 9 | 10 | // Special module holding environment variables which you declared 11 | // in config/env_xxx.json file. 12 | import env from './env'; 13 | 14 | var mainWindow; 15 | 16 | // Preserver of the window size and position between app launches. 17 | var mainWindowState = windowStateKeeper('main', { 18 | width: 1000, 19 | height: 600 20 | }); 21 | 22 | app.on('ready', function () { 23 | 24 | mainWindow = new BrowserWindow({ 25 | x: mainWindowState.x, 26 | y: mainWindowState.y, 27 | width: mainWindowState.width, 28 | height: mainWindowState.height 29 | }); 30 | 31 | if (mainWindowState.isMaximized) { 32 | mainWindow.maximize(); 33 | } 34 | 35 | if (env.name === 'test') { 36 | mainWindow.loadURL('file://' + __dirname + '/spec.html'); 37 | } else { 38 | mainWindow.loadURL('file://' + __dirname + '/app.html'); 39 | } 40 | 41 | if (env.name !== 'production') { 42 | devHelper.setDevMenu(); 43 | mainWindow.openDevTools(); 44 | } 45 | 46 | mainWindow.on('close', function () { 47 | mainWindowState.saveState(mainWindow); 48 | }); 49 | }); 50 | 51 | app.on('window-all-closed', function () { 52 | app.quit(); 53 | }); 54 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/tasks/rebuild_native.js: -------------------------------------------------------------------------------- 1 | /* 2 | This script compiles native modules for Electron. 3 | If you don't plan to use native modules you can delete this file. 4 | 5 | But if you'd like to use them do those steps... 6 | 7 | 1. Go to main project's directory and run: 8 | npm install electron-rebuild --save-dev 9 | 10 | 2. Then go to app folder: 11 | cd app 12 | 13 | 3. Add to app/package.json lines: 14 | "scripts": { 15 | "postinstall": "node ../tasks/rebuild_native" 16 | } 17 | 18 | 4. Now install your native module: 19 | npm install my_native_module --save 20 | 21 | 5. Trigger once again full npm install so electron-rebuild can do it's job: 22 | npm install 23 | 24 | 6. Enjoy your native module! 25 | */ 26 | 27 | 'use strict'; 28 | 29 | var childProcess = require('child_process'); 30 | var path = require('path'); 31 | var Q = require('q'); 32 | var electron = require('electron-prebuilt'); 33 | var electronPackage = require('electron-prebuilt/package.json'); 34 | var rebuild = require('electron-rebuild'); 35 | 36 | var pathToElectronNativeModules = path.join(__dirname, '../app/node_modules'); 37 | 38 | rebuild.shouldRebuildNativeModules(electron) 39 | .then(function (shouldBuild) { 40 | if (!shouldBuild) { 41 | return true; 42 | } 43 | 44 | console.log('Rebuilding native modules for Electron...'); 45 | 46 | return rebuild.installNodeHeaders(electronPackage.version) 47 | .then(function () { 48 | return rebuild.rebuildNativeModules(electronPackage.version, pathToElectronNativeModules); 49 | }); 50 | }) 51 | .then(function () { 52 | console.log('Rebuilding complete.'); 53 | }) 54 | .catch(function (err) { 55 | console.error("Rebuilding error!"); 56 | console.error(err); 57 | }); 58 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/tasks/start.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Q = require('q'); 4 | var electron = require('electron-prebuilt'); 5 | var pathUtil = require('path'); 6 | var childProcess = require('child_process'); 7 | var kill = require('tree-kill'); 8 | var utils = require('./utils'); 9 | var watch; 10 | 11 | var gulpPath = pathUtil.resolve('./node_modules/.bin/gulp'); 12 | if (process.platform === 'win32') { 13 | gulpPath += '.cmd'; 14 | } 15 | 16 | var runBuild = function () { 17 | var deferred = Q.defer(); 18 | 19 | var build = childProcess.spawn(gulpPath, [ 20 | 'build', 21 | '--env=' + utils.getEnvName(), 22 | '--color' 23 | ], { 24 | stdio: 'inherit' 25 | }); 26 | 27 | build.on('close', function (code) { 28 | deferred.resolve(); 29 | }); 30 | 31 | return deferred.promise; 32 | }; 33 | 34 | var runGulpWatch = function () { 35 | watch = childProcess.spawn(gulpPath, [ 36 | 'watch', 37 | '--env=' + utils.getEnvName(), 38 | '--color' 39 | ], { 40 | stdio: 'inherit' 41 | }); 42 | 43 | watch.on('close', function (code) { 44 | // Gulp watch exits when error occured during build. 45 | // Just respawn it then. 46 | runGulpWatch(); 47 | }); 48 | }; 49 | 50 | var runApp = function () { 51 | var app = childProcess.spawn(electron, ['./build'], { 52 | stdio: 'inherit' 53 | }); 54 | 55 | app.on('close', function (code) { 56 | // User closed the app. Kill the host process. 57 | kill(watch.pid, 'SIGKILL', function () { 58 | process.exit(); 59 | }); 60 | }); 61 | }; 62 | 63 | runBuild() 64 | .then(function () { 65 | runGulpWatch(); 66 | runApp(); 67 | }); 68 | -------------------------------------------------------------------------------- /archive/chrome-app-prototype/css/simple-sidebar.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - Simple Sidebar HTML Template (http://startbootstrap.com) 3 | * Code licensed under the Apache License v2.0. 4 | * For details, see http://www.apache.org/licenses/LICENSE-2.0. 5 | */ 6 | 7 | /* Toggle Styles */ 8 | 9 | #wrapper { 10 | padding-left: 0; 11 | -webkit-transition: all 0.5s ease; 12 | -moz-transition: all 0.5s ease; 13 | -o-transition: all 0.5s ease; 14 | transition: all 0.5s ease; 15 | } 16 | 17 | #wrapper.toggled { 18 | padding-left: 250px; 19 | } 20 | 21 | #sidebar-wrapper { 22 | z-index: 1000; 23 | position: fixed; 24 | left: 250px; 25 | width: 0; 26 | height: 100%; 27 | margin-left: -250px; 28 | overflow-y: auto; 29 | background: #000; 30 | -webkit-transition: all 0.5s ease; 31 | -moz-transition: all 0.5s ease; 32 | -o-transition: all 0.5s ease; 33 | transition: all 0.5s ease; 34 | } 35 | 36 | #wrapper.toggled #sidebar-wrapper { 37 | width: 250px; 38 | } 39 | 40 | #page-content-wrapper { 41 | width: 100%; 42 | position: absolute; 43 | padding: 15px; 44 | } 45 | 46 | #wrapper.toggled #page-content-wrapper { 47 | position: absolute; 48 | margin-right: -250px; 49 | } 50 | 51 | /* Sidebar Styles */ 52 | 53 | .sidebar-nav { 54 | position: absolute; 55 | top: 0; 56 | width: 250px; 57 | margin: 0; 58 | padding: 0; 59 | list-style: none; 60 | } 61 | 62 | .sidebar-nav li { 63 | text-indent: 20px; 64 | line-height: 40px; 65 | } 66 | 67 | .sidebar-nav li a { 68 | display: block; 69 | text-decoration: none; 70 | color: #999999; 71 | } 72 | 73 | .sidebar-nav li a:hover { 74 | text-decoration: none; 75 | color: #fff; 76 | background: rgba(255,255,255,0.2); 77 | } 78 | 79 | .sidebar-nav li a:active, 80 | .sidebar-nav li a:focus { 81 | text-decoration: none; 82 | } 83 | 84 | .sidebar-nav > .sidebar-brand { 85 | height: 65px; 86 | font-size: 18px; 87 | line-height: 60px; 88 | } 89 | 90 | .sidebar-nav > .sidebar-brand a { 91 | color: #999999; 92 | } 93 | 94 | .sidebar-nav > .sidebar-brand a:hover { 95 | color: #fff; 96 | background: none; 97 | } 98 | 99 | @media(min-width:768px) { 100 | #wrapper { 101 | padding-left: 250px; 102 | } 103 | 104 | #wrapper.toggled { 105 | padding-left: 0; 106 | } 107 | 108 | #sidebar-wrapper { 109 | width: 250px; 110 | } 111 | 112 | #wrapper.toggled #sidebar-wrapper { 113 | width: 0; 114 | } 115 | 116 | #page-content-wrapper { 117 | padding: 20px; 118 | position: relative; 119 | } 120 | 121 | #wrapper.toggled #page-content-wrapper { 122 | position: relative; 123 | margin-right: 0; 124 | } 125 | } -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/stylesheets/simple-sidebar.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - Simple Sidebar HTML Template (http://startbootstrap.com) 3 | * Code licensed under the Apache License v2.0. 4 | * For details, see http://www.apache.org/licenses/LICENSE-2.0. 5 | */ 6 | 7 | /* Toggle Styles */ 8 | 9 | #wrapper { 10 | padding-left: 0; 11 | -webkit-transition: all 0.5s ease; 12 | -moz-transition: all 0.5s ease; 13 | -o-transition: all 0.5s ease; 14 | transition: all 0.5s ease; 15 | } 16 | 17 | #wrapper.toggled { 18 | padding-left: 250px; 19 | } 20 | 21 | #sidebar-wrapper { 22 | z-index: 1000; 23 | position: fixed; 24 | left: 250px; 25 | width: 0; 26 | height: 100%; 27 | margin-left: -250px; 28 | overflow-y: auto; 29 | background: #000; 30 | -webkit-transition: all 0.5s ease; 31 | -moz-transition: all 0.5s ease; 32 | -o-transition: all 0.5s ease; 33 | transition: all 0.5s ease; 34 | } 35 | 36 | #wrapper.toggled #sidebar-wrapper { 37 | width: 250px; 38 | } 39 | 40 | #page-content-wrapper { 41 | width: 100%; 42 | position: absolute; 43 | padding: 15px; 44 | } 45 | 46 | #wrapper.toggled #page-content-wrapper { 47 | position: absolute; 48 | margin-right: -250px; 49 | } 50 | 51 | /* Sidebar Styles */ 52 | 53 | .sidebar-nav { 54 | position: absolute; 55 | top: 0; 56 | width: 250px; 57 | margin: 0; 58 | padding: 0; 59 | list-style: none; 60 | } 61 | 62 | .sidebar-nav li { 63 | text-indent: 20px; 64 | line-height: 40px; 65 | } 66 | 67 | .sidebar-nav li a { 68 | display: block; 69 | text-decoration: none; 70 | color: #999999; 71 | } 72 | 73 | .sidebar-nav li a:hover { 74 | text-decoration: none; 75 | color: #fff; 76 | background: rgba(255,255,255,0.2); 77 | } 78 | 79 | .sidebar-nav li a:active, 80 | .sidebar-nav li a:focus { 81 | text-decoration: none; 82 | } 83 | 84 | .sidebar-nav > .sidebar-brand { 85 | height: 65px; 86 | font-size: 18px; 87 | line-height: 60px; 88 | } 89 | 90 | .sidebar-nav > .sidebar-brand a { 91 | color: #999999; 92 | } 93 | 94 | .sidebar-nav > .sidebar-brand a:hover { 95 | color: #fff; 96 | background: none; 97 | } 98 | 99 | @media(min-width:768px) { 100 | #wrapper { 101 | padding-left: 250px; 102 | } 103 | 104 | #wrapper.toggled { 105 | padding-left: 0; 106 | } 107 | 108 | #sidebar-wrapper { 109 | width: 250px; 110 | } 111 | 112 | #wrapper.toggled #sidebar-wrapper { 113 | width: 0; 114 | } 115 | 116 | #page-content-wrapper { 117 | padding: 20px; 118 | position: relative; 119 | } 120 | 121 | #wrapper.toggled #page-content-wrapper { 122 | position: relative; 123 | margin-right: 0; 124 | } 125 | } -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Simple Sidebar - Start Bootstrap Template 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 |
39 | 40 | 41 | 71 | 72 | 73 | 74 |
75 |
76 |
77 |
78 |

Simple Sidebar

79 |

This template has a responsive menu toggling system. The menu will appear collapsed on smaller screens, and will appear non-collapsed on larger screens. When toggled using the button below, the menu will appear/disappear. On small screens, the page content will be pushed off canvas.

80 |

Make sure to keep all page content within the #page-content-wrapper.

81 | Toggle Menu 82 |
83 |
84 |
85 |
86 | 87 | 88 |
89 | 90 | 91 | 92 | 98 | 99 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /archive/chrome-app-prototype/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Simple Sidebar - Start Bootstrap Template 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 26 | 27 | 28 | 29 | 30 | 31 |
32 | 33 | 34 | 64 | 65 | 66 | 67 |
68 |
69 |
70 |
71 |

Simple Sidebar

72 |

This template has a responsive menu toggling system. The menu will appear collapsed on smaller screens, and will appear non-collapsed on larger screens. When toggled using the button below, the menu will appear/disappear. On small screens, the page content will be pushed off canvas.

73 |

Make sure to keep all page content within the #page-content-wrapper.

74 | Toggle Menu 75 |
76 |
77 |
78 |
79 | 80 | 81 |
82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 97 | 98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/tasks/release_linux.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Q = require('q'); 4 | var gulpUtil = require('gulp-util'); 5 | var childProcess = require('child_process'); 6 | var jetpack = require('fs-jetpack'); 7 | var asar = require('asar'); 8 | var utils = require('./utils'); 9 | 10 | var projectDir; 11 | var releasesDir; 12 | var packName; 13 | var packDir; 14 | var tmpDir; 15 | var readyAppDir; 16 | var manifest; 17 | 18 | var init = function () { 19 | projectDir = jetpack; 20 | tmpDir = projectDir.dir('./tmp', { empty: true }); 21 | releasesDir = projectDir.dir('./releases'); 22 | manifest = projectDir.read('app/package.json', 'json'); 23 | packName = manifest.name + '_' + manifest.version; 24 | packDir = tmpDir.dir(packName); 25 | readyAppDir = packDir.cwd('opt', manifest.name); 26 | 27 | return Q(); 28 | }; 29 | 30 | var copyRuntime = function () { 31 | return projectDir.copyAsync('node_modules/electron-prebuilt/dist', readyAppDir.path(), { overwrite: true }); 32 | }; 33 | 34 | var packageBuiltApp = function () { 35 | var deferred = Q.defer(); 36 | 37 | asar.createPackage(projectDir.path('build'), readyAppDir.path('resources/app.asar'), function () { 38 | deferred.resolve(); 39 | }); 40 | 41 | return deferred.promise; 42 | }; 43 | 44 | var finalize = function () { 45 | // Create .desktop file from the template 46 | var desktop = projectDir.read('resources/linux/app.desktop'); 47 | desktop = utils.replace(desktop, { 48 | name: manifest.name, 49 | productName: manifest.productName, 50 | description: manifest.description, 51 | version: manifest.version, 52 | author: manifest.author 53 | }); 54 | packDir.write('usr/share/applications/' + manifest.name + '.desktop', desktop); 55 | 56 | // Copy icon 57 | projectDir.copy('resources/icon.png', readyAppDir.path('icon.png')); 58 | 59 | return Q(); 60 | }; 61 | 62 | var renameApp = function () { 63 | return readyAppDir.renameAsync("electron", manifest.name); 64 | }; 65 | 66 | var packToDebFile = function () { 67 | var deferred = Q.defer(); 68 | 69 | var debFileName = packName + '_amd64.deb'; 70 | var debPath = releasesDir.path(debFileName); 71 | 72 | gulpUtil.log('Creating DEB package...'); 73 | 74 | // Counting size of the app in KiB 75 | var appSize = Math.round(readyAppDir.inspectTree('.').size / 1024); 76 | 77 | // Preparing debian control file 78 | var control = projectDir.read('resources/linux/DEBIAN/control'); 79 | control = utils.replace(control, { 80 | name: manifest.name, 81 | description: manifest.description, 82 | version: manifest.version, 83 | author: manifest.author, 84 | size: appSize 85 | }); 86 | packDir.write('DEBIAN/control', control); 87 | 88 | // Build the package... 89 | childProcess.exec('fakeroot dpkg-deb -Zxz --build ' + packDir.path().replace(/\s/g, '\\ ') + ' ' + debPath.replace(/\s/g, '\\ '), 90 | function (error, stdout, stderr) { 91 | if (error || stderr) { 92 | console.log("ERROR while building DEB package:"); 93 | console.log(error); 94 | console.log(stderr); 95 | } else { 96 | gulpUtil.log('DEB package ready!', debPath); 97 | } 98 | deferred.resolve(); 99 | }); 100 | 101 | return deferred.promise; 102 | }; 103 | 104 | var cleanClutter = function () { 105 | return tmpDir.removeAsync('.'); 106 | }; 107 | 108 | module.exports = function () { 109 | return init() 110 | .then(copyRuntime) 111 | .then(packageBuiltApp) 112 | .then(finalize) 113 | .then(renameApp) 114 | .then(packToDebFile) 115 | .then(cleanClutter) 116 | .catch(console.error); 117 | }; 118 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/tasks/release_windows.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Q = require('q'); 4 | var gulpUtil = require('gulp-util'); 5 | var childProcess = require('child_process'); 6 | var jetpack = require('fs-jetpack'); 7 | var asar = require('asar'); 8 | var utils = require('./utils'); 9 | 10 | var projectDir; 11 | var tmpDir; 12 | var releasesDir; 13 | var readyAppDir; 14 | var manifest; 15 | 16 | var init = function () { 17 | projectDir = jetpack; 18 | tmpDir = projectDir.dir('./tmp', { empty: true }); 19 | releasesDir = projectDir.dir('./releases'); 20 | manifest = projectDir.read('app/package.json', 'json'); 21 | readyAppDir = tmpDir.cwd(manifest.name); 22 | 23 | return Q(); 24 | }; 25 | 26 | var copyRuntime = function () { 27 | return projectDir.copyAsync('node_modules/electron-prebuilt/dist', readyAppDir.path(), { overwrite: true }); 28 | }; 29 | 30 | var cleanupRuntime = function () { 31 | return readyAppDir.removeAsync('resources/default_app'); 32 | }; 33 | 34 | var packageBuiltApp = function () { 35 | var deferred = Q.defer(); 36 | 37 | asar.createPackage(projectDir.path('build'), readyAppDir.path('resources/app.asar'), function () { 38 | deferred.resolve(); 39 | }); 40 | 41 | return deferred.promise; 42 | }; 43 | 44 | var finalize = function () { 45 | var deferred = Q.defer(); 46 | 47 | projectDir.copy('resources/windows/icon.ico', readyAppDir.path('icon.ico')); 48 | 49 | // Replace Electron icon for your own. 50 | var rcedit = require('rcedit'); 51 | rcedit(readyAppDir.path('electron.exe'), { 52 | 'icon': projectDir.path('resources/windows/icon.ico'), 53 | 'version-string': { 54 | 'ProductName': manifest.productName, 55 | 'FileDescription': manifest.description, 56 | 'ProductVersion': manifest.version, 57 | 'CompanyName': manifest.author, // it might be better to add another field to package.json for this 58 | 'LegalCopyright': manifest.copyright, 59 | 'OriginalFilename': manifest.productName + '.exe' 60 | } 61 | }, function (err) { 62 | if (!err) { 63 | deferred.resolve(); 64 | } 65 | }); 66 | 67 | return deferred.promise; 68 | }; 69 | 70 | var renameApp = function () { 71 | return readyAppDir.renameAsync('electron.exe', manifest.productName + '.exe'); 72 | }; 73 | 74 | var createInstaller = function () { 75 | var deferred = Q.defer(); 76 | 77 | var finalPackageName = manifest.name + '_' + manifest.version + '.exe'; 78 | var installScript = projectDir.read('resources/windows/installer.nsi'); 79 | 80 | installScript = utils.replace(installScript, { 81 | name: manifest.name, 82 | productName: manifest.productName, 83 | author: manifest.author, 84 | version: manifest.version, 85 | src: readyAppDir.path(), 86 | dest: releasesDir.path(finalPackageName), 87 | icon: readyAppDir.path('icon.ico'), 88 | setupIcon: projectDir.path('resources/windows/setup-icon.ico'), 89 | banner: projectDir.path('resources/windows/setup-banner.bmp'), 90 | }); 91 | tmpDir.write('installer.nsi', installScript); 92 | 93 | gulpUtil.log('Building installer with NSIS...'); 94 | 95 | // Remove destination file if already exists. 96 | releasesDir.remove(finalPackageName); 97 | 98 | // Note: NSIS have to be added to PATH (environment variables). 99 | var nsis = childProcess.spawn('makensis', [ 100 | tmpDir.path('installer.nsi') 101 | ], { 102 | stdio: 'inherit' 103 | }); 104 | nsis.on('error', function (err) { 105 | if (err.message === 'spawn makensis ENOENT') { 106 | throw "Can't find NSIS. Are you sure you've installed it and" 107 | + " added to PATH environment variable?"; 108 | } else { 109 | throw err; 110 | } 111 | }); 112 | nsis.on('close', function () { 113 | gulpUtil.log('Installer ready!', releasesDir.path(finalPackageName)); 114 | deferred.resolve(); 115 | }); 116 | 117 | return deferred.promise; 118 | }; 119 | 120 | var cleanClutter = function () { 121 | return tmpDir.removeAsync('.'); 122 | }; 123 | 124 | module.exports = function () { 125 | return init() 126 | .then(copyRuntime) 127 | .then(cleanupRuntime) 128 | .then(packageBuiltApp) 129 | .then(finalize) 130 | .then(renameApp) 131 | .then(createInstaller) 132 | .then(cleanClutter) 133 | .catch(console.error); 134 | }; 135 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/tasks/build.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var pathUtil = require('path'); 4 | var Q = require('q'); 5 | var gulp = require('gulp'); 6 | var rollup = require('rollup'); 7 | var less = require('gulp-less'); 8 | var jetpack = require('fs-jetpack'); 9 | 10 | var utils = require('./utils'); 11 | var generateSpecsImportFile = require('./generate_specs_import'); 12 | 13 | var projectDir = jetpack; 14 | var srcDir = projectDir.cwd('./app'); 15 | var destDir = projectDir.cwd('./build'); 16 | 17 | var paths = { 18 | copyFromAppDir: [ 19 | './node_modules/**', 20 | './vendor/**', 21 | './**/*.html', 22 | './**/*.+(jpg|png|svg)', 23 | './stylesheets/*.css' 24 | ], 25 | } 26 | 27 | // ------------------------------------- 28 | // Tasks 29 | // ------------------------------------- 30 | 31 | gulp.task('clean', function (callback) { 32 | return destDir.dirAsync('.', { empty: true }); 33 | }); 34 | 35 | 36 | var copyTask = function () { 37 | return projectDir.copyAsync('app', destDir.path(), { 38 | overwrite: true, 39 | matching: paths.copyFromAppDir 40 | }); 41 | }; 42 | gulp.task('copy', ['clean'], copyTask); 43 | gulp.task('copy-watch', copyTask); 44 | 45 | 46 | var bundle = function (src, dest) { 47 | var deferred = Q.defer(); 48 | 49 | rollup.rollup({ 50 | entry: src, 51 | }).then(function (bundle) { 52 | var jsFile = pathUtil.basename(dest); 53 | var result = bundle.generate({ 54 | format: 'cjs', 55 | sourceMap: true, 56 | sourceMapFile: jsFile, 57 | }); 58 | // Wrap code in self invoking function so the variables don't 59 | // pollute the global namespace. 60 | var isolatedCode = '(function () {' + result.code + '\n}());'; 61 | return Q.all([ 62 | destDir.writeAsync(dest, isolatedCode + '\n//# sourceMappingURL=' + jsFile + '.map'), 63 | destDir.writeAsync(dest + '.map', result.map.toString()), 64 | ]); 65 | }).then(function () { 66 | deferred.resolve(); 67 | }).catch(function (err) { 68 | console.error('Build: Error during rollup', err.stack); 69 | }); 70 | 71 | return deferred.promise; 72 | }; 73 | 74 | var bundleApplication = function () { 75 | return Q.all([ 76 | bundle(srcDir.path('background.js'), destDir.path('background.js')), 77 | bundle(srcDir.path('app.js'), destDir.path('app.js')), 78 | ]); 79 | }; 80 | 81 | var bundleSpecs = function () { 82 | generateSpecsImportFile().then(function (specEntryPointPath) { 83 | return Q.all([ 84 | bundle(srcDir.path('background.js'), destDir.path('background.js')), 85 | bundle(specEntryPointPath, destDir.path('spec.js')), 86 | ]); 87 | }); 88 | }; 89 | 90 | var bundleTask = function () { 91 | if (utils.getEnvName() === 'test') { 92 | return bundleSpecs(); 93 | } 94 | return bundleApplication(); 95 | }; 96 | gulp.task('bundle', ['clean'], bundleTask); 97 | gulp.task('bundle-watch', bundleTask); 98 | 99 | 100 | var lessTask = function () { 101 | return gulp.src('app/stylesheets/main.less') 102 | .pipe(less()) 103 | .pipe(gulp.dest(destDir.path('stylesheets'))); 104 | }; 105 | gulp.task('less', ['clean'], lessTask); 106 | gulp.task('less-watch', lessTask); 107 | 108 | 109 | gulp.task('finalize', ['clean'], function () { 110 | var manifest = srcDir.read('package.json', 'json'); 111 | 112 | // Add "dev" or "test" suffix to name, so Electron will write all data 113 | // like cookies and localStorage in separate places for each environment. 114 | switch (utils.getEnvName()) { 115 | case 'development': 116 | manifest.name += '-dev'; 117 | manifest.productName += ' Dev'; 118 | break; 119 | case 'test': 120 | manifest.name += '-test'; 121 | manifest.productName += ' Test'; 122 | break; 123 | } 124 | 125 | // Copy environment variables to package.json file for easy use 126 | // in the running application. This is not official way of doing 127 | // things, but also isn't prohibited ;) 128 | manifest.env = projectDir.read('config/env_' + utils.getEnvName() + '.json', 'json'); 129 | 130 | destDir.write('package.json', manifest); 131 | }); 132 | 133 | 134 | gulp.task('watch', function () { 135 | gulp.watch('app/**/*.js', ['bundle-watch']); 136 | gulp.watch(paths.copyFromAppDir, { cwd: 'app' }, ['copy-watch']); 137 | gulp.watch('app/**/*.less', ['less-watch']); 138 | }); 139 | 140 | 141 | gulp.task('build', ['bundle', 'less', 'copy', 'finalize']); 142 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/resources/windows/installer.nsi: -------------------------------------------------------------------------------- 1 | ; NSIS packaging/install script 2 | ; Docs: http://nsis.sourceforge.net/Docs/Contents.html 3 | 4 | !include LogicLib.nsh 5 | !include nsDialogs.nsh 6 | 7 | ; -------------------------------- 8 | ; Variables 9 | ; -------------------------------- 10 | 11 | !define dest "{{dest}}" 12 | !define src "{{src}}" 13 | !define name "{{name}}" 14 | !define productName "{{productName}}" 15 | !define author "{{author}}" 16 | !define version "{{version}}" 17 | !define icon "{{icon}}" 18 | !define setupIcon "{{setupIcon}}" 19 | !define banner "{{banner}}" 20 | 21 | !define exec "{{productName}}.exe" 22 | 23 | !define regkey "Software\${productName}" 24 | !define uninstkey "Software\Microsoft\Windows\CurrentVersion\Uninstall\${productName}" 25 | 26 | !define uninstaller "uninstall.exe" 27 | 28 | ; -------------------------------- 29 | ; Installation 30 | ; -------------------------------- 31 | 32 | Unicode true 33 | SetCompressor /SOLID lzma 34 | 35 | Name "${productName}" 36 | Icon "${setupIcon}" 37 | OutFile "${dest}" 38 | InstallDir "$PROGRAMFILES\${productName}" 39 | InstallDirRegKey HKLM "${regkey}" "" 40 | 41 | RequestExecutionLevel admin 42 | CRCCheck on 43 | SilentInstall normal 44 | 45 | XPStyle on 46 | ShowInstDetails nevershow 47 | AutoCloseWindow false 48 | WindowIcon off 49 | 50 | Caption "${productName} Setup" 51 | ; Don't add sub-captions to title bar 52 | SubCaption 3 " " 53 | SubCaption 4 " " 54 | 55 | Page custom welcome 56 | Page instfiles 57 | 58 | Var Image 59 | Var ImageHandle 60 | 61 | Function .onInit 62 | 63 | ; Extract banner image for welcome page 64 | InitPluginsDir 65 | ReserveFile "${banner}" 66 | File /oname=$PLUGINSDIR\banner.bmp "${banner}" 67 | 68 | FunctionEnd 69 | 70 | ; Custom welcome page 71 | Function welcome 72 | 73 | nsDialogs::Create 1018 74 | 75 | ${NSD_CreateLabel} 185 1u 210 100% "Welcome to ${productName} version ${version} installer.$\r$\n$\r$\nClick install to begin." 76 | 77 | ${NSD_CreateBitmap} 0 0 170 210 "" 78 | Pop $Image 79 | ${NSD_SetImage} $Image $PLUGINSDIR\banner.bmp $ImageHandle 80 | 81 | nsDialogs::Show 82 | 83 | ${NSD_FreeImage} $ImageHandle 84 | 85 | FunctionEnd 86 | 87 | ; Installation declarations 88 | Section "Install" 89 | 90 | WriteRegStr HKLM "${regkey}" "Install_Dir" "$INSTDIR" 91 | WriteRegStr HKLM "${uninstkey}" "DisplayName" "${productName}" 92 | WriteRegStr HKLM "${uninstkey}" "DisplayIcon" '"$INSTDIR\icon.ico"' 93 | WriteRegStr HKLM "${uninstkey}" "UninstallString" '"$INSTDIR\${uninstaller}"' 94 | WriteRegStr HKLM "${uninstkey}" "Publisher" "${author}" 95 | WriteRegStr HKLM "${uninstkey}" "DisplayVersion" "${version}" 96 | 97 | ; Remove all application files copied by previous installation 98 | RMDir /r "$INSTDIR" 99 | 100 | SetOutPath $INSTDIR 101 | 102 | ; Include all files from /build directory 103 | File /r "${src}\*" 104 | 105 | ; Create start menu shortcut 106 | SetShellVarContext all 107 | CreateShortCut "$SMPROGRAMS\${productName}.lnk" "$INSTDIR\${exec}" "" "$INSTDIR\icon.ico" 108 | ; Create desktop shortcut 109 | CreateShortCut "$DESKTOP\${productName}.lnk" "$INSTDIR\${exec}" "" "$INSTDIR\icon.ico" 110 | 111 | WriteUninstaller "${uninstaller}" 112 | 113 | SectionEnd 114 | 115 | ; -------------------------------- 116 | ; Uninstaller 117 | ; -------------------------------- 118 | 119 | ShowUninstDetails nevershow 120 | 121 | UninstallCaption "Uninstall ${productName}" 122 | UninstallText "Don't like ${productName} anymore? Hit uninstall button." 123 | UninstallIcon "${icon}" 124 | 125 | UninstPage custom un.confirm un.confirmOnLeave 126 | UninstPage instfiles 127 | 128 | Var RemoveAppDataCheckbox 129 | Var RemoveAppDataCheckbox_State 130 | 131 | ; Custom uninstall confirm page 132 | Function un.confirm 133 | 134 | nsDialogs::Create 1018 135 | 136 | ${NSD_CreateLabel} 1u 1u 100% 24u "If you really want to remove ${productName} from your computer press uninstall button." 137 | 138 | ${NSD_CreateCheckbox} 1u 35u 100% 10u "Remove also my ${productName} personal data" 139 | Pop $RemoveAppDataCheckbox 140 | 141 | nsDialogs::Show 142 | 143 | FunctionEnd 144 | 145 | Function un.confirmOnLeave 146 | 147 | ; Save checkbox state on page leave 148 | ${NSD_GetState} $RemoveAppDataCheckbox $RemoveAppDataCheckbox_State 149 | 150 | FunctionEnd 151 | 152 | ; Uninstall declarations 153 | Section "Uninstall" 154 | 155 | DeleteRegKey HKLM "${uninstkey}" 156 | DeleteRegKey HKLM "${regkey}" 157 | 158 | SetShellVarContext all 159 | Delete "$SMPROGRAMS\${productName}.lnk" 160 | ; Remove desktop shortcut 161 | Delete "$DESKTOP\${productName}.lnk" 162 | ; Remove whole directory from Program Files 163 | RMDir /r "$INSTDIR" 164 | 165 | ; Remove also appData directory generated by your app if user checked this option 166 | ${If} $RemoveAppDataCheckbox_State == ${BST_CHECKED} 167 | RMDir /r "$APPDATA\${productName}" 168 | ${EndIf} 169 | 170 | SectionEnd 171 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/tasks/release_osx.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Q = require('q'); 4 | var gulpUtil = require('gulp-util'); 5 | var jetpack = require('fs-jetpack'); 6 | var asar = require('asar'); 7 | var utils = require('./utils'); 8 | var child_process = require('child_process'); 9 | 10 | var projectDir; 11 | var releasesDir; 12 | var tmpDir; 13 | var finalAppDir; 14 | var manifest; 15 | 16 | var init = function () { 17 | projectDir = jetpack; 18 | tmpDir = projectDir.dir('./tmp', { empty: true }); 19 | releasesDir = projectDir.dir('./releases'); 20 | manifest = projectDir.read('app/package.json', 'json'); 21 | finalAppDir = tmpDir.cwd(manifest.productName + '.app'); 22 | 23 | return Q(); 24 | }; 25 | 26 | var copyRuntime = function () { 27 | return projectDir.copyAsync('node_modules/electron-prebuilt/dist/Electron.app', finalAppDir.path()); 28 | }; 29 | 30 | var cleanupRuntime = function () { 31 | finalAppDir.remove('Contents/Resources/default_app'); 32 | finalAppDir.remove('Contents/Resources/atom.icns'); 33 | return Q(); 34 | }; 35 | 36 | var packageBuiltApp = function () { 37 | var deferred = Q.defer(); 38 | 39 | asar.createPackage(projectDir.path('build'), finalAppDir.path('Contents/Resources/app.asar'), function () { 40 | deferred.resolve(); 41 | }); 42 | 43 | return deferred.promise; 44 | }; 45 | 46 | var finalize = function () { 47 | // Prepare main Info.plist 48 | var info = projectDir.read('resources/osx/Info.plist'); 49 | info = utils.replace(info, { 50 | productName: manifest.productName, 51 | identifier: manifest.identifier, 52 | version: manifest.version, 53 | copyright: manifest.copyright 54 | }); 55 | finalAppDir.write('Contents/Info.plist', info); 56 | 57 | // Prepare Info.plist of Helper apps 58 | [' EH', ' NP', ''].forEach(function (helper_suffix) { 59 | info = projectDir.read('resources/osx/helper_apps/Info' + helper_suffix + '.plist'); 60 | info = utils.replace(info, { 61 | productName: manifest.productName, 62 | identifier: manifest.identifier 63 | }); 64 | finalAppDir.write('Contents/Frameworks/Electron Helper' + helper_suffix + '.app/Contents/Info.plist', info); 65 | }); 66 | 67 | // Copy icon 68 | projectDir.copy('resources/osx/icon.icns', finalAppDir.path('Contents/Resources/icon.icns')); 69 | 70 | return Q(); 71 | }; 72 | 73 | var renameApp = function () { 74 | // Rename helpers 75 | [' Helper EH', ' Helper NP', ' Helper'].forEach(function (helper_suffix) { 76 | finalAppDir.rename('Contents/Frameworks/Electron' + helper_suffix + '.app/Contents/MacOS/Electron' + helper_suffix, manifest.productName + helper_suffix ); 77 | finalAppDir.rename('Contents/Frameworks/Electron' + helper_suffix + '.app', manifest.productName + helper_suffix + '.app'); 78 | }); 79 | // Rename application 80 | finalAppDir.rename('Contents/MacOS/Electron', manifest.productName); 81 | return Q(); 82 | }; 83 | 84 | var signApp = function () { 85 | var identity = utils.getSigningId(); 86 | if (identity) { 87 | var cmd = 'codesign --deep --force --sign "' + identity + '" "' + finalAppDir.path() + '"'; 88 | gulpUtil.log('Signing with:', cmd); 89 | return Q.nfcall(child_process.exec, cmd); 90 | } else { 91 | return Q(); 92 | } 93 | }; 94 | 95 | var packToDmgFile = function () { 96 | var deferred = Q.defer(); 97 | 98 | var appdmg = require('appdmg'); 99 | var dmgName = manifest.name + '_' + manifest.version + '.dmg'; 100 | 101 | // Prepare appdmg config 102 | var dmgManifest = projectDir.read('resources/osx/appdmg.json'); 103 | dmgManifest = utils.replace(dmgManifest, { 104 | productName: manifest.productName, 105 | appPath: finalAppDir.path(), 106 | dmgIcon: projectDir.path("resources/osx/dmg-icon.icns"), 107 | dmgBackground: projectDir.path("resources/osx/dmg-background.png") 108 | }); 109 | tmpDir.write('appdmg.json', dmgManifest); 110 | 111 | // Delete DMG file with this name if already exists 112 | releasesDir.remove(dmgName); 113 | 114 | gulpUtil.log('Packaging to DMG file...'); 115 | 116 | var readyDmgPath = releasesDir.path(dmgName); 117 | appdmg({ 118 | source: tmpDir.path('appdmg.json'), 119 | target: readyDmgPath 120 | }) 121 | .on('error', function (err) { 122 | console.error(err); 123 | }) 124 | .on('finish', function () { 125 | gulpUtil.log('DMG file ready!', readyDmgPath); 126 | deferred.resolve(); 127 | }); 128 | 129 | return deferred.promise; 130 | }; 131 | 132 | var cleanClutter = function () { 133 | return tmpDir.removeAsync('.'); 134 | }; 135 | 136 | module.exports = function () { 137 | return init() 138 | .then(copyRuntime) 139 | .then(cleanupRuntime) 140 | .then(packageBuiltApp) 141 | .then(finalize) 142 | .then(renameApp) 143 | .then(signApp) 144 | .then(packToDmgFile) 145 | .then(cleanClutter) 146 | .catch(console.error); 147 | }; 148 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/vendor/jasmine/boot.js: -------------------------------------------------------------------------------- 1 | /** 2 | Starting with version 2.0, this file "boots" Jasmine, performing all of the necessary initialization before executing the loaded environment and all of a project's specs. This file should be loaded after `jasmine.js` and `jasmine_html.js`, but before any project source files or spec files are loaded. Thus this file can also be used to customize Jasmine for a project. 3 | 4 | If a project is using Jasmine via the standalone distribution, this file can be customized directly. If a project is using Jasmine via the [Ruby gem][jasmine-gem], this file can be copied into the support directory via `jasmine copy_boot_js`. Other environments (e.g., Python) will have different mechanisms. 5 | 6 | The location of `boot.js` can be specified and/or overridden in `jasmine.yml`. 7 | 8 | [jasmine-gem]: http://github.com/pivotal/jasmine-gem 9 | */ 10 | 11 | (function() { 12 | 13 | /** 14 | * ## Require & Instantiate 15 | * 16 | * Require Jasmine's core files. Specifically, this requires and attaches all of Jasmine's code to the `jasmine` reference. 17 | */ 18 | window.jasmine = jasmineRequire.core(jasmineRequire); 19 | 20 | /** 21 | * Since this is being run in a browser and the results should populate to an HTML page, require the HTML-specific Jasmine code, injecting the same reference. 22 | */ 23 | jasmineRequire.html(jasmine); 24 | 25 | /** 26 | * Create the Jasmine environment. This is used to run all specs in a project. 27 | */ 28 | var env = jasmine.getEnv(); 29 | 30 | /** 31 | * ## The Global Interface 32 | * 33 | * Build up the functions that will be exposed as the Jasmine public interface. A project can customize, rename or alias any of these functions as desired, provided the implementation remains unchanged. 34 | */ 35 | var jasmineInterface = jasmineRequire.interface(jasmine, env); 36 | 37 | /** 38 | * Add all of the Jasmine global/public interface to the proper global, so a project can use the public interface directly. For example, calling `describe` in specs instead of `jasmine.getEnv().describe`. 39 | */ 40 | if (typeof window == "undefined" && typeof exports == "object") { 41 | extend(exports, jasmineInterface); 42 | } else { 43 | extend(window, jasmineInterface); 44 | } 45 | 46 | /** 47 | * ## Runner Parameters 48 | * 49 | * More browser specific code - wrap the query string in an object and to allow for getting/setting parameters from the runner user interface. 50 | */ 51 | 52 | var queryString = new jasmine.QueryString({ 53 | getWindowLocation: function() { return window.location; } 54 | }); 55 | 56 | var catchingExceptions = queryString.getParam("catch"); 57 | env.catchExceptions(typeof catchingExceptions === "undefined" ? true : catchingExceptions); 58 | 59 | /** 60 | * ## Reporters 61 | * The `HtmlReporter` builds all of the HTML UI for the runner page. This reporter paints the dots, stars, and x's for specs, as well as all spec names and all failures (if any). 62 | */ 63 | var htmlReporter = new jasmine.HtmlReporter({ 64 | env: env, 65 | onRaiseExceptionsClick: function() { queryString.navigateWithNewParam("catch", !env.catchingExceptions()); }, 66 | addToExistingQueryString: function(key, value) { return queryString.fullStringWithNewParam(key, value); }, 67 | getContainer: function() { return document.body; }, 68 | createElement: function() { return document.createElement.apply(document, arguments); }, 69 | createTextNode: function() { return document.createTextNode.apply(document, arguments); }, 70 | timer: new jasmine.Timer() 71 | }); 72 | 73 | /** 74 | * The `jsApiReporter` also receives spec results, and is used by any environment that needs to extract the results from JavaScript. 75 | */ 76 | env.addReporter(jasmineInterface.jsApiReporter); 77 | env.addReporter(htmlReporter); 78 | 79 | /** 80 | * Filter which specs will be run by matching the start of the full name against the `spec` query param. 81 | */ 82 | var specFilter = new jasmine.HtmlSpecFilter({ 83 | filterString: function() { return queryString.getParam("spec"); } 84 | }); 85 | 86 | env.specFilter = function(spec) { 87 | return specFilter.matches(spec.getFullName()); 88 | }; 89 | 90 | /** 91 | * Setting up timing functions to be able to be overridden. Certain browsers (Safari, IE 8, phantomjs) require this hack. 92 | */ 93 | window.setTimeout = window.setTimeout; 94 | window.setInterval = window.setInterval; 95 | window.clearTimeout = window.clearTimeout; 96 | window.clearInterval = window.clearInterval; 97 | 98 | /** 99 | * ## Execution 100 | * 101 | * Replace the browser window's `onload`, ensure it's called, and then run all of the loaded specs. This includes initializing the `HtmlReporter` instance and then executing the loaded Jasmine environment. All of this will happen after all of the specs are loaded. 102 | */ 103 | var currentWindowOnload = window.onload; 104 | 105 | window.onload = function() { 106 | if (currentWindowOnload) { 107 | currentWindowOnload(); 108 | } 109 | htmlReporter.initialize(); 110 | env.execute(); 111 | }; 112 | 113 | /** 114 | * Helper function for readability above. 115 | */ 116 | function extend(destination, source) { 117 | for (var property in source) destination[property] = source[property]; 118 | return destination; 119 | } 120 | 121 | }()); 122 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/BOILERPLATE.md: -------------------------------------------------------------------------------- 1 | electron-boilerplate 2 | ============== 3 | Comprehensive boilerplate application for [Electron runtime](http://electron.atom.io). 4 | 5 | Scope of this project: 6 | 7 | - Provide basic structure of the application so you can much easier grasp what should go where. 8 | - Give you cross-platform development environment, which works the same way on OSX, Windows and Linux. 9 | - Generate ready for distribution installers of your app for all three operating systems. 10 | 11 | Not in the scope: 12 | 13 | - Imposing on you any framework (e.g. Angular, React). You can integrate the one which makes most sense for you. 14 | 15 | # Quick start 16 | The only development dependency of this project is [Node.js](https://nodejs.org). So just make sure you have it installed. 17 | Then type few commands known to every Node developer... 18 | ``` 19 | git clone https://github.com/szwacz/electron-boilerplate.git 20 | cd electron-boilerplate 21 | npm install 22 | npm start 23 | ``` 24 | ... and boom! You have running desktop application on your screen. 25 | 26 | # Structure of the project 27 | 28 | There are **two** `package.json` files: 29 | 30 | #### 1. For development 31 | Sits on path: `electron-boilerplate/package.json`. Here you declare dependencies for your development environment and build scripts. **This file is not distributed with real application!** 32 | 33 | Also here you declare the version of Electron runtime you want to use: 34 | ```json 35 | "devDependencies": { 36 | "electron-prebuilt": "^0.34.0" 37 | } 38 | ``` 39 | 40 | #### 2. For your application 41 | Sits on path: `electron-boilerplate/app/package.json`. This is **real** manifest of your application. Declare your app dependencies here. 42 | 43 | #### OMG, but seriously why there are two `package.json`? 44 | 1. Native npm modules (those written in C, not JavaScript) need to be compiled, and here we have two different compilation targets for them. Those used in application need to be compiled against electron runtime, and all `devDependencies` need to be compiled against your locally installed node.js. Thanks to having two files this is trivial. 45 | 2. When you package the app for distribution there is no need to add up to size of the app with your `devDependencies`. Here those are always not included (because reside outside the `app` directory). 46 | 47 | ### Project's folders 48 | 49 | - `app` - code of your application goes here. 50 | - `config` - place where you can declare environment specific stuff for your app. 51 | - `build` - in this folder lands built, runnable application. 52 | - `releases` - ready for distribution installers will land here. 53 | - `resources` - resources needed for particular operating system. 54 | - `tasks` - build and development environment scripts. 55 | 56 | 57 | # Development 58 | 59 | #### Installation 60 | 61 | ``` 62 | npm install 63 | ``` 64 | It will also download Electron runtime, and install dependencies for second `package.json` file inside `app` folder. 65 | 66 | #### Starting the app 67 | 68 | ``` 69 | npm start 70 | ``` 71 | 72 | #### Adding npm modules to your app 73 | 74 | Remember to add your dependency to `app/package.json` file, so do: 75 | ``` 76 | cd app 77 | npm install name_of_npm_module --save 78 | ``` 79 | 80 | #### Native npm modules 81 | 82 | Want to use them? See [this file](./tasks/rebuild_native.js) for instructions. 83 | 84 | #### Working with modules 85 | 86 | How about being future proof and using ES6 modules all the time in your app? Thanks to [rollup](https://github.com/rollup/rollup) you can do that. It will transpile the imports to proper `require()` statements, so even though ES6 modules aren't natively supported yet you can start using them today. 87 | 88 | You can use it on those kinds of modules: 89 | ```js 90 | // Modules authored by you 91 | import { myStuff } from './my_lib/my_stuff'; 92 | // Node.js native 93 | import fs from 'fs'; 94 | // Electron native 95 | import { app } from 'electron'; 96 | // Loaded from npm 97 | import moment from 'moment'; 98 | ``` 99 | 100 | #### Including files to your project 101 | 102 | The build script copies files from `app` to `build` directory and the application is started from `build`. Therefore if you want to use any special file/folder in your app make sure it will be copied via some of glob patterns in `tasks/build.js`: 103 | 104 | ```js 105 | var paths = { 106 | copyFromAppDir: [ 107 | './node_modules/**', 108 | './vendor/**', 109 | './**/*.html', 110 | './**/*.+(jpg|png|svg)' 111 | ], 112 | } 113 | ``` 114 | 115 | #### Unit tests 116 | 117 | electron-boilerplate has preconfigured [jasmine](http://jasmine.github.io/2.0/introduction.html) test runner. To run the tests go with standard: 118 | ``` 119 | npm test 120 | ``` 121 | You don't have to declare paths to spec files in any particular place. The runner will search through the project for all `*.spec.js` files and include them automatically. 122 | 123 | 124 | # Making a release 125 | 126 | **Note:** There are various icon and bitmap files in `resources` directory. Those are used in installers and are intended to be replaced by your own graphics. 127 | 128 | To make ready for distribution installer use command: 129 | ``` 130 | npm run release 131 | ``` 132 | It will start the packaging process for operating system you are running this command on. Ready for distribution file will be outputted to `releases` directory. 133 | 134 | You can create Windows installer only when running on Windows, the same is true for Linux and OSX. So to generate all three installers you need all three operating systems. 135 | 136 | ## Mac only 137 | 138 | #### App signing 139 | 140 | The Mac release supports [code signing](https://developer.apple.com/library/mac/documentation/Security/Conceptual/CodeSigningGuide/Procedures/Procedures.html). To sign the `.app` in the release image, include the certificate ID in the command as so, 141 | ``` 142 | npm run release -- --sign A123456789 143 | ``` 144 | 145 | ## Windows only 146 | 147 | #### Installer 148 | 149 | The installer is built using [NSIS](http://nsis.sourceforge.net). You have to install NSIS version 3.0, and add its folder to PATH in Environment Variables, so it is reachable to scripts in this project. For example, `C:\Program Files (x86)\NSIS`. 150 | 151 | #### 32-bit build on 64-bit Windows 152 | 153 | There are still a lot of 32-bit Windows installations in use. If you want to support those systems and have 64-bit OS make sure you've installed 32-bit (instead of 64-bit) Node version. There are [versions managers](https://github.com/coreybutler/nvm-windows) if you feel the need for both architectures on the same machine. 154 | 155 | # License 156 | 157 | The MIT License (MIT) 158 | 159 | Copyright (c) 2015-2016 Jakub Szwacz 160 | 161 | Permission is hereby granted, free of charge, to any person obtaining a copy 162 | of this software and associated documentation files (the "Software"), to deal 163 | in the Software without restriction, including without limitation the rights 164 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 165 | copies of the Software, and to permit persons to whom the Software is 166 | furnished to do so, subject to the following conditions: 167 | 168 | The above copyright notice and this permission notice shall be included in all 169 | copies or substantial portions of the Software. 170 | 171 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 172 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 173 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 174 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 175 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 176 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 177 | SOFTWARE. 178 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/vendor/jasmine/jasmine-html.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2008-2015 Pivotal Labs 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining 5 | a copy of this software and associated documentation files (the 6 | "Software"), to deal in the Software without restriction, including 7 | without limitation the rights to use, copy, modify, merge, publish, 8 | distribute, sublicense, and/or sell copies of the Software, and to 9 | permit persons to whom the Software is furnished to do so, subject to 10 | the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | */ 23 | jasmineRequire.html = function(j$) { 24 | j$.ResultsNode = jasmineRequire.ResultsNode(); 25 | j$.HtmlReporter = jasmineRequire.HtmlReporter(j$); 26 | j$.QueryString = jasmineRequire.QueryString(); 27 | j$.HtmlSpecFilter = jasmineRequire.HtmlSpecFilter(); 28 | }; 29 | 30 | jasmineRequire.HtmlReporter = function(j$) { 31 | 32 | var noopTimer = { 33 | start: function() {}, 34 | elapsed: function() { return 0; } 35 | }; 36 | 37 | function HtmlReporter(options) { 38 | var env = options.env || {}, 39 | getContainer = options.getContainer, 40 | createElement = options.createElement, 41 | createTextNode = options.createTextNode, 42 | onRaiseExceptionsClick = options.onRaiseExceptionsClick || function() {}, 43 | addToExistingQueryString = options.addToExistingQueryString || defaultQueryString, 44 | timer = options.timer || noopTimer, 45 | results = [], 46 | specsExecuted = 0, 47 | failureCount = 0, 48 | pendingSpecCount = 0, 49 | htmlReporterMain, 50 | symbols, 51 | failedSuites = []; 52 | 53 | this.initialize = function() { 54 | clearPrior(); 55 | htmlReporterMain = createDom('div', {className: 'jasmine_html-reporter'}, 56 | createDom('div', {className: 'banner'}, 57 | createDom('a', {className: 'title', href: 'http://jasmine.github.io/', target: '_blank'}), 58 | createDom('span', {className: 'version'}, j$.version) 59 | ), 60 | createDom('ul', {className: 'symbol-summary'}), 61 | createDom('div', {className: 'alert'}), 62 | createDom('div', {className: 'results'}, 63 | createDom('div', {className: 'failures'}) 64 | ) 65 | ); 66 | getContainer().appendChild(htmlReporterMain); 67 | 68 | symbols = find('.symbol-summary'); 69 | }; 70 | 71 | var totalSpecsDefined; 72 | this.jasmineStarted = function(options) { 73 | totalSpecsDefined = options.totalSpecsDefined || 0; 74 | timer.start(); 75 | }; 76 | 77 | var summary = createDom('div', {className: 'summary'}); 78 | 79 | var topResults = new j$.ResultsNode({}, '', null), 80 | currentParent = topResults; 81 | 82 | this.suiteStarted = function(result) { 83 | currentParent.addChild(result, 'suite'); 84 | currentParent = currentParent.last(); 85 | }; 86 | 87 | this.suiteDone = function(result) { 88 | if (result.status == 'failed') { 89 | failedSuites.push(result); 90 | } 91 | 92 | if (currentParent == topResults) { 93 | return; 94 | } 95 | 96 | currentParent = currentParent.parent; 97 | }; 98 | 99 | this.specStarted = function(result) { 100 | currentParent.addChild(result, 'spec'); 101 | }; 102 | 103 | var failures = []; 104 | this.specDone = function(result) { 105 | if(noExpectations(result) && typeof console !== 'undefined' && typeof console.error !== 'undefined') { 106 | console.error('Spec \'' + result.fullName + '\' has no expectations.'); 107 | } 108 | 109 | if (result.status != 'disabled') { 110 | specsExecuted++; 111 | } 112 | 113 | symbols.appendChild(createDom('li', { 114 | className: noExpectations(result) ? 'empty' : result.status, 115 | id: 'spec_' + result.id, 116 | title: result.fullName 117 | } 118 | )); 119 | 120 | if (result.status == 'failed') { 121 | failureCount++; 122 | 123 | var failure = 124 | createDom('div', {className: 'spec-detail failed'}, 125 | createDom('div', {className: 'description'}, 126 | createDom('a', {title: result.fullName, href: specHref(result)}, result.fullName) 127 | ), 128 | createDom('div', {className: 'messages'}) 129 | ); 130 | var messages = failure.childNodes[1]; 131 | 132 | for (var i = 0; i < result.failedExpectations.length; i++) { 133 | var expectation = result.failedExpectations[i]; 134 | messages.appendChild(createDom('div', {className: 'result-message'}, expectation.message)); 135 | messages.appendChild(createDom('div', {className: 'stack-trace'}, expectation.stack)); 136 | } 137 | 138 | failures.push(failure); 139 | } 140 | 141 | if (result.status == 'pending') { 142 | pendingSpecCount++; 143 | } 144 | }; 145 | 146 | this.jasmineDone = function() { 147 | var banner = find('.banner'); 148 | banner.appendChild(createDom('span', {className: 'duration'}, 'finished in ' + timer.elapsed() / 1000 + 's')); 149 | 150 | var alert = find('.alert'); 151 | 152 | alert.appendChild(createDom('span', { className: 'exceptions' }, 153 | createDom('label', { className: 'label', 'for': 'raise-exceptions' }, 'raise exceptions'), 154 | createDom('input', { 155 | className: 'raise', 156 | id: 'raise-exceptions', 157 | type: 'checkbox' 158 | }) 159 | )); 160 | var checkbox = find('#raise-exceptions'); 161 | 162 | checkbox.checked = !env.catchingExceptions(); 163 | checkbox.onclick = onRaiseExceptionsClick; 164 | 165 | if (specsExecuted < totalSpecsDefined) { 166 | var skippedMessage = 'Ran ' + specsExecuted + ' of ' + totalSpecsDefined + ' specs - run all'; 167 | alert.appendChild( 168 | createDom('span', {className: 'bar skipped'}, 169 | createDom('a', {href: '?', title: 'Run all specs'}, skippedMessage) 170 | ) 171 | ); 172 | } 173 | var statusBarMessage = ''; 174 | var statusBarClassName = 'bar '; 175 | 176 | if (totalSpecsDefined > 0) { 177 | statusBarMessage += pluralize('spec', specsExecuted) + ', ' + pluralize('failure', failureCount); 178 | if (pendingSpecCount) { statusBarMessage += ', ' + pluralize('pending spec', pendingSpecCount); } 179 | statusBarClassName += (failureCount > 0) ? 'failed' : 'passed'; 180 | } else { 181 | statusBarClassName += 'skipped'; 182 | statusBarMessage += 'No specs found'; 183 | } 184 | 185 | alert.appendChild(createDom('span', {className: statusBarClassName}, statusBarMessage)); 186 | 187 | for(i = 0; i < failedSuites.length; i++) { 188 | var failedSuite = failedSuites[i]; 189 | for(var j = 0; j < failedSuite.failedExpectations.length; j++) { 190 | var errorBarMessage = 'AfterAll ' + failedSuite.failedExpectations[j].message; 191 | var errorBarClassName = 'bar errored'; 192 | alert.appendChild(createDom('span', {className: errorBarClassName}, errorBarMessage)); 193 | } 194 | } 195 | 196 | var results = find('.results'); 197 | results.appendChild(summary); 198 | 199 | summaryList(topResults, summary); 200 | 201 | function summaryList(resultsTree, domParent) { 202 | var specListNode; 203 | for (var i = 0; i < resultsTree.children.length; i++) { 204 | var resultNode = resultsTree.children[i]; 205 | if (resultNode.type == 'suite') { 206 | var suiteListNode = createDom('ul', {className: 'suite', id: 'suite-' + resultNode.result.id}, 207 | createDom('li', {className: 'suite-detail'}, 208 | createDom('a', {href: specHref(resultNode.result)}, resultNode.result.description) 209 | ) 210 | ); 211 | 212 | summaryList(resultNode, suiteListNode); 213 | domParent.appendChild(suiteListNode); 214 | } 215 | if (resultNode.type == 'spec') { 216 | if (domParent.getAttribute('class') != 'specs') { 217 | specListNode = createDom('ul', {className: 'specs'}); 218 | domParent.appendChild(specListNode); 219 | } 220 | var specDescription = resultNode.result.description; 221 | if(noExpectations(resultNode.result)) { 222 | specDescription = 'SPEC HAS NO EXPECTATIONS ' + specDescription; 223 | } 224 | if(resultNode.result.status === 'pending' && resultNode.result.pendingReason !== '') { 225 | specDescription = specDescription + ' PENDING WITH MESSAGE: ' + resultNode.result.pendingReason; 226 | } 227 | specListNode.appendChild( 228 | createDom('li', { 229 | className: resultNode.result.status, 230 | id: 'spec-' + resultNode.result.id 231 | }, 232 | createDom('a', {href: specHref(resultNode.result)}, specDescription) 233 | ) 234 | ); 235 | } 236 | } 237 | } 238 | 239 | if (failures.length) { 240 | alert.appendChild( 241 | createDom('span', {className: 'menu bar spec-list'}, 242 | createDom('span', {}, 'Spec List | '), 243 | createDom('a', {className: 'failures-menu', href: '#'}, 'Failures'))); 244 | alert.appendChild( 245 | createDom('span', {className: 'menu bar failure-list'}, 246 | createDom('a', {className: 'spec-list-menu', href: '#'}, 'Spec List'), 247 | createDom('span', {}, ' | Failures '))); 248 | 249 | find('.failures-menu').onclick = function() { 250 | setMenuModeTo('failure-list'); 251 | }; 252 | find('.spec-list-menu').onclick = function() { 253 | setMenuModeTo('spec-list'); 254 | }; 255 | 256 | setMenuModeTo('failure-list'); 257 | 258 | var failureNode = find('.failures'); 259 | for (var i = 0; i < failures.length; i++) { 260 | failureNode.appendChild(failures[i]); 261 | } 262 | } 263 | }; 264 | 265 | return this; 266 | 267 | function find(selector) { 268 | return getContainer().querySelector('.jasmine_html-reporter ' + selector); 269 | } 270 | 271 | function clearPrior() { 272 | // return the reporter 273 | var oldReporter = find(''); 274 | 275 | if(oldReporter) { 276 | getContainer().removeChild(oldReporter); 277 | } 278 | } 279 | 280 | function createDom(type, attrs, childrenVarArgs) { 281 | var el = createElement(type); 282 | 283 | for (var i = 2; i < arguments.length; i++) { 284 | var child = arguments[i]; 285 | 286 | if (typeof child === 'string') { 287 | el.appendChild(createTextNode(child)); 288 | } else { 289 | if (child) { 290 | el.appendChild(child); 291 | } 292 | } 293 | } 294 | 295 | for (var attr in attrs) { 296 | if (attr == 'className') { 297 | el[attr] = attrs[attr]; 298 | } else { 299 | el.setAttribute(attr, attrs[attr]); 300 | } 301 | } 302 | 303 | return el; 304 | } 305 | 306 | function pluralize(singular, count) { 307 | var word = (count == 1 ? singular : singular + 's'); 308 | 309 | return '' + count + ' ' + word; 310 | } 311 | 312 | function specHref(result) { 313 | return addToExistingQueryString('spec', result.fullName); 314 | } 315 | 316 | function defaultQueryString(key, value) { 317 | return '?' + key + '=' + value; 318 | } 319 | 320 | function setMenuModeTo(mode) { 321 | htmlReporterMain.setAttribute('class', 'jasmine_html-reporter ' + mode); 322 | } 323 | 324 | function noExpectations(result) { 325 | return (result.failedExpectations.length + result.passedExpectations.length) === 0 && 326 | result.status === 'passed'; 327 | } 328 | } 329 | 330 | return HtmlReporter; 331 | }; 332 | 333 | jasmineRequire.HtmlSpecFilter = function() { 334 | function HtmlSpecFilter(options) { 335 | var filterString = options && options.filterString() && options.filterString().replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); 336 | var filterPattern = new RegExp(filterString); 337 | 338 | this.matches = function(specName) { 339 | return filterPattern.test(specName); 340 | }; 341 | } 342 | 343 | return HtmlSpecFilter; 344 | }; 345 | 346 | jasmineRequire.ResultsNode = function() { 347 | function ResultsNode(result, type, parent) { 348 | this.result = result; 349 | this.type = type; 350 | this.parent = parent; 351 | 352 | this.children = []; 353 | 354 | this.addChild = function(result, type) { 355 | this.children.push(new ResultsNode(result, type, this)); 356 | }; 357 | 358 | this.last = function() { 359 | return this.children[this.children.length - 1]; 360 | }; 361 | } 362 | 363 | return ResultsNode; 364 | }; 365 | 366 | jasmineRequire.QueryString = function() { 367 | function QueryString(options) { 368 | 369 | this.navigateWithNewParam = function(key, value) { 370 | options.getWindowLocation().search = this.fullStringWithNewParam(key, value); 371 | }; 372 | 373 | this.fullStringWithNewParam = function(key, value) { 374 | var paramMap = queryStringToParamMap(); 375 | paramMap[key] = value; 376 | return toQueryString(paramMap); 377 | }; 378 | 379 | this.getParam = function(key) { 380 | return queryStringToParamMap()[key]; 381 | }; 382 | 383 | return this; 384 | 385 | function toQueryString(paramMap) { 386 | var qStrPairs = []; 387 | for (var prop in paramMap) { 388 | qStrPairs.push(encodeURIComponent(prop) + '=' + encodeURIComponent(paramMap[prop])); 389 | } 390 | return '?' + qStrPairs.join('&'); 391 | } 392 | 393 | function queryStringToParamMap() { 394 | var paramStr = options.getWindowLocation().search.substring(1), 395 | params = [], 396 | paramMap = {}; 397 | 398 | if (paramStr.length > 0) { 399 | params = paramStr.split('&'); 400 | for (var i = 0; i < params.length; i++) { 401 | var p = params[i].split('='); 402 | var value = decodeURIComponent(p[1]); 403 | if (value === 'true' || value === 'false') { 404 | value = JSON.parse(value); 405 | } 406 | paramMap[decodeURIComponent(p[0])] = value; 407 | } 408 | } 409 | 410 | return paramMap; 411 | } 412 | 413 | } 414 | 415 | return QueryString; 416 | }; 417 | -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/vendor/jasmine/jasmine.css: -------------------------------------------------------------------------------- 1 | body { overflow-y: scroll; } 2 | 3 | .jasmine_html-reporter { background-color: #eee; padding: 5px; margin: -8px; font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333; } 4 | .jasmine_html-reporter a { text-decoration: none; } 5 | .jasmine_html-reporter a:hover { text-decoration: underline; } 6 | .jasmine_html-reporter p, .jasmine_html-reporter h1, .jasmine_html-reporter h2, .jasmine_html-reporter h3, .jasmine_html-reporter h4, .jasmine_html-reporter h5, .jasmine_html-reporter h6 { margin: 0; line-height: 14px; } 7 | .jasmine_html-reporter .banner, .jasmine_html-reporter .symbol-summary, .jasmine_html-reporter .summary, .jasmine_html-reporter .result-message, .jasmine_html-reporter .spec .description, .jasmine_html-reporter .spec-detail .description, .jasmine_html-reporter .alert .bar, .jasmine_html-reporter .stack-trace { padding-left: 9px; padding-right: 9px; } 8 | .jasmine_html-reporter .banner { position: relative; } 9 | .jasmine_html-reporter .banner .title { background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAZCAMAAACGusnyAAACdlBMVEX/////AP+AgICqVaqAQICZM5mAVYCSSZKAQICOOY6ATYCLRouAQICJO4mSSYCIRIiPQICHPIeOR4CGQ4aMQICGPYaLRoCFQ4WKQICPPYWJRYCOQoSJQICNPoSIRICMQoSHQICHRICKQoOHQICKPoOJO4OJQYOMQICMQ4CIQYKLQICIPoKLQ4CKQICNPoKJQISMQ4KJQoSLQYKJQISLQ4KIQoSKQYKIQICIQISMQoSKQYKLQIOLQoOJQYGLQIOKQIOMQoGKQYOLQYGKQIOLQoGJQYOJQIOKQYGJQIOKQoGKQIGLQIKLQ4KKQoGLQYKJQIGKQYKJQIGKQIKJQoGKQYKLQIGKQYKLQIOJQoKKQoOJQYKKQIOJQoKKQoOKQIOLQoKKQYOLQYKJQIOKQoKKQYKKQoKJQYOKQYKLQIOKQoKLQYOKQYKLQIOJQoGKQYKJQYGJQoGKQYKLQoGLQYGKQoGJQYKKQYGJQIKKQoGJQYKLQIKKQYGLQYKKQYGKQYGKQYKJQYOKQoKJQYOKQYKLQYOLQYOKQYKLQYOKQoKKQYKKQYOKQYOJQYKKQYKLQYKKQIKKQoKKQYKKQYKKQoKJQIKKQYKLQYKKQYKKQIKKQYKKQYKKQYKKQIKKQYKJQYGLQYGKQYKKQYKKQYGKQIKKQYGKQYOJQoKKQYOLQYKKQYOKQoKKQYKKQoKKQYKKQYKJQYKLQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKJQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKLQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKmIDpEAAAA0XRSTlMAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAiIyQlJycoKissLS4wMTQ1Njc4OTo7PDw+P0BCQ0RISUpLTE1OUFNUVVdYWFlaW15fYGFiY2ZnaGlqa2xtb3BxcnN0dnh5ent8fX5/gIGChIWIioyNjo+QkZOUlZaYmZqbnJ2eoKGio6WmqKmsra6vsLGztre4ubq7vL2+wMHDxMjJysvNzs/Q0dLU1tfY2dvc3t/g4eLj5ebn6Onq6+zt7u/w8vP09fb3+Pn6+/z9/vkVQXAAAAMaSURBVHhe5dXxV1N1GMfxz2ABbDgIAm5VDJOyVDIJLUMaVpBWUZUaGbmqoGpZRSiGiRWp6KoZ5AB0ZY50RImZQIlahKkMYXv/R90dBvET/rJfOr3Ouc8v99zPec59zvf56j+vYKlViSf7250X4Mr3O29Tgq08BdGB4DhcekEJ5YkQKFsgWZdtj9JpV+I8xPjLFqkrsEIqO8PHSpis36jWazcqjEsfJjkvRssVU37SdIOu4XCf5vEJPsnwJpnRNU9JmxhMk8l1gehIrq7hTFjzOD+Vf88629qKMJVNltInFeRexRQyJlNeqd1iGDlSzrIUIyXbyFfm3RYprcQRe7lqtWyGYbfc6dT0R2vmdOOkX3u55C1rP37ftiH+tDby4r/RBT0w8TyEkr+epB9XgPDmSYYWbrhCuFYaIyw3fDQAXTnSkh+ANofiHmWf9l+FY1I90FdQTetstO00o23novzVsJ7uB3/C5TkbjRwZ5JerwV4iRWq9HFbFMaK/d0TYqayRiQPuIxxS3Bu8JWU90/60tKi7vkhaznez0a/TbVOKj5CaOZh6fWG6/Lyv9B/ZLR1gw/S/fpbeVD3MCW1li6SvWDOn65tr99/uvWtBS0XDm4s1t+sOHpG0kpBKx/l77wOSnxLpcx6TXmXLTPQOKYOf9Q1dfr8/SJ2mFdCvl1Yl93DiHUZvXeLJbGSzYu5gVJ2slbSakOR8dxCq5adQ2oFLqsE9Ex3L4qQO0eOPeU5x56bypXp4onSEb5OkICX6lDat55TeoztNKQcJaakrz9KCb95oD69IKq+yKW4XPjknaS52V0TZqE2cTtXjcHSCRmUO88e+85hj3EP74i9p8pylw7lxgMDyyl6OV7ZejnjNMfatu87LxRbH0IS35gt2a4ZjmGpVBdKK3Wr6INk8jWWSGqbA55CKgjBRC6E9w78ydTg3ABS3AFV1QN0Y4Aa2pgEjWnQURj9L0ayK6R2ysEqxHUKzYnLvvyU+i9KM2JHJzE4vyZOyDcOwOsySajeLPc8sNvPJkFlyJd20wpqAzZeAfZ3oWybxd+P/3j+SG3uSBdf2VQAAAABJRU5ErkJggg==') no-repeat; background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iNjgxLjk2MjUyIgogICBoZWlnaHQ9IjE4Ny41IgogICBpZD0ic3ZnMiIKICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhOCI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczYiPjxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoMTgiPjxwYXRoCiAgICAgICAgIGQ9Ik0gMCwxNTAwIDAsMCBsIDU0NTUuNzQsMCAwLDE1MDAgTCAwLDE1MDAgeiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgaWQ9InBhdGgyMCIgLz48L2NsaXBQYXRoPjwvZGVmcz48ZwogICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMjUsMCwwLC0xLjI1LDAsMTg3LjUpIgogICAgIGlkPSJnMTAiPjxnCiAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuMSwwLjEpIgogICAgICAgaWQ9ImcxMiI+PGcKICAgICAgICAgaWQ9ImcxNCI+PGcKICAgICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxOCkiCiAgICAgICAgICAgaWQ9ImcxNiI+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTU0NCw1OTkuNDM0IGMgMC45MiwtNDAuMzUyIDI1LjY4LC04MS42MDIgNzEuNTMsLTgxLjYwMiAyNy41MSwwIDQ3LjY4LDEyLjgzMiA2MS40NCwzNS43NTQgMTIuODMsMjIuOTMgMTIuODMsNTYuODUyIDEyLjgzLDgyLjUyNyBsIDAsMzI5LjE4NCAtNzEuNTIsMCAwLDEwNC41NDMgMjY2LjgzLDAgMCwtMTA0LjU0MyAtNzAuNiwwIDAsLTM0NC43NyBjIDAsLTU4LjY5MSAtMy42OCwtMTA0LjUzMSAtNDQuOTMsLTE1Mi4yMTggLTM2LjY4LC00Mi4xOCAtOTYuMjgsLTY2LjAyIC0xNTMuMTQsLTY2LjAyIC0xMTcuMzcsMCAtMjA3LjI0LDc3Ljk0MSAtMjAyLjY0LDE5Ny4xNDUgbCAxMzAuMiwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMjIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDIzMDEuNCw2NjIuNjk1IGMgMCw4MC43MDMgLTY2Ljk0LDE0NS44MTMgLTE0Ny42MywxNDUuODEzIC04My40NCwwIC0xNDcuNjMsLTY4Ljc4MSAtMTQ3LjYzLC0xNTEuMzAxIDAsLTc5Ljc4NSA2Ni45NCwtMTQ1LjgwMSAxNDUuOCwtMTQ1LjgwMSA4NC4zNSwwIDE0OS40Niw2Ny44NTIgMTQ5LjQ2LDE1MS4yODkgeiBtIC0xLjgzLC0xODEuNTQ3IGMgLTM1Ljc3LC01NC4wOTcgLTkzLjUzLC03OC44NTkgLTE1Ny43MiwtNzguODU5IC0xNDAuMywwIC0yNTEuMjQsMTE2LjQ0OSAtMjUxLjI0LDI1NC45MTggMCwxNDIuMTI5IDExMy43LDI2MC40MSAyNTYuNzQsMjYwLjQxIDYzLjI3LDAgMTE4LjI5LC0yOS4zMzYgMTUyLjIyLC04Mi41MjMgbCAwLDY5LjY4NyAxNzUuMTQsMCAwLC0xMDQuNTI3IC02MS40NCwwIDAsLTI4MC41OTggNjEuNDQsMCAwLC0xMDQuNTI3IC0xNzUuMTQsMCAwLDY2LjAxOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAyNjIyLjMzLDU1Ny4yNTggYyAzLjY3LC00NC4wMTYgMzMuMDEsLTczLjM0OCA3OC44NiwtNzMuMzQ4IDMzLjkzLDAgNjYuOTMsMjMuODI0IDY2LjkzLDYwLjUwNCAwLDQ4LjYwNiAtNDUuODQsNTYuODU2IC04My40NCw2Ni45NDEgLTg1LjI4LDIyLjAwNCAtMTc4LjgxLDQ4LjYwNiAtMTc4LjgxLDE1NS44NzkgMCw5My41MzYgNzguODYsMTQ3LjYzMyAxNjUuOTgsMTQ3LjYzMyA0NCwwIDgzLjQzLC05LjE3NiAxMTAuOTQsLTQ0LjAwOCBsIDAsMzMuOTIyIDgyLjUzLDAgMCwtMTMyLjk2NSAtMTA4LjIxLDAgYyAtMS44MywzNC44NTYgLTI4LjQyLDU3Ljc3NCAtNjMuMjYsNTcuNzc0IC0zMC4yNiwwIC02Mi4zNSwtMTcuNDIyIC02Mi4zNSwtNTEuMzQ4IDAsLTQ1Ljg0NyA0NC45MywtNTUuOTMgODAuNjksLTY0LjE4IDg4LjAyLC0yMC4xNzUgMTgyLjQ3LC00Ny42OTUgMTgyLjQ3LC0xNTcuNzM0IDAsLTk5LjAyNyAtODMuNDQsLTE1NC4wMzkgLTE3NS4xMywtMTU0LjAzOSAtNDkuNTMsMCAtOTQuNDYsMTUuNTgyIC0xMjYuNTUsNTMuMTggbCAwLC00MC4zNCAtODUuMjcsMCAwLDE0Mi4xMjkgMTE0LjYyLDAiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGgyNiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjk4OC4xOCw4MDAuMjU0IC02My4yNiwwIDAsMTA0LjUyNyAxNjUuMDUsMCAwLC03My4zNTUgYyAzMS4xOCw1MS4zNDcgNzguODYsODUuMjc3IDE0MS4yMSw4NS4yNzcgNjcuODUsMCAxMjQuNzEsLTQxLjI1OCAxNTIuMjEsLTEwMi42OTkgMjYuNiw2Mi4zNTEgOTIuNjIsMTAyLjY5OSAxNjAuNDcsMTAyLjY5OSA1My4xOSwwIDEwNS40NiwtMjIgMTQxLjIxLC02Mi4zNTEgMzguNTIsLTQ0LjkzOCAzOC41MiwtOTMuNTMyIDM4LjUyLC0xNDkuNDU3IGwgMCwtMTg1LjIzOSA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40MiwwIDAsMTA0LjUyNyA2My4yOCwwIDAsMTU3LjcxNSBjIDAsMzIuMTAyIDAsNjAuNTI3IC0xNC42Nyw4OC45NTcgLTE4LjM0LDI2LjU4MiAtNDguNjEsNDAuMzQ0IC03OS43Nyw0MC4zNDQgLTMwLjI2LDAgLTYzLjI4LC0xMi44NDQgLTgyLjUzLC0zNi42NzIgLTIyLjkzLC0yOS4zNTUgLTIyLjkzLC01Ni44NjMgLTIyLjkzLC05Mi42MjkgbCAwLC0xNTcuNzE1IDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM4LjQxLDAgMCwxMDQuNTI3IDYzLjI4LDAgMCwxNTAuMzgzIGMgMCwyOS4zNDggMCw2Ni4wMjMgLTE0LjY3LDkxLjY5OSAtMTUuNTksMjkuMzM2IC00Ny42OSw0NC45MzQgLTgwLjcsNDQuOTM0IC0zMS4xOCwwIC01Ny43NywtMTEuMDA4IC03Ny45NCwtMzUuNzc0IC0yNC43NywtMzAuMjUzIC0yNi42LC02Mi4zNDMgLTI2LjYsLTk5Ljk0MSBsIDAsLTE1MS4zMDEgNjMuMjcsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNiwwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAzOTk4LjY2LDk1MS41NDcgLTExMS44NywwIDAsMTE4LjI5MyAxMTEuODcsMCAwLC0xMTguMjkzIHogbSAwLC00MzEuODkxIDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM5LjMzLDAgMCwxMDQuNTI3IDY0LjE5LDAgMCwyODAuNTk4IC02My4yNywwIDAsMTA0LjUyNyAxNzUuMTQsMCAwLC0zODUuMTI1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDQxNTkuMTIsODAwLjI1NCAtNjMuMjcsMCAwLDEwNC41MjcgMTc1LjE0LDAgMCwtNjkuNjg3IGMgMjkuMzUsNTQuMTAxIDg0LjM2LDgwLjY5OSAxNDQuODcsODAuNjk5IDUzLjE5LDAgMTA1LjQ1LC0yMi4wMTYgMTQxLjIyLC02MC41MjcgNDAuMzQsLTQ0LjkzNCA0MS4yNiwtODguMDMyIDQxLjI2LC0xNDMuOTU3IGwgMCwtMTkxLjY1MyA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40LDAgMCwxMDQuNTI3IDYzLjI2LDAgMCwxNTguNjM3IGMgMCwzMC4yNjIgMCw2MS40MzQgLTE5LjI2LDg4LjAzNSAtMjAuMTcsMjYuNTgyIC01My4xOCwzOS40MTQgLTg2LjE5LDM5LjQxNCAtMzMuOTMsMCAtNjguNzcsLTEzLjc1IC04OC45NCwtNDEuMjUgLTIxLjA5LC0yNy41IC0yMS4wOSwtNjkuNjg3IC0yMS4wOSwtMTAyLjcwNyBsIDAsLTE0Mi4xMjkgNjMuMjYsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNywwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDMyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA1MDgyLjQ4LDcwMy45NjUgYyAtMTkuMjQsNzAuNjA1IC04MS42LDExNS41NDcgLTE1NC4wNCwxMTUuNTQ3IC02Ni4wNCwwIC0xMjkuMywtNTEuMzQ4IC0xNDMuMDUsLTExNS41NDcgbCAyOTcuMDksMCB6IG0gODUuMjcsLTE0NC44ODMgYyAtMzguNTEsLTkzLjUyMyAtMTI5LjI3LC0xNTYuNzkzIC0yMzEuMDUsLTE1Ni43OTMgLTE0My4wNywwIC0yNTcuNjgsMTExLjg3MSAtMjU3LjY4LDI1NS44MzYgMCwxNDQuODgzIDEwOS4xMiwyNjEuMzI4IDI1NC45MSwyNjEuMzI4IDY3Ljg3LDAgMTM1LjcyLC0zMC4yNTggMTgzLjM5LC03OC44NjMgNDguNjIsLTUxLjM0NCA2OC43OSwtMTEzLjY5NSA2OC43OSwtMTgzLjM4MyBsIC0zLjY3LC0zOS40MzQgLTM5Ni4xMywwIGMgMTQuNjcsLTY3Ljg2MyA3Ny4wMywtMTE3LjM2MyAxNDYuNzIsLTExNy4zNjMgNDguNTksMCA5MC43NiwxOC4zMjggMTE4LjI4LDU4LjY3MiBsIDExNi40NCwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDY5MC44OTUsODUwLjcwMyA5MC43NSwwIDIyLjU0MywzMS4wMzUgMCwyNDMuMTIyIC0xMzUuODI5LDAgMCwtMjQzLjE0MSAyMi41MzYsLTMxLjAxNiIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDM2IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA2MzIuMzk1LDc0Mi4yNTggMjguMDM5LDg2LjMwNCAtMjIuNTUxLDMxLjA0IC0yMzEuMjIzLDc1LjEyOCAtNDEuOTc2LC0xMjkuMTgzIDIzMS4yNTcsLTc1LjEzNyAzNi40NTQsMTEuODQ4IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDcxNy40NDksNjUzLjEwNSAtNzMuNDEsNTMuMzYgLTM2LjQ4OCwtMTEuODc1IC0xNDIuOTAzLC0xOTYuNjkyIDEwOS44ODMsLTc5LjgyOCAxNDIuOTE4LDE5Ni43MDMgMCwzOC4zMzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0MCIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gODI4LjUyLDcwNi40NjUgLTczLjQyNiwtNTMuMzQgMC4wMTEsLTM4LjM1OSBMIDg5OC4wMDQsNDE4LjA3IDEwMDcuOSw0OTcuODk4IDg2NC45NzMsNjk0LjYwOSA4MjguNTIsNzA2LjQ2NSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA4MTIuMDg2LDgyOC41ODYgMjguMDU1LC04Ni4zMiAzNi40ODQsLTExLjgzNiAyMzEuMjI1LDc1LjExNyAtNDEuOTcsMTI5LjE4MyAtMjMxLjIzOSwtNzUuMTQgLTIyLjU1NSwtMzEuMDA0IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNDQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDczNi4zMDEsMTMzNS44OCBjIC0zMjMuMDQ3LDAgLTU4NS44NzUsLTI2Mi43OCAtNTg1Ljg3NSwtNTg1Ljc4MiAwLC0zMjMuMTE4IDI2Mi44MjgsLTU4NS45NzcgNTg1Ljg3NSwtNTg1Ljk3NyAzMjMuMDE5LDAgNTg1LjgwOSwyNjIuODU5IDU4NS44MDksNTg1Ljk3NyAwLDMyMy4wMDIgLTI2Mi43OSw1ODUuNzgyIC01ODUuODA5LDU4NS43ODIgbCAwLDAgeiBtIDAsLTExOC42MSBjIDI1Ny45NzIsMCA0NjcuMTg5LC0yMDkuMTMgNDY3LjE4OSwtNDY3LjE3MiAwLC0yNTguMTI5IC0yMDkuMjE3LC00NjcuMzQ4IC00NjcuMTg5LC00NjcuMzQ4IC0yNTguMDc0LDAgLTQ2Ny4yNTQsMjA5LjIxOSAtNDY3LjI1NCw0NjcuMzQ4IDAsMjU4LjA0MiAyMDkuMTgsNDY3LjE3MiA0NjcuMjU0LDQ2Ny4xNzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0NiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTA5MS4xMyw2MTkuODgzIC0xNzUuNzcxLDU3LjEyMSAxMS42MjksMzUuODA4IDE3NS43NjIsLTU3LjEyMSAtMTEuNjIsLTM1LjgwOCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQ4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA4NjYuOTU3LDkwMi4wNzQgODM2LjUsOTI0LjE5OSA5NDUuMTIxLDEwNzMuNzMgOTc1LjU4NiwxMDUxLjYxIDg2Ni45NTcsOTAyLjA3NCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDUwIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA2MDcuNDY1LDkwMy40NDUgNDk4Ljg1NSwxMDUyLjk3IDUyOS4zMiwxMDc1LjEgNjM3LjkzLDkyNS41NjYgNjA3LjQ2NSw5MDMuNDQ1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDM4MC42ODgsNjIyLjEyOSAtMTEuNjI2LDM1LjgwMSAxNzUuNzU4LDU3LjA5IDExLjYyMSwtMzUuODAxIC0xNzUuNzUzLC01Ny4wOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDU0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA3MTYuMjg5LDM3Ni41OSAzNy42NDA2LDAgMCwxODQuODE2IC0zNy42NDA2LDAgMCwtMTg0LjgxNiB6IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4=') no-repeat, none; -moz-background-size: 100%; -o-background-size: 100%; -webkit-background-size: 100%; background-size: 100%; display: block; float: left; width: 90px; height: 25px; } 10 | .jasmine_html-reporter .banner .version { margin-left: 14px; position: relative; top: 6px; } 11 | .jasmine_html-reporter .banner .duration { position: absolute; right: 14px; top: 6px; } 12 | .jasmine_html-reporter #jasmine_content { position: fixed; right: 100%; } 13 | .jasmine_html-reporter .version { color: #aaa; } 14 | .jasmine_html-reporter .banner { margin-top: 14px; } 15 | .jasmine_html-reporter .duration { color: #aaa; float: right; } 16 | .jasmine_html-reporter .symbol-summary { overflow: hidden; *zoom: 1; margin: 14px 0; } 17 | .jasmine_html-reporter .symbol-summary li { display: inline-block; height: 8px; width: 14px; font-size: 16px; } 18 | .jasmine_html-reporter .symbol-summary li.passed { font-size: 14px; } 19 | .jasmine_html-reporter .symbol-summary li.passed:before { color: #007069; content: "\02022"; } 20 | .jasmine_html-reporter .symbol-summary li.failed { line-height: 9px; } 21 | .jasmine_html-reporter .symbol-summary li.failed:before { color: #ca3a11; content: "\d7"; font-weight: bold; margin-left: -1px; } 22 | .jasmine_html-reporter .symbol-summary li.disabled { font-size: 14px; } 23 | .jasmine_html-reporter .symbol-summary li.disabled:before { color: #bababa; content: "\02022"; } 24 | .jasmine_html-reporter .symbol-summary li.pending { line-height: 17px; } 25 | .jasmine_html-reporter .symbol-summary li.pending:before { color: #ba9d37; content: "*"; } 26 | .jasmine_html-reporter .symbol-summary li.empty { font-size: 14px; } 27 | .jasmine_html-reporter .symbol-summary li.empty:before { color: #ba9d37; content: "\02022"; } 28 | .jasmine_html-reporter .exceptions { color: #fff; float: right; margin-top: 5px; margin-right: 5px; } 29 | .jasmine_html-reporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; } 30 | .jasmine_html-reporter .bar.failed { background-color: #ca3a11; } 31 | .jasmine_html-reporter .bar.passed { background-color: #007069; } 32 | .jasmine_html-reporter .bar.skipped { background-color: #bababa; } 33 | .jasmine_html-reporter .bar.errored { background-color: #ca3a11; } 34 | .jasmine_html-reporter .bar.menu { background-color: #fff; color: #aaa; } 35 | .jasmine_html-reporter .bar.menu a { color: #333; } 36 | .jasmine_html-reporter .bar a { color: white; } 37 | .jasmine_html-reporter.spec-list .bar.menu.failure-list, .jasmine_html-reporter.spec-list .results .failures { display: none; } 38 | .jasmine_html-reporter.failure-list .bar.menu.spec-list, .jasmine_html-reporter.failure-list .summary { display: none; } 39 | .jasmine_html-reporter .running-alert { background-color: #666; } 40 | .jasmine_html-reporter .results { margin-top: 14px; } 41 | .jasmine_html-reporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; } 42 | .jasmine_html-reporter.showDetails .summaryMenuItem:hover { text-decoration: underline; } 43 | .jasmine_html-reporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; } 44 | .jasmine_html-reporter.showDetails .summary { display: none; } 45 | .jasmine_html-reporter.showDetails #details { display: block; } 46 | .jasmine_html-reporter .summaryMenuItem { font-weight: bold; text-decoration: underline; } 47 | .jasmine_html-reporter .summary { margin-top: 14px; } 48 | .jasmine_html-reporter .summary ul { list-style-type: none; margin-left: 14px; padding-top: 0; padding-left: 0; } 49 | .jasmine_html-reporter .summary ul.suite { margin-top: 7px; margin-bottom: 7px; } 50 | .jasmine_html-reporter .summary li.passed a { color: #007069; } 51 | .jasmine_html-reporter .summary li.failed a { color: #ca3a11; } 52 | .jasmine_html-reporter .summary li.empty a { color: #ba9d37; } 53 | .jasmine_html-reporter .summary li.pending a { color: #ba9d37; } 54 | .jasmine_html-reporter .description + .suite { margin-top: 0; } 55 | .jasmine_html-reporter .suite { margin-top: 14px; } 56 | .jasmine_html-reporter .suite a { color: #333; } 57 | .jasmine_html-reporter .failures .spec-detail { margin-bottom: 28px; } 58 | .jasmine_html-reporter .failures .spec-detail .description { background-color: #ca3a11; } 59 | .jasmine_html-reporter .failures .spec-detail .description a { color: white; } 60 | .jasmine_html-reporter .result-message { padding-top: 14px; color: #333; white-space: pre; } 61 | .jasmine_html-reporter .result-message span.result { display: block; } 62 | .jasmine_html-reporter .stack-trace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666; border: 1px solid #ddd; background: white; white-space: pre; } 63 | -------------------------------------------------------------------------------- /archive/chrome-app-prototype/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.6 (http://getbootstrap.com) 3 | * Copyright 2011-2015 Twitter, Inc. 4 | * Licensed under the MIT license 5 | */ 6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); -------------------------------------------------------------------------------- /archive/electron-boilerplate/app/vendor/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.6 (http://getbootstrap.com) 3 | * Copyright 2011-2015 Twitter, Inc. 4 | * Licensed under the MIT license 5 | */ 6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); --------------------------------------------------------------------------------