PageSourceSearch

https://yuuza.net/

html yuuza.net collected 2026-10-09 22:08:12 UTC 110,286 bytes, 1,129 lines download raw bytes

1<!DOCTYPE html>
2<html lang="zh">
3<head>
4    <meta charset="utf-8" />
5    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6    <title>Yuuza</title>
7    <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css" />
8    <link rel="stylesheet" href="/css/site.css?v=LcZ8YxuqT1qIA0WwnXVyftKW4ENLXfONF2ahtsnKoXo" />
9    
10<script>
11    let ssrBgData = {ok: true, timeSpent: 1796, data: {"img":"static/Prinz_Eugen_Azur_Lane_(2912x1638)_41b9c3.jpg.opt.jpg","img_src":"https://i.redd.it/6hzlg9e5eb1a1.jpg","original_path":"static/Prinz_Eugen_Azur_Lane_(2912x1638)_41b9c3.jpg","path":"static/Prinz_Eugen_Azur_Lane_(2912x1638)_41b9c3.jpg.opt.jpg","selected":0,"source":"https://www.reddit.com/r/Animewallpaper/comments/z10cp3/prinz_eugen_azur_lane_2912x1638/","thumb_data":"data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wAARCAAkAEADASIAAhEBAxEB/8QAGwAAAgMBAQEAAAAAAAAAAAAAAgUAAwQGBwH/xAAtEAACAQMCBQMEAQUAAAAAAAABAgMABBEFIRITMUFRImFxFDKB0bEVI1KCwf/EABgBAAMBAQAAAAAAAAAAAAAAAAECAwQA/8QAHhEAAwEAAQUBAAAAAAAAAAAAAAECESEDEhMiMUH/2gAMAwEAAhEDEQA/AH+saamp2hjLBZk3jbwfHxXBTRzWlyUcGOWM79sGvVPpIAwBY8Xji60h1pdOuLhrIBWuVByHyMDHUHz0qlVLIdKLnhlmlXct1pEYvHMjtuXDZ2z/ADWzS35c0iy3bzAnKFzt+O/zXFXdpJBIWthJCPtJMgAGO4IO+aGNri9ntsSMpjODIxyM589+wqMp6arrJ+npTSRklGYA46Z7Uomv7aOdoIoeIAbsTsK5iG+1A6hNbMwkZQVx0/29qre8aAMUueckg4HHQ+1PTxeokdNU9vB6krW8yceVtZCPVj7M/wDK6S3SJUIiIbBwTnO9c9pGpjUrY208AlQKRJJxAHAO2BVeg6tAiXVlc3AQK3Ejd8dwfcVzvXn4Kuip1/WJLvU5L8xm7JaRBhZBtj8CjC3M6homxKm6yY9XxmlvMhJTB6+/SttnKIpSOPGBtv1pajt5QVTrhlGrO88pLrwsO3vQ2lwVypD8sDCx46+5NFfTu0gHG5LnBxR2xVoQsynBzlgdzRrRJ9UMYLhL66j+ukjjtgCrcJ9TjsGPileqcku4iYBDJwxhNhw+cVqaOC3i5ayf2wvVhkt8VjhTn8Tlft2G+TQ7W3pVUkuC4XKGNobRSq4K5JxjPXNA5WziXlMslw49TeK+LbumWHfbPtQwIzM/MCgL9uB1oeJ1yHyJcIzmBAT16jvW2O2hRxmMNjyTUqVqpLDNLehNFCplIiGVX/Jv3Q8SxxKUiQH8/upUoMVNhQn6mRVkAwfApxbabAj4UsM/H6qVKZCtvTe2iWpHGWlJxjGRj+Kzf0+3GwU4+alSuQlM/9k=","thumb_path":"static/Prinz_Eugen_Azur_Lane_(2912x1638)_41b9c3.jpg.64.jpg","title":"Prinz Eugen [Azur Lane] (2912x1638)"}
12};
13    function loadHomeBg() {
14        let currentBg = null;
15        if (ssrBgData.ok && !ssrBgData.used) {
16            handleJson(ssrBgData.data);
17            ssrBgData.used = true;
18        } else {
19            fetch("https://yuuza.net/api/wp/random_anime_wallpaper?download&thumb_data")
20            .then(resp => resp.json())
21            .then(json => handleJson(json), err => {
22                console.error("fetch home bg error", err);
23                setBgInfo("[ERROR FETCHING BACKGROUND]");
24            });
25        }
26
27        function handleJson(json) {
28            if (currentBg && currentBg.img === json.img) {
29                console.info("[HomeBG] got the same img, try again.");
30                loadHomeBg();
31                return;
32            }
33            currentBg = json;
34            const thumbData = json.thumb_data;
35            const imgUrl = "https://yuuza.net/api/wp/" + json.img;
36            document.body.style.setProperty("--home-bg-thumb-url", `url("${thumbData}")`);
37            document.body.style.setProperty("--home-bg-url", `url(${JSON.stringify(imgUrl)})`);
38            setBgInfo(json.title, json.source, imgUrl);
39            waitImageLoaded(thumbData).then(img => {
40                console.info(getAverageColor(img));
41            });
42            waitImageLoaded(imgUrl).then(() => {
43                if (currentBg === json) {
44                    document.querySelector('.home-bg-full').classList.add("loaded");
45                }
46            });
47        }
48
49        function setBgInfo(title, link, fileLink) {
50            const domTitle = document.querySelector("#home-bg-info-title");
51            domTitle.textContent = title;
52            domTitle.href = link || '';
53            document.querySelector(".home-bg-info").hidden = false;
54            const domFileLink = document.querySelector("#home-bg-info-file");
55            if (domFileLink) domFileLink.href = fileLink || "";
56        }
57
58        function waitImageLoaded(src) {
59            return new Promise(res => {
60                const img = new Image();
61                img.onload = () => res(img);
62                img.src = src;
63            });
64        }
65
66        function getAverageColor(img) {
67            const canvas = document.createElement('canvas');
68            canvas.height = img.height;
69            canvas.width = img.width;
70            const ctx = canvas.getContext('2d');
71            ctx.drawImage(img, 0, 0);
72            const data = ctx.getImageData(0, 0, canvas.width, canvas.height).data;
73            let r = 0, g = 0, b = 0;
74            for (let i = 0; i < data.length; i += 4) {
75                r += data[i];
76                g += data[i + 1];
77                b += data[i + 2];
78            }
79            const pixelCount = data.length / 4;
80            r = Math.floor(r / pixelCount);
81            g = Math.floor(g / pixelCount);
82            b = Math.floor(b / pixelCount);
83            return { r, g, b };
84        }
85    }
86    function reloadHomeBg() {
87        document.querySelector(".home-bg-info").hidden = true;
88        document.querySelector('.home-bg-full').classList.remove("loaded");
89        loadHomeBg();
90    }
91
92    const initHomeIntro = (() => {
93        loadHomeBg();
94
95        const sidebarInfo = document.querySelector('.sidebar-info');
96        const sidebar = document.querySelector('.sidebar');
97
98        const feedHref = document.getElementById('feed-blog-link').href;
99
100        let introShown = 1;
101
102        const getIntroHeight = () => window.innerHeight - 70;
103        let introHeight = getIntroHeight();
104
105        const update = () => {
106            introHeight = getIntroHeight();
107            introShown = (introHeight - window.scrollY) / introHeight;
108            introShown = Math.min(1, Math.max(0, introShown));
109            
110            const infoXOffset = window.innerWidth / 2
111                - (sidebar.offsetLeft + parseFloat(getComputedStyle(sidebar).paddingLeft))
112                - parseFloat(getComputedStyle(sidebarInfo).paddingLeft);
113
114            if (introShown > 0) {
115                document.querySelector('.sidebar-sticky').scrollTop = 0;
116            }
117            document.body.classList.toggle('homeintro', introShown !== 0)
118            document.body.classList.toggle('homeintro-fully', introShown === 1)
119            document.body.classList.toggle('homeintro-mostly', introShown >= 0.9)
120            document.body.classList.toggle('homeintro-not-barely', introShown >= 0.1)
121            document.body.style.setProperty('--homeintro', introShown);
122            document.body.style.setProperty('--info-x-offset', infoXOffset + 'px');
123
124            const isFeedNotBlog = introShown >= 0.1;
125            document.getElementById('feed-blog-link').href = isFeedNotBlog ? 'javascript:showBlog()' : feedHref;
126            document.getElementById('feed-blog-text').textContent = isFeedNotBlog ? "Blog" : "Feed";
127        }
128
129        window.showBlog = () => animateScrollIntro(1);
130
131        //document.addEventListener('DOMContentLoaded', () => {
132        //    update();
133        //});
134        window.addEventListener('scroll', () => {
135            update();
136        }, {passive: false});
137        window.addEventListener('wheel', (ev) => {
138            // ev.preventDefault();
139            if (Math.abs(ev.deltaY) > 10) {
140                delayScrollIntro(ev.deltaY);
141            }
142        }, {passive: false})
143        window.addEventListener('resize', () => {
144            update();
145            delayScrollIntro(0);
146        });
147
148        let snapDelayTimer = null;
149        let snapRaf = null;
150
151        const delayScrollIntro = (inputDeltaY) => {
152            if (snapDelayTimer != null) clearTimeout(snapDelayTimer);
153            cancelAnimate();
154            snapDelayTimer = setTimeout(() => {
155                if (introShown === 1 || introShown === 0) return;
156                const targetThreshold = (0.5 - Math.sign(inputDeltaY) * 0.2) * introHeight;
157                const show = window.scrollY > targetThreshold;
158                animateScrollIntro(show);
159            }, 100);
160        }
161
162        function cancelAnimate() {
163            if (snapRaf != null) cancelAnimationFrame(snapRaf);
164        }
165
166        const animateScrollIntro = (showBlog) => {
167            const targetY = showBlog ? introHeight + 1 : 0;
168            let lastTime = Date.now();
169            function animate() {
170                const time = Date.now();
171                const deltaTime = time - lastTime;
172                lastTime = time;
173                if (Math.abs(targetY - window.scrollY) < 2) {
174                    window.scrollTo(0, targetY);
175                    return;
176                }
177                let deltaY = (targetY - window.scrollY) * (deltaTime * 0.010);
178                deltaY = Math.max(2, Math.abs(deltaY)) * Math.sign(deltaY);
179                window.scrollTo(0, window.scrollY + deltaY);
180                snapRaf = requestAnimationFrame(animate);
181            }
182            snapRaf = requestAnimationFrame(animate);
183        }
184
185        const urlParams = new URLSearchParams(window.location.search);
186        if (urlParams.get("before") || urlParams.get("after")) {
187            window.scrollTo(0, introHeight);
188        }
189
190        const setParallaxOffset = (x, y) => {
191            //document.querySelector('.home-bg').style.transform = `translate(${x}%, ${y}%) scale(1.02)`;
192            document.body.style.setProperty('--parallax-offset-x', x);
193            document.body.style.setProperty('--parallax-offset-y', y);
194        }
195
196        document.addEventListener('mousemove', (ev) => {
197            if (introShown > 0.5) {
198                const windowX = ev.pageX - window.scrollX;
199                const windowY = ev.pageY - window.scrollY;
200                const x = 1 - (windowX / window.innerWidth * 2);
201                const y = 1 - (windowY / window.innerHeight * 2);
202                setParallaxOffset(x, y);
203            }
204        });
205
206        sidebarInfo.classList.add('no-transition-within');
207        update();
208        sidebarInfo.offsetTop;
209        sidebarInfo.classList.remove('no-transition-within');
210        delayScrollIntro(0);
211    });
212</script>
212
213<style>
214    :root {
215        scroll-behavior: auto !important;
216    }
217
218    body {
219        overflow-x: hidden;
220        --homeintro: 1;
221        --info-x-offset: -50vw;
222        --intro-scaleup: 0.5;
223        --home-bg-url: none;
224        --home-bg-thumb-url: none;
225        --parallax-offset-x: 0;
226        --parallax-offset-y: 0;
227    }
228
229    .home-bg {
230        position: fixed;
231        left: 0;
232        top: 0;
233        right: 0;
234        bottom: 0;
235        padding: 0;
236        z-index: -1;
237        opacity: calc(.4 + (var(--homeintro) * .3));
238        transform: translate(calc(1% * var(--parallax-offset-x)), calc(1% * var(--parallax-offset-y)))
239                    scale(1.02);
240        transition: transform .3s linear;
241    }
242
243    .home-intro-box {
244        position: absolute;
245        left: 0;
246        top: 0;
247        width: 100%;
248        height: 100vh;
249    }
250
251    .inner-relative {
252        position: relative;
253        width: 100%;
254        height: 100%;
255    }
256
257    .home-bg-full,
258    .home-bg-thumb {
259        position: absolute;
260        width: 100%;
261        height: 100%;
262        background-color: transparent;
263        background: var(--home-bg-url) center/cover;
264    }
265
266    .home-bg-thumb {
267        background: var(--home-bg-thumb-url) center/cover;
268        filter: blur(1vmax);
269    }
270
271    .home-bg-full {
272        opacity: 0;
273        transition: opacity .5s;
274    }
275
276    .home-bg-full.loaded {
277        opacity: 1;
278    }
279
280    .home-bg-info {
281        position: absolute;
282        left: 10px;
283        bottom: 10px;
284        opacity: 0;
285    }
286
287    .home-bg-info a {
288        opacity: 0.5;
289        color: black;
290    }
291
292    .main-container {
293        margin-top: 100vh;
294        min-height: calc(100vh - 70px);
295    }
296
297    body>header {
298        position: fixed;
299        top: 0;
300        left: 0;
301        right: 0;
302        z-index: 1;
303        /* transform: translate(0, calc(var(--homeintro) * -100%)); */
304    }
305
306    body>header .navbar {
307        border-bottom: none !important;
308        --bs-bg-opacity: calc(1 - var(--homeintro) * 0.5);
309    }
310
311    .homeintro .navbar {
312        backdrop-filter: blur(5px);
313    }
314
315    #goto-path {
316        background: none;
317    }
318
319    .sidebar-info {
320        transform: translate(
321                        calc(var(--homeintro) * (var(--info-x-offset) - 50% + .7vw * var(--parallax-offset-x) )),
322                        calc(var(--homeintro) * (-50vh - 50% - 0px + .7vh * var(--parallax-offset-y) ))
323                    ) scale(calc(var(--homeintro) * var(--intro-scaleup) + 1));
324        transition: background .3s, box-shadow .3s;
325    }
326
327    .homeintro-fully .sidebar-info {
328        transition: background .3s, box-shadow .3s, transform .3s linear;
329    }
330
331    .sidebar-info-content {
332        text-shadow: 0 0 30px rgba(255, 255, 255, var(--homeintro));
333        transition: all .3s;
334    }
335
336    .sidebar-info h3,
337    .sidebar-links,
338    .sidebar-extra,
339    .sidebar-info .avatar {
340        transition: opacity .3s;
341    }
342
343
344    .homeintro-not-barely .sidebar-info h3 {
345        opacity: 0;
346    }
347
348    .homeintro-not-barely .sidebar-info {
349        background: none;
350        box-shadow: none;
351    }
352
353    .homeintro-not-barely .sidebar-info .avatar {
354        opacity: 0;
355    }
356
357    .homeintro-not-barely .sidebar-links,
358    .homeintro-not-barely .sidebar-extra {
359        opacity: 0;
360    }
361
362    .home-bg-info {
363        transition: opacity .1s;
364        left: 0;
365        bottom: 0;
366        padding: 8px;
367        border-radius: 0 16px 0 0;
368        background-color: rgba(var(--bs-white-rgb), 0.5) !important;
369        backdrop-filter: blur(5px);
370    }
371
372    .homeintro-fully .home-bg-info {
373        opacity: 1;
374    }
375
376    .homeintro .sidebar-sticky {
377        overflow: visible;
378    }
379
380    .no-transition-within,
381    .no-transition-within * {
382        transition: none !important;
383    }
384
385
386    @media (min-width: 768px) {
387
388        .sidebar-sticky {
389            position: sticky;
390            top: 60px;
391            max-height: calc(100vh - 60px);
392            overflow-y: auto;
393            padding: 10px 16px;
394            margin: -10px -16px 0;
395            scrollbar-width: none;
396        }
397
398        .sidebar-sticky::-webkit-scrollbar {
399            display: none;
400        }
401
402
403
404        .homeintro-not-barely .sidebar-info:hover {
405            background: rgba(255, 255, 255, .7);
406        }
407
408        .homeintro .sidebar-info-avatar {
409            pointer-events: none;
410        }
411
412        .homeintro-not-barely .sidebar-info-content {
413            margin-top: -110px;
414        }
415    }
416
417    .sidebar-block {
418        position: relative;
419    }
420
421    .sidebar-block p {
422        margin: 10px 0;
423    }
424
425    .sidebar-block h3 {
426        position: absolute;
427        right: .5rem;
428        top: .5rem;
429        opacity: .3;
430        font-size: 120%;
431        line-height: 1;
432        margin: 0;
433        pointer-events: none;
434    }
435
436    .avatar {
437        display: block;
438        margin: 10px auto;
439        width: 100px;
440        height: 100px;
441        border-radius: 50%;
442    }
443
444    .sidebar-info .name {
445        font-size: 20px;
446        font-weight: 600;
447        margin-bottom: 10px;
448        text-align: center;
449    }
450
451    .sidebar-info .links {
452        font-size: 18px;
453        text-align: center;
454        margin: 10px 0;
455    }
456
457    .sidebar-info .links > a {
458        color: black;
459        margin: 0 10px;
460        display: inline-block;
461        line-height: 1.2;
462    }
463
464    .friend-note {
465        font-size: 80%;
466        opacity: .5;
467    }
468
469    .friend-note::before {
470        content: " - ";
471    }
472
473    .read-more {
474        text-align: right;
475    }
476
477    @media (max-width: 767px) {
478        body {
479            --intro-scaleup: 0;
480        }
481
482        .homeintro .sidebar-links {
483            opacity: 1;
484        }
485
486        .homeintro-not-barely .sidebar-info-avatar {
487            display: none;
488        }
489
490        .sidebar-links p {
491            display: inline-block;
492            margin: 5px 10px 5px 0;
493        }
494
495        .sidebar-links h3 {
496            display: block;
497            float: right;
498            position: static;
499        }
500
501        .sidebar-info {
502            display: flex;
503            justify-content: space-evenly;
504            align-items: center;
505        }
506
507        .sidebar-cert {
508            display: none;
509        }
510    }
511</style>
512
513
514    <!-- Global site tag (gtag.js) - Google Analytics -->
vendor: 69 bytes, lines 514-515
514
515    <script async src="https://www.googletagmanager.com/gtag/js?id=
515G-WZ1PLLGEH9
vendor: 17 bytes, lines 515-516
515"></script>
516    
516<script>
517        
vendor: 156 bytes, lines 517-521
517window.dataLayer = window.dataLayer || [];
518        function gtag(){dataLayer.push(arguments);}
519        gtag('js', new Date());
520
521        gtag('config', '
521G-WZ1PLLGEH9
vendor: 9 bytes, lines 521-522
521');
522    
522</script>
522
523    
523<script src="/js/vendor.js?v=NyePYMraPLoqR6YHyQH1lOLc-2ha_mb01n-JTA1GVhE"></script>
523
524</head>
525<body class="bggray">
526    <header>
527        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
528            <div class="container-xl">
529                <a class="navbar-brand" href="/">Yuuza</a>
530                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
531                        aria-expanded="false" aria-label="Toggle navigation">
532                    <span class="navbar-toggler-icon"></span>
533                </button>
534                <div class="collapse navbar-collapse">
535                    <ul class="navbar-nav flex-grow-1">
536                        <li class="nav-item">
537                            <a class="nav-link text-dark" href="/">Home</a>
538                        </li>
539                        <li class="nav-item">
540                            <a class="nav-link text-dark" href="/Posts">Posts</a>
541                        </li>
542                        <li class="nav-item">
543                            <a class="nav-link text-dark" href="/about">About</a>
544                        </li>
545                    </ul>
546                    <ul class="navbar-nav ml-auto">
547                            <li class="nav-item">
548                                <a class="nav-link text-dark" href="/Admin/Login?ReturnUrl=/">
549                                    Login
550                                </a>
551                            </li>
552                    </ul>
553                    <form class="navbar-nav form-inline d-sm-inline-flex mx-md-2" id="goto-form">
554                        <input class="form-control mr-sm-2" type="search" placeholder="Secret" id="goto-path" aria-label="Search">
555                    </form>
556                </div>
557            </div>
558        </nav>
559    </header>
560
561        <main role="main" class="main-container container-xl pb-3">
562            
563
564<div class="row">
565    <div class="home-post-preview col-12 col-md-9 order-1">
566            <article class="post-preview mycard">
567                <header>
568                    <h1 class="title"><a href="/Posts/less-chromium-better-world">&#x5982;&#x679C;&#x60A8;&#x5728;&#x4F7F;&#x7528;&#x89E6;&#x6478;&#x677F;/&#x624B;&#x673A;</a></h1>
569                </header>
570                <section class="content"><!-- md -->
571<p>那么首页的 intro &lt;-&gt; blog 过渡动画大概是坏掉的。</p>
572<p>预计修复时间:下次一定</p>
573</section>
574                    <div class="post-preview-footer">
575                        <div class="date-tags">
576                            <time class="date">2024-03-31</time>
577                            <span class="tags">
578                                    <a href="/Posts?tag=Notice"><span class="tag">Notice</span></a>
579                                    <a href="/Posts?tag=no-chromium"><span class="tag">no-chromium</span></a>
580                            </span>
581                        </div>
582                    </div>
583            </article>
584            <article class="post-preview mycard">
585                <header>
586                    <h1 class="title"><a href="/Posts/missing-http-request-headers-in-deno-compat-mode">Deno &#x7684; Node &#x517C;&#x5BB9;&#x8E29;&#x5751;</a></h1>
587                </header>
588                <section class="content"><!-- md -->
589<blockquote>
590<p>TL;DR: Node 兼容层的 <code>http.request()</code> 曾经不支持 <code>headers</code>,被我水了个 PR</p>
591</blockquote>
592<h2 id="import-from-npm">试用 import from <code>npm:</code></h2>
593<p>用 Deno 写飞书机器人的时候,随手试了一下通过 <code>npm:</code> 调用飞书的 Node.js SDK。</p>
594<p>看上去真的能用:</p>
595<p><img src="https://md.yuuza.net/uploads/5d837f1c-2160-43b9-8d26-1fa5f6afb05b.png" alt="" /></p>
596<p>(直呼好用,连 TypeScript 类型定义都有了~)</p>
597</section>
598                    <div class="post-preview-footer">
599                        <div class="date-tags">
600                            <time class="date">2022-11-17</time>
601                            <span class="tags">
602                                    <a href="/Posts?tag=Deno"><span class="tag">Deno</span></a>
603                                    <a href="/Posts?tag=lark"><span class="tag">lark</span></a>
604                                    <a href="/Posts?tag=feishu"><span class="tag">feishu</span></a>
605                                    <a href="/Posts?tag=bot"><span class="tag">bot</span></a>
606                                    <a href="/Posts?tag=Node.js"><span class="tag">Node.js</span></a>
607                            </span>
608                        </div>
609                            <a class="read-more" href="/Posts/missing-http-request-headers-in-deno-compat-mode">Full post &gt;</a>
610                    </div>
611            </article>
612            <article class="post-preview mycard">
613                <header>
614                    <h1 class="title"><a href="/Posts/lark-bot-msg-from-shell">&#x4ECE; shell &#x53D1;&#x9001;&#x98DE;&#x4E66;&#xFF08;Lark&#xFF09;&#x673A;&#x5668;&#x4EBA;&#x6D88;&#x606F;</a></h1>
615                </header>
616                <section class="content"><style>
617.gist{/*!
618 * GitHub Light v0.4.1
619 * Copyright (c) 2012 - 2017 GitHub, Inc.
620 * Licensed under MIT (https://github.com/primer/github-syntax-theme-generator/blob/master/LICENSE)
621 */font-size:16px;color:#333;text-align:left;direction:ltr}.gist{--color-canvas-default-transparent: rgba(255,255,255,0);--color-page-header-bg: #f6f8fa;--color-marketing-icon-primary: #218bff;--color-marketing-icon-secondary: #54aeff;--color-diff-blob-addition-num-text: #24292f;--color-diff-blob-addition-fg: #24292f;--color-diff-blob-addition-num-bg: #ccffd8;--color-diff-blob-addition-line-bg: #e6ffec;--color-diff-blob-addition-word-bg: #abf2bc;--color-diff-blob-deletion-num-text: #24292f;--color-diff-blob-deletion-fg: #24292f;--color-diff-blob-deletion-num-bg: #ffd7d5;--color-diff-blob-deletion-line-bg: #ffebe9;--color-diff-blob-deletion-word-bg: rgba(255,129,130,0.4);--color-diff-blob-hunk-num-bg: rgba(84,174,255,0.4);--color-diff-blob-expander-icon: #57606a;--color-diff-blob-selected-line-highlight-mix-blend-mode: multiply;--color-diffstat-deletion-border: rgba(27,31,36,0.15);--color-diffstat-addition-border: rgba(27,31,36,0.15);--color-diffstat-addition-bg: #2da44e;--color-search-keyword-hl: #fff8c5;--color-prettylights-syntax-comment: #6e7781;--color-prettylights-syntax-constant: #0550ae;--color-prettylights-syntax-entity: #8250df;--color-prettylights-syntax-storage-modifier-import: #24292f;--color-prettylights-syntax-entity-tag: #116329;--color-prettylights-syntax-keyword: #cf222e;--color-prettylights-syntax-string: #0a3069;--color-prettylights-syntax-variable: #953800;--color-prettylights-syntax-brackethighlighter-unmatched: #82071e;--color-prettylights-syntax-invalid-illegal-text: #f6f8fa;--color-prettylights-syntax-invalid-illegal-bg: #82071e;--color-prettylights-syntax-carriage-return-text: #f6f8fa;--color-prettylights-syntax-carriage-return-bg: #cf222e;--color-prettylights-syntax-string-regexp: #116329;--color-prettylights-syntax-markup-list: #3b2300;--color-prettylights-syntax-markup-heading: #0550ae;--color-prettylights-syntax-markup-italic: #24292f;--color-prettylights-syntax-markup-bold: #24292f;--color-prettylights-syntax-markup-deleted-text: #82071e;--color-prettylights-syntax-markup-deleted-bg: #ffebe9;--color-prettylights-syntax-markup-inserted-text: #116329;--color-prettylights-syntax-markup-inserted-bg: #dafbe1;--color-prettylights-syntax-markup-changed-text: #953800;--color-prettylights-syntax-markup-changed-bg: #ffd8b5;--color-prettylights-syntax-markup-ignored-text: #eaeef2;--color-prettylights-syntax-markup-ignored-bg: #0550ae;--color-prettylights-syntax-meta-diff-range: #8250df;--color-prettylights-syntax-brackethighlighter-angle: #57606a;--color-prettylights-syntax-sublimelinter-gutter-mark: #8c959f;--color-prettylights-syntax-constant-other-reference-link: #0a3069;--color-codemirror-text: #24292f;--color-codemirror-bg: #ffffff;--color-codemirror-gutters-bg: #ffffff;--color-codemirror-guttermarker-text: #ffffff;--color-codemirror-guttermarker-subtle-text: #6e7781;--color-codemirror-linenumber-text: #57606a;--color-codemirror-cursor: #24292f;--color-codemirror-selection-bg: rgba(84,174,255,0.4);--color-codemirror-activeline-bg: rgba(234,238,242,0.5);--color-codemirror-matchingbracket-text: #24292f;--color-codemirror-lines-bg: #ffffff;--color-codemirror-syntax-comment: #24292f;--color-codemirror-syntax-constant: #0550ae;--color-codemirror-syntax-entity: #8250df;--color-codemirror-syntax-keyword: #cf222e;--color-codemirror-syntax-storage: #cf222e;--color-codemirror-syntax-string: #0a3069;--color-codemirror-syntax-support: #0550ae;--color-codemirror-syntax-variable: #953800;--color-checks-bg: #24292f;--color-checks-run-border-width: 0px;--color-checks-container-border-width: 0px;--color-checks-text-primary: #f6f8fa;--color-checks-text-secondary: #8c959f;--color-checks-text-link: #54aeff;--color-checks-btn-icon: #afb8c1;--color-checks-btn-hover-icon: #f6f8fa;--color-checks-btn-hover-bg: rgba(255,255,255,0.125);--color-checks-input-text: #eaeef2;--color-checks-input-placeholder-text: #8c959f;--color-checks-input-focus-text: #8c959f;--color-checks-input-bg: #32383f;--color-checks-input-shadow: none;--color-checks-donut-error: #fa4549;--color-checks-donut-pending: #bf8700;--color-checks-donut-success: #2da44e;--color-checks-donut-neutral: #afb8c1;--color-checks-dropdown-text: #afb8c1;--color-checks-dropdown-bg: #32383f;--color-checks-dropdown-border: #424a53;--color-checks-dropdown-shadow: rgba(27,31,36,0.3);--color-checks-dropdown-hover-text: #f6f8fa;--color-checks-dropdown-hover-bg: #424a53;--color-checks-dropdown-btn-hover-text: #f6f8fa;--color-checks-dropdown-btn-hover-bg: #32383f;--color-checks-scrollbar-thumb-bg: #57606a;--color-checks-header-label-text: #d0d7de;--color-checks-header-label-open-text: #f6f8fa;--color-checks-header-border: #32383f;--color-checks-header-icon: #8c959f;--color-checks-line-text: #d0d7de;--color-checks-line-num-text: rgba(140,149,159,0.75);--color-checks-line-timestamp-text: #8c959f;--color-checks-line-hover-bg: #32383f;--color-checks-line-selected-bg: rgba(33,139,255,0.15);--color-checks-line-selected-num-text: #54aeff;--color-checks-line-dt-fm-text: #24292f;--color-checks-line-dt-fm-bg: #9a6700;--color-checks-gate-bg: rgba(125,78,0,0.15);--color-checks-gate-text: #d0d7de;--color-checks-gate-waiting-text: #d4a72c;--color-checks-step-header-open-bg: #32383f;--color-checks-step-error-text: #ff8182;--color-checks-step-warning-text: #d4a72c;--color-checks-logline-text: #8c959f;--color-checks-logline-num-text: rgba(140,149,159,0.75);--color-checks-logline-debug-text: #c297ff;--color-checks-logline-error-text: #d0d7de;--color-checks-logline-error-num-text: #ff8182;--color-checks-logline-error-bg: rgba(164,14,38,0.15);--color-checks-logline-warning-text: #d0d7de;--color-checks-logline-warning-num-text: #d4a72c;--color-checks-logline-warning-bg: rgba(125,78,0,0.15);--color-checks-logline-command-text: #54aeff;--color-checks-logline-section-text: #4ac26b;--color-checks-ansi-black: #24292f;--color-checks-ansi-black-bright: #32383f;--color-checks-ansi-white: #d0d7de;--color-checks-ansi-white-bright: #d0d7de;--color-checks-ansi-gray: #8c959f;--color-checks-ansi-red: #ff8182;--color-checks-ansi-red-bright: #ffaba8;--color-checks-ansi-green: #4ac26b;--color-checks-ansi-green-bright: #6fdd8b;--color-checks-ansi-yellow: #d4a72c;--color-checks-ansi-yellow-bright: #eac54f;--color-checks-ansi-blue: #54aeff;--color-checks-ansi-blue-bright: #80ccff;--color-checks-ansi-magenta: #c297ff;--color-checks-ansi-magenta-bright: #d8b9ff;--color-checks-ansi-cyan: #76e3ea;--color-checks-ansi-cyan-bright: #b3f0ff;--color-project-header-bg: #24292f;--color-project-sidebar-bg: #ffffff;--color-project-gradient-in: #ffffff;--color-project-gradient-out: rgba(255,255,255,0);--color-mktg-btn-bg: #1b1f23;--color-mktg-btn-shadow-outline: rgb(0 0 0 / 15%) 0 0 0 1px inset;--color-mktg-btn-shadow-focus: rgb(0 0 0 / 15%) 0 0 0 4px;--color-mktg-btn-shadow-hover: 0 3px 2px rgba(0, 0, 0, 0.07), 0 7px 5px rgba(0, 0, 0, 0.04), 0 12px 10px rgba(0, 0, 0, 0.03), 0 22px 18px rgba(0, 0, 0, 0.03), 0 42px 33px rgba(0, 0, 0, 0.02), 0 100px 80px rgba(0, 0, 0, 0.02);--color-mktg-btn-shadow-hover-muted: rgb(0 0 0 / 70%) 0 0 0 2px inset;--color-avatar-bg: #ffffff;--color-avatar-border: rgba(27,31,36,0.15);--color-avatar-stack-fade: #afb8c1;--color-avatar-stack-fade-more: #d0d7de;--color-avatar-child-shadow: -2px -2px 0 rgba(255,255,255,0.8);--color-topic-tag-border: rgba(0,0,0,0);--color-counter-border: rgba(0,0,0,0);--color-select-menu-backdrop-border: rgba(0,0,0,0);--color-select-menu-tap-highlight: rgba(175,184,193,0.5);--color-select-menu-tap-focus-bg: #b6e3ff;--color-overlay-shadow: 0 1px 3px rgba(27,31,36,0.12), 0 8px 24px rgba(66,74,83,0.12);--color-header-text: rgba(255,255,255,0.7);--color-header-bg: #24292f;--color-header-divider: #57606a;--color-header-logo: #ffffff;--color-header-search-bg: #24292f;--color-header-search-border: #57606a;--color-sidenav-selected-bg: #ffffff;--color-menu-bg-active: rgba(0,0,0,0);--color-input-disabled-bg: rgba(175,184,193,0.2);--color-timeline-badge-bg: #eaeef2;--color-ansi-black: #24292f;--color-ansi-black-bright: #57606a;--color-ansi-white: #6e7781;--color-ansi-white-bright: #8c959f;--color-ansi-gray: #6e7781;--color-ansi-red: #cf222e;--color-ansi-red-bright: #a40e26;--color-ansi-green: #116329;--color-ansi-green-bright: #1a7f37;--color-ansi-yellow: #4d2d00;--color-ansi-yellow-bright: #633c01;--color-ansi-blue: #0969da;--color-ansi-blue-bright: #218bff;--color-ansi-magenta: #8250df;--color-ansi-magenta-bright: #a475f9;--color-ansi-cyan: #1b7c83;--color-ansi-cyan-bright: #3192aa;--color-btn-text: #24292f;--color-btn-bg: #f6f8fa;--color-btn-border: rgba(27,31,36,0.15);--color-btn-shadow: 0 1px 0 rgba(27,31,36,0.04);--color-btn-inset-shadow: inset 0 1px 0 rgba(255,255,255,0.25);--color-btn-hover-bg: #f3f4f6;--color-btn-hover-border: rgba(27,31,36,0.15);--color-btn-active-bg: hsla(220,14%,93%,1);--color-btn-active-border: rgba(27,31,36,0.15);--color-btn-selected-bg: hsla(220,14%,94%,1);--color-btn-focus-bg: #f6f8fa;--color-btn-focus-border: rgba(27,31,36,0.15);--color-btn-focus-shadow: 0 0 0 3px rgba(9,105,218,0.3);--color-btn-shadow-active: inset 0 0.15em 0.3em rgba(27,31,36,0.15);--color-btn-shadow-input-focus: 0 0 0 0.2em rgba(9,105,218,0.3);--color-btn-counter-bg: rgba(27,31,36,0.08);--color-btn-primary-text: #ffffff;--color-btn-primary-bg: #2da44e;--color-btn-primary-border: rgba(27,31,36,0.15);--color-btn-primary-shadow: 0 1px 0 rgba(27,31,36,0.1);--color-btn-primary-inset-shadow: inset 0 1px 0 rgba(255,255,255,0.03);--color-btn-primary-hover-bg: #2c974b;--color-btn-primary-hover-border: rgba(27,31,36,0.15);--color-btn-primary-selected-bg: hsla(137,55%,36%,1);--color-btn-primary-selected-shadow: inset 0 1px 0 rgba(0,45,17,0.2);--color-btn-primary-disabled-text: rgba(255,255,255,0.8);--color-btn-primary-disabled-bg: #94d3a2;--color-btn-primary-disabled-border: rgba(27,31,36,0.15);--color-btn-primary-focus-bg: #2da44e;--color-btn-primary-focus-border: rgba(27,31,36,0.15);--color-btn-primary-focus-shadow: 0 0 0 3px rgba(45,164,78,0.4);--color-btn-primary-icon: rgba(255,255,255,0.8);--color-btn-primary-counter-bg: rgba(255,255,255,0.2);--color-btn-outline-text: #0969da;--color-btn-outline-hover-text: #ffffff;--color-btn-outline-hover-bg: #0969da;--color-btn-outline-hover-border: rgba(27,31,36,0.15);--color-btn-outline-hover-shadow: 0 1px 0 rgba(27,31,36,0.1);--color-btn-outline-hover-inset-shadow: inset 0 1px 0 rgba(255,255,255,0.03);--color-btn-outline-hover-counter-bg: rgba(255,255,255,0.2);--color-btn-outline-selected-text: #ffffff;--color-btn-outline-selected-bg: hsla(212,92%,42%,1);--color-btn-outline-selected-border: rgba(27,31,36,0.15);--color-btn-outline-selected-shadow: inset 0 1px 0 rgba(0,33,85,0.2);--color-btn-outline-disabled-text: rgba(9,105,218,0.5);--color-btn-outline-disabled-bg: #f6f8fa;--color-btn-outline-disabled-counter-bg: rgba(9,105,218,0.05);--color-btn-outline-focus-border: rgba(27,31,36,0.15);--color-btn-outline-focus-shadow: 0 0 0 3px rgba(5,80,174,0.4);--color-btn-outline-counter-bg: rgba(9,105,218,0.1);--color-btn-danger-text: #cf222e;--color-btn-danger-hover-text: #ffffff;--color-btn-danger-hover-bg: #a40e26;--color-btn-danger-hover-border: rgba(27,31,36,0.15);--color-btn-danger-hover-shadow: 0 1px 0 rgba(27,31,36,0.1);--color-btn-danger-hover-inset-shadow: inset 0 1px 0 rgba(255,255,255,0.03);--color-btn-danger-hover-counter-bg: rgba(255,255,255,0.2);--color-btn-danger-selected-text: #ffffff;--color-btn-danger-selected-bg: hsla(356,72%,44%,1);--color-btn-danger-selected-border: rgba(27,31,36,0.15);--color-btn-danger-selected-shadow: inset 0 1px 0 rgba(76,0,20,0.2);--color-btn-danger-disabled-text: rgba(207,34,46,0.5);--color-btn-danger-disabled-bg: #f6f8fa;--color-btn-danger-disabled-counter-bg: rgba(207,34,46,0.05);--color-btn-danger-focus-border: rgba(27,31,36,0.15);--color-btn-danger-focus-shadow: 0 0 0 3px rgba(164,14,38,0.4);--color-btn-danger-counter-bg: rgba(207,34,46,0.1);--color-btn-danger-icon: #cf222e;--color-btn-danger-hover-icon: #ffffff;--color-underlinenav-icon: #6e7781;--color-underlinenav-border-hover: rgba(175,184,193,0.2);--color-action-list-item-inline-divider: rgba(208,215,222,0.48);--color-action-list-item-default-hover-bg: rgba(208,215,222,0.32);--color-action-list-item-default-hover-border: rgba(0,0,0,0);--color-action-list-item-default-active-bg: rgba(208,215,222,0.48);--color-action-list-item-default-active-border: rgba(0,0,0,0);--color-action-list-item-default-selected-bg: rgba(208,215,222,0.24);--color-action-list-item-danger-hover-bg: rgba(255,235,233,0.64);--color-action-list-item-danger-active-bg: #ffebe9;--color-action-list-item-danger-hover-text: #cf222e;--color-switch-track-bg: #eaeef2;--color-switch-track-border: #afb8c1;--color-switch-track-checked-bg: #ddf4ff;--color-switch-track-checked-hover-bg: #b6e3ff;--color-switch-track-checked-active-bg: #80ccff;--color-switch-track-checked-border: #54aeff;--color-switch-knob-checked-bg: #0969da;--color-switch-knob-checked-disabled-bg: #6e7781;--color-segmented-control-bg: #eaeef2;--color-segmented-control-button-hover-bg: rgba(175,184,193,0.2);--color-segmented-control-button-active-bg: rgba(175,184,193,0.4);--color-segmented-control-button-selected-border: #6e7781;--color-tree-view-item-chevron-hover-bg: rgba(208,215,222,0.32);--color-tree-view-item-directory-fill: #54aeff;--color-fg-default: #24292f;--color-fg-muted: #57606a;--color-fg-subtle: #6e7781;--color-fg-on-emphasis: #ffffff;--color-canvas-default: #ffffff;--color-canvas-overlay: #ffffff;--color-canvas-inset: #f6f8fa;--color-canvas-subtle: #f6f8fa;--color-border-default: #d0d7de;--color-border-muted: hsla(210,18%,87%,1);--color-border-subtle: rgba(27,31,36,0.15);--color-shadow-small: 0 1px 0 rgba(27,31,36,0.04);--color-shadow-medium: 0 3px 6px rgba(140,149,159,0.15);--color-shadow-large: 0 8px 24px rgba(140,149,159,0.2);--color-shadow-extra-large: 0 12px 28px rgba(140,149,159,0.3);--color-neutral-emphasis-plus: #24292f;--color-neutral-emphasis: #6e7781;--color-neutral-muted: rgba(175,184,193,0.2);--color-neutral-subtle: rgba(234,238,242,0.5);--color-accent-fg: #0969da;--color-accent-emphasis: #0969da;--color-accent-muted: rgba(84,174,255,0.4);--color-accent-subtle: #ddf4ff;--color-success-fg: #1a7f37;--color-success-emphasis: #2da44e;--color-success-muted: rgba(74,194,107,0.4);--color-success-subtle: #dafbe1;--color-attention-fg: #9a6700;--color-attention-emphasis: #bf8700;--color-attention-muted: rgba(212,167,44,0.4);--color-attention-subtle: #fff8c5;--color-severe-fg: #bc4c00;--color-severe-emphasis: #bc4c00;--color-severe-muted: rgba(251,143,68,0.4);--color-severe-subtle: #fff1e5;--color-danger-fg: #cf222e;--color-danger-emphasis: #cf222e;--color-danger-muted: rgba(255,129,130,0.4);--color-danger-subtle: #ffebe9;--color-open-fg: #1a7f37;--color-open-emphasis: #2da44e;--color-open-muted: rgba(74,194,107,0.4);--color-open-subtle: #dafbe1;--color-closed-fg: #cf222e;--color-closed-emphasis: #cf222e;--color-closed-muted: rgba(255,129,130,0.4);--color-closed-subtle: #ffebe9;--color-done-fg: #8250df;--color-done-emphasis: #8250df;--color-done-muted: rgba(194,151,255,0.4);
621--color-done-subtle: #fbefff;--color-sponsors-fg: #bf3989;--color-sponsors-emphasis: #bf3989;--color-sponsors-muted: rgba(255,128,200,0.4);--color-sponsors-subtle: #ffeff7;--color-primer-fg-disabled: #8c959f;--color-primer-canvas-backdrop: rgba(27,31,36,0.5);--color-primer-canvas-sticky: rgba(255,255,255,0.95);--color-primer-border-active: #fd8c73;--color-primer-border-contrast: rgba(27,31,36,0.1);--color-primer-shadow-highlight: inset 0 1px 0 rgba(255,255,255,0.25);--color-primer-shadow-inset: inset 0 1px 0 rgba(208,215,222,0.2);--color-primer-shadow-focus: 0 0 0 3px rgba(9,105,218,0.3);--color-scale-black: #1b1f24;--color-scale-white: #ffffff;--color-scale-gray-0: #f6f8fa;--color-scale-gray-1: #eaeef2;--color-scale-gray-2: #d0d7de;--color-scale-gray-3: #afb8c1;--color-scale-gray-4: #8c959f;--color-scale-gray-5: #6e7781;--color-scale-gray-6: #57606a;--color-scale-gray-7: #424a53;--color-scale-gray-8: #32383f;--color-scale-gray-9: #24292f;--color-scale-blue-0: #ddf4ff;--color-scale-blue-1: #b6e3ff;--color-scale-blue-2: #80ccff;--color-scale-blue-3: #54aeff;--color-scale-blue-4: #218bff;--color-scale-blue-5: #0969da;--color-scale-blue-6: #0550ae;--color-scale-blue-7: #033d8b;--color-scale-blue-8: #0a3069;--color-scale-blue-9: #002155;--color-scale-green-0: #dafbe1;--color-scale-green-1: #aceebb;--color-scale-green-2: #6fdd8b;--color-scale-green-3: #4ac26b;--color-scale-green-4: #2da44e;--color-scale-green-5: #1a7f37;--color-scale-green-6: #116329;--color-scale-green-7: #044f1e;--color-scale-green-8: #003d16;--color-scale-green-9: #002d11;--color-scale-yellow-0: #fff8c5;--color-scale-yellow-1: #fae17d;--color-scale-yellow-2: #eac54f;--color-scale-yellow-3: #d4a72c;--color-scale-yellow-4: #bf8700;--color-scale-yellow-5: #9a6700;--color-scale-yellow-6: #7d4e00;--color-scale-yellow-7: #633c01;--color-scale-yellow-8: #4d2d00;--color-scale-yellow-9: #3b2300;--color-scale-orange-0: #fff1e5;--color-scale-orange-1: #ffd8b5;--color-scale-orange-2: #ffb77c;--color-scale-orange-3: #fb8f44;--color-scale-orange-4: #e16f24;--color-scale-orange-5: #bc4c00;--color-scale-orange-6: #953800;--color-scale-orange-7: #762c00;--color-scale-orange-8: #5c2200;--color-scale-orange-9: #471700;--color-scale-red-0: #ffebe9;--color-scale-red-1: #ffcecb;--color-scale-red-2: #ffaba8;--color-scale-red-3: #ff8182;--color-scale-red-4: #fa4549;--color-scale-red-5: #cf222e;--color-scale-red-6: #a40e26;--color-scale-red-7: #82071e;--color-scale-red-8: #660018;--color-scale-red-9: #4c0014;--color-scale-purple-0: #fbefff;--color-scale-purple-1: #ecd8ff;--color-scale-purple-2: #d8b9ff;--color-scale-purple-3: #c297ff;--color-scale-purple-4: #a475f9;--color-scale-purple-5: #8250df;--color-scale-purple-6: #6639ba;--color-scale-purple-7: #512a97;--color-scale-purple-8: #3e1f79;--color-scale-purple-9: #2e1461;--color-scale-pink-0: #ffeff7;--color-scale-pink-1: #ffd3eb;--color-scale-pink-2: #ffadda;--color-scale-pink-3: #ff80c8;--color-scale-pink-4: #e85aad;--color-scale-pink-5: #bf3989;--color-scale-pink-6: #99286e;--color-scale-pink-7: #772057;--color-scale-pink-8: #611347;--color-scale-pink-9: #4d0336;--color-scale-coral-0: #fff0eb;--color-scale-coral-1: #ffd6cc;--color-scale-coral-2: #ffb4a1;--color-scale-coral-3: #fd8c73;--color-scale-coral-4: #ec6547;--color-scale-coral-5: #c4432b;--color-scale-coral-6: #9e2f1c;--color-scale-coral-7: #801f0f;--color-scale-coral-8: #691105;--color-scale-coral-9: #510901}.gist .markdown-body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:16px;line-height:1.5;word-wrap:break-word}.gist .markdown-body::before{display:table;content:""}.gist .markdown-body::after{display:table;clear:both;content:""}.gist .markdown-body>*:first-child{margin-top:0 !important}.gist .markdown-body>*:last-child{margin-bottom:0 !important}.gist .markdown-body a:not([href]){color:inherit;text-decoration:none}.gist .markdown-body .absent{color:var(--color-danger-fg)}.gist .markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.gist .markdown-body .anchor:focus{outline:none}.gist .markdown-body p,.gist .markdown-body blockquote,.gist .markdown-body ul,.gist .markdown-body ol,.gist .markdown-body dl,.gist .markdown-body table,.g
621ist .markdown-body pre,.gist .markdown-body details{margin-top:0;margin-bottom:16px}.gist .markdown-body hr{height:.25em;padding:0;margin:24px 0;background-color:var(--color-border-default);border:0}.gist .markdown-body blockquote{padding:0 1em;color:var(--color-fg-muted);border-left:.25em solid var(--color-border-default)}.gist .markdown-body blockquote>:first-child{margin-top:0}.gist .markdown-body blockquote>:last-child{margin-bottom:0}.gist .markdown-body h1,.gist .markdown-body h2,.gist .markdown-body h3,.gist .markdown-body h4,.gist .markdown-body h5,.gist .markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.gist .markdown-body h1 .octicon-link,.gist .markdown-body h2 .octicon-link,.gist .markdown-body h3 .octicon-link,.gist .markdown-body h4 .octicon-link,.gist .markdown-body h5 .octicon-link,.gist .markdown-body h6 .octicon-link{color:var(--color-fg-default);vertical-align:middle;visibility:hidden}.gist .markdown-body h1:hover .anchor,.gist .markdown-body h2:hover .anchor,.gist .markdown-body h3:hover .anchor,.gist .markdown-body h4:hover .anchor,.gist .markdown-body h5:hover .anchor,.gist .markdown-body h6:hover .anchor{text-decoration:none}.gist .markdown-body h1:hover .anchor .octicon-link,.gist .markdown-body h2:hover .anchor .octicon-link,.gist .markdown-body h3:hover .anchor .octicon-link,.gist .markdown-body h4:hover .anchor .octicon-link,.gist .markdown-body h5:hover .anchor .octicon-link,.gist .markdown-body h6:hover .anchor .octicon-link{visibility:visible}.gist .markdown-body h1 tt,.gist .markdown-body h1 code,.gist .markdown-body h2 tt,.gist .markdown-body h2 code,.gist .markdown-body h3 tt,.gist .markdown-body h3 code,.gist .markdown-body h4 tt,.gist .markdown-body h4 code,.gist .markdown-body h5 tt,.gist .markdown-body h5 code,.gist .markdown-body h6 tt,.gist .markdown-body h6 code{padding:0 .2em;font-size:inherit}.gist .markdown-body h1{padding-bottom:.3em;font-size:2em;border-bottom:1px solid var(--color-border-muted)}.gist .markdown-body h2{padding-bottom:.3em;font-size:1.5em;border-bottom:1px solid var(--color-border-muted)}.gist .markdown-body h3{font-size:1.25em}.gist .markdown-body h4{font-size:1em}.gist .markdown-body h5{font-size:.875em}.gist .markdown-body h6{font-size:.85em;color:var(--color-fg-muted)}.gist .markdown-body summary h1,.gist .markdown-body summary h2,.gist .markdown-body summary h3,.gist .markdown-body summary h4,.gist .markdown-body summary h
6215,.gist .markdown-body summary h6{display:inline-block}.gist .markdown-body summary h1 .anchor,.gist .markdown-body summary h2 .anchor,.gist .markdown-body summary h3 .anchor,.gist .markdown-body summary h4 .anchor,.gist .markdown-body summary h5 .anchor,.gist .markdown-body summary h6 .anchor{margin-left:-40px}.gist .markdown-body summary h1,.gist .markdown-body summary h2{padding-bottom:0;border-bottom:0}.gist .markdown-body ul,.gist .markdown-body ol{padding-left:2em}.gist .markdown-body ul.no-list,.gist .markdown-body ol.no-list{padding:0;list-style-type:none}.gist .markdown-body ol[type="1"]{list-style-type:decimal}.gist .markdown-body ol[type=a]{list-style-type:lower-alpha}.gist .markdown-body ol[type=i]{list-style-type:lower-roman}.gist .markdown-body div>ol:not([type]){list-style-type:decimal}.gist .markdown-body ul ul,.gist .markdown-body ul ol,.gist .markdown-body ol ol,.gist .markdown-body ol ul{margin-top:0;margin-bottom:0}.gist .markdown-body li>p{margin-top:16px}.gist .markdown-body li+li{margin-top:.25em}.gist .markdown-body dl{padding:0}.gist .markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}.gist .markdown-body dl dd{padding:0 16px;margin-bottom:16px}.gist .markdown-body table{display:block;width:100%;width:max-content;max-width:100%;overflow:auto}.gist .markdown-body table th{font-weight:600}.gist .markdown-body table th,.gist .markdown-body table td{padding:6px 13px;border:1px solid var(--color-border-default)}.gist .markdown-body table tr{background-color:var(--color-canvas-default);border-top:1px solid var(--color-border-muted)}.gist .markdown-body table tr:nth-child(2n){background-color:var(--color-canvas-subtle)}.gist .markdown-body table img{background-color:transparent}.gist .markdown-body img{max-width:100%;box-sizing:content-box;background-color:var(--color-canvas-default)}.gist .markdown-body img[align=right]{padding-left:20px}.gist .markdown-body img[align=left]{padding-right:20px}.gist .markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.gist .markdown-body span.frame{display:block;overflow:hidden}.gist .markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid var(--color-border-default)}.gist .markdown-body span.frame span img{display:block;float:left}.gist .markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:var(--color-fg-default)}.gist .markdown-body span.align-center{display:block;overflow:hidden;clear:both}.gist .markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.gist .markdown-body span.align-center span img{margin:0 auto;text-align:center}.gist .markdown-body span.align-right{display:block;overflow:hidden;clear:both}.gist .markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.gist .markdown-body span.align-right span img{margin:0;text-align:right}.gist .markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.gist .markdown-body span.float-left span{margin:13px 0 0}.gist .markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.gist .markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.gist .markdown-body code,.gist .markdown-body tt{padding:.2em .4em;margin:0;font-size:85%;background-color:var(--color-neutral-muted);border-radius:6px}.gist .markdown-body code br,.gist .markdown-body tt br{display:none}.gist .markdown-body del code{text-decoration:inherit}.gist .markdown-body samp{font-size:85%}.gist .markdown-body pre{word-wrap:normal}.gist .markdown-body pre code{font-size:100%}.gist .markdown-body pre>code{padding:0;margin:0;word-break:normal;white-space:pre;background:transparent;border:0}.gist .markdown-body .highlight{margin-bottom:16px}.gist .markdown-body .highlight pre{margin-bottom:0;word-break:normal}.gist .markdown-body .highlight pre,.gist .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:var(--color-canvas-subtle);border-radius:6px}.gist .markdown-body pre code,.gist .markdown-body pre tt{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.gist .markdown-body .csv-data td,.gist .markdown-body .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.gist .markdown-body .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:var(--color-canvas-default);border:0}.gist .markdown-body .csv-data tr{border-top:0}.gist .markdown-body .csv-data th{font-weight:600;background:var(--color-canvas-subtle);border-top:0}.gist .markdown-body [data-footnote-ref]::before{content:"["}.gist .markdown-body [data-footnote-ref]::after{content:"]"}.gist .markdown-body .footnotes{font-size:12px;color:var(--color-fg-muted);border-top:1px solid var(--color-border-default)}.gist .markdown-body .footnotes ol{padding-left:16px}.gist .markdown-body .footnotes ol ul{display:inline-block;padding-left:16px;margin-top:16px}.gist .markdown-body .footnotes li{position:relative}.gist .markdown-body .footnotes li:target::before{position:absolute;top:-8px;right:-8px;bottom:-8px;left:-24px;pointer-events:none;content:"";border:2px solid var(--color-accent-emphasis);border-radius:6px}.gist .markdown-body .footnotes li:target{color:var(--color-fg-default)}.gist .markdown-body .footnotes .data-footnote-backref g-emoji{font-family:monospace}.gist .pl-c{color:#6a737d}.gist .pl-c1,.gist .pl-s .pl-v{color:#005cc5}.gist .pl-e,.gist .pl-en{color:#6f42c1}.gist .pl-smi,.gist .pl-s .pl-s1{color:#24292e}.gist .pl-ent{color:#22863a}.gist .pl-k{color:#d73a49}.gist .pl-s,.gist .pl-pds,.gist .pl-s .pl-pse .pl-s1,.gist .pl-sr,.gist .pl-sr .pl-cce,.gist .pl-sr .pl-sre,.gist .pl-sr .pl-sra{color:#032f62}.gist .pl-v,.gist .pl-smw{color:#e36209}.gist .pl-bu{color:#b31d28}.gist .pl-ii{color:#fafbfc;background-color:#b31d28}.gist .pl-c2{color:#fafbfc;background-color:#d73a49}.gist .pl-c2::before{content:"^M"}.gist .pl-sr .pl-cce{font-weight:bold;color:#22863a}.gist .pl-ml{color:#735c0f}.gist .pl-mh,.gist .pl-mh .pl-en,.gist .pl-ms{font-weight:bold;color:#005cc5}.gist .pl-mi{font-style:italic;color:#24292e}.gist .pl-mb{font-weight:bold;color:#24292e}.gist .pl-md{color:#b31d28;background-color:#ffeef0}.gist .pl-mi1{color:#22863a;background-color:#f0fff4}.gist .pl-mc{color:#e36209;background-color:#ffebda}.gist .pl-mi2{color:#f6f8fa;background-color:#005cc5}.gist .pl-mdr{font-weight:bold;color:#6f42c1}.gist .pl-ba{color:#586069}.gist .pl-sg{color:#959da5}.gist .pl-corl{text-decoration:underline;color:#032f62}.gist .breadcrumb{font-size:16px;color:var(--color-fg-muted)}.gist .breadcrumb .separator{white-space:pre-wrap}.gist .breadcrumb .separator::before,.gist .breadcrumb .separator::after{content:" "}.gist .breadcrumb strong.final-path{color:var(--color-fg-default)}.gist .blob-interaction-bar{position:relative;background-color:var(--color-canvas-subtle);border-bottom:1px solid var(--color-border-default)}.gist .blob-interaction-bar::before{display:table;content:""}.gist .blob-interaction-bar::after{display:table;clear:both;content:""}.gist .blob-interaction-bar .octicon-search{position:absolute;top:6px;left:10px;font-size:12px;color:var(--color-fg-muted)}.gist .blob-filter{width:100%;padding:4px 16px 4px 32px;font-size:12px;border:0;border-radius:0;outline:none}.gist .blob-filter:focus{outline:none}.gist .TagsearchPopover{width:inherit;max-width:600px}.gist .TagsearchPopover-content{max-height:300px}.gist .TagsearchPopover-list .TagsearchPopover-list-item:hover{background-color:var(--color-canvas-subtle)}.gist .TagsearchPopover-list .TagsearchPopover-list-item .TagsearchPopover-item:hover{text-decoration:none}.gist .TagsearchPopover-list .blob-code-inner{white-space:pre-wrap}.gist .diff-table .line-alert,.gist .blob-code-content .line-alert{position:absolute;
621left:0;margin:-2px 2px}.gist .diff-table .codeowners-error,.gist .blob-code-content .codeowners-error{color:var(--color-danger-fg)}.gist .diff-table .error-highlight,.gist .blob-code-content .error-highlight{position:relative;cursor:help;font-style:italic;color:var(--color-danger-fg)}.gist .diff-table .error-highlight::before,.gist .blob-code-content .error-highlight::before{position:absolute;top:101%;width:100%;height:.25em;content:"";background:linear-gradient(135deg, transparent, transparent 45%, var(--color-danger-fg), transparent 55%, transparent 100%),linear-gradient(45deg, transparent, transparent 45%, var(--color-danger-fg), transparent 55%, transparent 100%);background-repeat:repeat-x,repeat-x;background-size:.5em .5em}.gist .blob-code-content .blob-num .line-alert{margin-top:1px}.gist .diff-table .blob-num .line-alert{margin:2px -2px}.gist .csv-data .line-alert{position:absolute;margin:2px 4px}.gist .CopyBlock{line-height:20px;cursor:pointer}.gist .CopyBlock .octicon-copy{display:none}.gist .CopyBlock:hover,.gist .CopyBlock:focus,.gist .CopyBlock:active{background-color:var(--color-canvas-default);outline:none}.gist .CopyBlock:hover .octicon-copy,.gist .CopyBlock:focus .octicon-copy,.gist .CopyBlock:active .octicon-copy{display:inline-block}.gist .blob-header.is-stuck{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.gist .blob-wrapper{overflow-x:auto;overflow-y:hidden}.gist .blob-wrapper table tr:nth-child(2n){background-color:transparent}.gist .page-edit-blob.height-full .CodeMirror{height:300px}.gist .page-edit-blob.height-full .CodeMirror,.gist .page-edit-blob.height-full .CodeMirror-scroll{display:flex;flex-direction:column;flex:1 1 auto}.gist .blob-wrapper-embedded{max-height:240px;overflow-y:auto}.gist .diff-table{width:100%;border-collapse:separate}.gist .diff-table .blob-code.blob-code-inner{padding-left:22px}.gist .diff-table .line-comments{padding:10px;vertical-align:top;border-top:1px solid var(--color-border-default)}.gist .diff-table .line-comments:first-child+.empty-cell{border-left-width:1px}.gist .diff-table tr:not(:last-child) .line-comments{border-top:1px solid var(--color-border-default);border-bottom:1px solid var(--color-border-default)}.gist .diff-view .blob-code-marker-context::before,.gist .diff-view .blob-code-marker-injected_context::before,.gist .diff-view .blob-code-marker-addition::before,.gist .diff-view .blob-code-marker-deletion::before{top:4px}.gist .diff-view .line-alert,.gist .diff-table .line-alert{position:absolute;left:-60px;margin:2px}.gist .comment-body .diff-view .line-alert{left:0}.gist .blob-num{position:relative;width:1%;min-width:50px;padding-right:10px;padding-left:10px;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px;line-height:20px;color:var(--color-fg-subtle);text-align:right;white-space:nowrap;vertical-align:top;cursor:pointer;-webkit-user-select:none;user-select:none}.gist .blob-num:hover{color:var(--color-fg-default)}.gist .blob-num::before{content:attr(data-line-number)}.gist .blob-num.non-expandable{cursor:default}.gist .blob-num.non-expandable:hover{color:var(--color-fg-subtle)}.gist .blob-num-hidden::before{visibility:hidden}.gist .blob-code{position:relative;padding-right:10px;padding-left:10px;line-height:20px;vertical-align:top}.gist .blob-code-inner{display:table-cell;overflow:visible;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px;color:var(--color-fg-default);word-wrap:anywhere;white-space:pre}.gist .blob-code-inner .x-first{border-top-left-radius:.2em;border-bottom-left-radius:.2em}.gist .blob-code-inner .x-last{border-top-right-radius:.2em;border-bottom-right-radius:.2em}.gist .blob-code-inner.highlighted,.gist .blob-code-inner .highlighted{background-color:var(--color-attention-subtle);box-shadow:inset 2px 0 0 var(--color-attention-muted)}.gist .blob-code-inner::selection,.gist .blob-code-inner *::selection{background-color:var(--color-accent-muted)}.gist .blob-code-inner.blob-code-addition,.gist .blob-code-inner.blob-code-deletion{position:relative;padding-left:22px !important}.gist .blob-code-marker::before{position:absolute;top:1px;left:8px;padding-right:8px;content:attr(data-code-marker)}.gist .blob-code-context,.gist .blob-code-addition,.gist .blob-code-deletion{padding-left:22px}
621.gist .blob-code-marker-addition::before{position:absolute;top:1px;left:8px;content:"+ "}.gist .blob-code-marker-deletion::before{position:absolute;top:1px;left:8px;content:"- "}.gist .blob-code-marker-context::before{position:absolute;top:1px;left:8px;content:"  "}.gist .blob-code-marker-injected_context::before{position:absolute;top:1px;left:8px;content:"  "}.gist .soft-wrap .diff-table{table-layout:fixed}.gist .soft-wrap .blob-code{padding-left:18px;text-indent:0}.gist .soft-wrap .blob-code-inner{white-space:pre-wrap}.gist .soft-wrap .no-nl-marker{display:none}.gist .soft-wrap .add-line-comment{margin-top:0;margin-left:-24px}.gist .soft-wrap .blob-code-context,.gist .soft-wrap .blob-code-addition,.gist .soft-wrap .blob-code-deletion{padding-left:22px;text-indent:0}.gist .blob-num-hunk,.gist .blob-code-hunk,.gist .blob-num-expandable{color:var(--color-fg-muted);vertical-align:middle}.gist .blob-num-hunk,.gist .blob-num-expandable{background-color:var(--color-diff-blob-hunk-num-bg)}.gist .blob-code-hunk{padding-top:4px;padding-bottom:4px;background-color:var(--color-accent-subtle);border-width:1px 0}.gist .blob-expanded .blob-num:not(.blob-num-context-outside-diff),.gist .blob-expanded .blob-code:not(.blob-code-context){background-color:var(--color-canvas-subtle)}.gist .blob-expanded+tr.show-top-border:not(.blob-expanded) .blob-num,.gist .blob-expanded+tr.show-top-border:not(.blob-expanded) .blob-code{border-top:1px solid var(--color-border-muted)}.gist .blob-expanded tr.show-top-border .blob-num-hunk,.gist .blob-expanded tr.show-top-border .blob-num{border-top:1px solid var(--color-border-muted)}.gist tr.show-top-border+.blob-expanded .blob-num,.gist tr.show-top-border+.blob-expanded .blob-code{border-top:1px solid var(--color-border-muted)}.gist .blob-num-expandable{width:auto;padding:0;font-size:12px;text-align:center}.gist .blob-num-expandable .directional-expander{display:block;width:auto;height:auto;margin-right:-1px;color:var(--color-diff-blob-expander-icon);cursor:pointer}.gist .blob-num-expandable .single-expander{padding-top:4px;padding-bottom:4px}.gist .blob-num-expandable .directional-expander:hover{color:var(--color-fg-on-emphasis);text-shadow:none;background-color:var(--color-accent-emphasis);border-color:var(--color-accent-emphasis)}.gist .blob-code-addition{background-color:var(--color-diff-blob-addition-line-bg);outline:1px dotted transparent}.gist .blob-code-addition .x{color:var(--color-diff-blob-addition-fg);background-color:var(--color-diff-blob-addition-word-bg)}.gist .blob-num-addition{color:var(--color-diff-blob-addition-num-text);background-color:var(--color-diff-blob-addition-num-bg);border-color:var(--color-success-emphasis)}.gist .blob-num-addition:hover{color:var(--color-fg-default)}.gist .blob-code-deletion{background-color:var(--color-diff-blob-deletion-line-bg);outline:1px dashed transparent}.gist .blob-code-deletion .x{color:var(--color-diff-blob-deletion-fg);background-color:var(--color-diff-blob-deletion-word-bg)}.gist .blob-num-deletion{color:var(--color-diff-blob-deletion-num-text);background-color:var(--color-diff-blob-deletion-num-bg);border-color:var(--color-danger-emphasis)}.gist .blob-num-deletion:hover{color:var(--color-fg-default)}.gist .is-selecting{cursor:ns-resize !important}.gist .is-selecting .blob-num{cursor:ns-resize !important}.gist .is-selecting .add-line-comment,.gist .is-selecting a{pointer-events:none;cursor:ns-resize !important}.gist .is-selecting .is-hovered .add-line-comment{opacity:0}.gist .is-selecting.file-diff-split{cursor:nwse-resize !important}.gist .is-selecting.file-diff-split .blob-num{cursor:nwse-resize !important}.gist .is-selecting.file-diff-split .empty-cell,.gist .is-selecting.file-diff-split .add-line-comment,.gist .is-selecting.file-diff-split a{pointer-events:none;cursor:nwse-resize !important}.gist .selected-line{position:relative}.gist .selected-line::after{position:absolute;top:0;left:0;display:block;width:100%;height:100%;box-sizing:border-box;pointer-events:none;content:"";background:var(--color-attention-subtle);mix-blend-mode:var(--color-diff-blob-selected-line-highlight-mix-blend-mode)}.gist .selected-line.selected-line-top::after{border-top:1px solid var(--color-attention-muted)}.gist .selected-line.selected-line-bottom::after{border-bottom:1px solid var(--color-attention-muted)}.gist .selected-line:first-child::after,.gist .selected-line.selected-line-left::after{border-left:1px solid var(--color-attention-muted)}.gist .selected-line:last-child::after,.gist .selected-line.selected-line-right::after{border-right:1px solid var(--color-attention-muted)}.gist .is-commenting .selected-line.blob-code::before{position:absolute;top:0;left:-1px;display:block;width:4px;height:100%;content:"";background:var(--color-accent-emphasis)}.gist .add-line-comment{position:relative;z-index:1;float:left;width:22px;height:22px;
621margin:-2px -10px -2px -32px;line-height:21px;color:var(--color-fg-on-emphasis);text-align:center;text-indent:0;cursor:pointer;background-color:var(--color-accent-emphasis);border-radius:6px;box-shadow:var(--color-shadow-medium);opacity:0;transition:transform .1s ease-in-out;transform:scale(0.8, 0.8)}.gist .add-line-comment:hover{transform:scale(1, 1)}.is-hovered .gist .add-line-comment,.gist .add-line-comment:focus{opacity:1}.gist .add-line-comment .octicon{vertical-align:text-top;pointer-events:none}.gist .add-line-comment.octicon-check{background:#333;opacity:1}.gist .inline-comment-form{border:1px solid #dfe2e5;border-radius:6px}.gist .timeline-inline-comments{width:100%;table-layout:fixed}.gist .timeline-inline-comments .inline-comments,.gist .show-inline-notes .inline-comments{display:table-row}.gist .inline-comments{display:none}.gist .inline-comments .line-comments+.blob-num{border-left-width:1px}.gist .inline-comments .timeline-comment{margin-bottom:10px}.gist .inline-comments .inline-comment-form,.gist .inline-comments .inline-comment-form-container{max-width:780px}.gist .comment-holder{max-width:780px}.gist .comment-holder+.comment-holder{margin-top:16px}.gist .line-comments+.line-comments,.gist .empty-cell+.line-comments{border-left:1px solid var(--color-border-muted)}.gist .inline-comment-form-container .inline-comment-form-box,.gist .inline-comment-form-container.open .inline-comment-form-actions{display:none}.gist .inline-comment-form-container .inline-comment-form-actions,.gist .inline-comment-form-container.open .inline-comment-form-box{display:block}.gist body.full-width .container,.gist body.full-width .container-lg:not(.markdown-body),.gist body.full-width .container-xl{width:100%;max-width:none;padding-right:20px;padding-left:20px}.gist body.full-width .repository-content{width:100%}.gist body.full-width .new-pr-form{max-width:980px}.gist .file-diff-split{table-layout:fixed}.gist .file-diff-split .blob-code+.blob-num{border-left:1px solid var(--color-border-muted)}.gist .file-diff-split .blob-code-inner{white-space:pre-wrap}.gist .file-diff-split .empty-cell{cursor:default;background-color:var(--color-neutral-subtle);border-right-color:var(--color-border-muted)}@media(max-width: 1280px){.gist .file-diff-split .tabnav:not(.CommentBox-header) .write-selected .comment-form-head{margin-bottom:48px !important}.gist .file-diff-split .tabnav:not(.CommentBox-header) markdown-toolbar{position:absolute;right:8px;bottom:-40px}}.gist .submodule-diff-stats .octicon-diff-removed{color:var(--color-danger-fg)}.gist .submodule-diff-stats .octicon-diff-renamed{color:var(--color-fg-muted)}.gist .submodule-diff-stats .octicon-diff-modified{color:var(--color-attention-fg)}.gist .submodule-diff-stats .octicon-diff-added{color:var(--color-success-fg)}.gist .BlobToolbar{left:-17px}.gist .BlobToolbar-dropdown{margin-left:-2px}.gist .pl-token:hover,.gist .pl-token.active{cursor:pointer;background:var(--color-attention-muted)}.gist .task-list-item{list-style-type:none}.gist .task-list-item label{font-weight:400}.gist .task-list-item.enabled label{cursor:pointer}.gist .task-list-item+.task-list-item{margin-top:4px}.gist .task-list-item .handle{display:none}.gist .task-list-item-checkbox{margin:0 .2em .25em -1.6em;vertical-align:middle}.gist .contains-task-list:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}.gist .convert-to-issue-button{top:2px;right:4px;padding:0 2px;margin-right:8px;-webkit-user-select:none;user-select:none;background-color:var(--color-canvas-subtle)}.gist .convert-to-issue-button .octicon{fill:var(--color-fg-default)}.gist .convert-to-issue-button:hover .octicon,.gist .convert-to-issue-button:focus .octicon{fill:var(--color-accent-fg)}.gist .reorderable-task-lists .markdown-body .contains-task-list{padding:0}.gist .reorderable-task-lists .markdown-body li:not(.task-list-item){margin-left:24px}.gist .reorderable-task-lists .markdown-body ol:not(.contains-task-list) li,.gist .reorderable-task-lists .markdown-body ul:not(.contains-task-list) li{margin-left:0}.gist .reorderable-task-lists .markdown-body .task-list-item{padding:2px 15px 2px 42px;margin-right:-15px;margin-left:-15px;line-height:1.5;border:0}.gist .reorderable-task-lists .markdown-body .task-list-item+.task-list-item{margin-top:0}.gist .reorderable-task-lists .markdown-body .task-list-item .handle{display:block;float:left;width:20px;padding:2px 0 0 2px;margin-left:-43px;opacity:0}
621.gist .reorderable-task-lists .markdown-body .task-list-item .drag-handle{fill:var(--color-fg-default)}.gist .reorderable-task-lists .markdown-body .task-list-item.hovered>.handle{opacity:1}.gist .reorderable-task-lists .markdown-body .task-list-item.is-dragging{opacity:0}.gist .reorderable-task-lists .markdown-body .contains-task-list:dir(rtl) .task-list-item{margin-right:0}.gist .comment-body .reference{font-weight:600;white-space:nowrap}.gist .comment-body .issue-link{white-space:normal}.gist .comment-body .issue-link .issue-shorthand{font-weight:400;color:var(--color-fg-muted)}.gist .comment-body .issue-link:hover .issue-shorthand,.gist .comment-body .issue-link:focus .issue-shorthand{color:var(--color-accent-fg)}.gist .review-comment-contents .markdown-body .task-list-item{padding-left:42px;margin-right:-12px;margin-left:-12px;border-top-left-radius:6px;border-bottom-left-radius:6px}.gist .convert-to-issue-enabled .task-list-item .contains-task-list{padding:4px 15px 0 43px;margin:0 -15px 0 -42px}.gist .convert-to-issue-enabled .task-list-item.hovered{background-color:var(--color-canvas-subtle)}.gist .convert-to-issue-enabled .task-list-item.hovered .contains-task-list{background-color:var(--color-canvas-default)}.gist .convert-to-issue-enabled .task-list-item.hovered>.convert-to-issue-button{z-index:20;width:auto;height:auto;overflow:visible;clip:auto}.gist .convert-to-issue-enabled .task-list-item.hovered>.convert-to-issue-button svg{overflow:visible}.gist .convert-to-issue-enabled .task-list-item.is-loading{color:var(--color-fg-muted);background-color:var(--color-accent-subtle);border-top:1px solid var(--color-accent-subtle);border-bottom:1px solid var(--color-canvas-default);border-left:1px solid var(--color-canvas-default)}.gist .convert-to-issue-enabled .task-list-item.is-loading ul{color:var(--color-fg-default);background-color:var(--color-canvas-default)}.gist .convert-to-issue-enabled .task-list-item.is-loading>.handle{opacity:0}.gist .task-list-item-convert-container{position:absolute !important;top:calc(100% - 4px);right:0;left:0;display:none;margin-top:0}.gist .task-list-item-convert-container:hover,.gist .task-list-item-convert-container:focus{display:block}.gist .task-list-item-convert-button-container{top:4px;right:0;left:auto;width:auto}.gist .contains-task-list{position:relative;list-style-type:none}.gist .contains-task-list:hover .task-list-item-convert-container,.gist .contains-task-list:focus-within .task-list-item-convert-container{display:block;width:auto;height:24px;overflow:visible;clip:auto}.gist .convert-to-block-button{margin:0 4px}.gist .highlight{padding:0;margin:0;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px;font-weight:400;line-height:1.4;color:#333;background:var(--color-canvas-default);border:0}.gist .render-viewer-error,.gist .render-viewer-fatal,.gist .render-viewer-invalid,.gist .octospinner{display:none}.gist iframe.render-viewer{width:100%;height:480px;overflow:hidden;border:0}.gist pre,.gist code{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace !important;white-space:pre}.gist .gist-meta{padding:10px;overflow:hidden;font:12px -apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";color:var(--color-fg-muted);background-color:#f7f7f7;border-radius:0 0 6px 6px}.gist .gist-meta a{font-weight:600;color:#666;text-decoration:none;border:0}.gist .gist-data{overflow:auto;word-wrap:normal;background-color:var(--color-canvas-default);border-bottom:1px solid #ddd;border-radius:6px 6px 0 0}.gist .gist-file{margin-bottom:1em;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;border:1px solid #ddd;border-bottom:1px solid #ccc;border-radius:6px}.gist .gist-file article{padding:6px}.gist .gist-file .scroll .gist-data{position:absolute;top:0;right:0;bottom:30px;left:0;overflow:scroll}.gist .gist-file .scroll .gist-meta{position:absolute;right:0;bottom:0;left:0}.gist .blob-num{min-width:inherit;padding:1px 10px !important;background:rgba(0,0,0,0)}.gist .blob-code{padding:1px 10px !important;text-align:left;background:rgba(0,0,0,0);border:0}.gist .blob-code-inner::selection,.gist .blob-code-inner *::selection{background-color:#c8e1ff}.gist .blob-wrapper table{border-collapse:collapse}.gist .blob-wrapper tr:first-child td{padding-top:4px}.gist .markdown-body .anchor{display:none}
622
623/*# sourceMappingURL=gist-embed-d3eb7079f000.css.map*/
624.content .gist td {
625  border: none;
626}
627</style>
628<!-- 
628<script src="https://gist.github.com/lideming/3ea6b3502c69d2f928cad5f8b7aab4d5.js"></script>
628 -->
629<!-- <link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-598610950903.css"> -->
630
631<div id="gist119295072" class="gist">
632    <div class="gist-file" translate="no">
633      <div class="gist-data">
634        <div class="js-gist-file-update-container js-task-list-container file-box">
635  <div id="file-lark_msg" class="file my-2">
636    
637    <div itemprop="text" class="Box-body p-0 blob-wrapper data type-shell  ">
638
639        
640<div class="js-check-bidi js-blob-code-container blob-code-content">
641
642  <template class="js-file-alert-template">
643  <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
644  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
645    <path fill-rule="evenodd" d="M8.22 1.754a.25.25 0 00-.44 0L1.698 13.132a.25.25 0 00.22.368h12.164a.25.25 0 00.22-.368L8.22 1.754zm-1.763-.707c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0114.082 15H1.918a1.75 1.75 0 01-1.543-2.575L6.457 1.047zM9 11a1 1 0 11-2 0 1 1 0 012 0zm-.25-5.25a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z"></path>
646</svg>
647  
648    <span>
649      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
650      <a href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
651    </span>
652
653
654  <div data-view-component="true" class="flash-action">        <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn">    Show hidden characters
655</a>
656</div>
657</div></template>
658<template class="js-line-alert-template">
659  <span aria-label="This line has hidden Unicode characters" data-view-component="true" class="line-alert tooltipped tooltipped-e">
660    <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
661    <path fill-rule="evenodd" d="M8.22 1.754a.25.25 0 00-.44 0L1.698 13.132a.25.25 0 00.22.368h12.164a.25.25 0 00.22-.368L8.22 1.754zm-1.763-.707c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0114.082 15H1.918a1.75 1.75 0 01-1.543-2.575L6.457 1.047zM9 11a1 1 0 11-2 0 1 1 0 012 0zm-.25-5.25a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z"></path>
662</svg>
663</span></template>
664
665  <table data-hpc="" class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="Shell" data-tagsearch-path="lark_msg">
666        <tbody><tr>
667          <td id="file-lark_msg-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"></td>
668          <td id="file-lark_msg-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-c"><span class="pl-c">#!</span>/bin/sh</span></td>
669        </tr>
670        <tr>
671          <td id="file-lark_msg-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"></td>
672          <td id="file-lark_msg-LC2" class="blob-code blob-code-inner js-file-line">
673</td>
674        </tr>
675        <tr>
676          <td id="file-lark_msg-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"></td>
677          <td id="file-lark_msg-LC3" class="blob-code blob-code-inner js-file-line">WEBHOOK=YOUR_WEBHOOK_HERE</td>
678        </tr>
679        <tr>
680          <td id="file-lark_msg-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"></td>
681          <td id="file-lark_msg-LC4" class="blob-code blob-code-inner js-file-line">
682</td>
683        </tr>
684        <tr>
685          <td id="file-lark_msg-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"></td>
686          <td id="file-lark_msg-LC5" class="blob-code blob-code-inner js-file-line"><span class="pl-k">if</span> [ <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$*</span><span class="pl-pds">"</span></span> <span class="pl-k">==</span> <span class="pl-s"><span class="pl-pds">"</span>--help<span class="pl-pds">"</span></span> ] <span class="pl-k">;</span> <span class="pl-k">then</span></td>
687        </tr>
688        <tr>
689          <td id="file-lark_msg-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"></td>
690          <td id="file-lark_msg-LC6" class="blob-code blob-code-inner js-file-line">
690        <span class="pl-c1">echo</span> <span class="pl-s"><span class="pl-pds">"</span>Usage: lark_msg &lt;msg&gt;...<span class="pl-pds">"</span></span></td>
691        </tr>
692        <tr>
693          <td id="file-lark_msg-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"></td>
694          <td id="file-lark_msg-LC7" class="blob-code blob-code-inner js-file-line">        <span class="pl-c1">exit</span> 0</td>
695        </tr>
696        <tr>
697          <td id="file-lark_msg-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"></td>
698          <td id="file-lark_msg-LC8" class="blob-code blob-code-inner js-file-line"><span class="pl-k">fi</span></td>
699        </tr>
700        <tr>
701          <td id="file-lark_msg-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"></td>
702          <td id="file-lark_msg-LC9" class="blob-code blob-code-inner js-file-line">
703</td>
704        </tr>
705        <tr>
706          <td id="file-lark_msg-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"></td>
707          <td id="file-lark_msg-LC10" class="blob-code blob-code-inner js-file-line">msg=<span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$*</span><span class="pl-pds">"</span></span></td>
708        </tr>
709        <tr>
710          <td id="file-lark_msg-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"></td>
711          <td id="file-lark_msg-LC11" class="blob-code blob-code-inner js-file-line">
712</td>
713        </tr>
714        <tr>
715          <td id="file-lark_msg-L12" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="12"></td>
716          <td id="file-lark_msg-LC12" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">echo</span> <span class="pl-s"><span class="pl-pds">"</span>sending:<span class="pl-pds">"</span></span> <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$*</span><span class="pl-pds">"</span></span> <span class="pl-k">|</span> systemd-cat -t lark_msg -p info</td>
717        </tr>
718        <tr>
719          <td id="file-lark_msg-L13" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="13"></td>
720          <td id="file-lark_msg-LC13" class="blob-code blob-code-inner js-file-line">
721</td>
722        </tr>
723        <tr>
724          <td id="file-lark_msg-L14" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="14"></td>
725          <td id="file-lark_msg-LC14" class="blob-code blob-code-inner js-file-line">json=<span class="pl-s"><span class="pl-pds">$(</span>jq -n --arg msg <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$msg</span><span class="pl-pds">"</span></span> <span class="pl-s"><span class="pl-pds">'</span>{"msg_type":"text","content":{"text": $msg}}<span class="pl-pds">'</span></span><span class="pl-pds">)</span></span></td>
726        </tr>
727        <tr>
728          <td id="file-lark_msg-L15" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="15"></td>
729          <td id="file-lark_msg-LC15" class="blob-code blob-code-inner js-file-line">
730</td>
731        </tr>
732        <tr>
733          <td id="file-lark_msg-L16" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="16"></td>
734          <td id="file-lark_msg-LC16" class="blob-code blob-code-inner js-file-line">ret=<span class="pl-s"><span class="pl-pds">$(</span>curl -s -X POST -H <span class="pl-s"><span class="pl-pds">"</span>Content-Type: application/json<span class="pl-pds">"</span></span> -d <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$json</span><span class="pl-pds">"</span></span> <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$WEBHOOK</span><span class="pl-pds">"</span></span> <span class="pl-pds">)</span></span></td>
735        </tr>
736        <tr>
737          <td id="file-lark_msg-L17" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="17"></td>
738          <td id="file-lark_msg-LC17" class="blob-code blob-code-inner js-file-line">
739</td>
740        </tr>
741        <tr>
742          <td id="file-lark_msg-L18" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="18"></td>
743          <td id="file-lark_msg-LC18" class="blob-code blob-code-inner js-file-line"><span class="pl-k">if</span> [ <span class="pl-s"><span class="pl-pds">"</span><span class="pl-s"><span class="pl-pds">$(</span> <span class="pl-c1">echo</span> <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$ret</span><span class="pl-pds">"</span></span> <span class="pl-k">|</span> jq .StatusCode <span class="pl-pds">)</span></span><span class="pl-pds">"</span></span> <span class="pl-k">!=</span> <span class="pl-s"><span class="pl-pds">"</span>0<span class="pl-pds">"</span></span> ] <span class="pl-k">;</span> <span class="pl-k">then</span></td>
744        </tr>
745        <tr>
746          <td id="file-lark_msg-L19" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="19"></td>
747          <td id="file-lark_msg-LC19" class="blob-code blob-code-inner js-file-line">
747        <span class="pl-c1">echo</span> <span class="pl-s"><span class="pl-pds">"</span>failed:<span class="pl-pds">"</span></span> <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$ret</span><span class="pl-pds">"</span></span>  <span class="pl-k">|</span> systemd-cat -t lark_msg -p warning</td>
748        </tr>
749        <tr>
750          <td id="file-lark_msg-L20" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="20"></td>
751          <td id="file-lark_msg-LC20" class="blob-code blob-code-inner js-file-line"><span class="pl-k">fi</span></td>
752        </tr>
753  </tbody></table>
754</div>
755
756
757    </div>
758
759  </div>
760</div>
761
762      </div>
763      <div class="gist-meta">
764        <a href="https://gist.github.com/lideming/3ea6b3502c69d2f928cad5f8b7aab4d5/raw/2100845a950323f401ddbc4fd509bd2c53b673d1/lark_msg" style="float:right">view raw</a>
765        <a href="https://gist.github.com/lideming/3ea6b3502c69d2f928cad5f8b7aab4d5#file-lark_msg">
766          lark_msg
767        </a>
768        hosted with ❤ by <a href="https://github.com">GitHub</a>
769      </div>
770    </div>
771</div></section>
772                    <div class="post-preview-footer">
773                        <div class="date-tags">
774                            <time class="date">2022-11-11</time>
775                            <span class="tags">
776                                    <a href="/Posts?tag=Linux"><span class="tag">Linux</span></a>
777                                    <a href="/Posts?tag=server"><span class="tag">server</span></a>
778                                    <a href="/Posts?tag=shell"><span class="tag">shell</span></a>
779                                    <a href="/Posts?tag=lark"><span class="tag">lark</span></a>
780                                    <a href="/Posts?tag=feishu"><span class="tag">feishu</span></a>
781                                    <a href="/Posts?tag=bot"><span class="tag">bot</span></a>
782                            </span>
783                        </div>
784                    </div>
785            </article>
786            <article class="post-preview mycard">
787                <header>
788                    <h1 class="title"><a href="/Posts/fail2ban-for-ssh-behind-frp">&#x4E3A; frp &#x540E;&#x7684; SSH &#x914D;&#x7F6E; fail2ban</a></h1>
789                </header>
790                <section class="content"><!-- md -->
791<p>家里的 NAS 一直被 SSH 爆破,即使我已经把密码登录关了,还是在不停地刷 SSH 登录失败的系统日志。</p>
792<p>于是尝试配置 fail2ban 解决这个问题。</p>
793</section>
794                    <div class="post-preview-footer">
795                        <div class="date-tags">
796                            <time class="date">2022-04-13</time>
797                            <span class="tags">
798                                    <a href="/Posts?tag=Linux"><span class="tag">Linux</span></a>
799                                    <a href="/Posts?tag=server"><span class="tag">server</span></a>
800                                    <a href="/Posts?tag=frp"><span class="tag">frp</span></a>
801                                    <a href="/Posts?tag=fail2ban"><span class="tag">fail2ban</span></a>
802                            </span>
803                        </div>
804                            <a class="read-more" href="/Posts/fail2ban-for-ssh-behind-frp">Full post &gt;</a>
805                    </div>
806            </article>
807            <article class="post-preview mycard">
808                <header>
809                    <h1 class="title"><a href="/Posts/backup-server-data-to-nextcloud">&#x81EA;&#x52A8;&#x5907;&#x4EFD;&#x670D;&#x52A1;&#x5668;&#x6570;&#x636E;&#x5230; NextCloud</a></h1>
810                </header>
811                <section class="content"><!-- md -->
812<blockquote>
813<p>2024-02-28 更新:使用 zstd 压缩(<code>.tar.gz</code> -&gt; <code>.tar.zst</code>;<code>tar czvf</code> -&gt; <code>tar cavf</code>)</p>
814</blockquote>
815<p>突发奇想:在 NextCloud 创建一个 File drop 分享,然后写一个打包上传脚本,就可以把它当备份服务器用啦。</p>
816<p>
816功能/特点:</p>
817<ul>
818<li>分别备份多个源目录到 tar 文件并上传到 NextCloud share;</li>
819<li>每周上传完整备份,每天上传增量备份(利用 tar 增量备份);</li>
820<li>只需要 NextCloud 的 File drop 链接,由于 File drop 只能用于上传,禁止列出/下载文件,脚本泄露不会造成其它数据的泄露。</li>
821</ul>
822</section>
823                    <div class="post-preview-footer">
824                        <div class="date-tags">
825                            <time class="date">2022-03-25</time>
826                            <span class="tags">
827                                    <a href="/Posts?tag=Linux"><span class="tag">Linux</span></a>
828                                    <a href="/Posts?tag=server"><span class="tag">server</span></a>
829                                    <a href="/Posts?tag=NextCloud"><span class="tag">NextCloud</span></a>
830                                    <a href="/Posts?tag=bash"><span class="tag">bash</span></a>
831                                    <a href="/Posts?tag=shell"><span class="tag">shell</span></a>
832                                    <a href="/Posts?tag=backup"><span class="tag">backup</span></a>
833                            </span>
834                        </div>
835                            <a class="read-more" href="/Posts/backup-server-data-to-nextcloud">Full post &gt;</a>
836                    </div>
837            </article>
838            <article class="post-preview mycard">
839                <header>
840                    <h1 class="title"><a href="/Posts/caddy-server">Caddy server</a></h1>
841                </header>
842                <section class="content"><!-- md -->
843<p><a href="https://caddyserver.com/">Caddy</a> 是一个使用 Go 编写的高性能 HTTP 服务器软件。与 Nginx 相似,它主要作为静态网站服务器或反向代理运行。</p>
844</section>
845                    <div class="post-preview-footer">
846                        <div class="date-tags">
847                            <time class="date">2021-11-25</time>
848                            <span class="tags">
849                                    <a href="/Posts?tag=Linux"><span class="tag">Linux</span></a>
850                                    <a href="/Posts?tag=Tutorial"><span class="tag">Tutorial</span></a>
851                                    <a href="/Posts?tag=Caddy"><span class="tag">Caddy</span></a>
852                                    <a href="/Posts?tag=server"><span class="tag">server</span></a>
853                            </span>
854                        </div>
855                            <a class="read-more" href="/Posts/caddy-server">Full post &gt;</a>
856                    </div>
857            </article>
858            <article class="post-preview mycard">
859                <header>
860                    <h1 class="title"><a href="/Posts/btrfs-as-the-vm-disk-storage">&#x4F7F;&#x7528; Btrfs &#x4F5C;&#x4E3A;&#x865A;&#x62DF;&#x78C1;&#x76D8;&#x6587;&#x4EF6;&#x7684;&#x5E95;&#x5C42;&#x5B58;&#x50A8;</a></h1>
861                </header>
862                <section class="content"><!-- md -->
863<p>(2022-05-12 更新)</p>
864<p>将虚拟磁盘文件存储在 Btrfs 文件系统中具有几个优点:</p>
865<ul>
866<li>Btrfs 的数据透明压缩功能可以节省硬盘空间;</li>
867<li>Btrfs 的 reflink(共享数据块) 和 subvolume snapshot(子卷快照)可用于给虚拟磁盘创建快照;</li>
868<li>Btrfs 的 Copy-on-Write (CoW) transaction 机制和可保证虚拟磁盘文件的一致性,在大量随机写入时可以免除频繁的硬盘 flush 操作。</li>
869</ul>
870</section>
871                    <div class="post-preview-footer">
872                        <div class="date-tags">
873                            <time class="date">2021-05-28</time>
874                            <span class="tags">
875                                    <a href="/Posts?tag=Btrfs"><span class="tag">Btrfs</span></a>
876                                    <a href="/Posts?tag=Linux"><span class="tag">Linux</span></a>
877                                    <a href="/Posts?tag=libvirt"><span class="tag">
877libvirt</span></a>
878                                    <a href="/Posts?tag=QEMU"><span class="tag">QEMU</span></a>
879                                    <a href="/Posts?tag=Tutorial"><span class="tag">Tutorial</span></a>
880                            </span>
881                        </div>
882                            <a class="read-more" href="/Posts/btrfs-as-the-vm-disk-storage">Full post &gt;</a>
883                    </div>
884            </article>
885            <article class="post-preview mycard">
886                <header>
887                    <h1 class="title"><a href="/Posts/clone-arch-linux-to-other-devices">&#x5C06; Arch Linux &#x514B;&#x9686;&#x5230;&#x5176;&#x5B83;&#x5B58;&#x50A8;&#x8BBE;&#x5907;&#xFF08;&#x786C;&#x76D8; / U&#x76D8;&#xFF09;</a></h1>
888                </header>
889                <section class="content"><!-- md -->
890<p>假设系统安装在 Btrfs 的一个子卷中,并且没有单独的 <code>/boot</code>, <code>/home</code> 等分区。</p>
891<pre><code class="language-bash">$root_dev=/dev/sda2	# &quot;/&quot; 所在的块设备
892$root_subvol=@		# &quot;/&quot; 所在的 btrfs 子卷
893
894$target_dev=/dev/sdb2	# 目标块设备
895$target_esp=/dev/sdb1	# 目标 EFI 系统分区块设备
896</code></pre>
897</section>
898                    <div class="post-preview-footer">
899                        <div class="date-tags">
900                            <time class="date">2021-03-14</time>
901                            <span class="tags">
902                                    <a href="/Posts?tag=Linux"><span class="tag">Linux</span></a>
903                                    <a href="/Posts?tag=Tutorial"><span class="tag">Tutorial</span></a>
904                                    <a href="/Posts?tag=Arch Linux"><span class="tag">Arch Linux</span></a>
905                                    <a href="/Posts?tag=Btrfs"><span class="tag">Btrfs</span></a>
906                            </span>
907                        </div>
908                            <a class="read-more" href="/Posts/clone-arch-linux-to-other-devices">Full post &gt;</a>
909                    </div>
910            </article>
911            <article class="post-preview mycard">
912                <header>
913                    <h1 class="title"><a href="/Posts/tmux">tmux - &#x7EC8;&#x7AEF;&#x591A;&#x8DEF;&#x590D;&#x7528;&#x5668; / &#x5E94;&#x7528;&#x670D;&#x52A1;&#x7BA1;&#x7406;&#x5668;&#xFF08;&#x8BEF;&#xFF09;</a></h1>
914                </header>
915                <section class="content"><!-- md -->
916<p><code>tmux</code> 意为 terminal multiplexer (终端多路复用器),它允许用户在终端中使用多个虚拟终端,支持多会话、多窗口、布局等功能。</p>
917</section>
918                    <div class="post-preview-footer">
919                        <div class="date-tags">
920                            <time class="date">2021-03-14</time>
921                            <span class="tags">
922                                    <a href="/Posts?tag=Linux"><span class="tag">Linux</span></a>
923                                    <a href="/Posts?tag=Tutorial"><span class="tag">Tutorial</span></a>
924                                    <a href="/Posts?tag=server"><span class="tag">server</span></a>
925                                    <a href="/Posts?tag=tmux"><span class="tag">tmux</span></a>
926                            </span>
927                        </div>
928                            <a class="read-more" href="/Posts/tmux">Full post &gt;</a>
929                    </div>
930            </article>
931            <article class="post-preview mycard">
932                <header>
933                    <h1 class="title"><a href="/Posts/the-website-is-updated">&#x7F51;&#x7AD9;&#x66F4;&#x65B0;&#x4E86;&#xFF01;</a></h1>
934                </header>
935                <section class="content"><!-- md -->
936<p>(2022 年又双叒叕更新了:修改首页布局、添加 About 页面、添加代码高亮……)</p>
937<p>更新了网站样式(疯狂滥用卡片)。</p>
938<p>首页支持分页(其实并不是分“页”,参数是 post id 而不是页数)。</p>
939<p>后端代码太菜了。前端部分没有混淆,按 F12 就能看到。</p>
940<p>因为此网站基于 ASP.NET Core 默认模板,所以<ruby>自<rt>diu</rt></ruby><ruby>豪<rt>ren</rt></ruby>地使用了 jQuery 和 Bootstrap,以后也许会把这两个依赖去掉……</p>
941</section>
942                    <div class="post-preview-footer">
943                        <div class="date-tags">
944                            <time class="date">2020-09-22</time>
945                            <span class="tags">
946                                    <a href="/Posts?tag=Yuuza.net"><span class="tag">Yuuza.net</span></a>
947                                    <a href="/Posts?tag=&#x524D;&#x7AEF;"><span class="tag">&#x524D;&#x7AEF;</span></a>
948                            </span>
949                        </div>
950                    </div>
951            </article>
952        <div class="px-0 my-1 text-end d-flex">
953            <div class="col-4 px-0 text-start">
954            </div>
955            <div class="col-4 text-center">
956                <a class="btn btn-link" href="/Posts">List</a>
957            </div>
958            <div class="col-4 px-0 text-end">
959                    <a class="btn btn-link" href="?after=8">Older &gt;</a>
960            </div>
961        </div>
962    </div>
963<div class="home-bg">
964    <div class="home-bg-thumb"></div>
965    <div class="home-bg-full"></div>
966</div>
967
968<div class="home-intro-box">
969    <div class="inner-relative">
970        <div class="home-bg-info" hidden>
971            <a href="javascript:reloadHomeBg()">[RANDOM]</a>
972            <!-- <a target="_blank" id="home-bg-info-file">[FILE]</a> -->
973            <a target="_blank" id="home-bg-info-title"></a>
974            <!-- by <a target="_blank" href="https://github.com/lideming/random_anime_wallpaper">random_anime_wallpaper</a> -->
975        </div>
976    </div>
977</div>
978
979<script>
980    document.body.insertBefore(document.querySelector('.home-bg'), document.body.firstChild);
981    document.body.insertBefore(document.querySelector('.home-intro-box'), document.body.firstChild);
982</script>
982
983
984<div class="sidebar col-12 col-md-3 order-0 order-md-2">
985    <div class="sidebar-sticky">
986        <div class="sidebar-block sidebar-info mycard mb-3 p-2">
987            <h3>Me</h3>
988            <div class="sidebar-info-avatar">
989                <img class="avatar" src="data:image/jpeg;base64,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" alt="avatar">
990            </div>
991            <div class="sidebar-info-content">
992                <h4 class="name"><a href="/about" style="color: inherit">lideming<br/>at Yuuza.net</a></h4>
993                <div class="links">
994                    <a href="https://github.com/lideming"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"
995                            fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
996                            <path
997                                d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z" />
998                        </svg> GitHub</a><a id="feed-blog-link" href="/Posts/atom.xml"><svg version="1.1" id="Layer_1"
999                            xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
1000                            y="0px" width="16" height="16" viewB
1000ox="0 0 291.319 291.319"
1001                            style="enable-background:new 0 0 291.319 291.319;" xml:space="preserve">
1002                            <g>
1003                                <path style="fill:#F4B459;" d="M145.659,0c80.44,0,145.66,65.219,145.66,145.66c0,80.45-65.219,145.659-145.66,145.659
1004		S0,226.109,0,145.66C0,65.219,65.21,0,145.659,0z" />
1005                                <path style="fill:#FFFFFF;" d="M109.254,163.831c-10.06,0-18.226,8.157-18.226,18.226s8.157,18.226,18.226,18.226
1006		s18.226-8.157,18.226-18.226S119.322,163.831,109.254,163.831z M103.873,118.367c-7.074,0-12.8,5.726-12.8,12.8
1007		c0,7.064,5.726,12.8,12.8,12.8c23.997,0,43.525,19.527,43.525,43.525c0,7.064,5.726,12.8,12.809,12.8c7.055,0,12.8-5.735,12.8-12.8
1008		C173.007,149.374,141.991,118.367,103.873,118.367z M104.119,72.839c-7.228,0-13.091,5.863-13.091,13.091
1009		s5.863,13.091,13.091,13.091c48.623,0,88.188,39.556,88.188,88.179c0,7.228,5.854,13.091,13.091,13.091s13.091-5.872,13.091-13.091
1010		C218.48,124.138,167.172,72.839,104.119,72.839z" />
1011                        </svg> <span id="feed-blog-text">Feed</span></a>
1012                </div>
1013            </div>
1014        </div>
1015
1016        <div class="sidebar-block sidebar-links mycard mb-3 p-2 px-3" id="links-friends">
1017            <h3>Links</h3>
1018            <p>
1019                <a href="https://www.z233.me/" target="_blank">Fronz</a>
1020                <span class="friend-note">前端大佬</span>
1021            </p>
1022            <p>
1023                <a href="https://gavin.gong.host/" target="_blank">VisualDust</a>
1024                <span class="friend-note">美国萝莉 AI 博士</span></a>
1025            </p>
1026            <p>
1027                <a href="https://dsstudio.tech/" target="_blank">豆沙工作室</a>
1028                <span class="friend-note">全栈大佬</span></a>
1029            </p>
1030            <p>
1031                <a href="https://blog.therainisme.com/" target="_blank">Therainisme</a>
1032                <span class="friend-note">转专业保研大佬</span></a>
1033            </p>
1034            <p>
1035                <a href="https://memo.xiee.ltd/" target="_blank">PommesPeter</a>
1036                <span class="friend-note">深度炼丹保研大佬</span></a>
1037            </p>
1038        </div>
1039
1040        
1040<script>
1041            Array.from(document.querySelectorAll('#links-friends p'))
1042  .map(x => [x, Math.random()])
1043  .sort((a, b) => a[1] - b[1])
1044  .forEach(x => {
1045    document.getElementById('links-friends').appendChild(x[0]);
1046  });
1047        </script>
1047
1048
1049        <div class="sidebar-block sidebar-links mycard mb-3 p-2 px-3">
1050            <h3>Stuffs</h3>
1051            <p><a href="https://csd.moe/" target="_blank">GUET 校基地软件部</a></p>
1052            <p><a href="https://gh.yuuza.net/" target="_blank">Yuuza ToolBox (EN only)</a></p>
1053            <p><a href="https://mc.yuuza.net/" target="_blank">MusicCloud</a></p>
1054            <p><a href="https://md.yuuza.net/index" target="_blank">Markdown Docs</a></p>
1055            <!-- <p><a href="https://id.yuuza.net/auth/realms/master/account/" target="_blank">Yuuza ID Profile</a></p> -->
1056            <p><a href="https://track.yuuza.net/" target="_blank">Track</a></p>
1057            <!-- <p><a href="https://gobang.yuuza.net/" target="_blank">Gobang</a></p> -->
1058        </div>
1059
1060        
1060<script>
1061            initHomeIntro();
1062        </script>
1062
1063        
1063<script>
1064            function initFpsCounter() {
1065                const dom = document.createElement('div');
1066                dom.style = "position: fixed; right: 10px; bottom: 10px; background: white; transition: all .3s";
1067                document.body.appendChild(dom);
1068
1069                let lastTime = 0;
1070
1071                const frameCallback = (time) => {
1072                    const frameTime = time - lastTime;
1073                    if (lastTime) {
1074                        //dom.textContent = frameTime.toFixed(1) + ' ms';
1075                    }
1076                    lastTime = time;
1077                    requestAnimationFrame(frameCallback);
1078                };
1079                requestAnimationFrame(frameCallback);
1080            }
1081        </script>
1081
1082
1083        <div class="sidebar-block sidebar-extra mycard mb-3 p-2 px-3">
1084            <h3>Network</h3>
1085            <iframe src="https://ip.skk.moe/simple" style="width: 100%; border: 0; margin-top: 10px; height: 300px;"></iframe>
1086            <small style="color: gray; font-size: 10px;">显示不出来?可能你的 IP 被 CloudFlare 标记了</small>
1087        </div>
1088    </div>
1089    <style>
1090        .subpage {
1091            display: block;
1092            position: fixed;
1093            top: 0;
1094            left: 0;
1095            bottom: 0;
1096            right: 0;
1097            z-index: 10000;
1098        }
1099    </style>
1100    
1100<script>
1101        document.body.addEventListener('click', (e) => {
1102            const target = e.target;
1103            if (target.href, false) {
1104                e.preventDefault();
1105                const container = document.createElement('div');
1106                container.className = 'subpage';
1107                const iframe = document.createElement('iframe');
1108                iframe.src = target.href;
1109                iframe.style = 'width: 100%; height: 100%;';
1110                container.appendChild(iframe);
1111                document.body.appendChild(container);
1112            }
1113        }, true);
1114    </script>
1114
1115</div></div>
1116
1117        </main>
1118
1119    <footer class="border-top footer text-muted">
1120        <div class="container-xl">
1121            <span class="item">&copy; 2026 - Yuuza - <a href="/Home/Privacy">Privacy</a></span>
1122            <span class="item">- <a href="http://beian.miit.gov.cn/" target="_blank">桂ICP备19010850号-1</a></span>
1123            <span class="item">- Uptime: 161 days 7 hrs</span>
1124            <span class="item">- Powered by .NET 8</span>
1125        </div>
1126    </footer>
1127    
1128</body>
1129</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.