.:. 草榴社區 » 技術討論區 » [自建科学上网] CF workers永久免费Trojan节点搭建教程:workers与pages两方案部署优选IP节点;如何看待Trojan被识别 [13P]
--> 本頁主題: [自建科学上网] CF workers永久免费Trojan节点搭建教程:workers与pages两方案部署优选IP节点;如何看待Trojan被识别 [13P] 字體大小 寬屏顯示 只看樓主 最新點評 熱門評論 時間順序
柳东柚


級別:新手上路 ( 8 )
發帖:162
威望:64 點
金錢:6402 USD
貢獻:0 點
註冊:2023-05-31


[自建科学上网] CF workers永久免费Trojan节点搭建教程:workers与pages两方案部署优选IP节点;如何看待Trojan被识别 [13P]



1、CF workers的流量限制:workers与pages目前提供每天10万次免费请求,但很多人都超过了还能用。

2、优选域名的有效性:教程已说明两个被干的可能性,如果你平时一直用一个优选域名,且效果能满足你的要求,那别再去优选了,躺平吧!不然你天天选,那就与优选IP无异了,不如用优选IP更加有效果,所以,建议懒人小白使用。

3、某些eu.org域名都是大佬自己搞的CDN域名,日常要维护,如果有一天失效,不要惊讶。

4、你自己也可以搞个CDN域名,当然,你不会像大佬那样搞得这么复杂且优秀,最最简单的方式就是开启小黄云后的域名,这就是自己偷自己,不是偷大厂家的了。如选大厂的就直接躺平吧。

5、优选域名建议使用公共网站的域名,这样有隐蔽性!目前应用与脚本收录的数量仅收录知道的,大家可以在互联网上自行寻找哦!如果你找到一个公共优选域名,可以留个言哦,优选目录可以增加下!感谢你的参与。

6、优选大厂域名与优选IP的选择。打个比方,前者稳定但不快,后者不稳但快。且优选域名只要能ping通就能用,脚本显示的ping值的高低排序仅供参考,有时ping高的域名下载速度比ping低的域名还快哦,选择适合自己的吧。

7、优选域名也可以用在VPS搭建的WS协议上,可以看这期视频的应用:敏感时期代理协议被墙(封IP,封端口):小白用户如何绕过GFW封锁,目前“四大方案"解君愁(躺平养老?死磕硬杠?先声夺人?),总有一种方案适合你,以小白角度总结目前代理协议与GFW的博弈。

8、关于优选IP:有优选CF官方IP(例:104开头的IP)与优选反代IP两种说法,优选反代IP更加容易失效(因为大多是上游大佬扫出来的,没自主权,且容易失效),教程中的脚本都为优选反代IP(已更新优选官方IP电脑版),而一般大厂的优选域名,所解析的IP都为CF官方IP。

优选CF官方IP:13个端口通用

CF大厂域名:13个端口通用

优选反代IP:指定端口

 

 

複製代碼
  1. src/worker.js
  2. import { connect } from "cloudflare:sockets";
  3. let Pswd = 'trojan';
  4. const proxyIPs = ["cdn.xn--b6gac.eu.org"]; //workers.cloudflare.cyou bestproxy.onecf.eu.org cdn-all.xn--b6gac.eu.org cdn.xn--b6gac.eu.org
  5. let hostnames = [''];
  6. let sha224Password ;
  7. let proxyIP = proxyIPs[Math.floor(Math.random() * proxyIPs.length)];
  8. const worker_default = {
  9.     /**
  10.      * @param {import("@cloudflare/workers-types").Request} request
  11.      * @param {proxyip: string, pswd: string} env
  12.      * @param {import("@cloudflare/workers-types").ExecutionContext} ctx
  13.      * @returns {Promise<Response>}
  14.      */
  15.     async fetch(request, env, ctx) {
  16.         try {
  17.             proxyIP = env.proxyip || proxyIP;
  18.             Pswd = env.pswd || Pswd
  19.             sha224Password = sha256.sha224(Pswd);
  20.             const upgradeHeader = request.headers.get("Upgrade");
  21.             if (!upgradeHeader || upgradeHeader !== 'websocket') {
  22.                 const url = new URL(request.url);
  23.                 switch (url.pathname) {
  24.                     case '/cf':
  25.                         return new Response(JSON.stringify(request.cf, null, 4), {
  26.                             status: 200,
  27.                             headers: {
  28.                                 "Content-Type": "application/json;charset=utf-8",
  29.                             },
  30.                         });
  31.                    
  32.                     case `/${Pswd}`: {
  33.                         const trojanConfig = gettrojanConfig(Pswd, request.headers.get('Host'));
  34.                         return new Response(`${trojanConfig}`, {
  35.                             status: 200,
  36.                             headers: {
  37.                                 "Content-Type": "text/plain;charset=utf-8",
  38.                             }
  39.                         });
  40.                     }
  41.                     default:
  42.                         // return new Response('Not found', { status: 404 });
  43.                         // For any other path, reverse proxy to 'ramdom website' and return the original response, caching it in the process
  44.                         const randomHostname = hostnames[Math.floor(Math.random() * hostnames.length)];
  45.                         const newHeaders = new Headers(request.headers);
  46.                         newHeaders.set('cf-connecting-ip', '1.2.3.4');
  47.                         newHeaders.set('x-forwarded-for', '1.2.3.4');
  48.                         newHeaders.set('x-real-ip', '1.2.3.4');
  49.                         newHeaders.set('referer', 'https://www.google.com/search?q=edtunnel');
  50.                         // Use fetch to proxy the request to 15 different domains
  51.                         const proxyUrl = 'https://' + randomHostname + url.pathname + url.search;
  52.                         let modifiedRequest = new Request(proxyUrl, {
  53.                             method: request.method,
  54.                             headers: newHeaders,
  55.                             body: request.body,
  56.                             redirect: 'manual',
  57.                         });
  58.                         const proxyResponse = await fetch(modifiedRequest, { redirect: 'manual' });
  59.                         // Check for 302 or 301 redirect status and return an error response
  60.                         if ([301, 302].includes(proxyResponse.status)) {
  61.                             return new Response(`Redirects to ${randomHostname} are not allowed.`, {
  62.                                 status: 403,
  63.                                 statusText: 'Forbidden',
  64.                             });
  65.                         }
  66.                         // Return the response from the proxy server
  67.                         return proxyResponse;
  68.                 }
  69.             } else {
  70.                 return await trojanOverWSHandler(request);
  71.             }
  72.         } catch (err) {
  73.             /** @type {Error} */ let e = err;
  74.             return new Response(e.toString());
  75.         }
  76.     },
  77. };
  78. async function trojanOverWSHandler(request) {
  79.     const webSocketPair = new WebSocketPair();
  80.     const [client, webSocket] = Object.values(webSocketPair);
  81.     webSocket.accept();
  82.     let address = "";
  83.     let portWithRandomLog = "";
  84.     const log = (info, event) => {
  85.         console.log(`[${address}:${portWithRandomLog}] ${info}`, event || "");
  86.     };
  87.     const earlyDataHeader = request.headers.get("sec-websocket-protocol") || "";
  88.     const readableWebSocketStream = makeReadableWebSocketStream(webSocket, earlyDataHeader, log);
  89.     let remoteSocketWapper = {
  90.         value: null
  91.     };
  92.     let udpStreamWrite = null;
  93.     readableWebSocketStream.pipeTo(new WritableStream({
  94.         async write(chunk, controller) {
  95.             if (udpStreamWrite) {
  96.                 return udpStreamWrite(chunk);
  97.             }
  98.             if (remoteSocketWapper.value) {
  99.                 const writer = remoteSocketWapper.value.writable.getWriter();
  100.                 await writer.write(chunk);
  101.                 writer.releaseLock();
  102.                 return;
  103.             }
  104.             const {
  105.                 hasError,
  106.                 message,
  107.                 portRemote = 443,
  108.                 addressRemote = "",
  109.                 rawClientData
  110.             } = await parseTrojanHeader(chunk);
  111.             address = addressRemote;
  112.             portWithRandomLog = `${portRemote}--${Math.random()} tcp`;
  113.             if (hasError) {
  114.                 throw new Error(message);
  115.                 return;
  116.             }
  117.             handleTCPOutBound(remoteSocketWapper, addressRemote, portRemote, rawClientData, webSocket, log);
  118.         },
  119.         close() {
  120.             log(`readableWebSocketStream is closed`);
  121.         },
  122.         abort(reason) {
  123.             log(`readableWebSocketStream is aborted`, JSON.stringify(reason));
  124.         }
  125.     })).catch((err) => {
  126.         log("readableWebSocketStream pipeTo error", err);
  127.     });
  128.     return new Response(null, {
  129.         status: 101,
  130.         // @ts-ignore
  131.         webSocket: client
  132.     });
  133. }
  134. async function parseTrojanHeader(buffer) {
  135.     if (buffer.byteLength < 56) {
  136.         return {
  137.             hasError: true,
  138.             message: "invalid data"
  139.         };
  140.     }
  141.     let crLfIndex = 56;
  142.     if (new Uint8Array(buffer.slice(56, 57))[0] !== 0x0d || new Uint8Array(buffer.slice(57, 58))[0] !== 0x0a) {
  143.         return {
  144.             hasError: true,
  145.             message: "invalid header format (missing CR LF)"
  146.         };
  147.     }
  148.     const password = new TextDecoder().decode(buffer.slice(0, crLfIndex));
  149.     if (password !== sha224Password) {
  150.         return {
  151.             hasError: true,
  152.             message: "invalid password"
  153.         };
  154.     }
  155.     const socks5DataBuffer = buffer.slice(crLfIndex + 2);
  156.     if (socks5DataBuffer.byteLength < 6) {
  157.         return {
  158.             hasError: true,
  159.             message: "invalid SOCKS5 request data"
  160.         };
  161.     }
  162.     const view = new DataView(socks5DataBuffer);
  163.     const cmd = view.getUint8(0);
  164.     if (cmd !== 1) {
  165.         return {
  166.             hasError: true,
  167.             message: "unsupported command, only TCP (CONNECT) is allowed"
  168.         };
  169.     }
  170.     const atype = view.getUint8(1);
  171.     // 0x01: IPv4 address
  172.     // 0x03: Domain name
  173.     // 0x04: IPv6 address
  174.     let addressLength = 0;
  175.     let addressIndex = 2;
  176.     let address = "";
  177.     switch (atype) {
  178.         case 1:
  179.             addressLength = 4;
  180.             address = new Uint8Array(
  181.               socks5DataBuffer.slice(addressIndex, addressIndex + addressLength)
  182.             ).join(".");
  183.             break;
  184.         case 3:
  185.             addressLength = new Uint8Array(
  186.               socks5DataBuffer.slice(addressIndex, addressIndex + 1)
  187.             )[0];
  188.             addressIndex += 1;
  189.             address = new TextDecoder().decode(
  190.               socks5DataBuffer.slice(addressIndex, addressIndex + addressLength)
  191.             );
  192.             break;
  193.         case 4:
  194.             addressLength = 16;
  195.             const dataView = new DataView(socks5DataBuffer.slice(addressIndex, addressIndex + addressLength));
  196.             const ipv6 = [];
  197.             for (let i = 0; i < 8; i++) {
  198.                 ipv6.push(dataView.getUint16(i * 2).toString(16));
  199.             }
  200.             address = ipv6.join(":");
  201.             break;
  202.         default:
  203.             return {
  204.                 hasError: true,
  205.                 message: `invalid addressType is ${atype}`
  206.             };
  207.     }
  208.     if (!address) {
  209.         return {
  210.             hasError: true,
  211.             message: `address is empty, addressType is ${atype}`
  212.         };
  213.     }
  214.     const portIndex = addressIndex + addressLength;
  215.     const portBuffer = socks5DataBuffer.slice(portIndex, portIndex + 2);
  216.     const portRemote = new DataView(portBuffer).getUint16(0);
  217.     return {
  218.         hasError: false,
  219.         addressRemote: address,
  220.         portRemote,
  221.         rawClientData: socks5DataBuffer.slice(portIndex + 4)
  222.     };
  223. }
  224. async function handleTCPOutBound(remoteSocket, addressRemote, portRemote, rawClientData, webSocket, log) {
  225.     async function connectAndWrite(address, port) {
  226.         const tcpSocket2 = connect({
  227.             hostname: address,
  228.             port
  229.         });
  230.         remoteSocket.value = tcpSocket2;
  231.         log(`connected to ${address}:${port}`);
  232.         const writer = tcpSocket2.writable.getWriter();
  233.         await writer.write(rawClientData);
  234.         writer.releaseLock();
  235.         return tcpSocket2;
  236.     }
  237.     async function retry() {
  238.         const tcpSocket2 = await connectAndWrite(proxyIP || addressRemote, portRemote);
  239.         tcpSocket2.closed.catch((error) => {
  240.             console.log("retry tcpSocket closed error", error);
  241.         }).finally(() => {
  242.             safeCloseWebSocket(webSocket);
  243.         });
  244.         remoteSocketToWS(tcpSocket2, webSocket, null, log);
  245.     }
  246.     const tcpSocket = await connectAndWrite(addressRemote, portRemote);
  247.     remoteSocketToWS(tcpSocket, webSocket, retry, log);
  248. }
  249. function makeReadableWebSocketStream(webSocketServer, earlyDataHeader, log) {
  250.     let readableStreamCancel = false;
  251.     const stream = new ReadableStream({
  252.         start(controller) {
  253.             webSocketServer.addEventListener("message", (event) => {
  254.                 if (readableStreamCancel) {
  255.                     return;
  256.                 }
  257.                 const message = event.data;
  258.                 controller.enqueue(message);
  259.             });
  260.             webSocketServer.addEventListener("close", () => {
  261.                 safeCloseWebSocket(webSocketServer);
  262.                 if (readableStreamCancel) {
  263.                     return;
  264.                 }
  265.                 controller.close();
  266.             });
  267.             webSocketServer.addEventListener("error", (err) => {
  268.                 log("webSocketServer error");
  269.                 controller.error(err);
  270.             });
  271.             const { earlyData, error } = base64ToArrayBuffer(earlyDataHeader);
  272.             if (error) {
  273.                 controller.error(error);
  274.             } else if (earlyData) {
  275.                 controller.enqueue(earlyData);
  276.             }
  277.         },
  278.         pull(controller) {},
  279.         cancel(reason) {
  280.             if (readableStreamCancel) {
  281.                 return;
  282.             }
  283.             log(`readableStream was canceled, due to ${reason}`);
  284.             readableStreamCancel = true;
  285.             safeCloseWebSocket(webSocketServer);
  286.         }
  287.     });
  288.     return stream;
  289. }
  290. async function remoteSocketToWS(remoteSocket, webSocket, retry, log) {
  291.     let hasIncomingData = false;
  292.     await remoteSocket.readable.pipeTo(
  293.         new WritableStream({
  294.             start() {},
  295.             /**
  296.              *
  297.              * @param {Uint8Array} chunk
  298.              * @param {*} controller
  299.              */
  300.             async write(chunk, controller) {
  301.                 hasIncomingData = true;
  302.                 if (webSocket.readyState !== WS_READY_STATE_OPEN) {
  303.                     controller.error(
  304.                         "webSocket connection is not open"
  305.                     );
  306.                 }
  307.                 webSocket.send(chunk);
  308.             },
  309.             close() {
  310.                 log(`remoteSocket.readable is closed, hasIncomingData: ${hasIncomingData}`);
  311.             },
  312.             abort(reason) {
  313.                 console.error("remoteSocket.readable abort", reason);
  314.             }
  315.         })
  316.     ).catch((error) => {
  317.         console.error(
  318.             `remoteSocketToWS error:`,
  319.             error.stack || error
  320.         );
  321.         safeCloseWebSocket(webSocket);
  322.     });
  323.     if (hasIncomingData === false && retry) {
  324.         log(`retry`);
  325.         retry();
  326.     }
  327. }
  328. function base64ToArrayBuffer(base64Str) {
  329.     if (!base64Str) {
  330.         return { error: null };
  331.     }
  332.     try {
  333.         base64Str = base64Str.replace(/-/g, "+").replace(/_/g, "/");
  334.         const decode = atob(base64Str);
  335.         const arryBuffer = Uint8Array.from(decode, (c) => c.charCodeAt(0));
  336.         return { earlyData: arryBuffer.buffer, error: null };
  337.     } catch (error) {
  338.         return { error };
  339.     }
  340. }
  341. let WS_READY_STATE_OPEN = 1;
  342. let WS_READY_STATE_CLOSING = 2;
  343. function safeCloseWebSocket(socket) {
  344.     try {
  345.         if (socket.readyState === WS_READY_STATE_OPEN || socket.readyState === WS_READY_STATE_CLOSING) {
  346.             socket.close();
  347.         }
  348.     } catch (error) {
  349.         console.error("safeCloseWebSocket error", error);
  350.     }
  351. }
  352. export {
  353.     worker_default as
  354.     default
  355. };
  356. //# sourceMappingURL=worker.js.map
  357. function gettrojanConfig(Pswd, hostName) {
  358.     const wtrojanws = `trojan://${Pswd}\u0040www.visa.com.sg:8880?security=none&type=ws&host=${hostName}&path=%2F%3Fed%3D2560#${hostName}`;
  359.     const ptrojanwstls = `trojan://${Pswd}\u0040www.visa.com.sg:8443?security=tls&type=ws&host=${hostName}&sni=${hostName}&fp=random&path=%2F%3Fed%3D2560#${hostName}`;
  360.     const note = `甬哥博客地址:https://ygkkk.blogspot.com\n甬哥YouTube频道:https://www.youtube.com/@ygkkk\n甬哥TG电报群组:https://t.me/+jZHc6-A-1QQ5ZGVl\n甬哥TG电报频道:https://t.me/+DkC9ZZUgEFQzMTZl\n\n\n正在使用的ProxyIP:${proxyIP}`;
  361.  
  362.     if (hostName.includes('pages.dev')) {
  363.     return `
  364. ==========================配置详解==============================
  365. ${note}
  366. ################################################################
  367. CF-pages-trojan+ws+tls节点,分享链接如下:
  368. ${ptrojanwstls}
  369. ---------------------------------------------------------------
  370. 注意:如果 ${hostName} 在本地网络打不开(中国移动用户注意),客户端必须开启切片功能
  371. ---------------------------------------------------------------
  372. 客户端必要文明参数如下:
  373. 客户端地址(address):自定义的域名 或者 优选域名 或者 优选IP(反代IP必须与反代端口对应)
  374. 端口(port):6个https端口可任意选择(443、8443、2053、2083、2087、2096)
  375. 密码:${Pswd}
  376. 传输协议(network):ws 或者 websocket
  377. 伪装域名(host):${hostName}
  378. 路径(path):/?ed=2560
  379. 传输安全(TLS):开启
  380. 跳过证书验证(allowlnsecure):false
  381. ################################################################
  382. `;
  383.   } else {
  384.     return `
  385. ==========================配置详解==============================
  386. ${note}
  387. ################################################################
  388. 一、CF-workers-trojan+ws节点,分享链接如下:
  389. ${wtrojanws}
  390. ---------------------------------------------------------------
  391. 注意:当前节点无需使用CF解析完成的域名,客户端选项的TLS选项必须关闭
  392. ---------------------------------------------------------------
  393. 客户端必要文明参数如下:
  394. 客户端地址(address):自定义的域名 或者 优选域名 或者 优选IP(反代IP必须与反代端口对应)
  395. 端口(port):7个http端口可任意选择(80、8080、8880、2052、2082、2086、2095)
  396. 密码:${Pswd}
  397. 传输协议(network):ws 或者 websocket
  398. 伪装域名(host):${hostName}
  399. 路径(path):/?ed=2560
  400. ################################################################
  401. ################################################################
  402. 二、CF-workers-trojan+ws+tls 或者 CF-pages-trojan+ws+tls节点,分享链接如下:
  403. ${ptrojanwstls}
  404. ---------------------------------------------------------------
  405. 注意:使用workers域名开启TLS,客户端必须开启切片功能
  406. ---------------------------------------------------------------
  407. 客户端必要文明参数如下:
  408. 客户端地址(address):自定义的域名 或者 优选域名 或者 优选IP(反代IP必须与反代端口对应)
  409. 端口(port):6个https端口可任意选择(443、8443、2053、2083、2087、2096)
  410. 密码:${Pswd}
  411. 传输协议(network):ws 或者 websocket
  412. 伪装域名(host):${hostName}
  413. 路径(path):/?ed=2560
  414. 传输安全(TLS):开启
  415. 跳过证书验证(allowlnsecure):false
  416. ################################################################
  417. `;
  418.   }
  419. }
  420. /**
  421. * [js-sha256]{@link https://github.com/emn178/js-sha256}
  422. *
  423. * @version 0.11.0
  424. * @author Chen, Yi-Cyuan [[email][email protected][/email]]
  425. * @copyright Chen, Yi-Cyuan 2014-2024
  426. * @license MIT
  427. */
  428. /*jslint bitwise: true */
  429. (function () {
  430.   'use strict';
  431.   var ERROR = 'input is invalid type';
  432.   var WINDOW = typeof window === 'object';
  433.   var root = WINDOW ? window : {};
  434.   if (root.JS_SHA256_NO_WINDOW) {
  435.     WINDOW = false;
  436.   }
  437.   var WEB_WORKER = !WINDOW && typeof self === 'object';
  438.   var NODE_JS = !root.JS_SHA256_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
  439.   if (NODE_JS) {
  440.     root = global;
  441.   } else if (WEB_WORKER) {
  442.     root = self;
  443.   }
  444.   var COMMON_JS = !root.JS_SHA256_NO_COMMON_JS && typeof module === 'object' && module.exports;
  445.   var AMD = typeof define === 'function' && define.amd;
  446.   var ARRAY_BUFFER = !root.JS_SHA256_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';
  447.   var HEX_CHARS = '0123456789abcdef'.split('');
  448.   var EXTRA = [-2147483648, 8388608, 32768, 128];
  449.   var SHIFT = [24, 16, 8, 0];
  450.   var K = [
  451.     0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
  452.     0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
  453.     0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
  454.     0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
  455.     0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
  456.     0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
  457.     0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
  458.     0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
  459.   ];
  460.   var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];
  461.   var blocks = [];
  462.   if (root.JS_SHA256_NO_NODE_JS || !Array.isArray) {
  463.     Array.isArray = function (obj) {
  464.       return Object.prototype.toString.call(obj) === '[object Array]';
  465.     };
  466.   }
  467.   if (ARRAY_BUFFER && (root.JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {
  468.     ArrayBuffer.isView = function (obj) {
  469.       return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
  470.     };
  471.   }
  472.   var createOutputMethod = function (outputType, is224) {
  473.     return function (message) {
  474.       return new Sha256(is224, true).update(message)[outputType]();
  475.     };
  476.   };
  477.   var createMethod = function (is224) {
  478.     var method = createOutputMethod('hex', is224);
  479.     if (NODE_JS) {
  480.       method = nodeWrap(method, is224);
  481.     }
  482.     method.create = function () {
  483.       return new Sha256(is224);
  484.     };
  485.     method.update = function (message) {
  486.       return method.create().update(message);
  487.     };
  488.     for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
  489.       var type = OUTPUT_TYPES[i];
  490.       method[type] = createOutputMethod(type, is224);
  491.     }
  492.     return method;
  493.   };
  494.   var nodeWrap = function (method, is224) {
  495.     var crypto = require('crypto')
  496.     var Buffer = require('buffer').Buffer;
  497.     var algorithm = is224 ? 'sha224' : 'sha256';
  498.     var bufferFrom;
  499.     if (Buffer.from && !root.JS_SHA256_NO_BUFFER_FROM) {
  500.       bufferFrom = Buffer.from;
  501.     } else {
  502.       bufferFrom = function (message) {
  503.         return new Buffer(message);
  504.       };
  505.     }
  506.     var nodeMethod = function (message) {
  507.       if (typeof message === 'string') {
  508.         return crypto.createHash(algorithm).update(message, 'utf8').digest('hex');
  509.       } else {
  510.         if (message === null || message === undefined) {
  511.           throw new Error(ERROR);
  512.         } else if (message.constructor === ArrayBuffer) {
  513.           message = new Uint8Array(message);
  514.         }
  515.       }
  516.       if (Array.isArray(message) || ArrayBuffer.isView(message) ||
  517.         message.constructor === Buffer) {
  518.         return crypto.createHash(algorithm).update(bufferFrom(message)).digest('hex');
  519.       } else {
  520.         return method(message);
  521.       }
  522.     };
  523.     return nodeMethod;
  524.   };
  525.   var createHmacOutputMethod = function (outputType, is224) {
  526.     return function (key, message) {
  527.       return new HmacSha256(key, is224, true).update(message)[outputType]();
  528.     };
  529.   };
  530.   var createHmacMethod = function (is224) {
  531.     var method = createHmacOutputMethod('hex', is224);
  532.     method.create = function (key) {
  533.       return new HmacSha256(key, is224);
  534.     };
  535.     method.update = function (key, message) {
  536.       return method.create(key).update(message);
  537.     };
  538.     for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
  539.       var type = OUTPUT_TYPES[i];
  540.       method[type] = createHmacOutputMethod(type, is224);
  541.     }
  542.     return method;
  543.   };
  544.   function Sha256(is224, sharedMemory) {
  545.     if (sharedMemory) {
  546.       blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =
  547.         blocks[4] = blocks[5] = blocks[6] = blocks[7] =
  548.         blocks[8] = blocks[9] = blocks[10] = blocks[11] =
  549.         blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
  550.       this.blocks = blocks;
  551.     } else {
  552.       this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
  553.     }
  554.     if (is224) {
  555.       this.h0 = 0xc1059ed8;
  556.       this.h1 = 0x367cd507;
  557.       this.h2 = 0x3070dd17;
  558.       this.h3 = 0xf70e5939;
  559.       this.h4 = 0xffc00b31;
  560.       this.h5 = 0x68581511;
  561.       this.h6 = 0x64f98fa7;
  562.       this.h7 = 0xbefa4fa4;
  563.     } else { // 256
  564.       this.h0 = 0x6a09e667;
  565.       this.h1 = 0xbb67ae85;
  566.       this.h2 = 0x3c6ef372;
  567.       this.h3 = 0xa54ff53a;
  568.       this.h4 = 0x510e527f;
  569.       this.h5 = 0x9b05688c;
  570.       this.h6 = 0x1f83d9ab;
  571.       this.h7 = 0x5be0cd19;
  572.     }
  573.     this.block = this.start = this.bytes = this.hBytes = 0;
  574.     this.finalized = this.hashed = false;
  575.     this.first = true;
  576.     this.is224 = is224;
  577.   }
  578.   Sha256.prototype.update = function (message) {
  579.     if (this.finalized) {
  580.       return;
  581.     }
  582.     var notString, type = typeof message;
  583.     if (type !== 'string') {
  584.       if (type === 'object') {
  585.         if (message === null) {
  586.           throw new Error(ERROR);
  587.         } else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
  588.           message = new Uint8Array(message);
  589.         } else if (!Array.isArray(message)) {
  590.           if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {
  591.             throw new Error(ERROR);
  592.           }
  593.         }
  594.       } else {
  595.         throw new Error(ERROR);
  596.       }
  597.       notString = true;
  598.     }
  599.     var code, index = 0, i, length = message.length, blocks = this.blocks;
  600.     while (index < length) {
  601.       if (this.hashed) {
  602.         this.hashed = false;
  603.         blocks[0] = this.block;
  604.         this.block = blocks[16] = blocks[1] = blocks[2] = blocks[3] =
  605.           blocks[4] = blocks[5] = blocks[6] = blocks[7] =
  606.           blocks[8] = blocks[9] = blocks[10] = blocks[11] =
  607.           blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
  608.       }
  609.       if (notString) {
  610.         for (i = this.start; index < length && i < 64; ++index) {
  611.           blocks[i >>> 2] |= message[index] << SHIFT[i++ & 3];
  612.         }
  613.       } else {
  614.         for (i = this.start; index < length && i < 64; ++index) {
  615.           code = message.charCodeAt(index);
  616.           if (code < 0x80) {
  617.             blocks[i >>> 2] |= code << SHIFT[i++ & 3];
  618.           } else if (code < 0x800) {
  619.             blocks[i >>> 2] |= (0xc0 | (code >>> 6)) << SHIFT[i++ & 3];
  620.             blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
  621.           } else if (code < 0xd800 || code >= 0xe000) {
  622.             blocks[i >>> 2] |= (0xe0 | (code >>> 12)) << SHIFT[i++ & 3];
  623.             blocks[i >>> 2] |= (0x80 | ((code >>> 6) & 0x3f)) << SHIFT[i++ & 3];
  624.             blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
  625.           } else {
  626.             code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
  627.             blocks[i >>> 2] |= (0xf0 | (code >>> 18)) << SHIFT[i++ & 3];
  628.             blocks[i >>> 2] |= (0x80 | ((code >>> 12) & 0x3f)) << SHIFT[i++ & 3];
  629.             blocks[i >>> 2] |= (0x80 | ((code >>> 6) & 0x3f)) << SHIFT[i++ & 3];
  630.             blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
  631.           }
  632.         }
  633.       }
  634.       this.lastByteIndex = i;
  635.       this.bytes += i - this.start;
  636.       if (i >= 64) {
  637.         this.block = blocks[16];
  638.         this.start = i - 64;
  639.         this.hash();
  640.         this.hashed = true;
  641.       } else {
  642.         this.start = i;
  643.       }
  644.     }
  645.     if (this.bytes > 4294967295) {
  646.       this.hBytes += this.bytes / 4294967296 << 0;
  647.       this.bytes = this.bytes % 4294967296;
  648.     }
  649.     return this;
  650.   };
  651.   Sha256.prototype.finalize = function () {
  652.     if (this.finalized) {
  653.       return;
  654.     }
  655.     this.finalized = true;
  656.     var blocks = this.blocks, i = this.lastByteIndex;
  657.     blocks[16] = this.block;
  658.     blocks[i >>> 2] |= EXTRA[i & 3];
  659.     this.block = blocks[16];
  660.     if (i >= 56) {
  661.       if (!this.hashed) {
  662.         this.hash();
  663.       }
  664.       blocks[0] = this.block;
  665.       blocks[16] = blocks[1] = blocks[2] = blocks[3] =
  666.         blocks[4] = blocks[5] = blocks[6] = blocks[7] =
  667.         blocks[8] = blocks[9] = blocks[10] = blocks[11] =
  668.         blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
  669.     }
  670.     blocks[14] = this.hBytes << 3 | this.bytes >>> 29;
  671.     blocks[15] = this.bytes << 3;
  672.     this.hash();
  673.   };
  674.   Sha256.prototype.hash = function () {
  675.     var a = this.h0, b = this.h1, c = this.h2, d = this.h3, e = this.h4, f = this.h5, g = this.h6,
  676.       h = this.h7, blocks = this.blocks, j, s0, s1, maj, t1, t2, ch, ab, da, cd, bc;
  677.     for (j = 16; j < 64; ++j) {
  678.       // rightrotate
  679.       t1 = blocks[j - 15];
  680.       s0 = ((t1 >>> 7) | (t1 << 25)) ^ ((t1 >>> 18) | (t1 << 14)) ^ (t1 >>> 3);
  681.       t1 = blocks[j - 2];
  682.       s1 = ((t1 >>> 17) | (t1 << 15)) ^ ((t1 >>> 19) | (t1 << 13)) ^ (t1 >>> 10);
  683.       blocks[j] = blocks[j - 16] + s0 + blocks[j - 7] + s1 << 0;
  684.     }
  685.     bc = b & c;
  686.     for (j = 0; j < 64; j += 4) {
  687.       if (this.first) {
  688.         if (this.is224) {
  689.           ab = 300032;
  690.           t1 = blocks[0] - 1413257819;
  691.           h = t1 - 150054599 << 0;
  692.           d = t1 + 24177077 << 0;
  693.         } else {
  694.           ab = 704751109;
  695.           t1 = blocks[0] - 210244248;
  696.           h = t1 - 1521486534 << 0;
  697.           d = t1 + 143694565 << 0;
  698.         }
  699.         this.first = false;
  700.       } else {
  701.         s0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));
  702.         s1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));
  703.         ab = a & b;
  704.         maj = ab ^ (a & c) ^ bc;
  705.         ch = (e & f) ^ (~e & g);
  706.         t1 = h + s1 + ch + K[j] + blocks[j];
  707.         t2 = s0 + maj;
  708.         h = d + t1 << 0;
  709.         d = t1 + t2 << 0;
  710.       }
  711.       s0 = ((d >>> 2) | (d << 30)) ^ ((d >>> 13) | (d << 19)) ^ ((d >>> 22) | (d << 10));
  712.       s1 = ((h >>> 6) | (h << 26)) ^ ((h >>> 11) | (h << 21)) ^ ((h >>> 25) | (h << 7));
  713.       da = d & a;
  714.       maj = da ^ (d & b) ^ ab;
  715.       ch = (h & e) ^ (~h & f);
  716.       t1 = g + s1 + ch + K[j + 1] + blocks[j + 1];
  717.       t2 = s0 + maj;
  718.       g = c + t1 << 0;
  719.       c = t1 + t2 << 0;
  720.       s0 = ((c >>> 2) | (c << 30)) ^ ((c >>> 13) | (c << 19)) ^ ((c >>> 22) | (c << 10));
  721.       s1 = ((g >>> 6) | (g << 26)) ^ ((g >>> 11) | (g << 21)) ^ ((g >>> 25) | (g << 7));
  722.       cd = c & d;
  723.       maj = cd ^ (c & a) ^ da;
  724.       ch = (g & h) ^ (~g & e);
  725.       t1 = f + s1 + ch + K[j + 2] + blocks[j + 2];
  726.       t2 = s0 + maj;
  727.       f = b + t1 << 0;
  728.       b = t1 + t2 << 0;
  729.       s0 = ((b >>> 2) | (b << 30)) ^ ((b >>> 13) | (b << 19)) ^ ((b >>> 22) | (b << 10));
  730.       s1 = ((f >>> 6) | (f << 26)) ^ ((f >>> 11) | (f << 21)) ^ ((f >>> 25) | (f << 7));
  731.       bc = b & c;
  732.       maj = bc ^ (b & d) ^ cd;
  733.       ch = (f & g) ^ (~f & h);
  734.       t1 = e + s1 + ch + K[j + 3] + blocks[j + 3];
  735.       t2 = s0 + maj;
  736.       e = a + t1 << 0;
  737.       a = t1 + t2 << 0;
  738.       this.chromeBugWorkAround = true;
  739.     }
  740.     this.h0 = this.h0 + a << 0;
  741.     this.h1 = this.h1 + b << 0;
  742.     this.h2 = this.h2 + c << 0;
  743.     this.h3 = this.h3 + d << 0;
  744.     this.h4 = this.h4 + e << 0;
  745.     this.h5 = this.h5 + f << 0;
  746.     this.h6 = this.h6 + g << 0;
  747.     this.h7 = this.h7 + h << 0;
  748.   };
  749.   Sha256.prototype.hex = function () {
  750.     this.finalize();
  751.     var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4, h5 = this.h5,
  752.       h6 = this.h6, h7 = this.h7;
  753.     var hex = HEX_CHARS[(h0 >>> 28) & 0x0F] + HEX_CHARS[(h0 >>> 24) & 0x0F] +
  754.       HEX_CHARS[(h0 >>> 20) & 0x0F] + HEX_CHARS[(h0 >>> 16) & 0x0F] +
  755.       HEX_CHARS[(h0 >>> 12) & 0x0F] + HEX_CHARS[(h0 >>> 8) & 0x0F] +
  756.       HEX_CHARS[(h0 >>> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
  757.       HEX_CHARS[(h1 >>> 28) & 0x0F] + HEX_CHARS[(h1 >>> 24) & 0x0F] +
  758.       HEX_CHARS[(h1 >>> 20) & 0x0F] + HEX_CHARS[(h1 >>> 16) & 0x0F] +
  759.       HEX_CHARS[(h1 >>> 12) & 0x0F] + HEX_CHARS[(h1 >>> 8) & 0x0F] +
  760.       HEX_CHARS[(h1 >>> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
  761.       HEX_CHARS[(h2 >>> 28) & 0x0F] + HEX_CHARS[(h2 >>> 24) & 0x0F] +
  762.       HEX_CHARS[(h2 >>> 20) & 0x0F] + HEX_CHARS[(h2 >>> 16) & 0x0F] +
  763.       HEX_CHARS[(h2 >>> 12) & 0x0F] + HEX_CHARS[(h2 >>> 8) & 0x0F] +
  764.       HEX_CHARS[(h2 >>> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
  765.       HEX_CHARS[(h3 >>> 28) & 0x0F] + HEX_CHARS[(h3 >>> 24) & 0x0F] +
  766.       HEX_CHARS[(h3 >>> 20) & 0x0F] + HEX_CHARS[(h3 >>> 16) & 0x0F] +
  767.       HEX_CHARS[(h3 >>> 12) & 0x0F] + HEX_CHARS[(h3 >>> 8) & 0x0F] +
  768.       HEX_CHARS[(h3 >>> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
  769.       HEX_CHARS[(h4 >>> 28) & 0x0F] + HEX_CHARS[(h4 >>> 24) & 0x0F] +
  770.       HEX_CHARS[(h4 >>> 20) & 0x0F] + HEX_CHARS[(h4 >>> 16) & 0x0F] +
  771.       HEX_CHARS[(h4 >>> 12) & 0x0F] + HEX_CHARS[(h4 >>> 8) & 0x0F] +
  772.       HEX_CHARS[(h4 >>> 4) & 0x0F] + HEX_CHARS[h4 & 0x0F] +
  773.       HEX_CHARS[(h5 >>> 28) & 0x0F] + HEX_CHARS[(h5 >>> 24) & 0x0F] +
  774.       HEX_CHARS[(h5 >>> 20) & 0x0F] + HEX_CHARS[(h5 >>> 16) & 0x0F] +
  775.       HEX_CHARS[(h5 >>> 12) & 0x0F] + HEX_CHARS[(h5 >>> 8) & 0x0F] +
  776.       HEX_CHARS[(h5 >>> 4) & 0x0F] + HEX_CHARS[h5 & 0x0F] +
  777.       HEX_CHARS[(h6 >>> 28) & 0x0F] + HEX_CHARS[(h6 >>> 24) & 0x0F] +
  778.       HEX_CHARS[(h6 >>> 20) & 0x0F] + HEX_CHARS[(h6 >>> 16) & 0x0F] +
  779.       HEX_CHARS[(h6 >>> 12) & 0x0F] + HEX_CHARS[(h6 >>> 8) & 0x0F] +
  780.       HEX_CHARS[(h6 >>> 4) & 0x0F] + HEX_CHARS[h6 & 0x0F];
  781.     if (!this.is224) {
  782.       hex += HEX_CHARS[(h7 >>> 28) & 0x0F] + HEX_CHARS[(h7 >>> 24) & 0x0F] +
  783.         HEX_CHARS[(h7 >>> 20) & 0x0F] + HEX_CHARS[(h7 >>> 16) & 0x0F] +
  784.         HEX_CHARS[(h7 >>> 12) & 0x0F] + HEX_CHARS[(h7 >>> 8) & 0x0F] +
  785.         HEX_CHARS[(h7 >>> 4) & 0x0F] + HEX_CHARS[h7 & 0x0F];
  786.     }
  787.     return hex;
  788.   };
  789.   Sha256.prototype.toString = Sha256.prototype.hex;
  790.   Sha256.prototype.digest = function () {
  791.     this.finalize();
  792.     var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4, h5 = this.h5,
  793.       h6 = this.h6, h7 = this.h7;
  794.     var arr = [
  795.       (h0 >>> 24) & 0xFF, (h0 >>> 16) & 0xFF, (h0 >>> 8) & 0xFF, h0 & 0xFF,
  796.       (h1 >>> 24) & 0xFF, (h1 >>> 16) & 0xFF, (h1 >>> 8) & 0xFF, h1 & 0xFF,
  797.       (h2 >>> 24) & 0xFF, (h2 >>> 16) & 0xFF, (h2 >>> 8) & 0xFF, h2 & 0xFF,
  798.       (h3 >>> 24) & 0xFF, (h3 >>> 16) & 0xFF, (h3 >>> 8) & 0xFF, h3 & 0xFF,
  799.       (h4 >>> 24) & 0xFF, (h4 >>> 16) & 0xFF, (h4 >>> 8) & 0xFF, h4 & 0xFF,
  800.       (h5 >>> 24) & 0xFF, (h5 >>> 16) & 0xFF, (h5 >>> 8) & 0xFF, h5 & 0xFF,
  801.       (h6 >>> 24) & 0xFF, (h6 >>> 16) & 0xFF, (h6 >>> 8) & 0xFF, h6 & 0xFF
  802.     ];
  803.     if (!this.is224) {
  804.       arr.push((h7 >>> 24) & 0xFF, (h7 >>> 16) & 0xFF, (h7 >>> 8) & 0xFF, h7 & 0xFF);
  805.     }
  806.     return arr;
  807.   };
  808.   Sha256.prototype.array = Sha256.prototype.digest;
  809.   Sha256.prototype.arrayBuffer = function () {
  810.     this.finalize();
  811.     var buffer = new ArrayBuffer(this.is224 ? 28 : 32);
  812.     var dataView = new DataView(buffer);
  813.     dataView.setUint32(0, this.h0);
  814.     dataView.setUint32(4, this.h1);
  815.     dataView.setUint32(8, this.h2);
  816.     dataView.setUint32(12, this.h3);
  817.     dataView.setUint32(16, this.h4);
  818.     dataView.setUint32(20, this.h5);
  819.     dataView.setUint32(24, this.h6);
  820.     if (!this.is224) {
  821.       dataView.setUint32(28, this.h7);
  822.     }
  823.     return buffer;
  824.   };
  825.   function HmacSha256(key, is224, sharedMemory) {
  826.     var i, type = typeof key;
  827.     if (type === 'string') {
  828.       var bytes = [], length = key.length, index = 0, code;
  829.       for (i = 0; i < length; ++i) {
  830.         code = key.charCodeAt(i);
  831.         if (code < 0x80) {
  832.           bytes[index++] = code;
  833.         } else if (code < 0x800) {
  834.           bytes[index++] = (0xc0 | (code >>> 6));
  835.           bytes[index++] = (0x80 | (code & 0x3f));
  836.         } else if (code < 0xd800 || code >= 0xe000) {
  837.           bytes[index++] = (0xe0 | (code >>> 12));
  838.           bytes[index++] = (0x80 | ((code >>> 6) & 0x3f));
  839.           bytes[index++] = (0x80 | (code & 0x3f));
  840.         } else {
  841.           code = 0x10000 + (((code & 0x3ff) << 10) | (key.charCodeAt(++i) & 0x3ff));
  842.           bytes[index++] = (0xf0 | (code >>> 18));
  843.           bytes[index++] = (0x80 | ((code >>> 12) & 0x3f));
  844.           bytes[index++] = (0x80 | ((code >>> 6) & 0x3f));
  845.           bytes[index++] = (0x80 | (code & 0x3f));
  846.         }
  847.       }
  848.       key = bytes;
  849.     } else {
  850.       if (type === 'object') {
  851.         if (key === null) {
  852.           throw new Error(ERROR);
  853.         } else if (ARRAY_BUFFER && key.constructor === ArrayBuffer) {
  854.           key = new Uint8Array(key);
  855.         } else if (!Array.isArray(key)) {
  856.           if (!ARRAY_BUFFER || !ArrayBuffer.isView(key)) {
  857.             throw new Error(ERROR);
  858.           }
  859.         }
  860.       } else {
  861.         throw new Error(ERROR);
  862.       }
  863.     }
  864.     if (key.length > 64) {
  865.       key = (new Sha256(is224, true)).update(key).array();
  866.     }
  867.     var oKeyPad = [], iKeyPad = [];
  868.     for (i = 0; i < 64; ++i) {
  869.       var b = key[i] || 0;
  870.       oKeyPad[i] = 0x5c ^ b;
  871.       iKeyPad[i] = 0x36 ^ b;
  872.     }
  873.     Sha256.call(this, is224, sharedMemory);
  874.     this.update(iKeyPad);
  875.     this.oKeyPad = oKeyPad;
  876.     this.inner = true;
  877.     this.sharedMemory = sharedMemory;
  878.   }
  879.   HmacSha256.prototype = new Sha256();
  880.   HmacSha256.prototype.finalize = function () {
  881.     Sha256.prototype.finalize.call(this);
  882.     if (this.inner) {
  883.       this.inner = false;
  884.       var innerHash = this.array();
  885.       Sha256.call(this, this.is224, this.sharedMemory);
  886.       this.update(this.oKeyPad);
  887.       this.update(innerHash);
  888.       Sha256.prototype.finalize.call(this);
  889.     }
  890.   };
  891.   var exports = createMethod();
  892.   exports.sha256 = exports;
  893.   exports.sha224 = createMethod(true);
  894.   exports.sha256.hmac = createHmacMethod();
  895.   exports.sha224.hmac = createHmacMethod(true);
  896.   if (COMMON_JS) {
  897.     module.exports = exports;
  898.   } else {
  899.     root.sha256 = exports.sha256;
  900.     root.sha224 = exports.sha224;
  901.     if (AMD) {
  902.       define(function () {
  903.         return exports;
  904.       });
  905.     }
  906.   }
  907. })();
複製代碼


 

 

 

 

 

 

 

 

 

 

 


       请各位多点赞,谢谢!




最新高价定制分享,极品反差女大生04年清纯小姐姐【胡椒仔】露脸私拍,各种COSER裸体骚舞大号道具紫薇脸逼同框 [13P]

 

 

 

 

 

 

 

 

 

 

 

 

 


[ 此貼被Diss在2024-05-11 18:38重新編輯 ]

赞(26)
DMCA / ABUSE REPORT | TOP Posted: 05-11 13:12 樓主 引用 | 發表評論
杺訴


級別:俠客 ( 9 )
發帖:1670
威望:163 點
金錢:2343 USD
貢獻:0 點
註冊:2016-04-13


感谢分享
TOP Posted: 05-11 13:15 #1樓 引用 | 點評
茎深


級別:精靈王 ( 12 )
發帖:5105
威望:591 點
金錢:100357 USD
貢獻:34567 點
註冊:2023-11-21

内容很深奥,不太明白,防水图不错
------------------------
K
TOP Posted: 05-11 13:32 #2樓 引用 | 點評
ooooyaya


級別:聖騎士 ( 11 )
發帖:1272
威望:138 點
金錢:670844 USD
貢獻:24856 點
註冊:2016-06-09

这么详细的技术介绍,只是看不太懂,哈哈
TOP Posted: 05-11 13:32 #3樓 引用 | 點評
错拥相思


級別:聖騎士 ( 11 )
發帖:2195
威望:455 點
金錢:504072 USD
貢獻:10235 點
註冊:2013-07-03

感谢分享
TOP Posted: 05-11 13:36 #4樓 引用 | 點評
斜阳晚照


級別:新手上路 ( 8 )
發帖:805
威望:81 點
金錢:6715 USD
貢獻:0 點
註冊:2022-07-25

感谢分享
TOP Posted: 05-11 13:59 #5樓 引用 | 點評
长黑毛毛


級別:精靈王 ( 12 )
發帖:20427
威望:4639 點
金錢:23969 USD
貢獻:0 點
註冊:2011-06-06

看看防水图
TOP Posted: 05-11 14:22 #6樓 引用 | 點評
蓝色口罩


級別:俠客 ( 9 )
發帖:1308
威望:135 點
金錢:6110 USD
貢獻:0 點
註冊:2023-01-11

太吊了,算你厉害
TOP Posted: 05-11 14:24 #7樓 引用 | 點評
伸茎百战6


級別:俠客 ( 9 )
發帖:843
威望:199 點
金錢:3463 USD
貢獻:0 點
註冊:2022-10-02

勇哥侃侃侃的教程。
TOP Posted: 05-11 14:27 #8樓 引用 | 點評
行走中的衣架


級別:騎士 ( 10 )
發帖:2546
威望:356 點
金錢:1631 USD
貢獻:11 點
註冊:2023-10-03

技术大咖!防水图非常棒!
TOP Posted: 05-11 14:37 #9樓 引用 | 點評
siobhan


級別:新手上路 ( 8 )
發帖:618
威望:62 點
金錢:25421 USD
貢獻:0 點
註冊:2020-02-11

好人一生平安
TOP Posted: 05-11 14:39 #10樓 引用 | 點評
erican


級別:俠客 ( 9 )
發帖:573
威望:58 點
金錢:1275 USD
貢獻:11573 點
註冊:2023-10-24


感谢分享
TOP Posted: 05-11 14:41 #11樓 引用 | 點評
曼殊沙华


級別:光明使者 ( 14 )
發帖:1369
威望:278 點
金錢:666736 USD
貢獻:2398888 點
註冊:2014-08-06

技术贴
------------------------
X
TOP Posted: 05-11 14:43 #12樓 引用 | 點評
qqq0623


級別:精靈王 ( 12 )
發帖:38621
威望:3775 點
金錢:1963430 USD
貢獻:1137 點
註冊:2011-06-06

感谢分享
TOP Posted: 05-11 16:13 #13樓 引用 | 點評
观水


級別:聖騎士 ( 11 )
發帖:340
威望:104 點
金錢:707 USD
貢獻:25000 點
註冊:2022-10-18

不明觉厉
TOP Posted: 05-11 16:51 #14樓 引用 | 點評
大鸟东南飞


級別:俠客 ( 9 )
發帖:2071
威望:208 點
金錢:5933 USD
貢獻:0 點
註冊:2020-02-16

感谢分享
TOP Posted: 05-11 17:44 #15樓 引用 | 點評
草原科多兽


級別:聖騎士 ( 11 )
發帖:6905
威望:707 點
金錢:101249 USD
貢獻:3457 點
註冊:2023-07-31

有时候也搞不懂在小草发这种贴到底是什么心态…
TOP Posted: 05-11 22:00 #16樓 引用 | 點評
盲流子


級別:光明使者 ( 14 )
發帖:30522
威望:14462 點
金錢:12717 USD
貢獻:456789 點
註冊:2023-01-21


看不懂,放弃了
------------------------
D
TOP Posted: 05-11 22:16 #17樓 引用 | 點評
没有不可能


級別:聖騎士 ( 11 )
發帖:7994
威望:876 點
金錢:15612 USD
貢獻:0 點
註冊:2016-11-01

看看防水图
TOP Posted: 05-11 22:19 #18樓 引用 | 點評
zhang礼


級別:俠客 ( 9 )
發帖:2440
威望:240 點
金錢:3208 USD
貢獻:0 點
註冊:2023-10-18

好长的假阳具
TOP Posted: 05-12 15:31 #19樓 引用 | 點評
吾名木板屋


級別:俠客 ( 9 )
發帖:1377
威望:138 點
金錢:2924 USD
貢獻:5064 點
註冊:2012-11-11

感谢分享
TOP Posted: 05-12 22:52 #20樓 引用 | 點評

.:. 草榴社區 -> 技術討論區

快速回帖 頂端
內容
HTML 代碼不可用

使用簽名
Wind Code自動轉換

按 Ctrl+Enter 直接提交