├── .nvmrc ├── .github ├── FUNDING.yml └── workflows │ └── test.yml ├── .eslintignore ├── assets ├── img │ ├── clippy.map.png │ ├── clippy-icon-16x16.png │ ├── clippy-icon-48x48.png │ ├── clippy-icon-128x128.png │ ├── clippy-icon-gray-16x16.png │ ├── clippy-icon-gray-48x48.png │ └── screenshots │ │ └── clippy-google.jpg ├── css │ └── clippy.css └── js │ ├── clippy.js │ ├── agent.js │ └── jquery.min.js ├── .editorconfig ├── test ├── .eslintrc ├── index.test.js └── state.test.js ├── .babelrc ├── .eslintrc ├── LICENSE ├── .gitignore ├── package.json ├── manifest.json ├── README.md └── src ├── index.js └── state.js /.nvmrc: -------------------------------------------------------------------------------- 1 | 22 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: capJavert 2 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | assets 2 | lib 3 | webpack.config.js 4 | -------------------------------------------------------------------------------- /assets/img/clippy.map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/capJavert/clippy/HEAD/assets/img/clippy.map.png -------------------------------------------------------------------------------- /assets/img/clippy-icon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/capJavert/clippy/HEAD/assets/img/clippy-icon-16x16.png -------------------------------------------------------------------------------- /assets/img/clippy-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/capJavert/clippy/HEAD/assets/img/clippy-icon-48x48.png -------------------------------------------------------------------------------- /assets/img/clippy-icon-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/capJavert/clippy/HEAD/assets/img/clippy-icon-128x128.png -------------------------------------------------------------------------------- /assets/img/clippy-icon-gray-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/capJavert/clippy/HEAD/assets/img/clippy-icon-gray-16x16.png -------------------------------------------------------------------------------- /assets/img/clippy-icon-gray-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/capJavert/clippy/HEAD/assets/img/clippy-icon-gray-48x48.png -------------------------------------------------------------------------------- /assets/img/screenshots/clippy-google.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/capJavert/clippy/HEAD/assets/img/screenshots/clippy-google.jpg -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | indent_style = space 7 | indent_size = 4 8 | -------------------------------------------------------------------------------- /test/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../.eslintrc", 3 | "globals": { 4 | "jest": true, 5 | "clippyController": "readonly" 6 | }, 7 | "rules": { 8 | "no-debugger": "off", 9 | "no-console": "off" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "@babel/preset-env", 5 | { 6 | "targets": { 7 | "browsers": [ 8 | "last 1 versions", 9 | "ie >= 11" 10 | ] 11 | } 12 | } 13 | ] 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es6": true, 5 | "jest": true 6 | }, 7 | "extends": [ 8 | "airbnb-base" 9 | ], 10 | "globals": { 11 | "Atomics": "readonly", 12 | "SharedArrayBuffer": "readonly", 13 | "browser": true, 14 | "chrome": "readonly", 15 | "clippy": "readonly", 16 | "webStorageObject": "readonly" 17 | }, 18 | "parserOptions": { 19 | "ecmaVersion": 2018 20 | }, 21 | "rules": { 22 | "no-console": "off", 23 | "global-require": "off", 24 | "semi": "off", 25 | "comma-dangle": "off", 26 | "import/no-dynamic-require": "off", 27 | "indent": ["error", 4] 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | 3 | on: 4 | push: 5 | branches: 6 | - "master" 7 | tags-ignore: 8 | - gh-pages 9 | - website 10 | pull_request: 11 | branches: 12 | - "*" 13 | 14 | jobs: 15 | build: 16 | runs-on: ubuntu-latest 17 | steps: 18 | - name: Checkout repository 19 | uses: actions/checkout@v4 20 | 21 | - name: Set up Node.js 22 | uses: actions/setup-node@v4 23 | with: 24 | node-version: "22" 25 | 26 | - name: Install dependencies 27 | run: npm install 28 | 29 | - name: Build JavaScript 30 | run: CI=true npm run build:js 31 | 32 | - name: Lint code 33 | run: CI=true npm run lint 34 | 35 | - name: Run tests 36 | run: CI=true npm run test 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Ante Barić 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # nyc test coverage 18 | .nyc_output 19 | 20 | # jest test coverage 21 | coverage 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | .idea 60 | .DS_Store 61 | *.zip 62 | web-ext-artifacts 63 | 64 | # output folder 65 | lib 66 | -------------------------------------------------------------------------------- /assets/css/clippy.css: -------------------------------------------------------------------------------- 1 | .clippy, .clippy-balloon { 2 | position: fixed; 3 | z-index: 2147483647; 4 | cursor: pointer; 5 | } 6 | 7 | .clippy { 8 | bottom: 40px; 9 | right: 40px; 10 | } 11 | 12 | .clippy-balloon { 13 | 14 | background: #FFC; 15 | color: black; 16 | padding: 8px; 17 | border: 1px solid black; 18 | border-radius: 5px; 19 | 20 | } 21 | 22 | .clippy-content { 23 | max-width: 200px; 24 | min-width: 120px; 25 | font-family: "Microsoft Sans", sans-serif; 26 | font-size: 10pt; 27 | } 28 | 29 | .clippy-tip { 30 | width: 10px; 31 | height: 16px; 32 | background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAgCAMAAAAlvKiEAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAlQTFRF///MAAAA////52QwgAAAAAN0Uk5T//8A18oNQQAAAGxJREFUeNqs0kEOwCAIRFHn3//QTUU6xMyyxii+jQosrTPkyPEM6IN3FtzIRk1U4dFeKWQiH6pRRowMVKEmvronEynkwj0uZJgR22+YLopPSo9P34wJSamLSU7lSIWLJU7NkNomNlhqxUeAAQC+TQLZyEuJBwAAAABJRU5ErkJggg==) no-repeat; 33 | position: absolute; 34 | } 35 | 36 | .clippy-top-left .clippy-tip { 37 | top: 100%; 38 | margin-top: 0px; 39 | left: 100%; 40 | margin-left: -50px; 41 | } 42 | 43 | .clippy-top-right .clippy-tip { 44 | top: 100%; 45 | margin-top: 0px; 46 | left: 0; 47 | margin-left: 50px; 48 | background-position: -10px 0; 49 | 50 | } 51 | 52 | .clippy-bottom-right .clippy-tip { 53 | top: 0; 54 | margin-top: -16px; 55 | left: 0; 56 | margin-left: 50px; 57 | background-position: -10px -16px; 58 | } 59 | 60 | .clippy-bottom-left .clippy-tip { 61 | top: 0; 62 | margin-top: -16px; 63 | left: 100%; 64 | margin-left: -50px; 65 | background-position: 0px -16px; 66 | } 67 | 68 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "clippy", 3 | "version": "1.10.0", 4 | "description": "Clippy MS Word Office asistant is now back to help inside your browser!", 5 | "main": "lib/index.js", 6 | "scripts": { 7 | "test": "jest --verbose", 8 | "test:coverage": "jest --collect-coverage", 9 | "build": "npm run build:js && web-ext build --ignore-files test coverage README.md package*.json assets/img/screenshots src", 10 | "build:js": "rimraf lib && babel src --out-dir lib", 11 | "watch": "rimraf lib && babel --watch src --out-dir lib", 12 | "extension": "web-ext run --ignore-files test coverage README.md package*.json assets/img/screenshots src", 13 | "lint": "eslint --max-warnings=0 src" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "git+https://github.com/capJavert/clippy.git" 18 | }, 19 | "author": "Ante Barić (capJavert)", 20 | "license": "MIT", 21 | "bugs": { 22 | "url": "https://github.com/capJavert/clippy/issues" 23 | }, 24 | "homepage": "https://github.com/capJavert/clippy#readme", 25 | "devDependencies": { 26 | "@babel/cli": "^7.5.5", 27 | "@babel/core": "^7.5.5", 28 | "@babel/preset-env": "^7.5.5", 29 | "babel-jest": "^24.9.0", 30 | "eslint": "^6.2.1", 31 | "eslint-config-airbnb-base": "^14.0.0", 32 | "eslint-plugin-import": "^2.18.2", 33 | "husky": "^3.0.4", 34 | "jest": "^29.2.0", 35 | "jest-environment-jsdom": "^29.7.0", 36 | "rimraf": "^3.0.2", 37 | "web-ext": "^3.1.1" 38 | }, 39 | "husky": { 40 | "hooks": { 41 | "pre-push": "npm run lint" 42 | } 43 | }, 44 | "jest": { 45 | "collectCoverageFrom": [ 46 | "/src/index.js", 47 | "/src/state.js" 48 | ] 49 | }, 50 | "volta": { 51 | "node": "16.13.2" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "Clippy", 4 | "short_name": "Clippy Assistant", 5 | "description": "Clippy MS Word Office assistant is now back to assist inside your browser!", 6 | "version": "1.10.0", 7 | "author": "Ante Barić (capJavert)", 8 | "icons": { 9 | "16": "assets/img/clippy-icon-16x16.png", 10 | "48": "assets/img/clippy-icon-48x48.png", 11 | "128": "assets/img/clippy-icon-128x128.png" 12 | }, 13 | "action": { 14 | "default_title": "Clippy Assistant", 15 | "default_icon": { 16 | "16": "assets/img/clippy-icon-gray-48x48.png", 17 | "24": "assets/img/clippy-icon-gray-48x48.png", 18 | "32": "assets/img/clippy-icon-gray-48x48.png" 19 | } 20 | }, 21 | "content_scripts": [ 22 | { 23 | "matches": [ 24 | "" 25 | ], 26 | "css": [ 27 | "assets/css/clippy.css" 28 | ], 29 | "js": [ 30 | "assets/js/jquery.min.js", 31 | "assets/js/clippy.js", 32 | "assets/js/agent.js", 33 | "lib/index.js" 34 | ], 35 | "run_at": "document_end", 36 | "all_frames": false 37 | } 38 | ], 39 | "background": { 40 | "service_worker": "lib/state.js", 41 | "type": "module" 42 | }, 43 | "web_accessible_resources": [ 44 | { 45 | "resources": [ 46 | "assets/img/clippy.map.png" 47 | ], 48 | "matches": [ 49 | "" 50 | ] 51 | } 52 | ], 53 | "permissions": [ 54 | "activeTab", 55 | "storage" 56 | ], 57 | "host_permissions": [ 58 | "" 59 | ], 60 | "externally_connectable": { 61 | "matches": [ 62 | "http://localhost:8080/*", 63 | "https://capjavert.github.com/*", 64 | "https://antebaric.from.hr/*", 65 | "http://antebaric.from.hr/*", 66 | "https://kickass.website/*", 67 | "https://clippy.kickass.website/*", 68 | "https://*.capjavert.now.sh/*" 69 | ] 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Clippy 2 | 3 | [![Chrome Web Store](https://img.shields.io/chrome-web-store/v/oaknkllfdceggjpbonhiegoaifjdkfjd)](https://chrome.google.com/webstore/detail/clippy/oaknkllfdceggjpbonhiegoaifjdkfjd) 4 | [![Mozilla Add-on](https://img.shields.io/amo/v/clippy-assistant)](https://addons.mozilla.org/en-US/firefox/addon/clippy-assistant/) 5 | 6 | [🇭🇷 Started in Croatia](https://startedincroatia.com) 7 | 8 | Clippy MS Word Office asistant is now back to assist inside your browser! 9 | 10 | ![alt text](https://github.com/capJavert/clippy/raw/master/assets/img/screenshots/clippy-google.jpg "Clippy in action!") 11 | 12 | ## Features 13 | - Adds Clippy assistant to every page 14 | - You can enable/disable assistan globally through icon in toolbar 15 | - On selected sites Clippy will show useful but mostly funny comments (checkout Contribute section) 16 | 17 | ## The code 18 | You can pack this code into your custom extension for any major browser. These browsers are officially supported: 19 | - Chrome 20 | - Firefox (57+) 21 | - Opera 22 | 23 | Consult these links for guids on how to develop, test and pack extensions: 24 | - Chrome: https://developer.chrome.com/extensions/getstarted 25 | - Firefox: https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Your_first_WebExtension 26 | - Opera: https://dev.opera.com/extensions/basics 27 | 28 | ### Setup the code 29 | ``` 30 | $ git clone https://github.com/capJavert/clippy.git 31 | $ cd clippy 32 | $ npm install 33 | ``` 34 | 35 | ### Contribute 36 | Clippy fetches comments from my personal repository file: https://github.com/capJavert/clippy-dictionary/blob/master/clippy.json - Feel free to contribute new comments for your favorite sites by making a pull request 37 | - Entries are filled in format ```"keyword": "comment"``` 38 | - For example sitename for github.com would be 'github', but it could also be "com" which would add this comment for all sites containing ".com" in URL 39 | - You can also define an array of comments like ```"keyword: ["comment1", "comment2"]``` 40 | - If there are multiple comments for the same site Clippy will pick a random one 41 | - I will try to merge any pull requests on regular basis 42 | - Feel free to build and install your own version of Clippy if you don't want to wait for next update 43 | 44 | ### Credits 45 | - Smore Inc. (https://github.com/smore-inc/clippy.js) - JS recreation of classic MS Word assistant 46 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-var */ 2 | var browser = (function createBrowser() { 3 | if (typeof chrome !== 'undefined') { 4 | return chrome 5 | } 6 | 7 | if (typeof browser !== 'undefined') { 8 | return browser 9 | } 10 | 11 | if (typeof global !== 'undefined' && typeof global.browser !== 'undefined') { 12 | return global.browser; 13 | } 14 | 15 | throw new Error('No browser found') 16 | }()) 17 | /* eslint-enable no-var */ 18 | 19 | const clippyController = { 20 | agent: null, 21 | lastComment: null, 22 | animations: ['Congratulate', 'LookRight', 'SendMail', 'Thinking', 'Explain', 'IdleRopePile', 'IdleAtom', 'Print', 'GetAttention', 'Save', 'GetTechy', 'GestureUp', 'Idle1_1', 'Processing', 'Alert', 'LookUpRight', 'IdleSideToSide', 'LookLeft', 'IdleHeadScratch', 'LookUpLeft', 'CheckingSomething', 'Hearing_1', 'GetWizardy', 'IdleFingerTap', 'GestureLeft', 'Wave', 'GestureRight', 'Writing', 'IdleSnooze', 'LookDownRight', 'GetArtsy', 'LookDown', 'Searching', 'EmptyTrash', 'LookUp', 'GestureDown', 'RestPose', 'IdleEyeBrowRaise', 'LookDownLeft'], 23 | comments: {}, 24 | init(agent) { 25 | this.agent = agent 26 | this.fetchCommentUpdates() 27 | 28 | browser.runtime.sendMessage({ name: 'isActive' }, (response) => { 29 | if (response.value) { 30 | clippyController.toggle(response.value) 31 | clippyController.idle() 32 | } 33 | }) 34 | }, 35 | talk() { 36 | const { hostname } = window.location 37 | let clippyComments = [] 38 | 39 | Object.keys(this.comments).forEach((property) => { 40 | if (hostname.indexOf(property) !== -1) { 41 | if (this.comments[property].constructor === Array) { 42 | clippyComments = clippyComments.concat(this.comments[property]) 43 | } else { 44 | clippyComments.push(this.comments[property]) 45 | } 46 | } 47 | }) 48 | 49 | if (clippyComments.length > 0) { 50 | const nextComment = clippyComments.constructor === Array 51 | ? clippyComments[Math.floor(Math.random() * clippyComments.length)] 52 | : clippyComments 53 | 54 | if (nextComment !== this.lastComment) { 55 | this.agent.speak(nextComment) 56 | this.lastComment = nextComment 57 | } else { 58 | this.lastComment = null 59 | } 60 | } else { 61 | this.agent.stop() 62 | } 63 | }, 64 | toggle(state) { 65 | const clippyBalloon = document.getElementsByClassName('clippy-balloon') 66 | 67 | if (clippyBalloon.length > 0) { 68 | clippyBalloon[0].style.display = state && clippyBalloon[0].innerText.length > 0 ? 'block' : 'none' 69 | } 70 | 71 | this.agent.stop() 72 | 73 | if (!state) { 74 | this.agent.play('GoodBye', 5000, () => { 75 | clippyController.agent.hide(true) 76 | }) 77 | } else { 78 | clippyController.agent.show(true) 79 | } 80 | }, 81 | fetchCommentUpdates() { 82 | browser.runtime.sendMessage({ name: 'comments' }) 83 | }, 84 | idle() { 85 | browser.runtime.sendMessage({ name: 'idle' }) 86 | }, 87 | animate(callback) { 88 | this.agent.play( 89 | this.animations[Math.floor(Math.random() * this.animations.length)], 90 | 5000, 91 | callback 92 | ) 93 | } 94 | } 95 | 96 | window.addEventListener('load', () => { 97 | clippy.load('Clippy', (agent) => { 98 | clippyController.init(agent) 99 | }) 100 | }, false) 101 | 102 | browser.runtime.onMessage.addListener((request) => { 103 | switch (request.name) { 104 | case 'isActive': 105 | clippyController.toggle(request.value) 106 | 107 | if (request.value) { 108 | clippyController.idle() 109 | } 110 | break 111 | case 'comments': 112 | clippyController.comments = request.value 113 | break 114 | case 'animate': 115 | if (!clippyController.agent) { 116 | return 117 | } 118 | 119 | clippyController.fetchCommentUpdates() 120 | 121 | browser.runtime.sendMessage({ name: 'isActive' }, (response) => { 122 | if (response.value) { 123 | clippyController.agent.stop() 124 | clippyController.talk() 125 | clippyController.animate(() => { 126 | clippyController.idle() 127 | }) 128 | } 129 | }) 130 | break 131 | default: 132 | break 133 | } 134 | }) 135 | 136 | const isFirefox = typeof InstallTrigger !== 'undefined' 137 | 138 | if (isFirefox) { 139 | window.addEventListener('message', (event) => { 140 | const request = event.data || {} 141 | const manifest = browser.runtime.getManifest() 142 | 143 | browser.runtime.sendMessage({ name: 'isActive' }, (response) => { 144 | switch (request.name) { 145 | case 'WHAT_IS_THE_MEANING_OF_LIFE': 146 | window.postMessage({ 147 | name: 'SILENCE_MY_BROTHER', 148 | value: { 149 | installed: true, 150 | isActive: response.value, 151 | version: manifest.version 152 | } 153 | }) 154 | break 155 | case 'RISE': 156 | browser.runtime.sendMessage({ name: 'toggle' }, (toggleResponse) => { 157 | window.postMessage(toggleResponse) 158 | }) 159 | break 160 | default: 161 | break 162 | } 163 | }) 164 | 165 | return true 166 | }, false) 167 | } 168 | 169 | if (typeof global !== 'undefined') { 170 | global.clippyController = clippyController 171 | } 172 | -------------------------------------------------------------------------------- /test/index.test.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @jest-environment jsdom 3 | */ 4 | 5 | const createBrowser = () => { 6 | global.browser = { 7 | runtime: { 8 | sendMessage() {}, 9 | onMessage: { 10 | addListener(listener) { 11 | this.listener = listener 12 | } 13 | } 14 | } 15 | } 16 | } 17 | 18 | const dictionary = { 19 | localhost: 'It works! Good job!', 20 | twitter: 'Tweets can only be 280 characters long!', 21 | github: 'Need lessons in Python?', 22 | quora: [ 23 | '????????????????', 24 | 'What is my purpose?' 25 | ] 26 | } 27 | 28 | const createAgent = () => ({ 29 | isActive: false, 30 | play(animation, length, callback) { 31 | this.animation = animation 32 | this.animationLength = length 33 | this.callback = callback 34 | 35 | if (typeof this.callback === 'function') { 36 | this.callback() 37 | } 38 | }, 39 | stop() {}, 40 | show() { 41 | this.isActive = true 42 | }, 43 | hide() { 44 | this.isActive = false 45 | }, 46 | speak(comment) { 47 | this.comment = comment 48 | } 49 | }) 50 | 51 | beforeEach(() => { 52 | createBrowser() 53 | require('../src/index') 54 | }) 55 | 56 | afterEach(() => { 57 | jest.resetModules() 58 | }) 59 | 60 | test('agent init', () => { 61 | const agent = createAgent() 62 | clippyController.init(agent) 63 | 64 | expect(clippyController.agent).not.toBeNull() 65 | }) 66 | 67 | it('should check active status on init', () => { 68 | browser.runtime.sendMessage = (message, callback) => { 69 | if (message.name === 'isActive') { 70 | callback({ value: true }) 71 | } 72 | } 73 | 74 | const agent = createAgent() 75 | clippyController.init(agent) 76 | 77 | expect(clippyController.agent.isActive).toBe(true) 78 | }) 79 | 80 | it('should respect off switch on init', () => { 81 | browser.runtime.sendMessage = (message, callback) => { 82 | if (message.name === 'isActive') { 83 | callback({ value: false }) 84 | } 85 | } 86 | 87 | const agent = createAgent() 88 | clippyController.init(agent) 89 | 90 | expect(clippyController.agent.isActive).toBe(false) 91 | }) 92 | 93 | it('should prefetch comments on init', () => { 94 | expect.assertions(2) 95 | let commentsMessage 96 | browser.runtime.sendMessage = (message) => { 97 | if (message.name === 'comments') { 98 | commentsMessage = message 99 | browser.runtime.onMessage.listener({ name: 'comments', value: dictionary }) 100 | } 101 | } 102 | 103 | const agent = createAgent() 104 | clippyController.init(agent) 105 | 106 | expect(commentsMessage).toEqual({ name: 'comments' }) 107 | expect(clippyController.comments).toEqual(dictionary) 108 | }) 109 | 110 | it('should talk', () => { 111 | delete global.window.location 112 | global.window.location = { 113 | hostname: 'github' 114 | } 115 | 116 | const agent = createAgent() 117 | clippyController.init(agent) 118 | clippyController.comments = dictionary 119 | clippyController.talk() 120 | 121 | expect(clippyController.lastComment).toEqual(dictionary.github) 122 | }) 123 | 124 | test('pick random comment', () => { 125 | delete global.window.location 126 | global.window.location = { 127 | hostname: 'quora' 128 | } 129 | 130 | const agent = createAgent() 131 | clippyController.init(agent) 132 | clippyController.comments = dictionary 133 | clippyController.talk() 134 | 135 | expect(dictionary.quora).toContain(clippyController.lastComment) 136 | }) 137 | 138 | it('should send idle message', () => { 139 | let idleMessage 140 | browser.runtime.sendMessage = (message) => { 141 | if (message.name === 'idle') { 142 | idleMessage = message 143 | } 144 | } 145 | 146 | clippyController.idle() 147 | 148 | expect(idleMessage).toEqual({ name: 'idle' }) 149 | }) 150 | 151 | test('animation trigger', () => { 152 | expect.assertions(3) 153 | const animations = ['Congratulate', 'LookRight', 'SendMail', 'Thinking'] 154 | 155 | const agent = createAgent() 156 | clippyController.init(agent) 157 | clippyController.animations = animations 158 | clippyController.animate(() => {}) 159 | 160 | expect(clippyController.animations).toContain(agent.animation) 161 | expect(agent.animationLength).toEqual(5000) 162 | expect(agent.callback).toBeDefined() 163 | }) 164 | 165 | test('isActive listener', () => { 166 | expect.assertions(2) 167 | 168 | const agent = createAgent() 169 | clippyController.init(agent) 170 | 171 | browser.runtime.onMessage.listener({ name: 'isActive', value: true }) 172 | 173 | expect(agent.isActive).toBe(true) 174 | 175 | browser.runtime.onMessage.listener({ name: 'isActive', value: false }) 176 | 177 | expect(agent.isActive).toBe(false) 178 | }) 179 | 180 | test('comments listener', () => { 181 | const agent = createAgent() 182 | clippyController.init(agent) 183 | 184 | browser.runtime.onMessage.listener({ name: 'comments', value: dictionary }) 185 | 186 | expect(clippyController.comments).toEqual(dictionary) 187 | }) 188 | 189 | test('animate listener', () => { 190 | expect.assertions(2) 191 | 192 | const agent = createAgent() 193 | clippyController.init(agent) 194 | 195 | browser.runtime.sendMessage = (message, callback) => { 196 | if (message.name === 'isActive') { 197 | callback({ value: false }) 198 | } 199 | } 200 | browser.runtime.onMessage.listener({ name: 'animate' }) 201 | 202 | expect(agent.animation).toBeUndefined() 203 | 204 | browser.runtime.sendMessage = (message, callback) => { 205 | if (message.name === 'isActive') { 206 | callback({ value: true }) 207 | } 208 | } 209 | browser.runtime.onMessage.listener({ name: 'animate' }) 210 | 211 | expect(agent.animation).toBeDefined() 212 | }) 213 | -------------------------------------------------------------------------------- /src/state.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-var */ 2 | var browser = (function createBrowser() { 3 | if (typeof chrome !== 'undefined') { 4 | return chrome 5 | } 6 | 7 | if (typeof browser !== 'undefined') { 8 | return browser 9 | } 10 | 11 | if (typeof global !== 'undefined' && typeof global.browser !== 'undefined') { 12 | return global.browser; 13 | } 14 | 15 | throw new Error('No browser found') 16 | }()) 17 | /* eslint-enable no-var */ 18 | 19 | const initSettings = async () => { 20 | const initialState = { 21 | settings: { 22 | isActive: true, 23 | comments: {}, 24 | ...(await browser.storage.local.get()) 25 | } 26 | } 27 | await browser.storage.local.set(initialState.settings) 28 | const state = { 29 | ...initialState 30 | } 31 | 32 | browser.storage.onChanged.addListener((changes, namespace) => { 33 | if (namespace !== 'local') { 34 | return 35 | } 36 | 37 | Object.entries(changes).forEach(([key, { newValue }]) => { 38 | state.settings = { 39 | ...state.settings, 40 | [key]: newValue 41 | } 42 | }) 43 | }) 44 | 45 | return { 46 | get: () => state.settings, 47 | set: async (value) => { 48 | state.settings = { 49 | ...state.settings, 50 | ...value 51 | } 52 | 53 | await browser.storage.local.set(state.settings) 54 | }, 55 | } 56 | } 57 | 58 | const worker = ({ settings }) => { 59 | let talkedAlready = false 60 | const idleTime = 10000 61 | const getCommentsRepoURL = () => `https://clippy-dictionary.kickass.website/?v=${new Date().getTime()}` 62 | const loadComments = async () => { 63 | const response = await fetch(getCommentsRepoURL()) 64 | 65 | if (!response.ok) { 66 | return 67 | } 68 | 69 | const comments = await response.json() 70 | 71 | settings.set({ 72 | comments 73 | }) 74 | 75 | browser.tabs.query({}, (tabs) => { 76 | tabs.forEach((tab, index) => { 77 | browser.tabs.sendMessage( 78 | tabs[index].id, 79 | { 80 | name: 'comments', 81 | value: comments 82 | } 83 | ) 84 | }) 85 | }) 86 | } 87 | const toggleIcon = (tab) => { 88 | const iconName = browser.runtime.getURL(`assets/img/clippy-icon${settings.get().isActive ? '' : '-gray'}`) 89 | browser.action.setIcon({ 90 | path: { 91 | 16: `${iconName}-48x48.png`, 92 | 24: `${iconName}-48x48.png`, 93 | 32: `${iconName}-48x48.png` 94 | }, 95 | tabId: tab.id 96 | }) 97 | } 98 | 99 | const sendActive = (tab) => { 100 | browser.tabs.sendMessage( 101 | tab.id, 102 | { 103 | name: 'isActive', 104 | value: settings.get().isActive 105 | } 106 | ) 107 | } 108 | 109 | const toggleClippy = () => { 110 | settings.set({ 111 | isActive: !settings.get().isActive 112 | }) 113 | 114 | browser.tabs.query({}, (tabs) => { 115 | tabs.forEach((tab, index) => { 116 | sendActive(tabs[index]) 117 | toggleIcon(tabs[index]) 118 | }) 119 | }) 120 | } 121 | 122 | browser.action.onClicked.addListener(toggleClippy) 123 | 124 | let idleTimeoutInstance = null 125 | 126 | browser.runtime.onMessage.addListener((request, sender, sendResponse) => { 127 | switch (request.name) { 128 | case 'isActive': 129 | browser.tabs.query({ active: true, currentWindow: true }, (tabs) => { 130 | if (tabs.length > 0) { 131 | toggleIcon(tabs[0]) 132 | } 133 | }) 134 | 135 | sendResponse( 136 | { 137 | name: 'isActive', 138 | value: settings.get().isActive 139 | } 140 | ) 141 | break 142 | case 'comments': 143 | loadComments() 144 | break 145 | case 'idle': 146 | if (settings.get().isActive) { 147 | if (idleTimeoutInstance) { 148 | clearTimeout(idleTimeoutInstance) 149 | } 150 | 151 | idleTimeoutInstance = setTimeout(() => { 152 | if (!settings.get().isActive) { 153 | return 154 | } 155 | 156 | browser.tabs.query({ active: true, currentWindow: true }, (tabs) => { 157 | if (tabs.length > 0) { 158 | browser.tabs.sendMessage( 159 | tabs[0].id, 160 | { 161 | name: 'animate', 162 | value: true 163 | } 164 | ) 165 | } 166 | }) 167 | 168 | talkedAlready = true 169 | }, talkedAlready ? idleTime : 5000) 170 | } 171 | break 172 | case 'toggle': 173 | toggleClippy() 174 | sendResponse({ 175 | name: 'SILENCE_MY_BROTHER', 176 | value: settings.get().isActive 177 | }) 178 | break 179 | default: 180 | break 181 | } 182 | 183 | return true 184 | }) 185 | 186 | browser.runtime.onMessageExternal.addListener((request, sender, sendResponse) => { 187 | const manifest = browser.runtime.getManifest() 188 | 189 | switch (request.name) { 190 | case 'WHAT_IS_THE_MEANING_OF_LIFE': 191 | sendResponse({ 192 | name: 'SILENCE_MY_BROTHER', 193 | value: { 194 | installed: true, 195 | isActive: settings.get().isActive, 196 | version: manifest.version 197 | } 198 | }) 199 | break 200 | case 'RISE': 201 | toggleClippy() 202 | sendResponse({ 203 | name: 'SILENCE_MY_BROTHER', 204 | value: settings.get().isActive 205 | }) 206 | break 207 | default: 208 | break 209 | } 210 | 211 | return true 212 | }) 213 | } 214 | 215 | const init = async () => { 216 | const settings = await initSettings() 217 | 218 | worker({ settings }) 219 | } 220 | 221 | init() 222 | -------------------------------------------------------------------------------- /test/state.test.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @jest-environment jsdom 3 | */ 4 | 5 | const tabs = [ 6 | { 7 | id: 1 8 | }, 9 | { 10 | id: 2 11 | }, 12 | { 13 | id: 3 14 | } 15 | ] 16 | 17 | const createBrowser = () => { 18 | const state = { 19 | storage: {} 20 | } 21 | const listeners = [] 22 | 23 | global.browser = { 24 | runtime: { 25 | onMessage: { 26 | addListener(listener) { 27 | this.listener = listener 28 | } 29 | }, 30 | onMessageExternal: { 31 | addListener(listener) { 32 | this.listener = listener 33 | } 34 | }, 35 | getManifest() { 36 | return { 37 | version: 3 38 | } 39 | }, 40 | getURL(path) { 41 | return `chrome-extension://clippy${path}` 42 | } 43 | }, 44 | tabs: { 45 | sendMessage() {}, 46 | query(options, callback) { 47 | if (options.active && options.currentWindow) { 48 | callback([tabs[0]]) 49 | } 50 | 51 | callback([...tabs]) 52 | }, 53 | }, 54 | action: { 55 | setIcon() {}, 56 | onClicked: { 57 | addListener(listener) { 58 | this.listener = listener 59 | } 60 | } 61 | }, 62 | storage: { 63 | local: { 64 | async get() { 65 | return state.storage 66 | }, 67 | async set(newStorage) { 68 | state.storage = { 69 | ...state.storage, 70 | ...newStorage 71 | } 72 | 73 | listeners.forEach((listener) => { 74 | listener(Object.entries(newStorage).reduce((acc, [key, value]) => { 75 | acc[key] = { newValue: value } 76 | 77 | return acc 78 | }, {}), 'local') 79 | }) 80 | }, 81 | }, 82 | onChanged: { 83 | addListener(callback) { 84 | listeners.push(callback) 85 | } 86 | } 87 | } 88 | } 89 | } 90 | 91 | const dictionary = { 92 | localhost: 'It works! Good job!', 93 | twitter: 'Tweets can only be 280 characters long!', 94 | github: 'Need lessons in Python?', 95 | quora: [ 96 | '????????????????', 97 | 'What is my purpose?' 98 | ] 99 | } 100 | 101 | beforeEach(() => { 102 | createBrowser() 103 | require('../src/state') 104 | }) 105 | 106 | afterEach(() => { 107 | jest.resetModules() 108 | }) 109 | 110 | describe('Responds to messages', () => { 111 | test('isActive listener', async () => { 112 | await global.initPromise 113 | 114 | expect.assertions(2) 115 | 116 | browser.runtime.onMessage.listener({ name: 'isActive' }, {}, (response) => { 117 | expect(response).toEqual({ 118 | name: 'isActive', 119 | value: true 120 | }) 121 | }) 122 | 123 | await browser.storage.local.set({ 124 | isActive: false 125 | }) 126 | 127 | browser.runtime.onMessage.listener({ name: 'isActive' }, {}, (response) => { 128 | expect(response).toEqual({ 129 | name: 'isActive', 130 | value: false 131 | }) 132 | }) 133 | }) 134 | 135 | test('comments listener', async () => { 136 | async function fetch() { 137 | return { 138 | ok: true, 139 | async json() { 140 | return JSON.parse(JSON.stringify(dictionary)) 141 | } 142 | } 143 | } 144 | global.fetch = fetch 145 | 146 | browser.runtime.onMessage.listener({ name: 'comments' }) 147 | 148 | await new Promise(process.nextTick) 149 | 150 | const settings = await browser.storage.local.get() 151 | 152 | expect(settings.comments).toEqual(dictionary) 153 | 154 | delete global.fetch 155 | }) 156 | 157 | test('idle listener', async () => { 158 | expect.assertions(4) 159 | jest.useFakeTimers() 160 | let lastId 161 | let lastMessage 162 | browser.tabs.sendMessage = (id, message) => { 163 | if (message.name === 'animate') { 164 | lastId = id 165 | lastMessage = message 166 | } 167 | } 168 | 169 | await browser.storage.local.set({ 170 | isActive: false 171 | }) 172 | 173 | browser.runtime.onMessage.listener({ name: 'idle' }) 174 | jest.runAllTimers() 175 | 176 | expect(lastId).toBeUndefined() 177 | expect(lastMessage).toBeUndefined() 178 | 179 | await browser.storage.local.set({ 180 | isActive: true 181 | }) 182 | 183 | browser.runtime.onMessage.listener({ name: 'idle' }) 184 | jest.runAllTimers() 185 | 186 | expect(lastId).toEqual(1) 187 | expect(lastMessage).toEqual({ 188 | name: 'animate', 189 | value: true 190 | }) 191 | }) 192 | }) 193 | 194 | describe('Toolbar controls are working', () => { 195 | it('should toggle button icons on click', () => { 196 | expect.assertions(tabs.length * 2) 197 | 198 | browser.action.setIcon = (payload) => { 199 | expect(payload.path).toBeDefined() 200 | expect(payload.tabId).toBeDefined() 201 | } 202 | 203 | browser.action.onClicked.listener() 204 | }) 205 | 206 | it('should toggle isActive status on click', async () => { 207 | expect.assertions(tabs.length * 2) 208 | 209 | await browser.storage.local.set({ 210 | isActive: true 211 | }) 212 | 213 | browser.tabs.sendMessage = (tabId, message) => { 214 | expect(tabId).toBeDefined() 215 | expect(message).toEqual({ 216 | name: 'isActive', 217 | value: false 218 | }) 219 | } 220 | 221 | browser.action.onClicked.listener() 222 | }) 223 | }) 224 | 225 | describe('Responds to external messages', () => { 226 | test('connect listener', async () => { 227 | await browser.storage.local.set({ 228 | isActive: true 229 | }) 230 | 231 | browser.runtime.onMessageExternal.listener({ name: 'WHAT_IS_THE_MEANING_OF_LIFE' }, {}, (response) => { 232 | expect(response).toEqual({ 233 | name: 'SILENCE_MY_BROTHER', 234 | value: { 235 | installed: true, 236 | isActive: true, 237 | version: 3 238 | } 239 | }) 240 | }) 241 | }) 242 | 243 | test('toggle listener', async () => { 244 | await browser.storage.local.set({ 245 | isActive: true 246 | }) 247 | 248 | browser.runtime.onMessageExternal.listener({ name: 'RISE' }, {}, (response) => { 249 | expect(response).toEqual({ 250 | name: 'SILENCE_MY_BROTHER', 251 | value: false 252 | }) 253 | }) 254 | 255 | browser.runtime.onMessageExternal.listener({ name: 'RISE' }, {}, (response) => { 256 | expect(response).toEqual({ 257 | name: 'SILENCE_MY_BROTHER', 258 | value: true 259 | }) 260 | }) 261 | }) 262 | }) 263 | -------------------------------------------------------------------------------- /assets/js/clippy.js: -------------------------------------------------------------------------------- 1 | var browser = (function () { 2 | return window.msBrowser || 3 | browser || 4 | chrome; 5 | })(); 6 | var clippy = {}; 7 | 8 | /****** 9 | * 10 | * 11 | * @constructor 12 | */ 13 | clippy.Agent = function (path, data, sounds) { 14 | this.path = path; 15 | 16 | this._queue = new clippy.Queue($.proxy(this._onQueueEmpty, this)); 17 | 18 | this._el = $('
').hide(); 19 | 20 | $(document.body).append(this._el); 21 | 22 | this._animator = new clippy.Animator(this._el, path, data, sounds); 23 | 24 | this._balloon = new clippy.Balloon(this._el); 25 | 26 | this._setupEvents(); 27 | }; 28 | 29 | clippy.Agent.prototype = { 30 | 31 | /**************************** API ************************************/ 32 | 33 | /*** 34 | * 35 | * @param {Number} x 36 | * @param {Number} y 37 | */ 38 | gestureAt:function (x, y) { 39 | var d = this._getDirection(x, y); 40 | var gAnim = 'Gesture' + d; 41 | var lookAnim = 'Look' + d; 42 | 43 | var animation = this.hasAnimation(gAnim) ? gAnim : lookAnim; 44 | return this.play(animation); 45 | }, 46 | 47 | /*** 48 | * 49 | * @param {Boolean=} fast 50 | * 51 | */ 52 | hide:function (fast, callback) { 53 | this._hidden = true; 54 | var el = this._el; 55 | this.stop(); 56 | if (fast) { 57 | this._el.hide(); 58 | this.stop(); 59 | this.pause(); 60 | if (callback) callback(); 61 | return; 62 | } 63 | 64 | return this._playInternal('Hide', function () { 65 | el.hide(); 66 | this.pause(); 67 | if (callback) callback(); 68 | }) 69 | }, 70 | 71 | 72 | moveTo:function (x, y, duration) { 73 | var dir = this._getDirection(x, y); 74 | var anim = 'Move' + dir; 75 | if (duration === undefined) duration = 1000; 76 | 77 | this._addToQueue(function (complete) { 78 | // the simple case 79 | if (duration === 0) { 80 | this._el.css({top:y, left:x}); 81 | this.reposition(); 82 | complete(); 83 | return; 84 | } 85 | 86 | // no animations 87 | if (!this.hasAnimation(anim)) { 88 | this._el.animate({top:y, left:x}, duration, complete); 89 | return; 90 | } 91 | 92 | var callback = $.proxy(function (name, state) { 93 | // when exited, complete 94 | if (state === clippy.Animator.States.EXITED) { 95 | complete(); 96 | } 97 | // if waiting, 98 | if (state === clippy.Animator.States.WAITING) { 99 | this._el.animate({top:y, left:x}, duration, $.proxy(function () { 100 | // after we're done with the movement, do the exit animation 101 | this._animator.exitAnimation(); 102 | }, this)); 103 | } 104 | 105 | }, this); 106 | 107 | this._playInternal(anim, callback); 108 | }, this); 109 | }, 110 | 111 | _playInternal:function (animation, callback) { 112 | 113 | // if we're inside an idle animation, 114 | if (this._isIdleAnimation() && this._idleDfd && this._idleDfd.state() === 'pending') { 115 | this._idleDfd.done($.proxy(function () { 116 | this._playInternal(animation, callback); 117 | }, this)) 118 | } 119 | 120 | this._animator.showAnimation(animation, callback); 121 | }, 122 | 123 | play:function (animation, timeout, cb) { 124 | if (!this.hasAnimation(animation)) return false; 125 | 126 | if (timeout === undefined) timeout = 5000; 127 | 128 | 129 | this._addToQueue(function (complete) { 130 | var completed = false; 131 | // handle callback 132 | var callback = function (name, state) { 133 | if (state === clippy.Animator.States.EXITED) { 134 | completed = true; 135 | if (cb) cb(); 136 | complete(); 137 | } 138 | }; 139 | 140 | // if has timeout, register a timeout function 141 | if (timeout) { 142 | window.setTimeout($.proxy(function () { 143 | if (completed) return; 144 | // exit after timeout 145 | this._animator.exitAnimation(); 146 | }, this), timeout) 147 | } 148 | 149 | this._playInternal(animation, callback); 150 | }, this); 151 | 152 | return true; 153 | }, 154 | 155 | /*** 156 | * 157 | * @param {Boolean=} fast 158 | */ 159 | show:function (fast) { 160 | 161 | this._hidden = false; 162 | if (fast) { 163 | this._el.show(); 164 | this.resume(); 165 | this._onQueueEmpty(); 166 | return; 167 | } 168 | 169 | this.resume(); 170 | return this.play('Show'); 171 | }, 172 | 173 | /*** 174 | * 175 | * @param {String} text 176 | */ 177 | speak:function (text, hold) { 178 | this._addToQueue(function (complete) { 179 | this._balloon.speak(complete, text, hold); 180 | }, this); 181 | }, 182 | 183 | 184 | /*** 185 | * Close the current balloon 186 | */ 187 | closeBalloon:function () { 188 | this._balloon.hide(); 189 | }, 190 | 191 | delay:function (time) { 192 | time = time || 250; 193 | 194 | this._addToQueue(function (complete) { 195 | this._onQueueEmpty(); 196 | window.setTimeout(complete, time); 197 | }); 198 | }, 199 | 200 | /*** 201 | * Skips the current animation 202 | */ 203 | stopCurrent:function () { 204 | this._animator.exitAnimation(); 205 | this._balloon.close(); 206 | }, 207 | 208 | 209 | stop:function () { 210 | // clear the queue 211 | this._queue.clear(); 212 | this._animator.exitAnimation(); 213 | this._balloon.hide(); 214 | }, 215 | 216 | /*** 217 | * 218 | * @param {String} name 219 | * @returns {Boolean} 220 | */ 221 | hasAnimation:function (name) { 222 | return this._animator.hasAnimation(name); 223 | }, 224 | 225 | /*** 226 | * Gets a list of animation names 227 | * 228 | * @return {Array.} 229 | */ 230 | animations:function () { 231 | return this._animator.animations(); 232 | }, 233 | 234 | /*** 235 | * Play a random animation 236 | * @return {jQuery.Deferred} 237 | */ 238 | animate:function () { 239 | var animations = this.animations(); 240 | var anim = animations[Math.floor(Math.random() * animations.length)]; 241 | // skip idle animations 242 | if (anim.indexOf('Idle') === 0) { 243 | return this.animate(); 244 | } 245 | return this.play(anim); 246 | }, 247 | 248 | /**************************** Utils ************************************/ 249 | 250 | /*** 251 | * 252 | * @param {Number} x 253 | * @param {Number} y 254 | * @return {String} 255 | * @private 256 | */ 257 | _getDirection:function (x, y) { 258 | var offset = this._el.offset(); 259 | var h = this._el.height(); 260 | var w = this._el.width(); 261 | 262 | var centerX = (offset.left + w / 2); 263 | var centerY = (offset.top + h / 2); 264 | 265 | 266 | var a = centerY - y; 267 | var b = centerX - x; 268 | 269 | var r = Math.round((180 * Math.atan2(a, b)) / Math.PI); 270 | 271 | // Left and Right are for the character, not the screen :-/ 272 | if (-45 <= r && r < 45) return 'Right'; 273 | if (45 <= r && r < 135) return 'Up'; 274 | if (135 <= r && r <= 180 || -180 <= r && r < -135) return 'Left'; 275 | if (-135 <= r && r < -45) return 'Down'; 276 | 277 | // sanity check 278 | return 'Top'; 279 | }, 280 | 281 | /**************************** Queue and Idle handling ************************************/ 282 | 283 | /*** 284 | * Handle empty queue. 285 | * We need to transition the animation to an idle state 286 | * @private 287 | */ 288 | _onQueueEmpty:function () { 289 | if (this._hidden || this._isIdleAnimation()) return; 290 | var idleAnim = this._getIdleAnimation(); 291 | this._idleDfd = $.Deferred(); 292 | 293 | this._animator.showAnimation(idleAnim, $.proxy(this._onIdleComplete, this)); 294 | }, 295 | 296 | _onIdleComplete:function (name, state) { 297 | if (state === clippy.Animator.States.EXITED) { 298 | this._idleDfd.resolve(); 299 | } 300 | }, 301 | 302 | 303 | /*** 304 | * Is the current animation is Idle? 305 | * @return {Boolean} 306 | * @private 307 | */ 308 | _isIdleAnimation:function () { 309 | var c = this._animator.currentAnimationName; 310 | return c && c.indexOf('Idle') === 0; 311 | }, 312 | 313 | 314 | /** 315 | * Gets a random Idle animation 316 | * @return {String} 317 | * @private 318 | */ 319 | _getIdleAnimation:function () { 320 | var animations = this.animations(); 321 | var r = []; 322 | for (var i = 0; i < animations.length; i++) { 323 | var a = animations[i]; 324 | if (a.indexOf('Idle') === 0) { 325 | r.push(a); 326 | } 327 | } 328 | 329 | // pick one 330 | var idx = Math.floor(Math.random() * r.length); 331 | return r[idx]; 332 | }, 333 | 334 | /**************************** Events ************************************/ 335 | 336 | _setupEvents:function () { 337 | $(window).on('resize', $.proxy(this.reposition, this)); 338 | 339 | this._el.on('mousedown', $.proxy(this._onMouseDown, this)); 340 | 341 | this._el.on('dblclick', $.proxy(this._onDoubleClick, this)); 342 | }, 343 | 344 | _onDoubleClick:function () { 345 | if (!this.play('ClickedOn')) { 346 | this.animate(); 347 | } 348 | }, 349 | 350 | reposition:function () { 351 | if (!this._el.is(':visible')) return; 352 | var o = this._el.offset(); 353 | var bH = this._el.outerHeight(); 354 | var bW = this._el.outerWidth(); 355 | 356 | var wW = $(window).width(); 357 | var wH = $(window).height(); 358 | var sT = $(window).scrollTop(); 359 | var sL = $(window).scrollLeft(); 360 | 361 | var top = o.top - sT; 362 | var left = o.left - sL; 363 | var m = 5; 364 | if (top - m < 0) { 365 | top = m; 366 | } else if ((top + bH + m) > wH) { 367 | top = wH - bH - m; 368 | } 369 | 370 | if (left - m < 0) { 371 | left = m; 372 | } else if (left + bW + m > wW) { 373 | left = wW - bW - m; 374 | } 375 | 376 | this._el.css({left:left, top:top}); 377 | // reposition balloon 378 | this._balloon.reposition(); 379 | }, 380 | 381 | _onMouseDown:function (e) { 382 | e.preventDefault(); 383 | this._startDrag(e); 384 | }, 385 | 386 | 387 | /**************************** Drag ************************************/ 388 | 389 | _startDrag:function (e) { 390 | // pause animations 391 | this.pause(); 392 | this._balloon.hide(true); 393 | this._offset = this._calculateClickOffset(e); 394 | 395 | this._moveHandle = $.proxy(this._dragMove, this); 396 | this._upHandle = $.proxy(this._finishDrag, this); 397 | 398 | $(window).on('mousemove', this._moveHandle); 399 | $(window).on('mouseup', this._upHandle); 400 | 401 | this._dragUpdateLoop = window.setTimeout($.proxy(this._updateLocation, this), 10); 402 | }, 403 | 404 | _calculateClickOffset:function (e) { 405 | var mouseX = e.pageX; 406 | var mouseY = e.pageY; 407 | var o = this._el.offset(); 408 | return { 409 | top:mouseY - o.top, 410 | left:mouseX - o.left 411 | } 412 | 413 | }, 414 | 415 | _updateLocation:function () { 416 | this._el.css({top:this._targetY, left:this._taregtX}); 417 | this._dragUpdateLoop = window.setTimeout($.proxy(this._updateLocation, this), 10); 418 | }, 419 | 420 | _dragMove:function (e) { 421 | e.preventDefault(); 422 | var x = e.clientX - this._offset.left; 423 | var y = e.clientY - this._offset.top; 424 | this._taregtX = x; 425 | this._targetY = y; 426 | }, 427 | 428 | _finishDrag:function () { 429 | window.clearTimeout(this._dragUpdateLoop); 430 | // remove handles 431 | $(window).off('mousemove', this._moveHandle); 432 | $(window).off('mouseup', this._upHandle); 433 | // resume animations 434 | this._balloon.show(); 435 | this.reposition(); 436 | this.resume(); 437 | 438 | }, 439 | 440 | _addToQueue:function (func, scope) { 441 | if (scope) func = $.proxy(func, scope); 442 | this._queue.queue(func); 443 | }, 444 | 445 | /**************************** Pause and Resume ************************************/ 446 | 447 | pause:function () { 448 | this._animator.pause(); 449 | this._balloon.pause(); 450 | 451 | }, 452 | 453 | resume:function () { 454 | this._animator.resume(); 455 | this._balloon.resume(); 456 | } 457 | 458 | }; 459 | 460 | /****** 461 | * 462 | * 463 | * @constructor 464 | */ 465 | clippy.Animator = function (el, path, data, sounds) { 466 | this._el = el; 467 | this._data = data; 468 | this._path = path; 469 | this._currentFrameIndex = 0; 470 | this._currentFrame = undefined; 471 | this._exiting = false; 472 | this._currentAnimation = undefined; 473 | this._endCallback = undefined; 474 | this._started = false; 475 | this._sounds = {}; 476 | this.currentAnimationName = undefined; 477 | this.preloadSounds(sounds); 478 | this._overlays = [this._el]; 479 | var curr = this._el; 480 | 481 | this._setupElement(this._el); 482 | for (var i = 1; i < this._data.overlayCount; i++) { 483 | var inner = this._setupElement($('
')); 484 | 485 | curr.append(inner); 486 | this._overlays.push(inner); 487 | curr = inner; 488 | } 489 | }; 490 | 491 | clippy.Animator.prototype = { 492 | _setupElement:function (el) { 493 | var frameSize = this._data.framesize; 494 | el.css('display', "none"); 495 | el.css({width:frameSize[0], height:frameSize[1]}); 496 | el.css('background', "url('" + browser.runtime.getURL('assets/img/clippy.map.png') + "') no-repeat"); 497 | 498 | return el; 499 | }, 500 | 501 | animations:function () { 502 | var r = []; 503 | var d = this._data.animations; 504 | for (var n in d) { 505 | r.push(n); 506 | } 507 | return r; 508 | }, 509 | 510 | preloadSounds:function (sounds) { 511 | 512 | for (var i = 0; i < this._data.sounds.length; i++) { 513 | var snd = this._data.sounds[i]; 514 | var uri = sounds[snd]; 515 | if (!uri) continue; 516 | this._sounds[snd] = new Audio(uri); 517 | 518 | } 519 | }, 520 | hasAnimation:function (name) { 521 | return !!this._data.animations[name]; 522 | }, 523 | 524 | exitAnimation:function () { 525 | this._exiting = true; 526 | }, 527 | 528 | 529 | showAnimation:function (animationName, stateChangeCallback) { 530 | this._exiting = false; 531 | 532 | if (!this.hasAnimation(animationName)) { 533 | return false; 534 | } 535 | 536 | this._currentAnimation = this._data.animations[animationName]; 537 | this.currentAnimationName = animationName; 538 | 539 | 540 | if (!this._started) { 541 | this._step(); 542 | this._started = true; 543 | } 544 | 545 | this._currentFrameIndex = 0; 546 | this._currentFrame = undefined; 547 | this._endCallback = stateChangeCallback; 548 | 549 | return true; 550 | }, 551 | 552 | 553 | _draw:function () { 554 | var images = []; 555 | if (this._currentFrame) images = this._currentFrame.images || []; 556 | 557 | for (var i = 0; i < this._overlays.length; i++) { 558 | if (i < images.length) { 559 | var xy = images[i]; 560 | var bg = -xy[0] + 'px ' + -xy[1] + 'px'; 561 | this._overlays[i].css({'background-position':bg, 'display':'block'}); 562 | } 563 | else { 564 | this._overlays[i].css('display', 'none'); 565 | } 566 | 567 | } 568 | }, 569 | 570 | _getNextAnimationFrame:function () { 571 | if (!this._currentAnimation) return undefined; 572 | // No current frame. start animation. 573 | if (!this._currentFrame) return 0; 574 | var currentFrame = this._currentFrame; 575 | var branching = this._currentFrame.branching; 576 | 577 | 578 | if (this._exiting && currentFrame.exitBranch !== undefined) { 579 | return currentFrame.exitBranch; 580 | } 581 | else if (branching) { 582 | var rnd = Math.random() * 100; 583 | for (var i = 0; i < branching.branches.length; i++) { 584 | var branch = branching.branches[i]; 585 | if (rnd <= branch.weight) { 586 | return branch.frameIndex; 587 | } 588 | 589 | rnd -= branch.weight; 590 | } 591 | } 592 | 593 | return this._currentFrameIndex + 1; 594 | }, 595 | 596 | _playSound:function () { 597 | /*var s = this._currentFrame.sound; 598 | if (!s) return; 599 | var audio = this._sounds[s]; 600 | if (audio) audio.play();*/ 601 | return; 602 | 603 | }, 604 | 605 | _atLastFrame:function () { 606 | return this._currentFrameIndex >= this._currentAnimation.frames.length - 1; 607 | }, 608 | 609 | _step:function () { 610 | if (!this._currentAnimation) return; 611 | var newFrameIndex = Math.min(this._getNextAnimationFrame(), this._currentAnimation.frames.length - 1); 612 | var frameChanged = !this._currentFrame || this._currentFrameIndex !== newFrameIndex; 613 | this._currentFrameIndex = newFrameIndex; 614 | 615 | // always switch frame data, unless we're at the last frame of an animation with a useExitBranching flag. 616 | if (!(this._atLastFrame() && this._currentAnimation.useExitBranching)) { 617 | this._currentFrame = this._currentAnimation.frames[this._currentFrameIndex]; 618 | } 619 | 620 | this._draw(); 621 | this._playSound(); 622 | 623 | this._loop = window.setTimeout($.proxy(this._step, this), this._currentFrame.duration); 624 | 625 | 626 | // fire events if the frames changed and we reached an end 627 | if (this._endCallback && frameChanged && this._atLastFrame()) { 628 | if (this._currentAnimation.useExitBranching && !this._exiting) { 629 | this._endCallback(this.currentAnimationName, clippy.Animator.States.WAITING); 630 | } 631 | else { 632 | this._endCallback(this.currentAnimationName, clippy.Animator.States.EXITED); 633 | } 634 | } 635 | }, 636 | 637 | /*** 638 | * Pause animation execution 639 | */ 640 | pause:function () { 641 | window.clearTimeout(this._loop); 642 | }, 643 | 644 | /*** 645 | * Resume animation 646 | */ 647 | resume:function () { 648 | this._step(); 649 | } 650 | }; 651 | 652 | clippy.Animator.States = { WAITING:1, EXITED:0 }; 653 | 654 | /****** 655 | * 656 | * 657 | * @constructor 658 | */ 659 | clippy.Balloon = function (targetEl) { 660 | this._targetEl = targetEl; 661 | 662 | this._hidden = true; 663 | this._setup(); 664 | }; 665 | 666 | clippy.Balloon.prototype = { 667 | 668 | WORD_SPEAK_TIME:100, 669 | CLOSE_BALLOON_DELAY:5000, 670 | 671 | _setup:function () { 672 | 673 | this._balloon = $('
').hide(); 674 | this._content = this._balloon.find('.clippy-content'); 675 | 676 | $(document.body).append(this._balloon); 677 | }, 678 | 679 | reposition:function () { 680 | var sides = ['top-left', 'top-right', 'bottom-left', 'bottom-right']; 681 | 682 | for (var i = 0; i < sides.length; i++) { 683 | var s = sides[i]; 684 | this._position(s); 685 | if (!this._isOut()) break; 686 | } 687 | }, 688 | 689 | _BALLOON_MARGIN:15, 690 | 691 | /*** 692 | * 693 | * @param side 694 | * @private 695 | */ 696 | _position:function (side) { 697 | var o = this._targetEl.offset(); 698 | o.top -= window.pageYOffset; 699 | o.left -= window.pageXOffset; 700 | var h = this._targetEl.height(); 701 | var w = this._targetEl.width(); 702 | 703 | var bH = this._balloon.outerHeight(); 704 | var bW = this._balloon.outerWidth(); 705 | 706 | this._balloon.removeClass('clippy-top-left'); 707 | this._balloon.removeClass('clippy-top-right'); 708 | this._balloon.removeClass('clippy-bottom-right'); 709 | this._balloon.removeClass('clippy-bottom-left'); 710 | 711 | var left, top; 712 | switch (side) { 713 | case 'top-left': 714 | // right side of the balloon next to the right side of the agent 715 | left = o.left + w - bW; 716 | top = o.top - bH - this._BALLOON_MARGIN; 717 | break; 718 | case 'top-right': 719 | // left side of the balloon next to the left side of the agent 720 | left = o.left; 721 | top = o.top - bH - this._BALLOON_MARGIN; 722 | break; 723 | case 'bottom-right': 724 | // right side of the balloon next to the right side of the agent 725 | left = o.left; 726 | top = o.top + h + this._BALLOON_MARGIN; 727 | break; 728 | case 'bottom-left': 729 | // left side of the balloon next to the left side of the agent 730 | left = o.left + w - bW; 731 | top = o.top + h + this._BALLOON_MARGIN; 732 | break; 733 | } 734 | 735 | this._balloon.css({top:top, left:left}); 736 | this._balloon.addClass('clippy-' + side); 737 | }, 738 | 739 | _isOut:function () { 740 | var o = this._balloon.offset(); 741 | var bH = this._balloon.outerHeight(); 742 | var bW = this._balloon.outerWidth(); 743 | 744 | var wW = $(window).width(); 745 | var wH = $(window).height(); 746 | var sT = $(document).scrollTop(); 747 | var sL = $(document).scrollLeft(); 748 | 749 | var top = o.top - sT; 750 | var left = o.left - sL; 751 | var m = 5; 752 | if (top - m < 0 || left - m < 0) return true; 753 | if ((top + bH + m) > wH || (left + bW + m) > wW) return true; 754 | 755 | return false; 756 | }, 757 | 758 | speak:function (complete, text, hold) { 759 | this._hidden = false; 760 | this.show(); 761 | var c = this._content; 762 | // set height to auto 763 | c.height('auto'); 764 | c.width('auto'); 765 | // add the text 766 | c.html(text); 767 | // set height 768 | c.height(c.height()); 769 | c.width(c.width() + 10); 770 | c.html(''); 771 | this.reposition(); 772 | 773 | this._complete = complete; 774 | this._sayWords(text, hold, complete); 775 | }, 776 | 777 | show:function () { 778 | if (this._hidden) return; 779 | this._balloon.show(); 780 | }, 781 | 782 | hide:function (fast) { 783 | if (fast) { 784 | this._balloon.hide(); 785 | return; 786 | } 787 | 788 | this._hiding = window.setTimeout($.proxy(this._finishHideBalloon, this), this.CLOSE_BALLOON_DELAY); 789 | }, 790 | 791 | _finishHideBalloon:function () { 792 | if (this._active) return; 793 | this._balloon.hide(); 794 | this._hidden = true; 795 | this._hiding = null; 796 | }, 797 | 798 | _sayWords:function (text, hold, complete) { 799 | this._active = true; 800 | this._hold = hold; 801 | var words = text.split(/[^\S-]/); 802 | var time = this.WORD_SPEAK_TIME; 803 | var el = this._content; 804 | var idx = 1; 805 | 806 | 807 | this._addWord = $.proxy(function () { 808 | if (!this._active) return; 809 | if (idx > words.length) { 810 | this._active = false; 811 | if (!this._hold) { 812 | complete(); 813 | this.hide(); 814 | } 815 | } else { 816 | el.html(words.slice(0, idx).join(' ')); 817 | idx++; 818 | this._loop = window.setTimeout($.proxy(this._addWord, this), time); 819 | } 820 | }, this); 821 | 822 | this._addWord(); 823 | 824 | }, 825 | 826 | close:function () { 827 | if (this._active) { 828 | this._hold = false; 829 | } else if (this._hold) { 830 | this._complete(); 831 | } 832 | }, 833 | 834 | pause:function () { 835 | window.clearTimeout(this._loop); 836 | if (this._hiding) { 837 | window.clearTimeout(this._hiding); 838 | this._hiding = null; 839 | } 840 | }, 841 | 842 | resume:function () { 843 | if (this._addWord) this._addWord(); 844 | this._hiding = window.setTimeout($.proxy(this._finishHideBalloon, this), this.CLOSE_BALLOON_DELAY); 845 | } 846 | 847 | 848 | }; 849 | 850 | clippy.BASE_PATH = '//s3.amazonaws.com/clippy.js/Agents/'; 851 | 852 | clippy.load = function (name, successCb, failCb) { 853 | var path = clippy.BASE_PATH + name; 854 | 855 | var mapDfd = clippy.load._loadMap(path); 856 | var agentDfd = clippy.load._loadAgent(name, path); 857 | var soundsDfd = clippy.load._loadSounds(name, path); 858 | 859 | var data; 860 | agentDfd.done(function (d) { 861 | data = d; 862 | }); 863 | 864 | var sounds; 865 | 866 | soundsDfd.done(function (d) { 867 | sounds = d; 868 | }); 869 | 870 | // wrapper to the success callback 871 | var cb = function () { 872 | var a = new clippy.Agent(path, data,sounds); 873 | successCb(a); 874 | }; 875 | 876 | $.when(mapDfd, agentDfd, soundsDfd).done(cb).fail(failCb); 877 | }; 878 | 879 | clippy.load._maps = {}; 880 | clippy.load._loadMap = function (path) { 881 | var dfd = clippy.load._maps[path]; 882 | if (dfd) return dfd; 883 | 884 | // set dfd if not defined 885 | dfd = clippy.load._maps[path] = $.Deferred(); 886 | 887 | var src = browser.runtime.getURL('assets/img/clippy.map.png'); 888 | var img = new Image(); 889 | 890 | img.onload = dfd.resolve; 891 | img.onerror = dfd.reject; 892 | 893 | // start loading the map; 894 | img.setAttribute('src', src); 895 | 896 | return dfd.promise(); 897 | }; 898 | 899 | clippy.load._sounds = {}; 900 | 901 | clippy.load._loadSounds = function (name, path) { 902 | var dfd = clippy.load._sounds[name]; 903 | if (dfd) return dfd; 904 | 905 | // set dfd if not defined 906 | dfd = clippy.load._sounds[name] = $.Deferred(); 907 | 908 | /*var audio = document.createElement('audio'); 909 | var canPlayMp3 = !!audio.canPlayType && "" != audio.canPlayType('audio/mpeg'); 910 | var canPlayOgg = !!audio.canPlayType && "" != audio.canPlayType('audio/ogg; codecs="vorbis"'); 911 | 912 | if (!canPlayMp3 && !canPlayOgg) { 913 | dfd.resolve({}); 914 | } else { 915 | var src = browser.runtime.getURL('assets/js' + (canPlayMp3 ? '/sounds-mp3.js' : '/sounds-ogg.js')); 916 | // load 917 | clippy.load._loadScript(src); 918 | }*/ 919 | 920 | dfd.resolve({}); 921 | 922 | return dfd.promise() 923 | }; 924 | 925 | 926 | clippy.load._data = {}; 927 | clippy.load._loadAgent = function (name, path) { 928 | var dfd = clippy.load._data[name]; 929 | if (dfd) return dfd; 930 | 931 | dfd = clippy.load._getAgentDfd(name); 932 | 933 | var src = browser.runtime.getURL('assets/js/agent.js'); 934 | 935 | clippy.load._loadScript(src); 936 | 937 | return dfd.promise(); 938 | }; 939 | 940 | clippy.load._loadScript = function (src) { 941 | var script = document.createElement('script'); 942 | script.setAttribute('src', src); 943 | script.setAttribute('async', 'async'); 944 | script.setAttribute('type', 'text/javascript'); 945 | 946 | document.head.appendChild(script); 947 | }; 948 | 949 | clippy.load._getAgentDfd = function (name) { 950 | var dfd = clippy.load._data[name]; 951 | if (!dfd) { 952 | dfd = clippy.load._data[name] = $.Deferred(); 953 | } 954 | return dfd; 955 | }; 956 | 957 | clippy.ready = function (name, data) { 958 | var dfd = clippy.load._getAgentDfd(name); 959 | dfd.resolve(data); 960 | }; 961 | 962 | clippy.soundsReady = function (name, data) { 963 | var dfd = clippy.load._sounds[name]; 964 | if (!dfd) { 965 | dfd = clippy.load._sounds[name] = $.Deferred(); 966 | } 967 | 968 | dfd.resolve(data); 969 | }; 970 | 971 | /****** 972 | * Tiny Queue 973 | * 974 | * @constructor 975 | */ 976 | clippy.Queue = function (onEmptyCallback) { 977 | this._queue = []; 978 | this._onEmptyCallback = onEmptyCallback; 979 | }; 980 | 981 | clippy.Queue.prototype = { 982 | /*** 983 | * 984 | * @param {function(Function)} func 985 | * @returns {jQuery.Deferred} 986 | */ 987 | queue:function (func) { 988 | this._queue.push(func); 989 | 990 | if (this._queue.length === 1 && !this._active) { 991 | this._progressQueue(); 992 | } 993 | }, 994 | 995 | _progressQueue:function () { 996 | 997 | // stop if nothing left in queue 998 | if (!this._queue.length) { 999 | this._onEmptyCallback(); 1000 | return; 1001 | } 1002 | 1003 | var f = this._queue.shift(); 1004 | this._active = true; 1005 | 1006 | // execute function 1007 | var completeFunction = $.proxy(this.next, this); 1008 | f(completeFunction); 1009 | }, 1010 | 1011 | clear:function () { 1012 | this._queue = []; 1013 | }, 1014 | 1015 | next:function () { 1016 | this._active = false; 1017 | this._progressQueue(); 1018 | } 1019 | }; 1020 | -------------------------------------------------------------------------------- /assets/js/agent.js: -------------------------------------------------------------------------------- 1 | clippy.ready('Clippy', {"overlayCount": 1, "sounds": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"], "framesize": [124, 93], "animations": {"Congratulate": {"frames": [{"duration": 100, "images": [[0, 0]], "sound": "15"}, {"duration": 10, "images": [[124, 0]]}, {"duration": 10, "images": [[248, 0]]}, {"duration": 10, "images": [[372, 0]], "sound": "14"}, {"duration": 10, "images": [[496, 0]]}, {"duration": 10, "images": [[620, 0]]}, {"duration": 10, "images": [[744, 0]]}, {"duration": 10, "images": [[868, 0]]}, {"duration": 10, "images": [[992, 0]], "sound": "1"}, {"duration": 100, "images": [[1116, 0]]}, {"duration": 100, "images": [[1240, 0]]}, {"duration": 100, "images": [[1364, 0]]}, {"duration": 1200, "images": [[1488, 0]]}, {"duration": 100, "images": [[1612, 0]], "sound": "10"}, {"duration": 100, "images": [[1736, 0]]}, {"duration": 1200, "images": [[1488, 0]]}, {"duration": 100, "images": [[1860, 0]]}, {"duration": 100, "images": [[1984, 0]]}, {"duration": 100, "images": [[2108, 0]]}, {"duration": 100, "images": [[2232, 0]]}, {"duration": 100, "images": [[2356, 0]], "exitBranch": 21}, {"duration": 100, "images": [[0, 0]]}]}, "LookRight": {"frames": [{"duration": 100, "images": [[0, 0]], "exitBranch": 6}, {"duration": 100, "images": [[620, 651]], "exitBranch": 5}, {"duration": 100, "images": [[744, 651]], "exitBranch": 4}, {"duration": 1200, "images": [[868, 651]]}, {"duration": 100, "images": [[992, 651]]}, {"duration": 100, "images": [[1116, 651]]}, {"duration": 100, "images": [[0, 0]]}]}, "SendMail": {"frames": [{"duration": 100, "images": [[0, 0]], "sound": "15"}, {"duration": 100, "images": [[1240, 1209]]}, {"duration": 100, "images": [[1364, 1209]]}, {"duration": 100, "images": [[1488, 1209]]}, {"duration": 100, "images": [[1612, 1209]]}, {"duration": 100, "images": [[1736, 1209]]}, {"duration": 100, "images": [[1860, 1209]]}, {"duration": 100, "images": [[1984, 1209]]}, {"duration": 100, "images": [[2108, 1209]]}, {"duration": 100, "images": [[2232, 1209]]}, {"duration": 100, "images": [[2356, 1209]]}, {"duration": 100, "images": [[2480, 1209]]}, {"duration": 100, "images": [[2604, 1209]]}, {"duration": 100, "images": [[2728, 1209]]}, {"duration": 100, "images": [[2852, 1209]]}, {"duration": 100, "images": [[2976, 1209]]}, {"duration": 100, "images": [[3100, 1209]]}, {"duration": 100, "images": [[3224, 1209]]}, {"duration": 100, "images": [[0, 1302]]}, {"duration": 100, "images": [[124, 1302]]}, {"duration": 100, "images": [[248, 1302]]}, {"duration": 100, "images": [[372, 1302]], "sound": "14"}, {"duration": 100, "images": [[496, 1302]], "exitBranch": 24}, {"duration": 100, "images": [[620, 1302]]}, {"duration": 100, "images": [[744, 1302]], "exitBranch": 26}, {"duration": 100, "images": [[868, 1302]]}, {"duration": 100, "images": [[992, 1302]], "exitBranch": 27}, {"duration": 100, "images": [[1116, 1302]], "exitBranch": 28}, {"duration": 100, "images": [[1240, 1302]], "exitBranch": 29}, {"duration": 100, "images": [[1364, 1302]], "exitBranch": 30}, {"duration": 100, "images": [[1488, 1302]], "exitBranch": 31}, {"duration": 100, "images": [[1612, 1302]], "exitBranch": 32}, {"duration": 100, "images": [[1736, 1302]]}, {"duration": 100, "images": [[1860, 1302]]}, {"duration": 100, "images": [[1984, 1302]]}, {"duration": 100, "images": [[2108, 1302]]}, {"duration": 100, "images": [[2232, 1302]]}, {"duration": 100, "images": [[2356, 1302]]}, {"duration": 100, "images": [[2480, 1302]]}, {"duration": 100, "images": [[2604, 1302]]}, {"duration": 100, "images": [[2728, 1302]]}, {"duration": 100, "images": [[2852, 1302]]}, {"duration": 100, "images": [[2976, 1302]]}, {"duration": 100, "images": [[3100, 1302]]}, {"duration": 100, "images": [[3224, 1302]]}, {"duration": 100, "images": [[0, 1395]]}, {"duration": 100, "images": [[124, 1395]]}, {"duration": 100, "images": [[248, 1395]], "exitBranch": 48}, {"duration": 100, "images": [[372, 1395]], "exitBranch": 49}, {"duration": 100, "images": [[496, 1395]]}, {"duration": 100, "images": [[620, 1395]], "sound": "4"}, {"duration": 100, "images": [[744, 1395]]}, {"duration": 100, "images": [[868, 1395]]}, {"duration": 600}, {"duration": 100, "images": [[992, 1395]]}, {"duration": 100, "images": [[1116, 1395]]}, {"duration": 100, "images": [[1240, 1395]]}, {"duration": 100, "images": [[1364, 1395]]}, {"duration": 100, "images": [[1488, 1395]]}, {"duration": 100, "images": [[1612, 1395]]}, {"duration": 100, "images": [[1736, 1395]]}, {"duration": 100, "images": [[1860, 1395]]}, {"duration": 100, "images": [[0, 0]]}]}, "Thinking": {"frames": [{"duration": 100, "images": [[0, 0]], "sound": "15"}, {"duration": 100, "images": [[124, 93]]}, {"duration": 100, "images": [[248, 93]]}, {"duration": 100, "images": [[372, 93]]}, {"duration": 100, "images": [[496, 93]], "sound": "14"}, {"duration": 100, "images": [[620, 93]]}, {"duration": 100, "images": [[744, 93]]}, {"duration": 100, "images": [[868, 93]]}, {"duration": 100, "images": [[992, 93]]}, {"duration": 100, "images": [[1116, 93]]}, {"duration": 100, "images": [[1240, 93]]}, {"duration": 100, "images": [[1364, 93]]}, {"duration": 100, "images": [[1488, 93]]}, {"duration": 100, "images": [[1612, 93]]}, {"duration": 100, "images": [[1736, 93]], "sound": "4"}, {"duration": 100, "images": [[1860, 93]]}, {"duration": 100, "images": [[1984, 93]]}, {"duration": 100, "images": [[2108, 93]]}, {"duration": 100, "images": [[2232, 93]]}, {"duration": 100, "images": [[2356, 93]]}, {"duration": 100, "images": [[2480, 93]]}, {"duration": 100, "images": [[2604, 93]]}, {"duration": 100, "images": [[2728, 93]]}, {"duration": 100, "images": [[2852, 93]]}, {"duration": 100, "images": [[2976, 93]]}, {"duration": 100, "images": [[3100, 93]]}, {"duration": 100, "images": [[3224, 93]]}, {"duration": 100, "images": [[0, 186]]}, {"duration": 100, "images": [[124, 186]]}, {"duration": 100, "images": [[248, 186]]}, {"duration": 100, "images": [[372, 186]]}, {"duration": 100, "images": [[496, 186]]}, {"duration": 100, "images": [[620, 186]], "exitBranch": 33, "branching": {"branches": [{"frameIndex": 21, "weight": 100}]}}, {"duration": 100, "images": [[744, 186]]}, {"duration": 100, "images": [[868, 186]]}, {"duration": 100, "images": [[992, 186]]}, {"duration": 100, "images": [[992, 93]]}, {"duration": 100, "images": [[868, 93]]}, {"duration": 100, "images": [[744, 93]], "sound": "14"}, {"duration": 100, "images": [[620, 93]]}, {"duration": 100, "images": [[496, 93]]}, {"duration": 100, "images": [[372, 93]]}, {"duration": 100, "images": [[248, 93]]}, {"duration": 100, "images": [[124, 93]]}, {"duration": 100, "images": [[0, 0]]}]}, "Explain": {"frames": [{"duration": 100, "images": [[0, 0]]}, {"duration": 100, "images": [[1116, 186]]}, {"duration": 100, "images": [[1240, 186]]}, {"duration": 900, "images": [[1364, 186]]}, {"duration": 100, "images": [[1240, 186]]}, {"duration": 100, "images": [[1116, 186]]}, {"duration": 100, "images": [[0, 0]]}]}, "IdleRopePile": {"frames": [{"duration": 100, "images": [[0, 0]]}, {"duration": 100, "images": [[1488, 186]], "exitBranch": 74}, {"duration": 100, "images": [[1612, 186]]}, {"duration": 100, "images": [[1736, 186]], "exitBranch": 74}, {"duration": 100, "images": [[1860, 186]]}, {"duration": 100, "images": [[1984, 186]], "exitBranch": 74}, {"duration": 100, "images": [[2108, 186]]}, {"duration": 100, "images": [[2232, 186]], "exitBranch": 74}, {"duration": 100, "images": [[2356, 186]]}, {"duration": 100, "images": [[2480, 186]], "exitBranch": 74}, {"duration": 100, "images": [[2604, 186]]}, {"duration": 100, "images": [[2728, 186]], "exitBranch": 74}, {"duration": 100, "images": [[2852, 186]]}, {"duration": 100, "images": [[2976, 186]], "exitBranch": 74}, {"duration": 100, "images": [[3100, 186]]}, {"duration": 100, "images": [[3224, 186]], "exitBranch": 74}, {"duration": 100, "images": [[0, 279]]}, {"duration": 100, "images": [[124, 279]], "exitBranch": 74}, {"duration": 100, "images": [[248, 279]]}, {"duration": 100, "images": [[372, 279]], "exitBranch": 74}, {"duration": 100, "images": [[496, 279]]}, {"duration": 100, "images": [[620, 279]], "exitBranch": 74}, {"duration": 100, "images": [[744, 279]]}, {"duration": 100, "images": [[868, 279]], "exitBranch": 74}, {"duration": 100, "images": [[992, 279]]}, {"duration": 100, "images": [[1116, 279]], "exitBranch": 74}, {"duration": 100, "images": [[1240, 279]]}, {"duration": 100, "images": [[1364, 279]], "exitBranch": 74}, {"duration": 100, "images": [[1488, 279]]}, {"duration": 100, "images": [[1612, 279]], "exitBranch": 74}, {"duration": 100, "images": [[1736, 279]]}, {"duration": 100, "images": [[1860, 279]], "exitBranch": 74}, {"duration": 100, "images": [[1984, 279]]}, {"duration": 100, "images": [[2108, 279]], "exitBranch": 74}, {"duration": 100, "images": [[2232, 279]]}, {"duration": 100, "images": [[2356, 279]]}, {"duration": 100, "images": [[2480, 279]], "exitBranch": 74}, {"duration": 100, "images": [[2604, 279]]}, {"duration": 100, "images": [[2728, 279]], "exitBranch": 40}, {"duration": 100, "images": [[2852, 279]]}, {"duration": 100, "images": [[2976, 279]], "exitBranch": 42}, {"duration": 100, "images": [[3100, 279]]}, {"duration": 100, "images": [[3224, 279]], "exitBranch": 44}, {"duration": 100, "images": [[0, 372]]}, {"duration": 100, "images": [[124, 372]], "exitBranch": 46}, {"duration": 100, "images": [[248, 372]]}, {"duration": 100, "images": [[372, 372]], "exitBranch": 48}, {"duration": 100, "images": [[496, 372]]}, {"duration": 100, "images": [[620, 372]], "exitBranch": 50}, {"duration": 100, "images": [[744, 372]]}, {"duration": 100, "images": [[868, 372]], "exitBranch": 52}, {"duration": 100, "images": [[992, 372]]}, {"duration": 100, "images": [[1116, 372]], "exitBranch": 54}, {"duration": 100, "images": [[1240, 372]]}, {"duration": 100, "images": [[1364, 372]], "exitBranch": 56}, {"duration": 100, "images": [[1488, 372]]}, {"duration": 100, "images": [[1612, 372]], "exitBranch": 58}, {"duration": 100, "images": [[1736, 372]]}, {"duration": 100, "images": [[1860, 372]], "exitBranch": 5}, {"duration": 100, "images": [[1984, 372]]}, {"duration": 100, "images": [[2108, 372]], "exitBranch": 70}, {"duration": 100, "images": [[2232, 372]], "exitBranch": 70, "branching": {"branches": [{"frameIndex": 61, "weight": 95}]}}, {"duration": 100, "images": [[2356, 372]], "exitBranch": 70, "branching": {"branches": [{"frameIndex": 61, "weight": 25}, {"frameIndex": 67, "weight": 25}, {"frameIndex": 65, "weight": 25}]}}, {"duration": 100, "images": [[2480, 372]], "exitBranch": 70, "branching": {"branches": [{"frameIndex": 63, "weight": 95}]}}, {"duration": 100, "images": [[2604, 372]], "exitBranch": 70, "branching": {"branches": [{"frameIndex": 61, "weight": 25}, {"frameIndex": 67, "weight": 25}, {"frameIndex": 63, "weight": 25}]}}, {"duration": 100, "images": [[2728, 372]], "exitBranch": 70, "branching": {"branches": [{"frameIndex": 65, "weight": 95}]}}, {"duration": 100, "images": [[2604, 372]], "exitBranch": 70, "branching": {"branches": [{"frameIndex": 61, "weight": 25}, {"frameIndex": 65, "weight": 25}, {"frameIndex": 63, "weight": 25}]}}, {"duration": 100, "images": [[2852, 372]], "exitBranch": 70, "branching": {"branches": [{"frameIndex": 67, "weight": 95}]}}, {"duration": 100, "images": [[2604, 372]], "exitBranch": 70, "branching": {"branches": [{"frameIndex": 65, "weight": 25}, {"frameIndex": 67, "weight": 25}, {"frameIndex": 63, "weight": 25}]}}, {"duration": 100, "images": [[2976, 372]], "exitBranch": 70, "branching": {"branches": [{"frameIndex": 61, "weight": 95}]}}, {"duration": 100, "images": [[3100, 372]]}, {"duration": 100, "images": [[3224, 372]]}, {"duration": 100, "images": [[0, 465]]}, {"duration": 100, "images": [[124, 465]]}, {"duration": 100, "images": [[0, 0]]}]}, "IdleAtom": {"frames": [{"duration": 100, "images": [[0, 0]], "branching": {"branches": [{"frameIndex": 44, "weight": 97}]}}, {"duration": 100, "images": [[124, 93]]}, {"duration": 100, "images": [[248, 93]]}, {"duration": 100, "images": [[372, 93]]}, {"duration": 100, "images": [[496, 93]]}, {"duration": 100, "images": [[620, 93]]}, {"duration": 100, "images": [[744, 93]]}, {"duration": 100, "images": [[868, 93]]}, {"duration": 100, "images": [[992, 93]]}, {"duration": 100, "images": [[1116, 93]]}, {"duration": 100, "images": [[1240, 93]]}, {"duration": 100, "images": [[1364, 93]]}, {"duration": 100, "images": [[1488, 93]]}, {"duration": 100, "images": [[1612, 93]]}, {"duration": 100, "images": [[1736, 93]]}, {"duration": 100, "images": [[1860, 93]]}, {"duration": 100, "images": [[1984, 93]]}, {"duration": 100, "images": [[2108, 93]]}, {"duration": 100, "images": [[2232, 93]]}, {"duration": 100, "images": [[2356, 93]]}, {"duration": 100, "images": [[2480, 93]]}, {"duration": 100, "images": [[2604, 93]]}, {"duration": 100, "images": [[2728, 93]]}, {"duration": 100, "images": [[2852, 93]]}, {"duration": 100, "images": [[2976, 93]]}, {"duration": 100, "images": [[3100, 93]]}, {"duration": 100, "images": [[3224, 93]]}, {"duration": 100, "images": [[0, 186]]}, {"duration": 100, "images": [[124, 186]]}, {"duration": 100, "images": [[248, 186]]}, {"duration": 100, "images": [[372, 186]]}, {"duration": 100, "images": [[496, 186]]}, {"duration": 100, "images": [[620, 186]], "exitBranch": 33, "branching": {"branches": [{"frameIndex": 21, "weight": 95}]}}, {"duration": 100, "images": [[744, 186]]}, {"duration": 100, "images": [[868, 186]]}, {"duration": 100, "images": [[992, 186]]}, {"duration": 100, "images": [[992, 93]]}, {"duration": 100, "images": [[868, 93]]}, {"duration": 100, "images": [[744, 93]]}, {"duration": 100, "images": [[620, 93]]}, {"duration": 100, "images": [[496, 93]]}, {"duration": 100, "images": [[372, 93]]}, {"duration": 100, "images": [[248, 93]]}, {"duration": 100, "images": [[124, 93]]}, {"duration": 100, "images": [[0, 0]]}]}, "Print": {"frames": [{"duration": 100, "images": [[0, 0]], "sound": "15"}, {"duration": 100, "images": [[248, 465]]}, {"duration": 100, "images": [[372, 465]]}, {"duration": 100, "images": [[496, 465]]}, {"duration": 100, "images": [[620, 465]], "sound": "5"}, {"duration": 100, "images": [[744, 465]]}, {"duration": 100, "images": [[868, 465]]}, {"duration": 100, "images": [[992, 465]]}, {"duration": 100, "images": [[1116, 465]]}, {"duration": 100, "images": [[1240, 465]]}, {"duration": 100, "images": [[1364, 465]], "sound": "8"}, {"duration": 150, "images": [[1488, 465]]}, {"duration": 100, "images": [[1612, 465]], "sound": "8"}, {"duration": 100, "images": [[1736, 465]]}, {"duration": 100, "images": [[1860, 465]]}, {"duration": 100, "images": [[1984, 465]]}, {"duration": 100, "images": [[2108, 465]]}, {"duration": 100, "images": [[2232, 465]]}, {"duration": 100, "images": [[2356, 465]]}, {"duration": 100, "images": [[2480, 465]]}, {"duration": 100, "images": [[2604, 465]]}, {"duration": 100, "images": [[2728, 465]]}, {"duration": 450, "images": [[2852, 465]]}, {"duration": 200, "images": [[2976, 465]]}, {"duration": 100, "images": [[3100, 465]], "exitBranch": 26}, {"duration": 100, "images": [[3224, 465]], "sound": "7"}, {"duration": 100, "images": [[0, 558]], "exitBranch": 28}, {"duration": 100, "images": [[124, 558]]}, {"duration": 100, "images": [[248, 558]], "exitBranch": 30}, {"duration": 100, "images": [[372, 558]]}, {"duration": 600, "images": [[496, 558]], "exitBranch": 32}, {"duration": 100, "images": [[620, 558]], "sound": "7"}, {"duration": 100, "images": [[744, 558]], "exitBranch": 34}, {"duration": 100, "images": [[868, 558]]}, {"duration": 100, "images": [[992, 558]], "exitBranch": 36}, {"duration": 100, "images": [[1116, 558]]}, {"duration": 600, "images": [[1240, 558]], "exitBranch": 38}, {"duration": 100, "images": [[1364, 558]], "sound": "7"}, {"duration": 100, "images": [[1488, 558]], "exitBranch": 40}, {"duration": 100, "images": [[1612, 558]]}, {"duration": 100, "images": [[1736, 558]], "exitBranch": 44}, {"duration": 600, "images": [[1860, 558]]}, {"duration": 100, "images": [[1984, 558]], "exitBranch": 44, "sound": "7"}, {"duration": 100, "images": [[2108, 558]]}, {"duration": 100, "images": [[2232, 558]], "exitBranch": 46}, {"duration": 100, "images": [[2356, 558]]}, {"duration": 100, "images": [[2480, 558]], "exitBranch": 48}, {"duration": 100, "images": [[2604, 558]]}, {"duration": 100, "images": [[2728, 558]], "exitBranch": 51}, {"duration": 600, "images": [[2852, 558]]}, {"duration": 100, "images": [[2976, 558]]}, {"duration": 100, "images": [[3100, 558]], "exitBranch": 53}, {"duration": 100, "images": [[3224, 558]], "sound": "11"}, {"duration": 100, "images": [[0, 651]]}, {"duration": 100, "images": [[124, 651]]}, {"duration": 100, "images": [[248, 651]]}, {"duration": 100, "images": [[372, 651]], "exitBranch": 58}, {"duration": 100, "images": [[496, 651]]}, {"duration": 100, "images": [[0, 0]]}]}, "Hide": {"frames": [{"duration": 10, "images": [[0, 0]]}, {"duration": 10, "images": [[2480, 0]]}, {"duration": 10, "images": [[2604, 0]]}, {"duration": 10, "images": [[2728, 0]]}, {"duration": 10}]}, "GetAttention": {"frames": [{"duration": 100, "images": [[0, 0]], "sound": "15"}, {"duration": 100, "images": [[1240, 651]]}, {"duration": 100, "images": [[1364, 651]]}, {"duration": 100, "images": [[1488, 651]]}, {"duration": 100, "images": [[1612, 651]]}, {"duration": 100, "images": [[1736, 651]]}, {"duration": 100, "images": [[1860, 651]]}, {"duration": 100, "images": [[1984, 651]]}, {"duration": 100, "images": [[2108, 651]]}, {"duration": 100, "images": [[2232, 651]], "sound": "10"}, {"duration": 150, "images": [[2356, 651]]}, {"duration": 150, "images": [[2232, 651]], "sound": "10"}, {"duration": 150, "images": [[2356, 651]]}, {"duration": 150, "images": [[2232, 651]], "sound": "10"}, {"duration": 150, "images": [[2480, 651]]}, {"duration": 100, "images": [[2604, 651]]}, {"duration": 100, "images": [[2728, 651]]}, {"duration": 100, "images": [[2852, 651]]}, {"duration": 100, "images": [[2976, 651]]}, {"duration": 100, "images": [[3100, 651]]}, {"duration": 100, "images": [[3224, 651]]}, {"duration": 100, "images": [[0, 744]]}, {"duration": 100, "images": [[124, 744]], "exitBranch": 23}, {"duration": 100, "images": [[0, 0]]}]}, "Save": {"frames": [{"duration": 100, "images": [[0, 0]], "sound": "15"}, {"duration": 100, "images": [[3100, 837]]}, {"duration": 130, "images": [[3224, 837]], "sound": "13"}, {"duration": 130, "images": [[0, 930]]}, {"duration": 100, "images": [[124, 930]]}, {"duration": 100, "images": [[248, 930]]}, {"duration": 100, "images": [[372, 930]]}, {"duration": 100, "images": [[496, 930]], "exitBranch": 10}, {"duration": 450, "images": [[620, 930]]}, {"duration": 100, "images": [[496, 930]], "exitBranch": 10}, {"duration": 100, "images": [[744, 930]]}, {"duration": 100, "images": [[868, 930]]}, {"duration": 100, "images": [[992, 930]]}, {"duration": 130, "images": [[1116, 930]], "sound": "8"}, {"duration": 130, "images": [[1240, 930]]}, {"duration": 130, "images": [[1364, 930]]}, {"duration": 130, "images": [[1488, 930]], "sound": "8"}, {"duration": 130, "images": [[1612, 930]], "sound": "8"}, {"duration": 130, "images": [[1736, 930]]}, {"duration": 130, "images": [[1860, 930]], "sound": "8"}, {"duration": 100, "images": [[1984, 930]]}, {"duration": 100, "images": [[2108, 930]], "sound": "9"}, {"duration": 160, "images": [[2232, 930]]}, {"duration": 100, "images": [[2356, 930]], "sound": "2"}, {"duration": 100, "images": [[2480, 930]]}, {"duration": 100, "images": [[2604, 930]]}, {"duration": 100, "images": [[2728, 930]], "exitBranch": 34}, {"duration": 450, "images": [[2852, 930]]}, {"duration": 100, "images": [[2976, 930]], "exitBranch": 34, "sound": "10"}, {"duration": 400, "images": [[3100, 930]]}, {"duration": 100, "images": [[3224, 930]], "exitBranch": 34}, {"duration": 100, "images": [[0, 1023]]}, {"duration": 100, "images": [[124, 1023]]}, {"duration": 100, "images": [[248, 1023]]}, {"duration": 100, "images": [[372, 1023]]}, {"duration": 100, "images": [[496, 1023]]}, {"duration": 100, "images": [[620, 1023]]}, {"duration": 100, "images": [[744, 1023]]}, {"duration": 100, "images": [[868, 1023]]}, {"duration": 100, "images": [[992, 1023]]}, {"duration": 100, "images": [[1116, 1023]]}, {"duration": 100, "images": [[0, 0]]}]}, "GetTechy": {"frames": [{"duration": 100, "images": [[0, 0]], "sound": "15"}, {"duration": 100, "images": [[124, 93]]}, {"duration": 100, "images": [[248, 93]]}, {"duration": 100, "images": [[372, 93]]}, {"duration": 100, "images": [[496, 93]], "sound": "14"}, {"duration": 100, "images": [[620, 93]]}, {"duration": 100, "images": [[744, 93]]}, {"duration": 100, "images": [[868, 93]]}, {"duration": 100, "images": [[992, 93]]}, {"duration": 100, "images": [[1116, 93]]}, {"duration": 100, "images": [[1240, 93]]}, {"duration": 100, "images": [[1364, 93]]}, {"duration": 100, "images": [[1488, 93]]}, {"duration": 100, "images": [[1612, 93]]}, {"duration": 100, "images": [[1736, 93]], "sound": "4"}, {"duration": 100, "images": [[1860, 93]]}, {"duration": 100, "images": [[1984, 93]]}, {"duration": 100, "images": [[2108, 93]]}, {"duration": 100, "images": [[2232, 93]]}, {"duration": 100, "images": [[2356, 93]]}, {"duration": 100, "images": [[2480, 93]]}, {"duration": 100, "images": [[2604, 93]]}, {"duration": 100, "images": [[2728, 93]]}, {"duration": 100, "images": [[2852, 93]]}, {"duration": 100, "images": [[2976, 93]]}, {"duration": 100, "images": [[3100, 93]]}, {"duration": 100, "images": [[3224, 93]]}, {"duration": 100, "images": [[0, 186]]}, {"duration": 100, "images": [[124, 186]]}, {"duration": 100, "images": [[248, 186]]}, {"duration": 100, "images": [[372, 186]]}, {"duration": 100, "images": [[496, 186]]}, {"duration": 100, "images": [[620, 186]], "exitBranch": 33, "branching": {"branches": [{"frameIndex": 21, "weight": 100}]}}, {"duration": 100, "images": [[744, 186]]}, {"duration": 100, "images": [[868, 186]]}, {"duration": 100, "images": [[992, 186]]}, {"duration": 100, "images": [[992, 93]]}, {"duration": 100, "images": [[868, 93]]}, {"duration": 100, "images": [[744, 93]], "sound": "14"}, {"duration": 100, "images": [[620, 93]]}, {"duration": 100, "images": [[496, 93]]}, {"duration": 100, "images": [[372, 93]]}, {"duration": 100, "images": [[248, 93]]}, {"duration": 100, "images": [[124, 93]]}, {"duration": 100, "images": [[0, 0]]}]}, "GestureUp": {"frames": [{"duration": 100, "images": [[0, 0]]}, {"duration": 100, "images": [[868, 744]]}, {"duration": 100, "images": [[992, 744]]}, {"duration": 100, "images": [[1116, 744]]}, {"duration": 100, "images": [[1240, 744]]}, {"duration": 100, "images": [[1364, 744]], "exitBranch": 11}, {"duration": 100, "images": [[1488, 744]]}, {"duration": 100, "images": [[1612, 744]], "branching": {"branches": [{"frameIndex": 5, "weight": 50}]}}, {"duration": 100, "images": [[1736, 744]]}, {"duration": 1200, "images": [[1860, 744]]}, {"duration": 100, "images": [[1984, 744]]}, {"duration": 100, "images": [[1364, 744]]}, {"duration": 100, "images": [[1240, 744]]}, {"duration": 100, "images": [[1116, 744]]}, {"duration": 100, "images": [[992, 744]]}, {"duration": 100, "images": [[868, 744]]}, {"duration": 100, "images": [[0, 0]]}]}, "Idle1_1": {"frames": [{"duration": 100, "images": [[0, 0]], "branching": {"branches": [{"frameIndex": 37, "weight": 20}]}}, {"duration": 100, "images": [[2108, 744]], "exitBranch": 2, "branching": {"branches": [{"frameIndex": 1, "weight": 95}]}}, {"duration": 100, "images": [[2232, 744]], "exitBranch": 16}, {"duration": 100, "images": [[2356, 744]]}, {"duration": 300, "images": [[2480, 744]], "exitBranch": 5, "branching": {"branches": [{"frameIndex": 4, "weight": 95}]}}, {"duration": 100, "images": [[2604, 744]], "exitBranch": 16, "branching": {"branches": [{"frameIndex": 9, "weight": 25}, {"frameIndex": 12, "weight": 25}, {"frameIndex": 15, "weight": 25}]}}, {"duration": 100, "images": [[2728, 744]]}, {"duration": 300, "images": [[2852, 744]], "exitBranch": 8, "branching": {"branches": [{"frameIndex": 7, "weight": 94}, {"frameIndex": 5, "weight": 3}]}}, {"duration": 100, "images": [[2976, 744]], "exitBranch": 16}, {"duration": 100, "images": [[3100, 744]]}, {"duration": 300, "images": [[3224, 744]], "exitBranch": 11, "branching": {"branches": [{"frameIndex": 10, "weight": 94}, {"frameIndex": 8, "weight": 2}, {"frameIndex": 5, "weight": 2}]}}, {"duration": 100, "images": [[0, 837]], "exitBranch": 16}, {"duration": 100, "images": [[124, 837]]}, {"duration": 300, "images": [[248, 837]], "exitBranch": 14, "branching": {"branches": [{"frameIndex": 13, "weight": 93}, {"frameIndex": 11, "weight": 3}, {"frameIndex": 5, "weight": 2}]}}, {"duration": 100, "images": [[372, 837]], "exitBranch": 16}, {"duration": 100, "images": [[496, 837]]}, {"duration": 300, "images": [[620, 837]], "exitBranch": 17, "branching": {"branches": [{"frameIndex": 16, "weight": 95}]}}, {"duration": 100, "images": [[744, 837]], "exitBranch": 36, "branching": {"branches": [{"frameIndex": 36, "weight": 90}]}}, {"duration": 100, "images": [[868, 837]]}, {"duration": 300, "images": [[992, 837]], "exitBranch": 35}, {"duration": 100, "images": [[1116, 837]]}, {"duration": 100, "images": [[1240, 837]], "exitBranch": 35}, {"duration": 300, "images": [[1364, 837]], "exitBranch": 23, "branching": {"branches": [{"frameIndex": 22, "weight": 94}, {"frameIndex": 23, "weight": 3}]}}, {"duration": 100, "images": [[1488, 837]], "exitBranch": 35, "branching": {"branches": [{"frameIndex": 24, "weight": 25}, {"frameIndex": 27, "weight": 25}, {"frameIndex": 30, "weight": 25}]}}, {"duration": 100, "images": [[1612, 837]]}, {"duration": 300, "images": [[1736, 837]], "exitBranch": 26, "branching": {"branches": [{"frameIndex": 25, "weight": 94}, {"frameIndex": 23, "weight": 3}]}}, {"duration": 100, "images": [[1860, 837]], "exitBranch": 35}, {"duration": 100, "images": [[1984, 837]]}, {"duration": 300, "images": [[2108, 837]], "exitBranch": 29, "branching": {"branches": [{"frameIndex": 28, "weight": 94}, {"frameIndex": 23, "weight": 3}]}}, {"duration": 100, "images": [[2232, 837]], "exitBranch": 35}, {"duration": 100, "images": [[2356, 837]]}, {"duration": 300, "images": [[2480, 837]], "exitBranch": 32, "branching": {"branches": [{"frameIndex": 31, "weight": 94}, {"frameIndex": 23, "weight": 3}]}}, {"duration": 100, "images": [[2604, 837]], "exitBranch": 35}, {"duration": 100, "images": [[2728, 837]]}, {"duration": 300, "images": [[2852, 837]], "exitBranch": 35, "branching": {"branches": [{"frameIndex": 34, "weight": 80}]}}, {"duration": 100, "images": [[2976, 837]]}, {"duration": 100, "images": [[0, 0]], "exitBranch": 42}, {"duration": 100, "images": [[1116, 186]]}, {"duration": 100, "images": [[1240, 186]]}, {"duration": 900, "images": [[1364, 186]]}, {"duration": 100, "images": [[1240, 186]]}, {"duration": 100, "images": [[1116, 186]]}, {"duration": 100, "images": [[0, 0]]}]}, "Processing": {"frames": [{"duration": 100, "images": [[0, 0]], "sound": "15"}, {"duration": 100, "images": [[1240, 1023]], "sound": "14"}, {"duration": 100, "images": [[1364, 1023]]}, {"duration": 100, "images": [[1488, 1023]]}, {"duration": 100, "images": [[1612, 1023]], "exitBranch": 33}, {"duration": 100, "images": [[1736, 1023]]}, {"duration": 100, "images": [[1860, 1023]]}, {"duration": 100, "images": [[1984, 1023]]}, {"duration": 100, "images": [[2108, 1023]], "sound": "11"}, {"duration": 100, "images": [[2232, 1023]], "exitBranch": 31}, {"duration": 100, "images": [[2356, 1023]]}, {"duration": 100, "images": [[2480, 1023]]}, {"duration": 100, "images": [[2604, 1023]]}, {"duration": 100, "images": [[2728, 1023]], "exitBranch": 31}, {"duration": 100, "images": [[2852, 1023]]}, {"duration": 100, "images": [[2976, 1023]]}, {"duration": 100, "images": [[3100, 1023]]}, {"duration": 100, "images": [[3224, 1023]]}, {"duration": 100, "images": [[0, 1116]], "sound": "11"}, {"duration": 100, "images": [[124, 1116]]}, {"duration": 100, "images": [[248, 1116]]}, {"duration": 100, "images": [[372, 1116]]}, {"duration": 100, "images": [[496, 1116]]}, {"duration": 100, "images": [[620, 1116]]}, {"duration": 100, "images": [[744, 1116]]}, {"duration": 100, "images": [[868, 1116]]}, {"duration": 100, "images": [[992, 1116]]}, {"duration": 100, "images": [[1116, 1116]], "exitBranch": 28, "branching": {"branches": [{"frameIndex": 7, "weight": 100}]}}, {"duration": 100, "images": [[1240, 1116]], "sound": "11"}, {"duration": 100, "images": [[1364, 1116]]}, {"duration": 100, "images": [[1488, 1116]]}, {"duration": 100, "images": [[1612, 1116]]}, {"duration": 100, "images": [[1736, 1116]]}, {"duration": 100, "images": [[1860, 1116]]}, {"duration": 100, "images": [[1984, 1116]]}, {"duration": 100, "images": [[2108, 1116]]}, {"duration": 100, "images": [[2232, 1116]]}, {"duration": 100, "images": [[0, 0]]}]}, "Alert": {"frames": [{"duration": 100, "images": [[0, 0]], "sound": "15"}, {"duration": 100, "images": [[2356, 1116]]}, {"duration": 100, "images": [[2480, 1116]]}, {"duration": 100, "images": [[2604, 1116]]}, {"duration": 100, "images": [[2728, 1116]]}, {"duration": 100, "images": [[2852, 1116]]}, {"duration": 100, "images": [[2976, 1116]], "sound": "6"}, {"duration": 100, "images": [[3100, 1116]]}, {"duration": 100, "images": [[3224, 1116]]}, {"duration": 100, "images": [[0, 1209]]}, {"duration": 500, "images": [[124, 1209]], "exitBranch": 13}, {"duration": 100, "images": [[248, 1209]], "exitBranch": 13}, {"duration": 100, "images": [[372, 1209]]}, {"duration": 100, "images": [[496, 1209]]}, {"duration": 100, "images": [[620, 1209]]}, {"duration": 100, "images": [[744, 1209]]}, {"duration": 100, "images": [[868, 1209]]}, {"duration": 100, "images": [[992, 1209]]}, {"duration": 100, "images": [[1116, 1209]]}, {"duration": 100, "images": [[0, 0]]}]}, "LookUpRight": {"frames": [{"duration": 100, "images": [[0, 0]], "exitBranch": 6}, {"duration": 100, "images": [[248, 744]], "exitBranch": 5}, {"duration": 100, "images": [[372, 744]], "exitBranch": 4}, {"duration": 1200, "images": [[496, 744]]}, {"duration": 100, "images": [[620, 744]]}, {"duration": 100, "images": [[744, 744]]}, {"duration": 100, "images": [[0, 0]]}]}, "IdleSideToSide": {"frames": [{"duration": 100, "images": [[0, 0]]}, {"duration": 100, "images": [[2108, 744]], "exitBranch": 2, "branching": {"branches": [{"frameIndex": 1, "weight": 95}]}}, {"duration": 100, "images": [[2232, 744]], "exitBranch": 16}, {"duration": 100, "images": [[2356, 744]]}, {"duration": 300, "images": [[2480, 744]], "exitBranch": 5, "branching": {"branches": [{"frameIndex": 4, "weight": 95}]}}, {"duration": 100, "images": [[2604, 744]], "exitBranch": 16, "branching": {"branches": [{"frameIndex": 9, "weight": 25}, {"frameIndex": 12, "weight": 25}, {"frameIndex": 15, "weight": 25}]}}, {"duration": 100, "images": [[2728, 744]]}, {"duration": 300, "images": [[2852, 744]], "exitBranch": 8, "branching": {"branches": [{"frameIndex": 7, "weight": 92}, {"frameIndex": 5, "weight": 5}]}}, {"duration": 100, "images": [[2976, 744]], "exitBranch": 16}, {"duration": 100, "images": [[3100, 744]]}, {"duration": 300, "images": [[3224, 744]], "exitBranch": 11, "branching": {"branches": [{"frameIndex": 10, "weight": 91}, {"frameIndex": 8, "weight": 5}, {"frameIndex": 5, "weight": 2}]}}, {"duration": 100, "images": [[0, 837]], "exitBranch": 16}, {"duration": 100, "images": [[124, 837]]}, {"duration": 300, "images": [[248, 837]], "exitBranch": 14, "branching": {"branches": [{"frameIndex": 13, "weight": 91}, {"frameIndex": 11, "weight": 3}, {"frameIndex": 5, "weight": 2}]}}, {"duration": 100, "images": [[372, 837]], "exitBranch": 16}, {"duration": 100, "images": [[496, 837]]}, {"duration": 300, "images": [[620, 837]], "exitBranch": 17, "branching": {"branches": [{"frameIndex": 16, "weight": 75}]}}, {"duration": 100, "images": [[744, 837]], "exitBranch": 36, "branching": {"branches": [{"frameIndex": 36, "weight": 90}]}}, {"duration": 100, "images": [[868, 837]]}, {"duration": 300, "images": [[992, 837]], "exitBranch": 35}, {"duration": 100, "images": [[1116, 837]]}, {"duration": 100, "images": [[1240, 837]], "exitBranch": 35}, {"duration": 300, "images": [[1364, 837]], "exitBranch": 23, "branching": {"branches": [{"frameIndex": 22, "weight": 91}, {"frameIndex": 23, "weight": 5}]}}, {"duration": 100, "images": [[1488, 837]], "exitBranch": 35, "branching": {"branches": [{"frameIndex": 24, "weight": 25}, {"frameIndex": 27, "weight": 25}, {"frameIndex": 30, "weight": 25}]}}, {"duration": 100, "images": [[1612, 837]]}, {"duration": 0, "images": [[1736, 837]], "exitBranch": 26, "branching": {"branches": [{"frameIndex": 25, "weight": 91}, {"frameIndex": 23, "weight": 5}]}}, {"duration": 100, "images": [[1860, 837]], "exitBranch": 35}, {"duration": 100, "images": [[1984, 837]]}, {"duration": 300, "images": [[2108, 837]], "exitBranch": 29, "branching": {"branches": [{"frameIndex": 28, "weight": 91}, {"frameIndex": 23, "weight": 5}]}}, {"duration": 100, "images": [[2232, 837]], "exitBranch": 35}, {"duration": 100, "images": [[2356, 837]]}, {"duration": 300, "images": [[2480, 837]], "exitBranch": 32, "branching": {"branches": [{"frameIndex": 31, "weight": 91}, {"frameIndex": 23, "weight": 5}]}}, {"duration": 100, "images": [[2604, 837]], "exitBranch": 35}, {"duration": 100, "images": [[2728, 837]]}, {"duration": 300, "images": [[2852, 837]], "exitBranch": 35, "branching": {"branches": [{"frameIndex": 34, "weight": 80}]}}, {"duration": 100, "images": [[2976, 837]]}, {"duration": 100, "images": [[0, 0]]}]}, "GoodBye": {"frames": [{"duration": 100, "images": [[0, 0]], "exitBranch": 34, "sound": "15", "branching": {"branches": [{"frameIndex": 34, "weight": 50}]}}, {"duration": 100, "images": [[2356, 2883]]}, {"duration": 250, "images": [[2480, 2883]]}, {"duration": 100, "images": [[2604, 2883]], "sound": "13"}, {"duration": 100, "images": [[2728, 2883]]}, {"duration": 100, "images": [[2852, 2883]]}, {"duration": 100, "images": [[2976, 2883]]}, {"duration": 100, "images": [[3100, 2883]], "sound": "12"}, {"duration": 100, "images": [[3224, 2883]]}, {"duration": 100, "images": [[0, 2976]]}, {"duration": 100, "images": [[124, 2976]]}, {"duration": 100, "images": [[248, 2976]]}, {"duration": 100, "images": [[372, 2976]]}, {"duration": 100, "images": [[496, 2976]]}, {"duration": 200, "images": [[620, 2976]]}, {"duration": 200, "images": [[744, 2976]], "sound": "10"}, {"duration": 200, "images": [[620, 2976]]}, {"duration": 200, "images": [[868, 2976]]}, {"duration": 100, "images": [[992, 2976]]}, {"duration": 100, "images": [[1116, 2976]]}, {"duration": 200, "images": [[1240, 2976]]}, {"duration": 100, "images": [[1364, 2976]], "sound": "14"}, {"duration": 100, "images": [[1488, 2976]]}, {"duration": 100, "images": [[1612, 2976]]}, {"duration": 100, "images": [[1736, 2976]]}, {"duration": 100, "images": [[1860, 2976]]}, {"duration": 100, "images": [[1984, 2976]]}, {"duration": 100, "images": [[2108, 2976]]}, {"duration": 100, "images": [[2232, 2976]]}, {"duration": 100, "images": [[2356, 2976]]}, {"duration": 100, "images": [[2480, 2976]], "sound": "11"}, {"duration": 100, "images": [[2604, 2976]]}, {"duration": 100, "images": [[2728, 2976]]}, {"duration": 100, "images": [[2852, 2976]], "exitBranch": 37, "branching": {"branches": [{"frameIndex": 37, "weight": 100}]}}, {"duration": 100, "images": [[1240, 1395]]}, {"duration": 100, "images": [[1116, 1395]]}, {"duration": 100, "images": [[992, 1395]]}, {"duration": 100}]}, "LookLeft": {"frames": [{"duration": 100, "images": [[0, 0]], "exitBranch": 6}, {"duration": 100, "images": [[248, 1488]], "exitBranch": 5}, {"duration": 100, "images": [[372, 1488]], "exitBranch": 4}, {"duration": 1200, "images": [[496, 1488]]}, {"duration": 100, "images": [[620, 1488]]}, {"duration": 100, "images": [[744, 1488]]}, {"duration": 100, "images": [[0, 0]]}]}, "IdleHeadScratch": {"frames": [{"duration": 100, "images": [[1984, 2418]], "branching": {"branches": [{"frameIndex": 18, "weight": 85}]}}, {"duration": 100, "images": [[2108, 2418]]}, {"duration": 100, "images": [[2232, 2418]], "exitBranch": 16}, {"duration": 100, "images": [[2356, 2418]]}, {"duration": 100, "images": [[2480, 2418]]}, {"duration": 100, "images": [[2604, 2418]]}, {"duration": 100, "images": [[2728, 2418]], "exitBranch": 16}, {"duration": 100, "images": [[2852, 2418]]}, {"duration": 100, "images": [[2976, 2418]]}, {"duration": 100, "images": [[3100, 2418]], "exitBranch": 16, "branching": {"branches": [{"frameIndex": 6, "weight": 80}]}}, {"duration": 100, "images": [[3224, 2418]], "exitBranch": 16}, {"duration": 100, "images": [[0, 2511]]}, {"duration": 100, "images": [[124, 2511]], "exitBranch": 16}, {"duration": 100, "images": [[248, 2511]]}, {"duration": 100, "images": [[372, 2511]]}, {"duration": 100, "images": [[496, 2511]], "exitBranch": 16, "branching": {"branches": [{"frameIndex": 12, "weight": 80}]}}, {"duration": 100, "images": [[620, 2511]]}, {"duration": 100, "images": [[744, 2511]]}, {"duration": 100, "images": [[868, 2511]]}]}, "LookUpLeft": {"frames": [{"duration": 100, "images": [[0, 0]], "exitBranch": 6}, {"duration": 100, "images": [[868, 1488]], "exitBranch": 5}, {"duration": 100, "images": [[992, 1488]], "exitBranch": 4}, {"duration": 1200, "images": [[1116, 1488]]}, {"duration": 100, "images": [[1240, 1488]]}, {"duration": 100, "images": [[1364, 1488]]}, {"duration": 100, "images": [[0, 0]]}]}, "CheckingSomething": {"frames": [{"duration": 100, "images": [[0, 0]], "sound": "15"}, {"duration": 100, "images": [[1488, 1488]], "sound": "13"}, {"duration": 100, "images": [[1612, 1488]]}, {"duration": 100, "images": [[1736, 1488]]}, {"duration": 100, "images": [[1860, 1488]]}, {"duration": 100, "images": [[1984, 1488]]}, {"duration": 100, "images": [[2108, 1488]]}, {"duration": 100, "images": [[2232, 1488]]}, {"duration": 200, "images": [[2356, 1488]]}, {"duration": 200, "images": [[2480, 1488]]}, {"duration": 200, "images": [[2604, 1488]]}, {"duration": 100, "images": [[2728, 1488]], "sound": "10"}, {"duration": 100, "images": [[2852, 1488]], "exitBranch": 52}, {"duration": 140, "images": [[2976, 1488]]}, {"duration": 100, "images": [[3100, 1488]]}, {"duration": 100, "images": [[3224, 1488]]}, {"duration": 100, "images": [[0, 1581]]}, {"duration": 200, "images": [[124, 1581]]}, {"duration": 100, "images": [[248, 1581]]}, {"duration": 100, "images": [[372, 1581]]}, {"duration": 100, "images": [[496, 1581]]}, {"duration": 200, "images": [[620, 1581]], "exitBranch": 22, "branching": {"branches": [{"frameIndex": 21, "weight": 50}]}}, {"duration": 100, "images": [[744, 1581]]}, {"duration": 100, "images": [[868, 1581]]}, {"duration": 200, "images": [[992, 1581]], "exitBranch": 25, "branching": {"branches": [{"frameIndex": 24, "weight": 50}]}}, {"duration": 100, "images": [[1116, 1581]]}, {"duration": 100, "images": [[1240, 1581]]}, {"duration": 100, "images": [[1364, 1581]]}, {"duration": 200, "images": [[1488, 1581]], "exitBranch": 29, "branching": {"branches": [{"frameIndex": 28, "weight": 50}]}}, {"duration": 100, "images": [[1612, 1581]]}, {"duration": 100, "images": [[1736, 1581]]}, {"duration": 200, "images": [[1860, 1581]], "exitBranch": 32, "branching": {"branches": [{"frameIndex": 31, "weight": 50}]}}, {"duration": 100, "images": [[1984, 1581]]}, {"duration": 100, "images": [[2108, 1581]]}, {"duration": 100, "images": [[2232, 1581]]}, {"duration": 100, "images": [[2356, 1581]]}, {"duration": 200, "images": [[2480, 1581]], "exitBranch": 37, "branching": {"branches": [{"frameIndex": 36, "weight": 50}]}}, {"duration": 100, "images": [[2604, 1581]]}, {"duration": 100, "images": [[2728, 1581]]}, {"duration": 200, "images": [[2852, 1581]], "exitBranch": 40, "branching": {"branches": [{"frameIndex": 39, "weight": 50}]}}, {"duration": 100, "images": [[2976, 1581]]}, {"duration": 100, "images": [[3100, 1581]], "exitBranch": 50}, {"duration": 100, "images": [[3224, 1581]], "branching": {"branches": [{"frameIndex": 14, "weight": 75}]}}, {"duration": 100, "images": [[0, 1674]]}, {"duration": 200, "images": [[124, 1674]], "exitBranch": 51, "branching": {"branches": [{"frameIndex": 44, "weight": 50}]}}, {"duration": 100, "images": [[248, 1674]]}, {"duration": 100, "images": [[372, 1674]]}, {"duration": 100, "images": [[496, 1674]]}, {"duration": 100, "images": [[620, 1674]], "exitBranch": 49, "branching": {"branches": [{"frameIndex": 48, "weight": 85}]}}, {"duration": 100, "images": [[744, 1674]], "sound": "10"}, {"duration": 100, "images": [[868, 1674]], "exitBranch": 52, "branching": {"branches": [{"frameIndex": 10, "weight": 100}]}}, {"duration": 100, "images": [[992, 1674]]}, {"duration": 100, "images": [[1116, 1674]], "sound": "14"}, {"duration": 100, "images": [[1240, 1674]]}, {"duration": 100, "images": [[0, 0]]}]}, "Hearing_1": {"frames": [{"duration": 100, "images": [[0, 0]], "sound": "15"}, {"duration": 100, "images": [[2356, 1116]]}, {"duration": 100, "images": [[2480, 1116]]}, {"duration": 100, "images": [[2604, 1116]]}, {"duration": 100, "images": [[2728, 1116]]}, {"duration": 100, "images": [[2852, 1116]]}, {"duration": 100, "images": [[2976, 1116]], "sound": "6"}, {"duration": 100, "images": [[3100, 1116]]}, {"duration": 100, "images": [[3224, 1116]]}, {"duration": 100, "images": [[0, 1209]]}, {"duration": 500, "images": [[124, 1209]], "exitBranch": 32}, {"duration": 100, "images": [[1364, 1674]], "branching": {"branches": [{"frameIndex": 6, "weight": 60}]}}, {"duration": 100, "images": [[2976, 1116]]}, {"duration": 100, "images": [[3100, 1116]], "exitBranch": 32}, {"duration": 100, "images": [[3224, 1116]]}, {"duration": 100, "images": [[0, 1209]], "exitBranch": 32}, {"duration": 500, "images": [[1364, 1674]], "branching": {"branches": [{"frameIndex": 12, "weight": 50}]}}, {"duration": 100, "images": [[1488, 1674]], "exitBranch": 32}, {"duration": 100, "images": [[1612, 1674]]}, {"duration": 100, "images": [[1736, 1674]], "exitBranch": 32}, {"duration": 100, "images": [[1860, 1674]]}, {"duration": 400, "images": [[1984, 1674]], "exitBranch": 32}, {"duration": 100, "images": [[2108, 1674]], "branching": {"branches": [{"frameIndex": 18, "weight": 50}]}}, {"duration": 100, "images": [[2232, 1674]], "exitBranch": 32}, {"duration": 100, "images": [[2356, 1674]]}, {"duration": 100, "images": [[2480, 1674]], "exitBranch": 32}, {"duration": 500, "images": [[2604, 1674]], "exitBranch": 32}, {"duration": 100, "images": [[2728, 1674]], "branching": {"branches": [{"frameIndex": 17, "weight": 50}]}}, {"duration": 100, "images": [[2852, 1674]], "exitBranch": 32}, {"duration": 100, "images": [[2976, 1674]]}, {"duration": 100, "images": [[248, 1209]], "exitBranch": 32, "branching": {"branches": [{"frameIndex": 12, "weight": 100}]}}, {"duration": 100, "images": [[372, 1209]]}, {"duration": 100, "images": [[496, 1209]]}, {"duration": 100, "images": [[620, 1209]]}, {"duration": 100, "images": [[744, 1209]]}, {"duration": 100, "images": [[868, 1209]]}, {"duration": 100, "images": [[992, 1209]]}, {"duration": 100, "images": [[1116, 1209]]}, {"duration": 100, "images": [[0, 0]]}]}, "GetWizardy": {"frames": [{"duration": 100, "images": [[0, 0]], "sound": "15"}, {"duration": 10, "images": [[124, 0]]}, {"duration": 10, "images": [[248, 0]]}, {"duration": 10, "images": [[372, 0]], "sound": "14"}, {"duration": 10, "images": [[496, 0]]}, {"duration": 10, "images": [[620, 0]]}, {"duration": 10, "images": [[744, 0]]}, {"duration": 10, "images": [[868, 0]]}, {"duration": 10, "images": [[992, 0]], "sound": "1"}, {"duration": 100, "images": [[1116, 0]]}, {"duration": 100, "images": [[1240, 0]]}, {"duration": 100, "images": [[1364, 0]]}, {"duration": 1200, "images": [[1488, 0]]}, {"duration": 100, "images": [[1612, 0]], "sound": "10"}, {"duration": 100, "images": [[1736, 0]]}, {"duration": 1200, "images": [[1488, 0]]}, {"duration": 100, "images": [[1860, 0]]}, {"duration": 100, "images": [[1984, 0]]}, {"duration": 100, "images": [[2108, 0]]}, {"duration": 100, "images": [[2232, 0]]}, {"duration": 100, "images": [[2356, 0]], "exitBranch": 21}, {"duration": 100, "images": [[0, 0]]}]}, "IdleFingerTap": {"frames": [{"duration": 100, "images": [[0, 0]]}, {"duration": 100, "images": [[2976, 2976]]}, {"duration": 100, "images": [[3100, 2976]]}, {"duration": 100, "images": [[3224, 2976]], "exitBranch": 8}, {"duration": 100, "images": [[0, 3069]], "exitBranch": 8}, {"duration": 100, "images": [[124, 3069]], "branching": {"branches": [{"frameIndex": 7, "weight": 3}]}}, {"duration": 150, "images": [[248, 3069]], "exitBranch": 7, "branching": {"branches": [{"frameIndex": 6, "weight": 98}, {"frameIndex": 5, "weight": 2}]}}, {"duration": 100, "images": [[372, 3069]], "exitBranch": 8}, {"duration": 100, "images": [[496, 3069]]}, {"duration": 100, "images": [[620, 3069]]}, {"duration": 100, "images": [[0, 0]]}]}, "GestureLeft": {"frames": [{"duration": 100, "images": [[0, 0]]}, {"duration": 100, "images": [[3100, 1674]]}, {"duration": 100, "images": [[3224, 1674]]}, {"duration": 100, "images": [[0, 1767]]}, {"duration": 100, "images": [[124, 1767]], "exitBranch": 12}, {"duration": 100, "images": [[248, 1767]]}, {"duration": 100, "images": [[372, 1767]], "branching": {"branches": [{"frameIndex": 4, "weight": 60}]}}, {"duration": 100, "images": [[496, 1767]]}, {"duration": 100, "images": [[620, 1767]]}, {"duration": 1200, "images": [[744, 1767]]}, {"duration": 100, "images": [[868, 1767]]}, {"duration": 450, "images": [[992, 1767]]}, {"duration": 100, "images": [[0, 1767]]}, {"duration": 100, "images": [[3224, 1674]]}, {"duration": 100, "images": [[3100, 1674]]}, {"duration": 100, "images": [[0, 0]]}]}, "Wave": {"frames": [{"duration": 100, "images": [[0, 0]], "sound": "15", "branching": {"branches": [{"frameIndex": 15, "weight": 33}]}}, {"duration": 100, "images": [[1116, 1767]]}, {"duration": 100, "images": [[1240, 1767]]}, {"duration": 100, "images": [[1364, 1767]], "exitBranch": 13}, {"duration": 100, "images": [[1488, 1767]], "exitBranch": 13}, {"duration": 100, "images": [[1612, 1767]], "exitBranch": 13}, {"duration": 100, "images": [[1736, 1767]], "branching": {"branches": [{"frameIndex": 9, "weight": 100}]}}, {"duration": 100, "images": [[1860, 1767]], "exitBranch": 11, "sound": "10"}, {"duration": 100, "images": [[1984, 1767]]}, {"duration": 100, "images": [[2108, 1767]], "exitBranch": 11, "sound": "10"}, {"duration": 100, "images": [[2232, 1767]]}, {"duration": 100, "images": [[2356, 1767]], "sound": "10"}, {"duration": 100, "images": [[2480, 1767]]}, {"duration": 100, "images": [[2604, 1767]]}, {"duration": 100, "images": [[2728, 1767]], "exitBranch": 26, "branching": {"branches": [{"frameIndex": 26, "weight": 100}]}}, {"duration": 100, "images": [[2852, 1767]]}, {"duration": 100, "images": [[2976, 1767]]}, {"duration": 100, "images": [[3100, 1767]], "sound": "12"}, {"duration": 100, "images": [[3224, 1767]]}, {"duration": 100, "images": [[0, 1860]]}, {"duration": 100, "images": [[124, 1860]], "exitBranch": 24, "sound": "10"}, {"duration": 1200, "images": [[248, 1860]]}, {"duration": 100, "images": [[372, 1860]], "exitBranch": 24, "sound": "10"}, {"duration": 1300, "images": [[248, 1860]]}, {"duration": 50, "images": [[496, 1860]]}, {"duration": 50, "images": [[2976, 1767]]}, {"duration": 100, "images": [[0, 0]]}]}, "GestureRight": {"frames": [{"duration": 100, "images": [[0, 0]]}, {"duration": 100, "images": [[620, 1860]]}, {"duration": 100, "images": [[744, 1860]]}, {"duration": 100, "images": [[868, 1860]]}, {"duration": 100, "images": [[992, 1860]]}, {"duration": 100, "images": [[1116, 1860]], "exitBranch": 11}, {"duration": 100, "images": [[1240, 1860]]}, {"duration": 100, "images": [[1364, 1860]], "branching": {"branches": [{"frameIndex": 5, "weight": 50}]}}, {"duration": 100, "images": [[1488, 1860]]}, {"duration": 1200, "images": [[1612, 1860]]}, {"duration": 100, "images": [[1736, 1860]]}, {"duration": 550, "images": [[1116, 1860]]}, {"duration": 100, "images": [[992, 1860]]}, {"duration": 100, "images": [[868, 1860]]}, {"duration": 100, "images": [[744, 1860]]}, {"duration": 100, "images": [[620, 1860]]}, {"duration": 100, "images": [[0, 0]]}]}, "Writing": {"frames": [{"duration": 100, "images": [[0, 0]], "sound": "15"}, {"duration": 100, "images": [[1860, 1860]]}, {"duration": 100, "images": [[1984, 1860]]}, {"duration": 100, "images": [[2108, 1860]]}, {"duration": 100, "images": [[2232, 1860]]}, {"duration": 100, "images": [[2356, 1860]]}, {"duration": 100, "images": [[2480, 1860]]}, {"duration": 100, "images": [[2604, 1860]]}, {"duration": 100, "images": [[2728, 1860]], "sound": "11"}, {"duration": 100, "images": [[2852, 1860]]}, {"duration": 100, "images": [[2976, 1860]]}, {"duration": 100, "images": [[3100, 1860]]}, {"duration": 100, "images": [[3224, 1860]], "branching": {"branches": [{"frameIndex": 26, "weight": 45}, {"frameIndex": 32, "weight": 25}, {"frameIndex": 42, "weight": 15}]}}, {"duration": 100, "images": [[0, 1953]], "exitBranch": 55}, {"duration": 100, "images": [[124, 1953]], "exitBranch": 55}, {"duration": 100, "images": [[248, 1953]]}, {"duration": 200, "images": [[372, 1953]]}, {"duration": 200, "images": [[496, 1953]], "exitBranch": 55}, {"duration": 200, "images": [[620, 1953]]}, {"duration": 200, "images": [[744, 1953]]}, {"duration": 200, "images": [[868, 1953]], "exitBranch": 55}, {"duration": 200, "images": [[992, 1953]]}, {"duration": 200, "images": [[1116, 1953]]}, {"duration": 200, "images": [[1240, 1953]], "exitBranch": 55}, {"duration": 200, "images": [[1364, 1953]]}, {"duration": 200, "images": [[1488, 1953]], "branching": {"branches": [{"frameIndex": 32, "weight": 20}, {"frameIndex": 42, "weight": 15}]}}, {"duration": 100, "images": [[1612, 1953]], "exitBranch": 56}, {"duration": 100, "images": [[1736, 1953]]}, {"duration": 400, "images": [[1860, 1953]], "branching": {"branches": [{"frameIndex": 28, "weight": 80}]}}, {"duration": 100, "images": [[1984, 1953]], "exitBranch": 30}, {"duration": 400, "images": [[2108, 1953]], "exitBranch": 55, "branching": {"branches": [{"frameIndex": 30, "weight": 75}]}}, {"duration": 100, "images": [[2232, 1953]], "exitBranch": 55, "branching": {"branches": [{"frameIndex": 13, "weight": 25}, {"frameIndex": 42, "weight": 20}]}}, {"duration": 100, "images": [[2356, 1953]]}, {"duration": 100, "images": [[2480, 1953]]}, {"duration": 200, "images": [[2604, 1953]]}, {"duration": 200, "images": [[2728, 1953]], "exitBranch": 54}, {"duration": 200, "images": [[2852, 1953]]}, {"duration": 200, "images": [[2976, 1953]], "exitBranch": 54}, {"duration": 100, "images": [[3100, 1953]]}, {"duration": 200, "images": [[3224, 1953]]}, {"duration": 200, "images": [[0, 2046]], "exitBranch": 55}, {"duration": 200, "images": [[124, 2046]], "branching": {"branches": [{"frameIndex": 13, "weight": 25}, {"frameIndex": 26, "weight": 25}, {"frameIndex": 32, "weight": 25}]}}, {"duration": 100, "images": [[248, 2046]]}, {"duration": 100, "images": [[372, 2046]], "exitBranch": 55}, {"duration": 100, "images": [[496, 2046]]}, {"duration": 100, "images": [[620, 2046]]}, {"duration": 100, "images": [[744, 2046]]}, {"duration": 100, "images": [[868, 2046]]}, {"duration": 100, "images": [[992, 2046]]}, {"duration": 100, "images": [[1116, 2046]]}, {"duration": 100, "images": [[1240, 2046]]}, {"duration": 100, "images": [[1364, 2046]]}, {"duration": 100, "images": [[1488, 2046]], "exitBranch": 57}, {"duration": 100, "images": [[1612, 2046]], "branching": {"branches": [{"frameIndex": 26, "weight": 33}, {"frameIndex": 32, "weight": 33}, {"frameIndex": 13, "weight": 34}]}}, {"duration": 100, "images": [[1736, 2046]]}, {"duration": 100, "images": [[1860, 2046]]}, {"duration": 100, "images": [[1984, 2046]], "sound": "11"}, {"duration": 100, "images": [[2108, 2046]]}, {"duration": 100, "images": [[2232, 2046]]}, {"duration": 100, "images": [[2356, 2046]]}, {"duration": 100, "images": [[0, 0]], "sound": "15"}]}, "IdleSnooze": {"frames": [{"duration": 100, "images": [[0, 0]]}, {"duration": 100, "images": [[2480, 2046]]}, {"duration": 100, "images": [[2604, 2046]]}, {"duration": 100, "images": [[2728, 2046]]}, {"duration": 100, "images": [[2852, 2046]]}, {"duration": 100, "images": [[2976, 2046]]}, {"duration": 100, "images": [[3100, 2046]]}, {"duration": 100, "images": [[3224, 2046]]}, {"duration": 400, "images": [[0, 2139]]}, {"duration": 100, "images": [[124, 2139]]}, {"duration": 100, "images": [[248, 2139]]}, {"duration": 100, "images": [[372, 2139]]}, {"duration": 100, "images": [[496, 2139]]}, {"duration": 100, "images": [[620, 2139]]}, {"duration": 100, "images": [[744, 2139]]}, {"duration": 100, "images": [[868, 2139]]}, {"duration": 100, "images": [[992, 2139]]}, {"duration": 100, "images": [[1116, 2139]], "exitBranch": 20}, {"duration": 100, "images": [[1240, 2139]]}, {"duration": 100, "images": [[1364, 2139]]}, {"duration": 100, "images": [[1488, 2139]], "exitBranch": 23}, {"duration": 100, "images": [[1612, 2139]]}, {"duration": 100, "images": [[1736, 2139]]}, {"duration": 100, "images": [[1860, 2139]], "exitBranch": 26}, {"duration": 100, "images": [[1984, 2139]]}, {"duration": 100, "images": [[2108, 2139]]}, {"duration": 100, "images": [[2232, 2139]], "exitBranch": 83}, {"duration": 200, "images": [[2356, 2139]]}, {"duration": 200, "images": [[2480, 2139]], "exitBranch": 83}, {"duration": 200, "images": [[2604, 2139]], "exitBranch": 83}, {"duration": 200, "images": [[2728, 2139]], "exitBranch": 83}, {"duration": 200, "images": [[2852, 2139]]}, {"duration": 200, "images": [[2976, 2139]], "exitBranch": 83}, {"duration": 200, "images": [[3100, 2139]]}, {"duration": 200, "images": [[3224, 2139]], "exitBranch": 83}, {"duration": 200, "images": [[0, 2232]]}, {"duration": 200, "images": [[124, 2232]]}, {"duration": 200, "images": [[248, 2232]], "exitBranch": 83, "branching": {"branches": [{"frameIndex": 27, "weight": 90}, {"frameIndex": 46, "weight": 5}, {"frameIndex": 52, "weight": 5}]}}, {"duration": 100, "images": [[372, 2232]]}, {"duration": 100, "images": [[496, 2232]], "exitBranch": 83}, {"duration": 100, "images": [[620, 2232]]}, {"duration": 1200, "images": [[744, 2232]]}, {"duration": 100, "images": [[868, 2232]]}, {"duration": 100, "images": [[992, 2232]], "exitBranch": 83}, {"duration": 100, "images": [[1116, 2232]]}, {"duration": 100, "images": [[1240, 2232]], "exitBranch": 83}, {"duration": 100, "images": [[1364, 2232]], "exitBranch": 83}, {"duration": 100, "images": [[1488, 2232]], "exitBranch": 83}, {"duration": 400, "images": [[1612, 2232]]}, {"duration": 100, "images": [[1736, 2232]], "exitBranch": 83}, {"duration": 100, "images": [[1860, 2232]]}, {"duration": 100, "images": [[1984, 2232]], "exitBranch": 83}, {"duration": 100, "images": [[2108, 2232]]}, {"duration": 100, "images": [[2232, 2232]], "exitBranch": 83}, {"duration": 100, "images": [[2356, 2232]], "exitBranch": 83}, {"duration": 100, "images": [[2480, 2232]], "exitBranch": 83}, {"duration": 600, "images": [[2604, 2232]]}, {"duration": 300, "images": [[2728, 2232]], "exitBranch": 83}, {"duration": 300, "images": [[2852, 2232]], "exitBranch": 83}, {"duration": 300, "images": [[2976, 2232]], "exitBranch": 60}, {"duration": 100, "images": [[3100, 2232]]}, {"duration": 100, "images": [[3224, 2232]], "exitBranch": 83}, {"duration": 100, "images": [[0, 2325]]}, {"duration": 100, "images": [[124, 2325]], "exitBranch": 83}, {"duration": 100, "images": [[248, 2325]], "exitBranch": 83}, {"duration": 100, "images": [[372, 2325]], "exitBranch": 83}, {"duration": 100, "images": [[496, 2325]]}, {"duration": 100, "images": [[620, 2325]], "exitBranch": 83}, {"duration": 200, "images": [[744, 2325]]}, {"duration": 200, "images": [[868, 2325]], "exitBranch": 83}, {"duration": 200, "images": [[992, 2325]], "exitBranch": 83}, {"duration": 200, "images": [[1116, 2325]], "exitBranch": 83}, {"duration": 200, "images": [[1240, 2325]]}, {"duration": 200, "images": [[1364, 2325]], "exitBranch": 83}, {"duration": 200, "images": [[1488, 2325]], "exitBranch": 75, "branching": {"branches": [{"frameIndex": 69, "weight": 20}]}}, {"duration": 100, "images": [[1612, 2325]], "exitBranch": 83}, {"duration": 100, "images": [[1736, 2325]], "exitBranch": 83}, {"duration": 100, "images": [[1860, 2325]], "exitBranch": 83}, {"duration": 100, "images": [[1984, 2325]]}, {"duration": 100, "images": [[2108, 2325]], "exitBranch": 83}, {"duration": 100, "images": [[2232, 2325]]}, {"duration": 100, "images": [[2356, 2325]]}, {"duration": 300, "images": [[2480, 2325]]}, {"duration": 100, "images": [[2604, 2325]]}, {"duration": 100, "images": [[2728, 2325]]}, {"duration": 100, "images": [[2852, 2325]]}, {"duration": 100, "images": [[2976, 2325]]}, {"duration": 100, "images": [[0, 0]]}]}, "LookDownRight": {"frames": [{"duration": 100, "images": [[0, 0]], "exitBranch": 6}, {"duration": 100, "images": [[3100, 2325]], "exitBranch": 5}, {"duration": 100, "images": [[3224, 2325]], "exitBranch": 4}, {"duration": 1200, "images": [[0, 2418]]}, {"duration": 100, "images": [[124, 2418]]}, {"duration": 100, "images": [[248, 2418]]}, {"duration": 100, "images": [[0, 0]]}]}, "GetArtsy": {"frames": [{"duration": 100, "images": [[0, 0]]}, {"duration": 100, "images": [[372, 2418]]}, {"duration": 100, "images": [[496, 2418]]}, {"duration": 100, "images": [[620, 2418]]}, {"duration": 100, "images": [[744, 2418]]}, {"duration": 100, "images": [[868, 2418]]}, {"duration": 100, "images": [[992, 2418]]}, {"duration": 100, "images": [[1116, 2418]]}, {"duration": 100, "images": [[1240, 2418]]}, {"duration": 100, "images": [[1364, 2418]]}, {"duration": 100, "images": [[1488, 2418]]}, {"duration": 400, "images": [[1612, 2418]]}, {"duration": 100, "images": [[1736, 2418]]}, {"duration": 100, "images": [[1860, 2418]], "sound": "10"}, {"duration": 100, "images": [[1612, 2418]]}, {"duration": 100, "images": [[1736, 2418]]}, {"duration": 100, "images": [[1860, 2418]], "sound": "10"}, {"duration": 2400, "images": [[1612, 2418]]}, {"duration": 100, "images": [[744, 2418]]}, {"duration": 100, "images": [[620, 2418]]}, {"duration": 100, "images": [[496, 2418]]}, {"duration": 100, "images": [[372, 2418]], "exitBranch": 22}, {"duration": 100, "images": [[0, 0]]}]}, "Show": {"frames": [{"duration": 10}, {"duration": 10, "images": [[2728, 0]]}, {"duration": 10, "images": [[2604, 0]]}, {"duration": 10, "images": [[2480, 0]]}, {"duration": 10, "images": [[0, 0]]}]}, "LookDown": {"frames": [{"duration": 100, "images": [[0, 0]], "exitBranch": 6}, {"duration": 100, "images": [[2852, 0]], "exitBranch": 5}, {"duration": 100, "images": [[2976, 0]], "exitBranch": 4}, {"duration": 1200, "images": [[3100, 0]]}, {"duration": 100, "images": [[3224, 0]]}, {"duration": 100, "images": [[0, 93]]}, {"duration": 100, "images": [[0, 0]]}]}, "Searching": {"frames": [{"duration": 100, "images": [[0, 0]], "sound": "15"}, {"duration": 100, "images": [[992, 2511]]}, {"duration": 100, "images": [[1116, 2511]]}, {"duration": 100, "images": [[1240, 2511]]}, {"duration": 100, "images": [[1364, 2511]]}, {"duration": 100, "images": [[1488, 2511]], "sound": "11"}, {"duration": 100, "images": [[1612, 2511]]}, {"duration": 100, "images": [[1736, 2511]]}, {"duration": 100, "images": [[1860, 2511]]}, {"duration": 100, "images": [[1984, 2511]]}, {"duration": 100, "images": [[2108, 2511]]}, {"duration": 100, "images": [[2232, 2511]]}, {"duration": 100, "images": [[2356, 2511]]}, {"duration": 100, "images": [[2480, 2511]]}, {"duration": 100, "images": [[2604, 2511]]}, {"duration": 100, "images": [[2728, 2511]]}, {"duration": 100, "images": [[2852, 2511]]}, {"duration": 100, "images": [[2976, 2511]]}, {"duration": 100, "images": [[3100, 2511]]}, {"duration": 800, "images": [[3224, 2511]], "exitBranch": 55, "branching": {"branches": [{"frameIndex": 19, "weight": 40}]}}, {"duration": 100, "images": [[0, 2604]], "exitBranch": 55}, {"duration": 100, "images": [[3224, 2511]]}, {"duration": 100, "images": [[124, 2604]]}, {"duration": 100, "images": [[248, 2604]]}, {"duration": 100, "images": [[372, 2604]]}, {"duration": 100, "images": [[496, 2604]]}, {"duration": 100, "images": [[620, 2604]]}, {"duration": 1000, "images": [[744, 2604]], "exitBranch": 54, "branching": {"branches": [{"frameIndex": 27, "weight": 65}]}}, {"duration": 100, "images": [[868, 2604]]}, {"duration": 100, "images": [[992, 2604]]}, {"duration": 100, "images": [[1116, 2604]]}, {"duration": 100, "images": [[1240, 2604]]}, {"duration": 500, "images": [[1364, 2604]], "exitBranch": 33, "branching": {"branches": [{"frameIndex": 32, "weight": 75}]}}, {"duration": 100, "images": [[1488, 2604]], "exitBranch": 34, "branching": {"branches": [{"frameIndex": 32, "weight": 50}]}}, {"duration": 100, "images": [[1364, 2604]]}, {"duration": 100, "images": [[1612, 2604]]}, {"duration": 100, "images": [[1736, 2604]]}, {"duration": 100, "images": [[1860, 2604]]}, {"duration": 100, "images": [[1984, 2604]], "exitBranch": 55}, {"duration": 100, "images": [[2108, 2604]]}, {"duration": 100, "images": [[2232, 2604]], "exitBranch": 55, "branching": {"branches": [{"frameIndex": 19, "weight": 20}, {"frameIndex": 40, "weight": 80}]}}, {"duration": 100, "images": [[2356, 2604]]}, {"duration": 100, "images": [[2480, 2604]]}, {"duration": 100, "images": [[2604, 2604]]}, {"duration": 100, "images": [[2728, 2604]]}, {"duration": 100, "images": [[2852, 2604]]}, {"duration": 100, "images": [[2976, 2604]]}, {"duration": 100, "images": [[3100, 2604]]}, {"duration": 100, "images": [[3224, 2604]], "exitBranch": 55, "branching": {"branches": [{"frameIndex": 48, "weight": 75}]}}, {"duration": 100, "images": [[0, 2697]]}, {"duration": 100, "images": [[124, 2697]]}, {"duration": 100, "images": [[0, 2697]]}, {"duration": 100, "images": [[3224, 2604]]}, {"duration": 100, "images": [[248, 2697]], "exitBranch": 55, "branching": {"branches": [{"frameIndex": 49, "weight": 50}]}}, {"duration": 100, "images": [[372, 2697]], "branching": {"branches": [{"frameIndex": 28, "weight": 100}]}}, {"duration": 100, "images": [[496, 2697]]}, {"duration": 100, "images": [[620, 2697]]}, {"duration": 100, "images": [[744, 2697]]}, {"duration": 100, "images": [[868, 2697]]}, {"duration": 100, "images": [[992, 2697]]}, {"duration": 100, "images": [[0, 0]]}]}, "EmptyTrash": {"frames": [{"duration": 100, "images": [[0, 0]], "sound": "15"}, {"duration": 100, "images": [[1116, 2697]]}, {"duration": 100, "images": [[1240, 2697]], "sound": "14"}, {"duration": 100, "images": [[1364, 2697]]}, {"duration": 100, "images": [[1488, 2697]]}, {"duration": 100, "images": [[1612, 2697]]}, {"duration": 100, "images": [[1736, 2697]], "exitBranch": 16}, {"duration": 100, "images": [[1860, 2697]], "sound": "3"}, {"duration": 100, "images": [[1984, 2697]]}, {"duration": 100, "images": [[2108, 2697]]}, {"duration": 100, "images": [[2232, 2697]]}, {"duration": 100, "images": [[2356, 2697]]}, {"duration": 100, "images": [[2480, 2697]], "exitBranch": 16}, {"duration": 100, "images": [[2604, 2697]], "sound": "3"}, {"duration": 100, "images": [[2728, 2697]]}, {"duration": 100, "images": [[2852, 2697]]}, {"duration": 100, "images": [[2976, 2697]], "exitBranch": 23}, {"duration": 100, "images": [[3100, 2697]]}, {"duration": 100, "images": [[3224, 2697]]}, {"duration": 100, "images": [[0, 2790]], "sound": "3"}, {"duration": 100, "images": [[124, 2790]]}, {"duration": 100, "images": [[248, 2790]]}, {"duration": 100, "images": [[372, 2790]]}, {"duration": 100, "images": [[496, 2790]], "exitBranch": 29}, {"duration": 100, "images": [[620, 2790]], "sound": "3"}, {"duration": 100, "images": [[744, 2790]]}, {"duration": 100, "images": [[868, 2790]]}, {"duration": 100, "images": [[992, 2790]]}, {"duration": 100, "images": [[1116, 2790]]}, {"duration": 100, "images": [[1240, 2790]], "exitBranch": 31, "sound": "3"}, {"duration": 100, "images": [[1364, 2790]]}, {"duration": 100, "images": [[1488, 2790]]}, {"duration": 900}, {"duration": 100, "images": [[992, 1395]]}, {"duration": 100, "images": [[1116, 1395]]}, {"duration": 100, "images": [[1240, 1395]]}, {"duration": 100, "images": [[1364, 1395]]}, {"duration": 100, "images": [[1488, 1395]]}, {"duration": 100, "images": [[1612, 1395]]}, {"duration": 100, "images": [[1736, 1395]]}, {"duration": 100, "images": [[1860, 1395]]}, {"duration": 100, "images": [[0, 0]]}]}, "Greeting": {"frames": [{"duration": 100, "branching": {"branches": [{"frameIndex": 30, "weight": 40}]}, "sound": "15"}, {"duration": 100, "images": [[1612, 2790]]}, {"duration": 100, "images": [[1736, 2790]], "sound": "11"}, {"duration": 100, "images": [[1860, 2790]]}, {"duration": 100, "images": [[1984, 2790]]}, {"duration": 100, "images": [[2108, 2790]]}, {"duration": 100, "images": [[2232, 2790]]}, {"duration": 100, "images": [[2356, 2790]]}, {"duration": 100, "images": [[2480, 2790]]}, {"duration": 100, "images": [[2604, 2790]]}, {"duration": 100, "images": [[2728, 2790]]}, {"duration": 100, "images": [[2852, 2790]]}, {"duration": 100, "images": [[2976, 2790]]}, {"duration": 100, "images": [[3100, 2790]], "sound": "14"}, {"duration": 100, "images": [[3224, 2790]]}, {"duration": 100, "images": [[0, 2883]]}, {"duration": 100, "images": [[124, 2883]]}, {"duration": 100, "images": [[248, 2883]]}, {"duration": 300, "images": [[372, 2883]]}, {"duration": 100, "images": [[496, 2883]], "sound": "10"}, {"duration": 450, "images": [[372, 2883]]}, {"duration": 100, "images": [[620, 2883]]}, {"duration": 100, "images": [[744, 2883]]}, {"duration": 100, "images": [[868, 2883]], "sound": "12"}, {"duration": 100, "images": [[992, 2883]]}, {"duration": 100, "images": [[1116, 2883]]}, {"duration": 100, "images": [[1240, 2883]], "sound": "4"}, {"duration": 100, "images": [[1364, 2883]]}, {"duration": 100, "images": [[1488, 2883]]}, {"duration": 100, "images": [[1612, 2883]], "branching": {"branches": [{"frameIndex": 38, "weight": 100}]}}, {"duration": 100, "images": [[992, 1395]], "sound": "11"}, {"duration": 100, "images": [[1116, 1395]]}, {"duration": 100, "images": [[1240, 1395]]}, {"duration": 100, "images": [[1364, 1395]]}, {"duration": 100, "images": [[1488, 1395]]}, {"duration": 100, "images": [[1612, 1395]]}, {"duration": 100, "images": [[1736, 1395]]}, {"duration": 100, "images": [[1860, 1395]], "exitBranch": 38}, {"duration": 100, "images": [[0, 0]]}]}, "LookUp": {"frames": [{"duration": 100, "images": [[0, 0]], "exitBranch": 6}, {"duration": 100, "images": [[1736, 2883]], "exitBranch": 5}, {"duration": 100, "images": [[1860, 2883]], "exitBranch": 4}, {"duration": 1200, "images": [[1984, 2883]]}, {"duration": 100, "images": [[2108, 2883]]}, {"duration": 100, "images": [[2232, 2883]]}, {"duration": 100, "images": [[0, 0]]}]}, "GestureDown": {"frames": [{"duration": 100, "images": [[0, 0]]}, {"duration": 100, "images": [[1984, 1395]]}, {"duration": 100, "images": [[2108, 1395]]}, {"duration": 100, "images": [[2232, 1395]]}, {"duration": 100, "images": [[2356, 1395]]}, {"duration": 100, "images": [[2480, 1395]], "exitBranch": 14}, {"duration": 100, "images": [[2604, 1395]]}, {"duration": 100, "images": [[2728, 1395]], "branching": {"branches": [{"frameIndex": 5, "weight": 50}]}}, {"duration": 100, "images": [[2852, 1395]]}, {"duration": 100, "images": [[2976, 1395]]}, {"duration": 100, "images": [[3100, 1395]], "exitBranch": 14}, {"duration": 100, "images": [[3224, 1395]]}, {"duration": 100, "images": [[0, 1488]]}, {"duration": 450, "images": [[124, 1488]]}, {"duration": 100, "images": [[2356, 1395]]}, {"duration": 100, "images": [[2232, 1395]]}, {"duration": 100, "images": [[2108, 1395]]}, {"duration": 100, "images": [[1984, 1395]]}, {"duration": 100, "images": [[0, 0]]}]}, "RestPose": {"frames": [{"duration": 100, "images": [[0, 0]]}]}, "IdleEyeBrowRaise": {"frames": [{"duration": 100, "images": [[0, 0]], "exitBranch": 6}, {"duration": 100, "images": [[1116, 186]]}, {"duration": 100, "images": [[1240, 186]]}, {"duration": 900, "images": [[1364, 186]]}, {"duration": 100, "images": [[1240, 186]]}, {"duration": 100, "images": [[1116, 186]]}, {"duration": 100, "images": [[0, 0]]}]}, "LookDownLeft": {"frames": [{"duration": 100, "images": [[0, 0]], "exitBranch": 6}, {"duration": 100, "images": [[744, 3069]], "exitBranch": 5}, {"duration": 100, "images": [[868, 3069]], "exitBranch": 4}, {"duration": 1200, "images": [[992, 3069]]}, {"duration": 100, "images": [[1116, 3069]]}, {"duration": 100, "images": [[1240, 3069]]}, {"duration": 100, "images": [[0, 0]]}]}}}); -------------------------------------------------------------------------------- /assets/js/jquery.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ 2 | !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0