├── 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"};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('
"+n.text+"
").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('
'+n.message+"
"+(n.options.buttonText?'"+n.options.buttonText+"":"")+"
").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