├── images
├── avatar.jpg
├── favicon.ico
├── icon_menu.png
└── icon_close.png
├── file
├── Roboto-Black.woff
├── Roboto-Black.woff2
├── Roboto-Bold.woff
├── Roboto-Bold.woff2
├── Roboto-Light.woff
├── Roboto-Light.woff2
├── Roboto-Medium.woff
├── Roboto-Thin.woff
├── Roboto-Thin.woff2
├── Roboto-Medium.woff2
├── Roboto-Regular.woff
├── Roboto-Regular.woff2
├── Roboto-BlackItalic.woff
├── Roboto-BoldItalic.woff
├── Roboto-BoldItalic.woff2
├── Roboto-LightItalic.woff
├── Roboto-ThinItalic.woff
├── Roboto-ThinItalic.woff2
├── Roboto-BlackItalic.woff2
├── Roboto-LightItalic.woff2
├── Roboto-MediumItalic.woff
├── Roboto-MediumItalic.woff2
├── Roboto-RegularItalic.woff
├── MaterialIcons-Regular.woff
├── MaterialIcons-Regular.woff2
└── Roboto-RegularItalic.woff2
├── README.md
├── css
├── nexmoe.min.css
├── nexmoe_v2.min.css
└── DPlayer.min.css
├── GoIndex.js
├── GoIndex_v2.js
└── js
├── ext-language_tools.js
└── mdui.min.js
/images/avatar.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/images/avatar.jpg
--------------------------------------------------------------------------------
/images/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/images/favicon.ico
--------------------------------------------------------------------------------
/images/icon_menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/images/icon_menu.png
--------------------------------------------------------------------------------
/file/Roboto-Black.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-Black.woff
--------------------------------------------------------------------------------
/file/Roboto-Black.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-Black.woff2
--------------------------------------------------------------------------------
/file/Roboto-Bold.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-Bold.woff
--------------------------------------------------------------------------------
/file/Roboto-Bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-Bold.woff2
--------------------------------------------------------------------------------
/file/Roboto-Light.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-Light.woff
--------------------------------------------------------------------------------
/file/Roboto-Light.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-Light.woff2
--------------------------------------------------------------------------------
/file/Roboto-Medium.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-Medium.woff
--------------------------------------------------------------------------------
/file/Roboto-Thin.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-Thin.woff
--------------------------------------------------------------------------------
/file/Roboto-Thin.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-Thin.woff2
--------------------------------------------------------------------------------
/images/icon_close.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/images/icon_close.png
--------------------------------------------------------------------------------
/file/Roboto-Medium.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-Medium.woff2
--------------------------------------------------------------------------------
/file/Roboto-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-Regular.woff
--------------------------------------------------------------------------------
/file/Roboto-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-Regular.woff2
--------------------------------------------------------------------------------
/file/Roboto-BlackItalic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-BlackItalic.woff
--------------------------------------------------------------------------------
/file/Roboto-BoldItalic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-BoldItalic.woff
--------------------------------------------------------------------------------
/file/Roboto-BoldItalic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-BoldItalic.woff2
--------------------------------------------------------------------------------
/file/Roboto-LightItalic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-LightItalic.woff
--------------------------------------------------------------------------------
/file/Roboto-ThinItalic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-ThinItalic.woff
--------------------------------------------------------------------------------
/file/Roboto-ThinItalic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-ThinItalic.woff2
--------------------------------------------------------------------------------
/file/Roboto-BlackItalic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-BlackItalic.woff2
--------------------------------------------------------------------------------
/file/Roboto-LightItalic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-LightItalic.woff2
--------------------------------------------------------------------------------
/file/Roboto-MediumItalic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-MediumItalic.woff
--------------------------------------------------------------------------------
/file/Roboto-MediumItalic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-MediumItalic.woff2
--------------------------------------------------------------------------------
/file/Roboto-RegularItalic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-RegularItalic.woff
--------------------------------------------------------------------------------
/file/MaterialIcons-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/MaterialIcons-Regular.woff
--------------------------------------------------------------------------------
/file/MaterialIcons-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/MaterialIcons-Regular.woff2
--------------------------------------------------------------------------------
/file/Roboto-RegularItalic.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coko8023/goIndex-theme-nexmoe/master/file/Roboto-RegularItalic.woff2
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # goIndex-theme-nexmoe
2 |
3 | 基于 [盘ta](https://github.com/Hidove/goindex) 的js,参考OneIndex的主题nexmoe,魔改美化.
4 |
5 | app-v3.js 是基于[yanzai](https://github.com/yanzai/goindex)的js美化的,支持多盘、搜索、分页加载和调用外部播放器等功能,另外添加了DPlayer播放。
6 |
7 | app-v3.js 的模板为GoIndex_v2.js
8 |
9 |
10 | # 使用
11 |
12 | 1.打开 https://install.kenci.workers.dev/ 网站,验证并获取代码
13 |
14 | 2.使用对应app.js的模板代码,将获取到的id和授权填入
15 |
16 | 3.将代码部署到 [Cloudflare Workers](https://www.cloudflare.com/)
17 |
18 | 4.使用 https://cdn.jsdelivr.net/gh/5MayRain/goIndex-theme-nexmoe@1.1.2/app-v2.js 替换获取代码中的js
19 | > var html = `
20 | >
21 | > ......
22 | >
23 | >
24 | > ......
25 | >
26 | > `;
27 |
28 | 5.其中app.js有部分链接为外链,app-v2.js的所有链接均连接仓库中的文件
29 |
30 | 6.app-v3.j地址:https://cdn.jsdelivr.net/gh/5MayRain/goIndex-theme-nexmoe@1.1.6/app-v3.js
31 |
32 | 7.[详细教程](https://5mayrain.github.io/posts/%E6%95%99%E7%A8%8B/%E4%BD%BF%E7%94%A8goindex%E6%90%AD%E5%BB%BAgoogledrive%E7%BD%91%E7%AB%99%E7%9B%AE%E5%BD%95/)
33 |
34 | # 预览
35 | [app-v2.js](https://go.zgh.workers.dev/)
36 |
37 | [app-v3.js](https://demo.zgh.workers.dev/)
38 |
--------------------------------------------------------------------------------
/css/nexmoe.min.css:
--------------------------------------------------------------------------------
1 | /*隐藏滚动条*/
2 | ::-webkit-scrollbar {
3 | width: 0px;
4 | height: 0px;
5 | }
6 |
7 | /*导航*/
8 | .nexmoe-nav {
9 | height: 56px;
10 | width: 100%;
11 | background-color: #fff;
12 | box-shadow: 0 2px 6px rgba(0,0,0,.04);
13 | }
14 |
15 | .navSize{
16 | position: relative;
17 | height: 56px;
18 | max-width: 1100px;
19 | margin: 0 auto;
20 | }
21 |
22 | /* 头像 */
23 | .avatar{
24 | position: absolute;
25 | top: 4px;
26 | left: 5%;
27 | width: 40px;
28 | height: 40px;
29 | border: 4px solid #ebe8e8;
30 | border-radius: 50%;
31 | transition: 1.2s;
32 | }
33 |
34 | /* 头像动画 */
35 | .avatar:hover{
36 | transform: rotate(360deg);
37 | -webkit-transform: rotate(360deg);
38 | -moz-transform: rotate(360deg);
39 | -o-transform: rotate(360deg);
40 | -ms-transform: rotate(360deg);
41 | }
42 |
43 | .nav_menu{
44 | position: absolute;
45 | top: 13px;
46 | right: 5%;
47 | }
48 |
49 | /* 导航 */
50 | .menu_ul{
51 | display: none;
52 | float: left;
53 | margin-block-start: 0;
54 | margin-block-end: 0;
55 | margin: 0 30px 0 0;
56 | height: 30px;
57 | width: auto;
58 | }
59 |
60 | .menu_li{
61 | float: left;
62 | list-style: none;
63 | margin-left: 15px;
64 | line-height: 30px;
65 | }
66 |
67 | .menu_li a{
68 | font-size: 16px;
69 | color: #7e7e7e;
70 | transition: color 0.2s ease-out,border 0.2s ease-out,opacity 0.2s ease-out;
71 | text-decoration: none;
72 | }
73 |
74 | .menu_li a:hover{
75 | color: #1e89f2;
76 | }
77 |
78 | /* 定义动画 */
79 | @-webkit-keyframes fadeIn {
80 | 0% {
81 | opacity: 0; /*初始状态 透明度为0*/
82 | }
83 | 50% {
84 | opacity: 0; /*中间状态 透明度为0*/
85 | }
86 | 100% {
87 | opacity: 1; /*结尾状态 透明度为1*/
88 | }
89 | }
90 |
91 | /* 伪类出现 */
92 | .nav_menu:hover ul{
93 | display: inline;
94 | -webkit-animation-name: fadeIn; /*动画名称*/
95 | -webkit-animation-duration: 0.8s; /*动画持续时间*/
96 | -webkit-animation-iteration-count: 1; /*动画次数*/
97 | -webkit-animation-delay: 0s; /*延迟时间*/
98 | }
99 |
100 | /* 图标icon */
101 | .nav_icon{
102 | float: left;
103 | width: 30px;
104 | height: 30px;
105 | background: url(//cdn.jsdelivr.net/gh/5MayRain/goIndex-theme-nexmoe/images/icon_menu.png);
106 | background-size:100% 100%;
107 | transition: .6s;
108 | cursor: pointer;
109 | }
110 |
111 | /* 图标动画icon */
112 | .nav_icon:hover{
113 | background: url(//cdn.jsdelivr.net/gh/5MayRain/goIndex-theme-nexmoe/images/icon_close.png);
114 | background-size:100% 100%;
115 | transform: rotate(360deg);
116 | -webkit-transform: rotate(360deg);
117 | -moz-transform: rotate(360deg);
118 | -o-transform: rotate(360deg);
119 | -ms-transform: rotate(360deg);
120 | }
121 |
122 | .nexmoe-item {
123 | margin: 20px -8px 0 !important;
124 | padding: 15px !important;
125 | border-radius: 5px;
126 | -webkit-box-shadow: 0 0.2em 1em rgba(204, 204, 204, .3);
127 | box-shadow: 0 0.2em 1em rgba(204, 204, 204, .3);
128 | background-color: #fff;
129 | }
130 |
131 | /*路径导航*/
132 | .mdui-toolbar {
133 | width: auto;
134 | margin-top: 30px !important;
135 | }
136 |
137 | .mdui-typo-headline {
138 | padding: 0;
139 | font-size: 15px;
140 | font-weight: normal;
141 | }
142 |
143 | .mdui-toolbar > a:last-child {
144 | opacity: 1;
145 | background-color: #1e89f2;
146 | color: #ffff;
147 | }
148 |
149 | .mdui-toolbar > a {
150 | padding: 0 16px;
151 | line-height: 30px;
152 | border-radius: 30px;
153 | border: 1px solid #eee;
154 | }
155 |
156 | @media screen and (max-width: 980px) {
157 | .mdui-toolbar > a:last-child, .mdui-toolbar > i:first-child {
158 | display: block;
159 | }
160 |
161 | .mdui-toolbar > * {
162 | display: none;
163 | }
164 |
165 |
166 | .mdui-list-item .mdui-text-right{
167 | display:none
168 | }
169 |
170 | }
171 |
172 | .mdui-toolbar>* {
173 | opacity: .5;
174 | }
175 |
176 | .mdui-list {
177 | padding: 0;
178 | }
179 |
180 | .mdui-list > .th {
181 | border: none;
182 | }
183 |
184 | .mdui-list-item {
185 | margin: 0 !important;
186 | border-radius: 5px;
187 | padding: 0 10px 0 5px !important;
188 | border: 1px solid #eee;
189 | margin-bottom: 10px !important;
190 | }
191 |
192 | .mdui-typo {
193 | padding: 10px 30px !important;
194 | }
--------------------------------------------------------------------------------
/css/nexmoe_v2.min.css:
--------------------------------------------------------------------------------
1 | /*隐藏滚动条*/
2 | ::-webkit-scrollbar {
3 | width: 0px;
4 | height: 0px;
5 | }
6 |
7 | /*导航*/
8 | .nexmoe-nav {
9 | height: 56px;
10 | width: 100%;
11 | background-color: #fff;
12 | box-shadow: 0 2px 6px rgba(0,0,0,.04);
13 | }
14 | .navSize{
15 | position: relative;
16 | height: 56px;
17 | max-width: 1100px;
18 | margin: 0 auto;
19 | }
20 | /* 头像 */
21 | .avatar{
22 | position: absolute;
23 | top: 4px;
24 | left: 5%;
25 | width: 40px;
26 | height: 40px;
27 | border: 4px solid #ebe8e8;
28 | border-radius: 50%;
29 | transition: 1.2s;
30 | }
31 | /* 头像动画 */
32 | .avatar:hover{
33 | transform: rotate(360deg);
34 | -webkit-transform: rotate(360deg);
35 | -moz-transform: rotate(360deg);
36 | -o-transform: rotate(360deg);
37 | -ms-transform: rotate(360deg);
38 | }
39 | .nav_menu{
40 | position: absolute;
41 | top: 16px;
42 | right: 5%;
43 | }
44 | /* 导航 */
45 | .menu_ul{
46 | display: none;
47 | float: left;
48 | margin-block-start: 0;
49 | margin-block-end: 0;
50 | margin: 0 30px 0 0;
51 | height: 30px;
52 | width: auto;
53 | }
54 | .menu_li{
55 | float: left;
56 | list-style: none;
57 | margin-left: 15px;
58 | line-height: 30px;
59 | }
60 | .menu_li a{
61 | font-size: 16px;
62 | color: #7e7e7e;
63 | transition: color 0.2s ease-out,border 0.2s ease-out,opacity 0.2s ease-out;
64 | text-decoration: none;
65 | }
66 | .menu_li a:hover{
67 | color: #1e89f2;
68 | }
69 | /* 定义动画 */
70 | @-webkit-keyframes fadeIn {
71 | 0% {
72 | opacity: 0; /*初始状态 透明度为0*/
73 | }
74 | 50% {
75 | opacity: 0; /*中间状态 透明度为0*/
76 | }
77 | 100% {
78 | opacity: 1; /*结尾状态 透明度为1*/
79 | }
80 | }
81 | /* 伪类出现 */
82 | .nav_menu:hover ul{
83 | display: inline;
84 | -webkit-animation-name: fadeIn; /*动画名称*/
85 | -webkit-animation-duration: 0.8s; /*动画持续时间*/
86 | -webkit-animation-iteration-count: 1; /*动画次数*/
87 | -webkit-animation-delay: 0s; /*延迟时间*/
88 | }
89 | /* 图标icon */
90 | .nav_icon{
91 | float: left;
92 | width: 26px;
93 | height: 26px;
94 | background: url(../images/icon_menu.png);
95 | background-size:100% 100%;
96 | transition: .6s;
97 | cursor: pointer;
98 | }
99 | /* 图标动画icon */
100 | .nav_icon:hover{
101 | background: url(../images/icon_close.png);
102 | background-size:100% 100%;
103 | transform: rotate(360deg);
104 | -webkit-transform: rotate(360deg);
105 | -moz-transform: rotate(360deg);
106 | -o-transform: rotate(360deg);
107 | -ms-transform: rotate(360deg);
108 | }
109 |
110 | .nexmoe-item {
111 | margin: 20px -8px 0 !important;
112 | padding: 15px !important;
113 | border-radius: 5px;
114 | -webkit-box-shadow: 0 0.2em 1em rgba(204, 204, 204, .3);
115 | box-shadow: 0 0.2em 1em rgba(204, 204, 204, .3);
116 | background-color: #fff;
117 | }
118 |
119 | /*路径导航*/
120 | .mdui-toolbar {
121 | width: auto;
122 | margin-top: 30px !important;
123 | }
124 |
125 | .mdui-typo-headline {
126 | padding: 0;
127 | font-size: 15px;
128 | font-weight: normal;
129 | }
130 |
131 | .mdui-toolbar > a:last-child {
132 | opacity: 1;
133 | background-color: #1e89f2;
134 | color: #ffff;
135 | }
136 |
137 | .mdui-toolbar > a {
138 | padding: 0 16px;
139 | line-height: 30px;
140 | border-radius: 30px;
141 | border: 1px solid #eee;
142 | }
143 |
144 | @media screen and (max-width: 980px) {
145 | .mdui-toolbar > a:last-child, .mdui-toolbar > i:first-child {
146 | display: block;
147 | }
148 |
149 | .mdui-toolbar > a , .mdui-toolbar > i{
150 | display: none;
151 | }
152 |
153 |
154 | .mdui-list-item .mdui-text-right{
155 | display:none
156 | }
157 |
158 | }
159 |
160 | .mdui-toolbar > * {
161 | /*opacity: .5;*/
162 | margin: 0;
163 | }
164 |
165 | .mdui-select {
166 | padding-right: 50px;
167 | margin-right: 20px !important;
168 | }
169 |
170 | .mdui-select-selected {
171 | right: 10px;
172 | }
173 |
174 | .mdui-select-menu {
175 | -webkit-box-shadow: 0 0.2em 1em rgba(100, 100, 100, 0.2);
176 | box-shadow: 0 0.2em 1em rgba(100, 100, 100, 0.2);
177 | }
178 |
179 | .mdui-textfield-expandable {
180 | width: 30px;
181 | }
182 |
183 | .mdui-textfield-expandable .mdui-textfield-icon {
184 | top: 4%;
185 | }
186 |
187 | .mdui-list {
188 | padding: 0;
189 | }
190 |
191 | .mdui-list > .th {
192 | border: none;
193 | }
194 |
195 | .mdui-list-item {
196 | margin: 0 !important;
197 | border-radius: 5px;
198 | padding: 0 10px 0 5px !important;
199 | border: 1px solid #eee;
200 | margin-bottom: 10px !important;
201 | }
202 |
203 | .mdui-text-color-blue-grey-500 {
204 | margin-top: 20px;
205 | color: #000000 !important;
206 | }
207 |
208 | .mdui-typo {
209 | padding: 10px 30px !important;
210 | }
211 |
212 | .mdui-overlay {
213 | background-color: rgba(0,0,0,0.5);
214 | }
215 |
216 | .mdui-dialog {
217 | border-radius: 10px;
218 | -webkit-box-shadow: 0 0.2em 1em rgba(50, 50, 50, 0.8);
219 | box-shadow: 0 0.2em 1em rgba(50, 50, 50, 0.8);
220 | }
221 |
222 | .nav-style > a:hover {
223 | background-color: #1e89f2;
224 | color: #ffff;
225 | }
--------------------------------------------------------------------------------
/GoIndex.js:
--------------------------------------------------------------------------------
1 | var authConfig = {
2 | "siteName": "GoIndex", // 网站名称
3 | "siteIcon": "", // 网站图标
4 | "root_pass": "", // 根目录密码,优先于.password
5 | "version": "1.0.6", // 程序版本
6 | "theme": "classic", // material classic
7 | "client_id": "",
8 | "client_secret": "",
9 | "refresh_token": "", // 授权 token
10 | "root": "" // 根目录ID
11 | };
12 |
13 | var gd;
14 |
15 | var html = `
16 |
17 |
18 |
19 |
20 |
21 | ${authConfig.siteName}
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | `;
30 |
31 | addEventListener('fetch', event => {
32 | event.respondWith(handleRequest(event.request));
33 | });
34 |
35 | /**
36 | * Fetch and log a request
37 | * @param {Request} request
38 | */
39 | async function handleRequest(request) {
40 | if (gd == undefined) {
41 | gd = new googleDrive(authConfig);
42 | }
43 |
44 | if (request.method == 'POST') {
45 | return apiRequest(request);
46 | }
47 |
48 | let url = new URL(request.url);
49 | let path = url.pathname;
50 | let action = url.searchParams.get('a');
51 |
52 | if (path.substr(-1) == '/') {
53 | try {
54 | await gd.list(path);
55 | } catch (e) {
56 | return new Response("", { status: 404 }); // if path: /notexist/
57 | }
58 | return new Response(html, { status: 200, headers: { 'Content-Type': 'text/html; charset=utf-8' } });
59 | } else if (action != null) {
60 | if (await gd.file(path) == undefined) {
61 | return new Response(html404, { status: 404, headers: { 'Content-Type': 'text/html; charset=utf-8' } });
62 | }
63 | return new Response(html, { status: 200, headers: { 'Content-Type': 'text/html; charset=utf-8' } });
64 | } else {
65 | if (path.split('/').pop().toLowerCase() == ".password") {
66 | return new Response("", { status: 404 });
67 | }
68 | try {
69 | await gd.file(path);
70 | } catch (e) {
71 | return new Response("", { status: 404 }); // if path: /notexist/notexist
72 | }
73 | let file = await gd.file(path);
74 | if (file == undefined) {
75 | return new Response("", { status: 404 }); // if path: /exist/notexist
76 | }
77 |
78 | let range = request.headers.get('Range');
79 | return gd.down(file.id, range);
80 | }
81 | }
82 |
83 |
84 | async function apiRequest(request) {
85 | let url = new URL(request.url);
86 | let path = url.pathname;
87 |
88 | let option = { status: 200, headers: { 'Access-Control-Allow-Origin': '*' } }
89 |
90 | if (path.substr(-1) == '/') {
91 | // check password
92 | let password = await gd.password(path);
93 | console.log("dir password", password);
94 | if (password != undefined && password != null && password != "") {
95 | try {
96 | var obj = await request.json();
97 | } catch (e) {
98 | var obj = {};
99 | }
100 | console.log(password, obj);
101 | if (password.replace("\n", "") != obj.password) {
102 | let html = `{"error": {"code": 401,"message": "password error."}}`;
103 | return new Response(html, option);
104 | }
105 | }
106 | let list = await gd.list(path);
107 | return new Response(JSON.stringify(list), option);
108 | } else {
109 | let file = await gd.file(path);
110 | let range = request.headers.get('Range');
111 | return new Response(JSON.stringify(file));
112 | }
113 | }
114 |
115 | class googleDrive {
116 | constructor(authConfig) {
117 | this.authConfig = authConfig;
118 | this.paths = [];
119 | this.files = [];
120 | this.passwords = [];
121 | this.paths["/"] = authConfig.root;
122 | if (authConfig.root_pass != "") {
123 | this.passwords["/"] = authConfig.root_pass;
124 | }
125 | this.accessToken();
126 | }
127 |
128 | async down(id, range = '') {
129 | let url = `https://www.googleapis.com/drive/v3/files/${id}?alt=media`;
130 | let requestOption = await this.requestOption();
131 | requestOption.headers['Range'] = range;
132 | return await fetch(url, requestOption);
133 | }
134 |
135 | async file(path) {
136 | if (typeof this.files[path] == 'undefined') {
137 | this.files[path] = await this._file(path);
138 | }
139 | return this.files[path];
140 | }
141 |
142 | async _file(path) {
143 | let arr = path.split('/');
144 | let name = arr.pop();
145 | name = decodeURIComponent(name).replace(/\'/g, "\\'");
146 | let dir = arr.join('/') + '/';
147 | console.log(name, dir);
148 | let parent = await this.findPathId(dir);
149 | console.log(parent);
150 | let url = 'https://www.googleapis.com/drive/v3/files';
151 | let params = { 'includeItemsFromAllDrives': true, 'supportsAllDrives': true };
152 | params.q = `'${parent}' in parents and name = '${name}' andtrashed = false`;
153 | params.fields = "files(id, name, mimeType, size ,createdTime, modifiedTime, iconLink, thumbnailLink, shortcutDetails)";
154 | url += '?' + this.enQuery(params);
155 | let requestOption = await this.requestOption();
156 | let response = await fetch(url, requestOption);
157 | let obj = await response.json();
158 | if (obj.files && obj.files[0] && obj.files[0].mimeType == 'application/vnd.google-apps.shortcut') {
159 | obj.files[0].id = obj.files[0].shortcutDetails.targetId;
160 | obj.files[0].mimeType = obj.files[0].shortcutDetails.targetMimeType;
161 | }
162 | console.log(obj);
163 | return obj.files[0];
164 | }
165 |
166 | // 通过reqeust cache 来缓存
167 | async list(path) {
168 | if (gd.cache == undefined) {
169 | gd.cache = {};
170 | }
171 |
172 | if (gd.cache[path]) {
173 | return gd.cache[path];
174 | }
175 |
176 | let id = await this.findPathId(path);
177 | var obj = await this._ls(id);
178 | if (obj.files && obj.files.length > 1000) {
179 | gd.cache[path] = obj;
180 | }
181 |
182 | return obj
183 | }
184 |
185 | async password(path) {
186 | if (this.passwords[path] !== undefined) {
187 | return this.passwords[path];
188 | }
189 |
190 | console.log("load", path, ".password", this.passwords[path]);
191 |
192 | let file = await gd.file(path + '.password');
193 | if (file == undefined) {
194 | this.passwords[path] = null;
195 | } else {
196 | let url = `https://www.googleapis.com/drive/v3/files/${file.id}?alt=media`;
197 | let requestOption = await this.requestOption();
198 | let response = await this.fetch200(url, requestOption);
199 | this.passwords[path] = await response.text();
200 | }
201 |
202 | return this.passwords[path];
203 | }
204 |
205 | async _ls(parent) {
206 | console.log("_ls", parent);
207 |
208 | if (parent == undefined) {
209 | return null;
210 | }
211 | const files = [];
212 | let pageToken;
213 | let obj;
214 | let params = { 'includeItemsFromAllDrives': true, 'supportsAllDrives': true };
215 | params.q = `'${parent}' in parents and trashed = false AND name !='.password'`;
216 | params.orderBy = 'folder,name,modifiedTime desc';
217 | params.fields = "nextPageToken, files(id, name, mimeType, size , modifiedTime, shortcutDetails)";
218 | params.pageSize = 1000;
219 |
220 | do {
221 | if (pageToken) {
222 | params.pageToken = pageToken;
223 | }
224 | let url = 'https://www.googleapis.com/drive/v3/files';
225 | url += '?' + this.enQuery(params);
226 | let requestOption = await this.requestOption();
227 | let response = await fetch(url, requestOption);
228 | obj = await response.json();
229 | obj.files.forEach(file => {
230 | if (file && file.mimeType == 'application/vnd.google-apps.shortcut') {
231 | file.id = file.shortcutDetails.targetId;
232 | file.mimeType = file.shortcutDetails.targetMimeType;
233 | }
234 | });
235 | files.push(...obj.files);
236 | pageToken = obj.nextPageToken;
237 | } while (pageToken);
238 |
239 | obj.files = files;
240 | return obj;
241 | }
242 |
243 | async findPathId(path) {
244 | let c_path = '/';
245 | let c_id = this.paths[c_path];
246 |
247 | let arr = path.trim('/').split('/');
248 | for (let name of arr) {
249 | c_path += name + '/';
250 |
251 | if (typeof this.paths[c_path] == 'undefined') {
252 | let id = await this._findDirId(c_id, name);
253 | this.paths[c_path] = id;
254 | }
255 |
256 | c_id = this.paths[c_path];
257 | if (c_id == undefined || c_id == null) {
258 | break;
259 | }
260 | }
261 | console.log(this.paths);
262 | return this.paths[path];
263 | }
264 |
265 | async _findDirId(parent, name) {
266 | name = decodeURIComponent(name).replace(/\'/g, "\\'");
267 |
268 | console.log("_findDirId", parent, name);
269 |
270 | if (parent == undefined) {
271 | return null;
272 | }
273 |
274 | let url = 'https://www.googleapis.com/drive/v3/files';
275 | let params = { 'includeItemsFromAllDrives': true, 'supportsAllDrives': true };
276 | params.q = `'${parent}' in parents and (mimeType = 'application/vnd.google-apps.folder' or mimeType = 'application/vnd.google-apps.shortcut') and name = '${name}' and trashed = false`;
277 | params.fields = "nextPageToken, files(id, name, mimeType, shortcutDetails)";
278 | url += '?' + this.enQuery(params);
279 | let requestOption = await this.requestOption();
280 | let response = await fetch(url, requestOption);
281 | let obj = await response.json();
282 | if (obj.files[0] == undefined) {
283 | return null;
284 | }
285 | if (obj.files[0].mimeType == 'application/vnd.google-apps.shortcut' && obj.files[0].shortcutDetails.targetMimeType == 'application/vnd.google-apps.folder') {
286 | obj.files[0].id = obj.files[0].shortcutDetails.targetId;
287 | } else if (obj.files[0].mimeType == 'application/vnd.google-apps.shortcut' && obj.files[0].shortcutDetails.targetMimeType != 'application/vnd.google-apps.folder') {
288 | return null;
289 | }
290 | return obj.files[0].id;
291 | }
292 |
293 | async accessToken() {
294 | console.log("accessToken");
295 | if (this.authConfig.expires == undefined || this.authConfig.expires < Date.now()) {
296 | const obj = await this.fetchAccessToken();
297 | if (obj.access_token != undefined) {
298 | this.authConfig.accessToken = obj.access_token;
299 | this.authConfig.expires = Date.now() + 3500 * 1000;
300 | }
301 | }
302 | return this.authConfig.accessToken;
303 | }
304 |
305 | async fetchAccessToken() {
306 | console.log("fetchAccessToken");
307 | const url = "https://www.googleapis.com/oauth2/v4/token";
308 | const headers = {
309 | 'Content-Type': 'application/x-www-form-urlencoded'
310 | };
311 | const post_data = {
312 | 'client_id': this.authConfig.client_id,
313 | 'client_secret': this.authConfig.client_secret,
314 | 'refresh_token': this.authConfig.refresh_token,
315 | 'grant_type': 'refresh_token'
316 | }
317 |
318 | let requestOption = {
319 | 'method': 'POST',
320 | 'headers': headers,
321 | 'body': this.enQuery(post_data)
322 | };
323 |
324 | const response = await fetch(url, requestOption);
325 | return await response.json();
326 | }
327 |
328 | async fetch200(url, requestOption) {
329 | let response;
330 | for (let i = 0; i < 3; i++) {
331 | response = await fetch(url, requestOption);
332 | console.log(response.status);
333 | if (response.status != 403) {
334 | break;
335 | }
336 | await this.sleep(800 * (i + 1));
337 | }
338 | return response;
339 | }
340 |
341 | async requestOption(headers = {}, method = 'GET') {
342 | const accessToken = await this.accessToken();
343 | headers['authorization'] = 'Bearer ' + accessToken;
344 | return { 'method': method, 'headers': headers };
345 | }
346 |
347 | enQuery(data) {
348 | const ret = [];
349 | for (let d in data) {
350 | ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));
351 | }
352 | return ret.join('&');
353 | }
354 |
355 | sleep(ms) {
356 | return new Promise(function (resolve, reject) {
357 | let i = 0;
358 | setTimeout(function () {
359 | console.log('sleep' + ms);
360 | i++;
361 | if (i >= 2) reject(new Error('i>=2'));
362 | else resolve(i);
363 | }, ms);
364 | })
365 | }
366 | }
367 |
368 | String.prototype.trim = function (char) {
369 | if (char) {
370 | return this.replace(new RegExp('^\\' + char + '+|\\' + char + '+$', 'g'), '');
371 | }
372 | return this.replace(/^\s+|\s+$/g, '');
373 | };
--------------------------------------------------------------------------------
/GoIndex_v2.js:
--------------------------------------------------------------------------------
1 | const authConfig = {
2 | "siteName": "GoIndex", // 网站名称
3 | "siteIcon": "", // 网站图标
4 | "version": "_4.28", // 程序版本。用户不要手动修改
5 | /*"client_id": "202264815644.apps.googleusercontent.com",
6 | "client_secret": "X4Z3ca8xfWDb1Voo-F9a7ZxJ",*/
7 | // 【注意】强烈推荐使用自己的 client_id 和 client_secret
8 | "client_id": "",
9 | "client_secret": "",
10 | "refresh_token": "", // 授权 token
11 | /**
12 | * 设置要显示的多个云端硬盘;按格式添加多个
13 | * [id]: 可以是 团队盘id、子文件夹id、或者"root"(代表个人盘根目录);
14 | * [name]: 显示的名称
15 | * [user]: Basic Auth 的用户名
16 | * [pass]: Basic Auth 的密码
17 | * [protect_file_link]: Basic Auth 是否用于保护文件链接,默认值(不设置时)为 false,即不保护文件链接(方便 直链下载/外部播放 等)
18 | * 每个盘的 Basic Auth 都可以单独设置。Basic Auth 默认保护该盘下所有文件夹/子文件夹路径
19 | * 【注意】默认不保护文件链接,这样可以方便 直链下载/外部播放;
20 | * 如果要保护文件链接,需要将 protect_file_link 设置为 true,此时如果要进行外部播放等操作,需要将 host 替换为 user:pass@host 的 形式
21 | * 不需要 Basic Auth 的盘,保持 user 和 pass 同时为空即可。(直接不设置也可以)
22 | * 【注意】对于id设置为为子文件夹id的盘将不支持搜索功能(不影响其他盘)。
23 | */
24 | "roots": [
25 | {
26 | id: "root",
27 | name: "个人盘"
28 | },
29 | {
30 | id: "drive_id",
31 | name: "团队盘1",
32 | user: 'user1',
33 | pass: "111",
34 | protect_file_link: true
35 | },
36 | {
37 | id: "folder_id",
38 | name: "文件夹",
39 | // 只设置密码、只设置用户名、同时设置用户名密码,都是可以的
40 | user: '',
41 | pass: "222",
42 | protect_file_link: false
43 | }
44 | ],
45 | /**
46 | * 文件列表页面每页显示的数量。【推荐设置值为 100 到 1000 之间】;
47 | * 如果设置大于1000,会导致请求 drive api 时出错;
48 | * 如果设置的值过小,会导致文件列表页面滚动条增量加载(分页加载)失效;
49 | * 此值的另一个作用是,如果目录内文件数大于此设置值(即需要多页展示的),将会对首次列目录结果进行缓存。
50 | */
51 | "files_list_page_size": 500,
52 | /**
53 | * 搜索结果页面每页显示的数量。【推荐设置值为 50 到 1000 之间】;
54 | * 如果设置大于1000,会导致请求 drive api 时出错;
55 | * 如果设置的值过小,会导致搜索结果页面滚动条增量加载(分页加载)失效;
56 | * 此值的大小影响搜索操作的响应速度。
57 | */
58 | "search_result_list_page_size": 50,
59 | // 确认有 cors 用途的可以开启
60 | "enable_cors_file_down": false,
61 | /**
62 | * 上面的 basic auth 已经包含了盘内全局保护的功能。所以默认不再去认证 .password 文件内的密码;
63 | * 如果在全局认证的基础上,仍需要给某些目录单独进行 .password 文件内的密码验证的话,将此选项设置为 true;
64 | * 【注意】如果开启了 .password 文件密码验证,每次列目录都会额外增加查询目录内 .password 文件是否存在的开销。
65 | */
66 | "enable_password_file_verify": false
67 | };
68 |
69 | /**
70 | * web ui 设置
71 | */
72 | const uiConfig = {
73 | // 此版本只支持 material
74 | "theme": "material", // DO NOT set it to classic
75 | "dark_mode": false,
76 | "main_color": "blue-grey",
77 | "accent_color": "blue",
78 | /*"main_color": "light-green",
79 | "accent_color": "green",*/
80 | "fluid_navigation_bar": true,
81 | };
82 |
83 | /**
84 | * global functions
85 | */
86 | const FUNCS = {
87 | /**
88 | * 转换成针对谷歌搜索词法相对安全的搜索关键词
89 | */
90 | formatSearchKeyword: function (keyword) {
91 | let nothing = "";
92 | let space = " ";
93 | if (!keyword) return nothing;
94 | return keyword.replace(/(!=)|['"=<>/\\:]/g, nothing)
95 | .replace(/[,,|(){}]/g, space)
96 | .trim()
97 | }
98 |
99 | };
100 |
101 | /**
102 | * global consts
103 | * @type {{folder_mime_type: string, default_file_fields: string, gd_root_type: {share_drive: number, user_drive: number, sub_folder: number}}}
104 | */
105 | const CONSTS = new (class {
106 | default_file_fields = 'parents,id,name,mimeType,modifiedTime,createdTime,fileExtension,size';
107 | gd_root_type = {
108 | user_drive: 0,
109 | share_drive: 1,
110 | sub_folder: 2
111 | };
112 | folder_mime_type = 'application/vnd.google-apps.folder';
113 | })();
114 |
115 |
116 | // gd instances
117 | var gds = [];
118 |
119 | function html(current_drive_order = 0, model = {}) {
120 | return `
121 |
122 |
123 |
124 |
125 |
126 | ${authConfig.siteName}
127 |
128 |
134 |
135 |
136 |
137 |
138 |
139 | `;
140 | };
141 |
142 | addEventListener('fetch', event => {
143 | event.respondWith(handleRequest(event.request));
144 | });
145 |
146 | /**
147 | * Fetch and log a request
148 | * @param {Request} request
149 | */
150 | async function handleRequest(request) {
151 | if (gds.length === 0) {
152 | for (let i = 0; i < authConfig.roots.length; i++) {
153 | const gd = new googleDrive(authConfig, i);
154 | await gd.init();
155 | gds.push(gd)
156 | }
157 | // 这个操作并行,提高效率
158 | let tasks = [];
159 | gds.forEach(gd => {
160 | tasks.push(gd.initRootType());
161 | });
162 | for (let task of tasks) {
163 | await task;
164 | }
165 | }
166 |
167 | // 从 path 中提取 drive order
168 | // 并根据 drive order 获取对应的 gd instance
169 | let gd;
170 | let url = new URL(request.url);
171 | let path = url.pathname;
172 |
173 | /**
174 | * 重定向至起始页
175 | * @returns {Response}
176 | */
177 | function redirectToIndexPage() {
178 | return new Response('', {status: 301, headers: {'Location': `${url.origin}/0:/`}});
179 | }
180 |
181 | if (path == '/') return redirectToIndexPage();
182 | if (path.toLowerCase() == '/favicon.ico') {
183 | // 后面可以找一个 favicon
184 | return new Response('', {status: 404})
185 | }
186 |
187 | // 特殊命令格式
188 | const command_reg = /^\/(?\d+):(?[a-zA-Z0-9]+)$/g;
189 | const match = command_reg.exec(path);
190 | if (match) {
191 | const num = match.groups.num;
192 | const order = Number(num);
193 | if (order >= 0 && order < gds.length) {
194 | gd = gds[order];
195 | } else {
196 | return redirectToIndexPage()
197 | }
198 | // basic auth
199 | for (const r = gd.basicAuthResponse(request); r;) return r;
200 | const command = match.groups.command;
201 | // 搜索
202 | if (command === 'search') {
203 | if (request.method === 'POST') {
204 | // 搜索结果
205 | return handleSearch(request, gd);
206 | } else {
207 | const params = url.searchParams;
208 | // 搜索页面
209 | return new Response(html(gd.order, {
210 | q: params.get("q") || '',
211 | is_search_page: true,
212 | root_type: gd.root_type
213 | }),
214 | {
215 | status: 200,
216 | headers: {'Content-Type': 'text/html; charset=utf-8'}
217 | });
218 | }
219 | } else if (command === 'id2path' && request.method === 'POST') {
220 | return handleId2Path(request, gd)
221 | }
222 | }
223 |
224 | // 期望的 path 格式
225 | const common_reg = /^\/\d+:\/.*$/g;
226 | try {
227 | if (!path.match(common_reg)) {
228 | return redirectToIndexPage();
229 | }
230 | let split = path.split("/");
231 | let order = Number(split[1].slice(0, -1));
232 | if (order >= 0 && order < gds.length) {
233 | gd = gds[order];
234 | } else {
235 | return redirectToIndexPage()
236 | }
237 | } catch (e) {
238 | return redirectToIndexPage()
239 | }
240 |
241 | // basic auth
242 | // for (const r = gd.basicAuthResponse(request); r;) return r;
243 | const basic_auth_res = gd.basicAuthResponse(request);
244 |
245 | path = path.replace(gd.url_path_prefix, '') || '/';
246 | if (request.method == 'POST') {
247 | return basic_auth_res || apiRequest(request, gd);
248 | }
249 |
250 | let action = url.searchParams.get('a');
251 |
252 | if (path.substr(-1) == '/' || action != null) {
253 | return basic_auth_res || new Response(html(gd.order, {root_type: gd.root_type}), {
254 | status: 200,
255 | headers: {'Content-Type': 'text/html; charset=utf-8'}
256 | });
257 | } else {
258 | if (path.split('/').pop().toLowerCase() == ".password") {
259 | return basic_auth_res || new Response("", {status: 404});
260 | }
261 | let file = await gd.file(path);
262 | let range = request.headers.get('Range');
263 | const inline_down = 'true' === url.searchParams.get('inline');
264 | if (gd.root.protect_file_link && basic_auth_res) return basic_auth_res;
265 | return gd.down(file.id, range, inline_down);
266 | }
267 | }
268 |
269 |
270 | async function apiRequest(request, gd) {
271 | let url = new URL(request.url);
272 | let path = url.pathname;
273 | path = path.replace(gd.url_path_prefix, '') || '/';
274 |
275 | let option = {status: 200, headers: {'Access-Control-Allow-Origin': '*'}}
276 |
277 | if (path.substr(-1) == '/') {
278 | let form = await request.formData();
279 | // 这样可以提升首次列目录时的速度。缺点是,如果password验证失败,也依然会产生列目录的开销
280 | let deferred_list_result = gd.list(path, form.get('page_token'), Number(form.get('page_index')));
281 |
282 | // check .password file, if `enable_password_file_verify` is true
283 | if (authConfig['enable_password_file_verify']) {
284 | let password = await gd.password(path);
285 | // console.log("dir password", password);
286 | if (password && password.replace("\n", "") !== form.get('password')) {
287 | let html = `{"error": {"code": 401,"message": "password error."}}`;
288 | return new Response(html, option);
289 | }
290 | }
291 |
292 | let list_result = await deferred_list_result;
293 | return new Response(JSON.stringify(list_result), option);
294 | } else {
295 | let file = await gd.file(path);
296 | let range = request.headers.get('Range');
297 | return new Response(JSON.stringify(file));
298 | }
299 | }
300 |
301 | // 处理 search
302 | async function handleSearch(request, gd) {
303 | const option = {status: 200, headers: {'Access-Control-Allow-Origin': '*'}};
304 | let form = await request.formData();
305 | let search_result = await
306 | gd.search(form.get('q') || '', form.get('page_token'), Number(form.get('page_index')));
307 | return new Response(JSON.stringify(search_result), option);
308 | }
309 |
310 | /**
311 | * 处理 id2path
312 | * @param request 需要 id 参数
313 | * @param gd
314 | * @returns {Promise} 【注意】如果从前台接收的id代表的项目不在目标gd盘下,那么response会返回给前台一个空字符串""
315 | */
316 | async function handleId2Path(request, gd) {
317 | const option = {status: 200, headers: {'Access-Control-Allow-Origin': '*'}};
318 | let form = await request.formData();
319 | let path = await gd.findPathById(form.get('id'));
320 | return new Response(path || '', option);
321 | }
322 |
323 | class googleDrive {
324 | constructor(authConfig, order) {
325 | // 每个盘对应一个order,对应一个gd实例
326 | this.order = order;
327 | this.root = authConfig.roots[order];
328 | this.root.protect_file_link = this.root.protect_file_link || false;
329 | this.url_path_prefix = `/${order}:`;
330 | this.authConfig = authConfig;
331 | // TODO: 这些缓存的失效刷新策略,后期可以制定一下
332 | // path id
333 | this.paths = [];
334 | // path file
335 | this.files = [];
336 | // path pass
337 | this.passwords = [];
338 | // id <-> path
339 | this.id_path_cache = {};
340 | this.id_path_cache[this.root['id']] = '/';
341 | this.paths["/"] = this.root['id'];
342 | /*if (this.root['pass'] != "") {
343 | this.passwords['/'] = this.root['pass'];
344 | }*/
345 | // this.init();
346 | }
347 |
348 | /**
349 | * 初次授权;然后获取 user_drive_real_root_id
350 | * @returns {Promise}
351 | */
352 | async init() {
353 | await this.accessToken();
354 | /*await (async () => {
355 | // 只获取1次
356 | if (authConfig.user_drive_real_root_id) return;
357 | const root_obj = await (gds[0] || this).findItemById('root');
358 | if (root_obj && root_obj.id) {
359 | authConfig.user_drive_real_root_id = root_obj.id
360 | }
361 | })();*/
362 | // 等待 user_drive_real_root_id ,只获取1次
363 | if (authConfig.user_drive_real_root_id) return;
364 | const root_obj = await (gds[0] || this).findItemById('root');
365 | if (root_obj && root_obj.id) {
366 | authConfig.user_drive_real_root_id = root_obj.id
367 | }
368 | }
369 |
370 | /**
371 | * 获取根目录类型,设置到 root_type
372 | * @returns {Promise}
373 | */
374 | async initRootType() {
375 | const root_id = this.root['id'];
376 | const types = CONSTS.gd_root_type;
377 | if (root_id === 'root' || root_id === authConfig.user_drive_real_root_id) {
378 | this.root_type = types.user_drive;
379 | } else {
380 | const obj = await this.getShareDriveObjById(root_id);
381 | this.root_type = obj ? types.share_drive : types.sub_folder;
382 | }
383 | }
384 |
385 | /**
386 | * Returns a response that requires authorization, or null
387 | * @param request
388 | * @returns {Response|null}
389 | */
390 | basicAuthResponse(request) {
391 | const user = this.root.user || '',
392 | pass = this.root.pass || '',
393 | _401 = new Response('Unauthorized', {
394 | headers: {'WWW-Authenticate': `Basic realm="goindex:drive:${this.order}"`},
395 | status: 401
396 | });
397 | if (user || pass) {
398 | const auth = request.headers.get('Authorization')
399 | if (auth) {
400 | try {
401 | const [received_user, received_pass] = atob(auth.split(' ').pop()).split(':');
402 | return (received_user === user && received_pass === pass) ? null : _401;
403 | } catch (e) {
404 | }
405 | }
406 | } else return null;
407 | return _401;
408 | }
409 |
410 | async down(id, range = '', inline = false) {
411 | let url = `https://www.googleapis.com/drive/v3/files/${id}?alt=media`;
412 | let requestOption = await this.requestOption();
413 | requestOption.headers['Range'] = range;
414 | let res = await fetch(url, requestOption);
415 | const {headers} = res = new Response(res.body, res)
416 | this.authConfig.enable_cors_file_down && headers.append('Access-Control-Allow-Origin', '*');
417 | inline === true && headers.set('Content-Disposition', 'inline');
418 | return res;
419 | }
420 |
421 | async file(path) {
422 | if (typeof this.files[path] == 'undefined') {
423 | this.files[path] = await this._file(path);
424 | }
425 | return this.files[path];
426 | }
427 |
428 | async _file(path) {
429 | let arr = path.split('/');
430 | let name = arr.pop();
431 | name = decodeURIComponent(name).replace(/\'/g, "\\'");
432 | let dir = arr.join('/') + '/';
433 | // console.log(name, dir);
434 | let parent = await this.findPathId(dir);
435 | // console.log(parent);
436 | let url = 'https://www.googleapis.com/drive/v3/files';
437 | let params = {'includeItemsFromAllDrives': true, 'supportsAllDrives': true};
438 | params.q = `'${parent}' in parents and name = '${name}' and trashed = false`;
439 | params.fields = "files(id, name, mimeType, size ,createdTime, modifiedTime, iconLink, thumbnailLink)";
440 | url += '?' + this.enQuery(params);
441 | let requestOption = await this.requestOption();
442 | let response = await fetch(url, requestOption);
443 | let obj = await response.json();
444 | // console.log(obj);
445 | return obj.files[0];
446 | }
447 |
448 | // 通过reqeust cache 来缓存
449 | async list(path, page_token = null, page_index = 0) {
450 | if (this.path_children_cache == undefined) {
451 | // { :[ {nextPageToken:'',data:{}}, {nextPageToken:'',data:{}} ...], ...}
452 | this.path_children_cache = {};
453 | }
454 |
455 | if (this.path_children_cache[path]
456 | && this.path_children_cache[path][page_index]
457 | && this.path_children_cache[path][page_index].data
458 | ) {
459 | let child_obj = this.path_children_cache[path][page_index];
460 | return {
461 | nextPageToken: child_obj.nextPageToken || null,
462 | curPageIndex: page_index,
463 | data: child_obj.data
464 | };
465 | }
466 |
467 | let id = await this.findPathId(path);
468 | let result = await this._ls(id, page_token, page_index);
469 | let data = result.data;
470 | // 对有多页的,进行缓存
471 | if (result.nextPageToken && data.files) {
472 | if (!Array.isArray(this.path_children_cache[path])) {
473 | this.path_children_cache[path] = []
474 | }
475 | this.path_children_cache[path][Number(result.curPageIndex)] = {
476 | nextPageToken: result.nextPageToken,
477 | data: data
478 | };
479 | }
480 |
481 | return result
482 | }
483 |
484 |
485 | async _ls(parent, page_token = null, page_index = 0) {
486 | // console.log("_ls", parent);
487 |
488 | if (parent == undefined) {
489 | return null;
490 | }
491 | let obj;
492 | let params = {'includeItemsFromAllDrives': true, 'supportsAllDrives': true};
493 | params.q = `'${parent}' in parents and trashed = false AND name !='.password'`;
494 | params.orderBy = 'folder,name,modifiedTime desc';
495 | params.fields = "nextPageToken, files(id, name, mimeType, size , modifiedTime)";
496 | params.pageSize = this.authConfig.files_list_page_size;
497 |
498 | if (page_token) {
499 | params.pageToken = page_token;
500 | }
501 | let url = 'https://www.googleapis.com/drive/v3/files';
502 | url += '?' + this.enQuery(params);
503 | let requestOption = await this.requestOption();
504 | let response = await fetch(url, requestOption);
505 | obj = await response.json();
506 |
507 | return {
508 | nextPageToken: obj.nextPageToken || null,
509 | curPageIndex: page_index,
510 | data: obj
511 | };
512 |
513 | /*do {
514 | if (pageToken) {
515 | params.pageToken = pageToken;
516 | }
517 | let url = 'https://www.googleapis.com/drive/v3/files';
518 | url += '?' + this.enQuery(params);
519 | let requestOption = await this.requestOption();
520 | let response = await fetch(url, requestOption);
521 | obj = await response.json();
522 | files.push(...obj.files);
523 | pageToken = obj.nextPageToken;
524 | } while (pageToken);*/
525 |
526 | }
527 |
528 | async password(path) {
529 | if (this.passwords[path] !== undefined) {
530 | return this.passwords[path];
531 | }
532 |
533 | // console.log("load", path, ".password", this.passwords[path]);
534 |
535 | let file = await this.file(path + '.password');
536 | if (file == undefined) {
537 | this.passwords[path] = null;
538 | } else {
539 | let url = `https://www.googleapis.com/drive/v3/files/${file.id}?alt=media`;
540 | let requestOption = await this.requestOption();
541 | let response = await this.fetch200(url, requestOption);
542 | this.passwords[path] = await response.text();
543 | }
544 |
545 | return this.passwords[path];
546 | }
547 |
548 |
549 | /**
550 | * 通过 id 获取 share drive 信息
551 | * @param any_id
552 | * @returns {Promise} 任何非正常情况都返回 null
553 | */
554 | async getShareDriveObjById(any_id) {
555 | if (!any_id) return null;
556 | if ('string' !== typeof any_id) return null;
557 |
558 | let url = `https://www.googleapis.com/drive/v3/drives/${any_id}`;
559 | let requestOption = await this.requestOption();
560 | let res = await fetch(url, requestOption);
561 | let obj = await res.json();
562 | if (obj && obj.id) return obj;
563 |
564 | return null
565 | }
566 |
567 |
568 | /**
569 | * 搜索
570 | * @returns {Promise<{data: null, nextPageToken: null, curPageIndex: number}>}
571 | */
572 | async search(origin_keyword, page_token = null, page_index = 0) {
573 | const types = CONSTS.gd_root_type;
574 | const is_user_drive = this.root_type === types.user_drive;
575 | const is_share_drive = this.root_type === types.share_drive;
576 |
577 | const empty_result = {
578 | nextPageToken: null,
579 | curPageIndex: page_index,
580 | data: null
581 | };
582 |
583 | if (!is_user_drive && !is_share_drive) {
584 | return empty_result;
585 | }
586 | let keyword = FUNCS.formatSearchKeyword(origin_keyword);
587 | if (!keyword) {
588 | // 关键词为空,返回
589 | return empty_result;
590 | }
591 | let words = keyword.split(/\s+/);
592 | let name_search_str = `name contains '${words.join("' AND name contains '")}'`;
593 |
594 | // corpora 为 user 是个人盘 ,为 drive 是团队盘。配合 driveId
595 | let params = {};
596 | if (is_user_drive) {
597 | params.corpora = 'user'
598 | }
599 | if (is_share_drive) {
600 | params.corpora = 'drive';
601 | params.driveId = this.root.id;
602 | // This parameter will only be effective until June 1, 2020. Afterwards shared drive items will be included in the results.
603 | params.includeItemsFromAllDrives = true;
604 | params.supportsAllDrives = true;
605 | }
606 | if (page_token) {
607 | params.pageToken = page_token;
608 | }
609 | params.q = `trashed = false AND name !='.password' AND (${name_search_str})`;
610 | params.fields = "nextPageToken, files(id, name, mimeType, size , modifiedTime)";
611 | params.pageSize = this.authConfig.search_result_list_page_size;
612 | // params.orderBy = 'folder,name,modifiedTime desc';
613 |
614 | let url = 'https://www.googleapis.com/drive/v3/files';
615 | url += '?' + this.enQuery(params);
616 | // console.log(params)
617 | let requestOption = await this.requestOption();
618 | let response = await fetch(url, requestOption);
619 | let res_obj = await response.json();
620 |
621 | return {
622 | nextPageToken: res_obj.nextPageToken || null,
623 | curPageIndex: page_index,
624 | data: res_obj
625 | };
626 | }
627 |
628 |
629 | /**
630 | * 一层一层的向上获取这个文件或文件夹的上级文件夹的 file 对象。注意:会很慢!!!
631 | * 最多向上寻找到当前 gd 对象的根目录 (root id)
632 | * 只考虑一条单独的向上链。
633 | * 【注意】如果此id代表的项目不在目标gd盘下,那么此函数会返回null
634 | *
635 | * @param child_id
636 | * @param contain_myself
637 | * @returns {Promise<[]>}
638 | */
639 | async findParentFilesRecursion(child_id, contain_myself = true) {
640 | const gd = this;
641 | const gd_root_id = gd.root.id;
642 | const user_drive_real_root_id = authConfig.user_drive_real_root_id;
643 | const is_user_drive = gd.root_type === CONSTS.gd_root_type.user_drive;
644 |
645 | // 自下向上查询的终点目标id
646 | const target_top_id = is_user_drive ? user_drive_real_root_id : gd_root_id;
647 | const fields = CONSTS.default_file_fields;
648 |
649 | // [{},{},...]
650 | const parent_files = [];
651 | let meet_top = false;
652 |
653 | async function addItsFirstParent(file_obj) {
654 | if (!file_obj) return;
655 | if (!file_obj.parents) return;
656 | if (file_obj.parents.length < 1) return;
657 |
658 | // ['','',...]
659 | let p_ids = file_obj.parents;
660 | if (p_ids && p_ids.length > 0) {
661 | // its first parent
662 | const first_p_id = p_ids[0];
663 | if (first_p_id === target_top_id) {
664 | meet_top = true;
665 | return;
666 | }
667 | const p_file_obj = await gd.findItemById(first_p_id);
668 | if (p_file_obj && p_file_obj.id) {
669 | parent_files.push(p_file_obj);
670 | await addItsFirstParent(p_file_obj);
671 | }
672 | }
673 | }
674 |
675 | const child_obj = await gd.findItemById(child_id);
676 | if (contain_myself) {
677 | parent_files.push(child_obj);
678 | }
679 | await addItsFirstParent(child_obj);
680 |
681 | return meet_top ? parent_files : null
682 | }
683 |
684 | /**
685 | * 获取相对于本盘根目录的path
686 | * @param child_id
687 | * @returns {Promise} 【注意】如果此id代表的项目不在目标gd盘下,那么此方法会返回空字符串""
688 | */
689 | async findPathById(child_id) {
690 | if (this.id_path_cache[child_id]) {
691 | return this.id_path_cache[child_id];
692 | }
693 |
694 | const p_files = await this.findParentFilesRecursion(child_id);
695 | if (!p_files || p_files.length < 1) return '';
696 |
697 | let cache = [];
698 | // 把查出来的每一级的path和id都缓存一下
699 | p_files.forEach((value, idx) => {
700 | const is_folder = idx === 0 ? (p_files[idx].mimeType === CONSTS.folder_mime_type) : true;
701 | let path = '/' + p_files.slice(idx).map(it => it.name).reverse().join('/');
702 | if (is_folder) path += '/';
703 | cache.push({id: p_files[idx].id, path: path})
704 | });
705 |
706 | cache.forEach((obj) => {
707 | this.id_path_cache[obj.id] = obj.path;
708 | this.paths[obj.path] = obj.id
709 | });
710 |
711 | /*const is_folder = p_files[0].mimeType === CONSTS.folder_mime_type;
712 | let path = '/' + p_files.map(it => it.name).reverse().join('/');
713 | if (is_folder) path += '/';*/
714 |
715 | return cache[0].path;
716 | }
717 |
718 |
719 | // 根据id获取file item
720 | async findItemById(id) {
721 | const is_user_drive = this.root_type === CONSTS.gd_root_type.user_drive;
722 | let url = `https://www.googleapis.com/drive/v3/files/${id}?fields=${CONSTS.default_file_fields}${is_user_drive ? '' : '&supportsAllDrives=true'}`;
723 | let requestOption = await this.requestOption();
724 | let res = await fetch(url, requestOption);
725 | return await res.json()
726 | }
727 |
728 | async findPathId(path) {
729 | let c_path = '/';
730 | let c_id = this.paths[c_path];
731 |
732 | let arr = path.trim('/').split('/');
733 | for (let name of arr) {
734 | c_path += name + '/';
735 |
736 | if (typeof this.paths[c_path] == 'undefined') {
737 | let id = await this._findDirId(c_id, name);
738 | this.paths[c_path] = id;
739 | }
740 |
741 | c_id = this.paths[c_path];
742 | if (c_id == undefined || c_id == null) {
743 | break;
744 | }
745 | }
746 | // console.log(this.paths);
747 | return this.paths[path];
748 | }
749 |
750 | async _findDirId(parent, name) {
751 | name = decodeURIComponent(name).replace(/\'/g, "\\'");
752 |
753 | // console.log("_findDirId", parent, name);
754 |
755 | if (parent == undefined) {
756 | return null;
757 | }
758 |
759 | let url = 'https://www.googleapis.com/drive/v3/files';
760 | let params = {'includeItemsFromAllDrives': true, 'supportsAllDrives': true};
761 | params.q = `'${parent}' in parents and mimeType = 'application/vnd.google-apps.folder' and name = '${name}' and trashed = false`;
762 | params.fields = "nextPageToken, files(id, name, mimeType)";
763 | url += '?' + this.enQuery(params);
764 | let requestOption = await this.requestOption();
765 | let response = await fetch(url, requestOption);
766 | let obj = await response.json();
767 | if (obj.files[0] == undefined) {
768 | return null;
769 | }
770 | return obj.files[0].id;
771 | }
772 |
773 | async accessToken() {
774 | console.log("accessToken");
775 | if (this.authConfig.expires == undefined || this.authConfig.expires < Date.now()) {
776 | const obj = await this.fetchAccessToken();
777 | if (obj.access_token != undefined) {
778 | this.authConfig.accessToken = obj.access_token;
779 | this.authConfig.expires = Date.now() + 3500 * 1000;
780 | }
781 | }
782 | return this.authConfig.accessToken;
783 | }
784 |
785 | async fetchAccessToken() {
786 | console.log("fetchAccessToken");
787 | const url = "https://www.googleapis.com/oauth2/v4/token";
788 | const headers = {
789 | 'Content-Type': 'application/x-www-form-urlencoded'
790 | };
791 | const post_data = {
792 | 'client_id': this.authConfig.client_id,
793 | 'client_secret': this.authConfig.client_secret,
794 | 'refresh_token': this.authConfig.refresh_token,
795 | 'grant_type': 'refresh_token'
796 | }
797 |
798 | let requestOption = {
799 | 'method': 'POST',
800 | 'headers': headers,
801 | 'body': this.enQuery(post_data)
802 | };
803 |
804 | const response = await fetch(url, requestOption);
805 | return await response.json();
806 | }
807 |
808 | async fetch200(url, requestOption) {
809 | let response;
810 | for (let i = 0; i < 3; i++) {
811 | response = await fetch(url, requestOption);
812 | console.log(response.status);
813 | if (response.status != 403) {
814 | break;
815 | }
816 | await this.sleep(800 * (i + 1));
817 | }
818 | return response;
819 | }
820 |
821 | async requestOption(headers = {}, method = 'GET') {
822 | const accessToken = await this.accessToken();
823 | headers['authorization'] = 'Bearer ' + accessToken;
824 | return {'method': method, 'headers': headers};
825 | }
826 |
827 | enQuery(data) {
828 | const ret = [];
829 | for (let d in data) {
830 | ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));
831 | }
832 | return ret.join('&');
833 | }
834 |
835 | sleep(ms) {
836 | return new Promise(function (resolve, reject) {
837 | let i = 0;
838 | setTimeout(function () {
839 | console.log('sleep' + ms);
840 | i++;
841 | if (i >= 2) reject(new Error('i>=2'));
842 | else resolve(i);
843 | }, ms);
844 | })
845 | }
846 | }
847 |
848 | String.prototype.trim = function (char) {
849 | if (char) {
850 | return this.replace(new RegExp('^\\' + char + '+|\\' + char + '+$', 'g'), '');
851 | }
852 | return this.replace(/^\s+|\s+$/g, '');
853 | };
854 | //# sourceMappingURL=/sm/66a94fc3ec45fb7c78cc4edadd8e448d9b1c735f8c0cebcf7bbb4b40b9caacde.map
--------------------------------------------------------------------------------
/js/ext-language_tools.js:
--------------------------------------------------------------------------------
1 | define("ace/snippets",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/anchor","ace/keyboard/hash_handler","ace/tokenizer","ace/lib/dom","ace/editor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=e("./lib/lang"),o=e("./range").Range,u=e("./anchor").Anchor,a=e("./keyboard/hash_handler").HashHandler,f=e("./tokenizer").Tokenizer,l=o.comparePoints,c=function(){this.snippetMap={},this.snippetNameMap={}};(function(){r.implement(this,i),this.getTokenizer=function(){function e(e,t,n){return e=e.substr(1),/^\d+$/.test(e)&&!n.inFormatString?[{tabstopId:parseInt(e,10)}]:[{text:e}]}function t(e){return"(?:[^\\\\"+e+"]|\\\\.)"}return c.$tokenizer=new f({start:[{regex:/:/,onMatch:function(e,t,n){return n.length&&n[0].expectIf?(n[0].expectIf=!1,n[0].elseBranch=n[0],[n[0]]):":"}},{regex:/\\./,onMatch:function(e,t,n){var r=e[1];return r=="}"&&n.length?e=r:"`$\\".indexOf(r)!=-1?e=r:n.inFormatString&&(r=="n"?e="\n":r=="t"?e="\n":"ulULE".indexOf(r)!=-1&&(e={changeCase:r,local:r>"a"})),[e]}},{regex:/}/,onMatch:function(e,t,n){return[n.length?n.shift():e]}},{regex:/\$(?:\d+|\w+)/,onMatch:e},{regex:/\$\{[\dA-Z_a-z]+/,onMatch:function(t,n,r){var i=e(t.substr(1),n,r);return r.unshift(i[0]),i},next:"snippetVar"},{regex:/\n/,token:"newline",merge:!1}],snippetVar:[{regex:"\\|"+t("\\|")+"*\\|",onMatch:function(e,t,n){n[0].choices=e.slice(1,-1).split(",")},next:"start"},{regex:"/("+t("/")+"+)/(?:("+t("/")+"*)/)(\\w*):?",onMatch:function(e,t,n){var r=n[0];return r.fmtString=e,e=this.splitRegex.exec(e),r.guard=e[1],r.fmt=e[2],r.flag=e[3],""},next:"start"},{regex:"`"+t("`")+"*`",onMatch:function(e,t,n){return n[0].code=e.splice(1,-1),""},next:"start"},{regex:"\\?",onMatch:function(e,t,n){n[0]&&(n[0].expectIf=!0)},next:"start"},{regex:"([^:}\\\\]|\\\\.)*:?",token:"",next:"start"}],formatString:[{regex:"/("+t("/")+"+)/",token:"regex"},{regex:"",onMatch:function(e,t,n){n.inFormatString=!0},next:"start"}]}),c.prototype.getTokenizer=function(){return c.$tokenizer},c.$tokenizer},this.tokenizeTmSnippet=function(e,t){return this.getTokenizer().getLineTokens(e,t).tokens.map(function(e){return e.value||e})},this.$getDefaultValue=function(e,t){if(/^[A-Z]\d+$/.test(t)){var n=t.substr(1);return(this.variables[t[0]+"__"]||{})[n]}if(/^\d+$/.test(t))return(this.variables.__||{})[t];t=t.replace(/^TM_/,"");if(!e)return;var r=e.session;switch(t){case"CURRENT_WORD":var i=r.getWordRange();case"SELECTION":case"SELECTED_TEXT":return r.getTextRange(i);case"CURRENT_LINE":return r.getLine(e.getCursorPosition().row);case"PREV_LINE":return r.getLine(e.getCursorPosition().row-1);case"LINE_INDEX":return e.getCursorPosition().column;case"LINE_NUMBER":return e.getCursorPosition().row+1;case"SOFT_TABS":return r.getUseSoftTabs()?"YES":"NO";case"TAB_SIZE":return r.getTabSize();case"FILENAME":case"FILEPATH":return"";case"FULLNAME":return"Ace"}},this.variables={},this.getVariableValue=function(e,t){return this.variables.hasOwnProperty(t)?this.variables[t](e,t)||"":this.$getDefaultValue(e,t)||""},this.tmStrFormat=function(e,t,n){var r=t.flag||"",i=t.guard;i=new RegExp(i,r.replace(/[^gi]/,""));var s=this.tokenizeTmSnippet(t.fmt,"formatString"),o=this,u=e.replace(i,function(){o.variables.__=arguments;var e=o.resolveVariables(s,n),t="E";for(var r=0;r1?(y=t[t.length-1].length,g+=t.length-1):y+=e.length,b+=e}else e.start?e.end={row:g,column:y}:e.start={row:g,column:y}});var w=e.getSelectionRange(),E=e.session.replace(w,b),S=new h(e),x=e.inVirtualSelectionMode&&e.selection.index;S.addTabstops(u,w.start,E,x)},this.insertSnippet=function(e,t){var n=this;if(e.inVirtualSelectionMode)return n.insertSnippetForSelection(e,t);e.forEachSelection(function(){n.insertSnippetForSelection(e,t)},null,{keepOrder:!0}),e.tabstopManager&&e.tabstopManager.tabNext()},this.$getScope=function(e){var t=e.session.$mode.$id||"";t=t.split("/").pop();if(t==="html"||t==="php"){t==="php"&&!e.session.$mode.inlinePhp&&(t="html");var n=e.getCursorPosition(),r=e.session.getState(n.row);typeof r=="object"&&(r=r[0]),r.substring&&(r.substring(0,3)=="js-"?t="javascript":r.substring(0,4)=="css-"?t="css":r.substring(0,4)=="php-"&&(t="php"))}return t},this.getActiveScopes=function(e){var t=this.$getScope(e),n=[t],r=this.snippetMap;return r[t]&&r[t].includeScopes&&n.push.apply(n,r[t].includeScopes),n.push("_"),n},this.expandWithTab=function(e,t){var n=this,r=e.forEachSelection(function(){return n.expandSnippetForSelection(e,t)},null,{keepOrder:!0});return r&&e.tabstopManager&&e.tabstopManager.tabNext(),r},this.expandSnippetForSelection=function(e,t){var n=e.getCursorPosition(),r=e.session.getLine(n.row),i=r.substring(0,n.column),s=r.substr(n.column),o=this.snippetMap,u;return this.getActiveScopes(e).some(function(e){var t=o[e];return t&&(u=this.findMatchingSnippet(t,i,s)),!!u},this),u?t&&t.dryRun?!0:(e.session.doc.removeInLine(n.row,n.column-u.replaceBefore.length,n.column+u.replaceAfter.length),this.variables.M__=u.matchBefore,this.variables.T__=u.matchAfter,this.insertSnippetForSelection(e,u.content),this.variables.M__=this.variables.T__=null,!0):!1},this.findMatchingSnippet=function(e,t,n){for(var r=e.length;r--;){var i=e[r];if(i.startRe&&!i.startRe.test(t))continue;if(i.endRe&&!i.endRe.test(n))continue;if(!i.startRe&&!i.endRe)continue;return i.matchBefore=i.startRe?i.startRe.exec(t):[""],i.matchAfter=i.endRe?i.endRe.exec(n):[""],i.replaceBefore=i.triggerRe?i.triggerRe.exec(t)[0]:"",i.replaceAfter=i.endTriggerRe?i.endTriggerRe.exec(n)[0]:"",i}},this.snippetMap={},this.snippetNameMap={},this.register=function(e,t){function o(e){return e&&!/^\^?\(.*\)\$?$|^\\b$/.test(e)&&(e="(?:"+e+")"),e||""}function u(e,t,n){return e=o(e),t=o(t),n?(e=t+e,e&&e[e.length-1]!="$"&&(e+="$")):(e+=t,e&&e[0]!="^"&&(e="^"+e)),new RegExp(e)}function a(e){e.scope||(e.scope=t||"_"),t=e.scope,n[t]||(n[t]=[],r[t]={});var o=r[t];if(e.name){var a=o[e.name];a&&i.unregister(a),o[e.name]=e}n[t].push(e),e.tabTrigger&&!e.trigger&&(!e.guard&&/^\w/.test(e.tabTrigger)&&(e.guard="\\b"),e.trigger=s.escapeRegExp(e.tabTrigger));if(!e.trigger&&!e.guard&&!e.endTrigger&&!e.endGuard)return;e.startRe=u(e.trigger,e.guard,!0),e.triggerRe=new RegExp(e.trigger,"",!0),e.endRe=u(e.endTrigger,e.endGuard,!0),e.endTriggerRe=new RegExp(e.endTrigger,"",!0)}var n=this.snippetMap,r=this.snippetNameMap,i=this;e||(e=[]),e&&e.content?a(e):Array.isArray(e)&&e.forEach(a),this._signal("registerSnippets",{scope:t})},this.unregister=function(e,t){function i(e){var i=r[e.scope||t];if(i&&i[e.name]){delete i[e.name];var s=n[e.scope||t],o=s&&s.indexOf(e);o>=0&&s.splice(o,1)}}var n=this.snippetMap,r=this.snippetNameMap;e.content?i(e):Array.isArray(e)&&e.forEach(i)},this.parseSnippetFile=function(e){e=e.replace(/\r/g,"");var t=[],n={},r=/^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm,i;while(i=r.exec(e)){if(i[1])try{n=JSON.parse(i[1]),t.push(n)}catch(s){}if(i[4])n.content=i[4].replace(/^\t/gm,""),t.push(n),n={};else{var o=i[2],u=i[3];if(o=="regex"){var a=/\/((?:[^\/\\]|\\.)*)|$/g;n.guard=a.exec(u)[1],n.trigger=a.exec(u)[1],n.endTrigger=a.exec(u)[1],n.endGuard=a.exec(u)[1]}else o=="snippet"?(n.tabTrigger=u.match(/^\S*/)[0],n.name||(n.name=u)):n[o]=u}}return t},this.getSnippetByName=function(e,t){var n=this.snippetNameMap,r;return this.getActiveScopes(t).some(function(t){var i=n[t];return i&&(r=i[e]),!!r},this),r}}).call(c.prototype);var h=function(e){if(e.tabstopManager)return e.tabstopManager;e.tabstopManager=this,this.$onChange=this.onChange.bind(this),this.$onChangeSelection=s.delayedCall(this.onChangeSelection.bind(this)).schedule,this.$onChangeSession=this.onChangeSession.bind(this),this.$onAfterExec=this.onAfterExec.bind(this),this.attach(e)};(function(){this.attach=function(e){this.index=0,this.ranges=[],this.tabstops=[],this.$openTabstops=null,this.selectedTabstop=null,this.editor=e,this.editor.on("change",this.$onChange),this.editor.on("changeSelection",this.$onChangeSelection),this.editor.on("changeSession",this.$onChangeSession),this.editor.commands.on("afterExec",this.$onAfterExec),this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)},this.detach=function(){this.tabstops.forEach(this.removeTabstopMarkers,this),this.ranges=null,this.tabstops=null,this.selectedTabstop=null,this.editor.removeListener("change",this.$onChange),this.editor.removeListener("changeSelection",this.$onChangeSelection),this.editor.removeListener("changeSession",this.$onChangeSession),this.editor.commands.removeListener("afterExec",this.$onAfterExec),this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler),this.editor.tabstopManager=null,this.editor=null},this.onChange=function(e){var t=e,n=e.action[0]=="r",r=e.start,i=e.end,s=r.row,o=i.row,u=o-s,a=i.column-r.column;n&&(u=-u,a=-a);if(!this.$inChange&&n){var f=this.selectedTabstop,c=f&&!f.some(function(e){return l(e.start,r)<=0&&l(e.end,i)>=0});if(c)return this.detach()}var h=this.ranges;for(var p=0;p0){this.removeRange(d),p--;continue}d.start.row==s&&d.start.column>r.column&&(d.start.column+=a),d.end.row==s&&d.end.column>=r.column&&(d.end.column+=a),d.start.row>=s&&(d.start.row+=u),d.end.row>=s&&(d.end.row+=u),l(d.start,d.end)>0&&this.removeRange(d)}h.length||this.detach()},this.updateLinkedFields=function(){var e=this.selectedTabstop;if(!e||!e.hasLinkedRanges)return;this.$inChange=!0;var n=this.editor.session,r=n.getTextRange(e.firstNonLinked);for(var i=e.length;i--;){var s=e[i];if(!s.linked)continue;var o=t.snippetManager.tmStrFormat(r,s.original);n.replace(s,o)}this.$inChange=!1},this.onAfterExec=function(e){e.command&&!e.command.readOnly&&this.updateLinkedFields()},this.onChangeSelection=function(){if(!this.editor)return;var e=this.editor.selection.lead,t=this.editor.selection.anchor,n=this.editor.selection.isEmpty();for(var r=this.ranges.length;r--;){if(this.ranges[r].linked)continue;var i=this.ranges[r].contains(e.row,e.column),s=n||this.ranges[r].contains(t.row,t.column);if(i&&s)return}this.detach()},this.onChangeSession=function(){this.detach()},this.tabNext=function(e){var t=this.tabstops.length,n=this.index+(e||1);n=Math.min(Math.max(n,1),t),n==t&&(n=0),this.selectTabstop(n),n===0&&this.detach()},this.selectTabstop=function(e){this.$openTabstops=null;var t=this.tabstops[this.index];t&&this.addTabstopMarkers(t),this.index=e,t=this.tabstops[this.index];if(!t||!t.length)return;this.selectedTabstop=t;if(!this.editor.inVirtualSelectionMode){var n=this.editor.multiSelect;n.toSingleRange(t.firstNonLinked.clone());for(var r=t.length;r--;){if(t.hasLinkedRanges&&t[r].linked)continue;n.addRange(t[r].clone(),!0)}n.ranges[0]&&n.addRange(n.ranges[0].clone())}else this.editor.selection.setRange(t.firstNonLinked);this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)},this.addTabstops=function(e,t,n){this.$openTabstops||(this.$openTabstops=[]);if(!e[0]){var r=o.fromPoints(n,n);v(r.start,t),v(r.end,t),e[0]=[r],e[0].index=0}var i=this.index,s=[i+1,0],u=this.ranges;e.forEach(function(e,n){var r=this.$openTabstops[n]||e;for(var i=e.length;i--;){var a=e[i],f=o.fromPoints(a.start,a.end||a.start);d(f.start,t),d(f.end,t),f.original=a,f.tabstop=r,u.push(f),r!=e?r.unshift(f):r[i]=f,a.fmtString?(f.linked=!0,r.hasLinkedRanges=!0):r.firstNonLinked||(r.firstNonLinked=f)}r.firstNonLinked||(r.hasLinkedRanges=!1),r===e&&(s.push(r),this.$openTabstops[n]=r),this.addTabstopMarkers(r)},this),s.length>2&&(this.tabstops.length&&s.push(s.splice(2,1)[0]),this.tabstops.splice.apply(this.tabstops,s))},this.addTabstopMarkers=function(e){var t=this.editor.session;e.forEach(function(e){e.markerId||(e.markerId=t.addMarker(e,"ace_snippet-marker","text"))})},this.removeTabstopMarkers=function(e){var t=this.editor.session;e.forEach(function(e){t.removeMarker(e.markerId),e.markerId=null})},this.removeRange=function(e){var t=e.tabstop.indexOf(e);e.tabstop.splice(t,1),t=this.ranges.indexOf(e),this.ranges.splice(t,1),this.editor.session.removeMarker(e.markerId),e.tabstop.length||(t=this.tabstops.indexOf(e.tabstop),t!=-1&&this.tabstops.splice(t,1),this.tabstops.length||this.detach())},this.keyboardHandler=new a,this.keyboardHandler.bindKeys({Tab:function(e){if(t.snippetManager&&t.snippetManager.expandWithTab(e))return;e.tabstopManager.tabNext(1)},"Shift-Tab":function(e){e.tabstopManager.tabNext(-1)},Esc:function(e){e.tabstopManager.detach()},Return:function(e){return!1}})}).call(h.prototype);var p={};p.onChange=u.prototype.onChange,p.setPosition=function(e,t){this.pos.row=e,this.pos.column=t},p.update=function(e,t,n){this.$insertRight=n,this.pos=e,this.onChange(t)};var d=function(e,t){e.row==0&&(e.column+=t.column),e.row+=t.row},v=function(e,t){e.row==t.row&&(e.column-=t.column),e.row-=t.row};e("./lib/dom").importCssString(".ace_snippet-marker { -moz-box-sizing: border-box; box-sizing: border-box; background: rgba(194, 193, 208, 0.09); border: 1px dotted rgba(211, 208, 235, 0.62); position: absolute;}"),t.snippetManager=new c;var m=e("./editor").Editor;(function(){this.insertSnippet=function(e,n){return t.snippetManager.insertSnippet(this,e,n)},this.expandSnippet=function(e){return t.snippetManager.expandWithTab(this,e)}}).call(m.prototype)}),define("ace/autocomplete/popup",["require","exports","module","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../virtual_renderer").VirtualRenderer,i=e("../editor").Editor,s=e("../range").Range,o=e("../lib/event"),u=e("../lib/lang"),a=e("../lib/dom"),f=function(e){var t=new r(e);t.$maxLines=4;var n=new i(t);return n.setHighlightActiveLine(!1),n.setShowPrintMargin(!1),n.renderer.setShowGutter(!1),n.renderer.setHighlightGutterLine(!1),n.$mouseHandler.$focusWaitTimout=0,n.$highlightTagPending=!0,n},l=function(e){var t=a.createElement("div"),n=new f(t);e&&e.appendChild(t),t.style.display="none",n.renderer.content.style.cursor="default",n.renderer.setStyle("ace_autocomplete"),n.setOption("displayIndentGuides",!1),n.setOption("dragDelay",150);var r=function(){};n.focus=r,n.$isFocused=!0,n.renderer.$cursorLayer.restartTimer=r,n.renderer.$cursorLayer.element.style.opacity=0,n.renderer.$maxLines=8,n.renderer.$keepTextAreaAtCursor=!1,n.setHighlightActiveLine(!1),n.session.highlight(""),n.session.$searchHighlight.clazz="ace_highlight-marker",n.on("mousedown",function(e){var t=e.getDocumentPosition();n.selection.moveToPosition(t),c.start.row=c.end.row=t.row,e.stop()});var i,l=new s(-1,0,-1,Infinity),c=new s(-1,0,-1,Infinity);c.id=n.session.addMarker(c,"ace_active-line","fullLine"),n.setSelectOnHover=function(e){e?l.id&&(n.session.removeMarker(l.id),l.id=null):l.id=n.session.addMarker(l,"ace_line-hover","fullLine")},n.setSelectOnHover(!1),n.on("mousemove",function(e){if(!i){i=e;return}if(i.x==e.x&&i.y==e.y)return;i=e,i.scrollTop=n.renderer.scrollTop;var t=i.getDocumentPosition().row;l.start.row!=t&&(l.id||n.setRow(t),p(t))}),n.renderer.on("beforeRender",function(){if(i&&l.start.row!=-1){i.$pos=null;var e=i.getDocumentPosition().row;l.id||n.setRow(e),p(e,!0)}}),n.renderer.on("afterRender",function(){var e=n.getRow(),t=n.renderer.$textLayer,r=t.element.childNodes[e-t.config.firstRow];if(r==t.selectedNode)return;t.selectedNode&&a.removeCssClass(t.selectedNode,"ace_selected"),t.selectedNode=r,r&&a.addCssClass(r,"ace_selected")});var h=function(){p(-1)},p=function(e,t){e!==l.start.row&&(l.start.row=l.end.row=e,t||n.session._emit("changeBackMarker"),n._emit("changeHoverMarker"))};n.getHoveredRow=function(){return l.start.row},o.addListener(n.container,"mouseout",h),n.on("hide",h),n.on("changeSelection",h),n.session.doc.getLength=function(){return n.data.length},n.session.doc.getLine=function(e){var t=n.data[e];return typeof t=="string"?t:t&&t.value||""};var d=n.session.bgTokenizer;return d.$tokenizeRow=function(e){var t=n.data[e],r=[];if(!t)return r;typeof t=="string"&&(t={value:t}),t.caption||(t.caption=t.value||t.name);var i=-1,s,o;for(var u=0;ua-2&&(f=f.substr(0,a-t.caption.length-3)+"\u2026"),r.push({type:"rightAlignedText",value:f})}return r},d.$updateOnChange=r,d.start=r,n.session.$computeWidth=function(){return this.screenWidth=0},n.$blockScrolling=Infinity,n.isOpen=!1,n.isTopdown=!1,n.autoSelect=!0,n.data=[],n.setData=function(e){n.setValue(u.stringRepeat("\n",e.length),-1),n.data=e||[],n.setRow(0)},n.getData=function(e){return n.data[e]},n.getRow=function(){return c.start.row},n.setRow=function(e){e=Math.max(this.autoSelect?0:-1,Math.min(this.data.length,e)),c.start.row!=e&&(n.selection.clearSelection(),c.start.row=c.end.row=e||0,n.session._emit("changeBackMarker"),n.moveCursorTo(e||0,0),n.isOpen&&n._signal("select"))},n.on("changeSelection",function(){n.isOpen&&n.setRow(n.selection.lead.row),n.renderer.scrollCursorIntoView()}),n.hide=function(){this.container.style.display="none",this._signal("hide"),n.isOpen=!1},n.show=function(e,t,r){var s=this.container,o=window.innerHeight,u=window.innerWidth,a=this.renderer,f=a.$maxLines*t*1.4,l=e.top+this.$borderSize,c=l>o/2&&!r;c&&l+t+f>o?(a.$maxPixelHeight=l-2*this.$borderSize,s.style.top="",s.style.bottom=o-l+"px",n.isTopdown=!1):(l+=t,a.$maxPixelHeight=o-l-.2*t,s.style.top=l+"px",s.style.bottom="",n.isTopdown=!0),s.style.display="",this.renderer.$textLayer.checkForSizeChanges();var h=e.left;h+s.offsetWidth>u&&(h=u-s.offsetWidth),s.style.left=h+"px",this._signal("show"),i=null,n.isOpen=!0},n.getTextLeftOffset=function(){return this.$borderSize+this.renderer.$padding+this.$imageSize},n.$imageSize=0,n.$borderSize=1,n};a.importCssString(".ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line { background-color: #CAD6FA; z-index: 1;}.ace_editor.ace_autocomplete .ace_line-hover { border: 1px solid #abbffe; margin-top: -1px; background: rgba(233,233,253,0.4);}.ace_editor.ace_autocomplete .ace_line-hover { position: absolute; z-index: 2;}.ace_editor.ace_autocomplete .ace_scroller { background: none; border: none; box-shadow: none;}.ace_rightAlignedText { color: gray; display: inline-block; position: absolute; right: 4px; text-align: right; z-index: -1;}.ace_editor.ace_autocomplete .ace_completion-highlight{ color: #000; text-shadow: 0 0 0.01em;}.ace_editor.ace_autocomplete { width: 280px; z-index: 200000; background: #fbfbfb; color: #444; border: 1px lightgray solid; position: fixed; box-shadow: 2px 3px 5px rgba(0,0,0,.2); line-height: 1.4;}"),t.AcePopup=l}),define("ace/autocomplete/util",["require","exports","module"],function(e,t,n){"use strict";t.parForEach=function(e,t,n){var r=0,i=e.length;i===0&&n();for(var s=0;s=0;s--){if(!n.test(e[s]))break;i.push(e[s])}return i.reverse().join("")},t.retrieveFollowingIdentifier=function(e,t,n){n=n||r;var i=[];for(var s=t;s=n?-1:t+1;break;case"start":t=0;break;case"end":t=n}this.popup.setRow(t)},this.insertMatch=function(e,t){e||(e=this.popup.getData(this.popup.getRow()));if(!e)return!1;if(e.completer&&e.completer.insertMatch)e.completer.insertMatch(this.editor,e);else{if(this.completions.filterText){var n=this.editor.selection.getAllRanges();for(var r=0,i;i=n[r];r++)i.start.column-=this.completions.filterText.length,this.editor.session.remove(i)}e.snippet?f.insertSnippet(this.editor,e.snippet):this.editor.execCommand("insertstring",e.value||e)}this.detach()},this.commands={Up:function(e){e.completer.goTo("up")},Down:function(e){e.completer.goTo("down")},"Ctrl-Up|Ctrl-Home":function(e){e.completer.goTo("start")},"Ctrl-Down|Ctrl-End":function(e){e.completer.goTo("end")},Esc:function(e){e.completer.detach()},Return:function(e){return e.completer.insertMatch()},"Shift-Return":function(e){e.completer.insertMatch(null,{deleteSuffix:!0})},Tab:function(e){var t=e.completer.insertMatch();if(!!t||!!e.tabstopManager)return t;e.completer.goTo("down")},PageUp:function(e){e.completer.popup.gotoPageUp()},PageDown:function(e){e.completer.popup.gotoPageDown()}},this.gatherCompletions=function(e,t){var n=e.getSession(),r=e.getCursorPosition(),i=s.getCompletionPrefix(e);this.base=n.doc.createAnchor(r.row,r.column-i.length),this.base.$insertRight=!0;var o=[],u=e.completers.length;return e.completers.forEach(function(a,f){a.getCompletions(e,n,r,i,function(n,r){!n&&r&&(o=o.concat(r)),t(null,{prefix:s.getCompletionPrefix(e),matches:o,finished:--u===0})})}),!0},this.showPopup=function(e){this.editor&&this.detach(),this.activated=!0,this.editor=e,e.completer!=this&&(e.completer&&e.completer.detach(),e.completer=this),e.on("changeSelection",this.changeListener),e.on("blur",this.blurListener),e.on("mousedown",this.mousedownListener),e.on("mousewheel",this.mousewheelListener),this.updateCompletions()},this.updateCompletions=function(e){if(e&&this.base&&this.completions){var t=this.editor.getCursorPosition(),n=this.editor.session.getTextRange({start:this.base,end:t});if(n==this.completions.filterText)return;this.completions.setFilter(n);if(!this.completions.filtered.length)return this.detach();if(this.completions.filtered.length==1&&this.completions.filtered[0].value==n&&!this.completions.filtered[0].snippet)return this.detach();this.openPopup(this.editor,n,e);return}var r=this.gatherCompletionsId;this.gatherCompletions(this.editor,function(t,n){var i=function(){if(!n.finished)return;return this.detach()}.bind(this),s=n.prefix,o=n&&n.matches;if(!o||!o.length)return i();if(s.indexOf(n.prefix)!==0||r!=this.gatherCompletionsId)return;this.completions=new c(o),this.exactMatch&&(this.completions.exactMatch=!0),this.completions.setFilter(s);var u=this.completions.filtered;if(!u.length)return i();if(u.length==1&&u[0].value==s&&!u[0].snippet)return i();if(this.autoInsert&&u.length==1&&n.finished)return this.insertMatch(u[0]);this.openPopup(this.editor,s,e)}.bind(this))},this.cancelContextMenu=function(){this.editor.$mouseHandler.cancelContextMenu()},this.updateDocTooltip=function(){var e=this.popup,t=e.data,n=t&&(t[e.getHoveredRow()]||t[e.getRow()]),r=null;if(!n||!this.editor||!this.popup.isOpen)return this.hideDocTooltip();this.editor.completers.some(function(e){return e.getDocTooltip&&(r=e.getDocTooltip(n)),r}),r||(r=n),typeof r=="string"&&(r={docText:r});if(!r||!r.docHTML&&!r.docText)return this.hideDocTooltip();this.showDocTooltip(r)},this.showDocTooltip=function(e){this.tooltipNode||(this.tooltipNode=a.createElement("div"),this.tooltipNode.className="ace_tooltip ace_doc-tooltip",this.tooltipNode.style.margin=0,this.tooltipNode.style.pointerEvents="auto",this.tooltipNode.tabIndex=-1,this.tooltipNode.onblur=this.blurListener.bind(this),this.tooltipNode.onclick=this.onTooltipClick.bind(this));var t=this.tooltipNode;e.docHTML?t.innerHTML=e.docHTML:e.docText&&(t.textContent=e.docText),t.parentNode||document.body.appendChild(t);var n=this.popup,r=n.container.getBoundingClientRect();t.style.top=n.container.style.top,t.style.bottom=n.container.style.bottom,window.innerWidth-r.right<320?(t.style.right=window.innerWidth-r.left+"px",t.style.left=""):(t.style.left=r.right+1+"px",t.style.right=""),t.style.display="block"},this.hideDocTooltip=function(){this.tooltipTimer.cancel();if(!this.tooltipNode)return;var e=this.tooltipNode;!this.editor.isFocused()&&document.activeElement==e&&this.editor.focus(),this.tooltipNode=null,e.parentNode&&e.parentNode.removeChild(e)},this.onTooltipClick=function(e){var t=e.target;while(t&&t!=this.tooltipNode){if(t.nodeName=="A"&&t.href){t.rel="noreferrer",t.target="_blank";break}t=t.parentNode}}}).call(l.prototype),l.startCommand={name:"startAutocomplete",exec:function(e){e.completer||(e.completer=new l),e.completer.autoInsert=!1,e.completer.autoSelect=!0,e.completer.showPopup(e),e.completer.cancelContextMenu()},bindKey:"Ctrl-Space|Ctrl-Shift-Space|Alt-Space"};var c=function(e,t){this.all=e,this.filtered=e,this.filterText=t||"",this.exactMatch=!1};(function(){this.setFilter=function(e){if(e.length>this.filterText&&e.lastIndexOf(this.filterText,0)===0)var t=this.filtered;else var t=this.all;this.filterText=e,t=this.filterCompletions(t,this.filterText),t=t.sort(function(e,t){return t.exactMatch-e.exactMatch||t.score-e.score});var n=null;t=t.filter(function(e){var t=e.snippet||e.caption||e.value;return t===n?!1:(n=t,!0)}),this.filtered=t},this.filterCompletions=function(e,t){var n=[],r=t.toUpperCase(),i=t.toLowerCase();e:for(var s=0,o;o=e[s];s++){var u=o.value||o.caption||o.snippet;if(!u)continue;var a=-1,f=0,l=0,c,h;if(this.exactMatch){if(t!==u.substr(0,t.length))continue e}else for(var p=0;p=0?v<0||d0&&(a===-1&&(l+=10),l+=h),f|=1<",o.escapeHTML(e.caption),"","
",o.escapeHTML(e.snippet)].join(""))}},c=[l,a,f];t.setCompleters=function(e){c.length=0,e&&c.push.apply(c,e)},t.addCompleter=function(e){c.push(e)},t.textCompleter=a,t.keyWordCompleter=f,t.snippetCompleter=l;var h={name:"expandSnippet",exec:function(e){return r.expandWithTab(e)},bindKey:"Tab"},p=function(e,t){d(t.session.$mode)},d=function(e){var t=e.$id;r.files||(r.files={}),v(t),e.modes&&e.modes.forEach(d)},v=function(e){if(!e||r.files[e])return;var t=e.replace("mode","snippets");r.files[e]={},s.loadModule(t,function(t){t&&(r.files[e]=t,!t.snippets&&t.snippetText&&(t.snippets=r.parseSnippetFile(t.snippetText)),r.register(t.snippets||[],t.scope),t.includeScopes&&(r.snippetMap[t.scope].includeScopes=t.includeScopes,t.includeScopes.forEach(function(e){v("ace/mode/"+e)})))})},m=function(e){var t=e.editor,n=t.completer&&t.completer.activated;if(e.command.name==="backspace")n&&!u.getCompletionPrefix(t)&&t.completer.detach();else if(e.command.name==="insertstring"){var r=u.getCompletionPrefix(t);r&&!n&&(t.completer||(t.completer=new i),t.completer.autoInsert=!1,t.completer.showPopup(t))}},g=e("../editor").Editor;e("../config").defineOptions(g.prototype,"editor",{enableBasicAutocompletion:{set:function(e){e?(this.completers||(this.completers=Array.isArray(e)?e:c),this.commands.addCommand(i.startCommand)):this.commands.removeCommand(i.startCommand)},value:!1},enableLiveAutocompletion:{set:function(e){e?(this.completers||(this.completers=Array.isArray(e)?e:c),this.commands.on("afterExec",m)):this.commands.removeListener("afterExec",m)},value:!1},enableSnippets:{set:function(e){e?(this.commands.addCommand(h),this.on("changeMode",p),p(null,this)):(this.commands.removeCommand(h),this.off("changeMode",p))},value:!1}})});
2 | (function() {
3 | window.require(["ace/ext/language_tools"], function() {});
4 | })();
5 |
--------------------------------------------------------------------------------
/css/DPlayer.min.css:
--------------------------------------------------------------------------------
1 | button[data-balloon]{overflow:visible}[data-balloon]{position:relative;cursor:pointer}[data-balloon]:after{font-family:sans-serif!important;font-weight:400!important;font-style:normal!important;text-shadow:none!important;font-size:12px!important;background:hsla(0,0%,7%,.9);border-radius:4px;color:#fff;content:attr(data-balloon);padding:.5em 1em;white-space:nowrap}[data-balloon]:after,[data-balloon]:before{filter:alpha(opactiy=0);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";-moz-opacity:0;-khtml-opacity:0;opacity:0;pointer-events:none;transition:all .18s ease-out .18s;position:absolute;z-index:10}[data-balloon]:before{background:no-repeat url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='12'%3E%3Cpath fill='rgba(17, 17, 17, 0.9)' d='M2.658 0h32.004c-6 0-11.627 12.002-16.002 12.002C14.285 12.002 8.594 0 2.658 0z'/%3E%3C/svg%3E");background-size:100% auto;width:18px;height:6px;content:""}[data-balloon]:hover:after,[data-balloon]:hover:before,[data-balloon][data-balloon-visible]:after,[data-balloon][data-balloon-visible]:before{filter:alpha(opactiy=100);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";-moz-opacity:1;-khtml-opacity:1;opacity:1;pointer-events:auto}[data-balloon].font-awesome:after{font-family:FontAwesome}[data-balloon][data-balloon-break]:after{white-space:pre}[data-balloon][data-balloon-blunt]:after,[data-balloon][data-balloon-blunt]:before{transition:none}[data-balloon][data-balloon-pos=up]:after{margin-bottom:11px}[data-balloon][data-balloon-pos=up]:after,[data-balloon][data-balloon-pos=up]:before{bottom:100%;left:50%;-webkit-transform:translate(-50%,10px);transform:translate(-50%,10px);-webkit-transform-origin:top;transform-origin:top}[data-balloon][data-balloon-pos=up]:before{margin-bottom:5px}[data-balloon][data-balloon-pos=up]:hover:after,[data-balloon][data-balloon-pos=up]:hover:before,[data-balloon][data-balloon-pos=up][data-balloon-visible]:after,[data-balloon][data-balloon-pos=up][data-balloon-visible]:before{-webkit-transform:translate(-50%);transform:translate(-50%)}[data-balloon][data-balloon-pos=up-left]:after{left:0;margin-bottom:11px}[data-balloon][data-balloon-pos=up-left]:after,[data-balloon][data-balloon-pos=up-left]:before{bottom:100%;-webkit-transform:translateY(10px);transform:translateY(10px);-webkit-transform-origin:top;transform-origin:top}[data-balloon][data-balloon-pos=up-left]:before{left:5px;margin-bottom:5px}[data-balloon][data-balloon-pos=up-left]:hover:after,[data-balloon][data-balloon-pos=up-left]:hover:before,[data-balloon][data-balloon-pos=up-left][data-balloon-visible]:after,[data-balloon][data-balloon-pos=up-left][data-balloon-visible]:before{-webkit-transform:translate(0);transform:translate(0)}[data-balloon][data-balloon-pos=up-right]:after{right:0;margin-bottom:11px}[data-balloon][data-balloon-pos=up-right]:after,[data-balloon][data-balloon-pos=up-right]:before{bottom:100%;-webkit-transform:translateY(10px);transform:translateY(10px);-webkit-transform-origin:top;transform-origin:top}[data-balloon][data-balloon-pos=up-right]:before{right:5px;margin-bottom:5px}[data-balloon][data-balloon-pos=up-right]:hover:after,[data-balloon][data-balloon-pos=up-right]:hover:before,[data-balloon][data-balloon-pos=up-right][data-balloon-visible]:after,[data-balloon][data-balloon-pos=up-right][data-balloon-visible]:before{-webkit-transform:translate(0);transform:translate(0)}[data-balloon][data-balloon-pos=down]:after{margin-top:11px}[data-balloon][data-balloon-pos=down]:after,[data-balloon][data-balloon-pos=down]:before{left:50%;top:100%;-webkit-transform:translate(-50%,-10px);transform:translate(-50%,-10px)}[data-balloon][data-balloon-pos=down]:before{background:no-repeat url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='12'%3E%3Cpath fill='rgba(17, 17, 17, 0.9)' d='M33.342 12H1.338c6 0 11.627-12.002 16.002-12.002C21.715-.002 27.406 12 33.342 12z'/%3E%3C/svg%3E");background-size:100% auto;width:18px;height:6px;margin-top:5px}[data-balloon][data-balloon-pos=down]:hover:after,[data-balloon][data-balloon-pos=down]:hover:before,[data-balloon][data-balloon-pos=down][data-balloon-visible]:after,[data-balloon][data-balloon-pos=down][data-balloon-visible]:before{-webkit-transform:translate(-50%);transform:translate(-50%)}[data-balloon][data-balloon-pos=down-left]:after{left:0;margin-top:11px;top:100%;-webkit-transform:translateY(-10px);transform:translateY(-10px)}[data-balloon][data-balloon-pos=down-left]:before{background:no-repeat url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='12'%3E%3Cpath fill='rgba(17, 17, 17, 0.9)' d='M33.342 12H1.338c6 0 11.627-12.002 16.002-12.002C21.715-.002 27.406 12 33.342 12z'/%3E%3C/svg%3E");background-size:100% auto;width:18px;height:6px;left:5px;margin-top:5px;top:100%;-webkit-transform:translateY(-10px);transform:translateY(-10px)}[data-balloon][data-balloon-pos=down-left]:hover:after,[data-balloon][data-balloon-pos=down-left]:hover:before,[data-balloon][data-balloon-pos=down-left][data-balloon-visible]:after,[data-balloon][data-balloon-pos=down-left][data-balloon-visible]:before{-webkit-transform:translate(0);transform:translate(0)}[data-balloon][data-balloon-pos=down-right]:after{right:0;margin-top:11px;top:100%;-webkit-transform:translateY(-10px);transform:translateY(-10px)}[data-balloon][data-balloon-pos=down-right]:before{background:no-repeat url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='12'%3E%3Cpath fill='rgba(17, 17, 17, 0.9)' d='M33.342 12H1.338c6 0 11.627-12.002 16.002-12.002C21.715-.002 27.406 12 33.342 12z'/%3E%3C/svg%3E");background-size:100% auto;width:18px;height:6px;right:5px;margin-top:5px;top:100%;-webkit-transform:translateY(-10px);transform:translateY(-10px)}[data-balloon][data-balloon-pos=down-right]:hover:after,[data-balloon][data-balloon-pos=down-right]:hover:before,[data-balloon][data-balloon-pos=down-right][data-balloon-visible]:after,[data-balloon][data-balloon-pos=down-right][data-balloon-visible]:before{-webkit-transform:translate(0);transform:translate(0)}[data-balloon][data-balloon-pos=left]:after{margin-right:11px;right:100%;top:50%;-webkit-transform:translate(10px,-50%);transform:translate(10px,-50%)}[data-balloon][data-balloon-pos=left]:before{background:no-repeat url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='36'%3E%3Cpath fill='rgba(17, 17, 17, 0.9)' d='M0 33.342V1.338c0 6 12.002 11.627 12.002 16.002C12.002 21.715 0 27.406 0 33.342z'/%3E%3C/svg%3E");background-size:100% auto;width:6px;height:18px;margin-right:5px;right:100%;top:50%;-webkit-transform:translate(10px,-50%);transform:translate(10px,-50%)}[data-balloon][data-balloon-pos=left]:hover:after,[data-balloon][data-balloon-pos=left]:hover:before,[data-balloon][data-balloon-pos=left][data-balloon-visible]:after,[data-balloon][data-balloon-pos=left][data-balloon-visible]:before{-webkit-transform:translateY(-50%);transform:translateY(-50%)}[data-balloon][data-balloon-pos=right]:after{left:100%;margin-left:11px;top:50%;-webkit-transform:translate(-10px,-50%);transform:translate(-10px,-50%)}[data-balloon][data-balloon-pos=right]:before{background:no-repeat url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='36'%3E%3Cpath fill='rgba(17, 17, 17, 0.9)' d='M12 2.658v32.004c0-6-12.002-11.627-12.002-16.002C-.002 14.285 12 8.594 12 2.658z'/%3E%3C/svg%3E");background-size:100% auto;width:6px;height:18px;left:100%;margin-left:5px;top:50%;-webkit-transform:translate(-10px,-50%);transform:translate(-10px,-50%)}[data-balloon][data-balloon-pos=right]:hover:after,[data-balloon][data-balloon-pos=right]:hover:before,[data-balloon][data-balloon-pos=right][data-balloon-visible]:after,[data-balloon][data-balloon-pos=right][data-balloon-visible]:before{-webkit-transform:translateY(-50%);transform:translateY(-50%)}[data-balloon][data-balloon-length=small]:after{white-space:normal;width:80px}[data-balloon][data-balloon-length=medium]:after{white-space:normal;width:150px}[data-balloon][data-balloon-length=large]:after{white-space:normal;width:260px}[data-balloon][data-balloon-length=xlarge]:after{white-space:normal;width:380px}@media screen and (max-width:768px){[data-balloon][data-balloon-length=xlarge]:after{white-space:normal;width:90vw}}[data-balloon][data-balloon-length=fit]:after{white-space:normal;width:100%}
2 | @-webkit-keyframes my-face{2%{-webkit-transform:translateY(1.5px) rotate(1.5deg);transform:translateY(1.5px) rotate(1.5deg)}4%{-webkit-transform:translateY(-1.5px) rotate(-.5deg);transform:translateY(-1.5px) rotate(-.5deg)}6%{-webkit-transform:translateY(1.5px) rotate(-1.5deg);transform:translateY(1.5px) rotate(-1.5deg)}8%{-webkit-transform:translateY(-1.5px) rotate(-1.5deg);transform:translateY(-1.5px) rotate(-1.5deg)}10%{-webkit-transform:translateY(2.5px) rotate(1.5deg);transform:translateY(2.5px) rotate(1.5deg)}12%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}14%{-webkit-transform:translateY(-1.5px) rotate(1.5deg);transform:translateY(-1.5px) rotate(1.5deg)}16%{-webkit-transform:translateY(-.5px) rotate(-1.5deg);transform:translateY(-.5px) rotate(-1.5deg)}18%{-webkit-transform:translateY(.5px) rotate(-1.5deg);transform:translateY(.5px) rotate(-1.5deg)}20%{-webkit-transform:translateY(-1.5px) rotate(2.5deg);transform:translateY(-1.5px) rotate(2.5deg)}22%{-webkit-transform:translateY(.5px) rotate(-1.5deg);transform:translateY(.5px) rotate(-1.5deg)}24%{-webkit-transform:translateY(1.5px) rotate(1.5deg);transform:translateY(1.5px) rotate(1.5deg)}26%{-webkit-transform:translateY(.5px) rotate(.5deg);transform:translateY(.5px) rotate(.5deg)}28%{-webkit-transform:translateY(.5px) rotate(1.5deg);transform:translateY(.5px) rotate(1.5deg)}30%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}32%{-webkit-transform:translateY(1.5px) rotate(-.5deg);transform:translateY(1.5px) rotate(-.5deg)}34%{-webkit-transform:translateY(1.5px) rotate(-.5deg);transform:translateY(1.5px) rotate(-.5deg)}36%{-webkit-transform:translateY(-1.5px) rotate(2.5deg);transform:translateY(-1.5px) rotate(2.5deg)}38%{-webkit-transform:translateY(1.5px) rotate(-1.5deg);transform:translateY(1.5px) rotate(-1.5deg)}40%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}42%{-webkit-transform:translateY(2.5px) rotate(-1.5deg);transform:translateY(2.5px) rotate(-1.5deg)}44%{-webkit-transform:translateY(1.5px) rotate(.5deg);transform:translateY(1.5px) rotate(.5deg)}46%{-webkit-transform:translateY(-1.5px) rotate(2.5deg);transform:translateY(-1.5px) rotate(2.5deg)}48%{-webkit-transform:translateY(-.5px) rotate(.5deg);transform:translateY(-.5px) rotate(.5deg)}50%{-webkit-transform:translateY(.5px) rotate(.5deg);transform:translateY(.5px) rotate(.5deg)}52%{-webkit-transform:translateY(2.5px) rotate(2.5deg);transform:translateY(2.5px) rotate(2.5deg)}54%{-webkit-transform:translateY(-1.5px) rotate(1.5deg);transform:translateY(-1.5px) rotate(1.5deg)}56%{-webkit-transform:translateY(2.5px) rotate(2.5deg);transform:translateY(2.5px) rotate(2.5deg)}58%{-webkit-transform:translateY(.5px) rotate(2.5deg);transform:translateY(.5px) rotate(2.5deg)}60%{-webkit-transform:translateY(2.5px) rotate(2.5deg);transform:translateY(2.5px) rotate(2.5deg)}62%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}64%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}66%{-webkit-transform:translateY(1.5px) rotate(-.5deg);transform:translateY(1.5px) rotate(-.5deg)}68%{-webkit-transform:translateY(-1.5px) rotate(-.5deg);transform:translateY(-1.5px) rotate(-.5deg)}70%{-webkit-transform:translateY(1.5px) rotate(.5deg);transform:translateY(1.5px) rotate(.5deg)}72%{-webkit-transform:translateY(2.5px) rotate(1.5deg);transform:translateY(2.5px) rotate(1.5deg)}74%{-webkit-transform:translateY(-.5px) rotate(.5deg);transform:translateY(-.5px) rotate(.5deg)}76%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}78%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}80%{-webkit-transform:translateY(1.5px) rotate(1.5deg);transform:translateY(1.5px) rotate(1.5deg)}82%{-webkit-transform:translateY(-.5px) rotate(.5deg);transform:translateY(-.5px) rotate(.5deg)}84%{-webkit-transform:translateY(1.5px) rotate(2.5deg);transform:translateY(1.5px) rotate(2.5deg)}86%{-webkit-transform:translateY(-1.5px) rotate(-1.5deg);transform:translateY(-1.5px) rotate(-1.5deg)}88%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}90%{-webkit-transform:translateY(2.5px) rotate(-.5deg);transform:translateY(2.5px) rotate(-.5deg)}92%{-webkit-transform:translateY(.5px) rotate(-.5deg);transform:translateY(.5px) rotate(-.5deg)}94%{-webkit-transform:translateY(2.5px) rotate(.5deg);transform:translateY(2.5px) rotate(.5deg)}96%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}98%{-webkit-transform:translateY(-1.5px) rotate(-.5deg);transform:translateY(-1.5px) rotate(-.5deg)}0%,to{-webkit-transform:translate(0) rotate(0deg);transform:translate(0) rotate(0deg)}}@keyframes my-face{2%{-webkit-transform:translateY(1.5px) rotate(1.5deg);transform:translateY(1.5px) rotate(1.5deg)}4%{-webkit-transform:translateY(-1.5px) rotate(-.5deg);transform:translateY(-1.5px) rotate(-.5deg)}6%{-webkit-transform:translateY(1.5px) rotate(-1.5deg);transform:translateY(1.5px) rotate(-1.5deg)}8%{-webkit-transform:translateY(-1.5px) rotate(-1.5deg);transform:translateY(-1.5px) rotate(-1.5deg)}10%{-webkit-transform:translateY(2.5px) rotate(1.5deg);transform:translateY(2.5px) rotate(1.5deg)}12%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}14%{-webkit-transform:translateY(-1.5px) rotate(1.5deg);transform:translateY(-1.5px) rotate(1.5deg)}16%{-webkit-transform:translateY(-.5px) rotate(-1.5deg);transform:translateY(-.5px) rotate(-1.5deg)}18%{-webkit-transform:translateY(.5px) rotate(-1.5deg);transform:translateY(.5px) rotate(-1.5deg)}20%{-webkit-transform:translateY(-1.5px) rotate(2.5deg);transform:translateY(-1.5px) rotate(2.5deg)}22%{-webkit-transform:translateY(.5px) rotate(-1.5deg);transform:translateY(.5px) rotate(-1.5deg)}24%{-webkit-transform:translateY(1.5px) rotate(1.5deg);transform:translateY(1.5px) rotate(1.5deg)}26%{-webkit-transform:translateY(.5px) rotate(.5deg);transform:translateY(.5px) rotate(.5deg)}28%{-webkit-transform:translateY(.5px) rotate(1.5deg);transform:translateY(.5px) rotate(1.5deg)}30%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}32%{-webkit-transform:translateY(1.5px) rotate(-.5deg);transform:translateY(1.5px) rotate(-.5deg)}34%{-webkit-transform:translateY(1.5px) rotate(-.5deg);transform:translateY(1.5px) rotate(-.5deg)}36%{-webkit-transform:translateY(-1.5px) rotate(2.5deg);transform:translateY(-1.5px) rotate(2.5deg)}38%{-webkit-transform:translateY(1.5px) rotate(-1.5deg);transform:translateY(1.5px) rotate(-1.5deg)}40%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}42%{-webkit-transform:translateY(2.5px) rotate(-1.5deg);transform:translateY(2.5px) rotate(-1.5deg)}44%{-webkit-transform:translateY(1.5px) rotate(.5deg);transform:translateY(1.5px) rotate(.5deg)}46%{-webkit-transform:translateY(-1.5px) rotate(2.5deg);transform:translateY(-1.5px) rotate(2.5deg)}48%{-webkit-transform:translateY(-.5px) rotate(.5deg);transform:translateY(-.5px) rotate(.5deg)}50%{-webkit-transform:translateY(.5px) rotate(.5deg);transform:translateY(.5px) rotate(.5deg)}52%{-webkit-transform:translateY(2.5px) rotate(2.5deg);transform:translateY(2.5px) rotate(2.5deg)}54%{-webkit-transform:translateY(-1.5px) rotate(1.5deg);transform:translateY(-1.5px) rotate(1.5deg)}56%{-webkit-transform:translateY(2.5px) rotate(2.5deg);transform:translateY(2.5px) rotate(2.5deg)}58%{-webkit-transform:translateY(.5px) rotate(2.5deg);transform:translateY(.5px) rotate(2.5deg)}60%{-webkit-transform:translateY(2.5px) rotate(2.5deg);transform:translateY(2.5px) rotate(2.5deg)}62%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}64%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}66%{-webkit-transform:translateY(1.5px) rotate(-.5deg);transform:translateY(1.5px) rotate(-.5deg)}68%{-webkit-transform:translateY(-1.5px) rotate(-.5deg);transform:translateY(-1.5px) rotate(-.5deg)}70%{-webkit-transform:translateY(1.5px) rotate(.5deg);transform:translateY(1.5px) rotate(.5deg)}72%{-webkit-transform:translateY(2.5px) rotate(1.5deg);transform:translateY(2.5px) rotate(1.5deg)}74%{-webkit-transform:translateY(-.5px) rotate(.5deg);transform:translateY(-.5px) rotate(.5deg)}76%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}78%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}80%{-webkit-transform:translateY(1.5px) rotate(1.5deg);transform:translateY(1.5px) rotate(1.5deg)}82%{-webkit-transform:translateY(-.5px) rotate(.5deg);transform:translateY(-.5px) rotate(.5deg)}84%{-webkit-transform:translateY(1.5px) rotate(2.5deg);transform:translateY(1.5px) rotate(2.5deg)}86%{-webkit-transform:translateY(-1.5px) rotate(-1.5deg);transform:translateY(-1.5px) rotate(-1.5deg)}88%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}90%{-webkit-transform:translateY(2.5px) rotate(-.5deg);transform:translateY(2.5px) rotate(-.5deg)}92%{-webkit-transform:translateY(.5px) rotate(-.5deg);transform:translateY(.5px) rotate(-.5deg)}94%{-webkit-transform:translateY(2.5px) rotate(.5deg);transform:translateY(2.5px) rotate(.5deg)}96%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}98%{-webkit-transform:translateY(-1.5px) rotate(-.5deg);transform:translateY(-1.5px) rotate(-.5deg)}0%,to{-webkit-transform:translate(0) rotate(0deg);transform:translate(0) rotate(0deg)}}.dplayer{position:relative;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:1}.dplayer *{box-sizing:content-box}.dplayer svg{width:100%;height:100%}.dplayer svg circle,.dplayer svg path{fill:#fff}.dplayer:-webkit-full-screen{width:100%;height:100%;background:#000;position:fixed;z-index:100000;left:0;top:0;margin:0;padding:0;-webkit-transform:translate(0);transform:translate(0)}.dplayer:-webkit-full-screen .dplayer-danmaku .dplayer-danmaku-bottom.dplayer-danmaku-move,.dplayer:-webkit-full-screen .dplayer-danmaku .dplayer-danmaku-top.dplayer-danmaku-move{-webkit-animation:danmaku-center 6s linear;animation:danmaku-center 6s linear;-webkit-animation-play-state:inherit;animation-play-state:inherit}.dplayer:-webkit-full-screen .dplayer-danmaku .dplayer-danmaku-right.dplayer-danmaku-move{-webkit-animation:danmaku 8s linear;animation:danmaku 8s linear;-webkit-animation-play-state:inherit;animation-play-state:inherit}.dplayer.dplayer-live .dplayer-bar-wrap,.dplayer.dplayer-live.dplayer-no-danmaku .dplayer-setting,.dplayer.dplayer-live .dplayer-setting-loop,.dplayer.dplayer-live .dplayer-setting-speed,.dplayer.dplayer-live .dplayer-time,.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-comment,.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box .dplayer-setting-danmaku,.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box .dplayer-setting-danunlimit,.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box .dplayer-setting-showdan,.dplayer.dplayer-no-danmaku .dplayer-danmaku{display:none}.dplayer.dplayer-arrow .dplayer-danmaku{font-size:18px}.dplayer.dplayer-arrow .dplayer-icon{margin:0 -3px}.dplayer.dplayer-playing .dplayer-danmaku .dplayer-danmaku-move{-webkit-animation-play-state:running;animation-play-state:running}@media (min-width:900px){.dplayer.dplayer-playing .dplayer-controller,.dplayer.dplayer-playing .dplayer-controller-mask{opacity:0}.dplayer.dplayer-playing:hover .dplayer-controller,.dplayer.dplayer-playing:hover .dplayer-controller-mask{opacity:1}}.dplayer.dplayer-loading .dplayer-bezel .diplayer-loading-icon{display:block}.dplayer.dplayer-loading .dplayer-danmaku,.dplayer.dplayer-loading .dplayer-danmaku-move,.dplayer.dplayer-paused .dplayer-danmaku,.dplayer.dplayer-paused .dplayer-danmaku-move{-webkit-animation-play-state:paused;animation-play-state:paused}.dplayer.dplayer-hide-controller{cursor:none}.dplayer.dplayer-hide-controller .dplayer-controller,.dplayer.dplayer-hide-controller .dplayer-controller-mask{opacity:0;-webkit-transform:translateY(100%);transform:translateY(100%)}.dplayer.dplayer-show-controller .dplayer-controller,.dplayer.dplayer-show-controller .dplayer-controller-mask{opacity:1}.dplayer.dplayer-fulled{position:fixed;z-index:100000;left:0;top:0;width:100%;height:100%}.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-camera-icon,.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-volume{display:none}.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-full .dplayer-full-in-icon{position:static;display:inline-block}.dplayer.dplayer-mobile .dplayer-bar-time{display:none}.dplayer-web-fullscreen-fix{position:fixed;top:0;left:0;margin:0;padding:0}[data-balloon]:before{display:none}[data-balloon]:after{padding:.3em .7em;background:hsla(0,0%,7%,.7)}[data-balloon][data-balloon-pos=up]:after{margin-bottom:0}.dplayer-bezel{position:absolute;left:0;right:0;top:0;bottom:0;font-size:22px;color:#fff;pointer-events:none}.dplayer-bezel .dplayer-bezel-icon{position:absolute;top:50%;left:50%;margin:-26px 0 0 -26px;height:52px;width:52px;padding:12px;box-sizing:border-box;background:rgba(0,0,0,.5);border-radius:50%;opacity:0;pointer-events:none}.dplayer-bezel .dplayer-bezel-icon.dplayer-bezel-transition{-webkit-animation:bezel-hide .5s linear;animation:bezel-hide .5s linear}@-webkit-keyframes bezel-hide{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform:scale(2);transform:scale(2)}}@keyframes bezel-hide{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform:scale(2);transform:scale(2)}}.dplayer-bezel .dplayer-danloading{position:absolute;top:50%;margin-top:-7px;width:100%;text-align:center;font-size:14px;line-height:14px;-webkit-animation:my-face 5s infinite ease-in-out;animation:my-face 5s infinite ease-in-out}.dplayer-bezel .diplayer-loading-icon{display:none;position:absolute;top:50%;left:50%;margin:-18px 0 0 -18px;height:36px;width:36px;pointer-events:none}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-hide{display:none}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot{-webkit-animation:diplayer-loading-dot-fade .8s ease infinite;animation:diplayer-loading-dot-fade .8s ease infinite;opacity:0;-webkit-transform-origin:4px 4px;transform-origin:4px 4px}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-7{-webkit-animation-delay:.7s;animation-delay:.7s}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-6{-webkit-animation-delay:.6s;animation-delay:.6s}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-5{-webkit-animation-delay:.5s;animation-delay:.5s}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-4{-webkit-animation-delay:.4s;animation-delay:.4s}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-3{-webkit-animation-delay:.3s;animation-delay:.3s}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-2{-webkit-animation-delay:.2s;animation-delay:.2s}.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-1{-webkit-animation-delay:.1s;animation-delay:.1s}@-webkit-keyframes diplayer-loading-dot-fade{0%{opacity:.7;-webkit-transform:scale(1.2);transform:scale(1.2)}50%{opacity:.25;-webkit-transform:scale(.9);transform:scale(.9)}to{opacity:.25;-webkit-transform:scale(.85);transform:scale(.85)}}@keyframes diplayer-loading-dot-fade{0%{opacity:.7;-webkit-transform:scale(1.2);transform:scale(1.2)}50%{opacity:.25;-webkit-transform:scale(.9);transform:scale(.9)}to{opacity:.25;-webkit-transform:scale(.85);transform:scale(.85)}}.dplayer-controller-mask{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==) repeat-x bottom;height:98px;width:100%}.dplayer-controller,.dplayer-controller-mask{position:absolute;bottom:0;transition:all .3s ease}.dplayer-controller{left:0;right:0;height:41px;padding:0 20px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.dplayer-controller.dplayer-controller-comment .dplayer-icons{display:none}.dplayer-controller.dplayer-controller-comment .dplayer-icons.dplayer-comment-box{display:block}.dplayer-controller .dplayer-bar-wrap{padding:5px 0;cursor:pointer;position:absolute;bottom:33px;width:calc(100% - 40px);height:3px}.dplayer-controller .dplayer-bar-wrap:hover .dplayer-bar .dplayer-played .dplayer-thumb{-webkit-transform:scale(1);transform:scale(1)}.dplayer-controller .dplayer-bar-wrap:hover .dplayer-highlight{display:block;width:8px;-webkit-transform:translateX(-4px);transform:translateX(-4px);top:4px;height:40%}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight{z-index:12;position:absolute;top:5px;width:6px;height:20%;border-radius:6px;background-color:#fff;text-align:center;-webkit-transform:translateX(-3px);transform:translateX(-3px);transition:all .2s ease-in-out}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover .dplayer-highlight-text{display:block}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover~.dplayer-bar-preview,.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover~.dplayer-bar-time{opacity:0}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight .dplayer-highlight-text{display:none;position:absolute;left:50%;top:-24px;padding:5px 8px;background-color:rgba(0,0,0,.62);color:#fff;border-radius:4px;font-size:12px;white-space:nowrap;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-preview{position:absolute;background:#fff;pointer-events:none;display:none;background-size:16000px 100%}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-preview-canvas{position:absolute;width:100%;height:100%;z-index:1;pointer-events:none}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-time{position:absolute;left:0;top:-20px;border-radius:4px;padding:5px 7px;background-color:rgba(0,0,0,.62);color:#fff;font-size:12px;text-align:center;opacity:1;transition:opacity .1s ease-in-out;word-wrap:normal;word-break:normal;z-index:2;pointer-events:none}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-time.hidden{opacity:0}.dplayer-controller .dplayer-bar-wrap .dplayer-bar{position:relative;height:3px;width:100%;background:hsla(0,0%,100%,.2);cursor:pointer}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-loaded{background:hsla(0,0%,100%,.4);transition:all .5s ease}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-loaded,.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played{position:absolute;left:0;top:0;bottom:0;height:3px;will-change:width}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played .dplayer-thumb{position:absolute;top:0;right:5px;margin-top:-4px;margin-right:-10px;height:11px;width:11px;border-radius:50%;cursor:pointer;transition:all .3s ease-in-out;-webkit-transform:scale(0);transform:scale(0)}.dplayer-controller .dplayer-icons{height:38px;position:absolute;bottom:0}.dplayer-controller .dplayer-icons.dplayer-comment-box{display:none;position:absolute;transition:all .3s ease-in-out;z-index:2;height:38px;bottom:0;left:20px;right:20px;color:#fff}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-icon{padding:7px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-icon{position:absolute;left:0;top:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-send-icon{position:absolute;right:0;top:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box{position:absolute;background:rgba(28,28,28,.9);bottom:41px;left:0;box-shadow:0 0 25px rgba(0,0,0,.3);border-radius:4px;padding:10px 10px 16px;font-size:14px;width:204px;transition:all .3s ease-in-out;-webkit-transform:scale(0);transform:scale(0)}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box.dplayer-comment-setting-open{-webkit-transform:scale(1);transform:scale(1)}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box input[type=radio]{display:none}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box label{cursor:pointer}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-title{font-size:13px;color:#fff;line-height:30px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type{font-size:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type .dplayer-comment-setting-title{margin-bottom:6px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(2) span{border-radius:4px 0 0 4px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(4) span{border-radius:0 4px 4px 0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type span{width:33%;padding:4px 6px;line-height:16px;display:inline-block;font-size:12px;color:#fff;border:1px solid #fff;margin-right:-1px;box-sizing:border-box;text-align:center;cursor:pointer}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type input:checked+span{background:#e4e4e6;color:#1c1c1c}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color{font-size:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color label{font-size:0;padding:6px;display:inline-block}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color span{width:22px;height:22px;display:inline-block;border-radius:50%;box-sizing:border-box;cursor:pointer}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color span:hover{-webkit-animation:my-face 5s infinite ease-in-out;animation:my-face 5s infinite ease-in-out}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input{outline:none;border:none;padding:8px 31px;font-size:14px;line-height:18px;text-align:center;border-radius:4px;background:none;margin:0;height:100%;box-sizing:border-box;width:100%;color:#fff}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::-webkit-input-placeholder{color:#fff;opacity:.8}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input:-ms-input-placeholder,.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::-ms-input-placeholder{color:#fff;opacity:.8}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::placeholder{color:#fff;opacity:.8}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::-ms-clear{display:none}.dplayer-controller .dplayer-icons.dplayer-icons-left .dplayer-icon{padding:7px}.dplayer-controller .dplayer-icons.dplayer-icons-right{right:20px}.dplayer-controller .dplayer-icons.dplayer-icons-right .dplayer-icon{padding:8px}.dplayer-controller .dplayer-icons .dplayer-live-badge,.dplayer-controller .dplayer-icons .dplayer-time{line-height:38px;color:#eee;text-shadow:0 0 2px rgba(0,0,0,.5);vertical-align:middle;font-size:13px;cursor:default}.dplayer-controller .dplayer-icons .dplayer-live-dot{display:inline-block;width:6px;height:6px;vertical-align:4%;margin-right:5px;content:"";border-radius:6px}.dplayer-controller .dplayer-icons .dplayer-icon{width:40px;height:100%;border:none;background-color:transparent;outline:none;cursor:pointer;vertical-align:middle;box-sizing:border-box;display:inline-block}.dplayer-controller .dplayer-icons .dplayer-icon .dplayer-icon-content{transition:all .2s ease-in-out;opacity:.8}.dplayer-controller .dplayer-icons .dplayer-icon:hover .dplayer-icon-content{opacity:1}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-quality-icon{color:#fff;width:auto;line-height:22px;font-size:14px}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-icon{padding:10px 9px 9px}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-setting-icon{padding-top:8.5px}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-volume-icon{width:43px}.dplayer-controller .dplayer-icons .dplayer-volume{position:relative;display:inline-block;cursor:pointer;height:100%}.dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-volume-bar-wrap .dplayer-volume-bar{width:45px}.dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{-webkit-transform:scale(1);transform:scale(1)}.dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-volume-bar-wrap .dplayer-volume-bar{width:45px}.dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{-webkit-transform:scale(1);transform:scale(1)}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap{display:inline-block;margin:0 10px 0 -5px;vertical-align:middle;height:100%}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar{position:relative;top:17px;width:0;height:3px;background:#aaa;transition:all .3s ease-in-out}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner{position:absolute;bottom:0;left:0;height:100%;transition:all .1s ease;will-change:width}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{position:absolute;top:0;right:5px;margin-top:-4px;margin-right:-10px;height:11px;width:11px;border-radius:50%;cursor:pointer;transition:all .3s ease-in-out;-webkit-transform:scale(0);transform:scale(0)}.dplayer-controller .dplayer-icons .dplayer-setting,.dplayer-controller .dplayer-icons .dplayer-subtitle-btn{display:inline-block;height:100%}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box{position:absolute;right:0;bottom:50px;-webkit-transform:scale(0);transform:scale(0);width:150px;border-radius:2px;background:rgba(28,28,28,.9);padding:7px 0;transition:all .3s ease-in-out;overflow:hidden;z-index:2}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box>div{display:none}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box>div.dplayer-setting-origin-panel{display:block}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-open{-webkit-transform:scale(1);transform:scale(1)}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-narrow{width:70px;height:180px;text-align:center}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-speed .dplayer-setting-origin-panel{display:none}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-speed .dplayer-setting-speed-panel{display:block}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-item,.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-speed-item{height:30px;padding:5px 10px;box-sizing:border-box;cursor:pointer;position:relative}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-item:hover,.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-speed-item:hover{background-color:hsla(0,0%,100%,.1)}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku{padding:5px 0}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-label{padding:0 10px;display:inline}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku:hover .dplayer-label{display:none}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku:hover .dplayer-danmaku-bar-wrap{display:inline-block}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-label{display:none}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-danmaku-bar-wrap{display:inline-block}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap{padding:0 10px;box-sizing:border-box;display:none;vertical-align:middle;height:100%;width:100%}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar{position:relative;top:8.5px;width:100%;height:3px;background:#fff;transition:all .3s ease-in-out}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner{position:absolute;bottom:0;left:0;height:100%;transition:all .1s ease;background:#aaa;will-change:width}.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner .dplayer-thumb{position:absolute;top:0;right:5px;margin-top:-4px;margin-right:-10px;height:11px;width:11px;border-radius:50%;cursor:pointer;transition:all .3s ease-in-out;background:#aaa}.dplayer-controller .dplayer-icons .dplayer-full{display:inline-block;height:100%;position:relative}.dplayer-controller .dplayer-icons .dplayer-full:hover .dplayer-full-in-icon{display:block}.dplayer-controller .dplayer-icons .dplayer-full .dplayer-full-in-icon{position:absolute;top:-30px;z-index:1;display:none}.dplayer-controller .dplayer-icons .dplayer-quality{position:relative;display:inline-block;height:100%;z-index:2}.dplayer-controller .dplayer-icons .dplayer-quality:hover .dplayer-quality-list,.dplayer-controller .dplayer-icons .dplayer-quality:hover .dplayer-quality-mask{display:block}.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-mask{display:none;position:absolute;bottom:38px;left:-18px;width:80px;padding-bottom:12px}.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-list{display:none;font-size:12px;width:80px;border-radius:2px;background:rgba(28,28,28,.9);padding:5px 0;transition:all .3s ease-in-out;overflow:hidden;color:#fff;text-align:center}.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-item{height:25px;box-sizing:border-box;cursor:pointer;line-height:25px}.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-item:hover{background-color:hsla(0,0%,100%,.1)}.dplayer-controller .dplayer-icons .dplayer-comment{display:inline-block;height:100%}.dplayer-controller .dplayer-icons .dplayer-label{color:#eee;font-size:13px;display:inline-block;vertical-align:middle;white-space:nowrap}.dplayer-controller .dplayer-icons .dplayer-toggle{width:32px;height:20px;text-align:center;font-size:0;vertical-align:middle;position:absolute;top:5px;right:10px}.dplayer-controller .dplayer-icons .dplayer-toggle input{max-height:0;max-width:0;display:none}.dplayer-controller .dplayer-icons .dplayer-toggle input+label{display:inline-block;position:relative;box-shadow:inset 0 0 0 0 #dfdfdf;border:1px solid #dfdfdf;height:20px;width:32px;border-radius:10px;box-sizing:border-box;cursor:pointer;transition:.2s ease-in-out}.dplayer-controller .dplayer-icons .dplayer-toggle input+label:after,.dplayer-controller .dplayer-icons .dplayer-toggle input+label:before{content:"";position:absolute;display:block;height:18px;width:18px;top:0;left:0;border-radius:15px;transition:.2s ease-in-out}.dplayer-controller .dplayer-icons .dplayer-toggle input+label:after{background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.4)}.dplayer-controller .dplayer-icons .dplayer-toggle input:checked+label{border-color:hsla(0,0%,100%,.5)}.dplayer-controller .dplayer-icons .dplayer-toggle input:checked+label:before{width:30px;background:hsla(0,0%,100%,.5)}.dplayer-controller .dplayer-icons .dplayer-toggle input:checked+label:after{left:12px}.dplayer-danmaku{position:absolute;left:0;right:0;top:0;bottom:0;font-size:22px;color:#fff}.dplayer-danmaku .dplayer-danmaku-item{display:inline-block;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;white-space:nowrap;text-shadow:.5px .5px .5px rgba(0,0,0,.5)}.dplayer-danmaku .dplayer-danmaku-item--demo{position:absolute;visibility:hidden}.dplayer-danmaku .dplayer-danmaku-right{position:absolute;right:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.dplayer-danmaku .dplayer-danmaku-right.dplayer-danmaku-move{will-change:transform;-webkit-animation:danmaku 5s linear;animation:danmaku 5s linear;-webkit-animation-play-state:paused;animation-play-state:paused}@-webkit-keyframes danmaku{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes danmaku{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}}.dplayer-danmaku .dplayer-danmaku-bottom,.dplayer-danmaku .dplayer-danmaku-top{position:absolute;width:100%;text-align:center;visibility:hidden}.dplayer-danmaku .dplayer-danmaku-bottom.dplayer-danmaku-move,.dplayer-danmaku .dplayer-danmaku-top.dplayer-danmaku-move{will-change:visibility;-webkit-animation:danmaku-center 4s linear;animation:danmaku-center 4s linear;-webkit-animation-play-state:paused;animation-play-state:paused}@-webkit-keyframes danmaku-center{0%{visibility:visible}to{visibility:visible}}@keyframes danmaku-center{0%{visibility:visible}to{visibility:visible}}.dplayer-logo{pointer-events:none;position:absolute;left:20px;top:20px;max-width:50px;max-height:50px}.dplayer-logo img{max-width:100%;max-height:100%;background:none}.dplayer-menu{position:absolute;width:170px;border-radius:2px;background:rgba(28,28,28,.85);padding:5px 0;overflow:hidden;z-index:3;display:none}.dplayer-menu.dplayer-menu-show{display:block}.dplayer-menu .dplayer-menu-item{height:30px;box-sizing:border-box;cursor:pointer}.dplayer-menu .dplayer-menu-item:hover{background-color:hsla(0,0%,100%,.1)}.dplayer-menu .dplayer-menu-item a{padding:0 10px;line-height:30px;color:#eee;font-size:13px;display:inline-block;vertical-align:middle;width:100%;box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.dplayer-menu .dplayer-menu-item a:hover{text-decoration:none}.dplayer-notice{opacity:0;position:absolute;bottom:60px;left:20px;font-size:14px;border-radius:2px;background:rgba(28,28,28,.9);padding:7px 20px;transition:all .3s ease-in-out;overflow:hidden;color:#fff;pointer-events:none}.dplayer-subtitle{position:absolute;bottom:40px;width:90%;left:5%;text-align:center;color:#fff;text-shadow:.5px .5px .5px rgba(0,0,0,.5);font-size:20px}.dplayer-subtitle.dplayer-subtitle-hide{display:none}.dplayer-mask{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1;display:none}.dplayer-mask.dplayer-mask-show{display:block}.dplayer-video-wrap{position:relative;background:#000;font-size:0;width:100%;height:100%}.dplayer-video-wrap .dplayer-video{width:100%;height:100%;display:none}.dplayer-video-wrap .dplayer-video-current{display:block}.dplayer-video-wrap .dplayer-video-prepare{display:none}.dplayer-info-panel{position:absolute;top:10px;left:10px;width:400px;background:rgba(28,28,28,.8);padding:10px;color:#fff;font-size:12px;border-radius:2px}.dplayer-info-panel-hide{display:none}.dplayer-info-panel .dplayer-info-panel-close{cursor:pointer;position:absolute;right:10px;top:10px}.dplayer-info-panel .dplayer-info-panel-item>span{display:inline-block;vertical-align:middle;line-height:15px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.dplayer-info-panel .dplayer-info-panel-item-title{width:100px;text-align:right;margin-right:10px}.dplayer-info-panel .dplayer-info-panel-item-data{width:260px}
3 |
4 | /*# sourceMappingURL=DPlayer.min.css.map*/
--------------------------------------------------------------------------------
/js/mdui.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * mdui v0.4.3 (https://mdui.org)
3 | * Copyright 2016-2019 zdhxiong
4 | * Licensed under MIT
5 | */
6 | !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.mdui=e()}(this,function(){"use strict";var a,d={};a=0,window.requestAnimationFrame||(window.requestAnimationFrame=window.webkitRequestAnimationFrame,window.cancelAnimationFrame=window.webkitCancelAnimationFrame),window.requestAnimationFrame||(window.requestAnimationFrame=function(t,e){var n=(new Date).getTime(),i=Math.max(0,16.7-(n-a)),o=window.setTimeout(function(){t(n+i)},i);return a=n+i,o}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)});var n,g=function(){var c=function(t){for(var e=0;e"===n[n.length-1]){var i="div";0===n.indexOf(":~]/)?document.querySelectorAll(t):[document.getElementById(t.slice(1))],r=0;r"===t[t.length-1])e=v(t).get();else{var n=document.createElement("div");n.innerHTML=t,e=[].slice.call(n.childNodes)}return 1===a&&e.reverse(),this.each(function(n,i){x(e,function(t,e){o&&0').appendTo(document.body).reflow().css("z-index",t));var n=e.data("overlay-level")||0;return e.data("overlay-level",++n).addClass("mdui-overlay-show")},hideOverlay:function(t){var e=g(".mdui-overlay");if(e.length){var n=t?1:e.data("overlay-level");1i.lastScrollY?"down":"up",n=Math.abs(t-i.lastScrollY)>=i.options.tolerance[e];t>i.lastScrollY&&t>=i.options.offset&&n?i.unpin():(t'+t+">"};function n(t){this.$table=g(t).eq(0),this.$table.length&&this.init()}n.prototype.init=function(){var t=this;t.$thRow=t.$table.find("thead tr"),t.$tdRows=t.$table.find("tbody tr"),t.$tdCheckboxs=g(),t.selectable=t.$table.hasClass("mdui-table-selectable"),t.selectedRow=0,t._updateThCheckbox(),t._updateTdCheckbox(),t._updateNumericCol()},n.prototype._updateThCheckboxStatus=function(){var t=this,e=t.$thCheckbox[0];e.checked=t.selectedRow===t.$tdRows.length,e.indeterminate=t.selectedRow&&t.selectedRow!==t.$tdRows.length},n.prototype._updateTdCheckbox=function(){var n=this;n.$tdRows.each(function(){var t=g(this);if(t.find(".mdui-table-cell-checkbox").remove(),n.selectable){var e=g(i("td")).prependTo(t).find('input[type="checkbox"]');t.hasClass("mdui-table-row-selected")&&(e[0].checked=!0,n.selectedRow++),n._updateThCheckboxStatus(),e.on("change",function(){e[0].checked?(t.addClass("mdui-table-row-selected"),n.selectedRow++):(t.removeClass("mdui-table-row-selected"),n.selectedRow--),n._updateThCheckboxStatus()}),n.$tdCheckboxs=n.$tdCheckboxs.add(e)}})},n.prototype._updateThCheckbox=function(){var t=this;t.$thRow.find(".mdui-table-cell-checkbox").remove(),t.selectable&&(t.$thCheckbox=g(i("th")).prependTo(t.$thRow).find('input[type="checkbox"]').on("change",function(){var n=t.$thCheckbox[0].checked;t.selectedRow=n?t.$tdRows.length:0,t.$tdCheckboxs.each(function(t,e){e.checked=n}),t.$tdRows.each(function(t,e){g(e)[n?"addClass":"removeClass"]("mdui-table-row-selected")})}))},n.prototype._updateNumericCol=function(){var n,i,o=this;o.$thRow.find("th").each(function(e,t){n=g(t),o.$tdRows.each(function(){i=g(this);var t=n.hasClass("mdui-table-col-numeric")?"addClass":"removeClass";i.find("td").eq(e)[t]("mdui-table-col-numeric")})})},d.mutation(".mdui-table",function(){var t=g(this);t.data("mdui.table")||t.data("mdui.table",new n(t))}),d.updateTables=function(){g(arguments.length?arguments[0]:".mdui-table").each(function(){var t=g(this),e=t.data("mdui.table");e?e.init():t.data("mdui.table",new n(t))})}}(),c={delay:200,show:function(t,e){if(2!==t.button){var n,i=(n="touches"in t&&t.touches.length?t.touches[0]:t).pageX,o=n.pageY,a=e.offset(),s=i-a.left,r=o-a.top,d=e.innerHeight(),c=e.innerWidth(),u=Math.max(Math.pow(Math.pow(d,2)+Math.pow(c,2),.5),48),l="translate3d("+(c/2-s)+"px, "+(d/2-r)+"px, 0) scale(1)";g('').data("translate",l).prependTo(e).reflow().transform(l)}},hide:function(t,e){var n=g(e||this);n.children(".mdui-ripple-wave").each(function(){!function(t){if(!t.length||t.data("isRemoved"))return;t.data("isRemoved",!0);var e=setTimeout(function(){t.remove()},400),n=t.data("translate");t.addClass("mdui-ripple-wave-fill").transform(n.replace("scale(1)","scale(1.01)")).transitionEnd(function(){clearTimeout(e),t.addClass("mdui-ripple-wave-out").transform(n.replace("scale(1)","scale(1.01)")),e=setTimeout(function(){t.remove()},700),setTimeout(function(){t.transitionEnd(function(){clearTimeout(e),t.remove()})},0)})}(g(this))}),n.off("touchmove touchend touchcancel mousemove mouseup mouseleave",c.hide)}},f.on(r.start,function(e){if(r.isAllow(e)&&(r.register(e),e.target!==document)){var n,t=g(e.target);if((n=t.hasClass("mdui-ripple")?t:t.parents(".mdui-ripple").eq(0)).length){if(n[0].disabled||null!==n.attr("disabled"))return;if("touchstart"===e.type){var i=!1,o=setTimeout(function(){o=null,c.show(e,n)},c.delay),a=function(t){o&&(clearTimeout(o),o=null,c.show(e,n)),i||(i=!0,c.hide(t,n))};n.on("touchmove",function(t){o&&(clearTimeout(o),o=null),a(t)}).on("touchend touchcancel",a)}else c.show(e,n),n.on("touchmove touchend touchcancel mousemove mouseup mouseleave",c.hide)}}}).on(r.unlock,r.register),h=function(t,e){return!("object"!=typeof t||null===t||void 0===t[e]||!t[e])&&t[e]},f.on("input focus blur",".mdui-textfield-input",{useCapture:!0},function(t){var e=t.target,n=g(e),i=t.type,o=n.val(),a=h(t.detail,"reInit"),s=h(t.detail,"domLoadedEvent"),r=n.attr("type")||"";if(!(0<=["checkbox","button","submit","range","radio","image"].indexOf(r))){var d=n.parent(".mdui-textfield");if("focus"===i&&d.addClass("mdui-textfield-focus"),"blur"===i&&d.removeClass("mdui-textfield-focus"),"blur"!==i&&"input"!==i||d[o&&""!==o?"addClass":"removeClass"]("mdui-textfield-not-empty"),d[e.disabled?"addClass":"removeClass"]("mdui-textfield-disabled"),"input"!==i&&"blur"!==i||s||e.validity&&d[e.validity.valid?"removeClass":"addClass"]("mdui-textfield-invalid-html5"),"textarea"===t.target.nodeName.toLowerCase()){var c=n.val(),u=!1;""===c.replace(/[\r\n]/g,"")&&(n.val(" "+c),u=!0),n.height("");var l=n.height(),f=e.scrollHeight;l / '+p+"").appendTo(d),d.find(".mdui-textfield-counter-inputed").text(o.length.toString())),(d.find(".mdui-textfield-helper").length||d.find(".mdui-textfield-error").length||p)&&d.addClass("mdui-textfield-has-bottom")}}),f.on("click",".mdui-textfield-expandable .mdui-textfield-icon",function(){g(this).parents(".mdui-textfield").addClass("mdui-textfield-expanded").find(".mdui-textfield-input")[0].focus()}),f.on("click",".mdui-textfield-expanded .mdui-textfield-close",function(){g(this).parents(".mdui-textfield").removeClass("mdui-textfield-expanded").find(".mdui-textfield-input").val("")}),d.updateTextFields=function(){g(arguments.length?arguments[0]:".mdui-textfield").each(function(){g(this).find(".mdui-textfield-input").trigger("input",{reInit:!0})})},g(function(){d.mutation(".mdui-textfield",function(){g(this).find(".mdui-textfield-input").trigger("input",{domLoadedEvent:!0})})}),u=function(t){var e=t.data(),n=e.$track,i=e.$fill,o=e.$thumb,a=e.$input,s=e.min,r=e.max,d=e.disabled,c=e.discrete,u=e.$thumbText,l=a.val(),f=(l-s)/(r-s)*100;i.width(f+"%"),n.width(100-f+"%"),d&&(i.css("padding-right","6px"),n.css("padding-left","6px")),o.css("left",f+"%"),c&&u.text(l),t[0===parseFloat(f)?"addClass":"removeClass"]("mdui-slider-zero")},t=function(t){var e=g(''),n=g(''),i=g(''),o=t.find('input[type="range"]'),a=o[0].disabled;t[a?"addClass":"removeClass"]("mdui-slider-disabled"),t.find(".mdui-slider-track").remove(),t.find(".mdui-slider-fill").remove(),t.find(".mdui-slider-thumb").remove(),t.append(e).append(n).append(i);var s,r=t.hasClass("mdui-slider-discrete");r&&(s=g(""),i.empty().append(s)),t.data({$track:e,$fill:n,$thumb:i,$input:o,min:o.attr("min"),max:o.attr("max"),disabled:a,discrete:r,$thumbText:s}),u(t)},e='.mdui-slider input[type="range"]',f.on("input change",e,function(){var t=g(this).parent();u(t)}).on(r.start,e,function(t){r.isAllow(t)&&(r.register(t),this.disabled||g(this).parent().addClass("mdui-slider-focus"))}).on(r.end,e,function(t){r.isAllow(t)&&(this.disabled||g(this).parent().removeClass("mdui-slider-focus"))}).on(r.unlock,e,r.register),d.updateSliders=function(){g(arguments.length?arguments[0]:".mdui-slider").each(function(){t(g(this))})},g(function(){d.mutation(".mdui-slider",function(){t(g(this))})}),d.Fab=function(){var o={trigger:"hover"};function t(t,e){var n=this;if(n.$fab=g(t).eq(0),n.$fab.length){var i=n.$fab.data("mdui.fab");if(i)return i;n.options=g.extend({},o,e||{}),n.state="closed",n.$btn=n.$fab.find(".mdui-fab"),n.$dial=n.$fab.find(".mdui-fab-dial"),n.$dialBtns=n.$dial.find(".mdui-fab"),"hover"===n.options.trigger&&(n.$btn.on("touchstart mouseenter",function(){n.open()}),n.$fab.on("mouseleave",function(){n.close()})),"click"===n.options.trigger&&n.$btn.on(r.start,function(){n.open()}),f.on(r.start,function(t){g(t.target).parents(".mdui-fab-wrapper").length||n.close()})}}return t.prototype.open=function(){var n=this;"opening"!==n.state&&"opened"!==n.state&&(n.$dialBtns.each(function(t,e){e.style["transition-delay"]=e.style["-webkit-transition-delay"]=15*(n.$dialBtns.length-t)+"ms"}),n.$dial.css("height","auto").addClass("mdui-fab-dial-show"),n.$btn.find(".mdui-fab-opened").length&&n.$btn.addClass("mdui-fab-opened"),n.state="opening",p("open","fab",n,n.$fab),n.$dialBtns.eq(0).transitionEnd(function(){n.$btn.hasClass("mdui-fab-opened")&&(n.state="opened",p("opened","fab",n,n.$fab))}))},t.prototype.close=function(){var t=this;"closing"!==t.state&&"closed"!==t.state&&(t.$dialBtns.each(function(t,e){e.style["transition-delay"]=e.style["-webkit-transition-delay"]=15*t+"ms"}),t.$dial.removeClass("mdui-fab-dial-show"),t.$btn.removeClass("mdui-fab-opened"),t.state="closing",p("close","fab",t,t.$fab),t.$dialBtns.eq(-1).transitionEnd(function(){t.$btn.hasClass("mdui-fab-opened")||(t.state="closed",p("closed","fab",t,t.$fab),t.$dial.css("height",0))}))},t.prototype.toggle=function(){var t=this;"opening"===t.state||"opened"===t.state?t.close():"closing"!==t.state&&"closed"!==t.state||t.open()},t.prototype.getState=function(){return this.state},t.prototype.show=function(){this.$fab.removeClass("mdui-fab-hide")},t.prototype.hide=function(){this.$fab.addClass("mdui-fab-hide")},t}(),g(function(){f.on("touchstart mousedown mouseover","[mdui-fab]",function(t){var e=g(this),n=e.data("mdui.fab");if(!n){var i=s(e.attr("mdui-fab"));n=new d.Fab(e,i),e.data("mdui.fab",n)}})}),d.Select=function(){var a={position:"auto",gutter:16};function t(t,e){var n=this,i=n.$selectNative=g(t).eq(0);if(i.length){var o=i.data("mdui.select");if(o)return o;i.hide(),n.options=g.extend({},a,e||{}),n.uniqueID=g.guid(),n.state="closed",n.handleUpdate(),f.on("click touchstart",function(t){var e=g(t.target);"opening"!==n.state&&"opened"!==n.state||e.is(n.$select)||g.contains(n.$select[0],e[0])||n.close()})}}t.prototype.handleUpdate=function(){var i=this;"opening"!==i.state&&"opened"!==i.state||i.close();var n=i.$selectNative;i.value=n.val(),i.text="",i.$items=g(),n.find("option").each(function(t,e){var n={value:e.value,text:e.textContent,disabled:e.disabled,selected:i.value===e.value,index:t};i.value===n.value&&(i.text=n.text,i.selectedIndex=t),i.$items=i.$items.add(g('").data(n))}),i.$selected=g(''+i.text+""),i.$select=g('').show().append(i.$selected),i.$menu=g('').appendTo(i.$select).append(i.$items),g("#"+i.uniqueID).remove(),n.after(i.$select),i.size=parseInt(i.$selectNative.attr("size")),(!i.size||i.size<0)&&(i.size=i.$items.length,8').appendTo(n.$tab),n.activeIndex=!1;var o=location.hash;o&&n.$tabs.each(function(t,e){if(g(e).attr("href")===o)return n.activeIndex=t,!1}),!1===n.activeIndex&&n.$tabs.each(function(t,e){if(g(e).hasClass("mdui-tab-active"))return n.activeIndex=t,!1}),n.$tabs.length&&!1===n.activeIndex&&(n.activeIndex=0),n._setActive(),T.on("resize",g.throttle(function(){n._setIndicatorPosition()},100)),n.$tabs.each(function(t,e){n._bindTabEvent(e)})}}return t.prototype._bindTabEvent=function(e){var n=this,i=g(e),t=function(t){s(i)?t.preventDefault():(n.activeIndex=n.$tabs.index(e),n._setActive())};i.on("click",t),"hover"===n.options.trigger&&i.on("mouseenter",t),i.on("click",function(t){0===i.attr("href").indexOf("#")&&t.preventDefault()})},t.prototype._setActive=function(){var o=this;o.$tabs.each(function(t,e){var n=g(e),i=n.attr("href");t!==o.activeIndex||s(n)?(n.removeClass("mdui-tab-active"),g(i).hide()):(n.hasClass("mdui-tab-active")||(p("change","tab",o,o.$tab,{index:o.activeIndex,id:i.substr(1)}),p("show","tab",o,n),n.addClass("mdui-tab-active")),g(i).show(),o._setIndicatorPosition())})},t.prototype._setIndicatorPosition=function(){var t,e,n=this;!1!==n.activeIndex?(t=n.$tabs.eq(n.activeIndex),s(t)||(e=t.offset(),n.$indicator.css({left:e.left+n.$tab[0].scrollLeft-n.$tab[0].getBoundingClientRect().left+"px",width:t.width()+"px"}))):n.$indicator.css({left:0,width:0})},t.prototype.next=function(){var t=this;!1!==t.activeIndex&&(t.$tabs.length>t.activeIndex+1?t.activeIndex++:t.options.loop&&(t.activeIndex=0),t._setActive())},t.prototype.prev=function(){var t=this;!1!==t.activeIndex&&(0',g.each(n.buttons,function(t,e){o+=''+e.text+""}),o+="");var t=''+(n.title?'
'+n.title+"
":"")+(n.content?'
'+n.content+"
":"")+o+"
",a=new d.Dialog(t,{history:n.history,overlay:n.overlay,modal:n.modal,closeOnEsc:n.closeOnEsc,destroyOnClosed:n.destroyOnClosed});return n.buttons.length&&a.$dialog.find(".mdui-dialog-actions .mdui-btn").each(function(t,e){g(e).on("click",function(){"function"==typeof n.buttons[t].onClick&&n.buttons[t].onClick(a),n.buttons[t].close&&a.close()})}),"function"==typeof n.onOpen&&a.$dialog.on("open.mdui.dialog",function(){n.onOpen(a)}).on("opened.mdui.dialog",function(){n.onOpened(a)}).on("close.mdui.dialog",function(){n.onClose(a)}).on("closed.mdui.dialog",function(){n.onClosed(a)}),a.open(),a},d.alert=function(t,e,n,i){"function"==typeof e&&(e="",n=arguments[1],i=arguments[2]),void 0===n&&(n=function(){}),void 0===i&&(i={});return i=g.extend({},{confirmText:"ok",history:!0,modal:!1,closeOnEsc:!0},i),d.dialog({title:e,content:t,buttons:[{text:i.confirmText,bold:!1,close:!0,onClick:n}],cssClass:"mdui-dialog-alert",history:i.history,modal:i.modal,closeOnEsc:i.closeOnEsc})},d.confirm=function(t,e,n,i,o){"function"==typeof e&&(e="",n=arguments[1],i=arguments[2],o=arguments[3]),void 0===n&&(n=function(){}),void 0===i&&(i=function(){}),void 0===o&&(o={});return o=g.extend({},{confirmText:"ok",cancelText:"cancel",history:!0,modal:!1,closeOnEsc:!0},o),d.dialog({title:e,content:t,buttons:[{text:o.cancelText,bold:!1,close:!0,onClick:i},{text:o.confirmText,bold:!1,close:!0,onClick:n}],cssClass:"mdui-dialog-confirm",history:o.history,modal:o.modal,closeOnEsc:o.closeOnEsc})},d.prompt=function(t,e,i,n,o){"function"==typeof e&&(e="",i=arguments[1],n=arguments[2],o=arguments[3]),void 0===i&&(i=function(){}),void 0===n&&(n=function(){}),void 0===o&&(o={});var a=''+(t?'":"")+("text"===(o=g.extend({},{confirmText:"ok",cancelText:"cancel",history:!0,modal:!1,closeOnEsc:!0,type:"text",maxlength:"",defaultValue:"",confirmOnEnter:!1},o)).type?'":"")+("textarea"===o.type?'":"")+"
",s=n;"function"==typeof n&&(s=function(t){var e=t.$dialog.find(".mdui-textfield-input").val();n(e,t)});var r=i;return"function"==typeof i&&(r=function(t){var e=t.$dialog.find(".mdui-textfield-input").val();i(e,t)}),d.dialog({title:e,content:a,buttons:[{text:o.cancelText,bold:!1,close:!0,onClick:s},{text:o.confirmText,bold:!1,close:!0,onClick:r}],cssClass:"mdui-dialog-prompt",history:o.history,modal:o.modal,closeOnEsc:o.closeOnEsc,onOpen:function(n){var t=n.$dialog.find(".mdui-textfield-input");d.updateTextFields(t),t[0].focus(),"text"===o.type&&!0===o.confirmOnEnter&&t.on("keydown",function(t){if(13===t.keyCode){var e=n.$dialog.find(".mdui-textfield-input").val();i(e,n),n.close()}}),"textarea"===o.type&&t.on("input",function(){n.handleUpdate()}),o.maxlength&&n.handleUpdate()}})},d.Tooltip=function(){var o={position:"auto",delay:0,content:""};function i(t){var e,n,i,o=t.$target[0].getBoundingClientRect(),a=1024'+n.options.content+"").appendTo(document.body),n.$target.on("touchstart mouseenter",function(t){this.disabled||r.isAllow(t)&&(r.register(t),n.open())}).on("touchend mouseleave",function(t){this.disabled||r.isAllow(t)&&n.close()}).on(r.unlock,function(t){this.disabled||r.register(t)})}}var e=function(t){t.$tooltip.hasClass("mdui-tooltip-open")?(t.state="opened",p("opened","tooltip",t,t.$target)):(t.state="closed",p("closed","tooltip",t,t.$target))};return t.prototype._doOpen=function(){var t=this;t.state="opening",p("open","tooltip",t,t.$target),t.$tooltip.addClass("mdui-tooltip-open").transitionEnd(function(){e(t)})},t.prototype.open=function(t){var e=this;if("opening"!==e.state&&"opened"!==e.state){var n=g.extend({},e.options);g.extend(e.options,s(e.$target.attr("mdui-tooltip"))),t&&g.extend(e.options,t),n.content!==e.options.content&&e.$tooltip.html(e.options.content),i(e),e.options.delay?e.timeoutId=setTimeout(function(){e._doOpen()},e.options.delay):(e.timeoutId=!1,e._doOpen())}},t.prototype.close=function(){var t=this;t.timeoutId&&(clearTimeout(t.timeoutId),t.timeoutId=!1),"closing"!==t.state&&"closed"!==t.state&&(t.state="closing",p("close","tooltip",t,t.$target),t.$tooltip.removeClass("mdui-tooltip-open").transitionEnd(function(){e(t)}))},t.prototype.toggle=function(){var t=this;"opening"===t.state||"opened"===t.state?t.close():"closing"!==t.state&&"closed"!==t.state||t.open()},t.prototype.getState=function(){return this.state},t}(),g(function(){f.on("touchstart mouseover","[mdui-tooltip]",function(){var t=g(this),e=t.data("mdui.tooltip");if(!e){var n=s(t.attr("mdui-tooltip"));e=new d.Tooltip(t,n),t.data("mdui.tooltip",e)}})}),function(){var n,i="__md_snackbar",a={timeout:4e3,buttonText:"",buttonColor:"",position:"bottom",closeOnButtonClick:!0,closeOnOutsideClick:!0,onClick:function(){},onButtonClick:function(){},onOpen:function(){},onOpened:function(){},onClose:function(){},onClosed:function(){}},o=function(t){var e=g(t.target);e.hasClass("mdui-snackbar")||e.parents(".mdui-snackbar").length||n.close()};function s(t,e){var n=this;if(n.message=t,n.options=g.extend({},a,e||{}),n.message){n.state="closed",n.timeoutId=!1;var i="",o="";0===n.options.buttonColor.indexOf("#")||0===n.options.buttonColor.indexOf("rgb")?i='style="color:'+n.options.buttonColor+'"':""!==n.options.buttonColor&&(o="mdui-text-color-"+n.options.buttonColor),n.$snackbar=g('").appendTo(document.body),n._setPosition("close"),n.$snackbar.reflow().addClass("mdui-snackbar-"+n.options.position)}}s.prototype._setPosition=function(t){var e,n,i=this.$snackbar[0].clientHeight,o=this.options.position;e="bottom"===o||"top"===o?"-50%":"0","open"===t?n="0":("bottom"===o&&(n=i),"top"===o&&(n=-i),"left-top"!==o&&"right-top"!==o||(n=-i-24),"left-bottom"!==o&&"right-bottom"!==o||(n=i+24)),this.$snackbar.transform("translate("+e+","+n+"px)")},s.prototype.open=function(){var e=this;e.message&&"opening"!==e.state&&"opened"!==e.state&&(n?l.queue(i,function(){e.open()}):((n=e).state="opening",e.options.onOpen(),e._setPosition("open"),e.$snackbar.transitionEnd(function(){"opening"===e.state&&(e.state="opened",e.options.onOpened(),e.options.buttonText&&e.$snackbar.find(".mdui-snackbar-action").on("click",function(){e.options.onButtonClick(),e.options.closeOnButtonClick&&e.close()}),e.$snackbar.on("click",function(t){g(t.target).hasClass("mdui-snackbar-action")||e.options.onClick()}),e.options.closeOnOutsideClick&&f.on(r.start,o),e.options.timeout&&(e.timeoutId=setTimeout(function(){e.close()},e.options.timeout)))})))},s.prototype.close=function(){var t=this;t.message&&"closing"!==t.state&&"closed"!==t.state&&(t.timeoutId&&clearTimeout(t.timeoutId),t.options.closeOnOutsideClick&&f.off(r.start,o),t.state="closing",t.options.onClose(),t._setPosition("close"),t.$snackbar.transitionEnd(function(){"closing"===t.state&&(n=null,t.state="closed",t.options.onClosed(),t.$snackbar.remove(),l.dequeue(i))}))},d.snackbar=function(t,e){"string"!=typeof t&&(t=(e=t).message);var n=new s(t,e);return n.open(),n}}(),f.on("click",".mdui-bottom-nav>a",function(){var n,i=g(this),o=i.parent();o.children("a").each(function(t,e){(n=i.is(e))&&p("change","bottomNav",null,o,{index:t}),g(e)[n?"addClass":"removeClass"]("mdui-bottom-nav-active")})}),d.mutation(".mdui-bottom-nav-scroll-hide",function(){var t=g(this),e=new d.Headroom(t,{pinnedClass:"mdui-headroom-pinned-down",unpinnedClass:"mdui-headroom-unpinned-down"});t.data("mdui.headroom",e)}),o=function(){var t=!!arguments.length&&arguments[0];return''},m=function(t){var e,n=g(t);e=n.hasClass("mdui-spinner-colorful")?o("1")+o("2")+o("3")+o("4"):o(),n.html(e)},g(function(){d.mutation(".mdui-spinner",function(){m(this)})}),d.updateSpinners=function(){g(arguments.length?arguments[0]:".mdui-spinner").each(function(){m(this)})},d.Panel=function(t,e){return new v(t,e,"panel")},g(function(){d.mutation("[mdui-panel]",function(){var t=g(this),e=t.data("mdui.panel");if(!e){var n=s(t.attr("mdui-panel"));e=new d.Panel(t,n),t.data("mdui.panel",e)}})}),d.Menu=function(){var a={position:"auto",align:"auto",gutter:16,fixed:!1,covered:"auto",subMenuTrigger:"hover",subMenuDelay:200},s=function(t){var e,n,i,o,a,s,r=T.height(),d=T.width(),c=t.options.gutter,u=t.isCovered,l=t.options.fixed,f=t.$menu.width(),p=t.$menu.height(),h=t.$anchor,m=h[0].getBoundingClientRect(),v=m.top,g=m.left,b=m.height,x=m.width,y=r-v-b,w=d-g-x,$=h[0].offsetTop,C=h[0].offsetLeft;if(i="auto"===t.options.position?p+c