├── .gitignore ├── .idea ├── .name ├── jsLibraryMappings.xml ├── misc.xml ├── modules.xml └── vcs.xml ├── .jshintignore ├── .jshintrc ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── app.js ├── config ├── bluemix.js └── express.js ├── dialog └── ipa-v1.xml ├── manifest.yml ├── nlc ├── ipa-web-nlc_training.csv └── ipa-web-nlc_training.xlsx ├── npm-debug.log ├── package.json ├── public ├── css │ ├── banner.css │ ├── bootstrap-dark.css │ └── style.css ├── images │ ├── app.png │ ├── favicon.ico │ ├── fork-icon.svg │ ├── link.svg │ ├── loading-indicator.svg │ ├── watson.gif │ ├── watson.png │ ├── watson.svg │ └── you.svg └── javascript │ ├── calculationPipeline.js │ ├── ipaRemote.js │ ├── jokesPipeline.js │ ├── jquery-1.11.1.min.js │ └── math.min.js ├── views ├── index.jade └── layout.jade └── wiki └── media ├── demo_architecture.png ├── demo_screenshot.png ├── deploy_to_bluemix.png ├── dialog_flow.png ├── error-invalid_credentials.png ├── nlc_flow.png └── originals └── demo architecture.pxm /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .idea 3 | 4 | .idea/workspace.xml 5 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | IPA-Web -------------------------------------------------------------------------------- /.idea/jsLibraryMappings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.jshintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | packages 3 | .git -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "globals": { 3 | "jasmine": false, 4 | "spyOn": false, 5 | "it": false, 6 | "console": false, 7 | "describe": true, 8 | "expect": false, 9 | "beforeEach": false, 10 | "before": false, 11 | "after": false, 12 | "waits": false, 13 | "waitsFor": false, 14 | "runs": false, 15 | "$" : true, 16 | "confirm": true, 17 | "alert": true 18 | }, 19 | 20 | "node" : true, 21 | "es5" : true, 22 | "browser" : true, 23 | "boss" : false, 24 | "curly": false, 25 | "debug": false, 26 | "devel": false, 27 | "eqeqeq": true, 28 | "evil": true, 29 | "forin": false, 30 | "immed": true, 31 | "maxlen": 100, 32 | "indent": 2, 33 | "laxbreak": false, 34 | "newcap": true, 35 | "noarg": true, 36 | "noempty": false, 37 | "nonew": false, 38 | "nomen": false, 39 | "onevar": true, 40 | "plusplus": false, 41 | "regexp": false, 42 | "undef": true, 43 | "sub": true, 44 | "white": true, 45 | "unused": true 46 | } 47 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Questions 2 | 3 | If you are having difficulties running the app or have a question about the service, please ask a question on [dW Answers](https://developer.ibm.com/answers/questions/ask/?topics=watson) or [Stack Overflow](http://stackoverflow.com/questions/ask?tags=ibm-watson). 4 | 5 | # Issues 6 | 7 | If you encounter an issue with this sample app, you are welcome to submit a [bug report](https://github.com/watson-developer-cloud/dialog-tool/issues). Before that, please search for similar issues. It's possible somebody has encountered this issue already. 8 | 9 | # Pull Requests 10 | 11 | If you want to contribute to the reporistoy, here's a quick guide: 12 | 13 | 1. Fork the repo. 14 | 1. develop your code changes: `npm install -d` 15 | 1. Commit your changes 16 | 1. Push to your fork and submit a pull request 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Watson Intelligent Personal Assistant (Web Demo) 2 | 3 | [![](wiki/media/demo_screenshot.png)](http://ipa-demo-anthony.mybluemix.net/) 4 | 5 | 6 | Check out the [working demo](http://ipa-demo-anthony.mybluemix.net/). 7 | 8 | An [intelligent personal assistant](https://en.wikipedia.org/wiki/Intelligent_personal_assistant) is a software agent that can perform tasks or services for an individual. In this demo, we'll combine two Watson services to illustrate the basics of intelligent task performance: 9 | A. Capture user input. 10 | B. Classify this input into one of several supported tasks 11 | C. Ask users for any additional information required to complete the task 12 | D. Execute the task for the user (an exercise left for you to complete) 13 | 14 | ![](wiki/media/demo_architecture.png) 15 | 16 | To act on our user's intent, we first classify it into one our predefined classifications. To accomplish this, we'll train the [Watson Natural Language Classifier service](https://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/doc/nl-classifier/) using various text examples of users making the requests. The NLC uses deep machine learning techniques to return the top predicted classes. 17 | 18 | Next, we need any related information required to complete the user's request. To do this, we'll rely on the [Watson Dialog service](http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/dialog.html) which supports building conversations between a user and an application. The Dialog service will track and store information obtained during the conversation until we have all the info required to complete the task. 19 | 20 | These are the user intents we'll attempt to classify: 21 | * Schedule a meeting 22 | * Send an email 23 | * Ask to perform a numeric calculations 24 | * Request a joke 25 | 26 | #### Getting Started 27 | Follow these sections to setup your services and host your app either in Bluemix or locally. 28 | - [ ] [Step 1: Setup Watson Natural Language Classifier and Dialog services on Bluemix](https://github.com/biosopher/watson-ipa-web-nodejs/wiki/Setup-Watson-Natural-Language-Classifier-and-Dialog-services-on-Bluemix) 29 | - [ ] [Step 2: Train the Natural Language Classifier service](https://github.com/biosopher/watson-ipa-web-nodejs/wiki/Train-the-Natural-Language-Classifier-service) 30 | - [ ] [Step 3: Configure your Dialog service with IBM's Dialog XML](https://github.com/biosopher/watson-ipa-web-nodejs/wiki/Configure-your-Dialog-service-with-IBM's-Dialog-XML) 31 | - [ ] [Step 4: Push app to Bluemix](https://github.com/biosopher/watson-ipa-web-nodejs/wiki/Push-App-to-Bluemix) 32 | - [ ] [Step 5 (optional): Running the app locally at http://localhost:300](https://github.com/biosopher/watson-ipa-web-nodejs/wiki/Running-Locally) 33 | - [ ] [Step 6: Additional exercises for you to improve the app's functionality](https://github.com/biosopher/watson-ipa-web-nodejs/wiki/Exercises-for-you-to-complete) 34 | 35 | #### How Does the Demo Work 36 | Curious to know how the user text is classified to a specific intent and then mapped to a dialog flow? Here's a brief overview of [how the Watson IPA Demo works?](https://github.com/biosopher/watson-ipa-web-nodejs/wiki/How-Does-the-Watson-IPA-Demo-Work). 37 | 38 | #### Supporting Sections 39 | * [Obtaining Service Credentials from the Command Line](https://github.com/biosopher/watson-ipa-web-nodejs/wiki/Obtaining-Service-Credentials-from-the-Command-Line) 40 | * [Troubleshooting](https://github.com/biosopher/watson-ipa-web-nodejs/wiki/Troubleshooting) 41 | 42 | #### More Details 43 | For more details about developing applications that use Watson Developer Cloud services in Bluemix, see [Getting started with Watson Developer Cloud and Bluemix](http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/doc/getting_started/). 44 | 45 | #### License 46 | This sample code is licensed under Apache 2.0. Full license text is available in [LICENSE](https://github.com/watson-developer-cloud/natural-language-classifier-nodejs/blob/master/LICENSE). 47 | This sample uses [jquery](https://jquery.com/) which is MIT license. 48 | 49 | #### Disclaimer 50 | The techniques and code shared are my own and don't necessarily represent IBM's position, strategies or opinions. Anyone is free to use, copy, distribute, modify or sell the source code and other materials shown in this video and it is provided "as is" without warranties. I am not responsible for any harm or damage caused to your computer, software or anything else caused by this material. 51 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | var express = require('express'), 2 | app = express(), 3 | request = require('request'), 4 | bluemix = require('./config/bluemix'), 5 | extend = require('util')._extend, 6 | bodyParser = require('body-parser'); 7 | //conversationStore = require('./javascript/ConversationStore'); 8 | 9 | app.use(bodyParser.json()); // support json encoded bodies 10 | 11 | // Bootstrap application settings 12 | require('./config/express')(app); 13 | 14 | // if bluemix credentials exists, then override local 15 | var dialogCredentials = extend({ 16 | url: "https://gateway.watsonplatform.net/dialog/api", 17 | username: "", 18 | password: "" 19 | }, bluemix.getServiceCreds('dialog')); // VCAP_SERVICES 20 | 21 | // if bluemix credentials exists, then override local 22 | var nlcCredentials = extend({ 23 | "url": "https://gateway.watsonplatform.net/natural-language-classifier/api", 24 | username: "", 25 | password: "" 26 | }, bluemix.getServiceCreds('natural_language_classifier')); // VCAP_SERVICES 27 | 28 | // HTTP proxy to the API 29 | app.use('/proxy', function(req, res) { 30 | 31 | var credentials = req.query.proxyType === "nlc" ? nlcCredentials : dialogCredentials; 32 | 33 | // Remove api as it will be passed from the web client 34 | if (credentials.url.indexOf('/api') > 0) { 35 | credentials.url = credentials.url.substring(0, credentials.url.indexOf('/api')); 36 | } 37 | 38 | req.pipe(request({ 39 | url: credentials.url + req.url, 40 | auth: { 41 | user: credentials.username, 42 | pass: credentials.password, 43 | sendImmediately: true, 44 | } 45 | }, function(error){ 46 | if (error) { 47 | res.status(500).json({code: 500, error: errorMessage}); 48 | } 49 | })).pipe(res); 50 | }); 51 | 52 | // Pass user text to NLC to identify intent 53 | app.post('/saveConversation', function(req, res) { 54 | 55 | //conversationStore.storeConversation(req.body); 56 | res.status(200); 57 | res.end(); 58 | }); 59 | 60 | // render index page 61 | app.get('/', function(req, res) { 62 | res.render('index'); 63 | }); 64 | 65 | // catch 404 and forward to error handler 66 | app.use(function(req, res, next) { 67 | var err = new Error('Not Found'); 68 | err.code = 404; 69 | err.message = 'Not Found'; 70 | next(err); 71 | }); 72 | 73 | // 500 error message 74 | var errorMessage = 'There was a problem with the request, please try again'; 75 | 76 | // non 404 error handler 77 | app.use(function(err, req, res) { 78 | var error = { 79 | code: err.code || 500, 80 | error: err.message || err.error || errorMessage 81 | }; 82 | 83 | console.log('error: ' + JSON.stringify(error) + " for url: " + req.url); 84 | res.status(error.code).json(error); 85 | }); 86 | 87 | var port = process.env.VCAP_APP_PORT || 3000; 88 | app.listen(port); 89 | console.log('listening at:', port); 90 | -------------------------------------------------------------------------------- /config/bluemix.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2014 IBM Corp. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | 'use strict'; 18 | 19 | /** 20 | * if VCAP_SERVICES exists then it returns 21 | * username, password and url 22 | * for the first service that stars with 'name' or {} otherwise 23 | * @param String name, service name 24 | * @return {Object} the service credentials or {} if 25 | * name is not found in VCAP_SERVICES 26 | */ 27 | module.exports.getServiceCreds = function(name) { 28 | if (process.env.VCAP_SERVICES) { 29 | var services = JSON.parse(process.env.VCAP_SERVICES); 30 | for (var service_name in services) { 31 | if (service_name.indexOf(name) === 0) { 32 | var service = services[service_name][0]; 33 | return { 34 | url: service.credentials.url, 35 | username: service.credentials.username, 36 | password: service.credentials.password 37 | }; 38 | } 39 | } 40 | } 41 | return {}; 42 | }; -------------------------------------------------------------------------------- /config/express.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2014 IBM Corp. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | 'use strict'; 18 | 19 | // Module dependencies 20 | var express = require('express'), 21 | errorhandler = require('errorhandler'); 22 | 23 | module.exports = function (app) { 24 | 25 | // Setup static public directory 26 | app.use(express.static(__dirname + '/../public')); 27 | app.set('view engine', 'jade'); 28 | app.set('views', __dirname + '/../views'); 29 | 30 | // Add error handling in dev 31 | if (!process.env.VCAP_SERVICES) { 32 | app.use(errorhandler()); 33 | } 34 | 35 | }; -------------------------------------------------------------------------------- /dialog/ipa-v1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | DIALOG_START_OVER 8 | 9 | 10 | 11 | What else can I help you with? Would you like to schedule a meeting, write an email, send an SMS, perform a calculation, or a quantity/size conversion? 12 | 13 | 14 | 15 | 16 | 17 | 18 | Hello, how can I help you? Would you like to schedule a meeting, write an email, send an SMS, perform a calculation, or a quantity/size conversion? 19 | 20 | 21 | 22 | 23 | 24 | DIALOG_COMPLETED 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | I'm unsure what you mean. 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | action-meeting-create * 43 | 44 | action-meeting-create 45 | 46 | 47 | Should I invite Anthony or Watson to your meeting? Yes. It's very sad, but you only have two friends. 48 | 49 | 50 | 51 | 52 | 53 | 54 | action-email-create * 55 | 56 | action-email-create 57 | 58 | 59 | To whom should I send your email? 60 | 61 | 62 | 63 | 64 | 65 | 66 | action-sms-create * 67 | 68 | action-sms-create 69 | 70 | 71 | Who should I send your text message to? 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | $ (contact_friends)={var-invite_attendee1} 82 | 83 | {var-invite_attendee1.value:main} 84 | 85 | 86 | I'll invite {var-invite_attendee1}. 87 | 88 | 89 | action-meeting-create 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | $ (contact_family)={var-invite_attendee1} 100 | 101 | {var-invite_attendee1.value:main} 102 | 103 | 104 | I'll invite your {var-invite_attendee1}. 105 | 106 | 107 | action-meeting-create 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | I can't find that person in your contacts. Only Anthony and Watson are present in your contact list. Unsure why, but you only have two friends. 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | What time is your meeting? 127 | 128 | 129 | 130 | 131 | $ (DATE_TIME_RANGE)={var-invite_time} 132 | 133 | {var-invite_time.value:FROM_TIME} 134 | 135 | 136 | 137 | 138 | I'll need a valid time to continue. 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | What is the date for your meeting? 149 | 150 | 151 | 152 | 153 | $ (DATE_TIME_RANGE)={var-invite_date} 154 | 155 | {var-invite_date.value:FROM_DATE} 156 | 157 | 158 | 159 | I've invited {var-invite_attendee1} to your meeting at {var-invite_time} on {var-invite_date}. 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | I'll need a valid date to continue. 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | IPA 181 | Intelligent Agent 182 | Intelligent Personal Agent 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | Intelligent Agent 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 17384 220 | 221 | 222 | IBM 223 | Watson 224 | USA 225 | NY State 226 | NY 227 | 1 228 | 1 229 | 2000 230 | Male 231 | John 232 | false 233 | 234 | false 235 | 0 236 | 2015-07-14 15:12:07.745 237 | 2015-07-14 15:12:07.745 238 | 0 239 | 100 240 | 4 241 | 6 242 | true 243 | true 244 | 245 | 246 | false 247 | true 248 | true 249 | 3 250 | false 251 | EN 252 | -2 253 | 4 254 | 0 255 | America/New_York 256 | 0 257 | 0 258 | 0 259 | 0 260 | 1 261 | 262 | 3 263 | 264 | None of the above 265 | true 266 | false 267 | 3 268 | 250 269 | 0 270 | -1 271 | 3 272 | 273 | 0 274 | -15 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | -------------------------------------------------------------------------------- /manifest.yml: -------------------------------------------------------------------------------- 1 | declared-services: 2 | ipa-dialog_service: 3 | label: dialog 4 | plan: standard 5 | ipa-nlc_service: 6 | label: natural_language_classifier 7 | plan: standard 8 | # ipa-cloudant_service: 9 | # label: cloudantNoSQLDB 10 | # plan: Shared 11 | applications: 12 | - services: 13 | - ipa-nlc_service 14 | - ipa-dialog_service 15 | # - ipa-cloudant_service 16 | name: ipa_demo-anthony 17 | command: node app.js 18 | path: . 19 | memory: 512M 20 | -------------------------------------------------------------------------------- /nlc/ipa-web-nlc_training.csv: -------------------------------------------------------------------------------- 1 | I'd like to send an email,action-email-create Send new email,action-email-create Draft new email,action-email-create Compose new email,action-email-create Send email,action-email-create Draft email,action-email-create Compose email,action-email-create Send e-mail,action-email-create Draft e-mail,action-email-create Compose e-mail,action-email-create New email,action-email-create New e-mail,action-email-create Email,action-email-create Email *,action-email-create Email compose,action-email-create Email new,action-email-create Compose letter,action-email-create Take a memo to recipient *,action-email-create Email draft,action-email-create Draft email to *,action-email-create Compose email to *,action-email-create New email messsage,action-email-create New email message to *,action-email-create New message for *,action-email-create Schedule a meeting,action-meeting-create Arrange a meeting at *,action-meeting-create Make a meeting with *,action-meeting-create I want to meet at * with *,action-meeting-create I need to meet with * at *,action-meeting-create New meeting now,action-meeting-create Make a meeting,action-meeting-create Add meeting to schedule,action-meeting-create Add meeting to calendar,action-meeting-create Help me add a meeting to calendar,action-meeting-create Help me add meeting to schedule,action-meeting-create Schedule meeting for next *,action-meeting-create Schedule call for next *,action-meeting-create Schedule call for tomorrow,action-meeting-create Schedule call for Monday,action-meeting-create Schedule call for Tuesday,action-meeting-create I'd like to create a new meeting,action-meeting-create I'd like to schedule a meeting,action-meeting-create Schedule new meeting,action-meeting-create Can I schedule a meeting?,action-meeting-create Schedule a new call,action-meeting-create I'd like to schedule a call,action-meeting-create Please schedule a call for *,action-meeting-create Schedule call,action-meeting-create Schedule meeting,action-meeting-create Meeting schedule,action-meeting-create Call schedule,action-meeting-create New meeting,action-meeting-create Set up meeting with *,action-meeting-create Schedule,action-meeting-create Meeting,action-meeting-create Schedule new meeting,action-meeting-create Create a new meeting for next *,action-meeting-create Update schedule with meeting,action-meeting-create Update schedule to add call,action-meeting-create Create new time slot,action-meeting-create Add to calendar,action-meeting-create Schedule call for Wednesday,action-meeting-create Schedule call for Thursday,action-meeting-create Schedule call for Friday,action-meeting-create Schedule call for Saturday,action-meeting-create Schedule call for Sunday,action-meeting-create Reschedule call ,action-meeting-create Reschedule meeting,action-meeting-create Update call time in calendar,action-meeting-create Update meeting time in calendar,action-meeting-create send text message,action-sms-create send text message to *,action-sms-create send sms,action-sms-create send sms to *,action-sms-create send a message to *,action-sms-create send an sms to *,action-sms-create send a text message to *,action-sms-create send text message,action-sms-create text a message to ,action-sms-create text a message,action-sms-create 2+2,respond-calculation-numeric 5*5/12,respond-calculation-numeric 122*254/5,respond-calculation-numeric 66/34,respond-calculation-numeric 2-5*5,respond-calculation-numeric (2*5)*5-(9/8),respond-calculation-numeric 123*984/2,respond-calculation-numeric (234-567)/453,respond-calculation-numeric 255*255,respond-calculation-numeric 122*122,respond-calculation-numeric 8^2,respond-calculation-numeric 12^100,respond-calculation-numeric 12*12,respond-calculation-numeric 133*133,respond-calculation-numeric 2^8,respond-calculation-numeric 5 feet to inches,respond-calculation-conversion 5 inches to feet,respond-calculation-conversion 10 quarts to gallons,respond-calculation-conversion 5 hours to days,respond-calculation-conversion 10 mins to seconds,respond-calculation-conversion 10 seconds to mins,respond-calculation-conversion 5 meters to miles,respond-calculation-conversion 500 miles to kilometers,respond-calculation-conversion 5000 feet to miles,respond-calculation-conversion 1 mile to kilometers,respond-calculation-conversion 10 kilometers to miles,respond-calculation-conversion 10 kgs to pounds,respond-calculation-conversion 10 grams to ounces,respond-calculation-conversion 20 ounces to pounds,respond-calculation-conversion 20 pounts to grams,respond-calculation-conversion 1 oz to grams,respond-calculation-conversion Do you know a good joke?,respond-off-topic-joke-or-riddle Tell me a funny joke,respond-off-topic-joke-or-riddle Tell me a joke,respond-off-topic-joke-or-riddle Tell me a story,respond-off-topic-joke-or-riddle Tell me something funny?,respond-off-topic-joke-or-riddle Make me laugh,respond-off-topic-joke-or-riddle Make a joke,respond-off-topic-joke-or-riddle Know any good jokes,respond-off-topic-joke-or-riddle Tell me another joke,respond-off-topic-joke-or-riddle 10 plus 10,respond-off-topic-math 100 minus 10,respond-off-topic-math 5 plus five,respond-off-topic-math a million plus a billion?,respond-off-topic-math infinity,respond-off-topic-math infinity / infinity,respond-off-topic-math infinity divided by zero,respond-off-topic-math infinity/infinity,respond-off-topic-math What is * divided by zero?,respond-off-topic-math What is 1/0?,respond-off-topic-math What is 1+1?,respond-off-topic-math What is 2+2,respond-off-topic-math what is nine plus fourteen?,respond-off-topic-math 'agk4'3k'p0f23k,respond-off-topic-nonsense-input @#$@%#fwweWf wef W#Rjlwf34;,respond-off-topic-nonsense-input 292-494f4,respond-off-topic-nonsense-input ajfskdw49urwe0w3ufiwel,respond-off-topic-nonsense-input asd f efwefjkw jkl,respond-off-topic-nonsense-input aslkdjal,respond-off-topic-nonsense-input jklfadsk23450923u u9q3uf203 9u,respond-off-topic-nonsense-input sadjka; jakls;djfakls; dfjasd ;flk,respond-off-topic-nonsense-input blah blah blah,respond-off-topic-nonsense-input Is god real?,respond-off-topic-philosophy What is the meaning of life?,respond-off-topic-philosophy why do we die?,respond-off-topic-philosophy why do we live?,respond-off-topic-philosophy what is * in light years?,respond-off-topic-science I'm tired,respond-off-topic-user-focus I'm drunk,respond-off-topic-user-focus I'm naked,respond-off-topic-user-focus Talk dirty to me,respond-off-topic-user-focus I love you,respond-off-topic-user-focus Ask me a question,respond-off-topic-user-focus i had a terrible day!,respond-off-topic-user-focus I'm sad,respond-off-topic-user-focus my computer broke!,respond-off-topic-user-focus Do you have eyes?,respond-off-topic-watson-focus where is your hardware?,respond-off-topic-watson-focus are you happy?,respond-off-topic-watson-focus Do you follow the three laws of robotics?,respond-off-topic-watson-focus Do you have feelings?,respond-off-topic-watson-focus How old are you,respond-off-topic-watson-focus What is your favorite color?,respond-off-topic-watson-focus What's your favourite animal?,respond-off-topic-watson-focus -------------------------------------------------------------------------------- /nlc/ipa-web-nlc_training.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/biosopher/watson-ipa-web-nodejs/255ac70c3e264a86e6f87d0a67d542e17a5c031c/nlc/ipa-web-nlc_training.xlsx -------------------------------------------------------------------------------- /npm-debug.log: -------------------------------------------------------------------------------- 1 | 0 info it worked if it ends with ok 2 | 1 verbose cli [ 'node', '/usr/local/bin/npm', 'start' ] 3 | 2 info using npm@1.4.23 4 | 3 info using node@v0.10.31 5 | 4 verbose run-script [ 'prestart', 'start', 'poststart' ] 6 | 5 info prestart WatsonIPA-Web@0.1.1 7 | 6 info start WatsonIPA-Web@0.1.1 8 | 7 verbose unsafe-perm in lifecycle true 9 | 8 info WatsonIPA-Web@0.1.1 Failed to exec start script 10 | 9 error WatsonIPA-Web@0.1.1 start: `node app.js` 11 | 9 error Exit status 8 12 | 10 error Failed at the WatsonIPA-Web@0.1.1 start script. 13 | 10 error This is most likely a problem with the WatsonIPA-Web package, 14 | 10 error not with npm itself. 15 | 10 error Tell the author that this fails on your system: 16 | 10 error node app.js 17 | 10 error You can get their info via: 18 | 10 error npm owner ls WatsonIPA-Web 19 | 10 error There is likely additional logging output above. 20 | 11 error System Darwin 14.4.0 21 | 12 error command "node" "/usr/local/bin/npm" "start" 22 | 13 error cwd /Users/biosopher/Documents/Engineering/Development/github/Personal/IPA-Web 23 | 14 error node -v v0.10.31 24 | 15 error npm -v 1.4.23 25 | 16 error code ELIFECYCLE 26 | 17 verbose exit [ 1, true ] 27 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "WatsonIPA-Web", 3 | "version": "0.1.1", 4 | "description": "Web-based intelligent personal assistant (IPA) using Watson Natural Language Classifier (NLC) and Dialog services.", 5 | "dependencies": { 6 | "body-parser": "~1.12.3", 7 | "cloudant": "~1.3.0", 8 | "errorhandler": "~1.3.2", 9 | "express": "~4.12.3", 10 | "jade": "~1.9.1", 11 | "request": "~2.55.0", 12 | "form-data": "~1.0.0-rc1", 13 | "q": "~1.1.2" 14 | }, 15 | "engines": { 16 | "node": ">=0.10.38" 17 | }, 18 | "repository": { 19 | "type": "git", 20 | "url": "https://github.com/biosopher/watson-ipa-web-nodejs.git" 21 | }, 22 | "author": "IBM Corp.", 23 | "contributors": [ 24 | { 25 | "name": "Anthony Stevens", 26 | "email": "apsteven@us.ibm.com" 27 | } 28 | ], 29 | "license": "Apache-2.0", 30 | "bugs": { 31 | "url": "https://github.com/watson-developer-cloud/dialog-tool/issues" 32 | }, 33 | "scripts": { 34 | "start": "node app.js" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /public/css/banner.css: -------------------------------------------------------------------------------- 1 | .img-container img { 2 | width: 130px; 3 | height: auto; 4 | } 5 | 6 | .service-container { 7 | margin: auto; 8 | } 9 | .service-header { 10 | padding: 0px; 11 | } 12 | 13 | .header { 14 | padding-bottom:0px; 15 | margin-bottom: 0px; 16 | position: relative; 17 | } 18 | .header h1 { 19 | font-size: 30px; 20 | font-weight: 600; 21 | } 22 | .header h2 { 23 | font-weight: 400; 24 | } 25 | .header h3 { 26 | color: #00b2ef; 27 | font-weight: 400; 28 | } 29 | 30 | .header a { 31 | font-size: 14px; 32 | font-weight: 300; 33 | text-decoration: underline; 34 | color: #404041; 35 | display: block; 36 | margin-bottom: 3px; 37 | } 38 | .header a:hover { 39 | color: #777677; 40 | } 41 | .header .feedback { 42 | position: absolute; 43 | bottom: 12px; 44 | right: 12px; 45 | margin: 0px; 46 | } 47 | .header .learn-more { 48 | color: #00b2ef; 49 | font-weight: 400; 50 | margin-bottom: 15px; 51 | } 52 | .header .learn-more:hover { 53 | color: #82D1F5; 54 | } 55 | 56 | //dialog heading 57 | .header { 58 | background-color: #f4f4f4!important; 59 | border-bottom: 2px solid #ececec!important; 60 | } 61 | 62 | .service-title { 63 | color: #325c80!important; 64 | font-weight: 500; 65 | margin-bottom: .5rem; 66 | font-size: 2rem; 67 | } 68 | 69 | .service-description { 70 | font-weight: 300; 71 | font-size: 2rem; 72 | } 73 | 74 | .service-icon { 75 | margin-top: 1.5rem!important; 76 | width: 100%; 77 | height: auto; 78 | display: block; 79 | margin-bottom: 10px; 80 | } 81 | 82 | .resource { 83 | font-size: 1.5rem; 84 | } 85 | 86 | .link-icon { 87 | width: 1.5rem; 88 | margin-right: 0.5rem; 89 | } 90 | 91 | .resource-item-container { 92 | margin-top: 1rem; 93 | margin-bottom: 2.5rem; 94 | padding-left: 2rem; 95 | } 96 | 97 | .resource-item { 98 | color: #A53725!important; 99 | display: inline-block!important; 100 | margin-right: 2rem; 101 | } 102 | 103 | a:hover{ 104 | color: #aeaeae!important; 105 | } 106 | 107 | .no-padding { 108 | padding-left: 0px!important; 109 | } 110 | 111 | 112 | -------------------------------------------------------------------------------- /public/css/style.css: -------------------------------------------------------------------------------- 1 | .img-container img { 2 | width: 100%; 3 | height: 100%; 4 | margin: 0px; 5 | } 6 | 7 | .errorMsg { 8 | font-weight: bold; 9 | color: #7bbe31; 10 | white-space: pre-wrap; 11 | margin-bottom: 1.25rem; 12 | } 13 | 14 | .header-text { 15 | color: #FF7832; 16 | font-weight: 500; 17 | margin-top: 2rem; 18 | padding-left: 15px; 19 | } 20 | 21 | .loading { 22 | margin-top: -2rem; 23 | z-index: 100; 24 | } 25 | 26 | .mar10r { 27 | margin-left: 10px; 28 | } 29 | 30 | .watson-loading-gif { 31 | width: 50px; 32 | margin-bottom: 2REM; 33 | } 34 | 35 | .dialog-name-span { 36 | font-weight: bold; 37 | } 38 | 39 | .conversation-div { 40 | margin-bottom: 20px; 41 | } 42 | 43 | #name { 44 | border-top: 0px; 45 | border-right: 0px; 46 | border-left: 0px; 47 | padding-left: 0px; 48 | } 49 | 50 | #file { 51 | border: 0px; 52 | } 53 | 54 | .new-dialog-container { 55 | border: 1px solid #e6e7e8; 56 | cursor: pointer; 57 | padding: 1.2rem; 58 | margin-top: 2rem; 59 | } 60 | 61 | .new-dialog-container-loading { 62 | margin-top: 10rem; 63 | margin-bottom: 11.1rem; 64 | } 65 | 66 | .new-dialog-container:hover { 67 | border: 1px solid #00B2EF; 68 | } 69 | 70 | .dialog-flow-title:hover { 71 | color: #00B2EF; 72 | } 73 | 74 | .selected { 75 | border: 1px solid #00B2EF; 76 | } 77 | 78 | .new-dialog-input-container { 79 | margin: 6.75rem 0; 80 | } 81 | 82 | .create-btn:hover { 83 | color: #00B2EF; 84 | background-color: #fff; 85 | border: 1px solid #00B2EF; 86 | } 87 | 88 | .dialog-flow-title { 89 | text-align: center; 90 | margin: 13rem 0; 91 | line-height: 0px; 92 | font-size: 41px; 93 | } 94 | 95 | .exist-dialog-flow-title { 96 | text-align: center; 97 | margin: 13rem 0 11.2rem; 98 | line-height: 0px; 99 | } 100 | 101 | .new-dialog-flow-content { 102 | display: none; 103 | } 104 | 105 | .dialog-links { 106 | float: right; 107 | } 108 | 109 | .bubble-watson 110 | { 111 | position: relative; 112 | padding: 0px; 113 | width: 51%; 114 | float: left; 115 | text-align: left; 116 | background: #b2e9f5; 117 | -webkit-border-radius: 10px; 118 | -moz-border-radius: 10px; 119 | border-radius: 10px; 120 | margin-bottom: 10px; 121 | padding-bottom:10px; 122 | padding-top:10px; 123 | padding-right:10px; 124 | padding-left:10px; 125 | } 126 | 127 | .bubble-watson:after 128 | { 129 | content: ''; 130 | position: absolute; 131 | border-style: solid; 132 | border-width: 5px 16px 7px 0; 133 | border-color: transparent #b2e9f5; 134 | display: block; 135 | width: 0; 136 | z-index: 1; 137 | left: -16px; 138 | top: 18px; 139 | } 140 | .bubble-human 141 | { 142 | position: relative; 143 | padding: 0px; 144 | width: 51%; 145 | background: #d1eb98; 146 | -webkit-border-radius: 10px; 147 | -moz-border-radius: 10px; 148 | border-radius: 10px; 149 | margin-bottom: 10px; 150 | float: right; 151 | text-align: right; 152 | padding-bottom:10px; 153 | padding-top:10px; 154 | padding-right:10px; 155 | padding-left:10px; 156 | } 157 | 158 | .bubble-human:after 159 | { 160 | content: ''; 161 | position: absolute; 162 | border-style: solid; 163 | border-width: 5px 0 5px 16px; 164 | border-color: transparent #d1eb98; 165 | display: block; 166 | width: 0; 167 | z-index: 1; 168 | right: -16px; 169 | top: 18px; 170 | } 171 | 172 | .conversation-well { 173 | min-height: 200px; 174 | } 175 | 176 | .no-padding-right { 177 | padding-right: 0!important; 178 | } 179 | 180 | .no-padding-left { 181 | padding-left: 0!important; 182 | } 183 | 184 | #response-input { 185 | border: 2px solid #e6e7e8; 186 | height: 34px; 187 | } 188 | 189 | #send-btn { 190 | border: 2px solid #e6e7e8; 191 | border-left: 0px; 192 | } 193 | 194 | .conversation-flow-container { 195 | border: 1px solid #e6e7e8; 196 | background-color: #fff; 197 | margin-top: 20px; 198 | padding: 1rem 0; 199 | } 200 | 201 | .conversation-div { 202 | background-color: #5a5a5a; 203 | padding-bottom: 2rem; 204 | margin-bottom: 0; 205 | } 206 | 207 | .margin-bottom { 208 | margin-bottom: 3rem!important; 209 | } 210 | 211 | .information-container { 212 | margin-bottom: 20px; 213 | color: #e0e0e0; 214 | } 215 | 216 | .profile-container { 217 | color: #e0e0e0; 218 | } 219 | 220 | .information-title { 221 | color: #FEC217; 222 | } 223 | 224 | .clear-float { 225 | clear:both; 226 | } 227 | -------------------------------------------------------------------------------- /public/images/app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/biosopher/watson-ipa-web-nodejs/255ac70c3e264a86e6f87d0a67d542e17a5c031c/public/images/app.png -------------------------------------------------------------------------------- /public/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/biosopher/watson-ipa-web-nodejs/255ac70c3e264a86e6f87d0a67d542e17a5c031c/public/images/favicon.ico -------------------------------------------------------------------------------- /public/images/fork-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 8 | 9 | 10 | 11 | 12 | 13 | 15 | 17 | 18 | -------------------------------------------------------------------------------- /public/images/link.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 14 | 15 | -------------------------------------------------------------------------------- /public/images/loading-indicator.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/watson.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/biosopher/watson-ipa-web-nodejs/255ac70c3e264a86e6f87d0a67d542e17a5c031c/public/images/watson.gif -------------------------------------------------------------------------------- /public/images/watson.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/biosopher/watson-ipa-web-nodejs/255ac70c3e264a86e6f87d0a67d542e17a5c031c/public/images/watson.png -------------------------------------------------------------------------------- /public/images/watson.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 9 | 11 | 13 | 15 | 17 | 19 | 20 | 22 | 24 | 26 | 28 | 29 | 32 | 35 | 38 | 41 | 43 | 45 | 47 | 48 | 50 | 52 | 53 | -------------------------------------------------------------------------------- /public/images/you.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /public/javascript/calculationPipeline.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2015 IBM Corp. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | 'use strict'; 18 | 19 | var CalculationPipeline = new Object(); 20 | var ERR_MESSAGE = "I'm unable to perform calculations of that type."; 21 | CalculationPipeline.numericCalculation= function(calculationStr) { 22 | 23 | var result = ERR_MESSAGE; 24 | try { 25 | // For security and possibly additional text, strip anything other than digits, (), -+/* and . 26 | calculationStr = calculationStr.replace(/[^-()\d/*/^+.]/g, ''); 27 | if (calculationStr.length > 0) { 28 | result = math.eval(calculationStr); 29 | if (result != undefined) { 30 | result = math.format(result, 3); 31 | } 32 | } 33 | } catch(err) { 34 | } 35 | return result; 36 | } 37 | 38 | CalculationPipeline.conversionCalculation= function(calculationStr) { 39 | var result = ERR_MESSAGE;; 40 | try { 41 | // SHOULD BE MORE SECURE! See the String.replace() in numericCalculation() 42 | var conversion = math.eval(calculationStr); 43 | if (conversion != undefined) { 44 | result = math.format(conversion,3); 45 | } 46 | } catch(err) { 47 | } 48 | return result; 49 | } 50 | -------------------------------------------------------------------------------- /public/javascript/ipaRemote.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | // Service names 4 | var IPA_DIALOG_NAME = "demo_ipa3"; // REPLACE with your own name 5 | var IPA_CLASSIFIER_NAME = "demo_ipa"; // NO NEED TO RENAME THIS ONE unless you want to 6 | 7 | // Intent Types 8 | var INTENT_TYPE_DIALOG_EMAIL = "action-email-create"; 9 | var INTENT_TYPE_DIALOG_MEETING = "action-meeting-create"; 10 | var INTENT_TYPE_DIALOG_SMS = "action-sms-create"; 11 | 12 | var intentType = null; 13 | var ipaDialog = null; 14 | var ipaNlcClassifier = null; 15 | var conversation = null; 16 | 17 | var $dialogsLoading = $('.dialogs-loading'); 18 | var $dialogsError = $('.dialogs-error'); 19 | 20 | // conversation nodes 21 | var $conversationDiv = $('.conversation-div'); 22 | var $conversation = $('.conversation-container'); 23 | var $information = $('.information-container'); 24 | var $profileContainer = $('.profile-container'); 25 | var $userInput = $('.user-input'); 26 | 27 | // initial load 28 | $(document).ready(function() { 29 | 30 | retrieveDialogs(); 31 | 32 | $('.input-btn').click(conductConversation); 33 | $userInput.keyup(function(event){ 34 | if(event.keyCode === 13) { 35 | conductConversation(); 36 | } 37 | }); 38 | }); 39 | 40 | function retrieveDialogs() { 41 | $dialogsLoading.show(); 42 | $dialogsError.hide(); 43 | 44 | $.get('/proxy/api/v1/dialogs?proxyType=dialog') 45 | .done(function(data) { 46 | if (data != '') { 47 | data.dialogs.forEach(function(dialog, index) { 48 | if (dialog.name == IPA_DIALOG_NAME) { 49 | ipaDialog = dialog; 50 | } 51 | }); 52 | } 53 | 54 | if (ipaDialog == null) { 55 | $dialogsLoading.hide(); 56 | $dialogsError.find('.errorMsg').html('No dialog named "' + IPA_DIALOG_NAME + '" found in the Dialog service'); 57 | $dialogsError.show(); 58 | }else{ 59 | retrieveClassifiers(); 60 | } 61 | }).fail(function() { 62 | $dialogsLoading.hide(); 63 | $dialogsError.show(); 64 | $dialogsError.find('.errorMsg').html('Error getting the dialogs.'); 65 | }) 66 | } 67 | 68 | function retrieveClassifiers() { 69 | 70 | $.get('/proxy/api/v1/classifiers?proxyType=nlc') 71 | .done(function(data) { 72 | if (data != '') { 73 | data.classifiers.forEach(function(classifier, index) { 74 | if (classifier.name == IPA_CLASSIFIER_NAME) { 75 | ipaNlcClassifier = classifier; 76 | } 77 | }); 78 | } 79 | 80 | if (ipaNlcClassifier == null) { 81 | $dialogsLoading.hide(); 82 | $dialogsError.find('.errorMsg').html('No NLC classifier named "' + IPA_CLASSIFIER_NAME + '" found in the NLC service'); 83 | $dialogsError.show(); 84 | }else{ 85 | initConversation(true); 86 | } 87 | }).fail(function() { 88 | $dialogsLoading.hide(); 89 | $dialogsError.show(); 90 | $dialogsError.find('.errorMsg').html('Error getting the NLC classifier.'); 91 | }) 92 | } 93 | 94 | function initConversation(isFirstConversation) { 95 | 96 | intentType = null; 97 | conversation = {}; 98 | conversation.user = {}; 99 | conversation.watson = {}; 100 | conversation.user.inputs = []; 101 | conversation.user.intents = []; 102 | conversation.watson.replies = []; 103 | 104 | var conversationStartText = ""; 105 | if (!isFirstConversation) { 106 | // Results in different starting text for dialog. E.g. "What else can I help with?" vs "Hello! How can I help you?". 107 | conversationStartText = "DIALOG_START_OVER"; 108 | } 109 | $.post('/proxy/api/v1/dialogs/' + ipaDialog.dialog_id + '/conversation?proxyType=dialog', {input: conversationStartText}) 110 | .done(function(data) { 111 | //$conversation.empty(); 112 | $information.empty(); 113 | $dialogsLoading.hide(); 114 | 115 | // save dialog, client and conversation id 116 | conversation.conversation_id = data.conversation_id; 117 | conversation.client_id = data.client_id; 118 | conversation.dialog_id = ipaDialog.dialog_id; 119 | $('
').text('Dialog name: ' + ipaDialog.name).appendTo($information); 120 | $('
').text('Dialog id: ' + conversation.dialog_id).appendTo($information); 121 | $('
').text('Conversation id: ' + conversation.conversation_id).appendTo($information); 122 | $('
').text('Client id: ' + conversation.client_id).appendTo($information); 123 | 124 | var text = data.response.join('
'); 125 | displayWatsonChat(text); 126 | }); 127 | } 128 | 129 | function saveConversation(userIntentText,userIntentType,watsonReply) { 130 | 131 | // Update conversation store 132 | conversation.user.inputs[conversation.user.inputs.length] = userIntentText; 133 | conversation.user.intents[conversation.user.intents.length] = userIntentType; 134 | conversation.watson.replies[conversation.watson.replies.length] = watsonReply; 135 | 136 | var conversationJson = JSON.stringify(conversation); 137 | $.ajax( { 138 | url: '/saveConversation', 139 | type: 'POST', 140 | data: conversationJson, 141 | contentType: 'application/json', 142 | processData: false, 143 | success: function (response) { 144 | console.log("conversationJson sent to server"); 145 | }, 146 | error: function (xhr, ajaxOptions, thrownError) { 147 | console.log("Error: " + xhr.status + "\n" + xhr.responseText + "\n" + JSON.stringify(thrownError)); 148 | } 149 | } ); 150 | } 151 | 152 | /** 153 | * Let Watson Dialog Services help us out 154 | */ 155 | function handOffToDialog(userIntentText) { 156 | 157 | var dialogInput = userIntentText; 158 | if (isDialogRequiredIntent()) { 159 | // Use the invite type to redirect the Dialog flow to the current intent. 160 | dialogInput = intentType + " " + userIntentText; 161 | } 162 | 163 | var path = '/proxy/api/v1/dialogs/' + conversation.dialog_id + '/conversation?proxyType=dialog'; 164 | var params = { 165 | input: dialogInput, 166 | conversation_id: conversation.conversation_id, 167 | client_id: conversation.client_id 168 | }; 169 | 170 | $.post(path, params).done(function(data) { 171 | var replyText = data.response.join('
'); 172 | 173 | // Determine if current dialog completed 174 | var index = replyText.indexOf("DIALOG_COMPLETED"); 175 | var dialogCompleted = index >= 0; 176 | if (dialogCompleted) { 177 | replyText = replyText.substring(0,index-5); // also remove the "
" 178 | } 179 | displayWatsonChat(replyText); 180 | getProfile(); 181 | saveConversation(userIntentText,intentType,replyText); 182 | 183 | if (dialogCompleted) { 184 | initConversation(false); 185 | } 186 | scrollToBottom(); 187 | }).fail(function(response){ 188 | displayWatsonChat("I'm unable to process your request at the moment."); 189 | scrollToBottom(); 190 | }); 191 | } 192 | 193 | /** 194 | * Determine how we should respond 195 | */ 196 | function conductConversation() { 197 | 198 | var userIntentText = $userInput.val(); 199 | $userInput.val('').focus(); 200 | if (userIntentText == "") { 201 | displayWatsonChat("Please speak up. I can't hear you"); 202 | }else{ 203 | displayHumanChat(userIntentText); 204 | 205 | if (isDialogRequiredIntent()) { 206 | handOffToDialog(userIntentText); 207 | }else{ 208 | determineUserIntent(userIntentText); 209 | } 210 | } 211 | } 212 | 213 | function getProfile() { 214 | var path = '/proxy/api/v1/dialogs/' + conversation.dialog_id + '/profile?proxyType=dialog'; 215 | var params = { 216 | conversation_id: conversation.conversation_id, 217 | client_id: conversation.client_id 218 | }; 219 | 220 | var attendee1Found = false; 221 | var timeFound = false; 222 | var dateFound = false; 223 | $.get(path, params).done(function(data) { 224 | $profileContainer.empty(); 225 | data.name_values.forEach(function(par) { 226 | if (par.value !== '') { 227 | $('
').text(par.name + ': ' + par.value).appendTo($profileContainer); 228 | } 229 | }); 230 | }); 231 | } 232 | 233 | function getReplyToIntent(nlcResponse, userText) 234 | { 235 | var replyText = null; 236 | intentType = nlcResponse.top_class; 237 | console.log(userText + ": " + nlcResponse.top_class); 238 | switch (intentType) { 239 | case INTENT_TYPE_DIALOG_EMAIL: 240 | break; 241 | case INTENT_TYPE_DIALOG_MEETING: 242 | break; 243 | case INTENT_TYPE_DIALOG_SMS: 244 | break; 245 | case "respond-off-topic-joke-or-riddle": 246 | replyText = JokesPipeline.nextJoke(); 247 | break; 248 | case "respond-calculation-numeric": 249 | replyText = CalculationPipeline.numericCalculation(userText); 250 | break; 251 | case "respond-calculation-conversion": 252 | replyText = CalculationPipeline.conversionCalculation(userText); 253 | break; 254 | case "action-task-create": 255 | replyText = "Sorry. Task creation is not supported."; 256 | break; 257 | case "respond-off-topic-math": 258 | replyText = "Oops...my calculator's batteries are dead."; 259 | break; 260 | case "respond-off-topic-nonsense-input": 261 | replyText = "Looks like your keyboard isn't functioning properly."; 262 | break; 263 | case "respond-off-topic-science": 264 | replyText = "Sorry, my science cartridge isn't installed yet."; 265 | break; 266 | case "respond-off-topic-philosophy": 267 | replyText = "Ahhh...such are the mysteries of life"; 268 | break; 269 | case "respond-off-topic-user-focus": 270 | replyText = "Sounds like you've had a very busy day."; 271 | break; 272 | case "respond-off-topic-watson-focus": 273 | replyText = "Are you trying to figure out if I'm a robot or a human?"; 274 | break; 275 | case "respond-server-error": 276 | replyText = "Sorry. One of my cognitive systems is not working at the moment."; 277 | break; 278 | default: 279 | replyText = "Sorry. I don't understand your question."; 280 | break; 281 | } 282 | return replyText; 283 | } 284 | 285 | function displayWatsonChat(text) { 286 | 287 | $('
').html(text) 288 | .appendTo($conversation); 289 | scrollToBottom(); 290 | } 291 | 292 | function displayHumanChat(text) { 293 | 294 | $('

').html(text) 295 | .appendTo($conversation); 296 | 297 | $('

') 298 | .appendTo($conversation); 299 | 300 | scrollToBottom(); 301 | } 302 | 303 | function isDialogRequiredIntent() { 304 | return intentType == INTENT_TYPE_DIALOG_EMAIL || intentType == INTENT_TYPE_DIALOG_MEETING || intentType == INTENT_TYPE_DIALOG_SMS; 305 | } 306 | 307 | function determineUserIntent(userIntentText) { 308 | 309 | var encodedText = encodeURIComponent(userIntentText); 310 | $.get('/proxy/api/v1/classifiers/' + ipaNlcClassifier.classifier_id + '/classify?proxyType=nlc&text=' + encodedText) 311 | .done(function(data) { 312 | 313 | var replyText = getReplyToIntent(data, userIntentText); 314 | if (isDialogRequiredIntent()) { 315 | handOffToDialog(userIntentText); 316 | }else { 317 | displayWatsonChat(replyText); 318 | displayWatsonChat("Is there anything else I can help you with?"); 319 | saveConversation(userIntentText,intentType,replyText); 320 | } 321 | }).fail(function(response){ 322 | console.log("StatusCode (" + response.status + "): " + response.statusText); 323 | displayWatsonChat("I'm unable to process your request at the moment."); 324 | }); 325 | } 326 | 327 | function scrollToBottom (){ 328 | $('body, html').animate({ scrollTop: $('body').height() + 'px' }); 329 | } 330 | 331 | -------------------------------------------------------------------------------- /public/javascript/jokesPipeline.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2015 IBM Corp. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | 'use strict'; 18 | 19 | var JokesPipeline = new Object(); 20 | 21 | var index = 0; 22 | var jokesArray = ["How many programmers does it take to change a light bulb?\n\nAnswer: None. It’s a hardware problem.", 23 | "What did the spider do on the computer?\n\nAnswer: A website!", 24 | "Why did the computer keep sneezing?\n\nAnswer: It had a virus!", 25 | "What does a baby computer call his father?\n\nAnswer: Data!", 26 | "Why did the computer squeak?\n\nAnswer: Because someone stepped on it's mouse! ", 27 | "Why is it that programmers always confuse Halloween with Christmas?\n\nAnswer: Because 31 OCT = 25 DEC."]; 28 | 29 | JokesPipeline.nextJoke = function() { 30 | 31 | var joke = jokesArray[index]; 32 | index++; 33 | if (index == jokesArray.length) index = 0; 34 | return joke; 35 | } 36 | 37 | -------------------------------------------------------------------------------- /public/javascript/jquery-1.11.1.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ 2 | !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),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("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; 3 | if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/\s*$/g,rb={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("