Browse Source

更新拦截功能

PUGE 1 tháng trước cách đây
mục cha
commit
b24097114e
13 tập tin đã thay đổi với 1706 bổ sung411 xóa
  1. BIN
      _metadata/generated_indexed_rulesets/_ruleset1
  2. 104 78
      background.js
  3. 0 9
      devtools.html
  4. 0 60
      js/options.js
  5. 21 38
      js/popup.js
  6. 20 9
      manifest.json
  7. 0 200
      options.html
  8. 970 0
      plug/standard.css
  9. 354 0
      plug/star.js
  10. 13 17
      popup.html
  11. 1 0
      rules.json
  12. 64 0
      scripts/376.js
  13. 159 0
      scripts/378.js

BIN
_metadata/generated_indexed_rulesets/_ruleset1


+ 104 - 78
background.js

@@ -1,4 +1,3 @@
-var userInfo = {}
 
 var tempData = null
 var openList = {}
@@ -14,35 +13,7 @@ function saveOpenList() {
   chrome.storage.local.set({ owoOpenList: openList })
 }
 
-function reloadUser (callBack) {
-  chrome.storage.sync.get('userInfo', function(data) {
-    // alert(data)
-    userInfoTemp = data.userInfo
-    if (!userInfoTemp) return
-    username = userInfoTemp.username
-    password = userInfoTemp.password
-    if (username && password) {
-      fetch(`http://user.lamp.run/login`, {
-        method: 'POST',
-        headers: {
-          "Content-Type": "application/json"
-        },
-        body: JSON.stringify({
-          type: "assist",
-          username: username,
-          password: password
-        })
-      }).then((response) => {return response.json();}).then((res) => {
-        if (res.err === 0) {
-          userInfo = res.data
-          if (callBack) callBack()
-        }
-      })
-    }
-  })
-  
-}
-reloadUser()
+
 
 // 对数据进行处理
 function clearData (data) {
@@ -58,7 +29,7 @@ function clearData (data) {
 function reGetData (url, callBack) {
   const nowTime = Date.parse(new Date())
   const serverUrl = 'https://assist.lamp.run/assistAll'
-  fetch(`${serverUrl}?username=` + (userInfo.username || ''), {
+  fetch(`${serverUrl}`, {
     method: 'POST',
     body: JSON.stringify({
       "edition": 7,
@@ -149,62 +120,117 @@ chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
           });
         });
       break;
-    case 'clear':
-      tempData = null
-    //   fetch(`https://assist.lamp.run/blockList`).then(data => data.json()).then(dataTemp => {
-    //     blockListTemp = dataTemp
-    //     chrome.storage.sync.set({userInfo: {}})
-    //     userInfo = {}
-    //     lanjie(dataTemp)
-    //     sendResponse()
-    //   })
-    case 'reloadUser':
-      setTimeout(() => {
-        reloadUser(() => {
-          reGetData('')
-        })
-      }, 100);
     default:
       break;
   }
   return true
 })
 
-// 拦截文件功能尚未适配
-// var blockListTemp = null
 
-// if (blockListTemp != null) {
-//   lanjie(blockListTemp)
-// } else {
-//   fetch(`https://assist.lamp.run/blockList`).then(data => data.json()).then(dataTemp => {
-//     blockListTemp = dataTemp
-//     lanjie(dataTemp)
-//   })
-// }
+// 在文件开头添加调试
+console.log('Background service worker 启动');
+console.log('Manifest 权限:', chrome.runtime.getManifest().permissions);
+console.log('declarativeNetRequest API:', chrome.declarativeNetRequest);
 
+// 初始化加载拦截规则
+function initBlockList() {
+  fetch(`https://assist.lamp.run/blockList`)
+    .then(response => {
+      if (!response.ok) {
+        throw new Error(`HTTP ${response.status}`);
+      }
+      return response.json();
+    })
+    .then(dataTemp => {
+      console.log('获取到拦截规则:', dataTemp);
+      blockListTemp = dataTemp;
+      return lanjie(dataTemp);
+    })
+    .catch(error => {
+      console.error('获取拦截规则失败:', error);
+      // 设置空的拦截规则
+      blockListTemp = {};
+      lanjie({});
+    });
+}
+
+// 插件安装/更新时初始化
+chrome.runtime.onInstalled.addListener(() => {
+  console.log('插件已安装/更新');
+  initBlockList();
+});
+
+// 插件启动时也初始化
+initBlockList();
+
+async function lanjie(blockList) {
+  // 先检查 API 是否可用
+  if (!chrome.declarativeNetRequest || !chrome.declarativeNetRequest.updateDynamicRules) {
+    console.error('declarativeNetRequest API 不可用,请检查 manifest.json 配置');
+    
+    // 重新检查权限
+    chrome.management.getSelf((extensionInfo) => {
+      console.log('插件权限信息:', extensionInfo.permissions);
+    });
+    
+    return;
+  }
+  
+  console.log('开始设置拦截规则...');
+  
+  const rules = [];
+  let id = 1000; // 使用较大的ID避免冲突
+  
+  for (const [url, redirect] of Object.entries(blockList)) {
+    rules.push({
+      id: id++,
+      priority: 1,
+      action: { 
+        type: 'redirect', 
+        redirect: { url: redirect } 
+      },
+      condition: { 
+        urlFilter: url,
+        resourceTypes: ['main_frame', 'sub_frame', 'xmlhttprequest', 'script'] 
+      }
+    });
+  }
+  
+  try {
+    // 先获取现有规则
+    const oldRules = await chrome.declarativeNetRequest.getDynamicRules();
+    console.log('现有规则数量:', oldRules.length);
+    
+    // 移除所有现有规则
+    const oldIds = oldRules.map(rule => rule.id);
+    if (oldIds.length > 0) {
+      await chrome.declarativeNetRequest.updateDynamicRules({
+        removeRuleIds: oldIds
+      });
+      console.log(`移除 ${oldIds.length} 条旧规则`);
+    }
+    
+    // 添加新规则
+    if (rules.length > 0) {
+      await chrome.declarativeNetRequest.updateDynamicRules({
+        addRules: rules
+      });
+      console.log(`添加 ${rules.length} 条新规则成功`);
+    }
+    
+  } catch (error) {
+    console.error('更新规则失败:', error);
+    
+    // 调试信息
+    console.log('当前插件 manifest:', chrome.runtime.getManifest());
+    console.log('API 支持状态:', {
+      declarativeNetRequest: !!chrome.declarativeNetRequest,
+      updateDynamicRules: !!chrome.declarativeNetRequest?.updateDynamicRules,
+      getDynamicRules: !!chrome.declarativeNetRequest?.getDynamicRules
+    });
+  }
+}
 
-// function lanjie (blockList) {
-//   // 拦截请求
-//   chrome.webRequest.onBeforeRequest.addListener(
-//     function(details) {
-      
-//       for (const key in blockList) {
-//         if (details.url.includes(key) || new RegExp(key).test(details.url) || details.url == key) {
-//           console.log(`拦截请求:${details.url}`)
-//           console.log(`替换请求:${blockList[key]}`)
-//           return {
-//             redirectUrl: blockList[key]
-//           }
-//         }
-//       }
-//       return {
-//         cancel: false
-//       };
-//     },
-//     {urls: ["<all_urls>"]},
-//     ["blocking"]
-//   )
-// }
 
 chrome.runtime.onMessageExternal.addListener(
   function(request, sender, sendResponse) {

+ 0 - 9
devtools.html

@@ -1,9 +0,0 @@
-<!DOCTYPE html>
-<html lang="zh-CN">
-  <head>
-    <title>test</title>
-  </head>
-  <body>
-    4
-  </body>
-</html>

+ 0 - 60
js/options.js

@@ -1,60 +0,0 @@
-//在popup.js 中调用 backgourd.js 中的变量和方法,很重要
-var bg = chrome.extension.getBackgroundPage();
-
-function login (username, password) {
-  fetch(`http://user.lamp.run/login`, {
-    method: 'POST',
-    headers: {
-      "Content-Type": "application/json"
-    },
-    body: JSON.stringify({
-      type: "assist",
-      username: username,
-      password: password
-    })
-  }).then((response) => {return response.json();}).then((res) => {
-    if (res.err === 0) {
-      bg.userInfo = res.data
-      chrome.storage.sync.set({userInfo: {username, password, session: bg.userInfo.session}})
-      chrome.runtime.sendMessage({name:"reloadUser"},function() {})
-      document.querySelector('.login-box').style.display = 'none'
-      fetch(`https://assist.lamp.run/getList?username=${username}&session=${bg.userInfo.session}`).then((response) => {return response.json();}).then((res) => {
-
-        document.querySelector('#selectTable').style.display = 'block'
-        setTimeout(() => {
-          document.querySelectorAll('table input').forEach(element => {
-            element.onchange = function (e) {
-              const itemId = e.target.getAttribute("key")
-              bg.openList[itemId] = !bg.openList[itemId]
-              bg.saveOpenList()
-            }
-          });
-        }, 0);
-      })
-    } else {
-      alert(res.message)
-    }
-  })
-}
-chrome.storage.sync.get('userInfo', function(data) {
-  console.log(data)
-  const userInfo = data.userInfo
-  if (userInfo && userInfo.username && userInfo.password && userInfo.session) {
-    login(userInfo.username, userInfo.password)
-  }
-})
-// 登录按钮点击
-document.getElementsByClassName('login-button')[0].onclick = function () {
-	const username = document.getElementById('username').value
-  const password = document.getElementById('password').value
-  if (!username || !password) {
-    chrome.notifications.create(null, {
-      type: 'basic',
-      iconUrl: 'img/48.png',
-      title: '运行方案',
-      message: '用户名或密码不能为空!'
-    })
-    return
-  }
-	login(username, password)
-}

+ 21 - 38
js/popup.js

@@ -11,14 +11,13 @@ function owoReplaceAll(str, s1, s2) {
   return str
 }
 
-let userInfo = {}
 
 const getSchemeData = new Promise((resolve, reject) => {
   getCurrentTabId((tabInfo) => {
     setTimeout(() => {
         const myHeaders = new Headers();
         myHeaders.append("Content-Type", "application/json");
-        fetch(`${serverUrl}?route=search&username=${userInfo.username || 'nologin'}`, {
+        fetch(`${serverUrl}?route=search`, {
             method: 'POST',
             headers: myHeaders,
             body: JSON.stringify({
@@ -44,38 +43,11 @@ function getCurrentTabId(callback) {
 	})
 }
 
-// 登录按钮登录
-document.getElementsByClassName('userInfo')[0].onclick = function () {
-  if (!userInfo || !userInfo.username || !userInfo.password || !userInfo.session) {
-    // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-    window.open(chrome.extension.getURL('options.html'), "_blank")
-  } else {
-    chrome.storage.sync.set({userInfo: {}})
-    chrome.runtime.sendMessage({name:"reloadUser"},function() {})
-    location.reload();
-  }
-}
-
-document.getElementsByClassName('clearTemp')[0].onclick = function () {
-  chrome.runtime.sendMessage({name:"clear"},function() {
-    alert('缓存清除成功!')
-  })
-}
 
 let dataCopy = null
 
 function load() {
-  chrome.storage.sync.get('userInfo', function(data) {
-    // alert(data)
-    userInfo = data.userInfo
-    if (!userInfo) {
-      userInfo = {}
-    }
-    if (userInfo && userInfo.username && userInfo.password && userInfo.session) {
-      document.querySelector('.userInfo').innerHTML = `${userInfo.username}`
-    }
-    // alert("页面加载完成!"); 
-    // 获取是否有脚本
+  // 获取是否有脚本
     getSchemeData.then((tabData) => {
     //   console.log(tabData)
       const scriptBox = document.getElementsByClassName('script-box')[0]
@@ -105,16 +77,26 @@ function load() {
                 let dataTempCopy = dataCopy[index]
                 switch (dataTempCopy.type) {
                   case 'run': {
+                    // 判断是否在js主世界执行
+                    if (dataTempCopy.id == '378') {
+                      chrome.scripting.executeScript({
+                          world: 'MAIN', // 在页面主世界中执行
+                          target: { tabId: tabData.tabInfo.id },
+                          files: ['./scripts/378.js']
+                      });
+                    } else {
+                      chrome.scripting.executeScript({
+                          target: { tabId: tabData.tabInfo.id },
+                          files: ['insert-popup.js']
+                      });
+                    }
+
                     chrome.notifications.create(null, {
                       type: 'basic',
                       iconUrl: 'img/48.png',
                       title: dataTempCopy.name,
                       message: '远程方案已载入并运行!'
                     })
-                    chrome.scripting.executeScript({
-                        target: { tabId: tabData.tabInfo.id },
-                        files: ['insert-popup.js']
-                    });
                     break
                   }
                 }
@@ -124,10 +106,11 @@ function load() {
         }, 0);
       }
     })
-  })
 }
 load();
 
-// document.getElementsByClassName('.no-script')[0].addEventListener("click", function(){
-//   load()
-// })
+
+document.getElementsByClassName('lxkf')[0].addEventListener("click", function(){
+  console.log('点击客服标签')
+  window.open('https://work.weixin.qq.com/kfid/kfc7a6930ede9575277')
+})

+ 20 - 9
manifest.json

@@ -1,8 +1,8 @@
 {
 	"manifest_version": 3,
 	"name": "脚本助手",
-	"version": "2.0.1",
-	"description": "脚本助手",
+	"version": "2.0.5",
+	"description": "联系邮箱: mail@puge.org",
 	"icons": {
 		"16": "img/16.png",
 		"48": "img/48.png",
@@ -17,19 +17,28 @@
 		"service_worker": "background.js"
 	},
 	"content_scripts": [
+		{
+			"matches": ["https://listado.mercadolibre.com.mx/*"],
+			"css": ["./plug/standard.css"],
+			"js": ["./plug/star.js", "./scripts/376.js"],
+			"all_frames": true,
+			"run_at": "document_start"
+		},
 		{
 			"matches": ["<all_urls>"],
 			"js": ["insert-auto.js", "content-script.js"],
 			"all_frames": true,
 			"run_at": "document_start"
 		}
+		
 	],
 	"permissions": [
 		"scripting",
 		"storage",
 		"activeTab",
 		"webRequest",
-		"notifications"
+		"notifications",
+		"declarativeNetRequest"
 	],
 	"host_permissions": [
 		"http://*/*",
@@ -41,10 +50,12 @@
 			"https://cunchu.site/*"
 		]
 	},
-	"homepage_url": "https://github.com/PUGE",
-	"options_page": "options.html",
-	"options_ui": {
-		"page": "options.html",
-		"open_in_tab": true
-	}
+	"declarative_net_request": {
+		"rule_resources": [{
+			"id": "ruleset_1",
+			"enabled": true,
+			"path": "rules.json"
+		}]
+	},
+	"homepage_url": "https://work.weixin.qq.com/ca/cawcde1652d7683651"
 }

+ 0 - 200
options.html

@@ -1,200 +0,0 @@
-<!DOCTYPE html>
-<html lang="zh-cn" >
-<head>
-  <meta charset="UTF-8">
-  <title>脚本助手登录</title>
-  <style>
-    .login .btn { display: inline-block; display: inline; zoom: 1; padding: 4px 10px 4px; margin-bottom: 0; font-size: 13px; line-height: 18px; color: #333333; text-align: center;text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); vertical-align: middle; background-color: #f5f5f5; background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); background-image: linear-gradient(top, #ffffff, #e6e6e6); background-repeat: repeat-x; filter: progid:dximagetransform.microsoft.gradient(startColorstr=#ffffff, endColorstr=#e6e6e6, GradientType=0); border-color: #e6e6e6 #e6e6e6 #e6e6e6; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); border: 1px solid #e6e6e6; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); cursor: pointer; margin-left: .3em; }
-    .login .btn:hover, .btn:active, .btn.active, .btn.disabled, .btn[disabled] { background-color: #e6e6e6; }
-    .login .btn-large { padding: 9px 14px; font-size: 15px; line-height: normal; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; }
-    .login .btn:hover { color: #333333; text-decoration: none; background-color: #e6e6e6; background-position: 0 -15px; -webkit-transition: background-position 0.1s linear; -moz-transition: background-position 0.1s linear; -ms-transition: background-position 0.1s linear; -o-transition: background-position 0.1s linear; transition: background-position 0.1s linear; }
-    .login .btn-primary, .btn-primary:hover { text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); color: #ffffff; }
-    .login .btn-primary.active { color: rgba(255, 255, 255, 0.75); }
-    .login .btn-primary { background-color: #4a77d4; background-image: -moz-linear-gradient(top, #6eb6de, #4a77d4); background-image: -ms-linear-gradient(top, #6eb6de, #4a77d4); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#6eb6de), to(#4a77d4)); background-image: -webkit-linear-gradient(top, #6eb6de, #4a77d4); background-image: -o-linear-gradient(top, #6eb6de, #4a77d4); background-image: linear-gradient(top, #6eb6de, #4a77d4); background-repeat: repeat-x; filter: progid:dximagetransform.microsoft.gradient(startColorstr=#6eb6de, endColorstr=#4a77d4, GradientType=0);  border: 1px solid #3762bc; text-shadow: 1px 1px 1px rgba(0,0,0,0.4); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.5); }
-    .login .btn-primary:hover, .btn-primary:active, .btn-primary.active, .btn-primary.disabled, .btn-primary[disabled] { filter: none; background-color: #4a77d4; }
-    .login .btn-block { width: 100%; display:block; }
-    .login a {
-      text-decoration: none;
-    }
-    * { -webkit-box-sizing:border-box; -moz-box-sizing:border-box; -ms-box-sizing:border-box; -o-box-sizing:border-box; box-sizing:border-box; }
-
-    html { width: 100%; height:100%; overflow:hidden; margin: 0;
-      padding: 0;}
-
-    body { 
-      width: 100%;
-      height:100%;
-      font-family: 'Open Sans', sans-serif;
-      background: #092756;
-      background: -moz-radial-gradient(0% 100%, ellipse cover, rgba(104,128,138,.4) 10%,rgba(138,114,76,0) 40%),-moz-linear-gradient(top,  rgba(57,173,219,.25) 0%, rgba(42,60,87,.4) 100%), -moz-linear-gradient(-45deg,  #670d10 0%, #092756 100%);
-      background: -webkit-radial-gradient(0% 100%, ellipse cover, rgba(104,128,138,.4) 10%,rgba(138,114,76,0) 40%), -webkit-linear-gradient(top,  rgba(57,173,219,.25) 0%,rgba(42,60,87,.4) 100%), -webkit-linear-gradient(-45deg,  #670d10 0%,#092756 100%);
-      background: -o-radial-gradient(0% 100%, ellipse cover, rgba(104,128,138,.4) 10%,rgba(138,114,76,0) 40%), -o-linear-gradient(top,  rgba(57,173,219,.25) 0%,rgba(42,60,87,.4) 100%), -o-linear-gradient(-45deg,  #670d10 0%,#092756 100%);
-      background: -ms-radial-gradient(0% 100%, ellipse cover, rgba(104,128,138,.4) 10%,rgba(138,114,76,0) 40%), -ms-linear-gradient(top,  rgba(57,173,219,.25) 0%,rgba(42,60,87,.4) 100%), -ms-linear-gradient(-45deg,  #670d10 0%,#092756 100%);
-      background: -webkit-radial-gradient(0% 100%, ellipse cover, rgba(104,128,138,.4) 10%,rgba(138,114,76,0) 40%), linear-gradient(to bottom,  rgba(57,173,219,.25) 0%,rgba(42,60,87,.4) 100%), linear-gradient(135deg,  #670d10 0%,#092756 100%);
-      filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3E1D6D', endColorstr='#092756',GradientType=1 );
-    }
-    .login { 
-      position: absolute;
-      top: 50%;
-      left: 50%;
-      margin: -150px 0 0 -150px;
-      width:300px;
-      height:300px;
-    }
-    .login h1 { color: #fff; text-shadow: 0 0 10px rgba(0,0,0,0.3); letter-spacing:1px; text-align:center; }
-
-    .login input { 
-      width: 100%; 
-      margin-bottom: 10px; 
-      background: rgba(0,0,0,0.3);
-      border: none;
-      outline: none;
-      padding: 10px;
-      font-size: 13px;
-      color: #fff;
-      text-shadow: 1px 1px 1px rgba(0,0,0,0.3);
-      border: 1px solid rgba(0,0,0,0.3);
-      border-radius: 4px;
-      box-shadow: inset 0 -5px 45px rgba(100,100,100,0.2), 0 1px 1px rgba(255,255,255,0.2);
-      -webkit-transition: box-shadow .5s ease;
-      -moz-transition: box-shadow .5s ease;
-      -o-transition: box-shadow .5s ease;
-      -ms-transition: box-shadow .5s ease;
-      transition: box-shadow .5s ease;
-    }
-    .login input:focus { box-shadow: inset 0 -5px 45px rgba(100,100,100,0.4), 0 1px 1px rgba(255,255,255,0.2); }
-    .zhuce {
-      margin-top: 5px;
-    }
-    table {
-      border-collapse: collapse;
-      border-spacing: 0;
-      width: 100%;
-    }
-    
-    td,th {
-      padding: 0;
-    }
-    table {
-      border-collapse: collapse;
-      border-spacing: 0;
-      empty-cells: show;
-      border: 1px solid #cbcbcb;
-    }
-    
-    table caption {
-      color: #000;
-      font: italic 85%/1 arial,sans-serif;
-      padding: 1em 0;
-      text-align: center;
-    }
-    
-    table td,table th {
-      border-left: 1px solid #cbcbcb;
-      border-width: 0 0 0 1px;
-      font-size: inherit;
-      margin: 0;
-      overflow: visible;
-      padding: .5em 1em;
-    }
-    
-    table thead {
-      background-color: #e0e0e0;
-      color: #000;
-      text-align: left;
-      vertical-align: bottom;
-    }
-    
-    table td {
-      background-color: transparent;
-    }
-    td input[type="checkbox"] {
-      display: block;
-      margin: 0 auto;
-    }
-    #selectTable {
-      width: 240px;
-      position: absolute;
-      left: 0;
-      right: 0;
-      margin: auto;
-      height: 400px;
-      top: 0;
-      bottom: 0;
-    }
-    #selectTable span {
-      display: block;
-      text-align: center;
-      color: white;
-      font-size: 20px;
-    }
-  </style>
-</head>
-<body>
-<!-- partial:index.partial.html -->
-<div class="login login-box">
-	<h1>登录</h1>
-  <form method="post">
-    <input type="text" id="username" placeholder="Username" required="required" />
-    <input type="password" id="password" placeholder="Password" required="required" />
-    <div class="btn btn-primary btn-block btn-large login-button">登录</div>
-    <a href="https://cunchu.site/work/login/login.html?view-loginContent=register#login" class="btn btn-primary btn-block btn-large zhuce">注册</a>
-  </form>
-</div>
-<div id="selectTable" style="display: none;">
-  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 120 120" height="240" width="240">
-    <path fill="#FBD4FA" d="M47.7884 28.3687C51.0168 22.6461 58.4989 16.3132 65.2823 16.0005C65.5132 15.9899 65.6539 16.244 65.538 16.444C61.3041 23.7536 61.2821 23.8161 60.1803 27.0771C64.6775 24.8584 73.6721 22.6401 73.6721 24.8584C73.6721 25.8688 71.5728 27.386 69.1804 28.8436C84.2796 33.636 95.2054 47.6065 95.2054 64.0943C95.2054 84.5417 78.4018 101.118 57.6735 101.118C36.9452 101.118 20.1416 84.5417 20.1416 64.0943C20.1416 47.0218 31.856 32.6483 47.7884 28.3687Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="white" d="M51.5662 57.7403C51.5662 63.7416 46.9017 68.6067 41.1476 68.6067C35.3936 68.6067 30.729 63.7416 30.729 57.7403C30.729 51.7389 35.3936 46.8738 41.1476 46.8738C46.9017 46.8738 51.5662 51.7389 51.5662 57.7403Z"></path>
-    <path fill="white" d="M82.7628 57.7402C82.7628 63.7415 78.0982 68.6066 72.3442 68.6066C66.5901 68.6066 61.9255 63.7415 61.9255 57.7402C61.9255 51.7388 66.5901 46.8738 72.3442 46.8738C78.0982 46.8738 82.7628 51.7388 82.7628 57.7402Z"></path>
-    <path fill="#FFE9FE" d="M78.8849 94.6422C72.8506 98.7272 65.5451 101.118 57.6736 101.118C49.8022 101.118 42.4967 98.7272 36.4624 94.6422C41.5511 88.5942 49.165 84.7526 57.6736 84.7526C66.1822 84.7526 73.7961 88.5942 78.8849 94.6422Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#FFA2FE" d="M33.9623 70.4051C33.2311 70.7962 33.0977 71.1672 33.0977 71.3221C33.0977 71.4769 33.2311 71.848 33.9623 72.2391C34.6512 72.6075 35.6717 72.8659 36.8538 72.8659C38.0358 72.8659 39.0563 72.6075 39.7452 72.2391C40.4764 71.848 40.6099 71.4769 40.6099 71.3221C40.6099 71.1672 40.4764 70.7962 39.7452 70.4051C39.0563 70.0366 38.0358 69.7782 36.8538 69.7782C35.6717 69.7782 34.6512 70.0366 33.9623 70.4051ZM33.019 68.6415C34.0515 68.0893 35.409 67.7782 36.8538 67.7782C38.2985 67.7782 39.656 68.0893 40.6885 68.6415C41.6786 69.1711 42.6099 70.072 42.6099 71.3221C42.6099 72.5722 41.6786 73.473 40.6885 74.0027C39.656 74.5549 38.2985 74.8659 36.8538 74.8659C35.409 74.8659 34.0515 74.5549 33.019 74.0027C32.0289 73.473 31.0977 72.5722 31.0977 71.3221C31.0977 70.072 32.0289 69.1711 33.019 68.6415Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#FFA2FE" d="M75.1145 70.3909C74.4605 70.7657 74.3171 71.1319 74.3171 71.3221C74.3171 71.5123 74.4605 71.8784 75.1145 72.2532C75.7408 72.6121 76.6726 72.8659 77.7562 72.8659C78.8397 72.8659 79.7715 72.6121 80.3978 72.2532C81.0518 71.8784 81.1952 71.5123 81.1952 71.3221C81.1952 71.1319 81.0518 70.7657 80.3978 70.3909C79.7715 70.032 78.8397 69.7782 77.7562 69.7782C76.6726 69.7782 75.7408 70.032 75.1145 70.3909ZM74.1201 68.6557C75.1004 68.0939 76.3881 67.7782 77.7562 67.7782C79.1242 67.7782 80.4119 68.0939 81.3922 68.6557C82.3448 69.2016 83.1952 70.1073 83.1952 71.3221C83.1952 72.5368 82.3448 73.4426 81.3922 73.9885C80.4119 74.5503 79.1242 74.8659 77.7562 74.8659C76.3881 74.8659 75.1004 74.5503 74.1201 73.9885C73.1675 73.4426 72.3171 72.5368 72.3171 71.3221C72.3171 70.1073 73.1675 69.2016 74.1201 68.6557Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#2F3076" d="M65.2362 15.0016C66.3375 14.9508 66.8748 16.1312 66.4033 16.9452L65.538 16.444L66.4033 16.9452C64.2783 20.6139 63.2337 22.4245 62.578 23.7281C62.2949 24.2909 62.0858 24.756 61.8928 25.2415C63.94 24.4439 66.3299 23.735 68.4191 23.3228C69.8522 23.04 71.2225 22.8804 72.2721 22.9601C72.7867 22.9991 73.3314 23.1022 73.7774 23.3601C74.28 23.6508 74.6721 24.1586 74.6721 24.8584C74.6721 25.4386 74.3832 25.9398 74.1019 26.3087C73.8039 26.6995 73.404 27.0838 72.9643 27.4509C72.523 27.8194 72.0086 28.1973 71.4536 28.5751C85.921 34.0443 96.2054 47.8779 96.2054 64.0943C96.2054 85.1068 78.9412 102.118 57.6735 102.118C36.4058 102.118 19.1416 85.1068 19.1416 64.0943C19.1416 46.6936 30.9825 32.0367 47.128 27.5129C48.8327 24.631 51.513 21.669 54.6029 19.3554C57.8137 16.9512 61.5706 15.1705 65.2362 15.0016ZM64.6727 15.9427L64.6727 15.9427C64.6727 15.9427 64.6727 15.9427 64.6727 15.9427ZM63.9766 17.145C61.252 17.5991 58.401 19.01 55.8016 20.9563C52.7779 23.2204 50.1981 26.1325 48.6594 28.86C48.5275 29.0938 48.3071 29.2648 48.0478 29.3344C32.5331 33.5019 21.1416 47.4938 21.1416 64.0943C21.1416 83.9765 37.4846 100.118 57.6735 100.118C77.8624 100.118 94.2054 83.9765 94.2054 64.0943C94.2054 48.0623 83.5812 34.4635 68.8779 29.7967C68.5043 29.6782 68.2345 29.3523 68.1876 28.9632C68.1407 28.5741 68.3254 28.1935 68.6601 27.9896C69.8455 27.2674 70.9171 26.5546 71.6825 25.9156C72.0667 25.5949 72.3411 25.3194 72.5115 25.096C72.5329 25.068 72.5514 25.0423 72.5676 25.0189C72.462 24.9935 72.3161 24.9692 72.1208 24.9543C71.3433 24.8954 70.184 25.0131 68.8062 25.2849C66.0697 25.8249 62.7821 26.9085 60.6227 27.9739C60.2602 28.1527 59.8256 28.0957 59.5215 27.8294C59.2174 27.5631 59.1035 27.1399 59.2329 26.757L59.238 26.7419C59.7864 25.119 60.0866 24.2305 60.7913 22.8294C61.4002 21.6187 62.3168 20.0136 63.9766 17.145Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#C4E2E7" d="M110.494 59.2907C112.019 60.8213 112.019 63.3044 110.494 64.8366L73.4853 101.977C73.0017 102.462 72.374 102.76 71.7039 102.822L63.5532 103.641L60.0389 103.994C59.4673 104.052 58.9867 103.57 59.0428 102.996L59.3475 99.9195L60.2041 91.2834C60.2724 90.6185 60.5695 89.9871 61.0532 89.5017L98.0615 52.3618C99.5868 50.8311 102.061 50.8311 103.588 52.3618L110.494 59.2907Z"></path>
-    <path fill="#A7D3D3" d="M110.493 64.8366C112.019 63.3044 112.019 60.8213 110.493 59.2907L105.605 54.3859C104.074 52.9082 101.64 52.9258 100.132 54.4386L63.1238 91.5786C62.6402 92.0639 62.343 92.6954 62.2748 93.3603L61.4182 101.996L61.2325 103.874L63.5529 103.641L71.7035 102.822C72.3736 102.76 73.0013 102.462 73.4849 101.977L110.493 64.8366Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#EFEFEF" d="M73.9281 101.531L73.4853 101.975C73.0017 102.46 72.374 102.759 71.7039 102.821L63.5533 103.64L61.3701 103.862L60.0359 103.994C59.4643 104.05 58.9837 103.568 59.0413 102.996L59.1656 101.735L59.3445 99.918L60.2011 91.2819C60.2694 90.617 60.5665 89.9856 61.0502 89.5002L61.4929 89.0559C62.495 88.0502 64.09 87.8083 65.2574 88.6056C66.8387 89.6797 66.9903 91.857 65.7137 93.1381C66.8599 91.9879 68.7111 91.9879 69.8573 93.1381C70.9974 94.2823 71.0035 96.1461 69.8573 97.2964C71.1354 96.0138 73.2974 96.1598 74.3677 97.7468C75.1713 98.9244 74.9302 100.525 73.9281 101.531Z"></path>
-    <path fill="#FFFAFF" d="M73.9993 97.2977C73.9355 97.3708 73.8686 97.4425 73.7987 97.5125C73.8686 97.4425 73.9401 97.3756 74.0131 97.3117C74.1409 97.4422 74.2596 97.5872 74.3672 97.7468C75.1708 98.9245 74.9297 100.525 73.9276 101.531L73.4849 101.975C73.0012 102.46 72.3735 102.759 71.7034 102.821L63.5528 103.64L61.3696 103.862L60.0354 103.994C59.9851 103.999 59.9355 104 59.887 103.997L60.1658 102.553L62.5734 92.8598C62.7204 92.1173 63.4345 91.0796 64.893 89.8167L65.4282 89.2797C65.5257 89.182 65.627 89.0894 65.7313 89.0021C66.8543 90.1529 66.8479 91.9995 65.7132 93.1382C66.8594 91.9879 68.7106 91.9879 69.8568 93.1382C69.8569 93.1383 69.857 93.1384 69.8571 93.1385C69.7951 93.2094 69.7303 93.2789 69.6626 93.3468C69.7303 93.279 69.7997 93.214 69.8704 93.1519C70.9969 94.2972 70.9984 96.1508 69.8568 97.2965C71.0017 96.1475 72.8559 96.145 73.9993 97.2977Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#67649C" d="M64.6934 89.4314C63.972 88.9387 62.9065 89.054 62.2012 89.7618L61.7585 90.2061C61.7585 90.2061 61.7585 90.2061 61.7585 90.2061C61.4366 90.5291 61.2411 90.9469 61.1961 91.3824C61.196 91.383 61.196 91.3835 61.1959 91.384L60.1608 101.833L60.0469 102.988L61.2688 102.867L61.2713 102.867L71.6112 101.825C72.0438 101.785 72.4549 101.592 72.777 101.269L73.2197 100.825C73.9245 100.118 74.0428 99.0448 73.5417 98.3104L73.5387 98.306C72.8273 97.2513 71.4082 97.1567 70.5656 98.0023C70.1758 98.3935 69.5426 98.3946 69.1514 98.0048C68.7602 97.6149 68.7591 96.9818 69.1489 96.5906C69.9049 95.8319 69.9015 94.5993 69.1489 93.844C68.3935 93.0859 67.1775 93.0859 66.4221 93.844C66.0323 94.2352 65.3991 94.2363 65.0079 93.8465C64.6167 93.4567 64.6155 92.8235 65.0054 92.4323C65.8467 91.5879 65.7499 90.149 64.6955 89.4328L64.6934 89.4314ZM67.5632 91.2817C68.6417 91.2207 69.7405 91.6042 70.5656 92.4323C71.3866 93.2562 71.7689 94.358 71.7084 95.4404C73.0195 95.3662 74.3592 95.9475 75.1953 97.1854C76.2994 98.8059 75.9353 100.933 74.6364 102.237L74.1937 102.681C73.5494 103.327 72.7067 103.731 71.8005 103.816C71.7992 103.816 71.7979 103.817 71.7966 103.817L61.4688 104.857L60.1346 104.989C58.9336 105.107 57.9263 104.095 58.0462 102.897C58.0463 102.897 58.0463 102.896 58.0463 102.896L59.2064 91.1798C59.2981 90.2861 59.6968 89.4417 60.3418 88.7944L60.7845 88.3501C60.7845 88.3501 60.7845 88.3501 60.7845 88.3501C62.0832 87.0467 64.207 86.6781 65.8203 87.779C67.054 88.6176 67.6361 89.9645 67.5632 91.2817Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#CFD0FE" d="M63.5532 103.638L60.0389 103.991C59.4673 104.049 58.9867 103.567 59.0428 102.993L59.3475 99.9164C60.3906 100.145 61.3852 100.673 62.1933 101.484C62.8225 102.113 63.2773 102.848 63.5532 103.638Z"></path>
-    <path fill="#ABAFD3" d="M61.4379 103.758L59 104L59.235 101.63C59.7186 101.893 60.1613 102.226 60.5677 102.635C60.9133 102.982 61.2029 103.357 61.4379 103.758Z"></path>
-    <path fill="#BBBEF2" d="M60.0385 103.991L63.5529 103.638C63.277 102.848 62.8221 102.113 62.1929 101.484C62.0836 101.374 61.9708 101.269 61.855 101.17C61.4646 100.951 61.0548 100.784 60.6268 100.691L59.4358 103.838C59.6049 103.954 59.8148 104.014 60.0385 103.991Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#67649C" d="M58.4632 98.6993L59.5612 98.9395C60.789 99.2082 61.9558 99.8288 62.9011 100.777C63.6359 101.513 64.1716 102.376 64.4972 103.308L64.9158 104.506L60.1395 104.986C58.9339 105.107 57.9306 104.091 58.0475 102.896L58.4632 98.6993ZM60.2178 101.275L60.0484 102.985L61.9953 102.789C61.8449 102.58 61.6751 102.38 61.4857 102.19L61.4849 102.189C61.1042 101.807 60.6748 101.502 60.2178 101.275Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#929BCC" d="M61.6994 103.824L60.0386 103.991C59.7941 104.016 59.5662 103.942 59.3899 103.804L60.0628 102.182C60.3986 102.365 60.6481 102.649 60.9058 102.943C61.0193 103.073 61.1343 103.204 61.259 103.329C61.4174 103.488 61.5641 103.653 61.6994 103.824Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#CFD0FE" d="M106.35 68.9948L93.9177 56.5185L98.6798 51.7394C99.8639 50.5511 101.783 50.5511 102.967 51.7394L111.112 59.913C112.296 61.1013 112.296 63.0275 111.112 64.2158L106.35 68.9948Z"></path>
-    <path fill="#67649C" d="M102.879 53.0677C101.743 51.9289 99.904 51.9295 98.7699 53.0676L61.7615 90.2076C61.4396 90.5306 61.2441 90.9485 61.199 91.384C61.199 91.3845 61.1989 91.385 61.1989 91.3855L60.0484 102.988L71.6039 101.827L71.6111 101.827C72.0437 101.787 72.4549 101.594 72.7769 101.271L109.785 64.1311C110.922 62.9889 110.921 61.1367 109.785 59.9965L102.879 53.0677C102.879 53.0676 102.88 53.0678 102.879 53.0677ZM97.3531 51.6559C99.2694 49.7329 102.378 49.7334 104.296 51.6555L111.202 58.5848C113.116 60.5058 113.116 63.62 111.202 65.5421L74.1936 102.682C73.5492 103.329 72.7065 103.733 71.8002 103.818C71.799 103.818 71.7977 103.818 71.7965 103.818L60.1395 104.989C60.1392 104.989 60.1397 104.989 60.1395 104.989C58.9339 105.11 57.9306 104.094 58.0475 102.899L58.3524 99.8209L59.2093 91.1813C59.301 90.2876 59.6997 89.4432 60.3448 88.7959L97.3531 51.6559Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#BBC1F2" d="M95.9886 58.5968L106.35 68.9948L111.112 64.2157C112.296 63.0274 112.296 61.1012 111.112 59.9129L103.291 52.0637C103.051 51.8587 102.692 51.8693 102.467 52.0955L95.9886 58.5968Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#67649C" d="M100.839 52.2151C100.094 52.1588 99.5186 52.3259 99.2274 52.6181L95.3303 56.5184L106.35 67.577L110.404 63.5089C111.197 62.7123 111.199 61.4206 110.408 60.6222L102.212 52.6223L102.206 52.6167C102.206 52.6169 102.207 52.6171 102.206 52.6167C102.202 52.6132 102.171 52.5866 102.099 52.5461C102.021 52.5029 101.916 52.4548 101.784 52.4082C101.52 52.3146 101.189 52.2415 100.839 52.2151ZM103.619 51.2011C103.302 50.8852 102.861 50.6675 102.451 50.5226C102.015 50.3684 101.51 50.2601 100.99 50.2208C99.9978 50.1458 98.7042 50.3102 97.8113 51.2058C97.8114 51.2057 97.8111 51.206 97.8113 51.2058L92.505 56.5164L106.35 70.4105L111.82 64.9206C113.393 63.342 113.393 60.7846 111.82 59.206L103.619 51.2011Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#67649C" d="M101.759 69.0317C102.155 69.4165 102.164 70.0496 101.78 70.4458L77.6096 95.3318C77.2248 95.728 76.5917 95.7372 76.1955 95.3525C75.7993 94.9677 75.7901 94.3346 76.1749 93.9384L100.345 69.0523C100.73 68.6562 101.363 68.6469 101.759 69.0317Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#67649C" d="M108.046 62.4254C108.437 62.8152 108.439 63.4484 108.049 63.8396L104.596 67.3048C104.206 67.696 103.573 67.6971 103.182 67.3073C102.79 66.9174 102.789 66.2843 103.179 65.8931L106.632 62.4279C107.022 62.0367 107.655 62.0356 108.046 62.4254Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#FBD4FA" d="M28.911 71.7657C31.3259 66.1001 24.8861 58.8157 20.0562 60.4344C15.2264 62.0532 16.6939 74.5504 19.2512 79.0501C22.4711 84.7158 28.106 84.7158 27.301 77.4314C28.911 77.4314 31.3259 75.0033 28.911 71.7657Z"></path>
-    <path fill="#28336B" d="M26.4277 64.0032C24.631 61.8164 22.2131 60.7662 20.374 61.3826C19.5866 61.6465 18.9324 62.3899 18.4796 63.7163C18.0301 65.0331 17.8433 66.7585 17.8833 68.6406C17.964 72.4271 18.9505 76.4971 20.1206 78.556C20.8665 79.8684 21.7293 80.811 22.5569 81.3945C23.3938 81.9847 24.1313 82.1674 24.668 82.104C25.1562 82.0462 25.6102 81.7725 25.9402 81.1089C26.2894 80.4066 26.4964 79.2544 26.3071 77.5412L26.1844 76.4314H27.301C27.6718 76.4314 28.36 76.091 28.7199 75.3674C29.0292 74.7455 29.1286 73.73 28.1094 72.3636L27.7656 71.9027L27.9911 71.3736C29.003 68.9995 28.195 66.1543 26.4277 64.0032ZM30.0326 71.6309C31.1035 68.484 29.9202 65.1036 27.9731 62.7336C25.9461 60.2665 22.7293 58.4839 19.7385 59.4863C18.1109 60.0317 17.1374 61.4575 16.5869 63.0702C16.0331 64.6926 15.8411 66.6763 15.8838 68.6832C15.9688 72.675 16.9947 77.1035 18.3818 79.5442C19.2459 81.0647 20.2949 82.2467 21.4043 83.029C22.5043 83.8047 23.729 84.229 24.9029 84.0901C26.1252 83.9455 27.1302 83.2075 27.731 81.9994C28.2187 81.0187 28.435 79.7496 28.3663 78.2278C29.2416 77.8973 30.0491 77.1862 30.5107 76.2579C31.15 74.9722 31.1193 73.3368 30.0326 71.6309Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#FBD4FA" d="M86.4362 71.7657C84.0213 66.1001 90.4611 58.8157 95.2909 60.4344C100.121 62.0532 98.6532 74.5504 96.096 79.0501C92.8761 84.7158 87.2412 84.7158 88.0462 77.4314C86.4362 77.4314 84.0213 75.0033 86.4362 71.7657Z"></path>
-    <path fill="#28336B" d="M88.9194 64.0032C90.7161 61.8164 93.1341 60.7662 94.9731 61.3826C95.7605 61.6465 96.4147 62.3899 96.8675 63.7163C97.317 65.0331 97.5039 66.7585 97.4638 68.6406C97.3832 72.4271 96.3967 76.4971 95.2265 78.556C94.4807 79.8684 93.6179 80.811 92.7903 81.3945C91.9533 81.9847 91.2159 82.1674 90.6792 82.104C90.1909 82.0462 89.7369 81.7725 89.4069 81.1089C89.0577 80.4066 88.8508 79.2544 89.0401 77.5412L89.1628 76.4314H88.0462C87.6754 76.4314 86.9871 76.091 86.6273 75.3674C86.318 74.7455 86.2186 73.73 87.2378 72.3636L87.5816 71.9027L87.3561 71.3736C86.3442 68.9995 87.1522 66.1543 88.9194 64.0032ZM85.3146 71.6309C84.2436 68.484 85.427 65.1036 87.3741 62.7336C89.4011 60.2665 92.6179 58.4839 95.6087 59.4863C97.2362 60.0317 98.2098 61.4575 98.7603 63.0702C99.3141 64.6926 99.5061 66.6763 99.4634 68.6832C99.3784 72.675 98.3525 77.1035 96.9654 79.5442C96.1013 81.0647 95.0523 82.2467 93.9429 83.029C92.8429 83.8047 91.6182 84.229 90.4443 84.0901C89.222 83.9455 88.2169 83.2075 87.6162 81.9994C87.1285 81.0187 86.9122 79.7496 86.9809 78.2278C86.1056 77.8973 85.2981 77.1862 84.8365 76.2579C84.1971 74.9722 84.2279 73.3368 85.3146 71.6309Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#FEE46B" d="M63.6532 74.0053C62.8947 76.793 59.6709 81.4975 57.3953 81.4975C55.1198 81.4975 51.3271 76.2704 51.1375 73.4825C50.9478 70.6947 52.4648 68.7781 57.3953 68.7782C62.3258 68.7783 64.4117 71.2176 63.6532 74.0053Z"></path>
-    <path fill="#2F3076" d="M52.9947 70.8463C52.3418 71.4023 52.0539 72.219 52.1352 73.4147C52.1705 73.9343 52.3864 74.654 52.779 75.483C53.1647 76.2972 53.6905 77.1532 54.2807 77.9309C54.8733 78.7117 55.5088 79.3843 56.1024 79.8512C56.7296 80.3444 57.1699 80.4975 57.3953 80.4975C57.6403 80.4975 58.0526 80.3574 58.6192 79.9243C59.1637 79.5083 59.7442 78.9027 60.3037 78.1831C61.4317 76.732 62.3527 74.9762 62.6883 73.7428C62.9776 72.6793 62.7264 71.7676 61.9811 71.0828C61.1902 70.3561 59.72 69.7783 57.3953 69.7782C55.023 69.7782 53.6997 70.2459 52.9947 70.8463ZM51.698 69.3236C52.9367 68.2687 54.8371 67.7782 57.3954 67.7782C60.0011 67.7783 62.0392 68.4201 63.3342 69.6101C64.6748 70.8418 65.0873 72.5436 64.6181 74.2679C64.1952 75.8221 63.1251 77.8124 61.8827 79.4106C61.2569 80.2155 60.5574 80.9603 59.8337 81.5134C59.1321 82.0496 58.2882 82.4975 57.3953 82.4975C56.483 82.4975 55.5959 81.9972 54.8661 81.4233C54.1026 80.8229 53.3514 80.0145 52.6876 79.14C52.0216 78.2625 51.4215 77.289 50.9715 76.3391C50.5286 75.4039 50.1993 74.4248 50.1398 73.5504C50.0315 71.9582 50.4072 70.4228 51.698 69.3236Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="black" d="M48.6488 57.736C48.6488 62.1216 45.2903 65.6768 41.1474 65.6768C37.0045 65.6768 33.646 62.1216 33.646 57.736C33.646 53.3504 37.0045 49.7951 41.1474 49.7951C45.2903 49.7951 48.6488 53.3504 48.6488 57.736Z"></path>
-    <path fill="white" d="M40.3139 55.2206C40.3139 57.0672 38.8212 58.5642 36.98 58.5642C35.1387 58.5642 33.646 57.0672 33.646 55.2206C33.646 53.3741 35.1387 51.8771 36.98 51.8771C38.8212 51.8771 40.3139 53.3741 40.3139 55.2206Z"></path>
-    <path fill="white" d="M46.9822 61.0699C46.9822 61.9932 46.2358 62.7417 45.3152 62.7417C44.3945 62.7417 43.6482 61.9932 43.6482 61.0699C43.6482 60.1467 44.3945 59.3982 45.3152 59.3982C46.2358 59.3982 46.9822 60.1467 46.9822 61.0699Z"></path>
-    <path fill="black" d="M76.6943 53.2412C76.8456 54.0557 76.3079 54.8386 75.4934 54.9899C73.8951 55.2867 72.1847 56.1735 70.8025 57.2796C70.8783 57.2671 70.9544 57.2551 71.0308 57.2435C72.8909 56.9608 75.1303 56.9207 77.0985 57.798C77.8552 58.1353 78.1952 59.0221 77.8579 59.7787C77.5206 60.5354 76.6338 60.8754 75.8772 60.5381C74.6746 60.0022 73.1091 59.9621 71.4815 60.2094C69.8832 60.4523 68.4069 60.9432 67.4979 61.2808C66.9823 61.4724 66.4032 61.3663 65.9889 61.0045C65.5746 60.6426 65.3916 60.083 65.512 59.5463C65.7052 58.6854 66.1849 57.8489 66.7553 57.1099C67.3389 56.3537 68.0851 55.6124 68.9233 54.9411C70.5843 53.6108 72.7405 52.4498 74.9456 52.0403C75.7601 51.889 76.543 52.4267 76.6943 53.2412Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#2F3076" d="M42.878 41.8277C42.878 43.5198 41.1024 43.7313 38.661 43.9425C36.2195 44.1538 34 43.3083 34 42.6736C34 42.0388 35.7756 40.7702 38.2171 40.3473C40.6585 39.9244 42.878 40.1356 42.878 41.8277Z"></path>
-    <path fill="#2F3076" d="M70.1464 41.8277C70.1464 43.5198 71.922 43.7313 74.3634 43.9425C76.8049 44.1538 79.0244 43.3083 79.0244 42.6736C79.0244 42.0388 77.2488 40.7702 74.8073 40.3473C72.3659 39.9244 70.1464 40.1356 70.1464 41.8277Z"></path>
-    <path fill="#63609D" d="M25.122 24.6248C23.9259 24.6248 22.9513 25.5981 22.9513 26.8046C22.9513 28.0112 23.9259 28.9845 25.122 28.9845C26.3182 28.9845 27.2928 28.0112 27.2928 26.8046C27.2928 25.5981 26.3182 24.6248 25.122 24.6248ZM20.9513 26.8046C20.9513 24.4989 22.8159 22.6248 25.122 22.6248C27.4282 22.6248 29.2928 24.4989 29.2928 26.8046C29.2928 29.1104 27.4282 30.9845 25.122 30.9845C22.8159 30.9845 20.9513 29.1104 20.9513 26.8046Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#63609D" d="M96.1463 88.2212C95.3004 88.2212 94.6097 88.9097 94.6097 89.765C94.6097 90.6204 95.3004 91.3089 96.1463 91.3089C96.9923 91.3089 97.6829 90.6204 97.6829 89.765C97.6829 88.9097 96.9923 88.2212 96.1463 88.2212ZM92.6097 89.765C92.6097 87.8105 94.1904 86.2212 96.1463 86.2212C98.1022 86.2212 99.6829 87.8105 99.6829 89.765C99.6829 91.7196 98.1022 93.3089 96.1463 93.3089C94.1904 93.3089 92.6097 91.7196 92.6097 89.765Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#63609D" d="M7 47.1555C7 47.7077 7.44772 48.1555 8 48.1555H15.6098C16.162 48.1555 16.6098 47.7077 16.6098 47.1555C16.6098 46.6032 16.162 46.1555 15.6098 46.1555H8C7.44772 46.1555 7 46.6032 7 47.1555Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#63609D" d="M92.6097 38.252C92.6097 38.8043 93.0575 39.252 93.6097 39.252H98.6829C99.2352 39.252 99.6829 38.8043 99.6829 38.252C99.6829 37.6997 99.2352 37.252 98.6829 37.252H93.6097C93.0575 37.252 92.6097 37.6997 92.6097 38.252Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#63609D" d="M81.8292 96.7607C81.8292 97.3129 82.2769 97.7607 82.8292 97.7607H87.9024C88.4547 97.7607 88.9024 97.3129 88.9024 96.7607C88.9024 96.2084 88.4547 95.7607 87.9024 95.7607H82.8292C82.2769 95.7607 81.8292 96.2084 81.8292 96.7607Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#63609D" d="M11.8049 51.9713C12.3572 51.9713 12.8049 51.5236 12.8049 50.9713V43.3397C12.8049 42.7874 12.3572 42.3397 11.8049 42.3397C11.2526 42.3397 10.8049 42.7874 10.8049 43.3397V50.9713C10.8049 51.5236 11.2526 51.9713 11.8049 51.9713Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#63609D" d="M96.1464 41.7958C96.6986 41.7958 97.1464 41.3481 97.1464 40.7958V35.7081C97.1464 35.1558 96.6986 34.7081 96.1464 34.7081C95.5941 34.7081 95.1464 35.1558 95.1464 35.7081V40.7958C95.1464 41.3481 95.5941 41.7958 96.1464 41.7958Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#63609D" d="M85.3658 100.304C85.9181 100.304 86.3658 99.8568 86.3658 99.3045V94.2168C86.3658 93.6645 85.9181 93.2168 85.3658 93.2168C84.8136 93.2168 84.3658 93.6645 84.3658 94.2168V99.3045C84.3658 99.8568 84.8136 100.304 85.3658 100.304Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#ABE2E9" d="M39.7074 86.5842C39.7074 94.3113 33.4612 100.575 25.7562 100.575C18.0511 100.575 11.8049 94.3113 11.8049 86.5842C11.8049 78.8571 18.0511 72.593 25.7562 72.593C33.4612 72.593 39.7074 78.8571 39.7074 86.5842Z"></path>
-    <path fill="#D3FAFF" d="M25.7562 100.575C33.4612 100.575 39.7074 94.3114 39.7074 86.5842C39.7074 83.2066 38.514 80.1086 36.5269 77.691C34.1162 75.698 31.0267 74.5009 27.6585 74.5009C19.9534 74.5009 13.7073 80.765 13.7073 88.4921C13.7073 91.8697 14.9007 94.9678 16.8877 97.3853C19.2984 99.3784 22.3879 100.575 25.7562 100.575Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#625F96" d="M25.7562 73.593C19.9388 73.593 15.0126 77.4416 13.3796 82.7448C13.217 83.2726 12.6574 83.5687 12.1296 83.4062C11.6017 83.2436 11.3056 82.684 11.4682 82.1562C13.3513 76.0409 19.0332 71.593 25.7562 71.593C34.0162 71.593 40.7074 78.3075 40.7074 86.5842C40.7074 89.746 39.73 92.6822 38.0614 95.1015C37.7478 95.5562 37.1251 95.6705 36.6704 95.357C36.2158 95.0434 36.1014 94.4206 36.415 93.966C37.8605 91.8702 38.7074 89.328 38.7074 86.5842C38.7074 79.4067 32.9062 73.593 25.7562 73.593ZM11.8049 85.5842C12.3572 85.5842 12.8049 86.0319 12.8049 86.5842C12.8049 93.7618 18.6061 99.5754 25.7562 99.5754C27.3081 99.5754 28.7941 99.3021 30.1705 98.8016C30.6895 98.6128 31.2633 98.8806 31.452 99.3996C31.6408 99.9186 31.373 100.492 30.854 100.681C29.2618 101.26 27.5446 101.575 25.7562 101.575C17.4961 101.575 10.8049 94.8609 10.8049 86.5842C10.8049 86.0319 11.2526 85.5842 11.8049 85.5842ZM35.9987 96.1361C36.376 96.5395 36.3548 97.1723 35.9514 97.5496C35.7236 97.7626 35.4892 97.9685 35.2484 98.1671C34.6377 98.6708 33.9864 99.127 33.2999 99.5299C32.8236 99.8095 32.2108 99.6501 31.9313 99.1738C31.6517 98.6975 31.8111 98.0847 32.2874 97.8051C32.8819 97.4561 33.4464 97.0609 33.9759 96.6242C34.1846 96.452 34.3878 96.2735 34.5853 96.0888C34.9887 95.7115 35.6215 95.7328 35.9987 96.1361Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#FDFFA6" d="M18.6332 85.7047C18.0141 86.3256 18.0141 87.3323 18.6332 87.9532L23.5613 92.8954C23.5628 92.8969 23.5643 92.8983 23.5657 92.8998C24.1075 93.4431 24.9437 93.511 25.5591 93.1035C25.647 93.0453 25.7304 92.9774 25.8078 92.8998C25.8078 92.8998 25.8078 92.8998 25.8078 92.8998L35.2244 83.4562C35.8435 82.8353 35.8435 81.8287 35.2244 81.2078C34.6052 80.5869 33.6015 80.5869 32.9823 81.2078L24.6868 89.5271L20.8753 85.7047C20.2562 85.0838 19.2524 85.0838 18.6332 85.7047Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    <path fill="#625F96" d="M18.9863 86.0588C18.5622 86.4841 18.5622 87.1738 18.9863 87.5991L23.9144 92.5413L23.9188 92.5458C24.2895 92.9175 24.8626 92.9647 25.284 92.6857C25.344 92.646 25.4013 92.5994 25.4548 92.5458C25.4548 92.5458 25.4548 92.5458 25.4548 92.5458L34.8714 83.1022C35.2955 82.6768 35.2955 81.9872 34.8714 81.5618C34.4472 81.1365 33.7596 81.1365 33.3354 81.5618L24.6868 90.2352L20.5223 86.0588C20.0981 85.6334 19.4105 85.6334 18.9863 86.0588ZM18.2802 88.3072C17.4661 87.4908 17.4661 86.1671 18.2802 85.3506C19.0943 84.5342 20.4143 84.5342 21.2284 85.3506L24.6868 88.819L32.6293 80.8537C33.4434 80.0373 34.7634 80.0373 35.5775 80.8537C36.3916 81.6702 36.3916 82.9939 35.5775 83.8103L26.1609 93.2539C26.1609 93.2539 26.1609 93.2539 26.1609 93.2539C26.1601 93.2546 26.1594 93.2554 26.1586 93.2561C26.058 93.3568 25.9492 93.4453 25.8342 93.5214C25.0249 94.0573 23.9255 93.9687 23.2127 93.2539L23.2083 93.2495L18.2802 88.3072Z" clip-rule="evenodd" fill-rule="evenodd"></path>
-    </svg>
-    <span>登陆成功</span>    
-</div>
-
-<script type="text/javascript" src="js/options.js"></script>
-</body>
-</html>

+ 970 - 0
plug/standard.css

@@ -0,0 +1,970 @@
+html, body {
+  margin: 0;
+  padding: 0;
+}
+
+.owo td.active {
+  background-color: #cccccc;
+}
+
+.clear:after {
+  content: "";
+  height: 0;
+  line-height: 0;
+  display: block;
+  visibility: hidden;
+  clear: both;
+  zoom: 1;
+}
+
+.log-panel {
+  width: 98%;
+	height: 100%;
+	display: block;
+	margin: 0 auto;
+	border-radius: 3px;
+	overflow: auto;
+	padding: 1%;
+	box-sizing: border-box;
+	background-color: #3e3858;
+	color: white;
+	line-height: 26px;
+	font-size: 14px;
+}
+.log-panel li {
+  word-break: break-all;
+}
+.log-panel span {
+  background-color: chocolate;
+  padding: 2px 5px;
+  border-radius: 3px;
+  margin-right: 4px;
+}
+
+
+/* PUGE样式 */
+textarea.owo {
+  width: 92%;
+  margin: 0 auto;
+  display: block;
+  padding: 1%;
+  height: 41vw;
+  font-size: 14px;
+}
+
+.owo.panel {
+  width: 98%;
+  display: block;
+  margin: 0 auto;
+  max-width: 1000px;
+}
+
+button.owo {
+  background-color: #009fe9;
+  color: white;
+  border: none;
+  padding: 8px 12px;
+  border-radius: 3px;
+  margin: 10px 0;
+  font-size: 14px;
+  min-width: 80px;
+}
+label.owo input[type="checkbox"] { 
+	position: absolute;
+	opacity: 0;
+}
+
+/* Normal Track */
+label.owo input[type="checkbox"].ios-switch + div {
+	vertical-align: middle;
+	width: 40px;	height: 20px;
+	border: 1px solid rgba(0,0,0,.4);
+	border-radius: 999px;
+	background-color: rgba(0, 0, 0, 0.1);
+	-webkit-transition-duration: .4s;
+	-webkit-transition-property: background-color, box-shadow;
+	box-shadow: inset 0 0 0 0px rgba(0,0,0,0.4);
+}
+
+/* Checked Track (Blue) */
+label.owo input[type="checkbox"].ios-switch:checked + div {
+	width: 40px;
+	background-position: 0 0;
+	background-color: #3b89ec;
+	border: 1px solid #0e62cd;
+	box-shadow: inset 0 0 0 10px rgba(59,137,259,1);
+}
+
+/* Tiny Track */
+label.owo input[type="checkbox"].tinyswitch.ios-switch + div {
+	width: 34px;	height: 18px;
+}
+
+/* Big Track */
+label.owo input[type="checkbox"].bigswitch.ios-switch + div {
+	width: 50px;	height: 25px;
+}
+
+/* Green Track */
+label.owo input[type="checkbox"].green.ios-switch:checked + div {
+	background-color: #00e359;
+	border: 1px solid rgba(0, 162, 63,1);
+	box-shadow: inset 0 0 0 10px rgba(0,227,89,1);
+}
+
+/* Normal Knob */
+label.owo input[type="checkbox"].ios-switch + div > div {
+	float: left;
+	width: 18px; height: 18px;
+	border-radius: inherit;
+	background: #ffffff;
+	-webkit-transition-timing-function: cubic-bezier(.54,1.85,.5,1);
+	-webkit-transition-duration: 0.4s;
+	-webkit-transition-property: transform, background-color, box-shadow;
+	-moz-transition-timing-function: cubic-bezier(.54,1.85,.5,1);
+	-moz-transition-duration: 0.4s;
+	-moz-transition-property: transform, background-color;
+	box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.3), 0px 0px 0 1px rgba(0, 0, 0, 0.4);
+	pointer-events: none;
+	margin-top: 1px;
+	margin-left: 1px;
+}
+
+/* Checked Knob (Blue Style) */
+label.owo input[type="checkbox"].ios-switch:checked + div > div {
+	-webkit-transform: translate3d(20px, 0, 0);
+	-moz-transform: translate3d(20px, 0, 0);
+	background-color: #ffffff;
+	box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.3), 0px 0px 0 1px rgba(8, 80, 172,1);
+}
+
+/* Tiny Knob */
+label.owo input[type="checkbox"].tinyswitch.ios-switch + div > div {
+	width: 16px; height: 16px;
+	margin-top: 1px;
+}
+
+/* Checked Tiny Knob (Blue Style) */
+label.owo input[type="checkbox"].tinyswitch.ios-switch:checked + div > div {
+	-webkit-transform: translate3d(16px, 0, 0);
+	-moz-transform: translate3d(16px, 0, 0);
+	box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.3), 0px 0px 0 1px rgba(8, 80, 172,1);
+}
+
+/* Big Knob */
+label.owo input[type="checkbox"].bigswitch.ios-switch + div > div {
+	width: 23px; height: 23px;
+	margin-top: 1px;
+}
+
+/* Checked Big Knob (Blue Style) */
+label.owo input[type="checkbox"].bigswitch.ios-switch:checked + div > div {
+	-webkit-transform: translate3d(25px, 0, 0);
+	-moz-transform: translate3d(16px, 0, 0);
+	box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.3), 0px 0px 0 1px rgba(8, 80, 172,1);
+}
+
+/* Green Knob */
+label.owo input[type="checkbox"].green.ios-switch:checked + div > div {
+	box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(0, 162, 63,1);
+}
+
+label.owo {
+	display: flex;
+    height: 34px;
+    line-height: 34px;
+    align-items: center;
+    justify-content: space-between;
+}
+.owo select {
+	height: 40px;
+  line-height: 40px;
+  width: 98%;
+  font-size: 16px;
+  color: #666;
+  background-color: cornsilk;
+  border: 1px solid #ccc;
+  box-sizing: border-box;
+  border-radius: 5px;
+  margin: 10px auto;
+  padding: 0 5px;
+  display: block;
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAPdJREFUWEftlC0OwkAQRmfT28ApuAIt99imeMIBms70GE1QKAxBYDAoECgQKBQKRTukgqSi7f6RFLFjd2e+l7eTFTBwiYHzwQN4A96AN/D/BqSUC5ffEhGXff29BqSUJwAYuwAAwA4RJ10zegHiOC6YeTYYQJIko7IsCwcLl6qqojzPa5OtpVxCWwhmvgohIkQ8Wu/At9EC4s7MEREdVM+nNGAB8QiCIEzTdK8Kr8+1AerLGiaeABAi4lYn3BhAAfFi5ikRbXTDrQA6IN5CiGmWZWuTcGuABsQZAG7MPCeilWm4E4BNWFuP0RL+KrQ5xwN4A96AN/ABAsloIXlECvAAAAAASUVORK5CYII=);
+  background-repeat: no-repeat;
+  background-position: 98% center;
+  background-size: 16px;
+}
+
+.owo select {
+  appearance: none;
+  -moz-appearance: none;
+  -webkit-appearance: none;
+}
+.owo select::-ms-expand { display: none; }
+.owo h1,h2,h3,h4,h5 {
+	color: #555;
+  line-height: 1.2;
+  padding-bottom: 10px;
+  border-bottom: 1px solid #ddd;
+  padding-top: 10px;
+  width: 98%;
+  display: block;
+  margin: 0 auto;
+  text-align: left;
+}
+
+.owo h1 {
+	font-size: 28px;
+}
+.owo h2 {
+	font-size: 24px;
+}
+.owo h3 {
+	font-size: 20px;
+}
+.owo h4 {
+	font-size: 16px;
+}
+.owo h5 {
+	font-size: 14px;
+}
+.owo h6 {
+	font-size: 12px;
+}
+
+.owo .bar {
+	padding: 5px 0;
+  margin: 0 auto;
+  width: 98%;
+  position: relative;
+}
+
+.owo .panel {
+	margin: 10px auto;
+	padding: 0;
+	width: 98%;
+}
+.owo .button {
+	height: 36px;
+	position: relative;
+	background-color: #009fe9;
+	color: white;
+	text-align: center;
+	line-height: 36px;
+	font-size: 16px;
+	border-radius: 5px;
+	margin: 10px auto;
+	display: block;
+	box-shadow: 1px 1px 4px #beb5ec;
+	width: 98%;
+	padding: 0;
+	cursor: pointer;
+}
+.owo .button:active {
+  opacity: 0.9;
+}
+.owo .button input[type="file"] {
+  position: absolute;
+  opacity: 0;
+  width: 100%;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  left: 0;
+  top: 0;
+}
+.owo input[type="text"], .owo input[type="number"], .owo input[type="date"], .owo input[type="time"], .owo input[type="datetime-local"] {
+  height: 36px;
+  line-height: 36px;
+  width: 98%;
+  font-size: 16px;
+  color: #333;
+  background-color: cornsilk;
+  border: 1px solid #ccc;
+  box-sizing: border-box;
+  border-radius: 5px;
+  margin: 10px auto;
+  padding: 0 5px;
+  display: block;
+  float: none;
+}
+.owo textarea {
+	line-height: 24px;
+  width: 98%;
+  font-size: 14px;
+  color: black;
+  background-color: cornsilk;
+  border: 1px solid #ccc;
+  box-sizing: border-box;
+  margin: 10px auto;
+  padding: 0 5px;
+  display: block;
+  border-radius: 5px;
+  min-height: 100px;
+}
+/* 弹窗 */
+.img-replace {
+  /* replace text with an image */
+  display: inline-block;
+  overflow: hidden;
+  text-indent: 100%;
+  color: transparent;
+  white-space: nowrap;
+}
+.cd-popup {
+  position: fixed;
+  left: 0;
+  top: 0;
+  height: 100%;
+  width: 100%;
+  color: #333;
+  background-color: rgba(94, 110, 141, 0.9);
+  /* opacity: 0;
+  visibility: hidden; */
+  -webkit-transition: opacity 0.3s 0s, visibility 0s 0.3s;
+  -moz-transition: opacity 0.3s 0s, visibility 0s 0.3s;
+  transition: opacity 0.3s 0s, visibility 0s 0.3s;
+  z-index: 9999;
+}
+.cd-popup.is-visible {
+  opacity: 1;
+  visibility: visible;
+  -webkit-transition: opacity 0.3s 0s, visibility 0s 0s;
+  -moz-transition: opacity 0.3s 0s, visibility 0s 0s;
+  transition: opacity 0.3s 0s, visibility 0s 0s;
+}
+.cd-popup-container {
+  position: absolute;
+  width: 90%;
+  max-width: 400px;
+  margin: auto auto;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  height: 240px;
+  background: #FFF;
+  border-radius: .25em .25em .4em .4em;
+  text-align: center;
+  box-shadow: 0 0 20px rgba(0, 0, 0, 0.2);
+  -webkit-transform: translateY(-40px);
+  -moz-transform: translateY(-40px);
+  -ms-transform: translateY(-40px);
+  -o-transform: translateY(-40px);
+  transform: translateY(-40px);
+  /* Force Hardware Acceleration in WebKit */
+  -webkit-backface-visibility: hidden;
+  -webkit-transition-property: -webkit-transform;
+  -moz-transition-property: -moz-transform;
+  transition-property: transform;
+  -webkit-transition-duration: 0.3s;
+  -moz-transition-duration: 0.3s;
+  transition-duration: 0.3s;
+}
+.cd-popup-container .conn {
+  height: 170px;
+  justify-content: center;
+  align-items: center;
+  overflow: auto;
+  margin: 0;
+  margin-top: 32px;
+  font-size: 16px;
+  text-align: left;
+  padding: 0 10px;
+  line-height: 22px;
+  display: block;
+  word-break: break-all;
+}
+.cd-popup-container .title-text {
+  height: 40px;
+  margin-top: 0;
+  text-align: left;
+  display: block;
+  line-height: 40px;
+  margin: 0 10px;
+  border-bottom: 1px solid #ccc;
+  font-size: 16px;
+}
+.popup-panel.cd-popup-container {
+  height: auto;
+  top: auto;
+  bottom: auto;
+  max-height: 660px;
+}
+.popup-panel.cd-popup-container .conn {
+  margin-top: 0;
+  display: block;
+  margin: 10px 10px;
+  text-align: left;
+  height: auto;
+  max-height: 600px;
+  overflow: auto;
+}
+.prompt.cd-popup-container textarea {
+  display: block;
+  height: 129px;
+  width: calc(100% - 20px);
+  margin: 10px auto;
+  outline: none;
+  line-height: 20px;
+  padding: 0 4px;
+}
+.cd-buttons {
+  margin: 0;
+  padding: 0;
+}
+.cd-popup-container .cd-buttons:after {
+  content: "";
+  display: table;
+  clear: both;
+}
+.cd-popup-container .cd-buttons li {
+  float: left;
+  width: 50%;
+  list-style: none;
+  cursor: pointer;
+}
+.cd-popup-container .cd-buttons li {
+  display: block;
+  height: 50px;
+  line-height: 50px;
+  text-transform: uppercase;
+  color: #FFF;
+  -webkit-transition: background-color 0.2s;
+  -moz-transition: background-color 0.2s;
+  transition: background-color 0.2s;
+  text-decoration: none;
+}
+.cd-popup-container .cd-buttons li:first-child {
+  background: #fc7169;
+  border-radius: 0 0 0 .25em;
+}
+
+.cd-popup-container .cd-buttons li:last-child {
+  background: #b6bece;
+  border-radius: 0 0 .25em 0;
+}
+
+.cd-popup-container .cd-popup-close {
+  position: absolute;
+  top: 0px;
+  right: 0px;
+  width: 40px;
+  height: 40px;
+  cursor: pointer;
+}
+.cd-popup-container .cd-popup-close::before, .cd-popup-container .cd-popup-close::after {
+  content: '';
+  position: absolute;
+  top: 18px;
+  width: 24px;
+  height: 3px;
+  background-color: #8f9cb5;
+}
+.cd-popup-container .cd-popup-close::before {
+  -webkit-transform: rotate(45deg);
+  -moz-transform: rotate(45deg);
+  -ms-transform: rotate(45deg);
+  -o-transform: rotate(45deg);
+  transform: rotate(45deg);
+  left: 8px;
+}
+.cd-popup-container .cd-popup-close::after {
+  -webkit-transform: rotate(-45deg);
+  -moz-transform: rotate(-45deg);
+  -ms-transform: rotate(-45deg);
+  -o-transform: rotate(-45deg);
+  transform: rotate(-45deg);
+  right: 8px;
+}
+.is-visible .cd-popup-container {
+  -webkit-transform: translateY(0);
+  -moz-transform: translateY(0);
+  -ms-transform: translateY(0);
+  -o-transform: translateY(0);
+  transform: translateY(0);
+}
+.panel-box {
+  position: fixed;
+  right: 10px;
+  bottom: 10px;
+  background-color: #f6fafd;
+  box-shadow: -1px -1px 11px #ad8f8f;
+  border-radius: 5px;
+  padding: 10px;
+  max-width: 680px;
+  opacity: 0.95;
+  transition: bottom 1s;
+  z-index: 999999999;
+  max-height: 96vh;
+  overflow: auto;
+}
+.panel-box.pos-left {
+  right: auto;
+  left: 10px;
+}
+.panel-box .title-text {
+  padding: 0;
+  margin: 0;
+  border-bottom: 1px solid #ccc;
+  line-height: 30px;
+  font-weight: bold;
+  padding-bottom: 5px;
+  color: #333;
+}
+.tool-panel {
+  position: absolute;
+  right: 10px;
+  top: 10px;
+}
+.tool-panel .icon-button {
+  cursor: pointer;
+  fill: #bfbfbf;
+}
+.tool-panel .icon-button:hover {
+  fill: #009fe9;
+}
+.owo table {
+  background: white;
+  border-radius:3px;
+  border-collapse: collapse;
+  height: auto;
+  margin: auto;
+  padding:5px;
+  width: 100%;
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1);
+  animation: float 5s infinite;
+}
+ 
+.owo thead th {
+  color:#D5DDE5;;
+  background:#1b1e24;
+  font-size: 14px;
+  font-weight: 100;
+  padding: 3px 6px;
+  text-align:left;
+  text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+  vertical-align:middle;
+}
+
+.owo table thead {
+  border: 1px solid #1b1e24;
+  box-sizing: border-box;
+  border-bottom: none;
+}
+
+.owo table tbody {
+  border: 1px solid #ccc;
+  box-sizing: border-box;
+  border-top: none;
+}
+
+.owo thead th:first-child {
+  border-top-left-radius:3px;
+}
+ 
+.owo thead th:last-child {
+  border-top-right-radius:3px;
+  border-right:none;
+}
+  
+.owo tr {
+  border-top: 1px solid #C1C3D1;
+  border-bottom: 1px solid #C1C3D1;
+  color:#000;
+  font-size:16px;
+  font-weight:normal;
+  text-shadow: 0 1px 1px rgba(256, 256, 256, 0.1);
+}
+ 
+ 
+.owo tr:first-child {
+  border-top:none;
+}
+
+.owo tr:last-child {
+  border-bottom:none;
+}
+ 
+.owo tr:nth-child(odd) td {
+  background:#EBEBEB;
+}
+ 
+
+.owo tr:last-child td:first-child {
+  border-bottom-left-radius:3px;
+}
+ 
+.owo tr:last-child td:last-child {
+  border-bottom-right-radius:3px;
+}
+ 
+.owo td {
+  background:#FFFFFF;
+  padding: 3px 6px;
+  text-align:left;
+  vertical-align:middle;
+  font-size:12px;
+  text-shadow: -1px -1px 1px rgba(0, 0, 0, 0.1);
+  border-right: 1px solid #C1C3D1;
+}
+
+.owo td:last-child {
+  border-right: 0px;
+}
+
+.owo thead th.text-left {
+  text-align: left;
+}
+
+.owo thead th.text-center {
+  text-align: center;
+}
+
+.owo thead th.text-right {
+  text-align: right;
+}
+
+.owo td.text-left {
+  text-align: left;
+}
+
+.owo td.text-center {
+  text-align: center;
+}
+
+.owo td.text-right {
+  text-align: right;
+}
+.owo.full {
+  width: 100%;
+  height: 100%;
+  overflow: auto;
+}
+
+.owo.owo-lable span, .owo.owo-lable input, .owo.owo-lable .button {
+  line-height: 40px;
+  display: inline-block;
+  float: left;
+  margin: 0 5px;
+  font-size: 14px;
+}
+.owo.owo-lable input[type="text"], .owo.owo-lable input[type="number"], .owo.owo-lable input[type="date"], .owo.owo-lable input[type="time"] {
+  width: 60px;
+  height: 30px;
+  margin: 5px;
+}
+
+.owo.owo-lable .button {
+  width: 60px;
+  height: 30px;
+  line-height: 30px;
+  font-size: 14px;
+  margin: 5px 10px;
+  box-shadow: none;
+}
+.owo .sw-pannel {
+  background-color: cornsilk;
+  padding: 10px;
+  font-size: 14px;
+  border-radius: 0 0 5px 5px;
+  box-shadow: 1px 1px 4px #ccc;
+}
+.owo .owo-sw-panel .sw-title span {
+  display: inline-block;
+  background-color: #f3f1e9;
+  padding: 5px 10px;
+  box-shadow: -1px -2px 2px #f3efef;
+  border-radius: 5px 5px 0 0;
+  font-size: 14px;
+  line-height: 22px;
+  cursor: pointer;
+}
+
+.owo .owo-sw-panel .sw-title span.active {
+  background-color: cornsilk;
+}
+
+.arr-edit {
+  width: 98%;
+  margin: 0 auto;
+}
+.arr-edit .icon-button {
+  background-color: #ebebeb;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  padding-right: 5px;
+  height: 26px;
+  border-radius: 5px;
+  color: darkslategray;
+  font-size: 14px;
+  width: 58px;
+  cursor: pointer;
+  margin-left: 5px;
+}
+.arr-edit .icon-button svg {
+  margin: 0 3px;
+  width: 18px;
+  height: 18px;
+}
+.arr-edit .icon-button:hover {
+  background-color: #009fe9;
+  color: white;
+}
+.arr-edit .icon-button svg, .arr-edit .icon-button svg path {
+  fill: #707070;
+}
+.arr-edit .icon-button:hover svg, .arr-edit .icon-button:hover svg path {
+  fill: #ffffff;
+}
+.arr-edit .tool-bar {
+  display: flex;
+  justify-content: end;
+  
+  margin: 0 auto;
+  padding: 5px 0;
+}
+.arr-show-box {
+  background-color: #f4f4f4;
+  padding: 10px;
+  font-size: 14px;
+  box-shadow: 1px 1px 2px #ccc;
+  min-height: 20px;
+  border-radius: 5px;
+}
+.arr-show-box span {
+  padding: 3px 8px;
+  cursor: pointer;
+  background-color: gainsboro;
+  border-radius: 5px;
+  margin-right: 5px;
+  display: inline-block;
+}
+.arr-show-box span.active {
+  background-color: #009fe9;
+  color: white;
+  margin: 2px;
+}
+.owo .button-line-2 {
+  display: flex;
+}
+.owo .button-line-2 .button {
+  width: 48%;
+}
+.owo.button-bar {
+  display: flex;
+  padding: 0 1%;
+  justify-content: flex-end;
+}
+.owo.button-bar .button {
+  width: 100px;
+  margin: 10px 5px;
+  height: 35px;
+  line-height: 35px;
+  font-size: 14px;
+}
+
+.owo.button-bar h1,.owo.button-bar h2,.owo.button-bar h3,.owo.button-bar h4,.owo.button-bar h5 {
+  border-bottom: none;
+}
+
+.owo.button-bar .button a {
+  color: white;
+  text-decoration: none;
+}
+
+.owo.card {
+  border: 1px solid #ccc;
+  border-radius: 5px;
+  box-shadow: 0px 0px 5px #ccc;
+  background-color: #efefef;
+  padding: 0 10px;
+  margin: 0 10px;
+  margin-bottom: 10px;
+}
+nav.owo {
+  position: relative;
+  z-index: 9999;
+  position: sticky;
+  top: 0;
+  line-height: 50px;
+  height: 50px;
+  background: #ffffff;
+  box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15), 0 2px 1px -5px rgba(0, 0, 0, 0.12), 0 1px 6px 0 rgba(0, 0, 0, 0.2);
+}
+nav.owo h1, nav.owo h2,nav.owo h3,nav.owo h4,nav.owo h5 {
+  width: auto;
+  text-align: center;
+  text-transform: uppercase;
+  color: #d93622;
+  border: none;
+  margin: 0;
+  padding: 0;
+  line-height: 50px;
+}
+
+/* 文件上传 */
+
+.owo-uploader {
+  display: block;
+  clear: both;
+  margin: 15px auto;
+  width: 98%;
+  max-width: 600px;
+}
+.owo-uploader label {
+  float: left;
+  clear: both;
+  width: calc(100% - 4px);
+  padding: 2rem 0rem;
+  text-align: center;
+  background: #fff;
+  border-radius: 7px;
+  border: 3px solid #eee;
+  transition: all 0.2s ease;
+  -webkit-user-select: none;
+    -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+}
+.owo-uploader label:hover {
+  border-color: #454cad;
+}
+.owo-uploader label.hover {
+  border: 3px solid #454cad;
+  box-shadow: inset 0 0 0 6px #eee;
+}
+.owo-uploader label.hover #start i.fa {
+  transform: scale(0.8);
+  opacity: 0.3;
+}
+.owo-uploader #start {
+  float: left;
+  clear: both;
+  width: 100%;
+}
+.owo-uploader #start.hidden {
+  display: none;
+}
+.owo-uploader #start i.fa {
+  font-size: 50px;
+  margin-bottom: 1rem;
+  transition: all 0.2s ease-in-out;
+}
+.owo-uploader #response {
+  float: left;
+  clear: both;
+  width: 100%;
+}
+.owo-uploader #response.hidden {
+  display: none;
+}
+.owo-uploader #response #messages {
+  margin-bottom: 0.5rem;
+}
+.owo-uploader #file-image {
+  display: inline;
+  margin: 0 auto 0.5rem auto;
+  width: auto;
+  height: auto;
+  max-width: 180px;
+}
+.owo-uploader #file-image.hidden {
+  display: none;
+}
+.owo-uploader #notimage {
+  display: block;
+  float: left;
+  clear: both;
+  width: 100%;
+}
+.owo-uploader #notimage.hidden {
+  display: none;
+}
+.owo-uploader progress,
+.owo-uploader .progress {
+  display: inline;
+  clear: both;
+  margin: 0 auto;
+  width: 100%;
+  max-width: 180px;
+  height: 8px;
+  border: 0;
+  border-radius: 4px;
+  background-color: #eee;
+  overflow: hidden;
+}
+.owo-uploader .progress[value]::-webkit-progress-bar {
+  border-radius: 4px;
+  background-color: #eee;
+}
+.owo-uploader .progress[value]::-webkit-progress-value {
+  background: linear-gradient(to right, #393f90 0%, #454cad 50%);
+  border-radius: 4px;
+}
+.owo-uploader .progress[value]::-moz-progress-bar {
+  background: linear-gradient(to right, #393f90 0%, #454cad 50%);
+  border-radius: 4px;
+}
+.owo-uploader input[type=file] {
+  display: none;
+}
+.owo-uploader div {
+  margin: 0 0 0.5rem 0;
+  color: #5f6982;
+}
+.owo-uploader .btn {
+  display: inline-block;
+  margin: 0.5rem 0.5rem 1rem 0.5rem;
+  clear: both;
+  font-family: inherit;
+  font-weight: 700;
+  font-size: 14px;
+  text-decoration: none;
+  text-transform: initial;
+  border: none;
+  border-radius: 0.2rem;
+  outline: none;
+  padding: 0 1rem;
+  height: 36px;
+  line-height: 36px;
+  color: #fff;
+  transition: all 0.2s ease-in-out;
+  box-sizing: border-box;
+  background: #454cad;
+  border-color: #454cad;
+  cursor: pointer;
+}
+
+.float-box {
+  padding: 0 1%;
+}
+
+.owo.float-box .owo.button {
+  float: left;
+  width: auto;
+  padding: 0 8px;
+  margin: 5px 4px;
+  line-height: 26px;
+  height: 26px;
+  font-size: 12px;
+}
+
+.owo.button .close-button {
+  position: absolute;
+  right: -5px;
+  top: -5px;
+  font-size: 12px;
+  width: 14px;
+  height: 14px;
+  background-color: orange;
+  color: white;
+  line-height: 14px;
+  border-radius: 6px;
+  display: none;
+}
+
+.owo.button:hover .close-button {
+  display: block;
+}

+ 354 - 0
plug/star.js

@@ -0,0 +1,354 @@
+class PugePanel {
+    constructor() {
+        this.loadedCSS = new Set();
+        this.init();
+    }
+
+    // 初始化方法
+    init() {
+        this.removeExistingStartBox();
+        this.createPanel();
+        this.createTriggerButton();
+    }
+
+    // 加载CSS,避免重复加载
+    loadCSS(url) {
+        if (this.loadedCSS.has(url)) return;
+        
+        this.loadedCSS.add(url);
+        const link = document.createElement('link');
+        link.rel = 'stylesheet';
+        link.type = 'text/css';
+        link.href = url;
+        (document.head || document.documentElement).appendChild(link);
+    }
+
+    // 移除已存在的start-box
+    removeExistingStartBox() {
+        const existingBox = document.querySelector('.start-box');
+        if (existingBox) {
+            existingBox.remove();
+        }
+    }
+
+    // 创建关闭按钮
+    createCloseButton() {
+        const closeBtn = document.createElement('div');
+        closeBtn.className = 'puge-close-btn';
+        closeBtn.innerHTML = '×';
+        closeBtn.setAttribute('aria-label', '关闭面板');
+        
+        // 添加关闭按钮事件
+        closeBtn.addEventListener('click', () => this.togglePanel(false));
+        closeBtn.addEventListener('mouseenter', () => {
+            closeBtn.style.color = '#ff4444';
+        });
+        closeBtn.addEventListener('mouseleave', () => {
+            closeBtn.style.color = '#666';
+        });
+        
+        return closeBtn;
+    }
+
+    // 创建标题栏
+    createTitleBar() {
+        const titleBar = document.createElement('div');
+        titleBar.className = 'puge-title-bar';
+        
+        const titleText = document.createElement('span');
+        titleText.className = 'puge-title';
+        titleText.textContent = '功能面板';
+        
+        titleBar.appendChild(titleText);
+        titleBar.appendChild(this.createCloseButton());
+        
+        return titleBar;
+    }
+
+    // 创建内容区域
+    createContentArea() {
+        const contentArea = document.createElement('div');
+        contentArea.className = 'puge-box puge-content-area';
+        
+        // 根据屏幕方向设置高度
+        const isLandscape = window.innerWidth > window.innerHeight;
+        if (isLandscape) {
+            contentArea.style.maxHeight = '60%';
+        } else {
+            contentArea.style.height = 'calc(100% - 40px)';
+        }
+        
+        return contentArea;
+    }
+
+    // 创建主面板
+    createPanel() {
+        setTimeout(() => {
+            if (document.querySelector('.start-box')) return;
+            
+            const panel = document.createElement('div');
+            panel.className = 'start-box owo puge-panel';
+            panel.setAttribute('aria-hidden', 'true');
+            
+            // 设置面板样式
+            const isLandscape = window.innerWidth > window.innerHeight;
+            Object.assign(panel.style, {
+                display: 'none',
+                zIndex: '9665',
+                position: 'fixed',
+                right: '0',
+                bottom: '0',
+                boxShadow: '1px 1px 9px rgba(204, 204, 204, 0.5)',
+                backgroundColor: 'rgba(255, 255, 255, 0.95)',
+                backdropFilter: 'blur(10px)',
+                transition: 'opacity 0.3s ease, transform 0.3s ease'
+            });
+            
+            if (isLandscape) {
+                panel.style.width = '320px';
+                panel.style.maxHeight = '60%';
+            } else {
+                panel.style.width = '100%';
+                panel.style.height = '100%';
+            }
+            const contentArea = this.createContentArea()
+            // 组装面板
+            panel.appendChild(this.createTitleBar());
+            panel.appendChild(contentArea);
+            
+            setTimeout(() => {
+                document.body.appendChild(panel);
+                // 触发创建回调
+                if (window.pugeCreated) {
+                    window.pugeCreated(contentArea);
+                    window.pugeCreated = null;
+                }
+            }, 1000);
+            
+            
+        }, 1000);
+    }
+
+    // 星星图标SVG
+    get starIconSVG() {
+        return `<svg class="puge-star-icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="40" height="40">
+            <path d="M622.7968 89.7024l60.1088 124.1088c15.9744 36.0448 52.0192 60.1088 92.16 66.048l134.144 20.0704c100.1472 14.0288 138.1376 136.192 68.096 208.2816l-98.0992 94.1056c-28.0576 28.0576-42.0864 68.096-36.0448 106.0864l22.016 134.144c15.9744 100.1472-86.1184 174.1824-176.2304 128.2048l-120.1152-62.0544c-36.0448-18.0224-76.0832-18.0224-112.128 0L334.4384 972.8c-90.112 46.08-192.2048-28.0576-176.2304-128.2048l22.016-134.144c7.9872-40.0384-6.0416-80.0768-36.0448-106.0864L46.08 508.2112c-72.0896-72.0896-32.0512-192.2048 68.096-208.2816l134.144-20.0704c40.0384-6.0416 74.1376-30.0032 92.16-66.048l60.1088-124.1088c50.0736-90.112 176.2304-90.112 222.208 0" fill="#FED44A"></path>
+            <path d="M404.5824 89.7024l-60.1088 124.1088c-15.9744 36.0448-52.0192 60.1088-92.16 66.048l-134.144 20.0704c-62.0544 10.0352-102.0928 60.1088-104.1408 112.128 18.0224-98.0992 220.2624-22.016 312.4224-14.0288 94.1056 10.0352 120.1152-74.1376 120.1152-74.1376s20.0704-100.1472 44.032-226.304c18.0224-102.0928 86.1184-58.0608 110.1824-40.0384C544.768-0.4096 444.6208 11.6736 404.5824 89.7024" fill="#FFDE73"></path>
+            <path d="M574.7712 784.5888c-74.1376-50.0736-140.1856 0-140.1856 0S362.496 848.6912 278.4256 928.768c-86.1184 80.0768-118.1696-33.9968-118.1696-33.9968 18.0224 72.0896 102.0928 116.1216 174.1824 76.0832l122.1632-62.0544c36.0448-18.0224 76.0832-18.0224 112.128 0L690.8928 972.8c56.1152 30.0032 118.1696 11.9808 152.1664-32.0512 2.048-7.9872 3.9936-14.0288 7.9872-20.0704-67.9936 66.1504-200.192-86.016-276.2752-136.0896" fill="#FEC54A"></path>
+            <path d="M466.6368 103.7312c15.9744 3.9936 26.0096 18.0224 22.016 36.0448l-28.0576 126.1568c-3.9936 15.9744-18.0224 26.0096-36.0448 22.016-15.9744-3.9936-26.0096-18.0224-22.016-36.0448l28.0576-128.2048c3.9936-15.9744 20.0704-23.9616 36.0448-19.968" fill="#FFF2CA"></path>
+            <path d="M375.3984 530.8416c-29.2864 0-53.0432-18.7392-53.0432-41.984 0-23.1424 23.7568-41.984 53.0432-41.984s53.0432 18.7392 53.0432 41.984c0 23.1424-23.7568 41.984-53.0432 41.984z m260.9152 0c-29.2864 0-53.0432-18.7392-53.0432-41.984 0-23.1424 23.7568-41.984 53.0432-41.984s53.0432 18.7392 53.0432 41.984c0 23.1424-23.7568 41.984-53.0432 41.984z m-190.464 74.6496c-2.56-3.6864-3.3792-8.192-2.56-12.4928 0.9216-4.3008 3.584-8.0896 7.2704-10.4448 7.8848-5.12 18.432-3.072 23.8592 4.608 12.288 17.7152 26.2144 25.8048 43.1104 25.8048s30.8224-8.0896 43.1104-25.8048c5.4272-7.68 15.9744-9.728 23.8592-4.608 3.7888 2.3552 6.4512 6.144 7.2704 10.4448 0.9216 4.3008 0 8.9088-2.56 12.4928-18.3296 26.5216-42.7008 40.6528-71.7824 40.6528-28.8768-0.1024-53.248-14.1312-71.5776-40.6528z" fill="#92410E"></path>
+        </svg>`;
+    }
+
+    // 创建触发按钮
+    createTriggerButton() {
+        if (document.querySelector('.puge-menu')) return;
+        
+        const triggerBtn = document.createElement('div');
+        triggerBtn.className = 'puge-menu puge-trigger-btn';
+        triggerBtn.setAttribute('aria-label', '打开功能面板');
+        triggerBtn.setAttribute('role', 'button');
+        triggerBtn.tabIndex = 0;
+        
+        Object.assign(triggerBtn.style, {
+            position: 'fixed',
+            width: '40px',
+            height: '40px',
+            right: '10px',
+            bottom: '120px',
+            zIndex: '9666',
+            cursor: 'pointer',
+            transition: 'transform 0.3s ease'
+        });
+        
+        triggerBtn.innerHTML = this.starIconSVG;
+        
+        // 添加点击事件
+        triggerBtn.addEventListener('click', () => this.togglePanel(true));
+        triggerBtn.addEventListener('keydown', (e) => {
+            if (e.key === 'Enter' || e.key === ' ') {
+                e.preventDefault();
+                this.togglePanel(true);
+            }
+        });
+        
+        // 添加悬停效果
+        triggerBtn.addEventListener('mouseenter', () => {
+            triggerBtn.style.transform = 'scale(1.1)';
+        });
+        triggerBtn.addEventListener('mouseleave', () => {
+            triggerBtn.style.transform = 'scale(1)';
+        });
+        
+        setTimeout(() => {
+            document.body.appendChild(triggerBtn);
+        }, 1000);
+    }
+
+    // 切换面板显示/隐藏
+    togglePanel(show) {
+        const panel = document.querySelector('.start-box');
+        const triggerBtn = document.querySelector('.puge-menu');
+        
+        if (!panel) return;
+        
+        const shouldShow = show ?? panel.style.display === 'none';
+        
+        if (shouldShow) {
+            panel.style.display = 'block';
+            panel.setAttribute('aria-hidden', 'false');
+            panel.style.opacity = '0';
+            panel.style.transform = 'translateY(20px)';
+            
+            // 动画显示
+            requestAnimationFrame(() => {
+                panel.style.opacity = '1';
+                panel.style.transform = 'translateY(0)';
+            });
+            
+            if (triggerBtn) {
+                triggerBtn.style.display = 'none';
+            }
+            
+            // 触发回调
+            if (window.pugeCreated) {
+                window.pugeCreated(panel.querySelector('.puge-content-area'));
+                window.pugeCreated = null;
+            }
+        } else {
+            panel.style.opacity = '0';
+            panel.style.transform = 'translateY(20px)';
+            
+            setTimeout(() => {
+                panel.style.display = 'none';
+                panel.setAttribute('aria-hidden', 'true');
+                
+                if (triggerBtn) {
+                    triggerBtn.style.display = 'block';
+                    triggerBtn.style.opacity = '0';
+                    triggerBtn.style.transform = 'scale(0.8)';
+                    
+                    requestAnimationFrame(() => {
+                        triggerBtn.style.opacity = '1';
+                        triggerBtn.style.transform = 'scale(1)';
+                    });
+                }
+            }, 300);
+        }
+    }
+
+    // 全局方法挂载
+    static mountGlobalMethods() {
+        window.owostart = () => {
+            const instance = window.pugePanelInstance;
+            if (instance) instance.togglePanel();
+        };
+        
+        window.loadingDialog = () => {
+            // 保留原接口,空实现
+            return;
+        };
+        
+        window.alertDialog = (text) => {
+            if (window.logBox && window.logBox.add) {
+                window.logBox.add(text);
+            } else {
+                console.log('Alert:', text);
+            }
+        };
+    }
+}
+
+// 创建样式(可以移到CSS文件中)
+function addStyles() {
+    const style = document.createElement('style');
+    style.textContent = `
+        .puge-title-bar {
+            position: relative;
+            height: 40px;
+            line-height: 40px;
+            background: linear-gradient(135deg, #f5f5f5 0%, #e8e8e8 100%);
+            border-bottom: 1px solid #e0e0e0;
+            padding: 0 15px;
+            font-weight: 600;
+            font-size: 16px;
+            color: #333;
+            user-select: none;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+        }
+        
+        .puge-title {
+            font-size: 16px;
+            color: #333;
+        }
+        
+        .puge-close-btn {
+            width: 30px;
+            height: 40px;
+            line-height: 40px;
+            text-align: center;
+            font-size: 24px;
+            color: #666;
+            cursor: pointer;
+            transition: color 0.3s ease, transform 0.2s ease;
+            border-radius: 4px;
+        }
+        
+        .puge-close-btn:hover {
+            color: #ff4444;
+            transform: scale(1.1);
+        }
+        
+        .puge-close-btn:active {
+            transform: scale(0.95);
+        }
+        
+        .puge-box {
+            padding: 0 10px;
+            overflow: auto;
+            box-sizing: border-box;
+            background-color: #fff;
+        }
+        
+        .puge-trigger-btn {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            transition: all 0.3s ease !important;
+        }
+        
+        .puge-star-icon {
+            display: block;
+            filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1));
+        }
+        .puge-login-box, .puge-box.puge-content-area {
+            position: relative;
+            padding-bottom: 10px;
+        }
+        @media (prefers-reduced-motion: reduce) {
+            .puge-panel,
+            .puge-trigger-btn,
+            .puge-close-btn {
+                transition: none !important;
+            }
+        }
+    `;
+    (document.head || document.documentElement).appendChild(style);
+}
+
+// 初始化
+(function() {
+    // 防止重复初始化
+    if (window.pugePanelInstance) return;
+    
+    // 添加样式
+    addStyles();
+    
+    // 创建实例
+    window.pugePanelInstance = new PugePanel();
+    
+    // 挂载全局方法
+    PugePanel.mountGlobalMethods();
+})();

+ 13 - 17
popup.html

@@ -78,20 +78,6 @@
         color: #999;
         font-size: 14px;
       }
-      .userInfo {
-        position: absolute;
-        bottom: 0;
-        right: 0;
-        color: #009fe9;
-        font-size: 14px;
-        line-height: 26px;
-        padding: 0 5px;
-        cursor: pointer;
-        z-index: 999;
-      }
-      .userInfo:hover {
-        color: #9d9e4e;
-      }
       .clearTemp {
         width: 20px;
         height: 20px;
@@ -105,21 +91,31 @@
       .clearTemp:hover path {
         fill: #009fe9;
       }
+      .lxkf {
+        text-decoration: none;
+        color: peru;
+        position: absolute;
+        right: 5px;
+        bottom: 3px;
+        font-size: 14px;
+        line-height: 20px;
+        cursor: pointer;
+        z-index: 999;
+      }
     </style>
   </head>
   <body>
     <div class="script-box">
-      <div class="userInfo">未登录用户</div>
-      <svg class="clearTemp"  viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3481" width="20" height="20"><path d="M786.6 715.9c-5.1 0-10.3-1.3-15.1-4.1L295.4 434.7c-14.3-8.3-19.2-26.7-10.8-41 8.3-14.3 26.7-19.2 41-10.8L801.7 660c14.3 8.3 19.2 26.7 10.8 41-5.6 9.5-15.6 14.9-25.9 14.9z" p-id="3482" fill="#bfbfbf"></path><path d="M629.3 960c-14.7 0-29.3-4.2-42.1-11.6L186.1 714.7c-40-23.3-53.8-75.1-30.7-115.4l166.4-290.5c15-26.1 42.9-42.4 72.9-42.4 14.7 0 29.3 3.9 42.1 11.4l113.2 66 129-225.2c19.1-33.4 54.8-54.1 93.1-54.1 18.8 0 37.4 5 53.7 14.5 51.1 29.8 68.8 95.9 39.3 147.4L735.9 452l102 59.4c40 23.3 53.8 75 30.7 115.3L702.2 917.4c-14.9 26.1-42.9 42.6-72.9 42.6zM394.7 326.4c-8.6 0-16.5 4.7-20.8 12.2L207.5 629.1c-6.7 11.8-2.8 26.9 8.9 33.6l401.1 233.5c3.7 2.1 7.7 3.2 11.9 3.2 8.6 0 16.5-4.7 20.8-12.2l166.4-290.5c6.7-11.8 2.8-26.9-8.8-33.6L680 488.8c-14.2-8.3-19.1-26.5-10.9-40.8L813 196.6c13.2-23 5.4-52.5-17.4-65.7-7.2-4.2-15.3-6.4-23.5-6.4-16.9 0-32.6 9.2-41 23.9l-144 251.4c-4 6.9-10.5 12-18.3 14.1-7.7 2.1-15.9 1-22.9-3.1l-139.4-81.1c-3.6-2.2-7.6-3.3-11.8-3.3z" p-id="3483" fill="#bfbfbf"></path></svg>
+      <span id="lxkf" class="lxkf" target="_blank">联系客服</span>
       <img class="loading" src="./img/loading.svg">
       <div class="no-script">
         <img src="./img/no-script.svg">
         <p>此页面没有适用脚本!</p>
+        
       </div>
       <div class="button-box">
       </div>
     </div>
-    
     <script type="text/javascript" src="js/popup.js"></script>
   </body>
   

+ 1 - 0
rules.json

@@ -0,0 +1 @@
+[]

+ 64 - 0
scripts/376.js

@@ -0,0 +1,64 @@
+function getZL(ele) {
+    if (!ele.querySelector('.zy-meli-card-wrap') || !ele.querySelector('.zy-meli-card-wrap').shadowRoot) {
+        return -1
+    }
+    let temp = ele.querySelector('.zy-meli-card-wrap').shadowRoot.querySelectorAll('.meli-card-info-row .meli-card-info-value')[1].innerText
+    temp = temp.replace('g', '')
+    if (temp == '-') return -1
+    if (temp == '') return -1
+    return parseInt(temp)
+}
+
+function orderList () {
+    let domList = []
+    document.querySelectorAll('.ui-search-layout__item').forEach(element => {
+        domList.push(element)
+    });
+
+
+
+    domList = domList.sort((a, b) => getZL(b) - getZL(a));
+    domList.forEach(element => {
+        console.log(getZL(element))
+    });
+
+    let tempDom = ``
+    domList.forEach(element => {
+        tempDom += element.outerHTML
+    });
+
+    document.querySelector('.ui-search-layout.ui-search-layout--grid').innerHTML = tempDom
+}
+
+function orderList2 () {
+    let domList = []
+    document.querySelectorAll('.ui-search-layout__item').forEach(element => {
+        domList.push(element)
+    });
+
+
+
+    domList = domList.sort((a, b) => getZL(a) - getZL(b));
+    domList.forEach(element => {
+        console.log(getZL(element))
+    });
+
+    let tempDom = ``
+    domList.forEach(element => {
+        tempDom += element.outerHTML
+    });
+
+    document.querySelector('.ui-search-layout.ui-search-layout--grid').innerHTML = tempDom
+}
+
+window.pugeCreated = function (el) {
+    el.innerHTML = '<div class="owo"><div class="owo button" id="cddx" >按重量大->小</div><div class="owo button" id="cxdd" >按重量小->大</div></div>'
+    setTimeout(() => {
+        window.cddx.onclick = function () {
+            orderList()
+        }
+        window.cxdd.onclick = function () {
+            orderList2()
+        }
+    }, 1000);
+}

+ 159 - 0
scripts/378.js

@@ -0,0 +1,159 @@
+window.zknumber = prompt("将当页折扣统一设置为:", "");
+if (window.zknumber !== null) {
+    runJob ()
+}
+
+function forceReactUpdate(element, value) {
+    console.log('🎯 强制React更新,新值:', value);
+    
+    // 方法1:尝试直接修改React内部状态
+    const reactKeys = Object.keys(element).filter(key => 
+        key.startsWith('__react') || 
+        key.includes('Props') || 
+        key.includes('Handler')
+    );
+    
+    console.log('找到的React属性:', reactKeys);
+    
+    // 如果有React内部属性,尝试直接修改
+    if (reactKeys.length > 0) {
+        for (const key of reactKeys) {
+            try {
+                const obj = element[key];
+                if (obj && typeof obj === 'object') {
+                    // 尝试找到onChange或onBlur
+                    if (obj.onChange) {
+                        console.log('找到 onChange,尝试调用');
+                        const event = {
+                            target: element,
+                            currentTarget: element,
+                            type: 'change'
+                        };
+                        element.value = String(value);
+                        obj.onChange(event);
+                    }
+                    
+                    if (obj.onBlur) {
+                        console.log('找到 onBlur,尝试调用');
+                        const event = {
+                            target: element,
+                            currentTarget: element,
+                            type: 'blur'
+                        };
+                        obj.onBlur(event);
+                    }
+                }
+            } catch (e) {
+                console.warn('访问React属性失败:', key, e.message);
+            }
+        }
+    }
+    
+    // 方法2:同时触发所有可能的事件
+    console.log('🔨 触发所有相关事件');
+    
+    // 设置值
+    element.value = String(value);
+    
+    // 创建事件数组,按正确顺序触发
+    const eventSequence = [
+        { type: 'focus', isFocus: true },
+        { type: 'focusin', isFocus: true },
+        { type: 'click' },
+        { type: 'mousedown' },
+        { type: 'mouseup' },
+        { type: 'keydown', isKey: true, key: ' ' },
+        { type: 'keypress', isKey: true, key: ' ' },
+        { 
+            type: 'input', 
+            isInput: true, 
+            data: String(value),
+            inputType: 'insertText'
+        },
+        { type: 'keyup', isKey: true, key: ' ' },
+        { type: 'change' },
+        { type: 'blur', isFocus: true },
+        { type: 'focusout', isFocus: true }
+    ];
+    
+    eventSequence.forEach((eventConfig, index) => {
+        setTimeout(() => {
+            let event;
+            
+            if (eventConfig.isFocus) {
+                event = new FocusEvent(eventConfig.type, {
+                    bubbles: true,
+                    cancelable: true,
+                    view: window
+                });
+            } else if (eventConfig.isKey) {
+                event = new KeyboardEvent(eventConfig.type, {
+                    bubbles: true,
+                    cancelable: true,
+                    key: eventConfig.key || ' ',
+                    code: eventConfig.key === ' ' ? 'Space' : 'Key' + eventConfig.key?.toUpperCase(),
+                    view: window
+                });
+            } else if (eventConfig.isInput) {
+                event = new InputEvent(eventConfig.type, {
+                    bubbles: true,
+                    cancelable: true,
+                    data: eventConfig.data,
+                    inputType: eventConfig.inputType,
+                    view: window
+                });
+            } else {
+                event = new Event(eventConfig.type, {
+                    bubbles: true,
+                    cancelable: true,
+                    view: window
+                });
+            }
+            
+            // 设置目标
+            Object.defineProperty(event, 'target', { value: element });
+            Object.defineProperty(event, 'currentTarget', { value: element });
+            
+            console.log(`触发 ${eventConfig.type} 事件`);
+            element.dispatchEvent(event);
+        }, index * 20); // 每个事件间隔20ms
+    });
+    
+    // 最后触发blur
+    setTimeout(() => {
+        element.blur();
+        console.log('✅ 所有事件已触发');
+    }, eventSequence.length * 20 + 50);
+}
+
+// 或者使用 React Test Utilities 风格
+function simulateReactChange(element, value) {
+    element.value = value;
+    
+    // React 16+ 使用这些事件
+    element.dispatchEvent(new Event('input', { bubbles: true }));
+    element.dispatchEvent(new Event('change', { bubbles: true }));
+    
+    // 对于 React 17+
+    element.dispatchEvent(new Event('change', { 
+        bubbles: true,
+        composed: true 
+    }));
+}
+
+function runJob () {
+    document.querySelectorAll('[aria-label="percentageInput"]').forEach(element => {
+        forceReactUpdate(element, window.zknumber)
+    });
+    setTimeout(() => {
+        if (!document.querySelector('.andes-pagination__button--next').classList.contains('andes-pagination__button--disabled')) {
+            document.querySelector('[title="Next"]').click()
+            setTimeout(() => {
+                runJob ()
+            }, 2000);
+        } else {
+            alert('执行完毕!')
+        }
+    }, 1000);
+    
+}