├── __init__.py
├── doc
└── show.gif
├── requirements.txt
├── Dockerfile
├── docker-compose.yml
├── settings.py
├── web
├── result.html
├── index2.html
├── index1.html
└── base.html
├── README.md
├── LICENSE
├── static
└── js
│ ├── work.js
│ ├── clipboard.min.js
│ ├── paste.js
│ └── jquery.min.js
├── ocr.py
├── .gitignore
└── app.py
/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/doc/show.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sixzeroo/WebOCR/HEAD/doc/show.gif
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | baidu-aip==2.2.0.0
2 | certifi==2018.1.18
3 | chardet==3.0.4
4 | idna==2.6
5 | requests==2.18.4
6 | tornado==4.5.3
7 | urllib3==1.22
8 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM python:3.5
2 |
3 | RUN mkdir /code
4 |
5 | ADD . /code
6 |
7 | WORKDIR /code
8 |
9 | RUN pip install -r requirements.txt
10 |
11 | EXPOSE 8080
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '3'
2 | services:
3 |
4 | webocr:
5 | build: .
6 | command: python app.py
7 | ports:
8 | - "8080:8080"
9 | volumes:
10 | - ".:/code"
--------------------------------------------------------------------------------
/settings.py:
--------------------------------------------------------------------------------
1 | import os,platform
2 |
3 | upload_path = os.path.join(os.path.dirname(__file__), "img")
4 | static_path = os.path.join(os.path.dirname(__file__), "static")
5 |
6 | APP_ID = 'XXXXXXXX'
7 | API_KEY = 'XXXXXXXXXXXXXXXX'
8 | SECRET_KEY = 'XXXXXXXXXXXXXXXXXXX'
9 |
10 | IP = '127.0.0.1'
11 | if(platform.system() == 'Linux'):
12 | IP = '0.0.0.0'
13 | PORT = 8080
14 |
--------------------------------------------------------------------------------
/web/result.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block content %}
4 |
5 |
10 |
11 |
12 |
{{result_content}}
13 |
14 |
15 |
16 | {% end %}
--------------------------------------------------------------------------------
/web/index2.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block jscontent %}
4 |
5 | {% end %}
6 |
7 | {% block content %}
8 |
20 | {% end %}
--------------------------------------------------------------------------------
/web/index1.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block jscontent %}
4 |
5 | {% end %}
6 |
7 | {% block content %}
8 |
9 |
粘贴在这里
10 |
11 |
结果展示在这里
12 |
13 |
16 |
17 |
18 | {% end %}
19 |
20 | {% block endjscontent %}
21 |
31 | {% end %}
32 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # WebOCR
2 |
3 | web在线OCR(图片文字识别)
4 |
5 | ## 效果
6 | 
7 |
8 |
9 | ## features
10 | * 在线展示结果
11 | * 选择文件上传图片
12 | * 粘贴板直接上传图片
13 |
14 |
15 | ## 配置
16 | ```
17 | # 上传路径和静态文件配置路径,一般不需要改变
18 | upload_path = os.path.join(os.path.dirname(__file__), "img")
19 | static_path = os.path.join(os.path.dirname(__file__), "static")
20 |
21 | # 百度OCR KEY配置,可免费申请
22 | APP_ID = 'XXXXXXXXXX'
23 | API_KEY = 'XXXXXXXXXX'
24 | SECRET_KEY = 'XXXXXXXXXXXXXX'
25 |
26 |
27 | IP = '127.0.0.1'
28 | if(platform.system() == 'Linux'):
29 | IP = '0.0.0.0'
30 | # 开放的端口,若修改,则需要修改Docker中的相关配置
31 | PORT = 8080
32 |
33 | ```
34 |
35 |
36 | ## 使用
37 |
38 | 下载源码
39 | ```
40 | git clone https://github.com/Sixzeroo/WebOCR
41 | ```
42 |
43 |
44 | 使用Docker容器部署(安装好Docker和Docker-compose)
45 | ```
46 | docker-compose up -d
47 | ```
48 |
49 | ## 演示地址
50 | http://server.liuin.cn:8080/1
51 |
52 | ## 参考
53 | * https://github.com/layerssss/paste.js
54 | * https://github.com/MaticsL/HFUT_cloud_print
55 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/static/js/work.js:
--------------------------------------------------------------------------------
1 |
2 | $(function(){
3 | $('.demo-contenteditable').pastableContenteditable();
4 | $('.demo').on('pasteImage', function(ev, data){
5 | var blobUrl = URL.createObjectURL(data.blob);
6 | var name = data.name != null ? ', name: ' + data.name : '';
7 | // console.log(data);
8 | var res = 'zero';
9 | var url = window.location.href + '/upload';
10 | $.ajax({
11 | url: url,
12 | type: 'POST',
13 | data:
14 | {
15 | 'data': data.dataURL
16 | },
17 | success: function (response) {
18 | // console.log(response);
19 | res = response.message;
20 | $('#message').text( "图片上传成功,转换结果:");
21 | $('#result').text(res);
22 | $('#btn').attr("data-clipboard-text",res);
23 | },
24 | error: function(responsestr){
25 | // console.log("error");
26 | // console.log(responsestr);
27 | $('#message').text( "上传失败,请重试!");
28 | }
29 | });
30 | $('#message').text( '图片正在上传,尺寸:' + data.width + ' x ' + data.height);
31 | })
32 | });
33 |
--------------------------------------------------------------------------------
/web/base.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | WebOCR
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | {% block jscontent %}{% end %}
14 |
15 |
16 |
17 |
18 |
21 |
24 |
27 |
28 |
29 | {% block content %}{% end %}
30 | {% block endjscontent %}{% end %}
31 |
32 |
33 |
--------------------------------------------------------------------------------
/ocr.py:
--------------------------------------------------------------------------------
1 | from aip import AipOcr
2 |
3 | from settings import API_KEY,APP_ID,SECRET_KEY
4 |
5 | class OCR(object):
6 | def __init__(self):
7 | self.client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
8 |
9 | @staticmethod
10 | def get_file_content(filePath):
11 | with open(filePath, 'rb') as fp:
12 | content = fp.read()
13 | fp.close()
14 | return content
15 |
16 | def getResult(self,filePath):
17 | '''
18 | 返回OCR识别结果
19 | :param filePath: 图片路径
20 | :return: {'code': 0/1 (是否成功),'text':str (信息)}
21 | '''
22 | image = OCR.get_file_content(filePath)
23 |
24 | options = {}
25 | options["language_type"] = "CHN_ENG"
26 | options["detect_direction"] = "true"
27 | options["detect_language"] = "true"
28 | options["probability"] = "true"
29 |
30 | res = self.client.basicGeneral(image,options)
31 | output = {'code': 0,
32 | 'text': ''}
33 | # 出错情况
34 | if( 'error_code' in res):
35 | output['code'] = 0
36 | if(res['error_code'] == '17'):
37 | output['text'] = "每天流量超限额"
38 | else:
39 | output['text'] = '错误代码:{}'.format(res['error_code'])
40 | # 正常情况
41 | else:
42 | output['code'] = 1
43 | text = ''
44 | for elem in res['words_result']:
45 | text = text + elem['words'] + '\n'
46 | output['text'] = text
47 |
48 | return output
49 |
50 |
51 | # if __name__ == '__main__':
52 | # test = OCR()
53 | # a = test.getResult('H:\\pro\\WebOCR\\img\\2018-02-02T22-42-08.PNG')
54 | # print(a)
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | img/
2 | .idea/
3 |
4 | # Created by https://www.gitignore.io/api/macOS
5 |
6 | ### macOS ###
7 | *.DS_Store
8 | .AppleDouble
9 | .LSOverride
10 |
11 | # Icon must end with two \r
12 | Icon
13 |
14 | # Thumbnails
15 | ._*
16 |
17 | # Files that might appear in the root of a volume
18 | .DocumentRevisions-V100
19 | .fseventsd
20 | .Spotlight-V100
21 | .TemporaryItems
22 | .Trashes
23 | .VolumeIcon.icns
24 | .com.apple.timemachine.donotpresent
25 |
26 | # Directories potentially created on remote AFP share
27 | .AppleDB
28 | .AppleDesktop
29 | Network Trash Folder
30 | Temporary Items
31 | .apdisk
32 |
33 | # End of https://www.gitignore.io/api/macOS
34 |
35 | # Created by https://www.gitignore.io/api/Linux
36 |
37 | ### Linux ###
38 | *~
39 |
40 | # temporary files which can be created if a process still has a handle open of a deleted file
41 | .fuse_hidden*
42 |
43 | # KDE directory preferences
44 | .directory
45 |
46 | # Linux trash folder which might appear on any partition or disk
47 | .Trash-*
48 |
49 | # .nfs files are created when an open file is removed but is still being accessed
50 | .nfs*
51 |
52 | # End of https://www.gitignore.io/api/Linux
53 |
54 | # Created by https://www.gitignore.io/api/Python
55 |
56 | ### Python ###
57 | # Byte-compiled / optimized / DLL files
58 | __pycache__/
59 | *.py[cod]
60 | *$py.class
61 |
62 | # C extensions
63 | *.so
64 |
65 | # Distribution / packaging
66 | .Python
67 | build/
68 | develop-eggs/
69 | dist/
70 | downloads/
71 | eggs/
72 | .eggs/
73 | lib/
74 | lib64/
75 | parts/
76 | sdist/
77 | var/
78 | wheels/
79 | *.egg-info/
80 | .installed.cfg
81 | *.egg
82 |
83 | # PyInstaller
84 | # Usually these files are written by a python script from a template
85 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
86 | *.manifest
87 | *.spec
88 |
89 | # Installer logs
90 | pip-log.txt
91 | pip-delete-this-directory.txt
92 |
93 | # Unit test / coverage reports
94 | htmlcov/
95 | .tox/
96 | .coverage
97 | .coverage.*
98 | .cache
99 | nosetests.xml
100 | coverage.xml
101 | *.cover
102 | .hypothesis/
103 |
104 | # Translations
105 | *.mo
106 | *.pot
107 |
108 | # Django stuff:
109 | *.log
110 | local_settings.py
111 |
112 | # Flask stuff:
113 | instance/
114 | .webassets-cache
115 |
116 | # Scrapy stuff:
117 | .scrapy
118 |
119 | # Sphinx documentation
120 | docs/_build/
121 |
122 | # PyBuilder
123 | target/
124 |
125 | # Jupyter Notebook
126 | .ipynb_checkpoints
127 |
128 | # pyenv
129 | .python-version
130 |
131 | # celery beat schedule file
132 | celerybeat-schedule
133 |
134 | # SageMath parsed files
135 | *.sage.py
136 |
137 | # Environments
138 | .env
139 | .venv
140 | env/
141 | venv/
142 | ENV/
143 | env.bak/
144 | venv.bak/
145 |
146 | # Spyder project settings
147 | .spyderproject
148 | .spyproject
149 |
150 | # Rope project settings
151 | .ropeproject
152 |
153 | # mkdocs documentation
154 | /site
155 |
156 | # mypy
157 | .mypy_cache/
158 |
159 | # End of https://www.gitignore.io/api/Python
160 |
161 | # Created by https://www.gitignore.io/api/Windows
162 |
163 | ### Windows ###
164 | # Windows thumbnail cache files
165 | Thumbs.db
166 | ehthumbs.db
167 | ehthumbs_vista.db
168 |
169 | # Folder config file
170 | Desktop.ini
171 |
172 | # Recycle Bin used on file shares
173 | $RECYCLE.BIN/
174 |
175 | # Windows Installer files
176 | *.cab
177 | *.msi
178 | *.msm
179 | *.msp
180 |
181 | # Windows shortcuts
182 | *.lnk
183 |
184 | # End of https://www.gitignore.io/api/Windows
185 |
186 | # Created by https://www.gitignore.io/api/Java
187 |
188 | ### Java ###
189 | # Compiled class file
190 | *.class
191 |
192 | # Log file
193 | *.log
194 |
195 | # BlueJ files
196 | *.ctxt
197 |
198 | # Mobile Tools for Java (J2ME)
199 | .mtj.tmp/
200 |
201 | # Package Files #
202 | *.jar
203 | *.war
204 | *.ear
205 | *.zip
206 | *.tar.gz
207 | *.rar
208 |
209 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
210 | hs_err_pid*
211 |
212 | # End of https://www.gitignore.io/api/Java
--------------------------------------------------------------------------------
/app.py:
--------------------------------------------------------------------------------
1 | # -*- coding:utf-8 -*-
2 |
3 | import os,base64,time,json
4 |
5 | import tornado.ioloop
6 | import tornado.web
7 |
8 | from settings import static_path,IP,PORT
9 |
10 | ALLOW_FILETYPE = ['.png', '.PNG', '.jpg', '.JPG', '.jpeg', '.JPEG']
11 |
12 | class Main1Handler(tornado.web.RequestHandler):
13 | def get(self):
14 | return self.render('web/index1.html')
15 |
16 | class Main2Handler(tornado.web.RequestHandler):
17 | def get(self):
18 | return self.render('web/index2.html')
19 |
20 |
21 | class UploadFile2Handler(tornado.web.RequestHandler):
22 |
23 | def post(self):
24 | from settings import upload_path
25 | from ocr import OCR
26 |
27 | now_time = time.strftime('%Y-%m-%dT%H-%M-%S',time.localtime(time.time()))
28 | dir_prefix = now_time
29 |
30 | try:
31 | file_metas = self.request.files['file']
32 | except:
33 | return self.render('web/result.html', result='negative', result_header='失败', result_content='请选择需要打印的文件。')
34 |
35 | for meta in file_metas:
36 | filename = meta['filename']
37 | # valid filetype
38 | if not os.path.splitext(filename)[1] in ALLOW_FILETYPE:
39 | return self.render('web/result.html', result='negative', result_header='上传失败',
40 | result_content='文件格式不支持')
41 |
42 | try:
43 | os.makedirs(os.path.join(upload_path, dir_prefix))
44 | except:
45 | pass
46 | # save file
47 | filepath = os.path.join(upload_path, dir_prefix, "img"+os.path.splitext(filename)[1])
48 | with open(filepath,'wb') as up:
49 | up.write(meta['body'])
50 | # orc
51 | ocrinstance = OCR()
52 | res = ocrinstance.getResult(filepath)
53 | statusCode = res['code']
54 | status = '成功' if (statusCode == 1) else '失败'
55 | text = res['text']
56 | # save res
57 | respath = os.path.join(upload_path, dir_prefix, 'result.txt')
58 | with open(respath, 'w',encoding="utf-8") as info:
59 | info.write(status+'\n'+text)
60 | # render
61 | if(statusCode == 1):
62 | return self.render('web/result.html', result='positive', result_header=status, result_content=text)
63 | else:
64 | return self.render('web/result.html', result='negative', result_header=status, result_content=text)
65 |
66 |
67 | class UploadFile1Handler(tornado.web.RequestHandler):
68 |
69 | def post(self):
70 | from settings import upload_path
71 | from ocr import OCR
72 |
73 | now_time = time.strftime('%Y-%m-%dT%H-%M-%S', time.localtime(time.time()))
74 | dir_prefix = now_time
75 |
76 | try:
77 | base64ImgData = self.request.arguments['data'][0].decode("utf-8")
78 | # 去除base64图片前面的说明str
79 | base64ImgData = base64ImgData[base64ImgData.find(',') + 1:]
80 | imgData = base64.b64decode(base64ImgData)
81 | except:
82 | self.finish({
83 | 'code': 0,
84 | 'message': "error"
85 | })
86 |
87 | try:
88 | os.makedirs(os.path.join(upload_path, dir_prefix))
89 | except:
90 | pass
91 |
92 | # save file
93 | filepath = os.path.join(upload_path, dir_prefix, "img.png" )
94 | with open(filepath, 'wb') as up:
95 | up.write(imgData)
96 | # orc
97 | ocrinstance = OCR()
98 | res = ocrinstance.getResult(filepath)
99 | statusCode = res['code']
100 | status = '成功' if (statusCode == 1) else '失败'
101 | text = res['text']
102 | # save res
103 | respath = os.path.join(upload_path, dir_prefix, 'result.txt')
104 | with open(respath, 'w', encoding="utf-8") as info:
105 | info.write(status + '\n' + text)
106 |
107 | self.finish({
108 | 'code': statusCode,
109 | 'message': text
110 | })
111 |
112 |
113 | application = tornado.web.Application([
114 | (r"/", tornado.web.RedirectHandler,{"url":"/1","permanent":False}),
115 | (r"/1", Main1Handler),
116 | (r"/2", Main2Handler),
117 | (r"/1/upload", UploadFile1Handler),
118 | (r"/2/upload", UploadFile2Handler)],
119 | static_path=static_path)
120 |
121 | if __name__ == "__main__":
122 | application.listen(PORT, address=IP)
123 | tornado.ioloop.IOLoop.instance().start()
124 |
--------------------------------------------------------------------------------
/static/js/clipboard.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * clipboard.js v1.7.1
3 | * https://zenorocha.github.io/clipboard.js
4 | *
5 | * Licensed MIT © Zeno Rocha
6 | */
7 | !function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Clipboard=t()}}(function(){var t,e,n;return function t(e,n,o){function i(a,c){if(!n[a]){if(!e[a]){var l="function"==typeof require&&require;if(!c&&l)return l(a,!0);if(r)return r(a,!0);var s=new Error("Cannot find module '"+a+"'");throw s.code="MODULE_NOT_FOUND",s}var u=n[a]={exports:{}};e[a][0].call(u.exports,function(t){var n=e[a][1][t];return i(n||t)},u,u.exports,t,e,n,o)}return n[a].exports}for(var r="function"==typeof require&&require,a=0;a0&&void 0!==arguments[0]?arguments[0]:{};this.action=e.action,this.container=e.container,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""}},{key:"initSelection",value:function t(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function t(){var e=this,n="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[n?"right":"left"]="-9999px";var o=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=o+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=(0,i.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function t(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function t(){this.selectedText=(0,i.default)(this.target),this.copyText()}},{key:"copyText",value:function t(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function t(e){this.emitter.emit(e?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function t(){this.trigger&&this.trigger.focus(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function t(){this.removeFake()}},{key:"action",set:function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function t(){return this._action}},{key:"target",set:function t(e){if(void 0!==e){if(!e||"object"!==(void 0===e?"undefined":r(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=e}},get:function t(){return this._target}}]),t}();t.exports=c})},{select:5}],8:[function(e,n,o){!function(i,r){if("function"==typeof t&&t.amd)t(["module","./clipboard-action","tiny-emitter","good-listener"],r);else if(void 0!==o)r(n,e("./clipboard-action"),e("tiny-emitter"),e("good-listener"));else{var a={exports:{}};r(a,i.clipboardAction,i.tinyEmitter,i.goodListener),i.clipboard=a.exports}}(this,function(t,e,n,o){"use strict";function i(t){return t&&t.__esModule?t:{default:t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function a(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function c(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function l(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}var s=i(e),u=i(n),f=i(o),d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},h=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===d(e.container)?e.container:document.body}},{key:"listenClick",value:function t(e){var n=this;this.listener=(0,f.default)(e,"click",function(t){return n.onClick(t)})}},{key:"onClick",value:function t(e){var n=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new s.default({action:this.action(n),target:this.target(n),text:this.text(n),container:this.container,trigger:n,emitter:this})}},{key:"defaultAction",value:function t(e){return l("action",e)}},{key:"defaultTarget",value:function t(e){var n=l("target",e);if(n)return document.querySelector(n)}},{key:"defaultText",value:function t(e){return l("text",e)}},{key:"destroy",value:function t(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],n="string"==typeof e?[e]:e,o=!!document.queryCommandSupported;return n.forEach(function(t){o=o&&!!document.queryCommandSupported(t)}),o}}]),e}(u.default);t.exports=p})},{"./clipboard-action":7,"good-listener":4,"tiny-emitter":6}]},{},[8])(8)});
--------------------------------------------------------------------------------
/static/js/paste.js:
--------------------------------------------------------------------------------
1 | // Generated by CoffeeScript 1.12.7
2 |
3 | /*
4 | paste.js is an interface to read data ( text / image ) from clipboard in different browsers. It also contains several hacks.
5 |
6 | https://github.com/layerssss/paste.js
7 | */
8 |
9 | (function() {
10 | var $, Paste, createHiddenEditable, dataURLtoBlob, isFocusable;
11 |
12 | $ = window.jQuery;
13 |
14 | $.paste = function(pasteContainer) {
15 | var pm;
16 | if (typeof console !== "undefined" && console !== null) {
17 | console.log("DEPRECATED: This method is deprecated. Please use $.fn.pastableNonInputable() instead.");
18 | }
19 | pm = Paste.mountNonInputable(pasteContainer);
20 | return pm._container;
21 | };
22 |
23 | $.fn.pastableNonInputable = function() {
24 | var el, j, len, ref;
25 | ref = this;
26 | for (j = 0, len = ref.length; j < len; j++) {
27 | el = ref[j];
28 | if (el._pastable || $(el).is('textarea, input:text, [contenteditable]')) {
29 | continue;
30 | }
31 | Paste.mountNonInputable(el);
32 | el._pastable = true;
33 | }
34 | return this;
35 | };
36 |
37 | $.fn.pastableTextarea = function() {
38 | var el, j, len, ref;
39 | ref = this;
40 | for (j = 0, len = ref.length; j < len; j++) {
41 | el = ref[j];
42 | if (el._pastable || $(el).is(':not(textarea, input:text)')) {
43 | continue;
44 | }
45 | Paste.mountTextarea(el);
46 | el._pastable = true;
47 | }
48 | return this;
49 | };
50 |
51 | $.fn.pastableContenteditable = function() {
52 | var el, j, len, ref;
53 | ref = this;
54 | for (j = 0, len = ref.length; j < len; j++) {
55 | el = ref[j];
56 | if (el._pastable || $(el).is(':not([contenteditable])')) {
57 | continue;
58 | }
59 | Paste.mountContenteditable(el);
60 | el._pastable = true;
61 | }
62 | return this;
63 | };
64 |
65 | dataURLtoBlob = function(dataURL, sliceSize) {
66 | var b64Data, byteArray, byteArrays, byteCharacters, byteNumbers, contentType, i, m, offset, ref, slice;
67 | if (sliceSize == null) {
68 | sliceSize = 512;
69 | }
70 | if (!(m = dataURL.match(/^data\:([^\;]+)\;base64\,(.+)$/))) {
71 | return null;
72 | }
73 | ref = m, m = ref[0], contentType = ref[1], b64Data = ref[2];
74 | byteCharacters = atob(b64Data);
75 | byteArrays = [];
76 | offset = 0;
77 | while (offset < byteCharacters.length) {
78 | slice = byteCharacters.slice(offset, offset + sliceSize);
79 | byteNumbers = new Array(slice.length);
80 | i = 0;
81 | while (i < slice.length) {
82 | byteNumbers[i] = slice.charCodeAt(i);
83 | i++;
84 | }
85 | byteArray = new Uint8Array(byteNumbers);
86 | byteArrays.push(byteArray);
87 | offset += sliceSize;
88 | }
89 | return new Blob(byteArrays, {
90 | type: contentType
91 | });
92 | };
93 |
94 | createHiddenEditable = function() {
95 | return $(document.createElement('div')).attr('contenteditable', true).attr('aria-hidden', true).attr('tabindex', -1).css({
96 | width: 1,
97 | height: 1,
98 | position: 'fixed',
99 | left: -100,
100 | overflow: 'hidden',
101 | opacity: 1e-17
102 | });
103 | };
104 |
105 | isFocusable = function(element, hasTabindex) {
106 | var fieldset, focusableIfVisible, img, map, mapName, nodeName;
107 | map = void 0;
108 | mapName = void 0;
109 | img = void 0;
110 | focusableIfVisible = void 0;
111 | fieldset = void 0;
112 | nodeName = element.nodeName.toLowerCase();
113 | if ('area' === nodeName) {
114 | map = element.parentNode;
115 | mapName = map.name;
116 | if (!element.href || !mapName || map.nodeName.toLowerCase() !== 'map') {
117 | return false;
118 | }
119 | img = $('img[usemap=\'#' + mapName + '\']');
120 | return img.length > 0 && img.is(':visible');
121 | }
122 | if (/^(input|select|textarea|button|object)$/.test(nodeName)) {
123 | focusableIfVisible = !element.disabled;
124 | if (focusableIfVisible) {
125 | fieldset = $(element).closest('fieldset')[0];
126 | if (fieldset) {
127 | focusableIfVisible = !fieldset.disabled;
128 | }
129 | }
130 | } else if ('a' === nodeName) {
131 | focusableIfVisible = element.href || hasTabindex;
132 | } else {
133 | focusableIfVisible = hasTabindex;
134 | }
135 | focusableIfVisible = focusableIfVisible || $(element).is('[contenteditable]');
136 | return focusableIfVisible && $(element).is(':visible');
137 | };
138 |
139 | Paste = (function() {
140 | Paste.prototype._target = null;
141 |
142 | Paste.prototype._container = null;
143 |
144 | Paste.mountNonInputable = function(nonInputable) {
145 | var paste;
146 | paste = new Paste(createHiddenEditable().appendTo(nonInputable), nonInputable);
147 | $(nonInputable).on('click', (function(_this) {
148 | return function(ev) {
149 | if (!isFocusable(ev.target, false)) {
150 | return paste._container.focus();
151 | }
152 | };
153 | })(this));
154 | paste._container.on('focus', (function(_this) {
155 | return function() {
156 | return $(nonInputable).addClass('pastable-focus');
157 | };
158 | })(this));
159 | return paste._container.on('blur', (function(_this) {
160 | return function() {
161 | return $(nonInputable).removeClass('pastable-focus');
162 | };
163 | })(this));
164 | };
165 |
166 | Paste.mountTextarea = function(textarea) {
167 | var ctlDown, paste, ref, ref1;
168 | if ((typeof DataTransfer !== "undefined" && DataTransfer !== null ? DataTransfer.prototype : void 0) && ((ref = Object.getOwnPropertyDescriptor) != null ? (ref1 = ref.call(Object, DataTransfer.prototype, 'items')) != null ? ref1.get : void 0 : void 0)) {
169 | return this.mountContenteditable(textarea);
170 | }
171 | paste = new Paste(createHiddenEditable().insertBefore(textarea), textarea);
172 | ctlDown = false;
173 | $(textarea).on('keyup', function(ev) {
174 | var ref2;
175 | if ((ref2 = ev.keyCode) === 17 || ref2 === 224) {
176 | ctlDown = false;
177 | }
178 | return null;
179 | });
180 | $(textarea).on('keydown', function(ev) {
181 | var ref2;
182 | if ((ref2 = ev.keyCode) === 17 || ref2 === 224) {
183 | ctlDown = true;
184 | }
185 | if ((ev.ctrlKey != null) && (ev.metaKey != null)) {
186 | ctlDown = ev.ctrlKey || ev.metaKey;
187 | }
188 | if (ctlDown && ev.keyCode === 86) {
189 | paste._textarea_focus_stolen = true;
190 | paste._container.focus();
191 | paste._paste_event_fired = false;
192 | setTimeout((function(_this) {
193 | return function() {
194 | if (!paste._paste_event_fired) {
195 | $(textarea).focus();
196 | return paste._textarea_focus_stolen = false;
197 | }
198 | };
199 | })(this), 1);
200 | }
201 | return null;
202 | });
203 | $(textarea).on('paste', (function(_this) {
204 | return function() {};
205 | })(this));
206 | $(textarea).on('focus', (function(_this) {
207 | return function() {
208 | if (!paste._textarea_focus_stolen) {
209 | return $(textarea).addClass('pastable-focus');
210 | }
211 | };
212 | })(this));
213 | $(textarea).on('blur', (function(_this) {
214 | return function() {
215 | if (!paste._textarea_focus_stolen) {
216 | return $(textarea).removeClass('pastable-focus');
217 | }
218 | };
219 | })(this));
220 | $(paste._target).on('_pasteCheckContainerDone', (function(_this) {
221 | return function() {
222 | $(textarea).focus();
223 | return paste._textarea_focus_stolen = false;
224 | };
225 | })(this));
226 | return $(paste._target).on('pasteText', (function(_this) {
227 | return function(ev, data) {
228 | var content, curEnd, curStart;
229 | curStart = $(textarea).prop('selectionStart');
230 | curEnd = $(textarea).prop('selectionEnd');
231 | content = $(textarea).val();
232 | $(textarea).val("" + content.slice(0, curStart) + data.text + content.slice(curEnd));
233 | $(textarea)[0].setSelectionRange(curStart + data.text.length, curStart + data.text.length);
234 | return $(textarea).trigger('change');
235 | };
236 | })(this));
237 | };
238 |
239 | Paste.mountContenteditable = function(contenteditable) {
240 | var paste;
241 | paste = new Paste(contenteditable, contenteditable);
242 | $(contenteditable).on('focus', (function(_this) {
243 | return function() {
244 | return $(contenteditable).addClass('pastable-focus');
245 | };
246 | })(this));
247 | return $(contenteditable).on('blur', (function(_this) {
248 | return function() {
249 | return $(contenteditable).removeClass('pastable-focus');
250 | };
251 | })(this));
252 | };
253 |
254 | function Paste(_container, _target) {
255 | this._container = _container;
256 | this._target = _target;
257 | this._container = $(this._container);
258 | this._target = $(this._target).addClass('pastable');
259 | this._container.on('paste', (function(_this) {
260 | return function(ev) {
261 | var _i, clipboardData, file, fileType, item, j, k, l, len, len1, len2, pastedFilename, reader, ref, ref1, ref2, ref3, ref4, stringIsFilename, text;
262 | _this.originalEvent = (ev.originalEvent !== null ? ev.originalEvent : null);
263 | _this._paste_event_fired = true;
264 | if (((ref = ev.originalEvent) != null ? ref.clipboardData : void 0) != null) {
265 | clipboardData = ev.originalEvent.clipboardData;
266 | if (clipboardData.items) {
267 | pastedFilename = null;
268 | _this.originalEvent.pastedTypes = [];
269 | ref1 = clipboardData.items;
270 | for (j = 0, len = ref1.length; j < len; j++) {
271 | item = ref1[j];
272 | if (item.type.match(/^text\/(plain|rtf|html)/)) {
273 | _this.originalEvent.pastedTypes.push(item.type);
274 | }
275 | }
276 | ref2 = clipboardData.items;
277 | for (_i = k = 0, len1 = ref2.length; k < len1; _i = ++k) {
278 | item = ref2[_i];
279 | if (item.type.match(/^image\//)) {
280 | reader = new FileReader();
281 | reader.onload = function(event) {
282 | return _this._handleImage(event.target.result, _this.originalEvent, pastedFilename);
283 | };
284 | try {
285 | reader.readAsDataURL(item.getAsFile());
286 | } catch (error) {}
287 | ev.preventDefault();
288 | break;
289 | }
290 | if (item.type === 'text/plain') {
291 | if (_i === 0 && clipboardData.items.length > 1 && clipboardData.items[1].type.match(/^image\//)) {
292 | stringIsFilename = true;
293 | fileType = clipboardData.items[1].type;
294 | }
295 | item.getAsString(function(string) {
296 | if (stringIsFilename) {
297 | pastedFilename = string;
298 | return _this._target.trigger('pasteText', {
299 | text: string,
300 | isFilename: true,
301 | fileType: fileType,
302 | originalEvent: _this.originalEvent
303 | });
304 | } else {
305 | return _this._target.trigger('pasteText', {
306 | text: string,
307 | originalEvent: _this.originalEvent
308 | });
309 | }
310 | });
311 | }
312 | if (item.type === 'text/rtf') {
313 | item.getAsString(function(string) {
314 | return _this._target.trigger('pasteTextRich', {
315 | text: string,
316 | originalEvent: _this.originalEvent
317 | });
318 | });
319 | }
320 | if (item.type === 'text/html') {
321 | item.getAsString(function(string) {
322 | return _this._target.trigger('pasteTextHtml', {
323 | text: string,
324 | originalEvent: _this.originalEvent
325 | });
326 | });
327 | }
328 | }
329 | } else {
330 | if (-1 !== Array.prototype.indexOf.call(clipboardData.types, 'text/plain')) {
331 | text = clipboardData.getData('Text');
332 | setTimeout(function() {
333 | return _this._target.trigger('pasteText', {
334 | text: text,
335 | originalEvent: _this.originalEvent
336 | });
337 | }, 1);
338 | }
339 | _this._checkImagesInContainer(function(src) {
340 | return _this._handleImage(src, _this.originalEvent);
341 | });
342 | }
343 | }
344 | if (clipboardData = window.clipboardData) {
345 | if ((ref3 = (text = clipboardData.getData('Text'))) != null ? ref3.length : void 0) {
346 | setTimeout(function() {
347 | _this._target.trigger('pasteText', {
348 | text: text,
349 | originalEvent: _this.originalEvent
350 | });
351 | return _this._target.trigger('_pasteCheckContainerDone');
352 | }, 1);
353 | } else {
354 | ref4 = clipboardData.files;
355 | for (l = 0, len2 = ref4.length; l < len2; l++) {
356 | file = ref4[l];
357 | _this._handleImage(URL.createObjectURL(file), _this.originalEvent);
358 | }
359 | _this._checkImagesInContainer(function(src) {});
360 | }
361 | }
362 | return null;
363 | };
364 | })(this));
365 | }
366 |
367 | Paste.prototype._handleImage = function(src, e, name) {
368 | var loader;
369 | if (src.match(/^webkit\-fake\-url\:\/\//)) {
370 | return this._target.trigger('pasteImageError', {
371 | message: "You are trying to paste an image in Safari, however we are unable to retieve its data."
372 | });
373 | }
374 | this._target.trigger('pasteImageStart');
375 | loader = new Image();
376 | loader.crossOrigin = "anonymous";
377 | loader.onload = (function(_this) {
378 | return function() {
379 | var blob, canvas, ctx, dataURL;
380 | canvas = document.createElement('canvas');
381 | canvas.width = loader.width;
382 | canvas.height = loader.height;
383 | ctx = canvas.getContext('2d');
384 | ctx.drawImage(loader, 0, 0, canvas.width, canvas.height);
385 | dataURL = null;
386 | try {
387 | dataURL = canvas.toDataURL('image/png');
388 | blob = dataURLtoBlob(dataURL);
389 | } catch (error) {}
390 | if (dataURL) {
391 | _this._target.trigger('pasteImage', {
392 | blob: blob,
393 | dataURL: dataURL,
394 | width: loader.width,
395 | height: loader.height,
396 | originalEvent: e,
397 | name: name
398 | });
399 | }
400 | return _this._target.trigger('pasteImageEnd');
401 | };
402 | })(this);
403 | loader.onerror = (function(_this) {
404 | return function() {
405 | _this._target.trigger('pasteImageError', {
406 | message: "Failed to get image from: " + src,
407 | url: src
408 | });
409 | return _this._target.trigger('pasteImageEnd');
410 | };
411 | })(this);
412 | return loader.src = src;
413 | };
414 |
415 | Paste.prototype._checkImagesInContainer = function(cb) {
416 | var img, j, len, ref, timespan;
417 | timespan = Math.floor(1000 * Math.random());
418 | ref = this._container.find('img');
419 | for (j = 0, len = ref.length; j < len; j++) {
420 | img = ref[j];
421 | img["_paste_marked_" + timespan] = true;
422 | }
423 | return setTimeout((function(_this) {
424 | return function() {
425 | var k, len1, ref1;
426 | ref1 = _this._container.find('img');
427 | for (k = 0, len1 = ref1.length; k < len1; k++) {
428 | img = ref1[k];
429 | if (!img["_paste_marked_" + timespan]) {
430 | cb(img.src);
431 | $(img).remove();
432 | }
433 | }
434 | return _this._target.trigger('_pasteCheckContainerDone');
435 | };
436 | })(this), 1);
437 | };
438 |
439 | return Paste;
440 |
441 | })();
442 |
443 | }).call(this);
444 |
--------------------------------------------------------------------------------
/static/js/jquery.min.js:
--------------------------------------------------------------------------------
1 | /*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */
2 | !function(a,b){"use strict";"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){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(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 qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(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){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.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===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!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 ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.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},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.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=ga.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=ga.selectors={cacheLength:50,createPseudo:ia,match:V,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(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===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]||ga.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]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.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(_,aa).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("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.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.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},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,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(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),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).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:oa(!1),disabled:oa(!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 X.test(a.nodeName)},input:function(a){return W.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:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S),
3 | a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.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 W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/