// ==UserScript==
// @name Twitter/X Media Batch Downloader Pro
// @name:zh Twitter 媒体批量下载器 Pro
// @name:ja Twitter メディア一括ダウンローダー Pro
// @description Download all images and videos from any Twitter/X account, including withheld accounts, in original quality — with just one click.
// @description:zh 从任何 Twitter/X 帐号(包括受限制的帐号)一键下载所有图片和视频,保持原始画质。
// @description:ja Twitter/X のあらゆるアカウント(制限付きアカウントを含む)から、すべての画像と動画をワンクリックで元の画質のままダウンロード。
// @antifeature payment Unlock access to the Twitter/X Media Batch Downloader Pro script by becoming a paid member! Join the membership to receive your Patreon auth code.
// @icon data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyOC4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MTIgNTEyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDojRkNBMzExO30NCjwvc3R5bGU+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjg4LjUsMjI5LjlsMTM4LjIsMTk2LjhIMzI1bC05My4xLTEzMi41TDExNS40LDQyNi43SDg1LjNsMTMzLjMtMTUxLjZMODUuMyw4NS4zSDE4N2w4OC4xLDEyNS41TDM4NS41LDg1LjMNCgloMzAuMUwyODguNSwyMjkuOXogTTM4NS41LDQwNS41TDI3Mi44LDI0Ny44bC0xMy41LTE4LjlsLTg2LjctMTIxLjNoLTQ2LjNsMTA3LjQsMTUwLjNsMTMuNSwxOC45bDkxLjksMTI4LjhIMzg1LjV6Ii8+DQo8Zz4NCgk8cGF0aCBkPSJNNDkwLjcsNjAuNnYzOTAuOGMwLDIxLjctMTcuNiwzOS4zLTM5LjMsMzkuM0g2MC42Yy0yMS43LDAtMzkuMy0xNy42LTM5LjMtMzkuM1Y2MC42YzAtMjEuNywxNy42LTM5LjMsMzkuMy0zOS4zaDM5MC44DQoJCUM0NzMuMSwyMS4zLDQ5MC43LDM4LjksNDkwLjcsNjAuNnogTTQyNi43LDQyNi43TDI4OC41LDIyOS45TDQxNS42LDg1LjNoLTMwLjFMMjc1LjEsMjEwLjhMMTg3LDg1LjNIODUuM2wxMzMuMywxODkuOEw4NS4zLDQyNi43DQoJCWgzMC4xbDExNi41LTEzMi41TDMyNSw0MjYuN0g0MjYuN3oiLz4NCgk8cG9seWdvbiBwb2ludHM9IjI3Mi44LDI0Ny44IDM4NS41LDQwNS41IDMzOS4yLDQwNS41IDI0Ny4zLDI3Ni44IDIzMy43LDI1Ny45IDEyNi4zLDEwNy41IDE3Mi42LDEwNy41IDI1OS4zLDIyOC45IAkiLz4NCjwvZz4NCjwvc3ZnPg0K
// @namespace https://xbatch.online
// @supportURL https://www.patreon.com/exyezed
// @homepageURL https://www.patreon.com/exyezed
// @version 1.0.2
// @author exyezed
// @license MIT
// @match *://twitter.com/*
// @match *://x.com/*
// @require https://cdn.jsdelivr.net/npm/[email protected]/dayjs.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/dexie.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/FileSaver.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/i18next.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/preact.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/hooks/dist/hooks.umd.js
// @require https://cdn.jsdelivr.net/npm/@preact/[email protected]/dist/signals-core.min.js
// @require https://cdn.jsdelivr.net/npm/@preact/[email protected]/dist/signals.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/umd/index.min.js
// @connect api.xbatch.online
// @connect alt.xbatch.online
// @grant GM_xmlhttpRequest
// @grant unsafeWindow
// @run-at document-start
// ==/UserScript==
(function (preact, signals, hooks, i18next, dayjs, Dexie, fileSaverEs, fflate) {
'use strict';
var f = 0;
function u(e, t, n, o, i, u2) {
t || (t = {});
var a, c, p = t;
if ("ref" in p) for (c in p = {}, t) "ref" == c ? a = t[c] : p[c] = t[c];
var l = { type: e, props: p, key: n, ref: a, __k: null, __: null, __b: 0, __e: null, __c: null, constructor: void 0, __v: --f, __i: -1, __u: 0, __source: i, __self: u2 };
if ("function" == typeof e && (a = e.defaultProps)) for (c in a) void 0 === p[c] && (p[c] = a[c]);
return preact.options.vnode && preact.options.vnode(l), l;
}
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var defaultAttributes = {
outline: {
xmlns: "http://www.w3.org/2000/svg",
width: 24,
height: 24,
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
"stroke-width": 2,
"stroke-linecap": "round",
"stroke-linejoin": "round"
},
filled: {
xmlns: "http://www.w3.org/2000/svg",
width: 24,
height: 24,
viewBox: "0 0 24 24",
fill: "currentColor",
stroke: "none"
}
};
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
const createPreactComponent = (type, iconName, iconNamePascal, iconNode) => {
const Component2 = ({
color = "currentColor",
size = 24,
stroke = 2,
title,
children,
className = "",
class: classes = "",
style,
...rest
}) => preact.h(
"svg",
{
...defaultAttributes[type],
width: String(size),
height: String(size),
class: [`tabler-icon`, `tabler-icon-${iconName}`, classes, className].join(" "),
...type === "filled" ? {
fill: color
} : {
"stroke-width": stroke,
stroke: color
},
style,
...rest
},
[
title && preact.h("title", {}, title),
...iconNode.map(([tag, attrs]) => preact.h(tag, attrs)),
...preact.toChildArray(children)
]
);
Component2.displayName = `${iconNamePascal}`;
return Component2;
};
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconAlertTriangle = createPreactComponent("outline", "alert-triangle", "AlertTriangle", [["path", { "d": "M12 9v4", "key": "svg-0" }], ["path", { "d": "M10.363 3.591l-8.106 13.534a1.914 1.914 0 0 0 1.636 2.871h16.214a1.914 1.914 0 0 0 1.636 -2.87l-8.106 -13.536a1.914 1.914 0 0 0 -3.274 0z", "key": "svg-1" }], ["path", { "d": "M12 16h.01", "key": "svg-2" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconBook = createPreactComponent("outline", "book", "Book", [["path", { "d": "M3 19a9 9 0 0 1 9 0a9 9 0 0 1 9 0", "key": "svg-0" }], ["path", { "d": "M3 6a9 9 0 0 1 9 0a9 9 0 0 1 9 0", "key": "svg-1" }], ["path", { "d": "M3 6l0 13", "key": "svg-2" }], ["path", { "d": "M12 6l0 13", "key": "svg-3" }], ["path", { "d": "M21 6l0 13", "key": "svg-4" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconBrandChrome = createPreactComponent("outline", "brand-chrome", "BrandChrome", [["path", { "d": "M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0", "key": "svg-0" }], ["path", { "d": "M12 12m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0", "key": "svg-1" }], ["path", { "d": "M12 9h8.4", "key": "svg-2" }], ["path", { "d": "M14.598 13.5l-4.2 7.275", "key": "svg-3" }], ["path", { "d": "M9.402 13.5l-4.2 -7.275", "key": "svg-4" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconBrandPatreon = createPreactComponent("outline", "brand-patreon", "BrandPatreon", [["path", { "d": "M20 8.408c-.003 -2.299 -1.746 -4.182 -3.79 -4.862c-2.54 -.844 -5.888 -.722 -8.312 .453c-2.939 1.425 -3.862 4.545 -3.896 7.656c-.028 2.559 .22 9.297 3.92 9.345c2.75 .036 3.159 -3.603 4.43 -5.356c.906 -1.247 2.071 -1.599 3.506 -1.963c2.465 -.627 4.146 -2.626 4.142 -5.273z", "key": "svg-0" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconBrandTwitter = createPreactComponent("outline", "brand-twitter", "BrandTwitter", [["path", { "d": "M22 4.01c-1 .49 -1.98 .689 -3 .99c-1.121 -1.265 -2.783 -1.335 -4.38 -.737s-2.643 2.06 -2.62 3.737v1c-3.245 .083 -6.135 -1.395 -8 -4c0 0 -4.182 7.433 4 11c-1.872 1.247 -3.739 2.088 -6 2c3.308 1.803 6.913 2.423 10.034 1.517c3.58 -1.04 6.522 -3.723 7.651 -7.742a13.84 13.84 0 0 0 .497 -3.753c0 -.249 1.51 -2.772 1.818 -4.013z", "key": "svg-0" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconChevronLeft = createPreactComponent("outline", "chevron-left", "ChevronLeft", [["path", { "d": "M15 6l-6 6l6 6", "key": "svg-0" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconChevronRight = createPreactComponent("outline", "chevron-right", "ChevronRight", [["path", { "d": "M9 6l6 6l-6 6", "key": "svg-0" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconCircleCheck = createPreactComponent("outline", "circle-check", "CircleCheck", [["path", { "d": "M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0", "key": "svg-0" }], ["path", { "d": "M9 12l2 2l4 -4", "key": "svg-1" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconCircleX = createPreactComponent("outline", "circle-x", "CircleX", [["path", { "d": "M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0", "key": "svg-0" }], ["path", { "d": "M10 10l4 4m0 -4l-4 4", "key": "svg-1" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconCloudDown = createPreactComponent("outline", "cloud-down", "CloudDown", [["path", { "d": "M12 18.004h-5.343c-2.572 -.004 -4.657 -2.011 -4.657 -4.487c0 -2.475 2.085 -4.482 4.657 -4.482c.393 -1.762 1.794 -3.2 3.675 -3.773c1.88 -.572 3.956 -.193 5.444 1c1.488 1.19 2.162 3.007 1.77 4.769h.99c1.38 0 2.573 .813 3.13 1.99", "key": "svg-0" }], ["path", { "d": "M19 16v6", "key": "svg-1" }], ["path", { "d": "M22 19l-3 3l-3 -3", "key": "svg-2" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconCloudUp = createPreactComponent("outline", "cloud-up", "CloudUp", [["path", { "d": "M12 18.004h-5.343c-2.572 -.004 -4.657 -2.011 -4.657 -4.487c0 -2.475 2.085 -4.482 4.657 -4.482c.393 -1.762 1.794 -3.2 3.675 -3.773c1.88 -.572 3.956 -.193 5.444 1c1.488 1.19 2.162 3.007 1.77 4.769h.99c1.38 0 2.57 .811 3.128 1.986", "key": "svg-0" }], ["path", { "d": "M19 22v-6", "key": "svg-1" }], ["path", { "d": "M22 19l-3 -3l-3 3", "key": "svg-2" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconDatabaseExport = createPreactComponent("outline", "database-export", "DatabaseExport", [["path", { "d": "M4 6c0 1.657 3.582 3 8 3s8 -1.343 8 -3s-3.582 -3 -8 -3s-8 1.343 -8 3", "key": "svg-0" }], ["path", { "d": "M4 6v6c0 1.657 3.582 3 8 3c1.118 0 2.183 -.086 3.15 -.241", "key": "svg-1" }], ["path", { "d": "M20 12v-6", "key": "svg-2" }], ["path", { "d": "M4 12v6c0 1.657 3.582 3 8 3c.157 0 .312 -.002 .466 -.005", "key": "svg-3" }], ["path", { "d": "M16 19h6", "key": "svg-4" }], ["path", { "d": "M19 16l3 3l-3 3", "key": "svg-5" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconDatabaseImport = createPreactComponent("outline", "database-import", "DatabaseImport", [["path", { "d": "M4 6c0 1.657 3.582 3 8 3s8 -1.343 8 -3s-3.582 -3 -8 -3s-8 1.343 -8 3", "key": "svg-0" }], ["path", { "d": "M4 6v6c0 1.657 3.582 3 8 3c.856 0 1.68 -.05 2.454 -.144m5.546 -2.856v-6", "key": "svg-1" }], ["path", { "d": "M4 12v6c0 1.657 3.582 3 8 3c.171 0 .341 -.002 .51 -.006", "key": "svg-2" }], ["path", { "d": "M19 22v-6", "key": "svg-3" }], ["path", { "d": "M22 19l-3 -3l-3 3", "key": "svg-4" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconDatabaseSearch = createPreactComponent("outline", "database-search", "DatabaseSearch", [["path", { "d": "M4 6c0 1.657 3.582 3 8 3s8 -1.343 8 -3s-3.582 -3 -8 -3s-8 1.343 -8 3", "key": "svg-0" }], ["path", { "d": "M4 6v6c0 1.657 3.582 3 8 3m8 -3.5v-5.5", "key": "svg-1" }], ["path", { "d": "M4 12v6c0 1.657 3.582 3 8 3", "key": "svg-2" }], ["path", { "d": "M18 18m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0", "key": "svg-3" }], ["path", { "d": "M20.2 20.2l1.8 1.8", "key": "svg-4" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconDatabaseX = createPreactComponent("outline", "database-x", "DatabaseX", [["path", { "d": "M4 6c0 1.657 3.582 3 8 3s8 -1.343 8 -3s-3.582 -3 -8 -3s-8 1.343 -8 3", "key": "svg-0" }], ["path", { "d": "M4 6v6c0 1.657 3.582 3 8 3c.537 0 1.062 -.02 1.57 -.058", "key": "svg-1" }], ["path", { "d": "M20 13.5v-7.5", "key": "svg-2" }], ["path", { "d": "M4 12v6c0 1.657 3.582 3 8 3c.384 0 .762 -.01 1.132 -.03", "key": "svg-3" }], ["path", { "d": "M22 22l-5 -5", "key": "svg-4" }], ["path", { "d": "M17 22l5 -5", "key": "svg-5" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconDatabase = createPreactComponent("outline", "database", "Database", [["path", { "d": "M12 6m-8 0a8 3 0 1 0 16 0a8 3 0 1 0 -16 0", "key": "svg-0" }], ["path", { "d": "M4 6v6a8 3 0 0 0 16 0v-6", "key": "svg-1" }], ["path", { "d": "M4 12v6a8 3 0 0 0 16 0v-6", "key": "svg-2" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconDownload = createPreactComponent("outline", "download", "Download", [["path", { "d": "M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2", "key": "svg-0" }], ["path", { "d": "M7 11l5 5l5 -5", "key": "svg-1" }], ["path", { "d": "M12 4l0 12", "key": "svg-2" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconExclamationCircle = createPreactComponent("outline", "exclamation-circle", "ExclamationCircle", [["path", { "d": "M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0", "key": "svg-0" }], ["path", { "d": "M12 9v4", "key": "svg-1" }], ["path", { "d": "M12 16v.01", "key": "svg-2" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconExternalLink = createPreactComponent("outline", "external-link", "ExternalLink", [["path", { "d": "M12 6h-6a2 2 0 0 0 -2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-6", "key": "svg-0" }], ["path", { "d": "M11 13l9 -9", "key": "svg-1" }], ["path", { "d": "M15 4h5v5", "key": "svg-2" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconEyeOff = createPreactComponent("outline", "eye-off", "EyeOff", [["path", { "d": "M10.585 10.587a2 2 0 0 0 2.829 2.828", "key": "svg-0" }], ["path", { "d": "M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87", "key": "svg-1" }], ["path", { "d": "M3 3l18 18", "key": "svg-2" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconEye = createPreactComponent("outline", "eye", "Eye", [["path", { "d": "M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0", "key": "svg-0" }], ["path", { "d": "M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6", "key": "svg-1" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconFileCode = createPreactComponent("outline", "file-code", "FileCode", [["path", { "d": "M14 3v4a1 1 0 0 0 1 1h4", "key": "svg-0" }], ["path", { "d": "M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z", "key": "svg-1" }], ["path", { "d": "M10 13l-1 2l1 2", "key": "svg-2" }], ["path", { "d": "M14 13l1 2l-1 2", "key": "svg-3" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconFileDownload = createPreactComponent("outline", "file-download", "FileDownload", [["path", { "d": "M14 3v4a1 1 0 0 0 1 1h4", "key": "svg-0" }], ["path", { "d": "M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z", "key": "svg-1" }], ["path", { "d": "M12 17v-6", "key": "svg-2" }], ["path", { "d": "M9.5 14.5l2.5 2.5l2.5 -2.5", "key": "svg-3" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconGif = createPreactComponent("outline", "gif", "Gif", [["path", { "d": "M8 8h-2a2 2 0 0 0 -2 2v4a2 2 0 0 0 2 2h2v-4h-1", "key": "svg-0" }], ["path", { "d": "M12 8v8", "key": "svg-1" }], ["path", { "d": "M16 12h3", "key": "svg-2" }], ["path", { "d": "M20 8h-4v8", "key": "svg-3" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconInfoCircle = createPreactComponent("outline", "info-circle", "InfoCircle", [["path", { "d": "M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0", "key": "svg-0" }], ["path", { "d": "M12 9h.01", "key": "svg-1" }], ["path", { "d": "M11 12h1v4h1", "key": "svg-2" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconLibraryPhoto = createPreactComponent("outline", "library-photo", "LibraryPhoto", [["path", { "d": "M7 3m0 2.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667z", "key": "svg-0" }], ["path", { "d": "M4.012 7.26a2.005 2.005 0 0 0 -1.012 1.737v10c0 1.1 .9 2 2 2h10c.75 0 1.158 -.385 1.5 -1", "key": "svg-1" }], ["path", { "d": "M17 7h.01", "key": "svg-2" }], ["path", { "d": "M7 13l3.644 -3.644a1.21 1.21 0 0 1 1.712 0l3.644 3.644", "key": "svg-3" }], ["path", { "d": "M15 12l1.644 -1.644a1.21 1.21 0 0 1 1.712 0l2.644 2.644", "key": "svg-4" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconPhotoEdit = createPreactComponent("outline", "photo-edit", "PhotoEdit", [["path", { "d": "M15 8h.01", "key": "svg-0" }], ["path", { "d": "M11 20h-4a3 3 0 0 1 -3 -3v-10a3 3 0 0 1 3 -3h10a3 3 0 0 1 3 3v4", "key": "svg-1" }], ["path", { "d": "M4 15l4 -4c.928 -.893 2.072 -.893 3 0l3 3", "key": "svg-2" }], ["path", { "d": "M14 14l1 -1c.31 -.298 .644 -.497 .987 -.596", "key": "svg-3" }], ["path", { "d": "M18.42 15.61a2.1 2.1 0 0 1 2.97 2.97l-3.39 3.42h-3v-3l3.42 -3.39z", "key": "svg-4" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconPhoto = createPreactComponent("outline", "photo", "Photo", [["path", { "d": "M15 8h.01", "key": "svg-0" }], ["path", { "d": "M3 6a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v12a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3v-12z", "key": "svg-1" }], ["path", { "d": "M3 16l5 -5c.928 -.893 2.072 -.893 3 0l5 5", "key": "svg-2" }], ["path", { "d": "M14 14l1 -1c.928 -.893 2.072 -.893 3 0l3 3", "key": "svg-3" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconPlayerPlay = createPreactComponent("outline", "player-play", "PlayerPlay", [["path", { "d": "M7 4v16l13 -8z", "key": "svg-0" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconPlayerStop = createPreactComponent("outline", "player-stop", "PlayerStop", [["path", { "d": "M5 5m0 2a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2z", "key": "svg-0" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconRestore = createPreactComponent("outline", "restore", "Restore", [["path", { "d": "M3.06 13a9 9 0 1 0 .49 -4.087", "key": "svg-0" }], ["path", { "d": "M3 4.001v5h5", "key": "svg-1" }], ["path", { "d": "M12 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0", "key": "svg-2" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconSettings = createPreactComponent("outline", "settings", "Settings", [["path", { "d": "M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065z", "key": "svg-0" }], ["path", { "d": "M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0", "key": "svg-1" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconStack2 = createPreactComponent("outline", "stack-2", "Stack2", [["path", { "d": "M12 4l-8 4l8 4l8 -4l-8 -4", "key": "svg-0" }], ["path", { "d": "M4 12l8 4l8 -4", "key": "svg-1" }], ["path", { "d": "M4 16l8 4l8 -4", "key": "svg-2" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconTrash = createPreactComponent("outline", "trash", "Trash", [["path", { "d": "M4 7l16 0", "key": "svg-0" }], ["path", { "d": "M10 11l0 6", "key": "svg-1" }], ["path", { "d": "M14 11l0 6", "key": "svg-2" }], ["path", { "d": "M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12", "key": "svg-3" }], ["path", { "d": "M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3", "key": "svg-4" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconVideo = createPreactComponent("outline", "video", "Video", [["path", { "d": "M15 10l4.553 -2.276a1 1 0 0 1 1.447 .894v6.764a1 1 0 0 1 -1.447 .894l-4.553 -2.276v-4z", "key": "svg-0" }], ["path", { "d": "M3 6m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z", "key": "svg-1" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconWorld = createPreactComponent("outline", "world", "World", [["path", { "d": "M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0", "key": "svg-0" }], ["path", { "d": "M3.6 9h16.8", "key": "svg-1" }], ["path", { "d": "M3.6 15h16.8", "key": "svg-2" }], ["path", { "d": "M11.5 3a17 17 0 0 0 0 18", "key": "svg-3" }], ["path", { "d": "M12.5 3a17 17 0 0 1 0 18", "key": "svg-4" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconWriting = createPreactComponent("outline", "writing", "Writing", [["path", { "d": "M20 17v-12c0 -1.121 -.879 -2 -2 -2s-2 .879 -2 2v12l2 2l2 -2z", "key": "svg-0" }], ["path", { "d": "M16 7h4", "key": "svg-1" }], ["path", { "d": "M18 19h-13a2 2 0 1 1 0 -4h4a2 2 0 1 0 0 -4h-3", "key": "svg-2" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconX = createPreactComponent("outline", "x", "X", [["path", { "d": "M18 6l-12 12", "key": "svg-0" }], ["path", { "d": "M6 6l12 12", "key": "svg-1" }]]);
/**
* @license @tabler/icons-preact v3.35.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/
var IconUserFilled = createPreactComponent("filled", "user-filled", "UserFilled", [["path", { "d": "M12 2a5 5 0 1 1 -5 5l.005 -.217a5 5 0 0 1 4.995 -4.783z", "key": "svg-0" }], ["path", { "d": "M14 14a5 5 0 0 1 5 5v1a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-1a5 5 0 0 1 5 -5h4z", "key": "svg-1" }]]);
const ar = { "common": { "Settings": "الإعدادات", "Theme": "السمة", "Change Theme": "تغيير السمة", "Language": "اللغة", "Change Language": "تغيير اللغة", "Date Time Format": "تنسيق التاريخ والوقت", "Debug": "تشخيص الأخطاء", "Global Settings": "الإعدادات العامة", "Version": "الإصدار", "Common Formats:": "التنسيقات الشائعة:", "Date Formats:": "تنسيقات التاريخ:", "Time Formats:": "تنسيقات الوقت:", "Combined Examples:": "أمثلة مجمعة:", "Localized": "محلي", "Reset Settings": "إعادة تعيين الإعدادات", "Are you sure you want to reset settings to defaults?": "هل أنت متأكد من إعادة تعيين الإعدادات إلى القيم الافتراضية؟", "Reset": "إعادة تعيين", "Cancel": "إلغاء", "Chrome": "Chrome", "Userscript": "سكريبت المستخدم", "Website": "الموقع", "Patreon": "Patreon", "Dashboard": "لوحة المراقبة", "Database": "قاعدة البيانات", "Auth": "المصادقة", "Convert Animated GIFs": "تحويل GIF", "Convert GIFs (External)": "تحويل GIF (خارجي)", "Concurrent Downloads": "التنزيلات المتزامنة", "Use 10+ only with fast internet": "استخدم 10+ فقط مع إنترنت سريع", "Smaller size, same quality": "حجم أصغر، نفس الجودة", "Larger size, same quality": "حجم أكبر، نفس الجودة", "Back": "العودة", "Please visit a profile page for auto-detection": "يرجى زيارة صفحة ملف شخصي للاكتشاف التلقائي", "Please configure authentication in the Auth tab first": "يرجى تكوين المصادقة في علامة تبويب المصادقة أولاً", "Invalid username format": "تنسيق اسم المستخدم غير صحيح", "Invalid auth token. Please check your settings.": "رمز المصادقة غير صحيح. يرجى التحقق من إعداداتك.", "Invalid Patreon auth. Please check your settings.": "مصادقة Patreon غير صحيحة. يرجى التحقق من إعداداتك.", "Failed to fetch data": "فشل في جلب البيانات", "Failed to fetch data from all APIs": "فشل جلب البيانات من جميع واجهات برمجة التطبيقات", "Failed to verify auth from all APIs": "فشل التحقق من المصادقة من جميع واجهات برمجة التطبيقات", "Failed to generate token from all APIs": "فشل إنشاء الرمز من جميع واجهات برمجة التطبيقات", "Generating token...": "جارٍ إنشاء الرمز...", "Abort": "إحباط", "Network error occurred": "حدث خطأ في الشبكة", "Request timeout - please try again": "انتهت مهلة الطلب - يرجى المحاولة مرة أخرى", "Failed to parse API response": "فشل تحليل استجابة واجهة برمجة التطبيقات", "Invalid API response structure": "بنية استجابة واجهة برمجة التطبيقات غير صالحة", "Unknown error occurred": "حدث خطأ غير معروف", "HTTP error! status: {{status}}": "خطأ HTTP! الحالة: {{status}}", "Download already in progress": "عملية التنزيل قيد التنفيذ بالفعل", "No media files found": "لم يتم العثور على ملفات وسائط", "Toggle visibility": "إظهار/إخفاء", "Close": "إغلاق", "Converting GIFs...": "...تحويل صور GIF", "Downloading...": "تحميل...", "Download": "تحميل", "Fetching...": "...جارٍ الجلب", "Fetch All": "جلب الكل", "Fetch Video": "جلب الفيديو", "Fetch Image": "جلب الصورة", "Fetch GIF": "جلب GIF", "Posts: {{posts}}": "المنشورات: {{posts}}", "Media: {{media}}": "الوسائط: {{media}}", "Current Media: {{current}} • Total Media: {{total}}": "الوسائط الحالية: {{current}} • إجمالي الوسائط: {{total}}", "Failed to download media": "فشل في تحميل الوسائط", "Demo mode is only available for @xbatchdemo": "وضع العرض التجريبي متاح فقط لـ @xbatchdemo", "Auth Token": "رمز المصادقة", "Enter your auth token": "أدخل رمز المصادقة الخاص بك", "Your authentication token for API access": "رمز المصادقة الخاص بك للوصول إلى API", "Patreon Auth": "مصادقة Patreon", "Enter your Patreon auth": "أدخل مصادقة Patreon الخاصة بك", "Your Patreon authentication key": "مفتاح مصادقة Patreon الخاص بك", "Please enter Patreon auth first": "يرجى إدخال مصادقة Patreon أولاً", "Please verify Patreon auth first": "يرجى التحقق من مصادقة Patreon أولاً", "Patreon auth verified successfully": "تم التحقق من مصادقة Patreon بنجاح", "Invalid Patreon auth": "مصادقة Patreon غير صحيحة", "Verification failed. Please try again": "فشل التحقق. يرجى المحاولة مرة أخرى", "Generating": "إنشاء", "Generate": "إنشاء", "Verify": "التحقق", "Token generated successfully": "تم إنشاء الرمز بنجاح ({{current}}/{{total}})", "Failed to generate token": "فشل في إنشاء الرمز", "Token generation failed. Please try again": "فشل إنشاء الرمز. يرجى المحاولة مرة أخرى", "Verifying": "التحقق", "Verified": "تم التحقق", "Use code": "استخدم الرمز", "for Patreon Auth, click Verify to unlock demo. Test at": 'لمصادقة Patreon، انقر "التحقق" لفتح العرض التجريبي. جرّب في', "Need help with Auth Token? See": "بحاجة إلى مساعدة بخصوص رمز المصادقة؟ راجع", "the guide": "الدليل", "Subscribe": "اشترك", "to get your Patreon Auth code and start downloading with ease!": "للحصول على رمز مصادقة Patreon والبدء في التنزيل بسهولة!", "Report bugs or request features:": "أبلغ عن الأخطاء أو اطلب الميزات:", "Import": "استيراد", "Importing...": "...استيراد", "Supports JSON and ZIP formats": "يدعم تنسيقات JSON و ZIP", "Export": "تصدير", "Export All Data": "تصدير كل البيانات", "Exporting...": "...تصدير", "Clear": "مسح", "Filter by Batch": "تصفية حسب الدفعات", "Are you sure to clear all data in the database?": "هل أنت متأكد من مسح جميع البيانات في قاعدة البيانات؟", "Delete Account Data": "حذف بيانات الحساب", "Are you sure you want to delete account data? This action cannot be undone": "هل أنت متأكد من حذف بيانات {{username}}؟ لا يمكن التراجع عن هذا الإجراء.", "Delete": "حذف", "Deleting...": "...حذف", "Overwrite": "استبدال", "Overwrite Existing Data?": "استبدال البيانات الحالية؟", "Account data for @{{username}} already exists in the database. Do you want to overwrite it?": "بيانات الحساب @{{username}} موجودة بالفعل في قاعدة البيانات. هل تريد استبدالها؟", "No accounts yet": "لا توجد حسابات بعد", "Use Dashboard to fetch data.": "استخدم لوحة المراقبة لجلب البيانات.", "Something went wrong.": "حدث خطأ ما.", "Error:": "خطأ:", "Fetch": "جلب", "Single": "مفرد", "Batch": "دفعات", "Auto Batch": "دفعات تلقائية", "Timeline": "الخط الزمني", "Media": "الوسائط", "Batch Size": "حجم الدُفعة", "Starting Batch": "الدُفعة الابتدائية", "Posts": "المنشورات", "Tweets": "التغريدات", "Replies": "الردود", "All": "الكل", "Image": "صورة", "Video": "فيديو", "GIF": "GIF", "Batch: {{page}}": "الدُفعة: {{page}}", "Start": "بدء", "Stop": "إيقاف", "Prev": "السابق", "Next": "التالي", "Download Current": "تنزيل الحالي", "Download All": "تنزيل الكل", "Use Batch/Auto Batch if single fetch fails": "استخدم الدفعات/الدفعات التلقائية إذا فشل الجلب المفرد", "Load from database": "تحميل من قاعدة البيانات", "Load database": "تحميل قاعدة البيانات", "Home": "البداية", "End": "النهاية", "Failed to load data": "فشل في تحميل البيانات", "Update": "تحديث", "Updating...": "...جارٍ التحديث", "Update will fetch the latest data and overwrite the database. Continue?": "سيقوم التحديث بجلب أحدث البيانات والكتابة فوق قاعدة البيانات. هل تريد المتابعة؟", "Followers": "المتابعون", "Following": "المتابَعون", "Joined": "تاريخ الانضمام", "Open": "فتح", "Preview": "معاينة", "View Database": "عرض قاعدة البيانات", "Converting...": "جارٍ التحويل...", "Convert & Download": "تحويل وتحميل" } };
const de = { "common": { "Settings": "Einstellungen", "Theme": "Design", "Change Theme": "Design ändern", "Language": "Sprache", "Change Language": "Sprache ändern", "Date Time Format": "Datum-Uhrzeit-Format", "Debug": "Debug", "Global Settings": "Globale Einstellungen", "Version": "Version", "Common Formats:": "Häufige Formate:", "Date Formats:": "Datumsformate:", "Time Formats:": "Zeitformate:", "Combined Examples:": "Kombinierte Beispiele:", "Localized": "Lokalisiert", "Reset Settings": "Einstellungen zurücksetzen", "Are you sure you want to reset settings to defaults?": "Sind Sie sicher, dass Sie die Einstellungen auf Standardwerte zurücksetzen möchten?", "Reset": "Zurücksetzen", "Cancel": "Abbrechen", "Chrome": "Chrome", "Userscript": "Benutzerskript", "Website": "Webseite", "Patreon": "Patreon", "Dashboard": "Dashboard", "Database": "Datenbank", "Auth": "Authentifizierung", "Convert Animated GIFs": "GIFs konvertieren", "Convert GIFs (External)": "GIFs konvertieren (Extern)", "Concurrent Downloads": "Gleichzeitige Downloads", "Use 10+ only with fast internet": "10+ nur bei schneller Internetverbindung verwenden", "Smaller size, same quality": "Kleinere Größe, gleiche Qualität", "Larger size, same quality": "Größere Größe, gleiche Qualität", "Back": "Zurück", "Please visit a profile page for auto-detection": "Bitte besuchen Sie eine Profilseite für die automatische Erkennung", "Please configure authentication in the Auth tab first": "Bitte konfigurieren Sie zuerst die Authentifizierung im Auth-Tab", "Invalid username format": "Ungültiges Benutzernamen-Format", "Invalid auth token. Please check your settings.": "Ungültiger Auth-Token. Bitte überprüfen Sie Ihre Einstellungen.", "Invalid Patreon auth. Please check your settings.": "Ungültige Patreon-Authentifizierung. Bitte überprüfen Sie Ihre Einstellungen.", "Failed to fetch data": "Daten konnten nicht abgerufen werden", "Failed to fetch data from all APIs": "Fehler beim Abrufen der Daten von allen APIs", "Failed to verify auth from all APIs": "Fehler bei der Überprüfung der Authentifizierung über alle APIs", "Failed to generate token from all APIs": "Fehler beim Generieren des Tokens über alle APIs", "Generating token...": "Token wird generiert...", "Abort": "Abbrechen", "Network error occurred": "Es ist ein Netzwerkfehler aufgetreten", "Request timeout - please try again": "Zeitüberschreitung der Anforderung – bitte erneut versuchen", "Failed to parse API response": "API-Antwort konnte nicht analysiert werden", "Invalid API response structure": "Ungültige API-Antwortstruktur", "Unknown error occurred": "Unbekannter Fehler ist aufgetreten", "HTTP error! status: {{status}}": "HTTP-Fehler! Status: {{status}}", "Download already in progress": "Download läuft bereits", "No media files found": "Keine Mediendateien gefunden", "Toggle visibility": "Ein-/Ausblenden", "Close": "Schließen", "Converting GIFs...": "GIFs werden konvertiert...", "Downloading...": "Herunterladen...", "Download": "Herunterladen", "Fetching...": "Abrufen...", "Fetch All": "Alle abrufen", "Fetch Video": "Video abrufen", "Fetch Image": "Bild abrufen", "Fetch GIF": "GIF abrufen", "Posts: {{posts}}": "Beiträge: {{posts}}", "Media: {{media}}": "Medien: {{media}}", "Current Media: {{current}} • Total Media: {{total}}": "Aktuelle Medien: {{current}} • Medien gesamt: {{total}}", "Failed to download media": "Medien konnten nicht heruntergeladen werden", "Demo mode is only available for @xbatchdemo": "Der Demo-Modus ist nur für @xbatchdemo verfügbar", "Auth Token": "Auth-Token", "Enter your auth token": "Geben Sie Ihren Auth-Token ein", "Your authentication token for API access": "Ihr Authentifizierungs-Token für API-Zugriff", "Patreon Auth": "Patreon-Authentifizierung", "Enter your Patreon auth": "Geben Sie Ihre Patreon-Authentifizierung ein", "Your Patreon authentication key": "Ihr Patreon-Authentifizierungsschlüssel", "Please enter Patreon auth first": "Bitte geben Sie zuerst die Patreon-Authentifizierung ein", "Please verify Patreon auth first": "Bitte überprüfen Sie zuerst die Patreon-Authentifizierung", "Patreon auth verified successfully": "Patreon-Authentifizierung erfolgreich überprüft", "Invalid Patreon auth": "Ungültige Patreon-Authentifizierung", "Verification failed. Please try again": "Überprüfung fehlgeschlagen. Bitte versuchen Sie es erneut", "Generating": "Generieren", "Generate": "Generieren", "Verify": "Überprüfen", "Token generated successfully": "Token erfolgreich generiert ({{current}}/{{total}})", "Failed to generate token": "Token-Generierung fehlgeschlagen", "Token generation failed. Please try again": "Token-Generierung fehlgeschlagen. Bitte versuchen Sie es erneut", "Verifying": "Überprüfen", "Verified": "Überprüft", "Use code": "Verwenden Sie den Code", "for Patreon Auth, click Verify to unlock demo. Test at": "für die Patreon-Authentifizierung, klicken Sie auf „Überprüfen“, um die Demo freizuschalten. Testen bei", "Need help with Auth Token? See": "Benötigen Sie Hilfe mit dem Auth-Token? Siehe", "the guide": "die Anleitung", "Subscribe": "Abonnieren", "to get your Patreon Auth code and start downloading with ease!": "um Ihren Patreon-Authentifizierungscode zu erhalten und mühelos mit dem Herunterladen zu beginnen!", "Report bugs or request features:": "Fehler melden oder Funktionen anfordern:", "Import": "Importieren", "Importing...": "Importieren...", "Supports JSON and ZIP formats": "Unterstützt JSON- und ZIP-Formate", "Export": "Exportieren", "Export All Data": "Alle Daten exportieren", "Exporting...": "Exportieren...", "Clear": "Löschen", "Filter by Batch": "Nach Stapel filtern", "Are you sure to clear all data in the database?": "Sind Sie sicher, dass Sie alle Daten in der Datenbank löschen möchten?", "Delete Account Data": "Kontodaten löschen", "Are you sure you want to delete account data? This action cannot be undone": "Sind Sie sicher, dass Sie die Daten von {{username}} löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", "Delete": "Löschen", "Deleting...": "Löschen...", "Overwrite": "Überschreiben", "Overwrite Existing Data?": "Vorhandene Daten überschreiben?", "Account data for @{{username}} already exists in the database. Do you want to overwrite it?": "Kontodaten für @{{username}} existieren bereits in der Datenbank. Möchten Sie sie überschreiben?", "No accounts yet": "Noch keine Konten", "Use Dashboard to fetch data.": "Verwenden Sie das Dashboard zum Abrufen von Daten.", "Something went wrong.": "Etwas ist schief gelaufen.", "Error:": "Fehler:", "Fetch": "Abrufen", "Single": "Einzel", "Batch": "Stapel", "Auto Batch": "Auto-Stapel", "Timeline": "Timeline", "Media": "Medien", "Batch Size": "Stapelgröße", "Starting Batch": "Startstapel", "Posts": "Beiträge", "Tweets": "Tweets", "Replies": "Antworten", "All": "Alle", "Image": "Bild", "Video": "Video", "GIF": "GIF", "Batch: {{page}}": "Stapel: {{page}}", "Start": "Start", "Stop": "Stopp", "Prev": "Zurück", "Next": "Weiter", "Download Current": "Aktuelles herunterladen", "Download All": "Alles herunterladen", "Use Batch/Auto Batch if single fetch fails": "Verwende Stapel/Auto-Stapel, wenn Einzelabruf fehlschlägt", "Load from database": "Aus Datenbank laden", "Load database": "Datenbank laden", "Home": "Anfang", "End": "Ende", "Failed to load data": "Daten konnten nicht geladen werden", "Update": "Aktualisieren", "Updating...": "Aktualisierung läuft...", "Update will fetch the latest data and overwrite the database. Continue?": "Das Update holt die neuesten Daten und überschreibt die Datenbank. Fortfahren?", "Followers": "Follower", "Following": "Folge ich", "Joined": "Beigetreten", "Open": "Öffnen", "Preview": "Vorschau", "View Database": "Datenbank anzeigen", "Converting...": "Konvertieren...", "Convert & Download": "Konvertieren & Herunterladen" } };
const en$1 = { "common": { "Settings": "Settings", "Theme": "Theme", "Change Theme": "Change Theme", "Language": "Language", "Change Language": "Change Language", "Date Time Format": "Date Time Format", "Debug": "Debug", "Global Settings": "Global Settings", "Version": "Version", "Common Formats:": "Common Formats:", "Date Formats:": "Date Formats:", "Time Formats:": "Time Formats:", "Combined Examples:": "Combined Examples:", "Localized": "Localized", "Reset Settings": "Reset Settings", "Are you sure you want to reset settings to defaults?": "Are you sure you want to reset settings to defaults?", "Reset": "Reset", "Cancel": "Cancel", "Chrome": "Chrome", "Userscript": "Userscript", "Website": "Website", "Patreon": "Patreon", "Dashboard": "Dashboard", "Database": "Database", "Auth": "Auth", "Convert Animated GIFs": "Convert GIFs", "Convert GIFs (External)": "Convert GIFs (External)", "Concurrent Downloads": "Concurrent Downloads", "Use 10+ only with fast internet": "Use 10+ only with fast internet", "Smaller size, same quality": "Smaller size, same quality", "Larger size, same quality": "Larger size, same quality", "Back": "Back", "Please visit a profile page for auto-detection": "Please visit a profile page for auto-detection", "Please configure authentication in the Auth tab first": "Please configure authentication in the Auth tab first", "Invalid username format": "Invalid username format", "Invalid auth token. Please check your settings.": "Invalid auth token. Please check your settings.", "Invalid Patreon auth. Please check your settings.": "Invalid Patreon auth. Please check your settings.", "Failed to fetch data": "Failed to fetch data", "Failed to fetch data from all APIs": "Failed to fetch data from all APIs", "Failed to verify auth from all APIs": "Failed to verify auth from all APIs", "Failed to generate token from all APIs": "Failed to generate token from all APIs", "Generating token...": "Generating token...", "Abort": "Abort", "Network error occurred": "Network error occurred", "Request timeout - please try again": "Request timeout - please try again", "Failed to parse API response": "Failed to parse API response", "Invalid API response structure": "Invalid API response structure", "Unknown error occurred": "Unknown error occurred", "HTTP error! status: {{status}}": "HTTP error! status: {{status}}", "Download already in progress": "Download already in progress", "No media files found": "No media files found", "Toggle visibility": "Toggle visibility", "Close": "Close", "Converting GIFs...": "Converting GIFs...", "Downloading...": "Downloading...", "Download": "Download", "Fetching...": "Fetching...", "Fetch All": "Fetch All", "Fetch Video": "Fetch Video", "Fetch Image": "Fetch Image", "Fetch GIF": "Fetch GIF", "Posts: {{posts}}": "Posts: {{posts}}", "Media: {{media}}": "Media: {{media}}", "Current Media: {{current}} • Total Media: {{total}}": "Current Media: {{current}} • Total Media: {{total}}", "Failed to download media": "Failed to download media", "Demo mode is only available for @xbatchdemo": "Demo mode is only available for @xbatchdemo", "Auth Token": "Auth Token", "Enter your auth token": "Enter your auth token", "Your authentication token for API access": "Your authentication token for API access", "Patreon Auth": "Patreon Auth", "Enter your Patreon auth": "Enter your Patreon auth", "Your Patreon authentication key": "Your Patreon authentication key", "Please enter Patreon auth first": "Please enter Patreon auth first", "Please verify Patreon auth first": "Please verify Patreon auth first", "Patreon auth verified successfully": "Patreon auth verified successfully", "Invalid Patreon auth": "Invalid Patreon auth", "Verification failed. Please try again": "Verification failed. Please try again", "Generating": "Generating", "Generate": "Generate", "Verify": "Verify", "Token generated successfully": "Token generated successfully ({{current}}/{{total}})", "Failed to generate token": "Failed to generate token", "Token generation failed. Please try again": "Token generation failed. Please try again", "Verifying": "Verifying", "Verified": "Verified", "Use code": "Use code", "for Patreon Auth, click Verify to unlock demo. Test at": "for Patreon Auth, click Verify to unlock demo. Test at", "Need help with Auth Token? See": "Need help with Auth Token? See", "the guide": "the guide", "Subscribe": "Subscribe", "to get your Patreon Auth code and start downloading with ease!": "to get your Patreon Auth code and start downloading with ease!", "Report bugs or request features:": "Report bugs or request features:", "Import": "Import", "Importing...": "Importing...", "Supports JSON and ZIP formats": "Supports JSON and ZIP formats", "Export": "Export", "Export All Data": "Export All Data", "Exporting...": "Exporting...", "Clear": "Clear", "Filter by Batch": "Filter by Batch", "Are you sure to clear all data in the database?": "Are you sure to clear all data in the database?", "Delete Account Data": "Delete Account Data", "Are you sure you want to delete account data? This action cannot be undone": "Are you sure you want to delete {{username}}'s data? This action cannot be undone.", "Delete": "Delete", "Deleting...": "Deleting...", "Overwrite": "Overwrite", "Overwrite Existing Data?": "Overwrite Existing Data?", "Account data for @{{username}} already exists in the database. Do you want to overwrite it?": "Account data for @{{username}} already exists in the database. Do you want to overwrite it?", "No accounts yet": "No accounts yet", "Use Dashboard to fetch data.": "Use Dashboard to fetch data.", "Something went wrong.": "Something went wrong.", "Error:": "Error:", "Fetch": "Fetch", "Single": "Single", "Batch": "Batch", "Auto Batch": "Auto Batch", "Timeline": "Timeline", "Media": "Media", "Batch Size": "Batch Size", "Starting Batch": "Starting Batch", "Posts": "Posts", "Tweets": "Tweets", "Replies": "Replies", "All": "All", "Image": "Image", "Video": "Video", "GIF": "GIF", "Batch: {{page}}": "Batch: {{page}}", "Start": "Start", "Stop": "Stop", "Prev": "Prev", "Next": "Next", "Download Current": "Download Current", "Download All": "Download All", "Use Batch/Auto Batch if single fetch fails": "Use Batch/Auto Batch if single fetch fails", "Load from database": "Load from database", "Load database": "Load database", "Home": "Home", "End": "End", "Failed to load data": "Failed to load data", "Update": "Update", "Updating...": "Updating...", "Update will fetch the latest data and overwrite the database. Continue?": "Update will fetch the latest data and overwrite the database. Continue?", "Followers": "Followers", "Following": "Following", "Joined": "Joined", "Open": "Open", "Preview": "Preview", "View Database": "View Database", "Converting...": "Converting...", "Convert & Download": "Convert & Download" } };
const es = { "common": { "Settings": "Configuración", "Theme": "Tema", "Change Theme": "Cambiar Tema", "Language": "Idioma", "Change Language": "Cambiar idioma", "Date Time Format": "Formato de Fecha y Hora", "Debug": "Depurar", "Global Settings": "Configuración Global", "Version": "Versión", "Common Formats:": "Formatos Comunes:", "Date Formats:": "Formatos de Fecha:", "Time Formats:": "Formatos de Hora:", "Combined Examples:": "Ejemplos Combinados:", "Localized": "Localizado", "Reset Settings": "Restablecer ajustes", "Are you sure you want to reset settings to defaults?": "¿Seguro que quieres restablecer los ajustes a los valores predeterminados?", "Reset": "Restablecer", "Cancel": "Cancelar", "Chrome": "Chrome", "Userscript": "Script de usuario", "Website": "Sitio web", "Patreon": "Patreon", "Dashboard": "Panel de Control", "Database": "Base de Datos", "Auth": "Autenticación", "Convert Animated GIFs": "Convertir GIFs", "Convert GIFs (External)": "Convertir GIFs (Externo)", "Concurrent Downloads": "Descargas simultáneas", "Use 10+ only with fast internet": "Usa 10+ solo con internet rápido", "Smaller size, same quality": "Tamaño más pequeño, misma calidad", "Larger size, same quality": "Tamaño más grande, misma calidad", "Back": "Atrás", "Please visit a profile page for auto-detection": "Visita una página de perfil para detección automática", "Please configure authentication in the Auth tab first": "Configura la autenticación en la pestaña Auth primero", "Invalid username format": "Formato de nombre de usuario no válido", "Invalid auth token. Please check your settings.": "Token de autenticación no válido. Por favor, revisa tu configuración.", "Invalid Patreon auth. Please check your settings.": "Autenticación de Patreon no válida. Por favor, revisa tu configuración.", "Failed to fetch data": "Error al obtener los datos", "Failed to fetch data from all APIs": "Error al obtener los datos de todas las APIs", "Failed to verify auth from all APIs": "Error al verificar la autenticación en todas las APIs", "Failed to generate token from all APIs": "Error al generar el token en todas las APIs", "Generating token...": "Generando token...", "Abort": "Abortar", "Network error occurred": "Se produjo un error de red", "Request timeout - please try again": "Tiempo de espera agotado: inténtalo de nuevo", "Failed to parse API response": "Error al analizar la respuesta de la API", "Invalid API response structure": "Estructura de respuesta de la API no válida", "Unknown error occurred": "Ocurrió un error desconocido", "HTTP error! status: {{status}}": "¡Error HTTP! estado: {{status}}", "Download already in progress": "Ya hay una descarga en curso", "No media files found": "No se encontraron archivos multimedia", "Toggle visibility": "Mostrar/ocultar", "Close": "Cerrar", "Converting GIFs...": "Convirtiendo GIF...", "Downloading...": "Descargando...", "Download": "Descargar", "Fetching...": "Obteniendo...", "Fetch All": "Obtener todo", "Fetch Video": "Obtener video", "Fetch Image": "Obtener imagen", "Fetch GIF": "Obtener GIF", "Posts: {{posts}}": "Publicaciones: {{posts}}", "Media: {{media}}": "Medios: {{media}}", "Current Media: {{current}} • Total Media: {{total}}": "Medios actuales: {{current}} • Medios totales: {{total}}", "Failed to download media": "Error al descargar los medios", "Demo mode is only available for @xbatchdemo": "El modo demo solo está disponible para @xbatchdemo", "Auth Token": "Token de autenticación", "Enter your auth token": "Introduce tu token de autenticación", "Your authentication token for API access": "Tu token de autenticación para acceso a la API", "Patreon Auth": "Autenticación de Patreon", "Enter your Patreon auth": "Introduce tu autenticación de Patreon", "Your Patreon authentication key": "Tu clave de autenticación de Patreon", "Please enter Patreon auth first": "Introduce primero la autenticación de Patreon", "Please verify Patreon auth first": "Verifica primero la autenticación de Patreon", "Patreon auth verified successfully": "Autenticación de Patreon verificada correctamente", "Invalid Patreon auth": "Autenticación de Patreon no válida", "Verification failed. Please try again": "La verificación falló. Inténtalo de nuevo", "Generating": "Generando", "Generate": "Generar", "Verify": "Verificar", "Token generated successfully": "Token generado correctamente ({{current}}/{{total}})", "Failed to generate token": "Error al generar el token", "Token generation failed. Please try again": "La generación del token falló. Inténtalo de nuevo", "Verifying": "Verificando", "Verified": "Verificado", "Use code": "Usa el código", "for Patreon Auth, click Verify to unlock demo. Test at": 'para la Autenticación de Patreon, haz clic en "Verificar" para desbloquear la demo. Prueba en', "Need help with Auth Token? See": "¿Necesitas ayuda con el token de autenticación? Consulta", "the guide": "la guía", "Subscribe": "Suscríbete", "to get your Patreon Auth code and start downloading with ease!": "para obtener tu código de autenticación de Patreon y empezar a descargar fácilmente.", "Report bugs or request features:": "Informa errores o solicita funciones:", "Import": "Importar", "Importing...": "Importando...", "Supports JSON and ZIP formats": "Admite formatos JSON y ZIP", "Export": "Exportar", "Export All Data": "Exportar todos los datos", "Exporting...": "Exportando...", "Clear": "Limpiar", "Filter by Batch": "Filtrar por lote", "Are you sure to clear all data in the database?": "¿Estás seguro de que quieres borrar todos los datos de la base de datos?", "Delete Account Data": "Eliminar datos de la cuenta", "Are you sure you want to delete account data? This action cannot be undone": "¿Seguro que quieres eliminar los datos de {{username}}? Esta acción no se puede deshacer.", "Delete": "Eliminar", "Deleting...": "Eliminando...", "Overwrite": "Sobrescribir", "Overwrite Existing Data?": "¿Sobrescribir datos existentes?", "Account data for @{{username}} already exists in the database. Do you want to overwrite it?": "Los datos de la cuenta @{{username}} ya existen en la base de datos. ¿Deseas sobrescribirlos?", "No accounts yet": "Todavía no hay cuentas", "Use Dashboard to fetch data.": "Usa el Panel de Control para obtener datos.", "Something went wrong.": "Algo salió mal.", "Error:": "Error:", "Fetch": "Obtener", "Single": "Único", "Batch": "Lote", "Auto Batch": "Lote automático", "Timeline": "Cronología", "Media": "Medios", "Batch Size": "Tamaño del lote", "Starting Batch": "Lote inicial", "Posts": "Publicaciones", "Tweets": "Tweets", "Replies": "Respuestas", "All": "Todo", "Image": "Imagen", "Video": "Video", "GIF": "GIF", "Batch: {{page}}": "Lote: {{page}}", "Start": "Iniciar", "Stop": "Detener", "Prev": "Anterior", "Next": "Siguiente", "Download Current": "Descargar actual", "Download All": "Descargar todo", "Use Batch/Auto Batch if single fetch fails": "Usa Lote/Lote automático si falla la obtención única", "Load from database": "Cargar desde base de datos", "Load database": "Cargar base de datos", "Home": "Inicio", "End": "Fin", "Failed to load data": "Error al cargar los datos", "Update": "Actualizar", "Updating...": "Actualizando...", "Update will fetch the latest data and overwrite the database. Continue?": "La actualización obtendrá los datos más recientes y sobrescribirá la base de datos. ¿Continuar?", "Followers": "Seguidores", "Following": "Siguiendo", "Joined": "Se unió", "Open": "Abrir", "Preview": "Vista previa", "View Database": "Ver base de datos", "Converting...": "Convirtiendo...", "Convert & Download": "Convertir y descargar" } };
const fr = { "common": { "Settings": "Paramètres", "Theme": "Thème", "Change Theme": "Changer le thème", "Language": "Langue", "Change Language": "Changer la langue", "Date Time Format": "Format date et heure", "Debug": "Débogage", "Global Settings": "Paramètres globaux", "Version": "Version", "Common Formats:": "Formats courants :", "Date Formats:": "Formats de date :", "Time Formats:": "Formats d'heure :", "Combined Examples:": "Exemples combinés :", "Localized": "Localisé", "Reset Settings": "Réinitialiser les paramètres", "Are you sure you want to reset settings to defaults?": "Êtes-vous sûr de vouloir réinitialiser les paramètres par défaut ?", "Reset": "Réinitialiser", "Cancel": "Annuler", "Chrome": "Chrome", "Userscript": "Script utilisateur", "Website": "Site Web", "Patreon": "Patreon", "Dashboard": "Tableau de bord", "Database": "Base de données", "Auth": "Authentification", "Convert Animated GIFs": "Convertir des GIFs", "Convert GIFs (External)": "Convertir des GIFs (Externe)", "Concurrent Downloads": "Téléchargements simultanés", "Use 10+ only with fast internet": "Utilisez 10+ uniquement avec une connexion rapide", "Smaller size, same quality": "Taille plus petite, même qualité", "Larger size, same quality": "Taille plus grande, même qualité", "Back": "Retour", "Please visit a profile page for auto-detection": "Veuillez visiter une page de profil pour la détection automatique", "Please configure authentication in the Auth tab first": "Veuillez d'abord configurer l'authentification dans l'onglet Auth", "Invalid username format": "Format de nom d'utilisateur invalide", "Invalid auth token. Please check your settings.": "Token d'authentification invalide. Veuillez vérifier vos paramètres.", "Invalid Patreon auth. Please check your settings.": "Authentification Patreon invalide. Veuillez vérifier vos paramètres.", "Failed to fetch data": "Échec de récupération des données", "Failed to fetch data from all APIs": "Échec de récupération des données depuis toutes les API", "Failed to verify auth from all APIs": "Échec de vérification de l'authentification depuis toutes les API", "Failed to generate token from all APIs": "Échec de génération du jeton depuis toutes les API", "Generating token...": "Génération du jeton...", "Abort": "Abandonner", "Network error occurred": "Une erreur réseau s'est produite", "Request timeout - please try again": "Délai d’attente dépassé - veuillez réessayer", "Failed to parse API response": "Échec de l’analyse de la réponse de l’API", "Invalid API response structure": "Structure de réponse de l’API invalide", "Unknown error occurred": "Une erreur inconnue s'est produite", "HTTP error! status: {{status}}": "Erreur HTTP ! statut : {{status}}", "Download already in progress": "Téléchargement déjà en cours", "No media files found": "Aucun fichier multimédia trouvé", "Toggle visibility": "Afficher/masquer", "Close": "Fermer", "Converting GIFs...": "Conversion des GIFs...", "Downloading...": "Téléchargement...", "Download": "Télécharger", "Fetching...": "Récupération...", "Fetch All": "Tout récupérer", "Fetch Video": "Récupérer la vidéo", "Fetch Image": "Récupérer l'image", "Fetch GIF": "Récupérer le GIF", "Posts: {{posts}}": "Publications : {{posts}}", "Media: {{media}}": "Médias : {{media}}", "Current Media: {{current}} • Total Media: {{total}}": "Médias actuels : {{current}} • Médias totaux : {{total}}", "Failed to download media": "Échec de téléchargement des médias", "Demo mode is only available for @xbatchdemo": "Le mode démo est uniquement disponible pour @xbatchdemo", "Auth Token": "Token d'authentification", "Enter your auth token": "Entrez votre token d'authentification", "Your authentication token for API access": "Votre token d'authentification pour l'accès API", "Patreon Auth": "Authentification Patreon", "Enter your Patreon auth": "Entrez votre authentification Patreon", "Your Patreon authentication key": "Votre clé d'authentification Patreon", "Please enter Patreon auth first": "Veuillez d'abord saisir l'authentification Patreon", "Please verify Patreon auth first": "Veuillez d'abord vérifier l'authentification Patreon", "Patreon auth verified successfully": "Authentification Patreon vérifiée avec succès", "Invalid Patreon auth": "Authentification Patreon invalide", "Verification failed. Please try again": "Échec de vérification. Veuillez réessayer", "Generating": "Génération", "Generate": "Générer", "Verify": "Vérifier", "Token generated successfully": "Token généré avec succès ({{current}}/{{total}})", "Failed to generate token": "Échec de génération du token", "Token generation failed. Please try again": "Échec de génération du token. Veuillez réessayer", "Verifying": "Vérification", "Verified": "Vérifié", "Use code": "Utilisez le code", "for Patreon Auth, click Verify to unlock demo. Test at": "pour l’authentification Patreon, cliquez sur « Vérifier » pour déverrouiller la démo. Testez sur", "Need help with Auth Token? See": "Besoin d’aide avec le jeton d’authentification ? Voir", "the guide": "le guide", "Subscribe": "S’abonner", "to get your Patreon Auth code and start downloading with ease!": "pour obtenir votre code d’authentification Patreon et commencer à télécharger facilement !", "Report bugs or request features:": "Signalez des bugs ou demandez des fonctionnalités :", "Import": "Importer", "Importing...": "Importation...", "Supports JSON and ZIP formats": "Prend en charge les formats JSON et ZIP", "Export": "Exporter", "Export All Data": "Exporter toutes les données", "Exporting...": "Exportation...", "Clear": "Effacer", "Filter by Batch": "Filtrer par lot", "Are you sure to clear all data in the database?": "Êtes-vous sûr de vouloir effacer toutes les données de la base ?", "Delete Account Data": "Supprimer les données du compte", "Are you sure you want to delete account data? This action cannot be undone": "Êtes-vous sûr de vouloir supprimer les données de {{username}} ? Cette action ne peut pas être annulée.", "Delete": "Supprimer", "Deleting...": "Suppression...", "Overwrite": "Écraser", "Overwrite Existing Data?": "Écraser les données existantes ?", "Account data for @{{username}} already exists in the database. Do you want to overwrite it?": "Les données du compte @{{username}} existent déjà dans la base de données. Voulez-vous les écraser ?", "No accounts yet": "Aucun compte pour le moment", "Use Dashboard to fetch data.": "Utilisez le Tableau de bord pour récupérer les données.", "Something went wrong.": "Quelque chose s'est mal passé.", "Error:": "Erreur :", "Fetch": "Récupérer", "Single": "Unique", "Batch": "Lot", "Auto Batch": "Lot automatique", "Timeline": "Chronologie", "Media": "Médias", "Batch Size": "Taille du lot", "Starting Batch": "Lot de départ", "Posts": "Publications", "Tweets": "Tweets", "Replies": "Réponses", "All": "Tout", "Image": "Image", "Video": "Vidéo", "GIF": "GIF", "Batch: {{page}}": "Lot : {{page}}", "Start": "Démarrer", "Stop": "Arrêter", "Prev": "Précédent", "Next": "Suivant", "Download Current": "Télécharger l'actuel", "Download All": "Tout télécharger", "Use Batch/Auto Batch if single fetch fails": "Utilisez Lot/Lot automatique si la récupération unique échoue", "Load from database": "Charger depuis la base de données", "Load database": "Charger la base de données", "Home": "Début", "End": "Fin", "Failed to load data": "Échec du chargement des données", "Update": "Mettre à jour", "Updating...": "Mise à jour en cours...", "Update will fetch the latest data and overwrite the database. Continue?": "La mise à jour récupérera les dernières données et écrasera la base de données. Continuer ?", "Followers": "Abonnés", "Following": "Abonnements", "Joined": "Inscrit", "Open": "Ouvrir", "Preview": "Aperçu", "View Database": "Voir la base de données", "Converting...": "Conversion...", "Convert & Download": "Convertir et télécharger" } };
const hi = { "common": { "Settings": "सेटिंग्स", "Theme": "थीम", "Change Theme": "थीम बदलें", "Language": "भाषा", "Change Language": "भाषा बदलें", "Date Time Format": "दिनांक समय प्रारूप", "Debug": "डिबग", "Global Settings": "वैश्विक सेटिंग्स", "Version": "संस्करण", "Common Formats:": "सामान्य प्रारूप:", "Date Formats:": "दिनांक प्रारूप:", "Time Formats:": "समय प्रारूप:", "Combined Examples:": "संयुक्त उदाहरण:", "Localized": "स्थानीयकृत", "Reset Settings": "सेटिंग्स रीसेट करें", "Are you sure you want to reset settings to defaults?": "क्या आप वाकई सेटिंग्स को डिफ़ॉल्ट पर रीसेट करना चाहते हैं?", "Reset": "रीसेट करें", "Cancel": "रद्द करें", "Chrome": "Chrome", "Userscript": "यूज़रस्क्रिप्ट", "Website": "वेबसाइट", "Patreon": "Patreon", "Dashboard": "डैशबोर्ड", "Database": "डेटाबेस", "Auth": "प्रमाणीकरण", "Convert Animated GIFs": "GIFs कन्वर्ट करें", "Convert GIFs (External)": "GIFs कन्वर्ट करें (बाहरी)", "Concurrent Downloads": "समकालिक डाउनलोड", "Use 10+ only with fast internet": "10+ का उपयोग केवल तेज़ इंटरनेट पर करें", "Smaller size, same quality": "आकार छोटा, गुणवत्ता समान", "Larger size, same quality": "आकार बड़ा, गुणवत्ता समान", "Back": "वापस", "Please visit a profile page for auto-detection": "कृपया ऑटो-डिटेक्शन के लिए प्रोफ़ाइल पेज पर जाएं", "Please configure authentication in the Auth tab first": "कृपया पहले ऑथ टैब में प्रमाणीकरण कॉन्फ़िगर करें", "Invalid username format": "अमान्य उपयोगकर्ता नाम प्रारूप", "Invalid auth token. Please check your settings.": "अमान्य ऑथ टोकन। कृपया सेटिंग्स जाँचें।", "Invalid Patreon auth. Please check your settings.": "अमान्य Patreon ऑथ। कृपया अपनी सेटिंग्स जाँचें।", "Failed to fetch data": "डेटा लाना विफल", "Failed to fetch data from all APIs": "सभी API से डेटा प्राप्त करने में विफल", "Failed to verify auth from all APIs": "सभी API से ऑथ सत्यापित करने में विफल", "Failed to generate token from all APIs": "सभी API से टोकन जनरेट करने में विफल", "Generating token...": "टोकन जेनरेट किया जा रहा है...", "Abort": "रद्द करें", "Network error occurred": "नेटवर्क त्रुटि हुई", "Request timeout - please try again": "अनुरोध का समय समाप्त — कृपया पुनः प्रयास करें", "Failed to parse API response": "API प्रतिक्रिया पार्स करने में विफल", "Invalid API response structure": "API प्रतिक्रिया संरचना अमान्य है", "Unknown error occurred": "अज्ञात त्रुटि हुई", "HTTP error! status: {{status}}": "HTTP त्रुटि! स्थिति: {{status}}", "Download already in progress": "डाउनलोड पहले से चल रहा है", "No media files found": "कोई मीडिया फ़ाइलें नहीं मिलीं", "Toggle visibility": "दिखाएँ/छुपाएँ", "Close": "बंद करें", "Converting GIFs...": "GIFs कन्वर्ट हो रहे हैं...", "Downloading...": "डाउनलोड हो रहा है...", "Download": "डाउनलोड करें", "Fetching...": "प्राप्त किया जा रहा है...", "Fetch All": "सब कुछ प्राप्त करें", "Fetch Video": "वीडियो प्राप्त करें", "Fetch Image": "छवि प्राप्त करें", "Fetch GIF": "GIF प्राप्त करें", "Posts: {{posts}}": "पोस्ट: {{posts}}", "Media: {{media}}": "मीडिया: {{media}}", "Current Media: {{current}} • Total Media: {{total}}": "वर्तमान मीडिया: {{current}} • कुल मीडिया: {{total}}", "Failed to download media": "मीडिया डाउनलोड विफल", "Demo mode is only available for @xbatchdemo": "डेमो मोड केवल @xbatchdemo के लिए उपलब्ध है", "Auth Token": "ऑथ टोकन", "Enter your auth token": "अपना ऑथ टोकन दर्ज करें", "Your authentication token for API access": "API एक्सेस के लिए आपका ऑथेंटिकेशन टोकन", "Patreon Auth": "Patreon ऑथ", "Enter your Patreon auth": "अपना Patreon ऑथ दर्ज करें", "Your Patreon authentication key": "आपकी Patreon प्रमाणीकरण कुंजी", "Please enter Patreon auth first": "कृपया पहले Patreon ऑथ दर्ज करें", "Please verify Patreon auth first": "कृपया पहले Patreon ऑथ सत्यापित करें", "Patreon auth verified successfully": "Patreon ऑथ सफलतापूर्वक सत्यापित", "Invalid Patreon auth": "अमान्य Patreon ऑथ", "Verification failed. Please try again": "सत्यापन विफल। कृपया पुनः प्रयास करें", "Generating": "उत्पन्न किया जा रहा है", "Generate": "उत्पन्न करें", "Verify": "सत्यापित करें", "Token generated successfully": "टोकन सफलतापूर्वक जनरेट हुआ ({{current}}/{{total}})", "Failed to generate token": "टोकन जनरेट करना विफल", "Token generation failed. Please try again": "टोकन जनरेशन विफल। कृपया पुनः प्रयास करें", "Verifying": "सत्यापित किया जा रहा है", "Verified": "सत्यापित", "Use code": "कोड उपयोग करें", "for Patreon Auth, click Verify to unlock demo. Test at": 'Patreon प्रमाणीकरण के लिए, डेमो अनलॉक करने हेतु "सत्यापित करें" पर क्लिक करें। परीक्षण करें:', "Need help with Auth Token? See": "ऑथ टोकन में मदद चाहिए? देखें", "the guide": "मार्गदर्शिका", "Subscribe": "सदस्यता लें", "to get your Patreon Auth code and start downloading with ease!": "अपना Patreon ऑथ कोड प्राप्त करें और आसानी से डाउनलोड शुरू करें!", "Report bugs or request features:": "बग रिपोर्ट करें या फीचर का अनुरोध करें:", "Import": "आयात करें", "Importing...": "आयात हो रहा है...", "Supports JSON and ZIP formats": "JSON और ZIP प्रारूप समर्थित हैं", "Export": "निर्यात करें", "Export All Data": "सभी डेटा निर्यात करें", "Exporting...": "निर्यात हो रहा है...", "Clear": "साफ़ करें", "Filter by Batch": "बैच द्वारा फ़िल्टर करें", "Are you sure to clear all data in the database?": "क्या आप वाकई डेटाबेस का सारा डेटा साफ़ करना चाहते हैं?", "Delete Account Data": "खाता डेटा हटाएँ", "Are you sure you want to delete account data? This action cannot be undone": "क्या आप वाकई {{username}} का डेटा हटाना चाहते हैं? यह क्रिया वापस नहीं की जा सकती।", "Delete": "हटाएं", "Deleting...": "हटा रहे हैं...", "Overwrite": "ओवरराइट करें", "Overwrite Existing Data?": "मौजूदा डेटा ओवरराइट करें?", "Account data for @{{username}} already exists in the database. Do you want to overwrite it?": "@{{username}} के लिए खाता डेटा पहले से ही डेटाबेस में मौजूद है। क्या आप इसे ओवरराइट करना चाहते हैं?", "No accounts yet": "अभी तक कोई खाता नहीं", "Use Dashboard to fetch data.": "डेटा प्राप्त करने के लिए डैशबोर्ड का उपयोग करें।", "Something went wrong.": "कुछ गलत हो गया।", "Error:": "त्रुटि:", "Fetch": "प्राप्त करें", "Single": "एकल", "Batch": "बैच", "Auto Batch": "ऑटो बैच", "Timeline": "टाइमलाइन", "Media": "मीडिया", "Batch Size": "बैच आकार", "Starting Batch": "प्रारंभिक बैच", "Posts": "पोस्ट", "Tweets": "ट्वीट्स", "Replies": "जवाब", "All": "सभी", "Image": "छवि", "Video": "वीडियो", "GIF": "GIF", "Batch: {{page}}": "बैच: {{page}}", "Start": "प्रारंभ", "Stop": "रोकें", "Prev": "पिछला", "Next": "अगला", "Download Current": "वर्तमान डाउनलोड करें", "Download All": "सभी डाउनलोड करें", "Use Batch/Auto Batch if single fetch fails": "यदि एकल प्राप्ति विफल हो, तो बैच/ऑटो बैच का उपयोग करें", "Load from database": "डेटाबेस से लोड करें", "Load database": "डेटाबेस लोड करें", "Home": "होम", "End": "अंत", "Failed to load data": "डेटा लोड करना विफल", "Update": "अपडेट करें", "Updating...": "अपडेट हो रहा है...", "Update will fetch the latest data and overwrite the database. Continue?": "अपडेट नवीनतम डेटा प्राप्त करेगा और डेटाबेस को ओवरराइट करेगा। जारी रखें?", "Followers": "फॉलोवर्स", "Following": "फॉलो कर रहे हैं", "Joined": "जुड़े", "Open": "खोलें", "Preview": "पूर्वावलोकन", "View Database": "डेटाबेस देखें", "Converting...": "कन्वर्ट हो रहा है...", "Convert & Download": "कन्वर्ट करें और डाउनलोड करें" } };
const ja = { "common": { "Settings": "設定", "Theme": "テーマ", "Change Theme": "テーマを変更", "Language": "言語", "Change Language": "言語を変更", "Date Time Format": "日時フォーマット", "Debug": "デバッグ", "Global Settings": "グローバル設定", "Version": "バージョン", "Common Formats:": "一般的な形式:", "Date Formats:": "日付形式:", "Time Formats:": "時刻形式:", "Combined Examples:": "組み合わせ例:", "Localized": "ローカライズ済み", "Reset Settings": "設定のリセット", "Are you sure you want to reset settings to defaults?": "設定をデフォルトにリセットしてもよろしいですか?", "Reset": "リセット", "Cancel": "キャンセル", "Chrome": "Chrome", "Userscript": "ユーザースクリプト", "Website": "ウェブサイト", "Patreon": "Patreon", "Dashboard": "ダッシュボード", "Database": "データベース", "Auth": "認証", "Convert Animated GIFs": "GIFを変換", "Convert GIFs (External)": "GIFを変換(外部)", "Concurrent Downloads": "同時ダウンロード数", "Use 10+ only with fast internet": "10以上は高速なインターネット環境でのみ使用してください", "Smaller size, same quality": "サイズは小さく、品質は同じです", "Larger size, same quality": "サイズは大きく、品質は同じです", "Back": "戻る", "Please visit a profile page for auto-detection": "プロフィールページを訪問して自動検出してください", "Please configure authentication in the Auth tab first": "最初に認証タブで認証を設定してください", "Invalid username format": "無効なユーザー名形式", "Invalid auth token. Please check your settings.": "無効な認証トークンです。設定を確認してください。", "Invalid Patreon auth. Please check your settings.": "無効なPatreon認証です。設定を確認してください。", "Failed to fetch data": "データ取得に失敗しました", "Failed to fetch data from all APIs": "すべてのAPIからデータ取得に失敗しました", "Failed to verify auth from all APIs": "すべてのAPIで認証の検証に失敗しました", "Failed to generate token from all APIs": "すべてのAPIでトークン生成に失敗しました", "Generating token...": "トークン生成中...", "Abort": "中止", "Network error occurred": "ネットワークエラーが発生しました", "Request timeout - please try again": "リクエストがタイムアウトしました。もう一度お試しください", "Failed to parse API response": "API 応答の解析に失敗しました", "Invalid API response structure": "無効な API 応答構造です", "Unknown error occurred": "不明なエラーが発生しました", "HTTP error! status: {{status}}": "HTTP エラー! ステータス: {{status}}", "Download already in progress": "ダウンロードはすでに進行中です", "No media files found": "メディアファイルが見つかりません", "Toggle visibility": "表示/非表示を切り替え", "Close": "閉じる", "Converting GIFs...": "GIF変換中...", "Downloading...": "ダウンロード中...", "Download": "ダウンロード", "Fetching...": "取得中...", "Fetch All": "すべて取得", "Fetch Video": "ビデオを取得", "Fetch Image": "画像を取得", "Fetch GIF": "GIFを取得", "Posts: {{posts}}": "投稿: {{posts}}", "Media: {{media}}": "メディア: {{media}}", "Current Media: {{current}} • Total Media: {{total}}": "現在のメディア: {{current}} • 合計メディア: {{total}}", "Failed to download media": "メディアダウンロードに失敗しました", "Demo mode is only available for @xbatchdemo": "デモモードは @xbatchdemo のみ利用できます", "Auth Token": "認証トークン", "Enter your auth token": "認証トークンを入力", "Your authentication token for API access": "APIアクセス用の認証トークン", "Patreon Auth": "Patreon認証", "Enter your Patreon auth": "Patreon認証を入力", "Your Patreon authentication key": "Patreon認証キー", "Please enter Patreon auth first": "最初にPatreon認証を入力してください", "Please verify Patreon auth first": "最初にPatreon認証を確認してください", "Patreon auth verified successfully": "Patreon認証が正常に確認されました", "Invalid Patreon auth": "無効なPatreon認証", "Verification failed. Please try again": "検証に失敗しました。再試行してください", "Generating": "生成中", "Generate": "生成", "Verify": "確認", "Token generated successfully": "トークンが正常に生成されました ({{current}}/{{total}})", "Failed to generate token": "トークン生成に失敗しました", "Token generation failed. Please try again": "トークン生成に失敗しました。再試行してください", "Verifying": "確認中", "Verified": "確認済み", "Use code": "コードを使用", "for Patreon Auth, click Verify to unlock demo. Test at": "Patreon 認証用。デモを有効にするには「確認」をクリック。テスト先:", "Need help with Auth Token? See": "認証トークンでお困りですか?こちらをご覧ください:", "the guide": "ガイド", "Subscribe": "購読する", "to get your Patreon Auth code and start downloading with ease!": "Patreon 認証コードを入手して、簡単にダウンロードを開始しましょう!", "Report bugs or request features:": "バグ報告や機能リクエストはこちら:", "Import": "インポート", "Importing...": "インポート中...", "Supports JSON and ZIP formats": "JSON および ZIP 形式をサポート", "Export": "エクスポート", "Export All Data": "すべてのデータをエクスポート", "Exporting...": "エクスポート中...", "Clear": "クリア", "Filter by Batch": "バッチでフィルター", "Are you sure to clear all data in the database?": "データベースのすべてのデータをクリアしてもよろしいですか?", "Delete Account Data": "アカウントデータの削除", "Are you sure you want to delete account data? This action cannot be undone": "{{username}}のデータを削除してもよろしいですか?この操作は元に戻せません。", "Delete": "削除", "Deleting...": "削除中...", "Overwrite": "上書き", "Overwrite Existing Data?": "既存のデータを上書きしますか?", "Account data for @{{username}} already exists in the database. Do you want to overwrite it?": "@{{username}} のアカウントデータは既にデータベースに存在します。上書きしますか?", "No accounts yet": "まだアカウントがありません", "Use Dashboard to fetch data.": "ダッシュボードを使用してデータを取得してください。", "Something went wrong.": "何かが間違っています。", "Error:": "エラー:", "Fetch": "取得", "Single": "シングル", "Batch": "バッチ", "Auto Batch": "自動バッチ", "Timeline": "タイムライン", "Media": "メディア", "Batch Size": "バッチサイズ", "Starting Batch": "開始バッチ", "Posts": "投稿", "Tweets": "ツイート", "Replies": "返信", "All": "すべて", "Image": "画像", "Video": "ビデオ", "GIF": "GIF", "Batch: {{page}}": "バッチ: {{page}}", "Start": "開始", "Stop": "停止", "Prev": "前へ", "Next": "次へ", "Download Current": "現在をダウンロード", "Download All": "すべてダウンロード", "Use Batch/Auto Batch if single fetch fails": "単一取得が失敗した場合はバッチ/自動バッチを使用してください", "Load from database": "データベースから読み込む", "Load database": "データベースを読み込む", "Home": "先頭", "End": "末尾", "Failed to load data": "データの読み込みに失敗しました", "Update": "更新", "Updating...": "更新中...", "Update will fetch the latest data and overwrite the database. Continue?": "更新により最新データを取得し、データベースを上書きします。続行しますか?", "Followers": "フォロワー", "Following": "フォロー中", "Joined": "参加日", "Open": "開く", "Preview": "プレビュー", "View Database": "データベースを表示", "Converting...": "変換中...", "Convert & Download": "変換してダウンロード" } };
const ko = { "common": { "Settings": "설정", "Theme": "테마", "Change Theme": "테마 변경", "Language": "언어", "Change Language": "언어 변경", "Date Time Format": "날짜 시간 형식", "Debug": "디버그", "Global Settings": "전역 설정", "Version": "버전", "Common Formats:": "일반 형식:", "Date Formats:": "날짜 형식:", "Time Formats:": "시간 형식:", "Combined Examples:": "결합 예시:", "Localized": "현지화됨", "Reset Settings": "설정 재설정", "Are you sure you want to reset settings to defaults?": "설정을 기본값으로 재설정하시겠습니까?", "Reset": "재설정", "Cancel": "취소", "Chrome": "Chrome", "Userscript": "유저스크립트", "Website": "웹사이트", "Patreon": "Patreon", "Dashboard": "대시보드", "Database": "데이터베이스", "Auth": "인증", "Convert Animated GIFs": "GIF 변환", "Convert GIFs (External)": "GIF 변환 (외부)", "Concurrent Downloads": "동시 다운로드", "Use 10+ only with fast internet": "빠른 인터넷에서만 10+를 사용하세요", "Smaller size, same quality": "더 작은 용량, 동일한 품질", "Larger size, same quality": "더 큰 용량, 동일한 품질", "Back": "뒤로", "Please visit a profile page for auto-detection": "자동 감지를 위해 프로필 페이지를 방문해주세요", "Please configure authentication in the Auth tab first": "먼저 Auth 탭에서 인증을 구성해주세요", "Invalid username format": "잘못된 사용자명 형식", "Invalid auth token. Please check your settings.": "잘못된 인증 토큰입니다. 설정을 확인해주세요.", "Invalid Patreon auth. Please check your settings.": "잘못된 Patreon 인증입니다. 설정을 확인해주세요.", "Failed to fetch data": "데이터 가져오기 실패", "Failed to fetch data from all APIs": "모든 API에서 데이터를 가져오지 못했습니다", "Failed to verify auth from all APIs": "모든 API에서 인증 확인에 실패했습니다", "Failed to generate token from all APIs": "모든 API에서 토큰 생성에 실패했습니다", "Generating token...": "토큰 생성 중...", "Abort": "중단", "Network error occurred": "네트워크 오류가 발생했습니다", "Request timeout - please try again": "요청 시간 초과 - 다시 시도해 주세요", "Failed to parse API response": "API 응답을 파싱하지 못했습니다", "Invalid API response structure": "잘못된 API 응답 구조입니다", "Unknown error occurred": "알 수 없는 오류가 발생했습니다", "HTTP error! status: {{status}}": "HTTP 오류! 상태: {{status}}", "Download already in progress": "다운로드가 이미 진행 중입니다", "No media files found": "미디어 파일을 찾을 수 없습니다", "Toggle visibility": "표시/숨기기", "Close": "닫기", "Converting GIFs...": "GIF 변환 중...", "Downloading...": "다운로드 중...", "Download": "다운로드", "Fetching...": "가져오는 중...", "Fetch All": "전체 가져오기", "Fetch Video": "비디오 가져오기", "Fetch Image": "이미지 가져오기", "Fetch GIF": "GIF 가져오기", "Posts: {{posts}}": "게시물: {{posts}}", "Media: {{media}}": "미디어: {{media}}", "Current Media: {{current}} • Total Media: {{total}}": "현재 미디어: {{current}} • 전체 미디어: {{total}}", "Failed to download media": "미디어 다운로드 실패", "Demo mode is only available for @xbatchdemo": "데모 모드는 @xbatchdemo에게만 제공됩니다", "Auth Token": "인증 토큰", "Enter your auth token": "인증 토큰을 입력하세요", "Your authentication token for API access": "API 접근을 위한 인증 토큰", "Patreon Auth": "Patreon 인증", "Enter your Patreon auth": "Patreon 인증을 입력하세요", "Your Patreon authentication key": "Patreon 인증 키", "Please enter Patreon auth first": "먼저 Patreon 인증을 입력해주세요", "Please verify Patreon auth first": "먼저 Patreon 인증을 확인해주세요", "Patreon auth verified successfully": "Patreon 인증이 성공적으로 확인되었습니다", "Invalid Patreon auth": "잘못된 Patreon 인증", "Verification failed. Please try again": "확인 실패. 다시 시도해주세요", "Generating": "생성 중", "Generate": "생성", "Verify": "확인", "Token generated successfully": "토큰이 성공적으로 생성되었습니다 ({{current}}/{{total}})", "Failed to generate token": "토큰 생성 실패", "Token generation failed. Please try again": "토큰 생성 실패. 다시 시도해주세요", "Verifying": "확인 중", "Verified": "확인됨", "Use code": "코드를 사용", "for Patreon Auth, click Verify to unlock demo. Test at": "Patreon 인증용입니다. 데모를 해제하려면 ‘확인’을 클릭하세요. 테스트:", "Need help with Auth Token? See": "인증 토큰이 필요하신가요? 다음을 참조하세요:", "the guide": "가이드", "Subscribe": "구독하기", "to get your Patreon Auth code and start downloading with ease!": "Patreon 인증 코드를 받아 손쉽게 다운로드를 시작하세요!", "Report bugs or request features:": "버그 신고 또는 기능 요청:", "Import": "가져오기", "Importing...": "가져오는 중...", "Supports JSON and ZIP formats": "JSON 및 ZIP 형식 지원", "Export": "내보내기", "Export All Data": "모든 데이터 내보내기", "Exporting...": "내보내는 중...", "Clear": "삭제", "Filter by Batch": "배치별 필터", "Are you sure to clear all data in the database?": "데이터베이스의 모든 데이터를 삭제하시겠습니까?", "Delete Account Data": "계정 데이터 삭제", "Are you sure you want to delete account data? This action cannot be undone": "{{username}}의 데이터를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", "Delete": "삭제", "Deleting...": "삭제 중...", "Overwrite": "덮어쓰기", "Overwrite Existing Data?": "기존 데이터를 덮어쓰시겠습니까?", "Account data for @{{username}} already exists in the database. Do you want to overwrite it?": "@{{username}}의 계정 데이터가 이미 데이터베이스에 존재합니다. 덮어쓰시겠습니까?", "No accounts yet": "아직 계정이 없습니다", "Use Dashboard to fetch data.": "대시보드를 사용하여 데이터를 가져와주세요.", "Something went wrong.": "문제가 발생했습니다.", "Error:": "오류:", "Fetch": "가져오기", "Single": "단일", "Batch": "배치", "Auto Batch": "자동 배치", "Timeline": "타임라인", "Media": "미디어", "Batch Size": "배치 크기", "Starting Batch": "시작 배치", "Posts": "게시물", "Tweets": "트윗", "Replies": "답글", "All": "전체", "Image": "이미지", "Video": "비디오", "GIF": "GIF", "Batch: {{page}}": "배치: {{page}}", "Start": "시작", "Stop": "중지", "Prev": "이전", "Next": "다음", "Download Current": "현재 다운로드", "Download All": "모두 다운로드", "Use Batch/Auto Batch if single fetch fails": "단일 가져오기가 실패하면 배치/자동 배치를 사용하세요", "Load from database": "데이터베이스에서 불러오기", "Load database": "데이터베이스 불러오기", "Home": "처음", "End": "끝", "Failed to load data": "데이터 불러오기 실패", "Update": "업데이트", "Updating...": "업데이트 중...", "Update will fetch the latest data and overwrite the database. Continue?": "업데이트는 최신 데이터를 가져와 데이터베이스를 덮어씁니다. 계속하시겠습니까?", "Followers": "팔로워", "Following": "팔로잉", "Joined": "가입일", "Open": "열기", "Preview": "미리보기", "View Database": "데이터베이스 보기", "Converting...": "변환 중...", "Convert & Download": "변환 및 다운로드" } };
const pt = { "common": { "Settings": "Configurações", "Theme": "Tema", "Change Theme": "Alterar Tema", "Language": "Idioma", "Change Language": "Alterar Idioma", "Date Time Format": "Formato de Data e Hora", "Debug": "Depurar", "Global Settings": "Configurações Globais", "Version": "Versão", "Common Formats:": "Formatos Comuns:", "Date Formats:": "Formatos de Data:", "Time Formats:": "Formatos de Hora:", "Combined Examples:": "Exemplos Combinados:", "Localized": "Localizado", "Reset Settings": "Redefinir configurações", "Are you sure you want to reset settings to defaults?": "Tem certeza de que deseja redefinir as configurações para o padrão?", "Reset": "Redefinir", "Cancel": "Cancelar", "Chrome": "Chrome", "Userscript": "Script de usuário", "Website": "Site", "Patreon": "Patreon", "Dashboard": "Painel", "Database": "Banco de Dados", "Auth": "Autenticação", "Convert Animated GIFs": "Converter GIFs", "Convert GIFs (External)": "Converter GIFs (Externo)", "Concurrent Downloads": "Downloads simultâneos", "Use 10+ only with fast internet": "Use 10+ apenas com internet rápida", "Smaller size, same quality": "Tamanho menor, mesma qualidade", "Larger size, same quality": "Tamanho maior, mesma qualidade", "Back": "Voltar", "Please visit a profile page for auto-detection": "Visite uma página de perfil para detecção automática", "Please configure authentication in the Auth tab first": "Configure a autenticação na aba Auth primeiro", "Invalid username format": "Formato de nome de usuário inválido", "Invalid auth token. Please check your settings.": "Token de autenticação inválido. Verifique suas configurações.", "Invalid Patreon auth. Please check your settings.": "Autenticação do Patreon inválida. Verifique suas configurações.", "Failed to fetch data": "Falha ao buscar os dados", "Failed to fetch data from all APIs": "Falha ao buscar os dados em todas as APIs", "Failed to verify auth from all APIs": "Falha ao verificar a autenticação em todas as APIs", "Failed to generate token from all APIs": "Falha ao gerar o token em todas as APIs", "Generating token...": "Gerando token...", "Abort": "Abortar", "Network error occurred": "Ocorreu um erro de rede", "Request timeout - please try again": "Tempo de requisição esgotado - tente novamente", "Failed to parse API response": "Falha ao analisar a resposta da API", "Invalid API response structure": "Estrutura de resposta da API inválida", "Unknown error occurred": "Ocorreu um erro desconhecido", "HTTP error! status: {{status}}": "Erro HTTP! status: {{status}}", "Download already in progress": "Download já em andamento", "No media files found": "Nenhum arquivo de mídia encontrado", "Toggle visibility": "Mostrar/ocultar", "Close": "Fechar", "Converting GIFs...": "Convertendo GIFs...", "Downloading...": "Baixando...", "Download": "Baixar", "Fetching...": "Obtendo...", "Fetch All": "Obter tudo", "Fetch Video": "Obter vídeo", "Fetch Image": "Obter imagem", "Fetch GIF": "Obter GIF", "Posts: {{posts}}": "Publicações: {{posts}}", "Media: {{media}}": "Mídia: {{media}}", "Current Media: {{current}} • Total Media: {{total}}": "Mídia atual: {{current}} • Mídia total: {{total}}", "Failed to download media": "Falha ao baixar a mídia", "Demo mode is only available for @xbatchdemo": "O modo demonstração está disponível apenas para @xbatchdemo", "Auth Token": "Token de autenticação", "Enter your auth token": "Insira seu token de autenticação", "Your authentication token for API access": "Seu token de autenticação para acesso à API", "Patreon Auth": "Autenticação do Patreon", "Enter your Patreon auth": "Insira sua autenticação do Patreon", "Your Patreon authentication key": "Sua chave de autenticação do Patreon", "Please enter Patreon auth first": "Insira primeiro a autenticação do Patreon", "Please verify Patreon auth first": "Verifique primeiro a autenticação do Patreon", "Patreon auth verified successfully": "Autenticação do Patreon verificada com sucesso", "Invalid Patreon auth": "Autenticação do Patreon inválida", "Verification failed. Please try again": "Falha na verificação. Tente novamente", "Generating": "Gerando", "Generate": "Gerar", "Verify": "Verificar", "Token generated successfully": "Token gerado com sucesso ({{current}}/{{total}})", "Failed to generate token": "Falha ao gerar o token", "Token generation failed. Please try again": "Falha na geração do token. Tente novamente", "Verifying": "Verificando", "Verified": "Verificado", "Use code": "Use o código", "for Patreon Auth, click Verify to unlock demo. Test at": 'para Autenticação do Patreon, clique em "Verificar" para desbloquear a demonstração. Teste em', "Need help with Auth Token? See": "Precisa de ajuda com o token de autenticação? Veja", "the guide": "o guia", "Subscribe": "Assine", "to get your Patreon Auth code and start downloading with ease!": "para obter seu código de autenticação do Patreon e começar a baixar com facilidade!", "Report bugs or request features:": "Relate bugs ou solicite recursos:", "Import": "Importar", "Importing...": "Importando...", "Supports JSON and ZIP formats": "Suporta formatos JSON e ZIP", "Export": "Exportar", "Export All Data": "Exportar todos os dados", "Exporting...": "Exportando...", "Clear": "Limpar", "Filter by Batch": "Filtrar por lote", "Are you sure to clear all data in the database?": "Tem certeza de que deseja limpar todos os dados do banco de dados?", "Delete Account Data": "Excluir dados da conta", "Are you sure you want to delete account data? This action cannot be undone": "Tem certeza de que deseja excluir os dados de {{username}}? Esta ação não pode ser desfeita.", "Delete": "Excluir", "Deleting...": "Excluindo...", "Overwrite": "Substituir", "Overwrite Existing Data?": "Substituir dados existentes?", "Account data for @{{username}} already exists in the database. Do you want to overwrite it?": "Os dados da conta @{{username}} já existem no banco de dados. Deseja substituí-los?", "No accounts yet": "Ainda não há contas", "Use Dashboard to fetch data.": "Use o Painel para buscar os dados.", "Something went wrong.": "Algo deu errado.", "Error:": "Erro:", "Fetch": "Buscar", "Single": "Único", "Batch": "Lote", "Auto Batch": "Lote automático", "Timeline": "Linha do tempo", "Media": "Mídia", "Batch Size": "Tamanho do lote", "Starting Batch": "Lote inicial", "Posts": "Publicações", "Tweets": "Tweets", "Replies": "Respostas", "All": "Tudo", "Image": "Imagem", "Video": "Vídeo", "GIF": "GIF", "Batch: {{page}}": "Lote: {{page}}", "Start": "Iniciar", "Stop": "Parar", "Prev": "Anterior", "Next": "Próximo", "Download Current": "Baixar atual", "Download All": "Baixar tudo", "Use Batch/Auto Batch if single fetch fails": "Use Lote/Lote automático se a busca única falhar", "Load from database": "Carregar do banco de dados", "Load database": "Carregar banco de dados", "Home": "Início", "End": "Fim", "Failed to load data": "Falha ao carregar os dados", "Update": "Atualizar", "Updating...": "Atualizando...", "Update will fetch the latest data and overwrite the database. Continue?": "A atualização buscará os dados mais recentes e sobrescreverá o banco de dados. Continuar?", "Followers": "Seguidores", "Following": "Seguindo", "Joined": "Entrou em", "Open": "Abrir", "Preview": "Visualizar", "View Database": "Ver banco de dados", "Converting...": "Convertendo...", "Convert & Download": "Converter e baixar" } };
const ru = { "common": { "Settings": "Настройки", "Theme": "Тема", "Change Theme": "Изменить тему", "Language": "Язык", "Change Language": "Изменить язык", "Date Time Format": "Формат даты и времени", "Debug": "Отладка", "Global Settings": "Глобальные настройки", "Version": "Версия", "Common Formats:": "Общие форматы:", "Date Formats:": "Форматы дат:", "Time Formats:": "Форматы времени:", "Combined Examples:": "Комбинированные примеры:", "Localized": "Локализованный", "Reset Settings": "Сбросить настройки", "Are you sure you want to reset settings to defaults?": "Вы уверены, что хотите сбросить настройки к значениям по умолчанию?", "Reset": "Сброс", "Cancel": "Отмена", "Chrome": "Chrome", "Userscript": "Пользовательский скрипт", "Website": "Сайт", "Patreon": "Patreon", "Dashboard": "Панель управления", "Database": "База данных", "Auth": "Аутентификация", "Convert Animated GIFs": "Конвертировать GIF", "Convert GIFs (External)": "Конвертировать GIF (внешний)", "Concurrent Downloads": "Одновременные загрузки", "Use 10+ only with fast internet": "Используйте 10+ только при быстром интернете", "Smaller size, same quality": "Меньший размер, то же качество", "Larger size, same quality": "Больший размер, то же качество", "Back": "Назад", "Please visit a profile page for auto-detection": "Посетите страницу профиля для автоопределения", "Please configure authentication in the Auth tab first": "Сначала настройте аутентификацию на вкладке Auth", "Invalid username format": "Недопустимый формат имени пользователя", "Invalid auth token. Please check your settings.": "Недействительный токен аутентификации. Проверьте настройки.", "Invalid Patreon auth. Please check your settings.": "Недействительная авторизация Patreon. Проверьте настройки.", "Failed to fetch data": "Не удалось получить данные", "Failed to fetch data from all APIs": "Не удалось получить данные со всех API", "Failed to verify auth from all APIs": "Не удалось проверить авторизацию через все API", "Failed to generate token from all APIs": "Не удалось сгенерировать токен через все API", "Generating token...": "Генерация токена...", "Abort": "Отменить", "Network error occurred": "Произошла сетевая ошибка", "Request timeout - please try again": "Время ожидания запроса истекло — попробуйте снова", "Failed to parse API response": "Не удалось разобрать ответ API", "Invalid API response structure": "Недопустимая структура ответа API", "Unknown error occurred": "Произошла неизвестная ошибка", "HTTP error! status: {{status}}": "Ошибка HTTP! статус: {{status}}", "Download already in progress": "Загрузка уже выполняется", "No media files found": "Медиафайлы не найдены", "Toggle visibility": "Показать/скрыть", "Close": "Закрыть", "Converting GIFs...": "Конвертация GIF...", "Downloading...": "Загрузка...", "Download": "Скачать", "Fetching...": "Получение...", "Fetch All": "Получить всё", "Fetch Video": "Получить видео", "Fetch Image": "Получить изображение", "Fetch GIF": "Получить GIF", "Posts: {{posts}}": "Публикации: {{posts}}", "Media: {{media}}": "Медиа: {{media}}", "Current Media: {{current}} • Total Media: {{total}}": "Текущая медиа: {{current}} • Всего медиа: {{total}}", "Failed to download media": "Не удалось скачать медиа", "Demo mode is only available for @xbatchdemo": "Демо-режим доступен только для @xbatchdemo", "Auth Token": "Токен аутентификации", "Enter your auth token": "Введите токен аутентификации", "Your authentication token for API access": "Ваш токен аутентификации для доступа к API", "Patreon Auth": "Авторизация Patreon", "Enter your Patreon auth": "Введите авторизацию Patreon", "Your Patreon authentication key": "Ваш ключ аутентификации Patreon", "Please enter Patreon auth first": "Сначала введите авторизацию Patreon", "Please verify Patreon auth first": "Сначала подтвердите авторизацию Patreon", "Patreon auth verified successfully": "Авторизация Patreon успешно проверена", "Invalid Patreon auth": "Недействительная авторизация Patreon", "Verification failed. Please try again": "Не удалось выполнить проверку. Попробуйте ещё раз", "Generating": "Генерация...", "Generate": "Создать", "Verify": "Проверить", "Token generated successfully": "Токен успешно сгенерирован ({{current}}/{{total}})", "Failed to generate token": "Не удалось сгенерировать токен", "Token generation failed. Please try again": "Не удалось сгенерировать токен. Попробуйте ещё раз", "Verifying": "Проверка...", "Verified": "Проверено", "Use code": "Используйте код", "for Patreon Auth, click Verify to unlock demo. Test at": "для аутентификации Patreon, нажмите «Проверить», чтобы разблокировать демо. Тест:", "Need help with Auth Token? See": "Нужна помощь с токеном аутентификации? См.", "the guide": "руководство", "Subscribe": "Подписаться", "to get your Patreon Auth code and start downloading with ease!": "чтобы получить код аутентификации Patreon и с лёгкостью начать скачивание!", "Report bugs or request features:": "Сообщить об ошибках или запросить функции:", "Import": "Импорт", "Importing...": "Импорт...", "Supports JSON and ZIP formats": "Поддерживает форматы JSON и ZIP", "Export": "Экспорт", "Export All Data": "Экспортировать все данные", "Exporting...": "Экспорт...", "Clear": "Очистить", "Filter by Batch": "Фильтр по пакетам", "Are you sure to clear all data in the database?": "Вы уверены, что хотите очистить все данные в базе данных?", "Delete Account Data": "Удалить данные аккаунта", "Are you sure you want to delete account data? This action cannot be undone": "Вы уверены, что хотите удалить данные {{username}}? Это действие нельзя отменить.", "Delete": "Удалить", "Deleting...": "Удаление...", "Overwrite": "Перезаписать", "Overwrite Existing Data?": "Перезаписать существующие данные?", "Account data for @{{username}} already exists in the database. Do you want to overwrite it?": "Данные аккаунта @{{username}} уже существуют в базе данных. Перезаписать их?", "No accounts yet": "Пока нет аккаунтов", "Use Dashboard to fetch data.": "Используйте панель, чтобы получить данные.", "Something went wrong.": "Что-то пошло не так.", "Error:": "Ошибка:", "Fetch": "Получить", "Single": "Одиночный", "Batch": "Пакет", "Auto Batch": "Автопакет", "Timeline": "Лента", "Media": "Медиа", "Batch Size": "Размер пакета", "Starting Batch": "Начальный пакет", "Posts": "Публикации", "Tweets": "Твиты", "Replies": "Ответы", "All": "Все", "Image": "Изображение", "Video": "Видео", "GIF": "GIF", "Batch: {{page}}": "Пакет: {{page}}", "Start": "Старт", "Stop": "Стоп", "Prev": "Назад", "Next": "Далее", "Download Current": "Скачать текущее", "Download All": "Скачать всё", "Use Batch/Auto Batch if single fetch fails": "Используйте пакет/автопакет, если одиночное получение не удалось", "Load from database": "Загрузить из базы данных", "Load database": "Загрузить базу данных", "Home": "Начало", "End": "Конец", "Failed to load data": "Не удалось загрузить данные", "Update": "Обновить", "Updating...": "Обновление...", "Update will fetch the latest data and overwrite the database. Continue?": "Обновление получит последние данные и перезапишет базу данных. Продолжить?", "Followers": "Подписчики", "Following": "Подписки", "Joined": "Дата регистрации", "Open": "Открыть", "Preview": "Предпросмотр", "View Database": "Просмотреть базу данных", "Converting...": "Конвертация...", "Convert & Download": "Конвертировать и скачать" } };
const zh_Hans = { "common": { "Settings": "设置", "Theme": "主题", "Change Theme": "更改主题", "Language": "语言", "Change Language": "更改语言", "Date Time Format": "日期时间格式", "Debug": "调试开关", "Global Settings": "全局设置", "Version": "版本", "Common Formats:": "常用格式:", "Date Formats:": "日期格式:", "Time Formats:": "时间格式:", "Combined Examples:": "组合示例:", "Localized": "本地化", "Reset Settings": "重置设置", "Are you sure you want to reset settings to defaults?": "确定要将设置重置为默认值吗?", "Reset": "重置", "Cancel": "取消", "Chrome": "Chrome", "Userscript": "用户脚本", "Website": "网站", "Patreon": "Patreon", "Dashboard": "仪表板", "Database": "数据库", "Auth": "认证", "Convert Animated GIFs": "转换 GIF", "Convert GIFs (External)": "转换 GIF(外部)", "Concurrent Downloads": "并发下载", "Use 10+ only with fast internet": "仅在网络快速时使用 10+", "Smaller size, same quality": "体积更小,质量相同", "Larger size, same quality": "体积更大,质量相同", "Back": "返回", "Please visit a profile page for auto-detection": "请访问个人资料页面进行自动检测", "Please configure authentication in the Auth tab first": "请先在认证选项卡中配置身份验证", "Invalid username format": "无效的用户名格式", "Invalid auth token. Please check your settings.": "无效的认证令牌,请检查您的设置。", "Invalid Patreon auth. Please check your settings.": "无效的 Patreon 认证,请检查您的设置。", "Failed to fetch data": "获取数据失败", "Failed to fetch data from all APIs": "所有 API 均无法获取数据", "Failed to verify auth from all APIs": "所有 API 均无法验证认证", "Failed to generate token from all APIs": "所有 API 均无法生成令牌", "Generating token...": "正在生成令牌...", "Abort": "中止", "Network error occurred": "发生网络错误", "Request timeout - please try again": "请求超时 - 请重试", "Failed to parse API response": "解析 API 响应失败", "Invalid API response structure": "无效的 API 响应结构", "Unknown error occurred": "发生未知错误", "HTTP error! status: {{status}}": "HTTP 错误!状态:{{status}}", "Download already in progress": "下载已在进行中", "No media files found": "未找到媒体文件", "Toggle visibility": "显示/隐藏", "Close": "关闭", "Converting GIFs...": "正在转换 GIF...", "Downloading...": "正在下载...", "Download": "下载", "Fetching...": "正在获取...", "Fetch All": "获取全部", "Fetch Video": "获取视频", "Fetch Image": "获取图片", "Fetch GIF": "获取 GIF", "Posts: {{posts}}": "帖子:{{posts}}", "Media: {{media}}": "媒体:{{media}}", "Current Media: {{current}} • Total Media: {{total}}": "当前媒体:{{current}} • 总媒体:{{total}}", "Failed to download media": "下载媒体失败", "Demo mode is only available for @xbatchdemo": "演示模式仅适用于 @xbatchdemo", "Auth Token": "认证令牌", "Enter your auth token": "输入您的认证令牌", "Your authentication token for API access": "用于 API 访问的身份验证令牌", "Patreon Auth": "Patreon 认证", "Enter your Patreon auth": "输入您的 Patreon 认证", "Your Patreon authentication key": "您的 Patreon 身份验证密钥", "Please enter Patreon auth first": "请先输入 Patreon 认证", "Please verify Patreon auth first": "请先验证 Patreon 认证", "Patreon auth verified successfully": "Patreon 认证验证成功", "Invalid Patreon auth": "无效的 Patreon 认证", "Verification failed. Please try again": "验证失败,请重试", "Generating": "正在生成", "Generate": "生成", "Verify": "验证", "Token generated successfully": "令牌生成成功 ({{current}}/{{total}})", "Failed to generate token": "生成令牌失败", "Token generation failed. Please try again": "令牌生成失败,请重试", "Verifying": "正在验证", "Verified": "已验证", "Use code": "使用代码", "for Patreon Auth, click Verify to unlock demo. Test at": "用于 Patreon 认证,点击“验证”以解锁演示。测试地址:", "Need help with Auth Token? See": "需要获取认证令牌的帮助?请查看", "the guide": "指南", "Subscribe": "订阅", "to get your Patreon Auth code and start downloading with ease!": "即可获取您的 Patreon 认证码,轻松开始下载!", "Report bugs or request features:": "报告问题或请求功能:", "Import": "导入", "Importing...": "正在导入...", "Supports JSON and ZIP formats": "支持 JSON 和 ZIP 格式", "Export": "导出", "Export All Data": "导出全部数据", "Exporting...": "正在导出...", "Clear": "清空", "Filter by Batch": "按批次过滤", "Are you sure to clear all data in the database?": "确定要清空数据库中的所有数据吗?", "Delete Account Data": "删除账户数据", "Are you sure you want to delete account data? This action cannot be undone": "您确定要删除 {{username}} 的数据吗?此操作无法撤销。", "Delete": "删除", "Deleting...": "正在删除...", "Overwrite": "覆盖", "Overwrite Existing Data?": "覆盖现有数据?", "Account data for @{{username}} already exists in the database. Do you want to overwrite it?": "账户 @{{username}} 的数据已存在于数据库中。您要覆盖吗?", "No accounts yet": "尚未有账户", "Use Dashboard to fetch data.": "使用仪表板获取数据。", "Something went wrong.": "出错了。", "Error:": "错误:", "Fetch": "获取", "Single": "单次", "Batch": "批量", "Auto Batch": "自动批量", "Timeline": "时间线", "Media": "媒体", "Batch Size": "批量大小", "Starting Batch": "起始批次", "Posts": "帖子", "Tweets": "推文", "Replies": "回复", "All": "全部", "Image": "图片", "Video": "视频", "GIF": "GIF", "Batch: {{page}}": "批次:{{page}}", "Start": "开始", "Stop": "停止", "Prev": "上一页", "Next": "下一页", "Download Current": "下载当前", "Download All": "下载全部", "Use Batch/Auto Batch if single fetch fails": "若单次获取失败,请使用批量/自动批量", "Load from database": "从数据库加载", "Load database": "加载数据库", "Home": "首页", "End": "末页", "Failed to load data": "加载数据失败", "Update": "更新", "Updating...": "更新中...", "Update will fetch the latest data and overwrite the database. Continue?": "更新将获取最新数据并覆盖数据库。继续吗?", "Followers": "粉丝", "Following": "正在关注", "Joined": "加入时间", "Open": "打开", "Preview": "预览", "View Database": "查看数据库", "Converting...": "转换中...", "Convert & Download": "转换并下载" } };
const resources = {
"ar": ar,
"de": de,
"en": en$1,
"es": es,
"fr": fr,
"hi": hi,
"ja": ja,
"ko": ko,
"pt": pt,
"ru": ru,
"zh-Hans": zh_Hans
};
const logLinesSignal = signals.signal([]);
const APP_NAME = "twitter-x-media-batch-downloader-pro";
class Logger {
index = 0;
buffer = [];
bufferTimer = null;
isDebugEnabled() {
try {
const { options: options2 } = require("@/core/options");
return options2.get("debug") ?? false;
} catch {
return false;
}
}
info(line, ...args) {
if (this.isDebugEnabled()) {
console.info(`[${APP_NAME}]`, line, ...args);
this.writeBuffer({ type: "info", line, index: this.index++ });
}
}
warn(line, ...args) {
if (this.isDebugEnabled()) {
console.warn(`[${APP_NAME}]`, line, ...args);
this.writeBuffer({ type: "warn", line, index: this.index++ });
}
}
error(line, ...args) {
console.error(`[${APP_NAME}]`, line, ...args);
this.writeBuffer({ type: "error", line, index: this.index++ });
}
errorWithBanner(msg, err, ...args) {
this.error(
`${msg} (Message: ${err?.message ?? "none"})
Report bugs: [email protected]`,
...args
);
}
debug(...args) {
if (this.isDebugEnabled()) {
console.debug(`[${APP_NAME}]`, ...args);
}
}
writeBuffer(log) {
this.buffer.push(log);
if (this.bufferTimer) {
clearTimeout(this.bufferTimer);
}
this.bufferTimer = window.setTimeout(() => {
this.bufferTimer = null;
this.flushBuffer();
}, 0);
}
flushBuffer() {
logLinesSignal.value = [...logLinesSignal.value, ...this.buffer];
this.buffer = [];
}
}
const logger = new Logger();
function safeJSONParse(text) {
try {
return JSON.parse(text);
} catch (e) {
logger.error(e.message);
return null;
}
}
function cx(...classNames) {
return classNames.filter(Boolean).join(" ");
}
function isEqual(obj1, obj2) {
return JSON.stringify(obj1) === JSON.stringify(obj2);
}
function formatDateTime(date, format) {
if (typeof date === "number" || typeof date === "string") {
date = dayjs(date);
}
return date.format(format);
}
function sanitizeFilename(name) {
return name.replace(/[\\/:*?"<>|]/g, "-").replace(/\s+/g, "_").replace(/_+/g, "_").replace(/^_+|_+$/g, "");
}
const version = "1.0.2";
const pkg = {
version
};
const DEFAULT_APP_OPTIONS = {
theme: "light",
debug: false,
showControlPanel: true,
disabledExtensions: [
"HomeTimelineModule",
"ListTimelineModule",
"ListSubscribersModule",
"ListMembersModule"
],
dateTimeFormat: "YYYY-MM-DD HH:mm:ss Z",
filenamePattern: "{screen_name}_{id}_{type}_{num}_{date}.{ext}",
language: "",
version: pkg.version,
convertAnimatedGifs: true,
convertGifsExternal: false,
downloadConcurrency: 1,
fetchMode: "single",
timelineType: "media",
mediaType: "all",
batchSize: 100,
startingBatch: 0
};
const THEMES = [
"light",
"dark",
"cupcake",
"bumblebee",
"emerald",
"corporate",
"synthwave",
"retro",
"cyberpunk",
"valentine",
"halloween",
"garden",
"forest",
"aqua",
"lofi",
"pastel",
"fantasy",
"wireframe",
"black",
"luxury",
"dracula",
"cmyk",
"autumn",
"business",
"acid",
"lemonade",
"night",
"coffee",
"winter",
"dim",
"nord",
"sunset",
"caramellatte",
"abyss",
"silk"
];
const LOCAL_STORAGE_KEY = "twitter-x-media-batch-downloader-pro";
class AppOptionsManager {
appOptions = { ...DEFAULT_APP_OPTIONS };
previous = { ...DEFAULT_APP_OPTIONS };
signal = new signals.Signal(0);
constructor() {
this.loadAppOptions();
}
get(key, defaultValue) {
return this.appOptions[key] ?? defaultValue;
}
set(key, value) {
this.appOptions[key] = value;
this.saveAppOptions();
}
loadAppOptions() {
this.appOptions = {
...this.appOptions,
...safeJSONParse(localStorage.getItem(LOCAL_STORAGE_KEY) || "{}")
};
let migrated = false;
const tt = String(this.appOptions.timelineType ?? "");
if (tt === "posts") {
this.appOptions.timelineType = "timeline";
migrated = true;
} else if (tt === "replies") {
this.appOptions.timelineType = "with_replies";
migrated = true;
}
if (migrated) {
logger.info("App options migrated: timelineType updated to new slugs");
setTimeout(() => this.saveAppOptions(), 0);
}
const oldVersion = this.appOptions.version ?? "";
const newVersion = DEFAULT_APP_OPTIONS.version;
if (newVersion.startsWith("1.1") && oldVersion.startsWith("1.0")) {
this.appOptions.disabledExtensions = [
...this.appOptions.disabledExtensions ?? [],
"HomeTimelineModule",
"ListTimelineModule"
];
logger.info(`App options migrated from v${oldVersion} to v${newVersion}`);
setTimeout(() => this.saveAppOptions(), 0);
}
this.previous = { ...this.appOptions };
logger.info("App options loaded", this.appOptions);
this.signal.value++;
}
saveAppOptions() {
const oldValue = this.previous;
const newValue = {
...this.appOptions,
version: pkg.version
};
if (isEqual(oldValue, newValue)) {
return;
}
this.appOptions = newValue;
localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(this.appOptions));
this.previous = { ...this.appOptions };
logger.debug("App options saved", this.appOptions);
this.signal.value++;
}
}
const appOptionsManager = new AppOptionsManager();
const LANGUAGES_CONFIG = {
en: {
name: "English",
nameEn: "English",
test: (code) => /^en/.test(code)
},
"zh-Hans": {
name: "中文",
nameEn: "Chinese (中文)",
test: (code) => /^zh/.test(code)
},
ar: {
name: "العربية",
nameEn: "Arabic (العربية)",
test: (code) => /^ar/.test(code)
},
ja: {
name: "日本語",
nameEn: "Japanese (日本語)",
test: (code) => /^ja/.test(code)
},
ko: {
name: "한국어",
nameEn: "Korean (한국어)",
test: (code) => /^ko/.test(code)
},
fr: {
name: "Français",
nameEn: "French (Français)",
test: (code) => /^fr/.test(code)
},
de: {
name: "Deutsch",
nameEn: "German (Deutsch)",
test: (code) => /^de/.test(code)
},
hi: {
name: "हिन्दी",
nameEn: "Hindi (हिन्दी)",
test: (code) => /^hi/.test(code)
},
pt: {
name: "Português",
nameEn: "Portuguese (Português)",
test: (code) => /^pt/.test(code)
},
ru: {
name: "Русский",
nameEn: "Russian (Русский)",
test: (code) => /^ru/.test(code)
},
es: {
name: "Español",
nameEn: "Spanish (Español)",
test: (code) => /^es/.test(code)
}
};
function detectBrowserLanguage() {
const language = window.navigator.language || "en";
for (const [langTag, langConf] of Object.entries(LANGUAGES_CONFIG)) {
if (langConf.test(language)) {
return langTag;
}
}
return language;
}
const languageDetector = {
type: "languageDetector",
detect: function() {
return appOptionsManager.get("language") || detectBrowserLanguage();
}
};
function initI18n() {
if (i18next.isInitialized) {
return i18next;
}
i18next.on("languageChanged", (lng) => {
if (!appOptionsManager.get("language")) {
appOptionsManager.set("language", lng);
}
});
i18next.use(languageDetector).init({
initImmediate: true,
defaultNS: "common",
fallbackLng: "en",
nsSeparator: "::",
debug: appOptionsManager.get("debug"),
resources
});
return i18next;
}
function useTranslation(ns) {
const i18n = initI18n();
const [t, setT] = hooks.useState(() => i18n.getFixedT(null, ns ?? null));
const isMountedRef = hooks.useRef(true);
const previousNamespaceRef = hooks.useRef(ns);
hooks.useEffect(() => {
isMountedRef.current = true;
if (previousNamespaceRef.current !== ns) {
previousNamespaceRef.current = ns;
setT(() => i18n.getFixedT(null, ns ?? null));
}
function boundReset() {
if (isMountedRef.current) {
setT(() => i18n.getFixedT(null, ns ?? null));
}
}
i18n.on("languageChanged", boundReset);
return () => {
isMountedRef.current = false;
i18n.off("languageChanged", boundReset);
};
}, [ns]);
return { t, i18n };
}
function Trans({ i18nKey, ns = "common" }) {
const { t } = useTranslation(ns);
return u("span", { children: t(i18nKey) });
}
class ErrorBoundary extends preact.Component {
state = { error: null };
static getDerivedStateFromError(err) {
return { error: err.message };
}
componentDidCatch(err) {
logger.error(err.message, err);
this.setState({ error: err.message });
}
render() {
const i18n = initI18n();
const isArabic = (i18n.language || "").startsWith("ar");
if (this.state.error) {
return u("div", { class: "alert alert-error alert-soft p-2", children: [
u(IconExclamationCircle, {}),
u("div", { dir: isArabic ? "rtl" : void 0, children: [
u("h3", { class: "font-bold leading-normal", children: u(Trans, { ns: "common", i18nKey: "Something went wrong." }) }),
u("p", { class: "text-xs", children: [
u(Trans, { ns: "common", i18nKey: "Error:" }),
" ",
this.state.error
] })
] })
] });
}
return this.props.children;
}
}
const API_CONFIG = {
primary: "https://api.xbatch.online",
alternate: "https://alt.xbatch.online",
timeout: 6e4
};
const mediaDownloaderAPI = {
async fetchMediaData(username, authToken, patreonAuth, params) {
const timelineType = params?.timelineType ?? "media";
const batchSize = params?.batchSize ?? 100;
const startingBatch = params?.startingBatch ?? 0;
const mediaType = params?.mediaType ?? "all";
const fetchMode = params?.fetchMode;
let endpoint;
if (patreonAuth === "xbatchdemo") {
endpoint = `/demo/media/all/xbatchdemo/${authToken}/xbatchdemo`;
} else if (fetchMode === "single") {
endpoint = `/metadata/${encodeURIComponent(timelineType)}/${encodeURIComponent(mediaType)}/${encodeURIComponent(username)}/${encodeURIComponent(authToken)}/${encodeURIComponent(patreonAuth)}`;
} else {
endpoint = `/metadata/${encodeURIComponent(timelineType)}/${encodeURIComponent(String(batchSize))}/${encodeURIComponent(String(startingBatch))}/${encodeURIComponent(mediaType)}/${encodeURIComponent(username)}/${encodeURIComponent(authToken)}/${encodeURIComponent(patreonAuth)}`;
}
try {
const response = await this.makeRequest(API_CONFIG.primary + endpoint);
return response;
} catch (primaryError) {
console.warn("Primary API failed, trying alternate:", primaryError);
try {
const response = await this.makeRequest(API_CONFIG.alternate + endpoint);
return response;
} catch (alternateError) {
console.error("All APIs failed:", { primaryError, alternateError });
throw new Error("Failed to fetch data from all APIs");
}
}
},
async makeRequest(url) {
return new Promise((resolve, reject) => {
if (typeof GM_xmlhttpRequest !== "undefined") {
GM_xmlhttpRequest({
method: "GET",
url,
timeout: API_CONFIG.timeout,
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
},
onload: (response) => {
try {
if (response.status !== 200) {
reject(new Error(`HTTP error! status: ${response.status}`));
return;
}
const data = JSON.parse(response.responseText);
if (!this.validateResponse(data)) {
reject(new Error("Invalid API response structure"));
return;
}
resolve(data);
} catch (parseError) {
reject(new Error("Failed to parse API response"));
}
},
onerror: () => {
reject(new Error("Network error occurred"));
},
ontimeout: () => {
reject(new Error("Request timeout - please try again"));
}
});
} else {
this.makeRequestWithFetch(url).then(resolve).catch(reject);
}
});
},
async makeRequestWithFetch(url) {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), API_CONFIG.timeout);
try {
const response = await fetch(url, {
method: "GET",
signal: controller.signal,
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
}
});
clearTimeout(timeoutId);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
if (!this.validateResponse(data)) {
throw new Error("Invalid API response structure");
}
return data;
} catch (error) {
clearTimeout(timeoutId);
if (error instanceof Error) {
if (error.name === "AbortError") {
throw new Error("Request timeout - please try again");
}
throw error;
}
throw new Error("Unknown error occurred");
}
},
validateResponse(data) {
return data && typeof data === "object" && data.account_info && typeof data.account_info === "object" && data.metadata && typeof data.metadata === "object" && Array.isArray(data.timeline);
},
formatUsername(username) {
return username.replace(/^@/, "").trim().toLowerCase();
},
validateUsername(username) {
const cleanUsername = this.formatUsername(username);
return /^[a-zA-Z0-9_]{1,15}$/.test(cleanUsername);
},
validateAuthToken(token) {
return token.trim().length > 10;
},
validatePatreonAuth(auth) {
return auth.trim().length > 0;
},
async verifyPatreonAuth(patreonAuth) {
if (patreonAuth === "xbatchdemo") {
return { valid: true };
}
const endpoint = `/verify/${patreonAuth}`;
try {
const response = await this.makeAuthRequest(API_CONFIG.primary + endpoint);
return response;
} catch (primaryError) {
console.warn("Primary API failed, trying alternate:", primaryError);
try {
const response = await this.makeAuthRequest(API_CONFIG.alternate + endpoint);
return response;
} catch (alternateError) {
console.error("All APIs failed:", { primaryError, alternateError });
throw new Error("Failed to verify auth from all APIs");
}
}
},
async generateAuthToken(patreonAuth) {
const endpoint = `/token/${patreonAuth}`;
try {
const response = await this.makeAuthRequest(API_CONFIG.primary + endpoint);
return response;
} catch (primaryError) {
console.warn("Primary API failed, trying alternate:", primaryError);
try {
const response = await this.makeAuthRequest(API_CONFIG.alternate + endpoint);
return response;
} catch (alternateError) {
console.error("All APIs failed:", { primaryError, alternateError });
throw new Error("Failed to generate token from all APIs");
}
}
},
async makeAuthRequest(url) {
return new Promise((resolve, reject) => {
if (typeof GM_xmlhttpRequest !== "undefined") {
GM_xmlhttpRequest({
method: "GET",
url,
timeout: API_CONFIG.timeout,
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
},
onload: (response) => {
try {
if (response.status !== 200) {
reject(new Error(`HTTP error! status: ${response.status}`));
return;
}
const data = JSON.parse(response.responseText);
resolve(data);
} catch (parseError) {
reject(new Error("Failed to parse API response"));
}
},
onerror: () => {
reject(new Error("Network error occurred"));
},
ontimeout: () => {
reject(new Error("Request timeout - please try again"));
}
});
} else {
this.makeAuthRequestWithFetch(url).then(resolve).catch(reject);
}
});
},
async makeAuthRequestWithFetch(url) {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), API_CONFIG.timeout);
try {
const response = await fetch(url, {
method: "GET",
signal: controller.signal,
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
}
});
clearTimeout(timeoutId);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error) {
clearTimeout(timeoutId);
if (error instanceof Error) {
if (error.name === "AbortError") {
throw new Error("Request timeout - please try again");
}
throw error;
}
throw new Error("Unknown error occurred");
}
}
};
class MediaDownloaderDB extends Dexie {
accounts;
auth_settings;
constructor() {
super("TwitterXMediaBatchDownloaderPro");
this.version(1).stores({
accounts: "++id, username, cached_at",
auth_settings: "++id"
});
this.version(2).stores({
accounts: "++id, username, cached_at, batch_identifier",
auth_settings: "++id"
});
}
}
const mediaDB = new MediaDownloaderDB();
const dbState = {
totalAccounts: signals.signal(0),
dbChangeSignal: signals.signal(0)
};
async function updateTotalCount() {
try {
dbState.totalAccounts.value = await mediaDB.accounts.count();
} catch {
}
}
const mediaDownloaderDB = {
async saveAccount(data) {
const account = {
...data,
cached_at: Date.now()
};
let existing;
if (account.batch_mode && account.batch_mode !== "single") {
const batchAccounts = await mediaDB.accounts.where("username").equals(data.username).filter((acc) => !!(acc.batch_mode && acc.batch_mode !== "single")).toArray();
if (batchAccounts.length > 0) {
batchAccounts.sort((a, b) => b.cached_at - a.cached_at);
existing = batchAccounts[0];
}
} else {
existing = await mediaDB.accounts.where("username").equals(data.username).filter((acc) => !acc.batch_mode || acc.batch_mode === "single").first();
}
let id;
if (existing) {
await mediaDB.accounts.update(existing.id, account);
id = existing.id;
} else {
id = await mediaDB.accounts.add(account);
}
await updateTotalCount();
dbState.dbChangeSignal.value++;
return id;
},
async insertAccount(data) {
const id = await mediaDB.accounts.add(data);
await updateTotalCount();
dbState.dbChangeSignal.value++;
return id;
},
async getAccounts(page = 1, limit = 3, filterByBatch = false) {
const offset = (page - 1) * limit;
let collection = mediaDB.accounts.orderBy("cached_at").reverse();
if (filterByBatch) {
collection = collection.filter((acc) => !!(acc.batch_mode && acc.batch_mode !== "single"));
}
return await collection.offset(offset).limit(limit).toArray();
},
async getAccountsCount(filterByBatch = false) {
if (filterByBatch) {
return await mediaDB.accounts.filter((acc) => !!(acc.batch_mode && acc.batch_mode !== "single")).count();
}
return await mediaDB.accounts.count();
},
async getAccountByUsername(username) {
return await mediaDB.accounts.where("username").equals(username).first();
},
async getAccountsByUsername(username) {
return await mediaDB.accounts.where("username").equals(username).reverse().sortBy("cached_at");
},
async getAccountsByUsernameAndMode(username, mode) {
if (mode === "single") {
const account = await mediaDB.accounts.where("username").equals(username).filter((acc) => !acc.batch_mode || acc.batch_mode === "single").first();
return account ? [account] : [];
} else {
return await mediaDB.accounts.where("username").equals(username).filter((acc) => !!(acc.batch_mode && acc.batch_mode !== "single")).toArray();
}
},
async updateAccount(id, data) {
await mediaDB.accounts.update(id, data);
dbState.dbChangeSignal.value++;
},
async deleteAccount(id) {
await mediaDB.accounts.delete(id);
await updateTotalCount();
dbState.dbChangeSignal.value++;
},
async saveAuthSettings(authToken, patreonAuth) {
const existing = await mediaDB.auth_settings.toCollection().first();
const base = existing ? { ...existing } : {};
const settings = {
...base,
auth_token: authToken,
patreon_auth: patreonAuth,
updated_at: Date.now(),
patreon_verified: base.patreon_verified && base.patreon_verified_auth === patreonAuth ? base.patreon_verified : false,
patreon_verified_auth: base.patreon_verified && base.patreon_verified_auth === patreonAuth ? base.patreon_verified_auth : patreonAuth
};
if (existing) {
await mediaDB.auth_settings.update(existing.id, settings);
return existing.id;
} else {
return await mediaDB.auth_settings.add(settings);
}
},
async setPatreonVerified(verified) {
const existing = await mediaDB.auth_settings.toCollection().first();
if (existing) {
await mediaDB.auth_settings.update(existing.id, {
patreon_verified: verified,
patreon_verified_auth: existing.patreon_auth,
updated_at: Date.now()
});
} else {
await mediaDB.auth_settings.add({
auth_token: "",
patreon_auth: "",
patreon_verified: verified,
patreon_verified_auth: "",
updated_at: Date.now()
});
}
},
async getAuthSettings() {
return await mediaDB.auth_settings.toCollection().first();
},
async getAllAccounts() {
return await mediaDB.accounts.orderBy("cached_at").reverse().toArray();
},
async clearAll() {
await mediaDB.accounts.clear();
dbState.totalAccounts.value = 0;
dbState.dbChangeSignal.value++;
}
};
class Crc32 {
constructor() {
this.crc = -1;
}
append(data) {
var crc = this.crc | 0;
var table = this.table;
for (var offset = 0, len = data.length | 0; offset < len; offset++) {
crc = crc >>> 8 ^ table[(crc ^ data[offset]) & 255];
}
this.crc = crc;
}
get() {
return ~this.crc;
}
}
Crc32.prototype.table = (() => {
var i;
var j2;
var t;
var table = [];
for (i = 0; i < 256; i++) {
t = i;
for (j2 = 0; j2 < 8; j2++) {
t = t & 1 ? t >>> 1 ^ 3988292384 : t >>> 1;
}
table[i] = t;
}
return table;
})();
const getDataHelper = (byteLength) => {
var uint8 = new Uint8Array(byteLength);
return {
array: uint8,
view: new DataView(uint8.buffer)
};
};
const pump = (zipObj) => zipObj.reader.read().then((chunk) => {
if (chunk.done) return zipObj.writeFooter();
const outputData = chunk.value;
zipObj.crc.append(outputData);
zipObj.uncompressedLength += outputData.length;
zipObj.compressedLength += outputData.length;
zipObj.ctrl.enqueue(outputData);
});
function createWriter(underlyingSource) {
const files = Object.create(null);
const filenames = [];
const encoder = new TextEncoder();
let offset = 0;
let activeZipIndex = 0;
let ctrl;
let activeZipObject, closed;
function next() {
activeZipIndex++;
activeZipObject = files[filenames[activeZipIndex]];
if (activeZipObject) processNextChunk();
else if (closed) closeZip();
}
var zipWriter = {
enqueue(fileLike) {
if (closed)
throw new TypeError(
"Cannot enqueue a chunk into a readable stream that is closed or has been requested to be closed"
);
let name = fileLike.name.trim();
const date = new Date(
typeof fileLike.lastModified === "undefined" ? Date.now() : fileLike.lastModified
);
if (fileLike.directory && !name.endsWith("/")) name += "/";
if (files[name]) throw new Error("File already exists.");
const nameBuf = encoder.encode(name);
filenames.push(name);
const zipObject = files[name] = {
level: 0,
ctrl,
directory: !!fileLike.directory,
nameBuf,
comment: encoder.encode(fileLike.comment || ""),
compressedLength: 0,
uncompressedLength: 0,
writeHeader() {
var header = getDataHelper(26);
var data = getDataHelper(30 + nameBuf.length);
zipObject.offset = offset;
zipObject.header = header;
if (zipObject.level !== 0 && !zipObject.directory) {
header.view.setUint16(4, 2048);
}
header.view.setUint32(0, 335546376);
header.view.setUint16(
6,
(date.getHours() << 6 | date.getMinutes()) << 5 | date.getSeconds() / 2,
true
);
header.view.setUint16(
8,
(date.getFullYear() - 1980 << 4 | date.getMonth() + 1) << 5 | date.getDate(),
true
);
header.view.setUint16(22, nameBuf.length, true);
data.view.setUint32(0, 1347093252);
data.array.set(header.array, 4);
data.array.set(nameBuf, 30);
offset += data.array.length;
ctrl.enqueue(data.array);
},
writeFooter() {
var footer = getDataHelper(16);
footer.view.setUint32(0, 1347094280);
if (zipObject.crc) {
zipObject.header.view.setUint32(10, zipObject.crc.get(), true);
zipObject.header.view.setUint32(14, zipObject.compressedLength, true);
zipObject.header.view.setUint32(18, zipObject.uncompressedLength, true);
footer.view.setUint32(4, zipObject.crc.get(), true);
footer.view.setUint32(8, zipObject.compressedLength, true);
footer.view.setUint32(12, zipObject.uncompressedLength, true);
}
ctrl.enqueue(footer.array);
offset += zipObject.compressedLength + 16;
next();
},
fileLike
};
if (!activeZipObject) {
activeZipObject = zipObject;
processNextChunk();
}
},
close() {
if (closed)
throw new TypeError(
"Cannot close a readable stream that has already been requested to be closed"
);
if (!activeZipObject) closeZip();
closed = true;
}
};
function closeZip() {
var length = 0;
var index = 0;
var indexFilename, file;
for (indexFilename = 0; indexFilename < filenames.length; indexFilename++) {
file = files[filenames[indexFilename]];
length += 46 + file.nameBuf.length + file.comment.length;
}
const data = getDataHelper(length + 22);
for (indexFilename = 0; indexFilename < filenames.length; indexFilename++) {
file = files[filenames[indexFilename]];
data.view.setUint32(index, 1347092738);
data.view.setUint16(index + 4, 5120);
data.array.set(file.header.array, index + 6);
data.view.setUint16(index + 32, file.comment.length, true);
if (file.directory) {
data.view.setUint8(index + 38, 16);
}
data.view.setUint32(index + 42, file.offset, true);
data.array.set(file.nameBuf, index + 46);
data.array.set(file.comment, index + 46 + file.nameBuf.length);
index += 46 + file.nameBuf.length + file.comment.length;
}
data.view.setUint32(index, 1347093766);
data.view.setUint16(index + 8, filenames.length, true);
data.view.setUint16(index + 10, filenames.length, true);
data.view.setUint32(index + 12, length, true);
data.view.setUint32(index + 16, offset, true);
ctrl.enqueue(data.array);
ctrl.close();
}
function processNextChunk() {
if (!activeZipObject) return;
if (activeZipObject.directory)
return activeZipObject.writeFooter(activeZipObject.writeHeader());
if (activeZipObject.reader) return pump(activeZipObject);
if (activeZipObject.fileLike.stream) {
activeZipObject.crc = new Crc32();
activeZipObject.reader = activeZipObject.fileLike.stream().getReader();
activeZipObject.writeHeader();
} else next();
}
return new ReadableStream({
start: (c) => {
ctrl = c;
if (underlyingSource.start) Promise.resolve(underlyingSource.start(zipWriter));
},
pull() {
return processNextChunk() || underlyingSource.pull && Promise.resolve(underlyingSource.pull(zipWriter));
}
});
}
function isFSASupported() {
return "showSaveFilePicker" in window;
}
async function getDownloadStream(filename, useNativePicker = true) {
if (isFSASupported() && useNativePicker) {
try {
logger.info(`Using File System Access API for ${filename}`);
const fileHandle = await window.showSaveFilePicker({
suggestedName: filename,
types: [
{
description: "ZIP Archive",
accept: { "application/zip": [".zip"] }
}
]
});
const writable = await fileHandle.createWritable();
logger.info("FSA writable stream created successfully");
return writable;
} catch (error) {
if (error.name === "AbortError") {
logger.info("User cancelled file picker");
throw new Error("Download cancelled");
}
logger.warn(`FSA failed, falling back to StreamSaver: ${error.message}`);
}
}
logger.warn("FSA not available, will use blob fallback");
throw new Error("FSA_NOT_AVAILABLE");
}
async function streamToFile(readableStream, filename, useNativePicker = true, onProgress) {
try {
const writableStream = await getDownloadStream(filename, useNativePicker);
if (onProgress) ;
else {
await readableStream.pipeTo(writableStream);
}
logger.info(`Streaming download completed via FSA: ${filename}`);
} catch (error) {
if (error.message === "FSA_NOT_AVAILABLE" || error.name === "AbortError") {
if (error.name === "AbortError") {
throw error;
}
logger.info(`Fallback to blob download for: ${filename}`);
await streamToBlobDownload(readableStream, filename, onProgress);
} else {
throw error;
}
}
}
async function streamToBlobDownload(readableStream, filename, onProgress) {
const chunks = [];
let bytesWritten = 0;
const reader = readableStream.getReader();
try {
while (true) {
const { done, value } = await reader.read();
if (done) break;
chunks.push(value);
bytesWritten += value.byteLength || value.length || 0;
if (onProgress) ;
}
} finally {
reader.releaseLock();
}
const blob = new Blob(chunks);
fileSaverEs.saveAs(blob, filename);
logger.info(`Blob download completed: ${filename} (${bytesWritten} bytes)`);
}
async function zipStreamDownload(zipFilename, files, onProgress, rateLimit = 1e3, concurrency = 1, abortSignal) {
let current = 0;
const total = files.length;
if (concurrency <= 1) {
const fileIterator = files.values();
const readableZipStream2 = createWriter({
async pull(ctrl) {
if (abortSignal?.aborted) {
logger.info(`Download aborted. Zipping ${current} files that were downloaded.`);
ctrl.close();
return;
}
const fileInfo = fileIterator.next();
if (fileInfo.done) {
ctrl.close();
} else {
const { filename, url } = fileInfo.value;
const start = Date.now();
logger.debug(`Start downloading ${filename} from ${url}`);
try {
const res = await fetch(url);
if (abortSignal?.aborted) {
logger.info(`Download aborted. Zipping ${current} files that were downloaded.`);
ctrl.close();
return;
}
ctrl.enqueue({
name: filename,
stream: () => res.body
});
onProgress?.(++current, total, fileInfo.value);
logger.debug(`Finished downloading ${filename} in ${Date.now() - start}ms`);
await new Promise((resolve) => setTimeout(resolve, rateLimit));
} catch (error) {
if (abortSignal?.aborted) {
logger.info(`Download aborted. Zipping ${current} files that were downloaded.`);
ctrl.close();
return;
}
throw error;
}
}
}
});
logger.info(`Exporting to ZIP file: ${zipFilename}`);
logger.info(`Using ${isFSASupported() ? "File System Access API" : "StreamSaver.js"} for streaming`);
await streamToFile(readableZipStream2, zipFilename);
return;
}
let completed = 0;
let fileIndex = 0;
const queue = [];
let resolveNext = null;
let isZipClosed = false;
const downloadWorker = async () => {
while (fileIndex < files.length) {
if (abortSignal?.aborted) {
logger.info("Download aborted, stopping worker");
fileIndex = files.length;
break;
}
const currentFileIndex = fileIndex++;
const file = files[currentFileIndex];
if (!file) continue;
const start = Date.now();
logger.debug(`Start downloading ${file.filename} from ${file.url}`);
try {
const fetchPromise = fetch(file.url);
const abortCheckInterval = 100;
const res = await Promise.race([
fetchPromise,
new Promise((_, reject) => {
const checkInterval = setInterval(() => {
if (abortSignal?.aborted) {
clearInterval(checkInterval);
reject(new Error("Download aborted"));
}
}, abortCheckInterval);
fetchPromise.finally(() => clearInterval(checkInterval));
})
]);
if (abortSignal?.aborted) {
logger.info("Download aborted after fetching file, stopping");
fileIndex = files.length;
break;
}
const body = res.body;
if (!body) {
logger.error(`No response body for ${file.filename}`);
continue;
}
queue.push({
name: file.filename,
stream: () => body,
original: file
});
logger.debug(`Finished downloading ${file.filename} in ${Date.now() - start}ms`);
if (resolveNext) {
const resolve = resolveNext;
resolveNext = null;
resolve();
}
} catch (error) {
if (abortSignal?.aborted) {
logger.info("Download aborted during fetch, stopping");
fileIndex = files.length;
break;
}
logger.error(`Failed to download ${file.filename}:`, error);
}
}
if (resolveNext && !isZipClosed) {
const resolve = resolveNext;
resolveNext = null;
resolve();
}
};
const workers = Array.from({ length: Math.min(concurrency, files.length) }, () => downloadWorker());
const readableZipStream = createWriter({
async pull(ctrl) {
if (abortSignal?.aborted && queue.length === 0) {
isZipClosed = true;
logger.info(`Download aborted. Zipping ${completed} files that were downloaded.`);
ctrl.close();
return;
}
while (queue.length === 0 && fileIndex < files.length && !abortSignal?.aborted) {
await new Promise((resolve) => {
resolveNext = resolve;
});
if (abortSignal?.aborted) {
break;
}
}
if (queue.length > 0) {
const fileData = queue.shift();
if (fileData) {
ctrl.enqueue({
name: fileData.name,
stream: fileData.stream
});
onProgress?.(++completed, total, fileData.original);
}
} else if (fileIndex >= files.length || abortSignal?.aborted) {
isZipClosed = true;
if (abortSignal?.aborted) {
logger.info(`Download aborted. Zipping ${completed} files that were downloaded.`);
}
ctrl.close();
}
}
});
logger.info(`Exporting to ZIP file: ${zipFilename}`);
logger.info(`Using ${isFSASupported() ? "File System Access API" : "StreamSaver.js"} for streaming`);
logger.info(`Download concurrency: ${concurrency}`);
await Promise.all([
streamToFile(readableZipStream, zipFilename),
...workers
]);
}
function getGifShotOptions() {
return {
sampleInterval: 10,
numWorkers: 2,
numFrames: 30,
interval: 0.1,
frameDuration: 0.1,
crossOrigin: "anonymous"
};
}
function getDefaultExportFromCjs(x) {
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
}
var gifshot$1 = { exports: {} };
var hasRequiredGifshot;
function requireGifshot() {
if (hasRequiredGifshot) return gifshot$1.exports;
hasRequiredGifshot = 1;
(function(module, exports) {
(function(window2, document2, navigator, undefined$1) {
var utils = {
URL: window2.URL || window2.webkitURL || window2.mozURL || window2.msURL,
getUserMedia: (function() {
var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
return getUserMedia ? getUserMedia.bind(navigator) : getUserMedia;
})(),
requestAnimFrame: window2.requestAnimationFrame || window2.webkitRequestAnimationFrame || window2.mozRequestAnimationFrame || window2.oRequestAnimationFrame || window2.msRequestAnimationFrame,
requestTimeout: function requestTimeout(callback, delay) {
callback = callback || utils.noop;
delay = delay || 0;
if (!utils.requestAnimFrame) {
return setTimeout(callback, delay);
}
var start = ( new Date()).getTime();
var handle = new Object();
var requestAnimFrame = utils.requestAnimFrame;
var loop = function loop2() {
var current = ( new Date()).getTime();
var delta = current - start;
delta >= delay ? callback.call() : handle.value = requestAnimFrame(loop2);
};
handle.value = requestAnimFrame(loop);
return handle;
},
Blob: window2.Blob || window2.BlobBuilder || window2.WebKitBlobBuilder || window2.MozBlobBuilder || window2.MSBlobBuilder,
btoa: (function() {
var btoa = window2.btoa || function(input) {
var output = "";
var i = 0;
var l = input.length;
var key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var chr1 = void 0;
var chr2 = void 0;
var chr3 = void 0;
var enc1 = void 0;
var enc2 = void 0;
var enc3 = void 0;
var enc4 = void 0;
while (i < l) {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = (chr1 & 3) << 4 | chr2 >> 4;
enc3 = (chr2 & 15) << 2 | chr3 >> 6;
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output = output + key.charAt(enc1) + key.charAt(enc2) + key.charAt(enc3) + key.charAt(enc4);
}
return output;
};
return btoa ? btoa.bind(window2) : utils.noop;
})(),
isObject: function isObject(obj) {
return obj && Object.prototype.toString.call(obj) === "[object Object]";
},
isEmptyObject: function isEmptyObject(obj) {
return utils.isObject(obj) && !Object.keys(obj).length;
},
isArray: function isArray(arr) {
return arr && Array.isArray(arr);
},
isFunction: function isFunction(func) {
return func && typeof func === "function";
},
isElement: function isElement(elem) {
return elem && elem.nodeType === 1;
},
isString: function isString(value) {
return typeof value === "string" || Object.prototype.toString.call(value) === "[object String]";
},
isSupported: {
canvas: function canvas() {
var el = document2.createElement("canvas");
return el && el.getContext && el.getContext("2d");
},
webworkers: function webworkers() {
return window2.Worker;
},
blob: function blob() {
return utils.Blob;
},
Uint8Array: function Uint8Array2() {
return window2.Uint8Array;
},
Uint32Array: function Uint32Array2() {
return window2.Uint32Array;
},
videoCodecs: (function() {
var testEl = document2.createElement("video");
var supportObj = {
"mp4": false,
"h264": false,
"ogv": false,
"ogg": false,
"webm": false
};
try {
if (testEl && testEl.canPlayType) {
supportObj.mp4 = testEl.canPlayType('video/mp4; codecs="mp4v.20.8"') !== "";
supportObj.h264 = (testEl.canPlayType('video/mp4; codecs="avc1.42E01E"') || testEl.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"')) !== "";
supportObj.ogv = testEl.canPlayType('video/ogg; codecs="theora"') !== "";
supportObj.ogg = testEl.canPlayType('video/ogg; codecs="theora"') !== "";
supportObj.webm = testEl.canPlayType('video/webm; codecs="vp8, vorbis"') !== -1;
}
} catch (e) {
}
return supportObj;
})()
},
noop: function noop2() {
},
each: function each(collection, callback) {
var x = void 0;
var len = void 0;
if (utils.isArray(collection)) {
x = -1;
len = collection.length;
while (++x < len) {
if (callback(x, collection[x]) === false) {
break;
}
}
} else if (utils.isObject(collection)) {
for (x in collection) {
if (collection.hasOwnProperty(x)) {
if (callback(x, collection[x]) === false) {
break;
}
}
}
}
},
mergeOptions: function mergeOptions(defaultOptions2, userOptions) {
if (!utils.isObject(defaultOptions2) || !utils.isObject(userOptions) || !Object.keys) {
return;
}
var newObj = {};
utils.each(defaultOptions2, function(key, val) {
newObj[key] = defaultOptions2[key];
});
utils.each(userOptions, function(key, val) {
var currentUserOption = userOptions[key];
if (!utils.isObject(currentUserOption)) {
newObj[key] = currentUserOption;
} else {
if (!defaultOptions2[key]) {
newObj[key] = currentUserOption;
} else {
newObj[key] = utils.mergeOptions(defaultOptions2[key], currentUserOption);
}
}
});
return newObj;
},
setCSSAttr: function setCSSAttr(elem, attr, val) {
if (!utils.isElement(elem)) {
return;
}
if (utils.isString(attr) && utils.isString(val)) {
elem.style[attr] = val;
} else if (utils.isObject(attr)) {
utils.each(attr, function(key, val2) {
elem.style[key] = val2;
});
}
},
removeElement: function removeElement(node) {
if (!utils.isElement(node)) {
return;
}
if (node.parentNode) {
node.parentNode.removeChild(node);
}
},
createWebWorker: function createWebWorker(content) {
if (!utils.isString(content)) {
return {};
}
try {
var blob = new utils.Blob([content], {
"type": "text/javascript"
});
var objectUrl = utils.URL.createObjectURL(blob);
var worker = new Worker(objectUrl);
return {
"objectUrl": objectUrl,
"worker": worker
};
} catch (e) {
return "" + e;
}
},
getExtension: function getExtension(src) {
return src.substr(src.lastIndexOf(".") + 1, src.length);
},
getFontSize: function getFontSize() {
var options2 = arguments.length > 0 && arguments[0] !== undefined$1 ? arguments[0] : {};
if (!document2.body || options2.resizeFont === false) {
return options2.fontSize;
}
var text = options2.text;
var containerWidth = options2.gifWidth;
var fontSize = parseInt(options2.fontSize, 10);
var minFontSize = parseInt(options2.minFontSize, 10);
var div = document2.createElement("div");
var span = document2.createElement("span");
div.setAttribute("width", containerWidth);
div.appendChild(span);
span.innerHTML = text;
span.style.fontSize = fontSize + "px";
span.style.textIndent = "-9999px";
span.style.visibility = "hidden";
document2.body.appendChild(span);
while (span.offsetWidth > containerWidth && fontSize >= minFontSize) {
span.style.fontSize = --fontSize + "px";
}
document2.body.removeChild(span);
return fontSize + "px";
},
webWorkerError: false
};
var utils$2 = Object.freeze({
default: utils
});
var error = {
validate: function validate(skipObj) {
skipObj = utils.isObject(skipObj) ? skipObj : {};
var errorObj = {};
utils.each(error.validators, function(indece, currentValidator) {
var errorCode = currentValidator.errorCode;
if (!skipObj[errorCode] && !currentValidator.condition) {
errorObj = currentValidator;
errorObj.error = true;
return false;
}
});
delete errorObj.condition;
return errorObj;
},
isValid: function isValid(skipObj) {
var errorObj = error.validate(skipObj);
var isValid2 = errorObj.error !== true ? true : false;
return isValid2;
},
validators: [{
condition: utils.isFunction(utils.getUserMedia),
errorCode: "getUserMedia",
errorMsg: "The getUserMedia API is not supported in your browser"
}, {
condition: utils.isSupported.canvas(),
errorCode: "canvas",
errorMsg: "Canvas elements are not supported in your browser"
}, {
condition: utils.isSupported.webworkers(),
errorCode: "webworkers",
errorMsg: "The Web Workers API is not supported in your browser"
}, {
condition: utils.isFunction(utils.URL),
errorCode: "window.URL",
errorMsg: "The window.URL API is not supported in your browser"
}, {
condition: utils.isSupported.blob(),
errorCode: "window.Blob",
errorMsg: "The window.Blob File API is not supported in your browser"
}, {
condition: utils.isSupported.Uint8Array(),
errorCode: "window.Uint8Array",
errorMsg: "The window.Uint8Array function constructor is not supported in your browser"
}, {
condition: utils.isSupported.Uint32Array(),
errorCode: "window.Uint32Array",
errorMsg: "The window.Uint32Array function constructor is not supported in your browser"
}],
messages: {
videoCodecs: {
errorCode: "videocodec",
errorMsg: "The video codec you are trying to use is not supported in your browser"
}
}
};
var error$2 = Object.freeze({
default: error
});
var noop = function noop2() {
};
var defaultOptions = {
sampleInterval: 10,
numWorkers: 2,
filter: "",
gifWidth: 200,
gifHeight: 200,
interval: 0.1,
numFrames: 10,
frameDuration: 1,
keepCameraOn: false,
images: [],
video: null,
webcamVideoElement: null,
cameraStream: null,
text: "",
fontWeight: "normal",
fontSize: "16px",
minFontSize: "10px",
resizeFont: false,
fontFamily: "sans-serif",
fontColor: "#ffffff",
textAlign: "center",
textBaseline: "bottom",
textXCoordinate: null,
textYCoordinate: null,
progressCallback: noop,
completeCallback: noop,
saveRenderingContexts: false,
savedRenderingContexts: [],
crossOrigin: "Anonymous"
};
var defaultOptions$2 = Object.freeze({
default: defaultOptions
});
function isSupported() {
return error.isValid();
}
function isWebCamGIFSupported() {
return error.isValid();
}
function isSupported$1() {
var options2 = {
getUserMedia: true
};
return error.isValid(options2);
}
function isExistingVideoGIFSupported(codecs) {
var hasValidCodec = false;
if (utils.isArray(codecs) && codecs.length) {
utils.each(codecs, function(indece, currentCodec) {
if (utils.isSupported.videoCodecs[currentCodec]) {
hasValidCodec = true;
}
});
if (!hasValidCodec) {
return false;
}
} else if (utils.isString(codecs) && codecs.length) {
if (!utils.isSupported.videoCodecs[codecs]) {
return false;
}
}
return error.isValid({
"getUserMedia": true
});
}
function NeuQuant() {
var netsize = 256;
var prime1 = 499;
var prime2 = 491;
var prime3 = 487;
var prime4 = 503;
var minpicturebytes = 3 * prime4;
var maxnetpos = netsize - 1;
var netbiasshift = 4;
var ncycles = 100;
var intbiasshift = 16;
var intbias = 1 << intbiasshift;
var gammashift = 10;
var betashift = 10;
var beta = intbias >> betashift;
var betagamma = intbias << gammashift - betashift;
var initrad = netsize >> 3;
var radiusbiasshift = 6;
var radiusbias = 1 << radiusbiasshift;
var initradius = initrad * radiusbias;
var radiusdec = 30;
var alphabiasshift = 10;
var initalpha = 1 << alphabiasshift;
var alphadec;
var radbiasshift = 8;
var radbias = 1 << radbiasshift;
var alpharadbshift = alphabiasshift + radbiasshift;
var alpharadbias = 1 << alpharadbshift;
var thepicture;
var lengthcount;
var samplefac;
var network;
var netindex = [];
var bias = [];
var freq = [];
var radpower = [];
function NeuQuantConstructor(thepic, len, sample) {
var i;
var p;
thepicture = thepic;
lengthcount = len;
samplefac = sample;
network = new Array(netsize);
for (i = 0; i < netsize; i++) {
network[i] = new Array(4);
p = network[i];
p[0] = p[1] = p[2] = (i << netbiasshift + 8) / netsize | 0;
freq[i] = intbias / netsize | 0;
bias[i] = 0;
}
}
function colorMap() {
var map2 = [];
var index = new Array(netsize);
for (var i = 0; i < netsize; i++) {
index[network[i][3]] = i;
}
var k = 0;
for (var l = 0; l < netsize; l++) {
var j2 = index[l];
map2[k++] = network[j2][0];
map2[k++] = network[j2][1];
map2[k++] = network[j2][2];
}
return map2;
}
function inxbuild() {
var i;
var j2;
var smallpos;
var smallval;
var p;
var q2;
var previouscol;
var startpos;
previouscol = 0;
startpos = 0;
for (i = 0; i < netsize; i++) {
p = network[i];
smallpos = i;
smallval = p[1];
for (j2 = i + 1; j2 < netsize; j2++) {
q2 = network[j2];
if (q2[1] < smallval) {
smallpos = j2;
smallval = q2[1];
}
}
q2 = network[smallpos];
if (i != smallpos) {
j2 = q2[0];
q2[0] = p[0];
p[0] = j2;
j2 = q2[1];
q2[1] = p[1];
p[1] = j2;
j2 = q2[2];
q2[2] = p[2];
p[2] = j2;
j2 = q2[3];
q2[3] = p[3];
p[3] = j2;
}
if (smallval != previouscol) {
netindex[previouscol] = startpos + i >> 1;
for (j2 = previouscol + 1; j2 < smallval; j2++) {
netindex[j2] = i;
}
previouscol = smallval;
startpos = i;
}
}
netindex[previouscol] = startpos + maxnetpos >> 1;
for (j2 = previouscol + 1; j2 < 256; j2++) {
netindex[j2] = maxnetpos;
}
}
function learn() {
var i;
var j2;
var b;
var g2;
var r;
var radius;
var rad;
var alpha;
var step;
var delta;
var samplepixels;
var p;
var pix;
var lim;
if (lengthcount < minpicturebytes) {
samplefac = 1;
}
alphadec = 30 + (samplefac - 1) / 3;
p = thepicture;
pix = 0;
lim = lengthcount;
samplepixels = lengthcount / (3 * samplefac);
delta = samplepixels / ncycles | 0;
alpha = initalpha;
radius = initradius;
rad = radius >> radiusbiasshift;
if (rad <= 1) {
rad = 0;
}
for (i = 0; i < rad; i++) {
radpower[i] = alpha * ((rad * rad - i * i) * radbias / (rad * rad));
}
if (lengthcount < minpicturebytes) {
step = 3;
} else if (lengthcount % prime1 !== 0) {
step = 3 * prime1;
} else {
if (lengthcount % prime2 !== 0) {
step = 3 * prime2;
} else {
if (lengthcount % prime3 !== 0) {
step = 3 * prime3;
} else {
step = 3 * prime4;
}
}
}
i = 0;
while (i < samplepixels) {
b = (p[pix + 0] & 255) << netbiasshift;
g2 = (p[pix + 1] & 255) << netbiasshift;
r = (p[pix + 2] & 255) << netbiasshift;
j2 = contest(b, g2, r);
altersingle(alpha, j2, b, g2, r);
if (rad !== 0) {
alterneigh(rad, j2, b, g2, r);
}
pix += step;
if (pix >= lim) {
pix -= lengthcount;
}
i++;
if (delta === 0) {
delta = 1;
}
if (i % delta === 0) {
alpha -= alpha / alphadec;
radius -= radius / radiusdec;
rad = radius >> radiusbiasshift;
if (rad <= 1) {
rad = 0;
}
for (j2 = 0; j2 < rad; j2++) {
radpower[j2] = alpha * ((rad * rad - j2 * j2) * radbias / (rad * rad));
}
}
}
}
function map(b, g2, r) {
var i;
var j2;
var dist;
var a;
var bestd;
var p;
var best;
bestd = 1e3;
best = -1;
i = netindex[g2];
j2 = i - 1;
while (i < netsize || j2 >= 0) {
if (i < netsize) {
p = network[i];
dist = p[1] - g2;
if (dist >= bestd) {
i = netsize;
} else {
i++;
if (dist < 0) {
dist = -dist;
}
a = p[0] - b;
if (a < 0) {
a = -a;
}
dist += a;
if (dist < bestd) {
a = p[2] - r;
if (a < 0) {
a = -a;
}
dist += a;
if (dist < bestd) {
bestd = dist;
best = p[3];
}
}
}
}
if (j2 >= 0) {
p = network[j2];
dist = g2 - p[1];
if (dist >= bestd) {
j2 = -1;
} else {
j2--;
if (dist < 0) {
dist = -dist;
}
a = p[0] - b;
if (a < 0) {
a = -a;
}
dist += a;
if (dist < bestd) {
a = p[2] - r;
if (a < 0) {
a = -a;
}
dist += a;
if (dist < bestd) {
bestd = dist;
best = p[3];
}
}
}
}
}
return best;
}
function process() {
learn();
unbiasnet();
inxbuild();
return colorMap();
}
function unbiasnet() {
var i;
for (i = 0; i < netsize; i++) {
network[i][0] >>= netbiasshift;
network[i][1] >>= netbiasshift;
network[i][2] >>= netbiasshift;
network[i][3] = i;
}
}
function alterneigh(rad, i, b, g2, r) {
var j2;
var k;
var lo;
var hi2;
var a;
var m;
var p;
lo = i - rad;
if (lo < -1) {
lo = -1;
}
hi2 = i + rad;
if (hi2 > netsize) {
hi2 = netsize;
}
j2 = i + 1;
k = i - 1;
m = 1;
while (j2 < hi2 || k > lo) {
a = radpower[m++];
if (j2 < hi2) {
p = network[j2++];
try {
p[0] -= a * (p[0] - b) / alpharadbias | 0;
p[1] -= a * (p[1] - g2) / alpharadbias | 0;
p[2] -= a * (p[2] - r) / alpharadbias | 0;
} catch (e) {
}
}
if (k > lo) {
p = network[k--];
try {
p[0] -= a * (p[0] - b) / alpharadbias | 0;
p[1] -= a * (p[1] - g2) / alpharadbias | 0;
p[2] -= a * (p[2] - r) / alpharadbias | 0;
} catch (e) {
}
}
}
}
function altersingle(alpha, i, b, g2, r) {
var n = network[i];
var alphaMult = alpha / initalpha;
n[0] -= alphaMult * (n[0] - b) | 0;
n[1] -= alphaMult * (n[1] - g2) | 0;
n[2] -= alphaMult * (n[2] - r) | 0;
}
function contest(b, g2, r) {
var i;
var dist;
var a;
var biasdist;
var betafreq;
var bestpos;
var bestbiaspos;
var bestd;
var bestbiasd;
var n;
bestd = 2147483647;
bestbiasd = bestd;
bestpos = -1;
bestbiaspos = bestpos;
for (i = 0; i < netsize; i++) {
n = network[i];
dist = n[0] - b;
if (dist < 0) {
dist = -dist;
}
a = n[1] - g2;
if (a < 0) {
a = -a;
}
dist += a;
a = n[2] - r;
if (a < 0) {
a = -a;
}
dist += a;
if (dist < bestd) {
bestd = dist;
bestpos = i;
}
biasdist = dist - (bias[i] >> intbiasshift - netbiasshift);
if (biasdist < bestbiasd) {
bestbiasd = biasdist;
bestbiaspos = i;
}
betafreq = freq[i] >> betashift;
freq[i] -= betafreq;
bias[i] += betafreq << gammashift;
}
freq[bestpos] += beta;
bias[bestpos] -= betagamma;
return bestbiaspos;
}
NeuQuantConstructor.apply(this, arguments);
var exports2 = {};
exports2.map = map;
exports2.process = process;
return exports2;
}
function workerCode() {
var self = this;
try {
self.onmessage = function(ev) {
var data = ev.data || {};
var response;
if (data.gifshot) {
response = workerMethods.run(data);
postMessage(response);
}
};
} catch (e) {
}
var workerMethods = {
dataToRGB: function dataToRGB(data, width, height) {
var length = width * height * 4;
var i = 0;
var rgb = [];
while (i < length) {
rgb.push(data[i++]);
rgb.push(data[i++]);
rgb.push(data[i++]);
i++;
}
return rgb;
},
componentizedPaletteToArray: function componentizedPaletteToArray(paletteRGB) {
paletteRGB = paletteRGB || [];
var paletteArray = [];
for (var i = 0; i < paletteRGB.length; i += 3) {
var r = paletteRGB[i];
var g2 = paletteRGB[i + 1];
var b = paletteRGB[i + 2];
paletteArray.push(r << 16 | g2 << 8 | b);
}
return paletteArray;
},
"processFrameWithQuantizer": function processFrameWithQuantizer(imageData, width, height, sampleInterval) {
var rgbComponents = this.dataToRGB(imageData, width, height);
var nq = new NeuQuant(rgbComponents, rgbComponents.length, sampleInterval);
var paletteRGB = nq.process();
var paletteArray = new Uint32Array(this.componentizedPaletteToArray(paletteRGB));
var numberPixels = width * height;
var indexedPixels = new Uint8Array(numberPixels);
var k = 0;
for (var i = 0; i < numberPixels; i++) {
var r = rgbComponents[k++];
var g2 = rgbComponents[k++];
var b = rgbComponents[k++];
indexedPixels[i] = nq.map(r, g2, b);
}
return {
pixels: indexedPixels,
palette: paletteArray
};
},
"run": function run(frame) {
frame = frame || {};
var _frame = frame, height = _frame.height;
_frame.palette;
var sampleInterval = _frame.sampleInterval, width = _frame.width;
var imageData = frame.data;
return this.processFrameWithQuantizer(imageData, width, height, sampleInterval);
}
};
return workerMethods;
}
function gifWriter(buf, width, height, gopts) {
var p = 0;
gopts = gopts === undefined$1 ? {} : gopts;
var loop_count = gopts.loop === undefined$1 ? null : gopts.loop;
var global_palette = gopts.palette === undefined$1 ? null : gopts.palette;
if (width <= 0 || height <= 0 || width > 65535 || height > 65535) throw "Width/Height invalid.";
function check_palette_and_num_colors(palette) {
var num_colors = palette.length;
if (num_colors < 2 || num_colors > 256 || num_colors & num_colors - 1) throw "Invalid code/color length, must be power of 2 and 2 .. 256.";
return num_colors;
}
buf[p++] = 71;
buf[p++] = 73;
buf[p++] = 70;
buf[p++] = 56;
buf[p++] = 57;
buf[p++] = 97;
var gp_num_colors_pow2 = 0;
var background = 0;
buf[p++] = width & 255;
buf[p++] = width >> 8 & 255;
buf[p++] = height & 255;
buf[p++] = height >> 8 & 255;
buf[p++] = (global_palette !== null ? 128 : 0) |
gp_num_colors_pow2;
buf[p++] = background;
buf[p++] = 0;
if (loop_count !== null) {
if (loop_count < 0 || loop_count > 65535) throw "Loop count invalid.";
buf[p++] = 33;
buf[p++] = 255;
buf[p++] = 11;
buf[p++] = 78;
buf[p++] = 69;
buf[p++] = 84;
buf[p++] = 83;
buf[p++] = 67;
buf[p++] = 65;
buf[p++] = 80;
buf[p++] = 69;
buf[p++] = 50;
buf[p++] = 46;
buf[p++] = 48;
buf[p++] = 3;
buf[p++] = 1;
buf[p++] = loop_count & 255;
buf[p++] = loop_count >> 8 & 255;
buf[p++] = 0;
}
var ended = false;
this.addFrame = function(x, y, w, h2, indexed_pixels, opts) {
if (ended === true) {
--p;
ended = false;
}
opts = opts === undefined$1 ? {} : opts;
if (x < 0 || y < 0 || x > 65535 || y > 65535) throw "x/y invalid.";
if (w <= 0 || h2 <= 0 || w > 65535 || h2 > 65535) throw "Width/Height invalid.";
if (indexed_pixels.length < w * h2) throw "Not enough pixels for the frame size.";
var using_local_palette = true;
var palette = opts.palette;
if (palette === undefined$1 || palette === null) {
using_local_palette = false;
palette = global_palette;
}
if (palette === undefined$1 || palette === null) throw "Must supply either a local or global palette.";
var num_colors = check_palette_and_num_colors(palette);
var min_code_size = 0;
while (num_colors >>= 1) {
++min_code_size;
}
num_colors = 1 << min_code_size;
var delay = opts.delay === undefined$1 ? 0 : opts.delay;
var disposal = opts.disposal === undefined$1 ? 0 : opts.disposal;
if (disposal < 0 || disposal > 3)
throw "Disposal out of range.";
var use_transparency = false;
var transparent_index = 0;
if (opts.transparent !== undefined$1 && opts.transparent !== null) {
use_transparency = true;
transparent_index = opts.transparent;
if (transparent_index < 0 || transparent_index >= num_colors) throw "Transparent color index.";
}
if (disposal !== 0 || use_transparency || delay !== 0) {
buf[p++] = 33;
buf[p++] = 249;
buf[p++] = 4;
buf[p++] = disposal << 2 | (use_transparency === true ? 1 : 0);
buf[p++] = delay & 255;
buf[p++] = delay >> 8 & 255;
buf[p++] = transparent_index;
buf[p++] = 0;
}
buf[p++] = 44;
buf[p++] = x & 255;
buf[p++] = x >> 8 & 255;
buf[p++] = y & 255;
buf[p++] = y >> 8 & 255;
buf[p++] = w & 255;
buf[p++] = w >> 8 & 255;
buf[p++] = h2 & 255;
buf[p++] = h2 >> 8 & 255;
buf[p++] = using_local_palette === true ? 128 | min_code_size - 1 : 0;
if (using_local_palette === true) {
for (var i = 0, il = palette.length; i < il; ++i) {
var rgb = palette[i];
buf[p++] = rgb >> 16 & 255;
buf[p++] = rgb >> 8 & 255;
buf[p++] = rgb & 255;
}
}
p = GifWriterOutputLZWCodeStream(buf, p, min_code_size < 2 ? 2 : min_code_size, indexed_pixels);
};
this.end = function() {
if (ended === false) {
buf[p++] = 59;
ended = true;
}
return p;
};
function GifWriterOutputLZWCodeStream(buf2, p2, min_code_size, index_stream) {
buf2[p2++] = min_code_size;
var cur_subblock = p2++;
var clear_code = 1 << min_code_size;
var code_mask = clear_code - 1;
var eoi_code = clear_code + 1;
var next_code = eoi_code + 1;
var cur_code_size = min_code_size + 1;
var cur_shift = 0;
var cur = 0;
function emit_bytes_to_buffer(bit_block_size) {
while (cur_shift >= bit_block_size) {
buf2[p2++] = cur & 255;
cur >>= 8;
cur_shift -= 8;
if (p2 === cur_subblock + 256) {
buf2[cur_subblock] = 255;
cur_subblock = p2++;
}
}
}
function emit_code(c) {
cur |= c << cur_shift;
cur_shift += cur_code_size;
emit_bytes_to_buffer(8);
}
var ib_code = index_stream[0] & code_mask;
var code_table = {};
emit_code(clear_code);
for (var i = 1, il = index_stream.length; i < il; ++i) {
var k = index_stream[i] & code_mask;
var cur_key = ib_code << 8 | k;
var cur_code = code_table[cur_key];
if (cur_code === undefined$1) {
cur |= ib_code << cur_shift;
cur_shift += cur_code_size;
while (cur_shift >= 8) {
buf2[p2++] = cur & 255;
cur >>= 8;
cur_shift -= 8;
if (p2 === cur_subblock + 256) {
buf2[cur_subblock] = 255;
cur_subblock = p2++;
}
}
if (next_code === 4096) {
emit_code(clear_code);
next_code = eoi_code + 1;
cur_code_size = min_code_size + 1;
code_table = {};
} else {
if (next_code >= 1 << cur_code_size) ++cur_code_size;
code_table[cur_key] = next_code++;
}
ib_code = k;
} else {
ib_code = cur_code;
}
}
emit_code(ib_code);
emit_code(eoi_code);
emit_bytes_to_buffer(1);
if (cur_subblock + 1 === p2) {
buf2[cur_subblock] = 0;
} else {
buf2[cur_subblock] = p2 - cur_subblock - 1;
buf2[p2++] = 0;
}
return p2;
}
}
var noop$2 = function noop2() {
};
var AnimatedGIF = function AnimatedGIF2(options2) {
this.canvas = null;
this.ctx = null;
this.repeat = 0;
this.frames = [];
this.numRenderedFrames = 0;
this.onRenderCompleteCallback = noop$2;
this.onRenderProgressCallback = noop$2;
this.workers = [];
this.availableWorkers = [];
this.generatingGIF = false;
this.options = options2;
this.initializeWebWorkers(options2);
};
AnimatedGIF.prototype = {
"workerMethods": workerCode(),
"initializeWebWorkers": function initializeWebWorkers(options2) {
var self = this;
var processFrameWorkerCode = NeuQuant.toString() + "(" + workerCode.toString() + "());";
var webWorkerObj = void 0;
var objectUrl = void 0;
var webWorker = void 0;
var numWorkers = void 0;
var x = -1;
var workerError = "";
numWorkers = options2.numWorkers;
while (++x < numWorkers) {
webWorkerObj = utils.createWebWorker(processFrameWorkerCode);
if (utils.isObject(webWorkerObj)) {
objectUrl = webWorkerObj.objectUrl;
webWorker = webWorkerObj.worker;
self.workers.push({
worker: webWorker,
objectUrl
});
self.availableWorkers.push(webWorker);
} else {
workerError = webWorkerObj;
utils.webWorkerError = !!webWorkerObj;
}
}
this.workerError = workerError;
this.canvas = document2.createElement("canvas");
this.canvas.width = options2.gifWidth;
this.canvas.height = options2.gifHeight;
this.ctx = this.canvas.getContext("2d");
this.frames = [];
},
getWorker: function getWorker() {
return this.availableWorkers.pop();
},
freeWorker: function freeWorker(worker) {
this.availableWorkers.push(worker);
},
byteMap: (function() {
var byteMap = [];
for (var i = 0; i < 256; i++) {
byteMap[i] = String.fromCharCode(i);
}
return byteMap;
})(),
bufferToString: function bufferToString(buffer) {
var numberValues = buffer.length;
var str = "";
var x = -1;
while (++x < numberValues) {
str += this.byteMap[buffer[x]];
}
return str;
},
onFrameFinished: function onFrameFinished(progressCallback) {
var self = this;
var frames = self.frames;
var options2 = self.options;
var hasExistingImages = !!(options2.images || []).length;
var allDone = frames.every(function(frame) {
return !frame.beingProcessed && frame.done;
});
self.numRenderedFrames++;
if (hasExistingImages) {
progressCallback(self.numRenderedFrames / frames.length);
}
self.onRenderProgressCallback(self.numRenderedFrames * 0.75 / frames.length);
if (allDone) {
if (!self.generatingGIF) {
self.generateGIF(frames, self.onRenderCompleteCallback);
}
} else {
utils.requestTimeout(function() {
self.processNextFrame();
}, 1);
}
},
processFrame: function processFrame(position) {
var AnimatedGifContext = this;
this.options;
var _options = this.options, progressCallback = _options.progressCallback, sampleInterval = _options.sampleInterval;
var frames = this.frames;
var frame = void 0;
var worker = void 0;
var done = function done2() {
var ev = arguments.length > 0 && arguments[0] !== undefined$1 ? arguments[0] : {};
var data = ev.data;
delete frame.data;
frame.pixels = Array.prototype.slice.call(data.pixels);
frame.palette = Array.prototype.slice.call(data.palette);
frame.done = true;
frame.beingProcessed = false;
AnimatedGifContext.freeWorker(worker);
AnimatedGifContext.onFrameFinished(progressCallback);
};
frame = frames[position];
if (frame.beingProcessed || frame.done) {
this.onFrameFinished();
return;
}
frame.sampleInterval = sampleInterval;
frame.beingProcessed = true;
frame.gifshot = true;
worker = this.getWorker();
if (worker) {
worker.onmessage = done;
worker.postMessage(frame);
} else {
done({
"data": AnimatedGifContext.workerMethods.run(frame)
});
}
},
startRendering: function startRendering(completeCallback) {
this.onRenderCompleteCallback = completeCallback;
for (var i = 0; i < this.options.numWorkers && i < this.frames.length; i++) {
this.processFrame(i);
}
},
processNextFrame: function processNextFrame() {
var position = -1;
for (var i = 0; i < this.frames.length; i++) {
var frame = this.frames[i];
if (!frame.done && !frame.beingProcessed) {
position = i;
break;
}
}
if (position >= 0) {
this.processFrame(position);
}
},
generateGIF: function generateGIF(frames, callback) {
var buffer = [];
var gifOptions = {
loop: this.repeat
};
var options2 = this.options;
var interval = options2.interval;
var frameDuration = options2.frameDuration;
var existingImages2 = options2.images;
var hasExistingImages = !!existingImages2.length;
var height = options2.gifHeight;
var width = options2.gifWidth;
var gifWriter$$1 = new gifWriter(buffer, width, height, gifOptions);
var onRenderProgressCallback = this.onRenderProgressCallback;
var delay = hasExistingImages ? interval * 100 : 0;
var bufferToString = void 0;
var gif = void 0;
this.generatingGIF = true;
utils.each(frames, function(iterator, frame) {
var framePalette = frame.palette;
onRenderProgressCallback(0.75 + 0.25 * frame.position * 1 / frames.length);
for (var i = 0; i < frameDuration; i++) {
gifWriter$$1.addFrame(0, 0, width, height, frame.pixels, {
palette: framePalette,
delay
});
}
});
gifWriter$$1.end();
onRenderProgressCallback(1);
this.frames = [];
this.generatingGIF = false;
if (utils.isFunction(callback)) {
bufferToString = this.bufferToString(buffer);
gif = "data:image/gif;base64," + utils.btoa(bufferToString);
callback(gif);
}
},
setRepeat: function setRepeat(r) {
this.repeat = r;
},
addFrame: function addFrame(element, gifshotOptions) {
gifshotOptions = utils.isObject(gifshotOptions) ? gifshotOptions : {};
var self = this;
var ctx = self.ctx;
var options2 = self.options;
var width = options2.gifWidth;
var height = options2.gifHeight;
var fontSize = utils.getFontSize(gifshotOptions);
var _gifshotOptions = gifshotOptions, filter = _gifshotOptions.filter, fontColor = _gifshotOptions.fontColor, fontFamily = _gifshotOptions.fontFamily, fontWeight = _gifshotOptions.fontWeight;
_gifshotOptions.gifHeight;
_gifshotOptions.gifWidth;
var text = _gifshotOptions.text, textAlign = _gifshotOptions.textAlign, textBaseline = _gifshotOptions.textBaseline;
var textXCoordinate = gifshotOptions.textXCoordinate ? gifshotOptions.textXCoordinate : textAlign === "left" ? 1 : textAlign === "right" ? width : width / 2;
var textYCoordinate = gifshotOptions.textYCoordinate ? gifshotOptions.textYCoordinate : textBaseline === "top" ? 1 : textBaseline === "center" ? height / 2 : height;
var font = fontWeight + " " + fontSize + " " + fontFamily;
var imageData = void 0;
try {
ctx.filter = filter;
ctx.drawImage(element, 0, 0, width, height);
if (text) {
ctx.font = font;
ctx.fillStyle = fontColor;
ctx.textAlign = textAlign;
ctx.textBaseline = textBaseline;
ctx.fillText(text, textXCoordinate, textYCoordinate);
}
imageData = ctx.getImageData(0, 0, width, height);
self.addFrameImageData(imageData);
} catch (e) {
return "" + e;
}
},
addFrameImageData: function addFrameImageData() {
var imageData = arguments.length > 0 && arguments[0] !== undefined$1 ? arguments[0] : {};
var frames = this.frames;
var imageDataArray = imageData.data;
this.frames.push({
"data": imageDataArray,
"width": imageData.width,
"height": imageData.height,
"palette": null,
"dithering": null,
"done": false,
"beingProcessed": false,
"position": frames.length
});
},
onRenderProgress: function onRenderProgress(callback) {
this.onRenderProgressCallback = callback;
},
isRendering: function isRendering() {
return this.generatingGIF;
},
getBase64GIF: function getBase64GIF2(completeCallback) {
var self = this;
var onRenderComplete = function onRenderComplete2(gif) {
self.destroyWorkers();
utils.requestTimeout(function() {
completeCallback(gif);
}, 0);
};
self.startRendering(onRenderComplete);
},
destroyWorkers: function destroyWorkers() {
if (this.workerError) {
return;
}
var workers = this.workers;
utils.each(workers, function(iterator, workerObj) {
var worker = workerObj.worker;
var objectUrl = workerObj.objectUrl;
worker.terminate();
utils.URL.revokeObjectURL(objectUrl);
});
}
};
function getBase64GIF(animatedGifInstance, callback) {
animatedGifInstance.getBase64GIF(function(image) {
callback({
error: false,
errorCode: "",
errorMsg: "",
image
});
});
}
function existingImages() {
var obj = arguments.length > 0 && arguments[0] !== undefined$1 ? arguments[0] : {};
var callback = obj.callback, images = obj.images, options2 = obj.options;
var imagesLength = obj.imagesLength;
var skipObj = {
"getUserMedia": true,
"window.URL": true
};
var errorObj = error.validate(skipObj);
var loadedImages = [];
var loadedImagesLength = 0;
var tempImage = void 0;
var ag = void 0;
if (errorObj.error) {
return callback(errorObj);
}
ag = new AnimatedGIF(options2);
utils.each(images, function(index, image) {
var currentImage = image;
if (image.src) {
currentImage = currentImage.src;
}
if (utils.isElement(currentImage)) {
if (options2.crossOrigin) {
currentImage.crossOrigin = options2.crossOrigin;
}
loadedImages[index] = currentImage;
loadedImagesLength += 1;
if (loadedImagesLength === imagesLength) {
addLoadedImagesToGif();
}
} else if (utils.isString(currentImage)) {
tempImage = new Image();
if (options2.crossOrigin) {
tempImage.crossOrigin = options2.crossOrigin;
}
(function(tempImage2) {
if (image.text) {
tempImage2.text = image.text;
}
tempImage2.onerror = function(e) {
var obj2 = void 0;
--imagesLength;
if (imagesLength === 0) {
obj2 = {};
obj2.error = "None of the requested images was capable of being retrieved";
return callback(obj2);
}
};
tempImage2.onload = function(e) {
if (image.text) {
loadedImages[index] = {
img: tempImage2,
text: tempImage2.text
};
} else {
loadedImages[index] = tempImage2;
}
loadedImagesLength += 1;
if (loadedImagesLength === imagesLength) {
addLoadedImagesToGif();
}
utils.removeElement(tempImage2);
};
tempImage2.src = currentImage;
})(tempImage);
utils.setCSSAttr(tempImage, {
position: "fixed",
opacity: "0"
});
document2.body.appendChild(tempImage);
}
});
function addLoadedImagesToGif() {
utils.each(loadedImages, function(index, loadedImage) {
if (loadedImage) {
if (loadedImage.text) {
ag.addFrame(loadedImage.img, options2, loadedImage.text);
} else {
ag.addFrame(loadedImage, options2);
}
}
});
getBase64GIF(ag, callback);
}
}
var noop$3 = function noop2() {
};
var screenShot = {
getGIF: function getGIF() {
var options2 = arguments.length > 0 && arguments[0] !== undefined$1 ? arguments[0] : {};
var callback = arguments[1];
callback = utils.isFunction(callback) ? callback : noop$3;
var canvas = document2.createElement("canvas");
var context = void 0;
var existingImages2 = options2.images;
var hasExistingImages = !!existingImages2.length;
var cameraStream = options2.cameraStream, crop = options2.crop, filter = options2.filter, fontColor = options2.fontColor, fontFamily = options2.fontFamily, fontWeight = options2.fontWeight, keepCameraOn = options2.keepCameraOn;
options2.numWorkers;
var progressCallback = options2.progressCallback, saveRenderingContexts = options2.saveRenderingContexts, savedRenderingContexts = options2.savedRenderingContexts, text = options2.text, textAlign = options2.textAlign, textBaseline = options2.textBaseline, videoElement = options2.videoElement, videoHeight = options2.videoHeight, videoWidth = options2.videoWidth, webcamVideoElement = options2.webcamVideoElement;
var gifWidth = Number(options2.gifWidth);
var gifHeight = Number(options2.gifHeight);
var interval = Number(options2.interval);
Number(options2.sampleInterval);
var waitBetweenFrames = hasExistingImages ? 0 : interval * 1e3;
var renderingContextsToSave = [];
var numFrames = savedRenderingContexts.length ? savedRenderingContexts.length : options2.numFrames;
var pendingFrames = numFrames;
var ag = new AnimatedGIF(options2);
var fontSize = utils.getFontSize(options2);
var textXCoordinate = options2.textXCoordinate ? options2.textXCoordinate : textAlign === "left" ? 1 : textAlign === "right" ? gifWidth : gifWidth / 2;
var textYCoordinate = options2.textYCoordinate ? options2.textYCoordinate : textBaseline === "top" ? 1 : textBaseline === "center" ? gifHeight / 2 : gifHeight;
var font = fontWeight + " " + fontSize + " " + fontFamily;
var sourceX = crop ? Math.floor(crop.scaledWidth / 2) : 0;
var sourceWidth = crop ? videoWidth - crop.scaledWidth : 0;
var sourceY = crop ? Math.floor(crop.scaledHeight / 2) : 0;
var sourceHeight = crop ? videoHeight - crop.scaledHeight : 0;
var captureFrames = function captureSingleFrame() {
var framesLeft = pendingFrames - 1;
if (savedRenderingContexts.length) {
context.putImageData(savedRenderingContexts[numFrames - pendingFrames], 0, 0);
finishCapture();
} else {
drawVideo();
}
function drawVideo() {
try {
if (sourceWidth > videoWidth) {
sourceWidth = videoWidth;
}
if (sourceHeight > videoHeight) {
sourceHeight = videoHeight;
}
if (sourceX < 0) {
sourceX = 0;
}
if (sourceY < 0) {
sourceY = 0;
}
context.filter = filter;
context.drawImage(videoElement, sourceX, sourceY, sourceWidth, sourceHeight, 0, 0, gifWidth, gifHeight);
finishCapture();
} catch (e) {
if (e.name === "NS_ERROR_NOT_AVAILABLE") {
utils.requestTimeout(drawVideo, 100);
} else {
throw e;
}
}
}
function finishCapture() {
var imageData = void 0;
if (saveRenderingContexts) {
renderingContextsToSave.push(context.getImageData(0, 0, gifWidth, gifHeight));
}
if (text) {
context.font = font;
context.fillStyle = fontColor;
context.textAlign = textAlign;
context.textBaseline = textBaseline;
context.fillText(text, textXCoordinate, textYCoordinate);
}
imageData = context.getImageData(0, 0, gifWidth, gifHeight);
ag.addFrameImageData(imageData);
pendingFrames = framesLeft;
progressCallback((numFrames - pendingFrames) / numFrames);
if (framesLeft > 0) {
utils.requestTimeout(captureSingleFrame, waitBetweenFrames);
}
if (!pendingFrames) {
ag.getBase64GIF(function(image) {
callback({
"error": false,
"errorCode": "",
"errorMsg": "",
"image": image,
"cameraStream": cameraStream,
"videoElement": videoElement,
"webcamVideoElement": webcamVideoElement,
"savedRenderingContexts": renderingContextsToSave,
"keepCameraOn": keepCameraOn
});
});
}
}
};
numFrames = numFrames !== undefined$1 ? numFrames : 10;
interval = interval !== undefined$1 ? interval : 0.1;
canvas.width = gifWidth;
canvas.height = gifHeight;
context = canvas.getContext("2d");
(function capture() {
if (!savedRenderingContexts.length && videoElement.currentTime === 0) {
utils.requestTimeout(capture, 100);
return;
}
captureFrames();
})();
},
getCropDimensions: function getCropDimensions() {
var obj = arguments.length > 0 && arguments[0] !== undefined$1 ? arguments[0] : {};
var width = obj.videoWidth;
var height = obj.videoHeight;
var gifWidth = obj.gifWidth;
var gifHeight = obj.gifHeight;
var result = {
width: 0,
height: 0,
scaledWidth: 0,
scaledHeight: 0
};
if (width > height) {
result.width = Math.round(width * (gifHeight / height)) - gifWidth;
result.scaledWidth = Math.round(result.width * (height / gifHeight));
} else {
result.height = Math.round(height * (gifWidth / width)) - gifHeight;
result.scaledHeight = Math.round(result.height * (width / gifWidth));
}
return result;
}
};
var videoStream = {
loadedData: false,
defaultVideoDimensions: {
width: 640,
height: 480
},
findVideoSize: function findVideoSizeMethod(obj) {
findVideoSizeMethod.attempts = findVideoSizeMethod.attempts || 0;
var cameraStream = obj.cameraStream, completedCallback = obj.completedCallback, videoElement = obj.videoElement;
if (!videoElement) {
return;
}
if (videoElement.videoWidth > 0 && videoElement.videoHeight > 0) {
videoElement.removeEventListener("loadeddata", videoStream.findVideoSize);
completedCallback({
videoElement,
cameraStream,
videoWidth: videoElement.videoWidth,
videoHeight: videoElement.videoHeight
});
} else {
if (findVideoSizeMethod.attempts < 10) {
findVideoSizeMethod.attempts += 1;
utils.requestTimeout(function() {
videoStream.findVideoSize(obj);
}, 400);
} else {
completedCallback({
videoElement,
cameraStream,
videoWidth: videoStream.defaultVideoDimensions.width,
videoHeight: videoStream.defaultVideoDimensions.height
});
}
}
},
onStreamingTimeout: function onStreamingTimeout(callback) {
if (utils.isFunction(callback)) {
callback({
error: true,
errorCode: "getUserMedia",
errorMsg: "There was an issue with the getUserMedia API - Timed out while trying to start streaming",
image: null,
cameraStream: {}
});
}
},
stream: function stream(obj) {
var existingVideo2 = utils.isArray(obj.existingVideo) ? obj.existingVideo[0] : obj.existingVideo;
var cameraStream = obj.cameraStream, completedCallback = obj.completedCallback, streamedCallback = obj.streamedCallback, videoElement = obj.videoElement;
if (utils.isFunction(streamedCallback)) {
streamedCallback();
}
if (existingVideo2) {
if (utils.isString(existingVideo2)) {
videoElement.src = existingVideo2;
videoElement.innerHTML = '<source src="' + existingVideo2 + '" type="video/' + utils.getExtension(existingVideo2) + '" />';
} else if (existingVideo2 instanceof Blob) {
try {
videoElement.src = utils.URL.createObjectURL(existingVideo2);
} catch (e) {
}
videoElement.innerHTML = '<source src="' + existingVideo2 + '" type="' + existingVideo2.type + '" />';
}
} else if (videoElement.mozSrcObject) {
videoElement.mozSrcObject = cameraStream;
} else if (utils.URL) {
try {
videoElement.srcObject = cameraStream;
videoElement.src = utils.URL.createObjectURL(cameraStream);
} catch (e) {
videoElement.srcObject = cameraStream;
}
}
videoElement.play();
utils.requestTimeout(function checkLoadedData() {
checkLoadedData.count = checkLoadedData.count || 0;
if (videoStream.loadedData === true) {
videoStream.findVideoSize({
videoElement,
cameraStream,
completedCallback
});
videoStream.loadedData = false;
} else {
checkLoadedData.count += 1;
if (checkLoadedData.count > 10) {
videoStream.findVideoSize({
videoElement,
cameraStream,
completedCallback
});
} else {
checkLoadedData();
}
}
}, 0);
},
startStreaming: function startStreaming(obj) {
var errorCallback = utils.isFunction(obj.error) ? obj.error : utils.noop;
var streamedCallback = utils.isFunction(obj.streamed) ? obj.streamed : utils.noop;
var completedCallback = utils.isFunction(obj.completed) ? obj.completed : utils.noop;
var crossOrigin = obj.crossOrigin, existingVideo2 = obj.existingVideo, lastCameraStream = obj.lastCameraStream, options2 = obj.options, webcamVideoElement = obj.webcamVideoElement;
var videoElement = utils.isElement(existingVideo2) ? existingVideo2 : webcamVideoElement ? webcamVideoElement : document2.createElement("video");
if (crossOrigin) {
videoElement.crossOrigin = options2.crossOrigin;
}
videoElement.autoplay = true;
videoElement.loop = true;
videoElement.muted = true;
videoElement.addEventListener("loadeddata", function(event) {
videoStream.loadedData = true;
if (options2.offset) {
videoElement.currentTime = options2.offset;
}
});
if (existingVideo2) {
videoStream.stream({
videoElement,
existingVideo: existingVideo2,
completedCallback
});
} else if (lastCameraStream) {
videoStream.stream({
videoElement,
cameraStream: lastCameraStream,
streamedCallback,
completedCallback
});
} else {
utils.getUserMedia({
video: true
}, function(stream) {
videoStream.stream({
videoElement,
cameraStream: stream,
streamedCallback,
completedCallback
});
}, errorCallback);
}
},
startVideoStreaming: function startVideoStreaming(callback) {
var options2 = arguments.length > 1 && arguments[1] !== undefined$1 ? arguments[1] : {};
var timeoutLength = options2.timeout !== undefined$1 ? options2.timeout : 0;
var originalCallback = options2.callback;
var webcamVideoElement = options2.webcamVideoElement;
var noGetUserMediaSupportTimeout = void 0;
if (timeoutLength > 0) {
noGetUserMediaSupportTimeout = utils.requestTimeout(function() {
videoStream.onStreamingTimeout(originalCallback);
}, 1e4);
}
videoStream.startStreaming({
error: function error2() {
originalCallback({
error: true,
errorCode: "getUserMedia",
errorMsg: "There was an issue with the getUserMedia API - the user probably denied permission",
image: null,
cameraStream: {}
});
},
streamed: function streamed() {
clearTimeout(noGetUserMediaSupportTimeout);
},
completed: function completed() {
var obj = arguments.length > 0 && arguments[0] !== undefined$1 ? arguments[0] : {};
var cameraStream = obj.cameraStream, videoElement = obj.videoElement, videoHeight = obj.videoHeight, videoWidth = obj.videoWidth;
callback({
cameraStream,
videoElement,
videoHeight,
videoWidth
});
},
lastCameraStream: options2.lastCameraStream,
webcamVideoElement,
crossOrigin: options2.crossOrigin,
options: options2
});
},
stopVideoStreaming: function stopVideoStreaming2(obj) {
obj = utils.isObject(obj) ? obj : {};
var _obj = obj, keepCameraOn = _obj.keepCameraOn, videoElement = _obj.videoElement, webcamVideoElement = _obj.webcamVideoElement;
var cameraStream = obj.cameraStream || {};
var cameraStreamTracks = cameraStream.getTracks ? cameraStream.getTracks() || [] : [];
var hasCameraStreamTracks = !!cameraStreamTracks.length;
var firstCameraStreamTrack = cameraStreamTracks[0];
if (!keepCameraOn && hasCameraStreamTracks) {
if (utils.isFunction(firstCameraStreamTrack.stop)) {
firstCameraStreamTrack.stop();
}
}
if (utils.isElement(videoElement) && !webcamVideoElement) {
videoElement.pause();
if (utils.isFunction(utils.URL.revokeObjectURL) && !utils.webWorkerError) {
if (videoElement.src) {
utils.URL.revokeObjectURL(videoElement.src);
}
}
utils.removeElement(videoElement);
}
}
};
function stopVideoStreaming(options2) {
options2 = utils.isObject(options2) ? options2 : {};
videoStream.stopVideoStreaming(options2);
}
function createAndGetGIF(obj, callback) {
var options2 = obj.options || {};
var images = options2.images, video = options2.video;
var gifWidth = Number(options2.gifWidth);
var gifHeight = Number(options2.gifHeight);
Number(options2.numFrames);
var cameraStream = obj.cameraStream, videoElement = obj.videoElement, videoWidth = obj.videoWidth, videoHeight = obj.videoHeight;
var cropDimensions = screenShot.getCropDimensions({
videoWidth,
videoHeight,
gifHeight,
gifWidth
});
var completeCallback = callback;
options2.crop = cropDimensions;
options2.videoElement = videoElement;
options2.videoWidth = videoWidth;
options2.videoHeight = videoHeight;
options2.cameraStream = cameraStream;
if (!utils.isElement(videoElement)) {
return;
}
videoElement.width = gifWidth + cropDimensions.width;
videoElement.height = gifHeight + cropDimensions.height;
if (!options2.webcamVideoElement) {
utils.setCSSAttr(videoElement, {
position: "fixed",
opacity: "0"
});
document2.body.appendChild(videoElement);
}
videoElement.play();
screenShot.getGIF(options2, function(obj2) {
if ((!images || !images.length) && (!video || !video.length)) {
stopVideoStreaming(obj2);
}
completeCallback(obj2);
});
}
function existingVideo() {
var obj = arguments.length > 0 && arguments[0] !== undefined$1 ? arguments[0] : {};
var callback = obj.callback, existingVideo2 = obj.existingVideo, options2 = obj.options;
var skipObj = {
getUserMedia: true,
"window.URL": true
};
var errorObj = error.validate(skipObj);
var videoType = void 0;
var videoSrc = void 0;
if (errorObj.error) {
return callback(errorObj);
}
if (utils.isElement(existingVideo2) && existingVideo2.src) {
videoSrc = existingVideo2.src;
videoType = utils.getExtension(videoSrc);
if (!utils.isSupported.videoCodecs[videoType]) {
return callback(error.messages.videoCodecs);
}
} else if (utils.isArray(existingVideo2)) {
utils.each(existingVideo2, function(iterator, videoSrc2) {
if (videoSrc2 instanceof Blob) {
videoType = videoSrc2.type.substr(videoSrc2.type.lastIndexOf("/") + 1, videoSrc2.length);
} else {
videoType = videoSrc2.substr(videoSrc2.lastIndexOf(".") + 1, videoSrc2.length);
}
if (utils.isSupported.videoCodecs[videoType]) {
existingVideo2 = videoSrc2;
return false;
}
});
}
videoStream.startStreaming({
completed: function completed(obj2) {
obj2.options = options2 || {};
createAndGetGIF(obj2, callback);
},
existingVideo: existingVideo2,
crossOrigin: options2.crossOrigin,
options: options2
});
}
function existingWebcam() {
var obj = arguments.length > 0 && arguments[0] !== undefined$1 ? arguments[0] : {};
var callback = obj.callback, lastCameraStream = obj.lastCameraStream, options2 = obj.options, webcamVideoElement = obj.webcamVideoElement;
if (!isWebCamGIFSupported()) {
return callback(error.validate());
}
if (options2.savedRenderingContexts.length) {
screenShot.getGIF(options2, function(obj2) {
callback(obj2);
});
return;
}
videoStream.startVideoStreaming(function() {
var obj2 = arguments.length > 0 && arguments[0] !== undefined$1 ? arguments[0] : {};
obj2.options = options2 || {};
createAndGetGIF(obj2, callback);
}, {
lastCameraStream,
callback,
webcamVideoElement,
crossOrigin: options2.crossOrigin
});
}
function createGIF(userOptions, callback) {
callback = utils.isFunction(userOptions) ? userOptions : callback;
userOptions = utils.isObject(userOptions) ? userOptions : {};
if (!utils.isFunction(callback)) {
return;
}
var options2 = utils.mergeOptions(defaultOptions, userOptions) || {};
var lastCameraStream = userOptions.cameraStream;
var images = options2.images;
var imagesLength = images ? images.length : 0;
var video = options2.video;
var webcamVideoElement = options2.webcamVideoElement;
options2 = utils.mergeOptions(options2, {
"gifWidth": Math.floor(options2.gifWidth),
"gifHeight": Math.floor(options2.gifHeight)
});
if (imagesLength) {
existingImages({
"images": images,
"imagesLength": imagesLength,
"callback": callback,
"options": options2
});
} else if (video) {
existingVideo({
"existingVideo": video,
callback,
options: options2
});
} else {
existingWebcam({
lastCameraStream,
callback,
webcamVideoElement,
options: options2
});
}
}
function takeSnapShot(userOptions, callback) {
callback = utils.isFunction(userOptions) ? userOptions : callback;
userOptions = utils.isObject(userOptions) ? userOptions : {};
if (!utils.isFunction(callback)) {
return;
}
var mergedOptions = utils.mergeOptions(defaultOptions, userOptions);
var options2 = utils.mergeOptions(mergedOptions, {
"interval": 0.1,
"numFrames": 1,
"gifWidth": Math.floor(mergedOptions.gifWidth),
"gifHeight": Math.floor(mergedOptions.gifHeight)
});
createGIF(options2, callback);
}
var API = {
"utils": utils$2,
"error": error$2,
"defaultOptions": defaultOptions$2,
"createGIF": createGIF,
"takeSnapShot": takeSnapShot,
"stopVideoStreaming": stopVideoStreaming,
"isSupported": isSupported,
"isWebCamGIFSupported": isWebCamGIFSupported,
"isExistingVideoGIFSupported": isExistingVideoGIFSupported,
"isExistingImagesGIFSupported": isSupported$1,
"VERSION": "0.4.5"
};
{
module.exports = API;
}
})(typeof window !== "undefined" ? window : {}, typeof document !== "undefined" ? document : { createElement: function() {
} }, typeof window !== "undefined" ? window.navigator : {});
})(gifshot$1);
return gifshot$1.exports;
}
var gifshotExports = requireGifshot();
const gifshot = getDefaultExportFromCjs(gifshotExports);
class MediaDownloader {
isDownloading = false;
createdBlobUrls = [];
abortController = null;
async downloadAccountMedia(account, onProgress, batchInfo) {
if (this.isDownloading) {
throw new Error("Download already in progress");
}
this.isDownloading = true;
this.abortController = new AbortController();
try {
const timeline = account.timeline;
const username = account.username;
const downloadDate = formatDateTime(Date.now(), "YYYYMMDD_HHmmss");
let zipFilename;
if (batchInfo && (batchInfo.mode === "batch" || batchInfo.mode === "auto")) {
if (batchInfo.page !== void 0) {
zipFilename = `${username}_${downloadDate}_Batch${batchInfo.page}.zip`;
} else {
zipFilename = `${username}_${downloadDate}_Batch.zip`;
}
} else {
zipFilename = `${username}_${downloadDate}.zip`;
}
const files = this.createFileList(timeline, username);
if (files.length === 0) {
throw new Error("No media files found");
}
const shouldConvertGifs = appOptionsManager.get("convertAnimatedGifs") ?? true;
if (shouldConvertGifs) {
await this.downloadWithGifConversion(zipFilename, files, onProgress);
} else {
const progressCallback = (current, total, file) => {
const percentage = Math.round(current / total * 100);
onProgress?.({
current,
total,
percentage,
currentFile: file?.filename,
converting: false
});
};
await zipStreamDownload(
zipFilename,
files,
progressCallback,
500,
appOptionsManager.get("downloadConcurrency") ?? 1,
this.abortController?.signal
);
}
} catch (error) {
if (error?.message !== "Download aborted") {
throw error;
}
logger.info("Download was aborted by user. Files already downloaded will be zipped.");
} finally {
this.isDownloading = false;
this.abortController = null;
this.createdBlobUrls.forEach((url) => {
URL.revokeObjectURL(url);
});
this.createdBlobUrls = [];
}
}
createFileList(timeline, username) {
const files = [];
const usedFilenames = new Set();
const mediaGroups = {
photo: timeline.filter((item) => item.type === "photo"),
video: timeline.filter((item) => item.type === "video"),
animated_gif: timeline.filter((item) => item.type === "animated_gif")
};
Object.entries(mediaGroups).forEach(([type, items]) => {
if (items.length === 0) return;
const folderName = type === "photo" ? "image" : type === "animated_gif" ? "gif" : type;
items.forEach((item) => {
const extension = this.getFileExtension(item);
const baseFilename = `${username}_${this.formatDateForFilename(item.date)}_${item.tweet_id}`;
const filename = this.getUniqueFilename(baseFilename, extension, usedFilenames);
const fullPath = `${folderName}/${filename}`;
files.push({
filename: fullPath,
url: item.url
});
usedFilenames.add(filename);
});
});
return files;
}
getFileExtension(item) {
switch (item.type) {
case "photo":
const photoMatch = item.url.match(/format=(\w+)/);
return photoMatch?.[1] || "jpg";
case "video":
return "mp4";
case "animated_gif":
const shouldConvertGifs = appOptionsManager.get("convertAnimatedGifs") ?? true;
return shouldConvertGifs ? "gif" : "mp4";
default:
return "unknown";
}
}
formatDateForFilename(dateStr) {
const m = dateStr.match(/(\d{4})-(\d{2})-(\d{2}).*?(\d{2}):(\d{2}):(\d{2})/);
if (m) {
const [, y, mo, d, h2, mi, s] = m;
return `${y}${mo}${d}_${h2}${mi}${s}`;
}
const d2 = new Date(dateStr);
if (!isNaN(d2.getTime())) {
const pad = (n) => String(n).padStart(2, "0");
return `${d2.getFullYear()}${pad(d2.getMonth() + 1)}${pad(d2.getDate())}_${pad(d2.getHours())}${pad(d2.getMinutes())}${pad(d2.getSeconds())}`;
}
return dateStr.replace(/\D/g, "");
}
getUniqueFilename(baseFilename, extension, usedFilenames) {
let filename = `${baseFilename}.${extension}`;
let counter = 1;
while (usedFilenames.has(filename)) {
filename = `${baseFilename}_${counter}.${extension}`;
counter++;
}
return filename;
}
isDownloadInProgress() {
return this.isDownloading;
}
abortDownload() {
if (this.abortController) {
this.abortController.abort();
}
}
async downloadWithGifConversion(zipFilename, files, onProgress) {
const gifFiles = files.filter((f2) => f2.filename.startsWith("gif/"));
for (let i = 0; i < gifFiles.length; i++) {
const gifFile = gifFiles[i];
if (!gifFile) continue;
const conversionProgress = Math.round((i + 1) / gifFiles.length * 50);
onProgress?.({
current: i,
total: gifFiles.length,
percentage: conversionProgress,
currentFile: gifFile.filename,
converting: true
});
try {
const gifData = await this.convertVideoToGif(gifFile.url);
if (gifData) {
gifFile.url = gifData;
}
} catch (error) {
console.warn("Failed to convert GIF:", error);
}
}
const downloadProgressCallback = (current, total, file) => {
const downloadProgress = 50 + Math.round(current / total * 50);
onProgress?.({
current,
total,
percentage: downloadProgress,
currentFile: file?.filename,
converting: false
});
};
await zipStreamDownload(
zipFilename,
files,
downloadProgressCallback,
500,
appOptionsManager.get("downloadConcurrency") ?? 1,
this.abortController?.signal
);
}
convertVideoToGif(videoUrl) {
return new Promise((resolve) => {
if (!gifshot.isExistingVideoGIFSupported()) {
console.warn("GIF conversion not supported in this browser");
resolve(null);
return;
}
const gifOptions = getGifShotOptions();
{
this.getVideoDimensions(videoUrl).then(({ width, height }) => {
gifshot.createGIF({
video: videoUrl,
gifWidth: width,
gifHeight: height,
...gifOptions
}, (obj) => {
this.handleGifConversionResult(obj, resolve);
});
}).catch((error) => {
console.error("Failed to get video dimensions:", error);
gifshot.createGIF({
video: videoUrl,
...gifOptions
}, (obj) => {
this.handleGifConversionResult(obj, resolve);
});
});
}
});
}
handleGifConversionResult(obj, resolve) {
if (obj.error) {
console.error("GIF conversion failed:", obj.errorMsg);
resolve(null);
} else if (obj.image) {
try {
const dataUrl = obj.image;
const base64Data = dataUrl.split(",")[1];
if (!base64Data) {
resolve(null);
return;
}
const byteCharacters = atob(base64Data);
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
const blob = new Blob([byteArray], { type: "image/gif" });
const blobUrl = URL.createObjectURL(blob);
this.createdBlobUrls.push(blobUrl);
resolve(blobUrl);
} catch (error) {
console.error("Failed to create blob URL:", error);
resolve(null);
}
} else {
resolve(null);
}
}
getVideoDimensions(videoUrl) {
return new Promise((resolve, reject) => {
const video = document.createElement("video");
video.crossOrigin = "anonymous";
video.onloadedmetadata = () => {
const width = video.videoWidth;
const height = video.videoHeight;
video.remove();
if (width && height) {
resolve({ width, height });
} else {
reject(new Error("Could not determine video dimensions"));
}
};
video.onerror = () => {
video.remove();
reject(new Error("Failed to load video for dimension detection"));
};
setTimeout(() => {
video.remove();
reject(new Error("Timeout while detecting video dimensions"));
}, 1e4);
video.src = videoUrl;
});
}
}
const mediaDownloader = new MediaDownloader();
const urlParser = {
getCurrentUsername() {
try {
const pathname = window.location.pathname;
const pathParts = pathname.replace(/^\/+/, "").split("/");
const username = pathParts[0];
if (!username) return null;
const skipPaths = [
"i",
"home",
"explore",
"notifications",
"messages",
"settings",
"compose",
"search",
"hashtag",
"lists",
"moments",
"bookmarks",
"profile",
"login",
"logout",
"signup",
"welcome",
"help",
"tos",
"privacy",
"about",
"download",
"jobs",
"ads",
"analytics",
"connect",
"intent",
"oauth",
"account",
"share"
];
if (skipPaths.includes(username.toLowerCase())) {
return null;
}
if (this.isValidUsername(username)) {
return username;
}
return null;
} catch (error) {
console.error("Error parsing URL for username:", error);
return null;
}
},
isValidUsername(username) {
if (!username || typeof username !== "string") return false;
const cleanUsername = username.replace(/^@/, "");
return /^[a-zA-Z0-9_]{1,15}$/.test(cleanUsername);
},
isUserProfilePage() {
const username = this.getCurrentUsername();
if (!username) return false;
const pathname = window.location.pathname;
const pathParts = pathname.replace(/^\/+/, "").split("/");
if (pathParts.length === 1) ;
if (pathParts.length === 2 && pathParts[1] === "") ;
const profileTabs = ["with_replies", "media", "likes", "followers", "following"];
if (pathParts.length === 2 && pathParts[1] && profileTabs.includes(pathParts[1])) {
return true;
}
return false;
},
onUrlChange(callback) {
let currentUrl = window.location.href;
const checkUrlChange = () => {
const newUrl = window.location.href;
if (newUrl !== currentUrl) {
currentUrl = newUrl;
const username = this.getCurrentUsername();
callback(username);
}
};
const interval = setInterval(checkUrlChange, 1e3);
const handlePopState = () => {
setTimeout(() => {
const username = this.getCurrentUsername();
callback(username);
}, 100);
};
window.addEventListener("popstate", handlePopState);
return () => {
clearInterval(interval);
window.removeEventListener("popstate", handlePopState);
};
},
getProfileInfo() {
return {
username: this.getCurrentUsername(),
isProfilePage: this.isUserProfilePage()
};
}
};
const dashboardState = {
username: signals.signal(""),
accountData: signals.signal(null),
showAccountInfo: signals.signal(false),
currentAccountUsername: signals.signal(null),
isLoading: signals.signal(false),
errorMessage: signals.signal(""),
isDownloading: signals.signal(false),
downloadProgress: signals.signal(0),
downloadError: signals.signal(""),
isConverting: signals.signal(false),
currentFile: signals.signal(""),
downloadingType: signals.signal(null),
downloadCurrent: signals.signal(0),
downloadTotal: signals.signal(0),
detectedUsername: signals.signal(null),
isProfilePage: signals.signal(false),
currentPage: signals.signal(0),
hasMore: signals.signal(false),
isAutoBatching: signals.signal(false),
isPaused: signals.signal(false),
aggregatedTimeline: signals.signal([]),
currentBatchTimeline: signals.signal([]),
aggregatedCount: signals.signal(0),
fetchedPages: signals.signal([]),
pageMediaCounts: signals.signal({}),
loadingDirection: signals.signal(null),
resetForNewAccount(newUsername) {
const currentUsername = this.currentAccountUsername.value;
if (currentUsername && newUsername && currentUsername !== newUsername) {
this.username.value = "";
this.accountData.value = null;
this.showAccountInfo.value = false;
this.isLoading.value = false;
this.errorMessage.value = "";
this.downloadProgress.value = 0;
this.downloadError.value = "";
this.isDownloading.value = false;
this.isConverting.value = false;
this.currentFile.value = "";
this.downloadingType.value = null;
this.downloadCurrent.value = 0;
this.downloadTotal.value = 0;
this.currentPage.value = 0;
this.hasMore.value = false;
this.isAutoBatching.value = false;
this.isPaused.value = false;
this.aggregatedTimeline.value = [];
this.currentBatchTimeline.value = [];
this.aggregatedCount.value = 0;
this.fetchedPages.value = [];
this.pageMediaCounts.value = {};
this.loadingDirection.value = null;
}
this.currentAccountUsername.value = newUsername;
},
resetInteractionStates() {
this.isLoading.value = false;
this.errorMessage.value = "";
this.downloadProgress.value = 0;
this.downloadError.value = "";
this.isDownloading.value = false;
this.isConverting.value = false;
this.currentFile.value = "";
this.downloadingType.value = null;
this.downloadCurrent.value = 0;
this.downloadTotal.value = 0;
}
};
const authState = {
patreonVerified: signals.signal(false),
patreonAuth: signals.signal(""),
authToken: signals.signal("")
};
function g(n, t) {
for (var e in t) n[e] = t[e];
return n;
}
function E(n, t) {
for (var e in n) if ("__source" !== e && !(e in t)) return true;
for (var r in t) if ("__source" !== r && n[r] !== t[r]) return true;
return false;
}
function N(n, t) {
this.props = n, this.context = t;
}
(N.prototype = new preact.Component()).isPureReactComponent = true, N.prototype.shouldComponentUpdate = function(n, t) {
return E(this.props, n) || E(this.state, t);
};
var T = preact.options.__b;
preact.options.__b = function(n) {
n.type && n.type.__f && n.ref && (n.props.ref = n.ref, n.ref = null), T && T(n);
};
var F = preact.options.__e;
preact.options.__e = function(n, t, e, r) {
if (n.then) {
for (var u2, o = t; o = o.__; ) if ((u2 = o.__c) && u2.__c) return null == t.__e && (t.__e = e.__e, t.__k = e.__k), u2.__c(n, t);
}
F(n, t, e, r);
};
var U = preact.options.unmount;
function V(n, t, e) {
return n && (n.__c && n.__c.__H && (n.__c.__H.__.forEach(function(n2) {
"function" == typeof n2.__c && n2.__c();
}), n.__c.__H = null), null != (n = g({}, n)).__c && (n.__c.__P === e && (n.__c.__P = t), n.__c.__e = true, n.__c = null), n.__k = n.__k && n.__k.map(function(n2) {
return V(n2, t, e);
})), n;
}
function W(n, t, e) {
return n && e && (n.__v = null, n.__k = n.__k && n.__k.map(function(n2) {
return W(n2, t, e);
}), n.__c && n.__c.__P === t && (n.__e && e.appendChild(n.__e), n.__c.__e = true, n.__c.__P = e)), n;
}
function P() {
this.__u = 0, this.o = null, this.__b = null;
}
function j(n) {
var t = n.__.__c;
return t && t.__a && t.__a(n);
}
function B() {
this.i = null, this.l = null;
}
preact.options.unmount = function(n) {
var t = n.__c;
t && t.__R && t.__R(), t && 32 & n.__u && (n.type = null), U && U(n);
}, (P.prototype = new preact.Component()).__c = function(n, t) {
var e = t.__c, r = this;
null == r.o && (r.o = []), r.o.push(e);
var u2 = j(r.__v), o = false, i = function() {
o || (o = true, e.__R = null, u2 ? u2(l) : l());
};
e.__R = i;
var l = function() {
if (!--r.__u) {
if (r.state.__a) {
var n2 = r.state.__a;
r.__v.__k[0] = W(n2, n2.__c.__P, n2.__c.__O);
}
var t2;
for (r.setState({ __a: r.__b = null }); t2 = r.o.pop(); ) t2.forceUpdate();
}
};
r.__u++ || 32 & t.__u || r.setState({ __a: r.__b = r.__v.__k[0] }), n.then(i, i);
}, P.prototype.componentWillUnmount = function() {
this.o = [];
}, P.prototype.render = function(n, e) {
if (this.__b) {
if (this.__v.__k) {
var r = document.createElement("div"), o = this.__v.__k[0].__c;
this.__v.__k[0] = V(this.__b, r, o.__O = o.__P);
}
this.__b = null;
}
var i = e.__a && preact.createElement(preact.Fragment, null, n.fallback);
return i && (i.__u &= -33), [preact.createElement(preact.Fragment, null, e.__a ? null : n.children), i];
};
var H = function(n, t, e) {
if (++e[1] === e[0] && n.l.delete(t), n.props.revealOrder && ("t" !== n.props.revealOrder[0] || !n.l.size)) for (e = n.i; e; ) {
for (; e.length > 3; ) e.pop()();
if (e[1] < e[0]) break;
n.i = e = e[2];
}
};
function Z(n) {
return this.getChildContext = function() {
return n.context;
}, n.children;
}
function Y(n) {
var e = this, r = n.h;
if (e.componentWillUnmount = function() {
preact.render(null, e.v), e.v = null, e.h = null;
}, e.h && e.h !== r && e.componentWillUnmount(), !e.v) {
for (var u2 = e.__v; null !== u2 && !u2.__m && null !== u2.__; ) u2 = u2.__;
e.h = r, e.v = { nodeType: 1, parentNode: r, childNodes: [], __k: { __m: u2.__m }, contains: function() {
return true;
}, insertBefore: function(n2, t) {
this.childNodes.push(n2), e.h.insertBefore(n2, t);
}, removeChild: function(n2) {
this.childNodes.splice(this.childNodes.indexOf(n2) >>> 1, 1), e.h.removeChild(n2);
} };
}
preact.render(preact.createElement(Z, { context: e.context }, n.__v), e.v);
}
function $(n, e) {
var r = preact.createElement(Y, { __v: n, h: e });
return r.containerInfo = e, r;
}
(B.prototype = new preact.Component()).__a = function(n) {
var t = this, e = j(t.__v), r = t.l.get(n);
return r[0]++, function(u2) {
var o = function() {
t.props.revealOrder ? (r.push(u2), H(t, n, r)) : u2();
};
e ? e(o) : o();
};
}, B.prototype.render = function(n) {
this.i = null, this.l = new Map();
var t = preact.toChildArray(n.children);
n.revealOrder && "b" === n.revealOrder[0] && t.reverse();
for (var e = t.length; e--; ) this.l.set(t[e], this.i = [1, 0, this.i]);
return n.children;
}, B.prototype.componentDidUpdate = B.prototype.componentDidMount = function() {
var n = this;
this.l.forEach(function(t, e) {
H(n, e, t);
});
};
var q = "undefined" != typeof Symbol && Symbol.for && Symbol.for("react.element") || 60103, G = /^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/, J = /^on(Ani|Tra|Tou|BeforeInp|Compo)/, K = /[A-Z0-9]/g, Q = "undefined" != typeof document, X = function(n) {
return ("undefined" != typeof Symbol && "symbol" == typeof Symbol() ? /fil|che|rad/ : /fil|che|ra/).test(n);
};
preact.Component.prototype.isReactComponent = {}, ["componentWillMount", "componentWillReceiveProps", "componentWillUpdate"].forEach(function(t) {
Object.defineProperty(preact.Component.prototype, t, { configurable: true, get: function() {
return this["UNSAFE_" + t];
}, set: function(n) {
Object.defineProperty(this, t, { configurable: true, writable: true, value: n });
} });
});
var en = preact.options.event;
function rn() {
}
function un() {
return this.cancelBubble;
}
function on() {
return this.defaultPrevented;
}
preact.options.event = function(n) {
return en && (n = en(n)), n.persist = rn, n.isPropagationStopped = un, n.isDefaultPrevented = on, n.nativeEvent = n;
};
var cn = { enumerable: false, configurable: true, get: function() {
return this.class;
} }, fn = preact.options.vnode;
preact.options.vnode = function(n) {
"string" == typeof n.type && (function(n2) {
var t = n2.props, e = n2.type, u2 = {}, o = -1 === e.indexOf("-");
for (var i in t) {
var l = t[i];
if (!("value" === i && "defaultValue" in t && null == l || Q && "children" === i && "noscript" === e || "class" === i || "className" === i)) {
var c = i.toLowerCase();
"defaultValue" === i && "value" in t && null == t.value ? i = "value" : "download" === i && true === l ? l = "" : "translate" === c && "no" === l ? l = false : "o" === c[0] && "n" === c[1] ? "ondoubleclick" === c ? i = "ondblclick" : "onchange" !== c || "input" !== e && "textarea" !== e || X(t.type) ? "onfocus" === c ? i = "onfocusin" : "onblur" === c ? i = "onfocusout" : J.test(i) && (i = c) : c = i = "oninput" : o && G.test(i) ? i = i.replace(K, "-$&").toLowerCase() : null === l && (l = void 0), "oninput" === c && u2[i = c] && (i = "oninputCapture"), u2[i] = l;
}
}
"select" == e && u2.multiple && Array.isArray(u2.value) && (u2.value = preact.toChildArray(t.children).forEach(function(n3) {
n3.props.selected = -1 != u2.value.indexOf(n3.props.value);
})), "select" == e && null != u2.defaultValue && (u2.value = preact.toChildArray(t.children).forEach(function(n3) {
n3.props.selected = u2.multiple ? -1 != u2.defaultValue.indexOf(n3.props.value) : u2.defaultValue == n3.props.value;
})), t.class && !t.className ? (u2.class = t.class, Object.defineProperty(u2, "className", cn)) : (t.className && !t.class || t.class && t.className) && (u2.class = u2.className = t.className), n2.props = u2;
})(n), n.$$typeof = q, fn && fn(n);
};
var an = preact.options.__r;
preact.options.__r = function(n) {
an && an(n), n.__c;
};
var sn = preact.options.diffed;
preact.options.diffed = function(n) {
sn && sn(n);
var t = n.props, e = n.__e;
null != e && "textarea" === n.type && "value" in t && t.value !== e.value && (e.value = null == t.value ? "" : t.value);
};
function Title() {
return u("h2", { class: "text-lg font-bold", children: [
"Twitter/X Media Batch Downloader ",
u("span", { class: "text-warning", children: "Pro" })
] });
}
function Modal({ show, onClose, title, children, class: className, actions }) {
if (!show) {
return null;
}
const modalContent = u("dialog", { class: "modal", open: true, onClose: () => onClose?.(), children: [
u("div", { class: cx("modal-box transition-all duration-300 ease-in-out", className), children: [
u("div", { class: "flex items-center justify-between mb-4", children: [
title ? u("h2", { class: "text-lg font-bold", children: title }) : u("span", {}),
u("div", { class: "flex items-center gap-2", children: [
actions,
u("form", { method: "dialog", children: u(
"button",
{
class: "btn btn-sm btn-circle btn-ghost",
"aria-label": "Close",
children: u(IconX, { size: 18 })
}
) })
] })
] }),
u(ErrorBoundary, { children })
] }),
u("form", { method: "dialog", class: "modal-backdrop", children: u("button", { "aria-label": "Close", children: "close" }) })
] });
const portalTarget = document.getElementById("tmd-root")?.shadowRoot?.getElementById("tmd-portal-root") || document.getElementById("tmd-root")?.shadowRoot || document.body;
return $(modalContent, portalTarget);
}
function Dashboard({ loadFromDatabaseUsername } = {}) {
const { t, i18n } = useTranslation();
const isArabic = (i18n.language || "").startsWith("ar");
const {
accountData,
showAccountInfo,
detectedUsername,
isProfilePage,
isLoading,
errorMessage,
isDownloading,
downloadProgress,
downloadError,
isConverting,
currentFile,
downloadCurrent,
downloadTotal
} = dashboardState;
const showOverwriteModal = signals.useSignal(false);
const pendingFetchUsername = signals.useSignal("");
const pendingFetchParams = signals.useSignal(null);
const convertGifsExternal = signals.useSignal(appOptionsManager.get("convertGifsExternal") ?? false);
const mediaType = signals.useSignal(appOptionsManager.get("mediaType") ?? "all");
const fetchMode = signals.useSignal(appOptionsManager.get("fetchMode") ?? "single");
const isLoadingFromDB = signals.useSignal(false);
const hasDBData = signals.useSignal(false);
const isLoadedFromDB = signals.useSignal(false);
const isUpdating = signals.useSignal(false);
const showUpdateConfirmModal = signals.useSignal(false);
const isRetrying = signals.useSignal(false);
const retryAbortController = signals.useSignal(null);
const retryTokenCurrent = signals.useSignal(0);
const retryTokenTotal = signals.useSignal(0);
hooks.useEffect(() => {
const updateUsernameFromUrl = () => {
const profileInfo = urlParser.getProfileInfo();
const newDetectedUsername = profileInfo.username;
dashboardState.resetForNewAccount(newDetectedUsername);
detectedUsername.value = newDetectedUsername;
isProfilePage.value = profileInfo.isProfilePage;
if (newDetectedUsername) {
checkDBData(newDetectedUsername);
} else {
hasDBData.value = false;
}
};
updateUsernameFromUrl();
(async () => {
try {
const settings = await mediaDownloaderDB.getAuthSettings();
authState.patreonVerified.value = Boolean(settings?.patreon_verified);
authState.patreonAuth.value = settings?.patreon_auth || "";
} catch {
}
})();
const cleanup = urlParser.onUrlChange(() => {
updateUsernameFromUrl();
});
return cleanup;
}, []);
hooks.useEffect(() => {
appOptionsManager.signal.subscribe(() => {
convertGifsExternal.value = appOptionsManager.get("convertGifsExternal") ?? false;
mediaType.value = appOptionsManager.get("mediaType") ?? "all";
fetchMode.value = appOptionsManager.get("fetchMode") ?? "single";
});
}, []);
const checkDBData = async (username) => {
try {
const cleanUsername = mediaDownloaderAPI.formatUsername(username);
const fetchMode2 = appOptionsManager.get("fetchMode") ?? "single";
let count = 0;
if (fetchMode2 === "single") {
const singleAccount = await mediaDB.accounts.where("username").equals(cleanUsername).filter((acc) => !acc.batch_mode || acc.batch_mode === "single").count();
count = singleAccount;
} else {
const batchCount = await mediaDB.accounts.where("username").equals(cleanUsername).filter((acc) => !!(acc.batch_mode && acc.batch_mode !== "single")).count();
count = batchCount;
}
hasDBData.value = count > 0;
} catch {
hasDBData.value = false;
}
};
hooks.useEffect(() => {
const unsubscribe = appOptionsManager.signal.subscribe(() => {
if (detectedUsername.value) {
checkDBData(detectedUsername.value);
}
});
return unsubscribe;
}, []);
hooks.useEffect(() => {
if (detectedUsername.value) {
checkDBData(detectedUsername.value);
}
}, [dbState.dbChangeSignal.value]);
hooks.useEffect(() => {
if (loadFromDatabaseUsername && loadFromDatabaseUsername.value) {
const username = loadFromDatabaseUsername.value;
loadFromDatabaseUsername.value = "";
detectedUsername.value = username;
handleLoadFromDatabase();
}
}, [loadFromDatabaseUsername?.value]);
const stopRetry = () => {
isRetrying.value = false;
isLoading.value = false;
if (retryAbortController.value) {
retryAbortController.value.abort();
retryAbortController.value = null;
}
errorMessage.value = "";
};
const retryWithTokenGeneration = async (cleanUsername, authSettings) => {
const controller = new AbortController();
retryAbortController.value = controller;
isRetrying.value = true;
while (isRetrying.value && !controller.signal.aborted) {
if (!isRetrying.value || controller.signal.aborted) {
break;
}
try {
console.log("Attempting to generate new token...");
const tokenResult = await mediaDownloaderAPI.generateAuthToken(authSettings.patreon_auth);
retryTokenCurrent.value = tokenResult.current_index || 0;
retryTokenTotal.value = tokenResult.total_tokens || 0;
if (!isRetrying.value || controller.signal.aborted) {
break;
}
authSettings.auth_token = tokenResult.auth_token;
authState.authToken.value = tokenResult.auth_token;
await mediaDownloaderDB.saveAuthSettings(
tokenResult.auth_token,
authSettings.patreon_auth
);
if (!isRetrying.value || controller.signal.aborted) {
break;
}
await mediaDownloaderDB.setPatreonVerified(true);
if (!isRetrying.value || controller.signal.aborted) {
break;
}
console.log("Attempting to fetch with new token...");
isRetrying.value = false;
await handleFetchMedia(true);
retryAbortController.value = null;
return;
} catch (error) {
console.error("Retry attempt failed:", error);
if (!isRetrying.value || controller.signal.aborted) {
break;
}
console.log("Waiting 2 seconds before next retry...");
const waitCompleted = await new Promise((resolve) => {
const timeoutId = setTimeout(() => {
cleanup();
resolve(true);
}, 2e3);
const checkInterval = setInterval(() => {
if (!isRetrying.value || controller.signal.aborted) {
cleanup();
resolve(false);
}
}, 100);
const cleanup = () => {
clearTimeout(timeoutId);
clearInterval(checkInterval);
};
});
if (!waitCompleted) {
console.log("Wait interrupted, stopping retry");
break;
}
console.log("Retrying...");
}
}
console.log("Retry loop ended");
isRetrying.value = false;
retryAbortController.value = null;
};
const handleFetchMedia = async (skipOverwriteCheck = false) => {
const rawUsername = detectedUsername.value || "";
if (!rawUsername) {
errorMessage.value = t("Please visit a profile page for auto-detection");
setTimeout(() => errorMessage.value = "", 2e3);
return;
}
const authSettings = await mediaDownloaderDB.getAuthSettings();
if (!authSettings) {
errorMessage.value = t("Please configure authentication in the Auth tab first");
setTimeout(() => errorMessage.value = "", 2e3);
return;
}
const cleanUsername = mediaDownloaderAPI.formatUsername(rawUsername);
if ((authSettings.patreon_auth || "").trim() === "xbatchdemo" && cleanUsername !== "xbatchdemo") {
errorMessage.value = t("Demo mode is only available for @xbatchdemo");
setTimeout(() => errorMessage.value = "", 2e3);
return;
}
if (!mediaDownloaderAPI.validateUsername(cleanUsername)) {
errorMessage.value = t("Invalid username format");
setTimeout(() => errorMessage.value = "", 2e3);
return;
}
if (!mediaDownloaderAPI.validateAuthToken(authSettings.auth_token)) {
errorMessage.value = t("Invalid auth token. Please check your settings.");
setTimeout(() => errorMessage.value = "", 2e3);
return;
}
if (!mediaDownloaderAPI.validatePatreonAuth(authSettings.patreon_auth)) {
errorMessage.value = t("Invalid Patreon auth. Please check your settings.");
setTimeout(() => errorMessage.value = "", 2e3);
return;
}
const fetchMode2 = appOptionsManager.get("fetchMode") ?? "single";
if (!skipOverwriteCheck) {
const existingAccounts = await mediaDownloaderDB.getAccountsByUsernameAndMode(cleanUsername, fetchMode2);
if (existingAccounts.length > 0) {
pendingFetchUsername.value = cleanUsername;
pendingFetchParams.value = { authSettings };
showOverwriteModal.value = true;
return;
}
}
const timelineType = appOptionsManager.get("timelineType") ?? "media";
const mediaType2 = appOptionsManager.get("mediaType") ?? "all";
const batchSize = appOptionsManager.get("batchSize") ?? 100;
const startingBatch = appOptionsManager.get("startingBatch") ?? 0;
const resetBatchState = () => {
dashboardState.currentPage.value = startingBatch;
dashboardState.hasMore.value = false;
dashboardState.isAutoBatching.value = false;
dashboardState.isPaused.value = false;
dashboardState.aggregatedTimeline.value = [];
dashboardState.currentBatchTimeline.value = [];
dashboardState.aggregatedCount.value = 0;
dashboardState.fetchedPages.value = [];
dashboardState.pageMediaCounts.value = {};
};
const fetchPage = async (page, reveal = false) => {
isLoading.value = true;
errorMessage.value = "";
try {
const data = await mediaDownloaderAPI.fetchMediaData(
cleanUsername,
authSettings.auth_token,
authSettings.patreon_auth,
{
timelineType,
batchSize,
startingBatch: page,
mediaType: mediaType2,
fetchMode: fetchMode2
}
);
accountData.value = data;
dashboardState.currentBatchTimeline.value = data.timeline;
dashboardState.hasMore.value = Boolean(data?.metadata?.has_more);
dashboardState.currentPage.value = data?.metadata?.page ?? page;
const seen = new Set(dashboardState.aggregatedTimeline.value.map((i) => `${i.tweet_id}|${i.url}`));
const merged = [...dashboardState.aggregatedTimeline.value];
if (!dashboardState.fetchedPages.value.includes(page)) {
dashboardState.fetchedPages.value = [...dashboardState.fetchedPages.value, page];
let newMediaCount = 0;
for (const item of data.timeline) {
const key = `${item.tweet_id}|${item.url}`;
if (!seen.has(key)) {
seen.add(key);
merged.push(item);
newMediaCount++;
}
}
dashboardState.pageMediaCounts.value = {
...dashboardState.pageMediaCounts.value,
[page]: newMediaCount
};
dashboardState.aggregatedTimeline.value = merged;
dashboardState.aggregatedCount.value = merged.length;
}
if (reveal) {
showAccountInfo.value = true;
}
} catch (error) {
console.error("Fetch error:", error);
const raw = error instanceof Error ? error.message : "";
const httpMatch = raw.match(/^HTTP error! status: (\d+)/);
const msg = httpMatch ? t("HTTP error! status: {{status}}", { status: httpMatch[1] }) : (raw ? t(raw) : "") || t("Failed to fetch data");
errorMessage.value = msg;
setTimeout(() => errorMessage.value = "", 2e3);
throw error;
} finally {
isLoading.value = false;
}
};
try {
resetBatchState();
isLoadedFromDB.value = false;
if (fetchMode2 === "single") {
await fetchPage(startingBatch, true);
} else if (fetchMode2 === "batch") {
await fetchPage(startingBatch, true);
} else {
dashboardState.isAutoBatching.value = true;
await fetchPage(startingBatch, true);
await runAutoLoop();
}
if (accountData.value) {
try {
const batchIdentifier = fetchMode2 !== "single" ? `${cleanUsername}_${fetchMode2}_${Date.now()}` : void 0;
const timelineToSave = fetchMode2 !== "single" && dashboardState.aggregatedTimeline.value.length > 0 ? dashboardState.aggregatedTimeline.value : accountData.value.timeline;
const metadataToSave = fetchMode2 !== "single" && dashboardState.aggregatedTimeline.value.length > 0 ? { ...accountData.value.metadata, new_entries: dashboardState.aggregatedCount.value } : accountData.value.metadata;
await mediaDownloaderDB.saveAccount({
username: cleanUsername,
account_info: accountData.value.account_info,
metadata: metadataToSave,
timeline: timelineToSave,
batch_mode: fetchMode2,
batch_identifier: batchIdentifier,
timeline_type: timelineType,
media_type: mediaType2
});
await checkDBData(cleanUsername);
} catch (error) {
console.error("Failed to save to database:", error);
}
}
} catch (error) {
const raw = error instanceof Error ? error.message : "";
const isDemoMode = (authSettings.patreon_auth || "").trim() === "xbatchdemo";
if (raw === "Failed to fetch data from all APIs" && !isRetrying.value && !isDemoMode) {
errorMessage.value = "";
retryWithTokenGeneration(cleanUsername, authSettings);
} else if (isDemoMode && raw === "Failed to fetch data from all APIs") {
const httpMatch = raw.match(/^HTTP error! status: (\d+)/);
const msg = httpMatch ? t("HTTP error! status: {{status}}", { status: httpMatch[1] }) : (raw ? t(raw) : "") || t("Failed to fetch data");
errorMessage.value = msg;
setTimeout(() => errorMessage.value = "", 2e3);
}
}
};
const confirmOverwrite = async () => {
showOverwriteModal.value = false;
pendingFetchUsername.value = "";
pendingFetchParams.value = null;
await handleFetchMedia(true);
};
const cancelOverwrite = () => {
showOverwriteModal.value = false;
pendingFetchUsername.value = "";
pendingFetchParams.value = null;
};
const handleLoadFromDatabase = async () => {
const rawUsername = detectedUsername.value || "";
if (!rawUsername) {
errorMessage.value = t("Please visit a profile page for auto-detection");
setTimeout(() => errorMessage.value = "", 2e3);
return;
}
const cleanUsername = mediaDownloaderAPI.formatUsername(rawUsername);
isLoadingFromDB.value = true;
try {
const fetchMode2 = appOptionsManager.get("fetchMode") ?? "single";
let accounts;
if (fetchMode2 === "single") {
const singleAccount = await mediaDB.accounts.where("username").equals(cleanUsername).filter((acc) => !acc.batch_mode || acc.batch_mode === "single").reverse().sortBy("cached_at");
accounts = singleAccount;
} else {
const batchAccounts = await mediaDB.accounts.where("username").equals(cleanUsername).filter((acc) => !!(acc.batch_mode && acc.batch_mode !== "single")).reverse().sortBy("cached_at");
accounts = batchAccounts;
}
if (accounts.length === 0) {
return;
}
const latestAccount = accounts[0];
accountData.value = {
account_info: latestAccount.account_info,
metadata: latestAccount.metadata,
timeline: latestAccount.timeline
};
dashboardState.currentBatchTimeline.value = latestAccount.timeline;
dashboardState.aggregatedTimeline.value = latestAccount.timeline;
dashboardState.aggregatedCount.value = latestAccount.timeline.length;
showAccountInfo.value = true;
isLoadedFromDB.value = true;
if (detectedUsername.value) {
await checkDBData(detectedUsername.value);
}
} catch (error) {
console.error("Failed to load from database:", error);
errorMessage.value = t("Failed to load data");
setTimeout(() => errorMessage.value = "", 2e3);
} finally {
isLoadingFromDB.value = false;
}
};
const runAutoLoop = async () => {
try {
while (dashboardState.isAutoBatching.value && dashboardState.hasMore.value) {
try {
isLoading.value = true;
const rawUsername = dashboardState.detectedUsername.value || "";
const authSettings = await mediaDownloaderDB.getAuthSettings();
if (!rawUsername || !authSettings) break;
const cleanUsername = mediaDownloaderAPI.formatUsername(rawUsername);
const timelineType = appOptionsManager.get("timelineType") ?? "media";
const mediaType2 = appOptionsManager.get("mediaType") ?? "all";
const batchSize = appOptionsManager.get("batchSize") ?? 100;
const page = dashboardState.currentPage.value + 1;
const data = await mediaDownloaderAPI.fetchMediaData(
cleanUsername,
authSettings.auth_token,
authSettings.patreon_auth,
{
timelineType,
batchSize,
startingBatch: page,
mediaType: mediaType2
}
);
accountData.value = data;
dashboardState.currentBatchTimeline.value = data.timeline;
dashboardState.hasMore.value = Boolean(data?.metadata?.has_more);
dashboardState.currentPage.value = data?.metadata?.page ?? page;
const seen = new Set(dashboardState.aggregatedTimeline.value.map((i) => `${i.tweet_id}|${i.url}`));
const merged = [...dashboardState.aggregatedTimeline.value];
if (!dashboardState.fetchedPages.value.includes(page)) {
dashboardState.fetchedPages.value = [...dashboardState.fetchedPages.value, page];
let newMediaCount = 0;
for (const item of data.timeline) {
const key = `${item.tweet_id}|${item.url}`;
if (!seen.has(key)) {
seen.add(key);
merged.push(item);
newMediaCount++;
}
}
dashboardState.pageMediaCounts.value = {
...dashboardState.pageMediaCounts.value,
[page]: newMediaCount
};
dashboardState.aggregatedTimeline.value = merged;
dashboardState.aggregatedCount.value = merged.length;
await saveAggregatedData();
}
} catch (error) {
console.error("Auto batch error:", error);
break;
} finally {
isLoading.value = false;
}
}
} finally {
dashboardState.isAutoBatching.value = false;
}
};
const saveAggregatedData = async () => {
if (!accountData.value) return;
const fetchMode2 = appOptionsManager.get("fetchMode") ?? "single";
const rawUsername = detectedUsername.value || "";
if (fetchMode2 !== "single" && rawUsername && dashboardState.aggregatedTimeline.value.length > 0) {
try {
const cleanUsername = mediaDownloaderAPI.formatUsername(rawUsername);
const timelineType = appOptionsManager.get("timelineType") ?? "media";
const mediaType2 = appOptionsManager.get("mediaType") ?? "all";
const batchIdentifier = `${cleanUsername}_${fetchMode2}_${Date.now()}`;
await mediaDownloaderDB.saveAccount({
username: cleanUsername,
account_info: accountData.value.account_info,
metadata: { ...accountData.value.metadata, new_entries: dashboardState.aggregatedCount.value },
timeline: dashboardState.aggregatedTimeline.value,
batch_mode: fetchMode2,
batch_identifier: batchIdentifier,
timeline_type: timelineType,
media_type: mediaType2
});
await checkDBData(cleanUsername);
} catch (error) {
console.error("Failed to save aggregated data:", error);
}
}
};
const handleBack = async () => {
if (accountData.value && !isLoadedFromDB.value) {
await saveAggregatedData();
}
showAccountInfo.value = false;
accountData.value = null;
isLoadedFromDB.value = false;
dashboardState.resetInteractionStates();
};
const handleUpdateDataClick = () => {
showUpdateConfirmModal.value = true;
};
const cancelUpdate = () => {
showUpdateConfirmModal.value = false;
};
const confirmUpdate = async () => {
showUpdateConfirmModal.value = false;
await handleUpdateData();
};
const handleUpdateData = async () => {
isUpdating.value = true;
const rawUsername = detectedUsername.value || "";
if (!rawUsername) {
errorMessage.value = t("Please visit a profile page for auto-detection");
setTimeout(() => errorMessage.value = "", 2e3);
return;
}
const authSettings = await mediaDownloaderDB.getAuthSettings();
if (!authSettings) {
errorMessage.value = t("Please configure authentication in the Auth tab first");
setTimeout(() => errorMessage.value = "", 2e3);
return;
}
const cleanUsername = mediaDownloaderAPI.formatUsername(rawUsername);
const fetchMode2 = appOptionsManager.get("fetchMode") ?? "single";
const timelineType = appOptionsManager.get("timelineType") ?? "media";
const mediaType2 = appOptionsManager.get("mediaType") ?? "all";
const batchSize = appOptionsManager.get("batchSize") ?? 100;
const startingBatch = appOptionsManager.get("startingBatch") ?? 0;
const resetBatchState = () => {
dashboardState.currentPage.value = startingBatch;
dashboardState.hasMore.value = false;
dashboardState.isAutoBatching.value = false;
dashboardState.isPaused.value = false;
dashboardState.aggregatedTimeline.value = [];
dashboardState.currentBatchTimeline.value = [];
dashboardState.aggregatedCount.value = 0;
dashboardState.fetchedPages.value = [];
dashboardState.pageMediaCounts.value = {};
};
const fetchPage = async (page, reveal = false) => {
isLoading.value = true;
errorMessage.value = "";
try {
const data = await mediaDownloaderAPI.fetchMediaData(
cleanUsername,
authSettings.auth_token,
authSettings.patreon_auth,
{
timelineType,
batchSize,
startingBatch: page,
mediaType: mediaType2,
fetchMode: fetchMode2
}
);
accountData.value = data;
dashboardState.currentBatchTimeline.value = data.timeline;
dashboardState.hasMore.value = Boolean(data?.metadata?.has_more);
dashboardState.currentPage.value = data?.metadata?.page ?? page;
const seen = new Set(dashboardState.aggregatedTimeline.value.map((i) => `${i.tweet_id}|${i.url}`));
const merged = [...dashboardState.aggregatedTimeline.value];
if (!dashboardState.fetchedPages.value.includes(page)) {
dashboardState.fetchedPages.value = [...dashboardState.fetchedPages.value, page];
let newMediaCount = 0;
for (const item of data.timeline) {
const key = `${item.tweet_id}|${item.url}`;
if (!seen.has(key)) {
seen.add(key);
merged.push(item);
newMediaCount++;
}
}
dashboardState.pageMediaCounts.value = {
...dashboardState.pageMediaCounts.value,
[page]: newMediaCount
};
dashboardState.aggregatedTimeline.value = merged;
dashboardState.aggregatedCount.value = merged.length;
}
if (reveal) {
showAccountInfo.value = true;
}
try {
const batchIdentifier = fetchMode2 !== "single" ? `${cleanUsername}_${fetchMode2}_${Date.now()}` : void 0;
await mediaDownloaderDB.saveAccount({
username: cleanUsername,
account_info: data.account_info,
metadata: data.metadata,
timeline: data.timeline,
batch_mode: fetchMode2,
batch_identifier: batchIdentifier,
timeline_type: timelineType,
media_type: mediaType2
});
await checkDBData(cleanUsername);
} catch {
}
} catch (error) {
console.error("Fetch error:", error);
const raw = error instanceof Error ? error.message : "";
const httpMatch = raw.match(/^HTTP error! status: (\d+)/);
const msg = httpMatch ? t("HTTP error! status: {{status}}", { status: httpMatch[1] }) : (raw ? t(raw) : "") || t("Failed to fetch data");
errorMessage.value = msg;
setTimeout(() => errorMessage.value = "", 2e3);
throw error;
} finally {
isLoading.value = false;
}
};
try {
resetBatchState();
isLoadedFromDB.value = false;
if (fetchMode2 === "single") {
await fetchPage(startingBatch, true);
} else if (fetchMode2 === "batch") {
await fetchPage(startingBatch, true);
} else {
dashboardState.isAutoBatching.value = true;
await fetchPage(startingBatch, true);
await runAutoLoop();
}
} catch {
} finally {
isUpdating.value = false;
}
};
const handleDownloadMedia = async () => {
if (!accountData.value) return;
try {
dashboardState.downloadingType.value = "all";
isDownloading.value = true;
downloadError.value = "";
downloadProgress.value = 0;
const aggregatedTimeline = dashboardState.aggregatedTimeline.value.length > 0 ? dashboardState.aggregatedTimeline.value : accountData.value.timeline;
const account = {
username: accountData.value.account_info.name,
account_info: accountData.value.account_info,
metadata: accountData.value.metadata,
timeline: aggregatedTimeline,
cached_at: Date.now()
};
const fetchMode2 = appOptionsManager.get("fetchMode") ?? "single";
const batchInfo = fetchMode2 !== "single" ? { mode: fetchMode2 } : void 0;
await mediaDownloader.downloadAccountMedia(account, (progress) => {
downloadProgress.value = progress.percentage;
isConverting.value = progress.converting || false;
currentFile.value = progress.currentFile || "";
dashboardState.downloadCurrent.value = progress.current;
dashboardState.downloadTotal.value = progress.total;
}, batchInfo);
} catch (error) {
console.error("Download error:", error);
const raw = error instanceof Error ? error.message : "";
const httpMatch = raw.match(/^HTTP error! status: (\d+)/);
const msg = httpMatch ? t("HTTP error! status: {{status}}", { status: httpMatch[1] }) : (raw ? t(raw) : "") || t("Failed to download media");
downloadError.value = msg;
setTimeout(() => downloadError.value = "", 2e3);
} finally {
dashboardState.downloadingType.value = null;
isDownloading.value = false;
downloadProgress.value = 0;
isConverting.value = false;
currentFile.value = "";
dashboardState.downloadCurrent.value = 0;
dashboardState.downloadTotal.value = 0;
}
};
const handleDownloadCurrent = async () => {
if (!accountData.value) return;
try {
dashboardState.downloadingType.value = "current";
isDownloading.value = true;
downloadError.value = "";
downloadProgress.value = 0;
const currentTimeline = dashboardState.currentBatchTimeline.value.length > 0 ? dashboardState.currentBatchTimeline.value : accountData.value.timeline;
const account = {
username: accountData.value.account_info.name,
account_info: accountData.value.account_info,
metadata: accountData.value.metadata,
timeline: currentTimeline,
cached_at: Date.now()
};
const fetchMode2 = appOptionsManager.get("fetchMode") ?? "single";
const currentPage = dashboardState.currentPage.value;
const batchInfo = fetchMode2 !== "single" ? { mode: fetchMode2, page: currentPage } : void 0;
await mediaDownloader.downloadAccountMedia(account, (progress) => {
downloadProgress.value = progress.percentage;
isConverting.value = progress.converting || false;
currentFile.value = progress.currentFile || "";
dashboardState.downloadCurrent.value = progress.current;
dashboardState.downloadTotal.value = progress.total;
}, batchInfo);
} catch (error) {
console.error("Download error:", error);
const raw = error instanceof Error ? error.message : "";
const httpMatch = raw.match(/^HTTP error! status: (\d+)/);
const msg = httpMatch ? t("HTTP error! status: {{status}}", { status: httpMatch[1] }) : (raw ? t(raw) : "") || t("Failed to download media");
downloadError.value = msg;
setTimeout(() => downloadError.value = "", 2e3);
} finally {
dashboardState.downloadingType.value = null;
isDownloading.value = false;
downloadProgress.value = 0;
isConverting.value = false;
currentFile.value = "";
dashboardState.downloadCurrent.value = 0;
dashboardState.downloadTotal.value = 0;
}
};
const handlePrevBatch = async () => {
const page = dashboardState.currentPage.value;
if (page <= 0) return;
const p = page - 1;
await handleNavigateBatch(p);
};
const handleNextBatch = async () => {
const p = dashboardState.currentPage.value + 1;
await handleNavigateBatch(p);
};
const handleNavigateBatch = async (page) => {
const rawUsername = dashboardState.detectedUsername.value || "";
const authSettings = await mediaDownloaderDB.getAuthSettings();
if (!rawUsername || !authSettings) return;
const cleanUsername = mediaDownloaderAPI.formatUsername(rawUsername);
const timelineType = appOptionsManager.get("timelineType") ?? "media";
const mediaType2 = appOptionsManager.get("mediaType") ?? "all";
const batchSize = appOptionsManager.get("batchSize") ?? 100;
try {
isLoading.value = true;
const data = await mediaDownloaderAPI.fetchMediaData(
cleanUsername,
authSettings.auth_token,
authSettings.patreon_auth,
{
timelineType,
batchSize,
startingBatch: page,
mediaType: mediaType2
}
);
accountData.value = data;
dashboardState.currentBatchTimeline.value = data.timeline;
dashboardState.hasMore.value = Boolean(data?.metadata?.has_more);
dashboardState.currentPage.value = data?.metadata?.page ?? page;
const seen = new Set(dashboardState.aggregatedTimeline.value.map((i) => `${i.tweet_id}|${i.url}`));
const merged = [...dashboardState.aggregatedTimeline.value];
if (!dashboardState.fetchedPages.value.includes(page)) {
dashboardState.fetchedPages.value = [...dashboardState.fetchedPages.value, page];
let newMediaCount = 0;
for (const item of data.timeline) {
const key = `${item.tweet_id}|${item.url}`;
if (!seen.has(key)) {
seen.add(key);
merged.push(item);
newMediaCount++;
}
}
dashboardState.pageMediaCounts.value = {
...dashboardState.pageMediaCounts.value,
[page]: newMediaCount
};
dashboardState.aggregatedTimeline.value = merged;
dashboardState.aggregatedCount.value = merged.length;
await saveAggregatedData();
}
} catch (error) {
console.error("Navigate batch error:", error);
} finally {
isLoading.value = false;
dashboardState.loadingDirection.value = null;
}
};
const handleStartStop = async () => {
const running = dashboardState.isAutoBatching.value;
if (running) {
dashboardState.isAutoBatching.value = false;
} else {
dashboardState.isAutoBatching.value = true;
await runAutoLoop();
}
};
if (showAccountInfo.value && accountData.value) {
const account = accountData.value.account_info;
const metadata = accountData.value.metadata;
return u(preact.Fragment, { children: [
u("div", { class: "space-y-6", children: [
u("div", { class: "flex items-center gap-4 mb-6", children: [
u("div", { class: "flex items-center gap-2", children: [
u("button", { class: "btn btn-sm", onClick: handleBack, children: [
u(IconChevronLeft, { size: 16 }),
t("Back")
] }),
(isLoadedFromDB.value || isUpdating.value) && u("button", { class: "btn btn-accent btn-sm", onClick: handleUpdateDataClick, disabled: isLoading.value, children: isLoading.value && isUpdating.value ? u(preact.Fragment, { children: [
u("span", { class: "loading loading-spinner loading-xs" }),
t("Updating...")
] }) : u(preact.Fragment, { children: [
u(IconCloudUp, { size: 16 }),
t("Update")
] }) })
] }),
u("div", { class: "ml-auto flex items-center gap-2", children: (() => {
if (isLoadedFromDB.value) {
return null;
}
const page = dashboardState.currentPage.value;
const isPrevLoading = isLoading.value && dashboardState.loadingDirection.value === "prev";
const isNextLoading = isLoading.value && dashboardState.loadingDirection.value === "next";
if (fetchMode.value === "batch") {
return u(preact.Fragment, { children: [
u("button", { class: "btn btn-primary btn-sm", onClick: () => {
dashboardState.loadingDirection.value = "prev";
handlePrevBatch();
}, disabled: isLoading.value || page <= 0, children: [
isPrevLoading ? u("span", { class: "loading loading-spinner loading-xs" }) : u(IconChevronLeft, { size: 16 }),
t("Prev")
] }),
u("button", { class: "btn btn-primary btn-sm", onClick: () => {
dashboardState.loadingDirection.value = "next";
handleNextBatch();
}, disabled: isLoading.value || !dashboardState.hasMore.value, children: [
isNextLoading ? u("span", { class: "loading loading-spinner loading-xs" }) : u(IconChevronRight, { size: 16 }),
t("Next")
] })
] });
}
if (fetchMode.value === "auto") {
const running = dashboardState.isAutoBatching.value;
return u(preact.Fragment, { children: u("button", { class: "btn btn-secondary btn-sm", onClick: handleStartStop, children: [
isLoading.value ? u("span", { class: "loading loading-spinner loading-xs" }) : running ? u(IconPlayerStop, { size: 16 }) : u(IconPlayerPlay, { size: 16 }),
running ? t("Stop") : t("Start")
] }) });
}
return null;
})() })
] }),
u("div", { class: "card bg-base-200 card-border", children: u("div", { class: "card-body p-4", children: u("div", { class: "flex items-center gap-4", children: [
u("div", { class: "avatar", children: u("div", { class: "w-16 rounded-box", children: u(
"img",
{
src: account.profile_image,
alt: account.nick,
onError: (e) => {
const target = e.target;
target.src = 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="gray"%3E%3Ccircle cx="12" cy="12" r="10"/%3E%3C/svg%3E';
}
}
) }) }),
u("div", { class: "flex-grow", children: [
u("div", { class: "flex items-center gap-2", children: [
u("h3", { class: "font-semibold text-base", children: account.nick }),
(() => {
if (isLoadedFromDB.value) {
return null;
}
const page = dashboardState.currentPage.value;
if (fetchMode.value === "batch") {
return u("div", { class: "badge badge-soft badge-primary badge-sm", children: isLoading.value ? t("Fetching...") : t("Batch: {{page}}", { page }) });
}
if (fetchMode.value === "auto") {
return u("div", { class: "badge badge-soft badge-secondary badge-sm", children: isLoading.value ? t("Fetching...") : t("Batch: {{page}}", { page }) });
}
return null;
})()
] }),
u("p", { class: "text-sm opacity-70", children: [
"@",
account.name
] }),
u("p", { class: "text-sm opacity-50 mt-1", children: [
t("Posts: {{posts}}", { posts: account.statuses_count.toLocaleString() }),
" • ",
(() => {
if (isLoadedFromDB.value) {
return t("Media: {{media}}", { media: metadata.new_entries.toLocaleString() });
}
if (fetchMode.value !== "single") {
const currentCount = dashboardState.currentBatchTimeline.value?.length || 0;
const currentPage = dashboardState.currentPage.value;
const pageMediaCounts = dashboardState.pageMediaCounts.value;
const fetchedPages = dashboardState.fetchedPages.value;
const relevantPages = fetchedPages.filter((p) => p <= currentPage);
const totalCount = relevantPages.reduce((sum, page) => {
return sum + (pageMediaCounts[page] || 0);
}, 0);
return t("Current Media: {{current}} • Total Media: {{total}}", {
current: currentCount.toLocaleString(),
total: totalCount.toLocaleString()
});
}
return t("Media: {{media}}", { media: metadata.new_entries.toLocaleString() });
})()
] })
] })
] }) }) }),
u("div", { class: "space-y-4", children: [
isDownloading.value && u("div", { class: "space-y-2", children: [
u("div", { class: "flex justify-between text-sm", children: [
u("span", { children: [
isConverting.value ? t("Converting GIFs...") : t("Downloading..."),
downloadTotal.value > 0 && ` (${downloadCurrent.value.toLocaleString()}/${downloadTotal.value.toLocaleString()})`
] }),
u("span", { children: [
downloadProgress.value,
"%"
] })
] }),
u("progress", { class: "progress progress-primary w-full", value: downloadProgress.value, max: "100" }),
currentFile.value && u("div", { class: "text-xs opacity-70 truncate", children: currentFile.value })
] }),
u("div", { class: "flex justify-center gap-2", children: isDownloading.value ? u(
"button",
{
class: "btn btn-error btn-sm",
onClick: () => mediaDownloader.abortDownload(),
children: [
u(IconPlayerStop, { size: 16 }),
t("Stop")
]
}
) : u(preact.Fragment, { children: [
(() => {
if (isLoadedFromDB.value) {
return null;
}
if (fetchMode.value !== "single") {
const currentCount = dashboardState.currentBatchTimeline.value?.length || 0;
return u(
"button",
{
class: "btn btn-sm",
onClick: handleDownloadCurrent,
disabled: currentCount === 0,
children: [
u(IconDownload, { size: 16 }),
t("Download Current")
]
}
);
}
return null;
})(),
(() => {
const labelKey = fetchMode.value === "single" ? "Download" : "Download All";
return u(
"button",
{
class: "btn btn-neutral btn-sm",
onClick: handleDownloadMedia,
disabled: (dashboardState.aggregatedCount.value || metadata.new_entries) === 0,
children: [
u(IconDownload, { size: 16 }),
t(labelKey)
]
}
);
})()
] }) }),
downloadError.value && u("div", { role: "alert", class: "alert alert-error alert-soft", children: [
u(IconCircleX, { size: 20 }),
u("span", { dir: isArabic ? "rtl" : void 0, children: downloadError.value })
] })
] })
] }),
u(Modal, { show: showUpdateConfirmModal.value, onClose: cancelUpdate, title: t("Update"), class: "max-w-sm", children: u("div", { class: "space-y-2", children: [
u("p", { class: `text-sm${isArabic ? " text-right" : ""}`, dir: isArabic ? "rtl" : void 0, children: t("Update will fetch the latest data and overwrite the database. Continue?") }),
u("div", { class: "modal-action", children: [
u(
"button",
{
class: "btn btn-sm btn-ghost",
onClick: cancelUpdate,
children: t("Cancel")
}
),
u(
"button",
{
class: "btn btn-sm btn-warning",
onClick: confirmUpdate,
children: [
u(IconCloudUp, { size: 16 }),
t("Update")
]
}
)
] })
] }) })
] });
}
const handleExternalConvert = async () => {
const rawUsername = detectedUsername.value || "";
if (!rawUsername) {
errorMessage.value = t("Please visit a profile page for auto-detection");
setTimeout(() => errorMessage.value = "", 2e3);
return;
}
const authSettings = await mediaDownloaderDB.getAuthSettings();
if (!authSettings) {
errorMessage.value = t("Please configure authentication in the Auth tab first");
setTimeout(() => errorMessage.value = "", 2e3);
return;
}
const cleanUsername = mediaDownloaderAPI.formatUsername(rawUsername);
if (!mediaDownloaderAPI.validateUsername(cleanUsername)) {
errorMessage.value = t("Invalid username format");
setTimeout(() => errorMessage.value = "", 2e3);
return;
}
const patreonAuth = authSettings.patreon_auth || "";
const authToken = authSettings.auth_token || "";
if (!patreonAuth || !authToken) {
errorMessage.value = t("Please configure authentication in the Auth tab first");
setTimeout(() => errorMessage.value = "", 2e3);
return;
}
let url;
if (patreonAuth.trim() === "xbatchdemo") {
url = `https://convert.xbatch.online/demo/xbatchdemo/${encodeURIComponent(authToken)}/xbatchdemo`;
} else {
url = `https://convert.xbatch.online/${encodeURIComponent(patreonAuth)}/${encodeURIComponent(authToken)}/${encodeURIComponent(cleanUsername)}`;
}
window.open(url, "_blank", "noopener,noreferrer");
};
return u("div", { class: "space-y-4", children: [
u("div", { class: "space-y-4", children: [
isRetrying.value && u("div", { role: "alert", class: "alert alert-info alert-soft", children: [
u("span", { class: "loading loading-spinner loading-sm" }),
u("span", { dir: isArabic ? "rtl" : void 0, children: [
t("Generating token..."),
" ",
retryTokenTotal.value > 0 && `(${retryTokenCurrent.value}/${retryTokenTotal.value})`
] })
] }),
u("div", { role: "alert", class: `alert alert-soft ${!authState.patreonVerified.value ? "alert-warning" : "alert-info"}`, children: [
!authState.patreonVerified.value ? u(IconAlertTriangle, { size: 20 }) : u(IconUserFilled, { size: 20 }),
u("div", { class: "flex-1", dir: isArabic ? "rtl" : void 0, children: !authState.patreonVerified.value ? u("div", { children: t("Please verify Patreon auth first") }) : detectedUsername.value ? u("div", { children: u("span", { dir: "ltr", children: [
"@",
detectedUsername.value
] }) }) : u("div", { class: "font-semibold", children: t("Please visit a profile page for auto-detection") }) }),
detectedUsername.value && hasDBData.value && authState.patreonVerified.value && u("div", { class: "tooltip tooltip-left", "data-tip": t("Load from database"), children: u(
"button",
{
class: "btn btn-sm btn-square btn-soft btn-info",
onClick: handleLoadFromDatabase,
disabled: isLoadingFromDB.value || !detectedUsername.value,
"aria-label": t("Load from database"),
children: isLoadingFromDB.value ? u("span", { class: "loading loading-spinner loading-xs" }) : u(IconDatabaseImport, { size: 16 })
}
) })
] }),
u("div", { class: "flex justify-center", children: u("div", { class: "join", children: [
u(
"button",
{
class: `btn btn-sm join-item ${isRetrying.value ? "btn-error" : "btn-neutral"}`,
onClick: () => isRetrying.value ? stopRetry() : handleFetchMedia(),
disabled: isLoading.value && !isRetrying.value || !detectedUsername.value || !authState.patreonVerified.value,
children: (() => {
if (isRetrying.value) {
return u(preact.Fragment, { children: [
u(IconPlayerStop, { size: 16 }),
t("Abort")
] });
}
const fetchKey = mediaType.value === "all" ? "Fetch All" : mediaType.value === "video" ? "Fetch Video" : mediaType.value === "image" ? "Fetch Image" : mediaType.value === "gif" ? "Fetch GIF" : "Fetch";
if (isLoading.value) {
return u(preact.Fragment, { children: [
u("span", { class: "loading loading-spinner loading-xs" }),
t("Fetching...")
] });
}
return u(preact.Fragment, { children: [
u(IconCloudDown, { size: 16 }),
t(fetchKey)
] });
})()
}
),
convertGifsExternal.value ? u(
"button",
{
class: "btn btn-accent btn-sm join-item",
onClick: handleExternalConvert,
disabled: !detectedUsername.value || !authState.patreonVerified.value,
children: [
u(IconPhotoEdit, { size: 16 }),
t("Convert Animated GIFs")
]
}
) : null
] }) }),
errorMessage.value && u("div", { role: "alert", class: "alert alert-error alert-soft", children: [
u(IconCircleX, { size: 20 }),
u("span", { dir: isArabic ? "rtl" : void 0, children: errorMessage.value })
] })
] }),
u(Modal, { show: showOverwriteModal.value, onClose: cancelOverwrite, title: t("Overwrite Existing Data?"), class: "max-w-sm", children: u("div", { class: "space-y-2", children: [
u("p", { class: `text-sm${isArabic ? " text-right" : ""}`, dir: isArabic ? "rtl" : void 0, children: t("Account data for @{{username}} already exists in the database. Do you want to overwrite it?", { username: pendingFetchUsername.value }) }),
u("div", { class: "modal-action", children: [
u(
"button",
{
class: "btn btn-sm btn-ghost",
onClick: cancelOverwrite,
children: t("Cancel")
}
),
u(
"button",
{
class: "btn btn-sm btn-warning",
onClick: confirmOverwrite,
children: [
u(IconWriting, { size: 16 }),
t("Overwrite")
]
}
)
] })
] }) })
] });
}
function ViewDatabaseModal({ isOpen, onClose, account, onDeleteEntry, onLoadDatabase }) {
const { t } = useTranslation();
const typeFilter = signals.useSignal("all");
const currentPage = signals.useSignal(1);
const deletingEntry = signals.useSignal("");
const previewUrl = signals.useSignal("");
const previewType = signals.useSignal("");
const previewIndex = signals.useSignal(-1);
const touchStartX = hooks.useRef(0);
const touchEndX = hooks.useRef(0);
const previousAccountId = hooks.useRef(void 0);
const downloadingFiles = signals.useSignal( new Set());
const convertingFiles = signals.useSignal( new Set());
hooks.useEffect(() => {
if (account?.id !== previousAccountId.current) {
typeFilter.value = "all";
currentPage.value = 1;
previousAccountId.current = account?.id;
}
}, [account?.id]);
if (!account) return null;
const ITEMS_PER_PAGE = 5;
const filteredTimeline = typeFilter.value === "all" ? account.timeline : account.timeline.filter((item) => item.type === typeFilter.value);
const totalPages = Math.ceil(filteredTimeline.length / ITEMS_PER_PAGE);
const startIndex = (currentPage.value - 1) * ITEMS_PER_PAGE;
const endIndex = startIndex + ITEMS_PER_PAGE;
const currentItems = filteredTimeline.slice(startIndex, endIndex);
const handleTypeFilter = (type) => {
typeFilter.value = type;
currentPage.value = 1;
};
const handleOpenFile = (url) => {
window.open(url, "_blank", "noopener,noreferrer");
};
const handleDownloadFile = async (url, date, type, tweetId) => {
const fileKey = `${tweetId}_${url}`;
if (downloadingFiles.value.has(fileKey)) {
return;
}
try {
downloadingFiles.value = new Set([...downloadingFiles.value, fileKey]);
const shouldConvertGif = type === "animated_gif" && (appOptionsManager.get("convertAnimatedGifs") ?? true);
let finalBlob;
let ext = "jpg";
if (shouldConvertGif) {
convertingFiles.value = new Set([...convertingFiles.value, fileKey]);
try {
const gifBlob = await convertVideoToGif(url);
if (gifBlob) {
finalBlob = gifBlob;
ext = "gif";
} else {
const response = await fetch(url);
finalBlob = await response.blob();
ext = "mp4";
}
} catch (error) {
console.warn("GIF conversion failed, downloading original:", error);
const response = await fetch(url);
finalBlob = await response.blob();
ext = "mp4";
} finally {
convertingFiles.value = new Set([...convertingFiles.value].filter((k) => k !== fileKey));
}
} else {
const response = await fetch(url);
finalBlob = await response.blob();
if (type === "photo") {
const photoMatch = url.match(/format=(\w+)/);
ext = photoMatch?.[1] || "jpg";
} else if (type === "video") {
ext = "mp4";
} else if (type === "animated_gif") {
ext = "mp4";
}
}
const formatDateForFilename = (dateStr2) => {
const m = dateStr2.match(/(\d{4})-(\d{2})-(\d{2}).*?(\d{2}):(\d{2}):(\d{2})/);
if (m) {
const [, y, mo, d, h2, mi, s] = m;
return `${y}${mo}${d}_${h2}${mi}${s}`;
}
const d2 = new Date(dateStr2);
if (!isNaN(d2.getTime())) {
const pad = (n) => String(n).padStart(2, "0");
return `${d2.getFullYear()}${pad(d2.getMonth() + 1)}${pad(d2.getDate())}_${pad(d2.getHours())}${pad(d2.getMinutes())}${pad(d2.getSeconds())}`;
}
return dateStr2.replace(/\D/g, "");
};
const dateStr = formatDateForFilename(date);
const filename = `${account.username}_${dateStr}_${tweetId}.${ext}`;
const link = document.createElement("a");
link.href = URL.createObjectURL(finalBlob);
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(link.href);
} catch (error) {
console.error("Failed to download file:", error);
} finally {
downloadingFiles.value = new Set([...downloadingFiles.value].filter((k) => k !== fileKey));
}
};
const convertVideoToGif = (videoUrl) => {
return new Promise((resolve) => {
if (!gifshot.isExistingVideoGIFSupported()) {
console.warn("GIF conversion not supported in this browser");
resolve(null);
return;
}
const gifOptions = getGifShotOptions();
{
getVideoDimensions(videoUrl).then(({ width, height }) => {
gifshot.createGIF({
video: videoUrl,
gifWidth: width,
gifHeight: height,
...gifOptions
}, (obj) => {
handleGifConversionResult(obj, resolve);
});
}).catch((error) => {
console.error("Failed to get video dimensions:", error);
gifshot.createGIF({
video: videoUrl,
...gifOptions
}, (obj) => {
handleGifConversionResult(obj, resolve);
});
});
}
});
};
const handleGifConversionResult = (obj, resolve) => {
if (obj.error) {
console.error("GIF conversion failed:", obj.errorMsg);
resolve(null);
} else if (obj.image) {
try {
const dataUrl = obj.image;
const base64Data = dataUrl.split(",")[1];
if (!base64Data) {
resolve(null);
return;
}
const byteCharacters = atob(base64Data);
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
const blob = new Blob([byteArray], { type: "image/gif" });
resolve(blob);
} catch (error) {
console.error("Failed to create blob:", error);
resolve(null);
}
} else {
resolve(null);
}
};
const getVideoDimensions = (videoUrl) => {
return new Promise((resolve, reject) => {
const video = document.createElement("video");
video.crossOrigin = "anonymous";
video.onloadedmetadata = () => {
const width = video.videoWidth;
const height = video.videoHeight;
video.remove();
if (width && height) {
resolve({ width, height });
} else {
reject(new Error("Could not determine video dimensions"));
}
};
video.onerror = () => {
video.remove();
reject(new Error("Failed to load video for dimension detection"));
};
video.src = videoUrl;
});
};
const handleDeleteEntry = async (tweetId, url) => {
const key = `${tweetId}|${url}`;
deletingEntry.value = key;
try {
await onDeleteEntry(tweetId, url);
} finally {
deletingEntry.value = "";
}
};
const getTypeIcon = (type) => {
switch (type) {
case "photo":
return u(IconPhoto, { size: 16 });
case "video":
return u(IconVideo, { size: 16 });
case "animated_gif":
return u(IconGif, { size: 16 });
default:
return null;
}
};
const formatDate = (timestamp) => {
const fmt = appOptionsManager.get("dateTimeFormat") || "YYYY-MM-DD HH:mm:ss";
return dayjs(timestamp).format(fmt);
};
const handleSwipeLeft = () => {
if (previewIndex.value < filteredTimeline.length - 1) {
const nextItem = filteredTimeline[previewIndex.value + 1];
if (nextItem) {
previewIndex.value = previewIndex.value + 1;
previewUrl.value = nextItem.url;
previewType.value = nextItem.type;
}
}
};
const handleSwipeRight = () => {
if (previewIndex.value > 0) {
const prevItem = filteredTimeline[previewIndex.value - 1];
if (prevItem) {
previewIndex.value = previewIndex.value - 1;
previewUrl.value = prevItem.url;
previewType.value = prevItem.type;
}
}
};
const handleTouchStart = (e) => {
if (e.touches[0]) {
touchStartX.current = e.touches[0].clientX;
touchEndX.current = e.touches[0].clientX;
}
};
const handleTouchMove = (e) => {
if (e.touches[0]) {
touchEndX.current = e.touches[0].clientX;
}
};
const handleTouchEnd = () => {
if (touchStartX.current === 0 || touchEndX.current === 0) {
touchStartX.current = 0;
touchEndX.current = 0;
return;
}
const swipeThreshold = 50;
const diff = touchStartX.current - touchEndX.current;
if (Math.abs(diff) > swipeThreshold) {
if (diff > 0) {
handleSwipeLeft();
} else {
handleSwipeRight();
}
}
touchStartX.current = 0;
touchEndX.current = 0;
};
hooks.useEffect(() => {
if (!previewUrl.value) return;
const handleKeyDown = (e) => {
if (e.key === "ArrowLeft" && previewIndex.value > 0) {
const prevItem = filteredTimeline[previewIndex.value - 1];
if (prevItem) {
previewIndex.value = previewIndex.value - 1;
previewUrl.value = prevItem.url;
previewType.value = prevItem.type;
}
} else if (e.key === "ArrowRight" && previewIndex.value < filteredTimeline.length - 1) {
const nextItem = filteredTimeline[previewIndex.value + 1];
if (nextItem) {
previewIndex.value = previewIndex.value + 1;
previewUrl.value = nextItem.url;
previewType.value = nextItem.type;
}
} else if (e.key === "Escape") {
previewUrl.value = "";
previewType.value = "";
previewIndex.value = -1;
}
};
window.addEventListener("keydown", handleKeyDown);
return () => window.removeEventListener("keydown", handleKeyDown);
}, [previewUrl.value, previewIndex.value, filteredTimeline]);
return u(preact.Fragment, { children: [
u(Modal, { show: isOpen, onClose, title: t("Database"), children: u("div", { class: "space-y-4", children: [
u("div", { class: "card bg-base-200 border border-base-300", children: u("div", { class: "card-body p-4", children: u("div", { class: "flex items-center gap-4", children: [
u("div", { class: "avatar", children: u("div", { class: "w-16 rounded-box", children: u(
"img",
{
src: account.account_info.profile_image,
alt: account.account_info.nick,
onError: (e) => {
const target = e.target;
target.src = 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="gray"%3E%3Ccircle cx="12" cy="12" r="10"/%3E%3C/svg%3E';
}
}
) }) }),
u("div", { class: "flex-grow", children: [
u("h3", { class: "font-semibold text-base", children: [
account.account_info.nick,
" ",
u("span", { class: "font-normal opacity-70", children: [
"(@",
account.username,
")"
] })
] }),
u("p", { class: "text-xs opacity-60 mb-1", children: [
u("span", { class: "font-bold", children: t("Joined") }),
" ",
formatDateTime(account.account_info.date, appOptionsManager.get("dateTimeFormat") || "YYYY-MM-DD HH:mm:ss")
] }),
u("div", { class: "flex gap-3 text-xs opacity-60", children: [
u("span", { children: [
u("span", { class: "font-bold", children: account.account_info.statuses_count.toLocaleString() }),
" ",
t("Posts")
] }),
u("span", { children: [
u("span", { class: "font-bold", children: account.account_info.followers_count.toLocaleString() }),
" ",
t("Followers")
] }),
u("span", { children: [
u("span", { class: "font-bold", children: account.account_info.friends_count.toLocaleString() }),
" ",
t("Following")
] })
] })
] }),
onLoadDatabase && u("div", { class: "tooltip tooltip-left", "data-tip": t("Load database"), children: u(
"button",
{
class: "btn btn-sm btn-square btn-soft btn-info",
onClick: onLoadDatabase,
"aria-label": t("Load database"),
children: u(IconDatabaseImport, { size: 16 })
}
) })
] }) }) }),
u("div", { class: "flex items-center gap-2 justify-between", children: [
u("div", { class: "flex items-center gap-2", children: [
u("div", { class: "tooltip", "data-tip": `${t("All")} (${account.timeline.length.toLocaleString()})`, children: u(
"button",
{
class: `btn btn-sm btn-square ${typeFilter.value === "all" ? "btn-neutral" : "btn-ghost"}`,
onClick: () => handleTypeFilter("all"),
"aria-label": t("All"),
children: u(IconLibraryPhoto, { size: 18 })
}
) }),
u("div", { class: "tooltip", "data-tip": `${t("Image")} (${account.timeline.filter((i) => i.type === "photo").length.toLocaleString()})`, children: u(
"button",
{
class: `btn btn-sm btn-square ${typeFilter.value === "photo" ? "btn-primary" : "btn-ghost"}`,
onClick: () => handleTypeFilter("photo"),
"aria-label": t("Image"),
children: u(IconPhoto, { size: 18 })
}
) }),
u("div", { class: "tooltip", "data-tip": `${t("Video")} (${account.timeline.filter((i) => i.type === "video").length.toLocaleString()})`, children: u(
"button",
{
class: `btn btn-sm btn-square ${typeFilter.value === "video" ? "btn-secondary" : "btn-ghost"}`,
onClick: () => handleTypeFilter("video"),
"aria-label": t("Video"),
children: u(IconVideo, { size: 18 })
}
) }),
u("div", { class: "tooltip", "data-tip": `${t("GIF")} (${account.timeline.filter((i) => i.type === "animated_gif").length.toLocaleString()})`, children: u(
"button",
{
class: `btn btn-sm btn-square ${typeFilter.value === "animated_gif" ? "btn-accent" : "btn-ghost"}`,
onClick: () => handleTypeFilter("animated_gif"),
"aria-label": t("GIF"),
children: u(IconGif, { size: 18 })
}
) })
] }),
totalPages > 1 && u("div", { class: "join", children: [
u("div", { class: "tooltip tooltip-left", "data-tip": t("Home"), children: u(
"button",
{
class: "join-item btn btn-sm",
onClick: () => currentPage.value = 1,
disabled: currentPage.value === 1,
"aria-label": t("Home"),
children: "«"
}
) }),
u("div", { class: "tooltip tooltip-left", "data-tip": t("End"), children: u(
"button",
{
class: "join-item btn btn-sm",
onClick: () => currentPage.value = totalPages,
disabled: currentPage.value === totalPages,
"aria-label": t("End"),
children: "»"
}
) })
] })
] }),
u("div", { class: "space-y-4", children: currentItems.map((item) => {
const key = `${item.tweet_id}|${item.url}`;
const fileKey = `${item.tweet_id}_${item.url}`;
const isDeleting = deletingEntry.value === key;
const isDownloading = downloadingFiles.value.has(fileKey);
const isConverting = convertingFiles.value.has(fileKey);
return u("div", { class: "relative w-full", children: [
u(
"button",
{
class: "btn btn-circle btn-xs btn-error absolute -top-2 -right-2 z-10",
onClick: () => handleDeleteEntry(item.tweet_id, item.url),
disabled: isDeleting || isDownloading,
children: isDeleting ? u("span", { class: "loading loading-spinner loading-xs" }) : u(IconTrash, { size: 12 })
}
),
u("div", { class: "card bg-base-200 border border-base-300", children: u("div", { class: "card-body p-3", children: u("div", { class: "flex items-center gap-3", children: [
u("div", { class: "flex-shrink-0", children: u("div", { class: `btn btn-xs btn-square btn-soft no-animation pointer-events-none ${item.type === "photo" ? "btn-primary" : item.type === "video" ? "btn-secondary" : "btn-accent"}`, children: getTypeIcon(item.type) }) }),
u("div", { class: "flex-grow min-w-0", children: [
u(
"a",
{
class: "link link-hover text-sm font-mono",
href: `https://x.com/${account.username}/status/${item.tweet_id}`,
target: "_blank",
rel: "noopener noreferrer",
children: item.tweet_id
}
),
u("p", { class: "text-xs opacity-60", children: formatDate(item.date) })
] }),
u("div", { class: "flex-shrink-0 flex items-center gap-1", children: [
u("div", { class: "tooltip tooltip-left", "data-tip": t("Preview"), children: u(
"button",
{
class: "btn btn-xs btn-square",
onClick: () => {
const itemIndex = filteredTimeline.findIndex((i) => `${i.tweet_id}|${i.url}` === key);
previewIndex.value = itemIndex;
previewUrl.value = item.url;
previewType.value = item.type;
},
"aria-label": t("Preview"),
disabled: isDeleting,
children: u(IconEye, { size: 14 })
}
) }),
u("div", { class: "tooltip tooltip-left", "data-tip": t("Open"), children: u(
"button",
{
class: "btn btn-xs btn-square",
onClick: () => handleOpenFile(item.url),
"aria-label": t("Open"),
disabled: isDeleting,
children: u(IconExternalLink, { size: 14 })
}
) }),
u("div", { class: "tooltip tooltip-left", "data-tip": isConverting ? t("Converting...") : item.type === "animated_gif" && (appOptionsManager.get("convertAnimatedGifs") ?? true) ? t("Convert & Download") : t("Download"), children: u(
"button",
{
class: `btn btn-xs btn-square ${isConverting ? "btn-warning" : "btn-success"}`,
onClick: () => handleDownloadFile(item.url, item.date, item.type, item.tweet_id),
"aria-label": isConverting ? t("Converting...") : item.type === "animated_gif" && (appOptionsManager.get("convertAnimatedGifs") ?? true) ? t("Convert & Download") : t("Download"),
disabled: isDeleting || isDownloading,
children: isDownloading ? u("span", { class: "loading loading-spinner loading-xs" }) : u(IconFileDownload, { size: 14 })
}
) })
] })
] }) }) })
] }, key);
}) }),
totalPages > 1 && u("div", { class: "flex justify-center", children: u("div", { class: "join", children: [
u(
"button",
{
class: "join-item btn btn-sm",
onClick: () => currentPage.value = Math.max(1, currentPage.value - 1),
disabled: currentPage.value === 1,
children: "«"
}
),
u("button", { class: "join-item btn btn-sm", children: [
currentPage.value,
"/",
totalPages
] }),
u(
"button",
{
class: "join-item btn btn-sm",
onClick: () => currentPage.value = Math.min(totalPages, currentPage.value + 1),
disabled: currentPage.value === totalPages,
children: "»"
}
)
] }) }),
filteredTimeline.length === 0 && u("div", { class: "text-center py-8 opacity-50", children: u("p", { children: t("No media files found") }) })
] }) }),
previewUrl.value && $(
u(
"div",
{
class: "fixed inset-0 bg-black/90 backdrop-blur-sm flex items-center justify-center z-[1000]",
onTouchStart: handleTouchStart,
onTouchMove: handleTouchMove,
onTouchEnd: handleTouchEnd,
children: [
u(
"button",
{
class: "btn btn-square btn-error absolute top-4 right-4 z-10",
onClick: () => {
previewUrl.value = "";
previewType.value = "";
previewIndex.value = -1;
},
"aria-label": t("Close"),
children: u(IconX, { size: 24 })
}
),
u("div", { class: "absolute bottom-4 left-1/2 transform -translate-x-1/2 btn btn-neutral", children: u("span", { class: "text-base", children: [
(previewIndex.value + 1).toLocaleString(),
" / ",
filteredTimeline.length.toLocaleString()
] }) }),
previewIndex.value > 0 && u(
"button",
{
class: "btn btn-circle btn-lg btn-neutral absolute left-4 hidden md:flex",
onClick: () => {
const prevItem = filteredTimeline[previewIndex.value - 1];
if (prevItem) {
previewIndex.value = previewIndex.value - 1;
previewUrl.value = prevItem.url;
previewType.value = prevItem.type;
}
},
"aria-label": t("Prev"),
children: u(IconChevronLeft, { size: 32 })
}
),
previewIndex.value < filteredTimeline.length - 1 && u(
"button",
{
class: "btn btn-circle btn-lg btn-neutral absolute right-4 hidden md:flex",
onClick: () => {
const nextItem = filteredTimeline[previewIndex.value + 1];
if (nextItem) {
previewIndex.value = previewIndex.value + 1;
previewUrl.value = nextItem.url;
previewType.value = nextItem.type;
}
},
"aria-label": t("Next"),
children: u(IconChevronRight, { size: 32 })
}
),
previewType.value === "photo" ? u(
"img",
{
src: previewUrl.value,
alt: "Preview",
class: "max-w-full max-h-full object-contain"
}
) : u(
"video",
{
src: previewUrl.value,
controls: true,
autoplay: true,
class: "max-w-full max-h-full"
}
)
]
}
),
document.getElementById("tmd-root")?.shadowRoot?.getElementById("tmd-portal-root") || document.getElementById("tmd-root")?.shadowRoot || document.body
)
] });
}
function Database({ isVisible, onCountChange, onLoadToDashboard } = {}) {
const { t, i18n } = useTranslation();
const isArabic = (i18n.language || "").startsWith("ar");
const accounts = signals.useSignal([]);
const currentPage = signals.useSignal(1);
const totalPages = signals.useSignal(1);
const isLoading = signals.useSignal(true);
const exportingId = signals.useSignal(null);
const deletingId = signals.useSignal(null);
const accountToDelete = signals.useSignal(null);
const showDeleteModal = signals.useSignal(false);
const isImporting = signals.useSignal(false);
const isExportingAll = signals.useSignal(false);
const totalCount = signals.useSignal(0);
const showClearModal = signals.useSignal(false);
const isClearingAll = signals.useSignal(false);
const fileInputRef = hooks.useRef(null);
const filterByBatch = signals.useSignal(false);
const hasInitialLoad = signals.useSignal(false);
const showViewModal = signals.useSignal(false);
const viewingAccount = signals.useSignal(null);
const batchCount = signals.useSignal(0);
const handleImportClick = () => fileInputRef.current?.click();
const processJsonFile = async (text, fileName) => {
try {
const data = JSON.parse(text);
const account = {
username: data.username,
account_info: data.account_info,
metadata: data.metadata,
timeline: data.timeline,
cached_at: data.cached_at || Date.now(),
batch_mode: data.batch_mode,
batch_identifier: data.batch_identifier,
timeline_type: data.timeline_type,
media_type: data.media_type
};
if (!account.username || !account.account_info || !account.metadata || !Array.isArray(account.timeline)) {
console.warn("Skipped invalid account export file:", fileName);
return;
}
await mediaDownloaderDB.insertAccount(account);
} catch (err) {
console.error("Failed to process file:", fileName, err);
}
};
const importAccounts = async (files) => {
isImporting.value = true;
try {
for (const file of Array.from(files)) {
try {
if (file.name.toLowerCase().endsWith(".zip")) {
const arrayBuffer = await file.arrayBuffer();
const uint8Array = new Uint8Array(arrayBuffer);
fflate.unzip(uint8Array, async (err, unzipped) => {
if (err) {
console.error("Failed to unzip file:", file.name, err);
return;
}
for (const [fileName, fileData] of Object.entries(unzipped)) {
if (fileName.toLowerCase().endsWith(".json")) {
const text = new TextDecoder().decode(fileData);
await processJsonFile(text, fileName);
}
}
await loadAccounts();
currentPage.value = 1;
});
} else if (file.name.toLowerCase().endsWith(".json")) {
const text = await file.text();
await processJsonFile(text, file.name);
} else {
console.warn("Skipped unsupported file type:", file.name);
}
} catch (err) {
console.error("Failed to import file:", file.name, err);
}
}
await loadAccounts();
currentPage.value = 1;
} finally {
isImporting.value = false;
}
};
const onFilesSelected = async (e) => {
const input = e.currentTarget;
const files = input.files;
if (files && files.length) {
await importAccounts(files);
}
input.value = "";
};
const ITEMS_PER_PAGE = 3;
const dateFormat = signals.useSignal(appOptionsManager.get("dateTimeFormat"));
hooks.useEffect(() => {
appOptionsManager.signal.subscribe(() => {
dateFormat.value = appOptionsManager.get("dateTimeFormat");
});
}, []);
hooks.useEffect(() => {
loadAccounts();
}, [currentPage.value]);
hooks.useEffect(() => {
currentPage.value = 1;
loadAccounts();
}, [filterByBatch.value]);
hooks.useEffect(() => {
if (isVisible && !hasInitialLoad.value) {
loadAccounts();
}
}, [isVisible]);
hooks.useEffect(() => {
if (hasInitialLoad.value) {
loadAccounts();
}
}, [dbState.dbChangeSignal.value]);
const loadAccounts = async () => {
try {
isLoading.value = true;
const [accountsData, totalCountValue, batchCountValue] = await Promise.all([
mediaDownloaderDB.getAccounts(currentPage.value, ITEMS_PER_PAGE, filterByBatch.value),
mediaDownloaderDB.getAccountsCount(filterByBatch.value),
mediaDownloaderDB.getAccountsCount(true)
]);
accounts.value = accountsData;
totalCount.value = totalCountValue;
batchCount.value = batchCountValue;
totalPages.value = Math.ceil(totalCountValue / ITEMS_PER_PAGE);
onCountChange?.(totalCountValue);
hasInitialLoad.value = true;
} catch (error) {
console.error("Failed to load accounts:", error);
} finally {
isLoading.value = false;
}
};
const exportAccount = async (account) => {
if (!account.id) return;
try {
exportingId.value = account.id;
const fmt = dateFormat.value || appOptionsManager.get("dateTimeFormat") || "YYYY-MM-DD HH:mm:ss";
const now = dayjs();
const exportData = {
username: account.username,
account_info: account.account_info,
metadata: account.metadata,
timeline: account.timeline,
cached_at: account.cached_at,
batch_mode: account.batch_mode,
batch_identifier: account.batch_identifier,
timeline_type: account.timeline_type,
media_type: account.media_type,
cached_at_formatted: dayjs(account.cached_at).format(fmt),
exported_at: now.valueOf(),
exported_at_formatted: now.format(fmt),
date_time_format: fmt
};
const filenameTs = now.format("YYYYMMDD_HHmmss");
const batchSuffix = account.batch_mode && account.batch_mode !== "single" ? "_Batch" : "";
const filename = `${sanitizeFilename(account.username)}_${filenameTs}${batchSuffix}.json`;
const blob = new Blob([JSON.stringify(exportData, null, 2)], {
type: "application/json"
});
fileSaverEs.saveAs(blob, filename);
} catch (error) {
console.error("Failed to export account:", error);
} finally {
exportingId.value = null;
}
};
const openDeleteDialog = (account) => {
console.log("Opening delete dialog for:", account.username);
accountToDelete.value = account;
showDeleteModal.value = true;
};
const confirmDelete = async () => {
const account = accountToDelete.value;
if (!account?.id) return;
try {
deletingId.value = account.id;
await mediaDownloaderDB.deleteAccount(account.id);
await loadAccounts();
showDeleteModal.value = false;
} catch (error) {
console.error("Failed to delete account:", error);
} finally {
deletingId.value = null;
accountToDelete.value = null;
}
};
const closeDeleteDialog = () => {
showDeleteModal.value = false;
accountToDelete.value = null;
};
const openClearDialog = () => {
showClearModal.value = true;
};
const closeClearDialog = () => {
showClearModal.value = false;
};
const handleDeleteEntry = async (tweetId, url) => {
if (!viewingAccount.value?.id) return;
try {
const account = viewingAccount.value;
const updatedTimeline = account.timeline.filter(
(item) => !(item.tweet_id === tweetId && item.url === url)
);
await mediaDownloaderDB.updateAccount(account.id, {
...account,
timeline: updatedTimeline,
metadata: {
...account.metadata,
new_entries: updatedTimeline.length
}
});
viewingAccount.value = {
...account,
timeline: updatedTimeline,
metadata: {
...account.metadata,
new_entries: updatedTimeline.length
}
};
await loadAccounts();
} catch (error) {
console.error("Failed to delete entry:", error);
}
};
const handleLoadDatabase = () => {
if (!viewingAccount.value?.username || !onLoadToDashboard) return;
const username = viewingAccount.value.username;
showViewModal.value = false;
requestAnimationFrame(() => {
onLoadToDashboard(username);
viewingAccount.value = null;
});
};
const confirmClearAll = async () => {
try {
isClearingAll.value = true;
await mediaDownloaderDB.clearAll();
currentPage.value = 1;
await loadAccounts();
showClearModal.value = false;
} catch (error) {
console.error("Failed to clear database:", error);
} finally {
isClearingAll.value = false;
}
};
const formatDate = (timestamp) => {
const fmt = dateFormat.value || appOptionsManager.get("dateTimeFormat") || "YYYY-MM-DD HH:mm:ss";
return dayjs(timestamp).format(fmt);
};
const formatTimeAgo = (timestamp) => {
const now = dayjs();
const then = dayjs(timestamp);
const diff = now.diff(then, "second");
const years = Math.floor(diff / (365 * 24 * 60 * 60));
const days = Math.floor(diff % (365 * 24 * 60 * 60) / (24 * 60 * 60));
const hours = Math.floor(diff % (24 * 60 * 60) / (60 * 60));
const minutes = Math.floor(diff % (60 * 60) / 60);
const seconds = diff % 60;
const parts = [];
if (years > 0) parts.push(`${years}y`);
if (days > 0) parts.push(`${days}d`);
if (hours > 0) parts.push(`${hours}h`);
if (minutes > 0) parts.push(`${minutes}m`);
if (seconds > 0 && parts.length === 0) parts.push(`${seconds}s`);
return parts.slice(0, 2).join(" ") + " ago";
};
const goToPage = (page) => {
if (page >= 1 && page <= totalPages.value) {
currentPage.value = page;
}
};
const exportAllAccounts = async () => {
try {
isExportingAll.value = true;
const allAccounts = await mediaDownloaderDB.getAllAccounts();
if (!allAccounts.length) return;
const fmt = dateFormat.value || appOptionsManager.get("dateTimeFormat") || "YYYY-MM-DD HH:mm:ss";
const now = dayjs();
const exportTs = now.format("YYYYMMDD_HHmmss");
const files = allAccounts.map((account) => {
const exportData = {
username: account.username,
account_info: account.account_info,
metadata: account.metadata,
timeline: account.timeline,
cached_at: account.cached_at,
batch_mode: account.batch_mode,
batch_identifier: account.batch_identifier,
timeline_type: account.timeline_type,
media_type: account.media_type,
cached_at_formatted: dayjs(account.cached_at).format(fmt),
exported_at: now.valueOf(),
exported_at_formatted: now.format(fmt),
date_time_format: fmt
};
const batchSuffix = account.batch_mode && account.batch_mode !== "single" ? "_Batch" : "";
const fileName = `${sanitizeFilename(account.username)}_${exportTs}${batchSuffix}.json`;
const content = JSON.stringify(exportData, null, 2);
const blob = new Blob([content], { type: "application/json" });
return { name: fileName, blob };
});
let index = 0;
const readableZipStream = createWriter({
pull(ctrl) {
if (index >= files.length) {
ctrl.close();
return;
}
const file = files[index];
if (!file) {
ctrl.close();
return;
}
index += 1;
ctrl.enqueue({
name: file.name,
stream: () => file.blob.stream()
});
}
});
const chunks = [];
const writableOutputStream = new WritableStream({
write(chunk) {
chunks.push(chunk);
}
});
await readableZipStream.pipeTo(writableOutputStream);
const arrayBuffer = await new Blob(chunks).arrayBuffer();
const zipBlob = new Blob([arrayBuffer]);
const zipFilename = `twitter-x-media-batch-downloader-pro_${exportTs}.zip`;
fileSaverEs.saveAs(zipBlob, zipFilename);
} catch (error) {
console.error("Failed to export all accounts:", error);
} finally {
isExportingAll.value = false;
}
};
if (isLoading.value) {
return u("div", { class: "space-y-6", children: [
u("div", { class: "flex items-center justify-between", children: [
u("div", { class: "flex items-center gap-2", children: [
u("div", { class: "skeleton h-8 w-24" }),
u("div", { class: "skeleton h-8 w-24" })
] }),
u("div", { class: "flex items-center gap-2", children: [
u("div", { class: "skeleton h-8 w-8" }),
u("div", { class: "skeleton h-8 w-8" })
] })
] }),
[1, 2, 3].map((i) => u("div", { class: "card bg-base-200 border border-base-300 w-full", children: u("div", { class: "card-body p-4", children: u("div", { class: "flex items-center gap-4", children: [
u("div", { class: "skeleton w-16 h-16 rounded-xl shrink-0" }),
u("div", { class: "flex-grow space-y-2", children: [
u("div", { class: "skeleton h-4 w-32" }),
u("div", { class: "skeleton h-3 w-24" }),
u("div", { class: "flex gap-2", children: [
u("div", { class: "skeleton h-5 w-16" }),
u("div", { class: "skeleton h-5 w-16" }),
u("div", { class: "skeleton h-5 w-12" })
] }),
u("div", { class: "skeleton h-3 w-40" })
] }),
u("div", { class: "skeleton w-8 h-8 rounded-lg shrink-0" })
] }) }) }, i))
] });
}
return u(preact.Fragment, { children: [
u("div", { class: "space-y-6", children: [
u("div", { class: "flex items-center justify-between", children: [
u("div", { class: "flex items-center gap-2", children: [
u(
"input",
{
type: "file",
class: "hidden",
ref: fileInputRef,
accept: ".json,.zip,application/json,application/zip",
multiple: true,
onChange: onFilesSelected
}
),
u("div", { class: "tooltip tooltip-right", "data-tip": t("Supports JSON and ZIP formats"), children: u(
"button",
{
class: "btn btn-primary btn-sm",
onClick: handleImportClick,
disabled: isImporting.value,
children: isImporting.value ? u(preact.Fragment, { children: [
u("span", { class: "loading loading-spinner loading-xs" }),
t("Importing...")
] }) : u(preact.Fragment, { children: [
u(IconDatabaseImport, { size: 16 }),
t("Import")
] })
}
) }),
u("div", { class: "tooltip tooltip-right", "data-tip": t("Export All Data"), children: u(
"button",
{
class: "btn btn-secondary btn-sm",
onClick: async () => {
await exportAllAccounts();
},
"aria-label": t("Export All Data"),
disabled: isExportingAll.value || isImporting.value || totalCount.value === 0,
children: isExportingAll.value ? u(preact.Fragment, { children: [
u("span", { class: "loading loading-spinner loading-xs" }),
t("Exporting...")
] }) : u(preact.Fragment, { children: [
u(IconDatabaseExport, { size: 16 }),
t("Export")
] })
}
) })
] }),
u("div", { class: "flex items-center gap-2", children: [
u("div", { class: "tooltip tooltip-left", "data-tip": t("Filter by Batch"), children: u(
"button",
{
class: `btn btn-sm btn-square ${filterByBatch.value ? "btn-active btn-info" : "btn"}`,
"aria-label": t("Filter by Batch"),
onClick: () => filterByBatch.value = !filterByBatch.value,
disabled: isImporting.value || isExportingAll.value || isClearingAll.value || batchCount.value === 0,
children: u(IconStack2, { size: 16 })
}
) }),
u("div", { class: "tooltip tooltip-left", "data-tip": t("Clear"), children: u(
"button",
{
class: "btn btn-warning btn-sm btn-square",
"aria-label": t("Clear"),
onClick: openClearDialog,
disabled: isImporting.value || isExportingAll.value || isClearingAll.value || totalCount.value === 0,
children: u(IconDatabaseX, { size: 16 })
}
) })
] })
] }),
accounts.value.map((account) => u("div", { class: "relative w-full", children: [
u(
"button",
{
class: "btn btn-circle btn-xs btn-error absolute -top-2 -right-2 z-10",
onClick: () => openDeleteDialog(account),
children: deletingId.value === account.id ? u("span", { class: "loading loading-spinner loading-xs" }) : u(IconTrash, { size: 12 })
}
),
u("div", { class: "card bg-base-200 border border-base-300 w-full", children: u("div", { class: "card-body p-4", children: u("div", { class: "flex items-center gap-4", children: [
u("div", { class: "avatar", children: u("div", { class: "w-16 rounded-xl", children: u(
"img",
{
src: account.account_info.profile_image,
alt: account.account_info.nick,
onError: (e) => {
const target = e.target;
target.src = 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="gray"%3E%3Ccircle cx="12" cy="12" r="10"/%3E%3C/svg%3E';
}
}
) }) }),
u("div", { class: "flex-grow", children: [
u("div", { class: "flex items-center gap-2", children: [
u("h3", { class: "font-semibold text-base", children: account.account_info.nick }),
account.batch_mode && account.batch_mode !== "single" && u("div", { class: "badge badge-soft badge-info badge-sm", children: t("Batch") })
] }),
u("p", { class: "text-sm opacity-70", children: u(
"a",
{
class: "link link-hover",
href: `https://x.com/${account.username}`,
target: "_blank",
rel: "noopener noreferrer",
children: [
"@",
account.username
]
}
) }),
u("div", { class: "flex gap-2 mt-1", children: [
account.timeline_type && u("div", { class: "badge badge-soft badge-primary badge-sm", children: t(account.timeline_type === "media" ? "Media" : account.timeline_type === "timeline" ? "Timeline" : account.timeline_type === "tweets" ? "Tweets" : "Replies") }),
account.media_type && u("div", { class: "badge badge-soft badge-secondary badge-sm", children: t(account.media_type === "all" ? "All" : account.media_type === "image" ? "Image" : account.media_type === "video" ? "Video" : "GIF") }),
u("div", { class: "badge badge-soft badge-accent badge-sm", children: account.metadata.new_entries.toLocaleString() })
] }),
u("p", { class: "text-xs opacity-50 mt-1", children: formatDate(account.cached_at) }),
u("p", { class: "text-xs opacity-40 mt-0.5", children: formatTimeAgo(account.cached_at) })
] }),
u("div", { class: "flex items-center gap-1", children: [
u("div", { class: "tooltip tooltip-left", "data-tip": t("View Database"), children: u(
"button",
{
class: "btn btn-sm btn-square",
"aria-label": t("View Database"),
onClick: () => {
viewingAccount.value = account;
showViewModal.value = true;
},
disabled: deletingId.value === account.id,
children: u(IconDatabaseSearch, { size: 16 })
}
) }),
u("div", { class: "tooltip tooltip-left", "data-tip": t("Export"), children: u(
"button",
{
class: "btn btn-accent btn-sm btn-square",
"aria-label": t("Export"),
onClick: () => exportAccount(account),
disabled: exportingId.value === account.id || deletingId.value === account.id,
children: exportingId.value === account.id ? u("span", { class: "loading loading-spinner loading-xs" }) : u(IconDatabaseExport, { size: 16 })
}
) })
] })
] }) }) })
] }, account.id)),
accounts.value.length === 0 && u("div", { class: "text-center", children: [
u("div", { class: "opacity-50 mb-2", children: u(IconDatabase, { size: 36, class: "mx-auto" }) }),
u("p", { class: "text-sm font-medium mb-1", children: t("No accounts yet") }),
u("p", { class: "text-xs opacity-70", children: t("Use Dashboard to fetch data.") })
] }),
totalPages.value > 1 && u("div", { class: "flex justify-center", children: u("div", { class: "join", children: [
u(
"button",
{
class: "join-item btn btn-sm",
onClick: () => goToPage(currentPage.value - 1),
disabled: currentPage.value === 1,
children: "«"
}
),
u("button", { class: "join-item btn btn-sm", children: [
currentPage.value,
"/",
totalPages.value
] }),
u(
"button",
{
class: "join-item btn btn-sm",
onClick: () => goToPage(currentPage.value + 1),
disabled: currentPage.value === totalPages.value,
children: "»"
}
)
] }) })
] }),
u(Modal, { show: showDeleteModal.value, onClose: closeDeleteDialog, title: t("Delete Account Data"), class: "max-w-sm", children: u("div", { class: "space-y-2", children: [
u("p", { class: `text-sm${isArabic ? " text-right" : ""}`, dir: isArabic ? "rtl" : void 0, children: t("Are you sure you want to delete account data? This action cannot be undone", { username: accountToDelete.value?.username || "" }) }),
u("div", { class: "modal-action", children: [
u(
"button",
{
class: "btn btn-sm btn-ghost",
onClick: closeDeleteDialog,
children: t("Cancel")
}
),
u(
"button",
{
class: "btn btn-sm btn-error",
onClick: confirmDelete,
disabled: deletingId.value === accountToDelete.value?.id,
children: deletingId.value === accountToDelete.value?.id ? u(preact.Fragment, { children: [
u("span", { class: "loading loading-spinner loading-xs" }),
t("Deleting...")
] }) : u(preact.Fragment, { children: [
u(IconTrash, { size: 16 }),
t("Delete")
] })
}
)
] })
] }) }),
u(Modal, { show: showClearModal.value, onClose: closeClearDialog, title: t("Clear"), class: "max-w-sm", children: u("div", { class: "space-y-2", children: [
u("p", { class: `text-sm${isArabic ? " text-right" : ""}`, dir: isArabic ? "rtl" : void 0, children: t("Are you sure to clear all data in the database?") }),
u("div", { class: "modal-action", children: [
u(
"button",
{
class: "btn btn-sm btn-ghost",
onClick: closeClearDialog,
children: t("Cancel")
}
),
u(
"button",
{
class: "btn btn-sm btn-warning",
onClick: confirmClearAll,
disabled: isClearingAll.value,
children: isClearingAll.value ? u(preact.Fragment, { children: [
u("span", { class: "loading loading-spinner loading-xs" }),
t("Deleting...")
] }) : u(preact.Fragment, { children: [
u(IconDatabaseX, { size: 16 }),
t("Clear")
] })
}
)
] })
] }) }),
u(
ViewDatabaseModal,
{
isOpen: showViewModal.value,
onClose: () => {
showViewModal.value = false;
viewingAccount.value = null;
},
account: viewingAccount.value,
onDeleteEntry: handleDeleteEntry,
onLoadDatabase: handleLoadDatabase
}
)
] });
}
function Auth() {
const { t, i18n } = useTranslation();
const isArabic = (i18n.language || "").startsWith("ar");
const authToken = signals.useSignal("");
const patreonAuth = signals.useSignal("");
const showAuthToken = signals.useSignal(false);
const showPatreonAuth = signals.useSignal(false);
const isPatreonValid = signals.useSignal(false);
const isVerifying = signals.useSignal(false);
const isGenerating = signals.useSignal(false);
const verificationMessage = signals.useSignal("");
const verificationSuccess = signals.useSignal(false);
const generationMessage = signals.useSignal("");
const generationSuccess = signals.useSignal(false);
hooks.useEffect(() => {
loadAuthSettings();
}, []);
hooks.useEffect(() => {
const updateLocalToken = () => {
if (authState.authToken.value && authState.authToken.value !== authToken.value) {
authToken.value = authState.authToken.value;
}
};
updateLocalToken();
const unsubscribe = authState.authToken.subscribe(updateLocalToken);
return unsubscribe;
}, []);
const loadAuthSettings = async () => {
try {
const settings = await mediaDownloaderDB.getAuthSettings();
if (settings) {
authToken.value = settings.auth_token;
patreonAuth.value = settings.patreon_auth;
isPatreonValid.value = Boolean(settings.patreon_verified) && settings.patreon_verified_auth === settings.patreon_auth;
authState.authToken.value = settings.auth_token;
authState.patreonAuth.value = settings.patreon_auth;
authState.patreonVerified.value = isPatreonValid.value;
}
} catch (error) {
console.error("Failed to load auth settings:", error);
}
};
const autoSaveAuthToken = async (value) => {
try {
await mediaDownloaderDB.saveAuthSettings(value, patreonAuth.value);
authState.authToken.value = value;
} catch (error) {
console.error("Failed to auto-save auth token:", error);
}
};
const autoSavePatreonAuth = async (value) => {
try {
await mediaDownloaderDB.saveAuthSettings(authToken.value, value);
await mediaDownloaderDB.setPatreonVerified(false);
authState.patreonAuth.value = value;
authState.patreonVerified.value = false;
} catch (error) {
console.error("Failed to auto-save patreon auth:", error);
}
isPatreonValid.value = false;
verificationMessage.value = "";
};
const verifyPatreonAuth = async () => {
if (!patreonAuth.value.trim()) {
verificationMessage.value = t("Please enter Patreon auth first");
setTimeout(() => verificationMessage.value = "", 2e3);
return;
}
try {
isVerifying.value = true;
verificationMessage.value = "";
const data = await mediaDownloaderAPI.verifyPatreonAuth(patreonAuth.value);
isPatreonValid.value = data.valid;
await mediaDownloaderDB.setPatreonVerified(data.valid);
authState.patreonVerified.value = data.valid;
verificationSuccess.value = data.valid;
verificationMessage.value = data.valid ? t("Patreon auth verified successfully") : t("Invalid Patreon auth");
setTimeout(() => verificationMessage.value = "", 2e3);
} catch (error) {
console.error("Verification error:", error);
const raw = error instanceof Error ? error.message : "";
const httpMatch = raw.match(/^HTTP error! status: (\d+)/);
const msg = httpMatch ? t("HTTP error! status: {{status}}", { status: httpMatch[1] }) : (raw ? t(raw) : "") || t("Verification failed. Please try again");
verificationSuccess.value = false;
verificationMessage.value = msg;
setTimeout(() => verificationMessage.value = "", 2e3);
} finally {
isVerifying.value = false;
}
};
const generateAuthToken = async () => {
if (!isPatreonValid.value) {
generationMessage.value = t("Please verify Patreon auth first");
setTimeout(() => generationMessage.value = "", 2e3);
return;
}
try {
isGenerating.value = true;
generationMessage.value = "";
const data = await mediaDownloaderAPI.generateAuthToken(patreonAuth.value);
if (data.auth_token) {
authToken.value = data.auth_token;
await autoSaveAuthToken(data.auth_token);
authState.authToken.value = data.auth_token;
generationSuccess.value = true;
generationMessage.value = t("Token generated successfully", { current: data.current_index, total: data.total_tokens });
} else {
generationSuccess.value = false;
generationMessage.value = t("Failed to generate token");
}
setTimeout(() => generationMessage.value = "", 2e3);
} catch (error) {
console.error("Generation error:", error);
const raw = error instanceof Error ? error.message : "";
const httpMatch = raw.match(/^HTTP error! status: (\d+)/);
const msg = httpMatch ? t("HTTP error! status: {{status}}", { status: httpMatch[1] }) : (raw ? t(raw) : "") || t("Token generation failed. Please try again");
generationSuccess.value = false;
generationMessage.value = msg;
setTimeout(() => generationMessage.value = "", 2e3);
} finally {
isGenerating.value = false;
}
};
return u("div", { class: "space-y-6", children: u("div", { class: "space-y-4", children: [
u("div", { children: [
u("label", { class: "label mb-1", children: u("span", { class: "text-sm", children: t("Patreon Auth") }) }),
u("div", { class: "join w-full", children: [
u("div", { class: "flex-1", children: u("label", { class: "input input-bordered input-sm join-item flex items-center gap-2 w-full", children: [
u("svg", { class: "h-4 w-4 opacity-50", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: u(
"g",
{
strokeLinejoin: "round",
strokeLinecap: "round",
strokeWidth: "2.5",
fill: "none",
stroke: "currentColor",
children: [
u("path", { d: "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10" }),
u("path", { d: "m9 12 2 2 4-4" })
]
}
) }),
u(
"input",
{
type: showPatreonAuth.value ? "text" : "password",
class: "grow font-mono",
placeholder: t("Enter your Patreon auth"),
value: patreonAuth.value,
onInput: (e) => {
const value = e.target.value;
patreonAuth.value = value;
autoSavePatreonAuth(value);
}
}
),
u(
"span",
{
class: "cursor-pointer opacity-70 hover:opacity-100",
onClick: () => showPatreonAuth.value = !showPatreonAuth.value,
"aria-label": t("Toggle visibility"),
children: showPatreonAuth.value ? u(IconEyeOff, { size: 14 }) : u(IconEye, { size: 14 })
}
)
] }) }),
u(
"button",
{
class: `btn btn-sm join-item w-28 ${isPatreonValid.value ? "btn-success" : "btn-neutral"}`,
onClick: verifyPatreonAuth,
disabled: isVerifying.value || !patreonAuth.value.trim(),
children: isVerifying.value ? u(preact.Fragment, { children: [
u("span", { class: "loading loading-spinner loading-xs" }),
t("Verifying"),
"..."
] }) : isPatreonValid.value ? u(preact.Fragment, { children: [
u(IconCircleCheck, { size: 16 }),
t("Verified")
] }) : t("Verify")
}
)
] }),
verificationMessage.value && u("div", { role: "alert", class: `alert alert-soft mt-2 ${verificationSuccess.value ? "alert-success" : "alert-error"}`, children: [
verificationSuccess.value ? u(IconCircleCheck, { size: 20 }) : u(IconCircleX, { size: 20 }),
u("span", { dir: isArabic ? "rtl" : void 0, children: verificationMessage.value })
] })
] }),
u("div", { children: [
u("label", { class: "label mb-1", children: u("span", { class: "text-sm", children: t("Auth Token") }) }),
u("div", { class: "join w-full", children: [
u("div", { class: "flex-1", children: u("label", { class: "input input-bordered input-sm join-item flex items-center gap-2 w-full", children: [
u("svg", { class: "h-4 w-4 opacity-50", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: u(
"g",
{
strokeLinejoin: "round",
strokeLinecap: "round",
strokeWidth: "2.5",
fill: "none",
stroke: "currentColor",
children: [
u("rect", { width: "18", height: "11", x: "3", y: "11", rx: "2", ry: "2" }),
u("circle", { cx: "12", cy: "12", r: "2" }),
u("path", { d: "M7 11V7a5 5 0 0 1 10 0v4" })
]
}
) }),
u(
"input",
{
type: showAuthToken.value ? "text" : "password",
class: "grow font-mono",
placeholder: t("Enter your auth token"),
value: authToken.value,
onInput: (e) => {
const value = e.target.value;
authToken.value = value;
autoSaveAuthToken(value);
}
}
),
u(
"span",
{
class: "cursor-pointer opacity-70 hover:opacity-100",
onClick: () => showAuthToken.value = !showAuthToken.value,
"aria-label": t("Toggle visibility"),
children: showAuthToken.value ? u(IconEyeOff, { size: 14 }) : u(IconEye, { size: 14 })
}
)
] }) }),
u(
"button",
{
class: "btn btn-neutral btn-sm join-item w-28",
onClick: generateAuthToken,
disabled: isGenerating.value || !isPatreonValid.value || patreonAuth.value.trim() === "xbatchdemo",
children: isGenerating.value ? u(preact.Fragment, { children: [
u("span", { class: "loading loading-spinner loading-xs" }),
t("Generating"),
"..."
] }) : t("Generate")
}
)
] }),
generationMessage.value && u("div", { role: "alert", class: `alert alert-soft mt-2 ${generationSuccess.value ? "alert-success" : "alert-error"}`, children: [
generationSuccess.value ? u(IconCircleCheck, { size: 20 }) : u(IconCircleX, { size: 20 }),
u("span", { dir: isArabic ? "rtl" : void 0, children: generationMessage.value })
] })
] }),
u("div", { class: `mt-3 rounded-box bg-base-200 p-2 text-xs space-y-1 ${isArabic ? "text-right" : ""}`, dir: isArabic ? "rtl" : void 0, children: [
u("div", { children: [
"• ",
t("Use code"),
" ",
u(
"button",
{
type: "button",
class: "text-primary opacity-80 hover:opacity-100 cursor-pointer",
onClick: () => {
patreonAuth.value = "xbatchdemo";
autoSavePatreonAuth("xbatchdemo");
},
children: "xbatchdemo"
}
),
" ",
t("for Patreon Auth, click Verify to unlock demo. Test at"),
" ",
u("a", { class: "text-primary opacity-80 hover:opacity-100", href: "https://x.com/xbatchdemo", target: "_blank", rel: "noopener noreferrer", dir: "ltr", children: " @xbatchdemo" })
] }),
u("div", { children: [
"• ",
t("Need help with Auth Token? See"),
" ",
u("a", { class: "text-primary opacity-80 hover:opacity-100", href: "https://www.patreon.com/posts/how-to-obtain-127206894", target: "_blank", rel: "noopener noreferrer", children: t("the guide") })
] }),
u("div", { children: [
"• ",
u("a", { class: "text-primary opacity-80 hover:opacity-100", href: "https://www.patreon.com/exyezed/membership", target: "_blank", rel: "noopener noreferrer", children: t("Subscribe") }),
" ",
t("to get your Patreon Auth code and start downloading with ease!")
] }),
u("div", { children: [
"• ",
t("Report bugs or request features:"),
" ",
u("a", { class: "text-primary opacity-80 hover:opacity-100", href: "mailto:[email protected]", children: "[email protected]" })
] })
] })
] }) });
}
function Settings() {
const { t } = useTranslation();
const [, force] = hooks.useState(0);
const fetchMode = appOptionsManager.get("fetchMode") ?? "single";
const isBatching = fetchMode !== "single";
return u("div", { class: "space-y-4", children: [
u("div", { class: "flex items-center justify-between", children: [
u("span", { class: "text-sm flex items-center gap-1", children: [
t("Fetch"),
u("div", { class: "tooltip tooltip-right", "data-tip": t("Use Batch/Auto Batch if single fetch fails"), children: u(IconInfoCircle, { size: 14, class: "opacity-70" }) })
] }),
u("div", { class: "flex flex-wrap items-center gap-3 justify-start", children: ["single", "batch", "auto"].map((mode) => u("label", { class: "label cursor-pointer gap-2", children: [
u(
"input",
{
type: "radio",
name: "fetch-mode",
class: "radio radio-sm radio-primary",
checked: (appOptionsManager.get("fetchMode") ?? "single") === mode,
onChange: () => {
appOptionsManager.set("fetchMode", mode);
force((x) => x + 1);
}
}
),
u("span", { class: "label-text capitalize text-xs", children: mode === "auto" ? t("Auto Batch") : mode === "batch" ? t("Batch") : t("Single") })
] }, mode)) })
] }),
u("div", { class: "flex items-center justify-between", children: [
u("span", { class: "text-sm", children: t("Batch Size") }),
u(
"input",
{
type: "text",
class: `input input-bordered input-sm w-12 text-right ${!isBatching ? "opacity-50" : ""}`,
value: String(appOptionsManager.get("batchSize") ?? 100),
onInput: (e) => {
const raw = e.target.value;
const digits = raw.replace(/\D+/g, "");
const v = parseInt(digits || "100", 10);
const safe = Number.isFinite(v) && v >= 1 ? v : 100;
appOptionsManager.set("batchSize", safe);
force((x) => x + 1);
},
disabled: !isBatching
}
)
] }),
u("div", { class: "flex items-center justify-between", children: [
u("span", { class: "text-sm", children: t("Starting Batch") }),
u(
"input",
{
type: "text",
class: `input input-bordered input-sm w-12 text-right ${!isBatching ? "opacity-50" : ""}`,
value: String(appOptionsManager.get("startingBatch") ?? 0),
onInput: (e) => {
const raw = e.target.value;
const digits = raw.replace(/\D+/g, "");
const v = parseInt(digits || "0", 10);
const safe = Number.isFinite(v) && v >= 0 ? v : 0;
appOptionsManager.set("startingBatch", safe);
force((x) => x + 1);
},
disabled: !isBatching
}
)
] }),
u("div", { class: "divider my-2" }),
u("div", { class: "flex items-center justify-between", children: [
u("span", { class: "text-sm", children: t("Timeline") }),
u("div", { class: "flex flex-wrap items-center gap-3 justify-start", children: [
{ value: "media", label: "Media" },
{ value: "timeline", label: "Posts" },
{ value: "tweets", label: "Tweets" },
{ value: "with_replies", label: "Replies" }
].map((opt) => u("label", { class: "label cursor-pointer gap-2", children: [
u(
"input",
{
type: "radio",
name: "timeline-type",
class: "radio radio-sm radio-primary",
checked: (appOptionsManager.get("timelineType") ?? "media") === opt.value,
onChange: () => {
appOptionsManager.set("timelineType", opt.value);
force((x) => x + 1);
}
}
),
u("span", { class: "label-text capitalize text-xs", children: t(opt.label) })
] }, opt.value)) })
] }),
u("div", { class: "flex items-center justify-between", children: [
u("span", { class: "text-sm", children: t("Media") }),
u("div", { class: "flex flex-wrap items-center gap-3 justify-start", children: [
{ value: "all", label: "All" },
{ value: "image", label: "Image" },
{ value: "video", label: "Video" },
{ value: "gif", label: "GIF" }
].map((opt) => u("label", { class: "label cursor-pointer gap-2", children: [
u(
"input",
{
type: "radio",
name: "media-type",
class: "radio radio-sm radio-primary",
checked: (appOptionsManager.get("mediaType") ?? "all") === opt.value,
onChange: () => {
appOptionsManager.set("mediaType", opt.value);
force((x) => x + 1);
}
}
),
u("span", { class: "label-text capitalize text-xs", children: t(opt.label) })
] }, opt.value)) })
] }),
u("div", { class: "divider my-2" }),
u("div", { class: "flex justify-between items-center", children: [
u("span", { class: "text-sm flex items-center gap-1", children: [
t("Convert Animated GIFs"),
u("div", { class: "tooltip tooltip-right", "data-tip": t("Larger size, same quality"), children: u(IconInfoCircle, { size: 14, class: "opacity-70" }) })
] }),
u(
"input",
{
type: "checkbox",
class: "toggle toggle-primary",
checked: appOptionsManager.get("convertAnimatedGifs") ?? true,
onChange: (e) => {
const checked = e.target.checked;
appOptionsManager.set("convertAnimatedGifs", checked);
if (checked) {
appOptionsManager.set("convertGifsExternal", false);
}
force((x) => x + 1);
}
}
)
] }),
u("div", { class: "flex justify-between items-center", children: [
u("span", { class: "text-sm flex items-center gap-1", children: [
t("Convert GIFs (External)"),
u("div", { class: "tooltip tooltip-right", "data-tip": t("Smaller size, same quality"), children: u(IconInfoCircle, { size: 14, class: "opacity-70" }) })
] }),
u(
"input",
{
type: "checkbox",
class: "toggle toggle-primary",
checked: appOptionsManager.get("convertGifsExternal") ?? false,
onChange: (e) => {
const checked = e.target.checked;
appOptionsManager.set("convertGifsExternal", checked);
if (checked) {
appOptionsManager.set("convertAnimatedGifs", false);
}
force((x) => x + 1);
}
}
)
] }),
u("div", { class: "flex items-center justify-between", children: [
u("span", { class: "text-sm flex items-center gap-1", children: [
t("Concurrent Downloads"),
u("div", { class: "tooltip tooltip-right", "data-tip": t("Use 10+ only with fast internet"), children: u(IconInfoCircle, { size: 14, class: "opacity-70" }) })
] }),
u("div", { class: "flex-1", children: u("div", { class: "flex justify-end", children: (() => {
const allowed = Array.from({ length: 10 }, (_, i) => (i + 1) * 5);
appOptionsManager.get("downloadConcurrency") ?? 10;
allowed[0] ?? 10;
for (const v of allowed) {
}
return u(
"input",
{
type: "text",
class: "input input-bordered input-sm w-12 text-right",
value: String(appOptionsManager.get("downloadConcurrency") ?? 10),
onInput: (e) => {
const raw = e.target.value;
const digits = raw.replace(/\D+/g, "");
const v = parseInt(digits || "10", 10);
const safe = Number.isFinite(v) && v >= 1 ? v : 10;
appOptionsManager.set("downloadConcurrency", safe);
force((x) => x + 1);
},
"aria-label": t("Concurrent Downloads")
}
);
})() }) })
] })
] });
}
function ThemeSelector({
dropdownClasses = "",
btnClasses = "btn-ghost",
contentClasses = "mt-16"
}) {
const { t } = useTranslation();
const currentTheme = signals.useSignal(appOptionsManager.get("theme"));
hooks.useEffect(() => {
const unsub = appOptionsManager.signal.subscribe(() => {
currentTheme.value = appOptionsManager.get("theme");
});
return () => {
try {
unsub?.();
} catch {
}
};
}, []);
hooks.useEffect(() => {
document.documentElement.setAttribute("data-theme", currentTheme.value || "light");
}, [currentTheme.value]);
const handleThemeChange = (theme) => {
currentTheme.value = theme;
appOptionsManager.set("theme", theme);
document.documentElement.setAttribute("data-theme", theme);
};
return u("div", { class: cx("dropdown dropdown-end block", dropdownClasses), children: [
u(
"div",
{
tabIndex: 0,
role: "button",
class: cx("btn group btn-sm gap-1.5 px-1.5 justify-start", btnClasses),
"aria-label": t("Change Theme"),
children: [
u("div", { class: "bg-base-100 group-hover:border-base-content/20 border-base-content/10 grid shrink-0 grid-cols-2 gap-0.5 rounded-md border p-1 transition-colors", children: [
u("div", { class: "bg-base-content size-1 rounded-full" }),
u("div", { class: "bg-primary size-1 rounded-full" }),
u("div", { class: "bg-secondary size-1 rounded-full" }),
u("div", { class: "bg-accent size-1 rounded-full" })
] }),
u("div", { class: "w-24 truncate text-xs capitalize text-left", children: currentTheme.value || "light" }),
u(
"svg",
{
width: "12px",
height: "12px",
class: "mt-px hidden size-2 fill-current opacity-60 sm:inline-block ml-auto",
xmlns: "http://www.w3.org/2000/svg",
viewBox: "0 0 2048 2048",
children: u("path", { d: "M1799 349l242 241-1017 1017L7 590l242-241 775 775 775-775z" })
}
)
]
}
),
u(
"div",
{
tabIndex: 0,
class: cx(
"dropdown-content bg-base-200 text-base-content rounded-box mt-2 max-h-60 overflow-y-auto border-[length:var(--border)] border-white/5 shadow-2xl outline-[length:var(--border)] outline-black/5",
contentClasses
),
children: u("ul", { class: "menu w-56", children: [
u("li", { class: "menu-title text-xs", children: t("Change Theme") }),
THEMES.map((theme) => u("li", { children: u(
"button",
{
class: cx(
"gap-3 px-2",
currentTheme.value === theme && "[&_svg]:visible"
),
onClick: () => handleThemeChange(theme),
children: [
u(
"div",
{
"data-theme": theme,
class: "bg-base-100 grid shrink-0 grid-cols-2 gap-0.5 rounded-md p-1 shadow-sm",
children: [
u("div", { class: "bg-base-content size-1 rounded-full" }),
u("div", { class: "bg-primary size-1 rounded-full" }),
u("div", { class: "bg-secondary size-1 rounded-full" }),
u("div", { class: "bg-accent size-1 rounded-full" })
]
}
),
u("div", { class: "w-32 truncate capitalize", children: theme }),
u(
"svg",
{
xmlns: "http://www.w3.org/2000/svg",
width: "16",
height: "16",
viewBox: "0 0 24 24",
fill: "currentColor",
class: "invisible h-3 w-3 shrink-0",
children: u("path", { d: "M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z" })
}
)
]
}
) }, theme))
] })
}
)
] });
}
const flagUS = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20id='flag-icons-us'%20viewBox='0%200%20640%20480'%3e%3cpath%20fill='%23bd3d44'%20d='M0%200h640v480H0'/%3e%3cpath%20stroke='%23fff'%20stroke-width='37'%20d='M0%2055.3h640M0%20129h640M0%20203h640M0%20277h640M0%20351h640M0%20425h640'/%3e%3cpath%20fill='%23192f5d'%20d='M0%200h364.8v258.5H0'/%3e%3cmarker%20id='us-a'%20markerHeight='30'%20markerWidth='30'%3e%3cpath%20fill='%23fff'%20d='m14%200%209%2027L0%2010h28L5%2027z'/%3e%3c/marker%3e%3cpath%20fill='none'%20marker-mid='url(%23us-a)'%20d='m0%200%2016%2011h61%2061%2061%2061%2060L47%2037h61%2061%2060%2061L16%2063h61%2061%2061%2061%2060L47%2089h61%2061%2060%2061L16%20115h61%2061%2061%2061%2060L47%20141h61%2061%2060%2061L16%20166h61%2061%2061%2061%2060L47%20192h61%2061%2060%2061L16%20218h61%2061%2061%2061%2060z'/%3e%3c/svg%3e";
const flagCN = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20id='flag-icons-cn'%20viewBox='0%200%20640%20480'%3e%3cdefs%3e%3cpath%20id='cn-a'%20fill='%23ff0'%20d='M-.6.8%200-1%20.6.8-1-.3h2z'/%3e%3c/defs%3e%3cpath%20fill='%23ee1c25'%20d='M0%200h640v480H0z'/%3e%3cuse%20xlink:href='%23cn-a'%20width='30'%20height='20'%20transform='matrix(71.9991%200%200%2072%20120%20120)'/%3e%3cuse%20xlink:href='%23cn-a'%20width='30'%20height='20'%20transform='matrix(-12.33562%20-20.5871%2020.58684%20-12.33577%20240.3%2048)'/%3e%3cuse%20xlink:href='%23cn-a'%20width='30'%20height='20'%20transform='matrix(-3.38573%20-23.75998%2023.75968%20-3.38578%20288%2095.8)'/%3e%3cuse%20xlink:href='%23cn-a'%20width='30'%20height='20'%20transform='matrix(6.5991%20-23.0749%2023.0746%206.59919%20288%20168)'/%3e%3cuse%20xlink:href='%23cn-a'%20width='30'%20height='20'%20transform='matrix(14.9991%20-18.73557%2018.73533%2014.99929%20240%20216)'/%3e%3c/svg%3e";
const flagSA = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20id='flag-icons-sa'%20viewBox='0%200%20640%20480'%3e%3cdefs%3e%3cclipPath%20id='sa-a'%3e%3cpath%20fill-opacity='.7'%20d='M-85.3%200h682.6v512H-85.3z'/%3e%3c/clipPath%3e%3c/defs%3e%3cg%20fill-rule='evenodd'%20clip-path='url(%23sa-a)'%20transform='translate(80)scale(.9375)'%3e%3cpath%20fill='%23165d31'%20d='M-128%200h768v512h-768z'/%3e%3cpath%20fill='%23fff'%20d='M65.5%20145.1c-.8%2012-2%2033%208.3%2035.2%2012.3%201.2%205.5-20.8%2010-24.8.8-2%202.3-2%202.4.5v18.7c0%206%204%207.8%207%209%203.2-.2%205.4%200%206.6%203l1.6%2032.3s7.4%202.2%207.8-18.1c.3-12-2.4-21.9-.8-24.2%200-2.3%203-2.4%205-1.3%203.2%202.2%204.6%205%209.6%204%207.6-2.2%2012.2-5.9%2012.3-11.7a47%2047%200%200%200-3.5-16.6c.4-1-1.4-3.7-1-4.7%201.3%202.2%203.4%202%203.8%200-1.3-4.2-3.3-8.3-6.5-10-2.7-2.4-6.7-2-8%203-.8%205.7%202%2012.4%206.1%2018%20.9%202.1%202.1%205.7%201.6%208.9q-3.4%201.8-6.3-1.2s-6-4.5-6-5.6c1.6-10.2.3-11.4-.6-14.3-.6-3.9-2.5-5.2-4-7.8-1.5-1.6-3.5-1.6-4.5%200-2.7%204.6-1.4%2014.5.5%2019%201.4%204.1%203.5%206.7%202.5%206.7-.8%202.3-2.5%201.7-3.8-1a67%2067%200%200%201-2.1-17.4c-.5-4.6-1.1-14.4-4.2-17-1.8-2.4-4.5-1.2-5.5%201a82%2082%200%200%200%20.3%2013.4c2%207.4%202.7%2014%203.7%2021.5.3%2010.1-5.8%204.4-5.5-.7a45%2045%200%200%200-.3-19.4c-1-2.6-2.1-3.2-4.6-2.8-1.9%200-6.8%205.3-8.2%2014.3%200%200-1.2%204.6-1.7%208.7-.7%204.6-3.7%208-5.9-.6-1.8-6.3-3-21.6-6-18z'/%3e%3cpath%20fill='%23fff'%20d='m99%20194.2-32%2015.4c.3-7.3%2015.1-20.4%2025.3-20.5%206.5.1%204.9%202.5%206.6%205.1z'/%3e%3cpath%20fill='%23fff'%20d='M93.3%20204.2c-16.8%2043.5%2039.5%2049.6%2045.8%201.8.6-2%203-3.9%203.4-.7-1.3%2043.3-43.6%2046.2-50.8%2032.6a42%2042%200%200%201-2.5-14.6c-1-8.5-5.5-5.2-6.2%203.2-.7%204.7-.5%206-.5%2010.5%202.2%2034.2%2056.7%2019.5%2065.6-8.7%204.7-15.6-.8-27.1%201.7-27.1%205.4%205.8%2013%20.8%2014.7-1.2.7-1%202.5-1.7%203.7-.4%204.2%203%2011.6%201.6%2013.2-3.7q1.4-8%201.8-16.2c-3.5%201-6%201.7-6.3%203.2l-.7%204.6c-.3%201.5-3.2%201.5-3.4-.4-1.3-6-6.7-6.7-10%202.5-2.1%201.8-6.1%202.2-6.5-.5.5-6.2-2-7-7-4.1l-4.8-36.2c2%200%204%201.5%205.9-.9-2-6.5-6.5-19.7-9-20.7-1.1-1.4-2.1-.5-3.7-.1-2.6.8-5%203-4.2%207.4%203%2018.8%205%2033.1%208.1%2052%20.5%202.1-1.3%205-3.7%204.7-4-2.7-5-8.2-12-8-5%200-10.6%205.5-11.3%2010.7-.9%204.2-1.2%208.7%200%2012.3%203.5%204.2%207.7%203.8%2011.4%202.9%203-1.3%205.5-4.3%206.6-3.6.7.9.1%2010.9-14.3%2018.5-8.7%204-15.7%204.8-19.4-2.3-2.3-4.5.2-21.4-5.6-17.5'/%3e%3cpath%20fill='%23fff'%20d='M165%20160c3.3-1.2%2019.3-19.6%2019.3-19.6l-2.4-2q-1.3-1.1%200-2.2c4-2.4%202.7-7.4.7-9.8a10%2010%200%200%200-8.7.1c-2.8%202.7-3.4%207-1.2%209.6%202.1%201%204.2%203.2%202.8%204.4-6.6%207-24.5%2019.1-22.4%2019.5.4.6%2011.5.6%2011.8%200zm-97%2065c-6%209.6-6.5%2023.9-3.2%2028.2%201.8%202%204.7%202.9%206.8%202.2%203.8-1.6%205.5-9.3%204.6-12q-1.8-3-3.6-.7c-2.6%205.4-3.7%201.7-4-1.3a70%2070%200%200%201%20.8-15.2c.7-4.2%200-3-1.4-1.2m257.1-15.3c-5.8-12.6-13.9-25-16.4-29.7a558%20558%200%200%200-24.8-36c-6.2-7.4%2010.2%203.1-2-11.7l-8.9-7.5c-2-1.4-6.8-4-7.6.2-.4%203.8-.2%205.8.4%208.9.5%202%203.5%205.5%205%207.5a565%20565%200%200%201%2053.8%2086.5c2.6-1.3%202-16.1.5-18.2'/%3e%3cpath%20fill='%23fff'%20d='M299.6%20251.5c-1.2%201.3%202.8%206.8%208%206.8%208.6-1%2016.2-5.8%2023.2-18.6a33%2033%200%200%200%205.3-14.2%20317%20317%200%200%200-5.8-72.4c-.3-2%200-4.4.2-5%20.6-.7%202.5%200%203.5-1.7%201.5-1.5-4-14-7-18.7-1-2.2-1.5-3.6-3.3.2a27%2027%200%200%200-3%2013.6c4.1%2028.5%205.4%2053.4%208%2081.9.3%202.8-.1%206.8-2%208.4a80%2080%200%200%201-27.1%2019.7m116.5-.1c-6.2%203.6-6.2%207.7-1.2%207.8%208.6-1%2018.8-1.7%2025.8-12.3a41%2041%200%200%200%204.2-16%20303%20303%200%200%200-4.7-71.4c-.2-2-1.1-6.7-.8-7.3.6-1.4%203.4.1%204.4-1.5%201.4-1.5-7.3-12.7-10.4-17.5-1-2.2-1.4-3.6-3.3.2a22%2022%200%200%200-1.8%2013.6c4.6%2031%208%2054.2%208.7%2081.6-.4%202.6-.5%204-1.7%207.3-2.7%203.4-5.7%207.8-8.5%209.9-2.8%202-8.8%204-10.7%205.6'/%3e%3cpath%20fill='%23fff'%20d='M420.7%20223.7q.1-10.9-.1-19a34%2034%200%200%200-3-13.5c-1.8-4.1-.7-7.4-1.6-11.8-.8-4.4-.6-11-1.8-16.1-.4-2-1.4-8.5-1.1-9.2.5-1.4%202.4%200%203.4-1.6%201.4-1.5-5-18-8.2-22.7-1.1-2.1-3.3-1.4-5.8%202-2.5%202.3-1.6%207.4-.6%2012.3%206.1%2032.3%2010.8%2061.6%209.8%2092.3-.4%202.6%209-7.8%209-12.7m-45.7-40c-3.9-.2-12-7.7-14.4-12a8%208%200%200%201%20.4-6.5c1.5-1%203.7-2%205.4-1%200%200%201.7%202.4%201.4%202.7%202%201%203%20.5%203.2-.4.1-1.5-.6-2.4-.6-4%20.9-4.6%206-5.3%208-2.4%201.4%201.8%202%205.5%202.1%208%200%201.3-2-.2-3.3%200-1.1.4-1.4%201.8-1.5%203-.2%203.3-.6%208.6-.7%2012.5zm-71.8%2048c1-9.8-.4-27.3-.5-33.1A477%20477%200%200%200%20299%20154c-1.2-8.4%203.4.9%202.8-4-1.5-8.3-6.1-14-11.6-21.5-1.7-2.5-1.7-3-4.4.6-3%206.7-.4%2011.4.4%2016.7%203.9%2017.2%206.2%2033%207.3%2048.7a393%20393%200%200%201%20.4%2049c3%20.1%207.6-4.7%209.3-11.8'/%3e%3cpath%20fill='%23fff'%20d='M434%20216c-6.9-11.6-17.2-24-20-28.7a658%20658%200%200%200-29.2-37.8c-8.5-9%204-1.5-1.6-8.5-4.7-5.1-6-6.8-10.1-9.9-2-1.3-3.2-3.8-4%20.5a83%2083%200%200%200-.2%2011.2c0%201.7%201.8%205%203.4%207%2020.7%2025.5%2043.4%2051.5%2061.6%2084.2%202.6-1.3%201.7-16%200-18z'/%3e%3cpath%20fill='%23165d31'%20d='M122.6%20194.7c-.5.9-1.6%202-1.2%203.1q1%201.4%202.6%201.3c1.1%200%202.7.3%203-.3q1-1.2.6-3.3c-1.2-3-4.4-1.8-5-.8'/%3e%3cpath%20fill='%23fff'%20d='M354.2%20362.5c9.2.4%2015.2.5%2023.3%201.4l9.6-1c10.6-1%2011%2015.1%2011%2015.1%200%209.5-3.7%2010-8.4%2011-2.7.4-4-1.6-5.5-3.6a14%2014%200%200%201-7%20.4l-11.5-.5c-4-.3-6.2.5-10.3.1-.8%201.3-2%203.1-4.4%202.6-2-.3-4.5-6-3.8-10.5%201.5-3.2%201-2.1%201-3.5-37.6-1-75.5-2.7-112.3-2.2-28.8.1-57.2%201.3-85.7%202.5-15.2-.2-26.8-2.6-34.8-14.3.8%200%2038.8%202.1%2049.9%201.4%2020.5-.2%2039.3-1.9%2060.2-2.5%2041.2.7%2082.1.7%20123.3%203.6-4-2.7-4-9%202-10.6.5-.4.8%203.1%201.7%203%204.9-.3%202.7%206.3%201.7%207.6M188.6%20135.3c-6.2%2017.8%203.6%2037.4%2010.4%2035.5%205%202%208-7.4%2010-17.6%201.5-2.9%202.5-3.2%203.2-1.7-.2%2013.6%201%2016.7%204.5%2020.8%207.8%206%2014.3.8%2014.8.3l6-6.1q2.2-2.2%205.1-.3c1.9%201.7%201.6%204.6%205.6%206.6%203.4%201.4%2010.5.4%2012.2-2.5%202.2-3.9%202.8-5.2%203.8-6.6%201.6-2.1%204.3-1.2%204.3-.5-.3%201.2-1.9%202.3-.8%204.5%202%201.4%202.4.5%203.5.2%204-2%207-10.6%207-10.6.1-3.2-1.7-3-2.9-2.2l-3.1%202.1c-2%20.3-5.7%201.6-7.6-1.3-1.9-3.4-1.9-8.3-3.3-11.8%200-.2-2.6-5.5-.2-5.8%201.2.2%203.7.9%204.1-1.2%201.2-2.1-2.6-8-5.3-11-2.3-2.5-5.5-2.8-8.6-.2-2.2%202-1.9%204.2-2.3%206.3a10%2010%200%200%200%202%208.7c2.2%204.2%206.1%209.7%204.8%2017.5%200%200-2.3%203.6-6.3%203.1-1.7-.3-4.4-1-5.8-11.8-1.1-8%20.2-19.4-3.2-24.7-1.3-3.3-2.2-6.4-5.2-.9-.8%202.2-4.3%205.5-1.8%2012.2a36%2036%200%200%201%202%2019c-1.5%202.2-1.8%202.9-3.7%205-2.6%203-5.5%202.2-7.7%201.1-2-1.3-3.6-2-4.6-6.5.2-7%20.6-18.5-.7-20.9-1.9-3.8-5-2.4-6.3-1.2a48%2048%200%200%200-11.5%2023.5c-1.8%205.8-3.7%204.1-5%201.8-3.2-3-3.5-26.7-7.4-22.8'/%3e%3cpath%20fill='%23fff'%20d='M207.4%20174.1c2.9-2%201.6-3.4%205.8.8a72%2072%200%200%201%209.2%2031.3c-.2%202.6%201.6%204.2%202.5%203.6.4-6%2015.1-14.4%2028.6-15.6%202-.5%201-4.4%201.3-6.4-.8-7.5%204.2-14.3%2011.2-14.8%209.6%201.4%2012.8%206.5%2013%2014.2-1.1%2015-16.7%2017.5-25.4%2018.7-1.3.5-1.9%201.1%200%201.8l36.6.2%201.9%201c.2%201-.6.2-2%202.6a30%2030%200%200%200-3.7%2011.5c-10.9%203.6-22.2%205-33.6%206.5-4%202-6%204.7-5.2%207.7%201.4%203.3%2010.2%206.7%2010.2%206.8%201.7%201%203.6%203.5-.5%208.6-17.8-.8-31.7-8.4-36.5-19.1-1.4-1.1-3%200-4%201.4-7%209-13.8%2017-25.7%2021.4-7%201.8-14.3-1.1-17.7-5.7-2.3-2.7-2.2-5.6-3-6.2-3.9%201.7-36.9%2015.7-32.7%209.1%208-8.5%2022-14.9%2034.2-23.3.9-2.9%202.5-12.5%207.3-15.6.3%200-.7%205.6-.6%208%200%202-.2%202.7.2%202.2.9-.5%2015.7-12.2%2017-15.8%201.4-2%20.3-7.2.3-7.4-2.8-7.2-6.7-7.8-8.1-11.4-1.3-4.7-.7-10.1%202-11.7q3.7-3.1%207.9.5c3%202.7%205.6%208%206.4%2011.9-.5%201.5-4-1-5-.3a16%2016%200%200%201%203.7%207.8c2%208.2%201.4%2011.4-.6%2016.7-6.6%2013.9-15%2018-22.4%2023.2-.2%200-.3%203.5%202.4%205.4%201%201%204.9%201.5%209.4%200a55%2055%200%200%200%2022.3-23.3%2051%2051%200%200%200-2.4-22.2c-2.9-6.7-6.3-16.2-6.3-16.4-.1-4.2.2-5.6%202-7.7m-95.8-38.6c4.2%202%2012.2%201.1%2011.8-5.7l-.2-3.1c-.8-2-3.2-1.5-3.7.5-.2.7.3%201.8-.3%202.1-.4.4-1.7.2-1.7-1.7q-.1-1-.7-1.6-.2-.2-.9-.2c-.6%200-.6.1-.9.6l-.3%201.6q-.1.9-.8%201c-.6%200-.5%200-1-.2q-.4-.3-.5-1l-.3-1.6q-.3-.4-1-.6c-2.3%200-2.5%202.7-2.3%203.7-.2.2-.3%204.9%202.8%206.2'/%3e%3cpath%20fill='%23fff'%20d='M235.1%20187.7c4.2%202%2014.3.9%2011.8-5.6l-.2-3.2c-.9-2-3.2-1.5-3.7.6-.2.6.3%201.7-.4%202-.3.4-1.7.2-1.6-1.6q-.1-1-.7-1.7-.3-.2-1-.2c-.5%200-.5.2-.8.7q-.3.7-.3%201.6-.2.8-.9%201c-.5%200-.4%200-.8-.3q-.5-.3-.6-.9l-.3-1.6q-.3-.5-1-.6c-2.3%200-2.5%202.6-2.4%203.6-.1.2-.2%205%203%206.2zm72-21.6c4.2%202%2012.1%201.1%2011.8-5.6l-.2-3.2c-.9-2-3.2-1.5-3.7.5-.2.7.3%201.8-.4%202.2-.3.3-1.7.1-1.6-1.8q-.1-1-.7-1.6-.3-.2-1-.2t-.8.7l-.3%201.5q-.1%201-.9%201c-.8%200-.4%200-.8-.2q-.5-.3-.6-.9%200-1-.3-1.7-.4-.4-1-.5c-2.3%200-2.5%202.6-2.4%203.6-.1.2-.2%204.9%203%206.2zm37.3%2054.3c-7.3%208.3-4.1%2022-2.4%2025%202.4%204.8%204.3%207.9%209%2010.3%204.3%203.1%207.7%201.2%209.5-1%204.3-4.5%204.4-16%206.4-18.2%201.4-4.2%205-3.5%206.7-1.6a17%2017%200%200%200%206.2%205.3c4%203.5%208.8%204.2%2013.6%201%203.2-1.9%205.3-4.2%207.2-8.9%202-5.6%201-31.6.5-47l-4.2-21.5c0-.2-.5-10.2-1-12.5%200-1-.3-1.3.7-1.2%201.1%201%201.2%201%202%201.3%201%20.2%202-1.7%201.3-3.3l-10-18.6c-.8-.8-1.9-1.6-3.2.2a7%207%200%200%200-2.4%205.5l1.3%2013.3%204%2022.6c1.3%2016%201.6%2029.2%202.9%2045.3-.2%206.8-2.3%2012.7-4.3%2013.6%200%200-3%201.7-5-.2-1.5-.6-7.4-9.9-7.4-9.9-3-2.7-5-2-7.1%200-6%205.8-8.6%2016.4-12.7%2023.8-1%201.7-4%203-7.2-.1-8.2-11.3-3.4-27.3-4.4-23.2M309%20126.7c3.8%201.5%206.4%209.2%205.6%2013-.8%204.5-2.8%209.5-4.2%208.9-1.6-.6%201-4.6-.5-8.8-.8-2.8-6-7.8-5.4-9.2-1-3.1%202.2-4.5%204.5-4z'/%3e%3cpath%20fill='%23fff'%20d='M356.6%20225c.7-9.2-.6-14.8-.8-20.2s-6.1-46.6-7.3-50.6c-1.5-7.8%205.7-1%204.9-5.6-2.5-5.6-8.6-13.9-10.5-18.8-1.2-2-.7-4-3.3-.5a42%2042%200%200%200-2.3%2019.2c6.2%2032.3%2012.5%2059.1%2011.5%2089.8%203%200%206.3-6.7%207.8-13.3m64.4-85.3c3.5%201.7%205.5%2011.3%205.1%2014-.7%205-2.5%2010.4-3.8%209.7-1.5-.6.3-7.4-.4-9.5-.8-3-5.5-8.4-5-10-1-3.4%202-4.8%204.1-4.2m-255.7%2067.9c3.3%201.3%205.3%208.3%205%2010.3-.8%203.7-2.5%207.7-3.8%207.1-1.3-.4.3-5.4-.3-7-.3-3.7-4.9-5.7-4.8-7.3-.8-3%202-3.5%204-3.1z'/%3e%3cpath%20fill='%23165d31'%20d='M244.9%20218.2c4.2.2%206.3%203.6%202.4%205-4%201.3-7.7%202.4-7.8%208%201.5%208-2%205.2-4%204.2-2.4-1.8-9.2-6-10.2-15-.1-2.1%201.6-4%204.3-4%204%201.1%2010%201.2%2015.3%201.8'/%3e%3cpath%20fill='%23fff'%20d='M77.4%20124.4c4.8%201.4%205.1%208.6%204.8%2010.7-.7%203.8-2.4%207.9-3.6%207.4-1.4-.5%200-5.7-.7-7.3-.7-2.2-4.8-6.4-4.4-7.6-.9-2.5%202-3.7%203.9-3.2m95.9%2033.6c-3.8%202-5.2%208-2.9%2011.6%202.2%203%205.6%201.9%206%201.9%203.7.4%205.9-6.9%205.9-6.9s.1-2-4.2%201.9c-1.9.3-2-.4-2.5-1.4a9%209%200%200%201%20.5-5.7c.7-1.8-.7-2.6-2.8-1.4m28-36.4c-2%201.3-5.7%205.2-5.8%209.6-.1%202.5-.6%202.5%201%204%201.3%201.8%202.4%201.7%204.8.4a5%205%200%200%200%202.3-3.4c.6-2.8-3%201.4-3.4-1.8-.8-3%201.5-4.2%203.7-7%200-2%200-3.3-2.7-1.8zm22.4%204a60%2060%200%200%200-1.6%2011.1c-.6%202.8%203%204%204.5.4%202.4-6.5%202.4-9.3%202.6-12-.7-4.3-3.6-4.2-5.5.5m142%2072.3c.4-.5%2020-14.4%2020-14.4%202-.7%201.5%207.2.6%207.1a78%2078%200%200%201-20.7%2014.3c-1%20.7-1.9-5.3%200-7zm17.7-.2c3.5%201.7%204.9%2011.8%204.5%2014.5%200%205.4-3.3%209.6-4.7%209-1.4-.7.2-6.7-.5-8.8-.8-3-3.7-8.5-3.2-10.1-1-3.4%201.8-5.2%204-4.6zm-116%2043.4a26%2026%200%200%201%205.6-4.9c2-1%203.8.8%203.7.7.3%202-1.2%203.7-.7%206.3.4%201%20.7%202.2%202.6%201.8%203.1-2.5%206-2.7%209-2.8%202.5.1%202.6%204.2%201%204.2-5.7%201.2-8.2%202.8-12.3%204.3-2%201.2-3.6-.3-3.6-.4s-1.1-1.1-.4-3.7q.3-3.2-2.4-3c-1.2.8-2.4%201.2-3-.3q-.6-1.4.5-2.2m136.6%205.4c.8%201%201.4%202-.1%203.8l-3.7%203.2c-.6%201-1%202.8%201%203.3%203.6%201%2012-4.5%2012-4.6%201.4-1%201-3%20.8-3-.8-.9-2.6-.3-3.8-.5-.6%200-2.5-.2-1.6-2a11%2011%200%200%200%201.6-2.9q.9-1.7-2-2.7c-2.1-.4-3-.2-5.3%200q-1.6.2-1.9%202.3c.1%202.3%201.5%202.2%203%203z'/%3e%3cpath%20fill='%23165d31'%20d='M268.1%20189.7c-.5%201-2.3%201-4%200s-2.7-2.6-2.1-3.5%202.3-.9%204%200%202.6%202.6%202.1%203.5m-89-53.6c-1%20.3-2.4-.6-3-2s-.3-2.6.7-2.9%202.3.7%203%202%20.3%202.7-.8%203zM355.2%20375c9.4.4%2018.2%200%2027.5.5%201.7%201.5.5%205-.6%204.8l-7.8-.3c-.1-3-7.7-2.5-7.5.1-4.1.5-7.8-.1-12-.3-1.2-1.5-1-4.2.4-4.8'/%3e%3c/g%3e%3c/svg%3e";
const flagJP = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20id='flag-icons-jp'%20viewBox='0%200%20640%20480'%3e%3cdefs%3e%3cclipPath%20id='jp-a'%3e%3cpath%20fill-opacity='.7'%20d='M-88%2032h640v480H-88z'/%3e%3c/clipPath%3e%3c/defs%3e%3cg%20fill-rule='evenodd'%20stroke-width='1pt'%20clip-path='url(%23jp-a)'%20transform='translate(88%20-32)'%3e%3cpath%20fill='%23fff'%20d='M-128%2032h720v480h-720z'/%3e%3ccircle%20cx='523.1'%20cy='344.1'%20r='194.9'%20fill='%23bc002d'%20transform='translate(-168.4%208.6)scale(.76554)'/%3e%3c/g%3e%3c/svg%3e";
const flagKR = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20id='flag-icons-kr'%20viewBox='0%200%20640%20480'%3e%3cdefs%3e%3cclipPath%20id='kr-a'%3e%3cpath%20fill-opacity='.7'%20d='M-95.8-.4h682.7v512H-95.8z'/%3e%3c/clipPath%3e%3c/defs%3e%3cg%20fill-rule='evenodd'%20clip-path='url(%23kr-a)'%20transform='translate(89.8%20.4)scale(.9375)'%3e%3cpath%20fill='%23fff'%20d='M-95.8-.4H587v512H-95.8Z'/%3e%3cg%20transform='rotate(-56.3%20361.6%20-101.3)scale(10.66667)'%3e%3cg%20id='kr-c'%3e%3cpath%20id='kr-b'%20fill='%23000001'%20d='M-6-26H6v2H-6Zm0%203H6v2H-6Zm0%203H6v2H-6Z'/%3e%3cuse%20xlink:href='%23kr-b'%20width='100%25'%20height='100%25'%20y='44'/%3e%3c/g%3e%3cpath%20stroke='%23fff'%20d='M0%2017v10'/%3e%3cpath%20fill='%23cd2e3a'%20d='M0-12a12%2012%200%200%201%200%2024Z'/%3e%3cpath%20fill='%230047a0'%20d='M0-12a12%2012%200%200%200%200%2024A6%206%200%200%200%200%200Z'/%3e%3ccircle%20cy='-6'%20r='6'%20fill='%23cd2e3a'/%3e%3c/g%3e%3cg%20transform='rotate(-123.7%20191.2%2062.2)scale(10.66667)'%3e%3cuse%20xlink:href='%23kr-c'%20width='100%25'%20height='100%25'/%3e%3cpath%20stroke='%23fff'%20d='M0-23.5v3M0%2017v3.5m0%203v3'/%3e%3c/g%3e%3c/g%3e%3c/svg%3e";
const flagFR = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20id='flag-icons-fr'%20viewBox='0%200%20640%20480'%3e%3cpath%20fill='%23fff'%20d='M0%200h640v480H0z'/%3e%3cpath%20fill='%23000091'%20d='M0%200h213.3v480H0z'/%3e%3cpath%20fill='%23e1000f'%20d='M426.7%200H640v480H426.7z'/%3e%3c/svg%3e";
const flagDE = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20id='flag-icons-de'%20viewBox='0%200%20640%20480'%3e%3cpath%20fill='%23fc0'%20d='M0%20320h640v160H0z'/%3e%3cpath%20fill='%23000001'%20d='M0%200h640v160H0z'/%3e%3cpath%20fill='red'%20d='M0%20160h640v160H0z'/%3e%3c/svg%3e";
const flagIN = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20id='flag-icons-in'%20viewBox='0%200%20640%20480'%3e%3cpath%20fill='%23f93'%20d='M0%200h640v160H0z'/%3e%3cpath%20fill='%23fff'%20d='M0%20160h640v160H0z'/%3e%3cpath%20fill='%23128807'%20d='M0%20320h640v160H0z'/%3e%3cg%20transform='matrix(3.2%200%200%203.2%20320%20240)'%3e%3ccircle%20r='20'%20fill='%23008'/%3e%3ccircle%20r='17.5'%20fill='%23fff'/%3e%3ccircle%20r='3.5'%20fill='%23008'/%3e%3cg%20id='in-d'%3e%3cg%20id='in-c'%3e%3cg%20id='in-b'%3e%3cg%20id='in-a'%20fill='%23008'%3e%3ccircle%20r='.9'%20transform='rotate(7.5%20-8.8%20133.5)'/%3e%3cpath%20d='M0%2017.5.6%207%200%202l-.6%205z'/%3e%3c/g%3e%3cuse%20xlink:href='%23in-a'%20width='100%25'%20height='100%25'%20transform='rotate(15)'/%3e%3c/g%3e%3cuse%20xlink:href='%23in-b'%20width='100%25'%20height='100%25'%20transform='rotate(30)'/%3e%3c/g%3e%3cuse%20xlink:href='%23in-c'%20width='100%25'%20height='100%25'%20transform='rotate(60)'/%3e%3c/g%3e%3cuse%20xlink:href='%23in-d'%20width='100%25'%20height='100%25'%20transform='rotate(120)'/%3e%3cuse%20xlink:href='%23in-d'%20width='100%25'%20height='100%25'%20transform='rotate(-120)'/%3e%3c/g%3e%3c/svg%3e";
const flagPT = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20id='flag-icons-pt'%20viewBox='0%200%20640%20480'%3e%3cpath%20fill='red'%20d='M256%200h384v480H256z'/%3e%3cpath%20fill='%23060'%20d='M0%200h256v480H0z'/%3e%3cg%20fill='%23ff0'%20fill-rule='evenodd'%20stroke='%23000'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='.6'%3e%3cpath%20d='M339.5%20306.2c-32.3-1-180-93.2-181-108l8.1-13.5c14.7%2021.3%20165.7%20111%20180.6%20107.8z'/%3e%3cpath%20d='M164.9%20182.8c-2.9%207.8%2038.6%2033.4%2088.4%2063.8s92.9%2049%2096%2046.4l1.5-2.8q-.9%201.6-4.3.6c-13.5-3.9-48.6-20-92.1-46.4-43.6-26.4-81.4-50.7-87.3-61a6%206%200%200%201-.6-3.1h-.2l-1.2%202.2zm175.3%20123.8q-.7%201.3-3.5.8c-12-1.3-48.6-19.1-91.9-45-50.4-30.2-92-57.6-87.4-64.8l1.2-2.2.2.1c-4%2012.2%2082.1%2061.4%2087.2%2064.6%2049.8%2030.8%2091.8%2048.9%2095.5%2044.2z'/%3e%3cpath%20d='M256.2%20207.2c32.2-.3%2072-4.4%2095-13.6l-5-8c-13.5%207.5-53.5%2012.5-90.3%2013.2-43.4-.4-74.1-4.5-89.5-14.8l-4.6%208.6c28.2%2012%2057.2%2014.5%2094.4%2014.6'/%3e%3cpath%20d='M352.5%20193.8c-.8%201.3-15.8%206.4-37.8%2010.2a381%20381%200%200%201-58.6%204.3%20416%20416%200%200%201-56.2-3.6c-23.1-3.6-35-8.6-39.5-10.4l1.1-2.2c12.7%205%2024.7%208%2038.7%2010.2A412%20412%200%200%200%20256%20206a392%20392%200%200%200%2058.3-4.3c22.5-3.7%2034.8-8.4%2036.6-10.5zm-4.4-8.1c-2.4%202-14.6%206.3-36%209.7a388%20388%200%200%201-55.8%204c-22%200-40.1-1.6-53.8-3.6-21.8-2.8-33.4-8-37.6-9.4l1.3-2.2c3.3%201.7%2014.4%206.2%2036.5%209.3a385%20385%200%200%200%2053.6%203.4%20384%20384%200%200%200%2055.4-4c21.5-3%2033.1-8.4%2034.9-9.8zM150.3%20246c19.8%2010.7%2063.9%2016%20105.6%2016.4%2038%20.1%2087.4-5.8%20105.9-15.6l-.5-10.7c-5.8%209-58.8%2017.7-105.8%2017.4s-90.7-7.6-105.3-17v9.5'/%3e%3cpath%20d='M362.8%20244.5v2.5c-2.8%203.4-20.2%208.4-42%2012a434%20434%200%200%201-65.4%204.4%20400%20400%200%200%201-62-4.3%20155%20155%200%200%201-44.4-12v-2.9c9.7%206.4%2035.9%2011.2%2044.7%2012.6%2015.8%202.4%2036.1%204.2%2061.7%204.2%2026.9%200%2048.4-1.9%2065-4.4%2015.7-2.3%2038-8.2%2042.4-12.1m0-9v2.5c-2.8%203.3-20.2%208.3-42%2011.9a434%20434%200%200%201-65.4%204.5%20414%20414%200%200%201-62-4.3%20155%20155%200%200%201-44.4-12v-3c9.7%206.5%2036%2011.2%2044.7%2012.6a408%20408%200%200%200%2061.7%204.3c26.9%200%2048.5-2%2065-4.5%2015.7-2.2%2038-8.1%2042.4-12m-107%2068.8c-45.6-.2-84.7-12.4-93-14.4l6%209.4a250%20250%200%200%200%2087.4%2014.3c34.7-1%2065-3.7%2086.3-14.1l6.2-9.8c-14.5%206.9-64%2014.6-93%2014.6'/%3e%3cpath%20d='m344.9%20297.3-2.8%204c-10%203.6-26%207.4-32.6%208.4a296%20296%200%200%201-53.7%205c-40.4-.6-73.5-8.5-89-15.3l-1.3-2.1.2-.4%202.1.9a287%20287%200%200%200%2088.2%2014.5c18.8%200%2037.5-2.1%2052.6-4.8%2023.2-4.7%2032.6-8.2%2035.5-9.8l.7-.4zm5.3-8.8-2%203.5c-5.4%202-20%206.2-41.3%209.2-14%201.9-22.7%203.8-50.6%204.3a347%20347%200%200%201-94.2-14L161%20289a390%20390%200%200%200%2095.4%2014c25.5-.5%2036.4-2.4%2050.3-4.3%2024.8-3.8%2037.3-8%2041-9.1v-.2l2.6-1z'/%3e%3cpath%20d='M350.8%20237.6c.1%2030-15.3%2057-27.6%2068.8a99%2099%200%200%201-67.8%2028.2c-30.3.5-58.8-19.2-66.5-27.9a101%20101%200%200%201-27.5-67.4c1.8-32.8%2014.7-55.6%2033.3-71.3a100%20100%200%200%201%2064.2-22.7%2098%2098%200%200%201%2071%2035.6c12.5%2015.2%2018%2031.7%2020.9%2056.7M255.6%20135a106%20106%200%200%201%20106%20105.2%20105.6%20105.6%200%201%201-211.4%200c-.1-58%2047.3-105.2%20105.4-105.2'/%3e%3cpath%20d='M255.9%20134.5c58.2%200%20105.6%2047.4%20105.6%20105.6S314.1%20345.7%20256%20345.7s-105.6-47.4-105.6-105.6S197.8%20134.5%20256%20134.5zM152.6%20240c0%2056.8%2046.7%20103.3%20103.3%20103.3S359.2%20296.8%20359.2%20240s-46.7-103.3-103.3-103.3S152.6%20183.2%20152.6%20240'/%3e%3cpath%20d='M256%20143.3a97%2097%200%200%201%2096.7%2096.7%2097%2097%200%200%201-96.7%2096.8c-53%200-96.7-43.6-96.7-96.8a97%2097%200%200%201%2096.7-96.7M161.6%20240c0%2052%2042.6%2094.4%2094.4%2094.4s94.4-42.5%2094.4-94.4-42.6-94.4-94.4-94.4a95%2095%200%200%200-94.4%2094.4'/%3e%3cpath%20d='M260.3%20134h-9.1v212.3h9z'/%3e%3cpath%20d='M259.3%20132.8h2.3v214.7h-2.2V132.8zm-9%200h2.4v214.7h-2.3z'/%3e%3cpath%20d='M361.6%20244.2v-7.8l-6.4-6-36.3-9.6-52.2-5.3-63%203.2-44.8%2010.6-9%206.7v7.9l22.9-10.3%2054.4-8.5h52.3l38.4%204.2%2026.6%206.4z'/%3e%3cpath%20d='M256%20223.8c24.9%200%2049%202.3%2068.3%206%2019.8%204%2033.7%209%2038.5%2014.5v2.8c-5.8-7-24.5-12-39-15-19-3.6-43-6-67.9-6-26.1%200-50.5%202.6-69.3%206.2-15%203-35.1%209-37.6%2014.8v-2.9c1.3-4%2016.3-10%2037.3-14.3%2018.9-3.7%2043.3-6.1%2069.6-6.1zm0-9.1a383%20383%200%200%201%2068.3%206c19.8%204%2033.7%209%2038.5%2014.6v2.7c-5.8-6.9-24.5-12-39-14.9-19-3.7-43-6-67.9-6a376%20376%200%200%200-69.2%206.2c-14.5%202.7-35.4%208.9-37.7%2014.7v-2.8c1.4-4%2016.6-10.3%2037.3-14.3%2019-3.7%2043.3-6.2%2069.7-6.2m-.6-46.2c39.3-.2%2073.6%205.5%2089.3%2013.5l5.7%2010c-13.6-7.4-50.6-15-94.9-14-36.1.3-74.7%204-94%2014.4l6.8-11.4c15.9-8.3%2053.3-12.5%2087.1-12.5'/%3e%3cpath%20d='M256%20176.7a354%20354%200%200%201%2061.3%204.3c16%203%2031.3%207.4%2033.5%209.8l1.7%203c-5.3-3.4-18.6-7.3-35.6-10.5s-38.7-4.3-61-4.2c-25.3-.1-45%201.2-61.8%204.2a109%20109%200%200%200-33.3%2010.3l1.7-3.1c6-3%2015.3-6.7%2031.1-9.6%2017.5-3.2%2037.4-4.1%2062.4-4.2m0-9c21.4-.2%2042.6%201%2059.1%204a96%2096%200%200%201%2030.6%2010l2.5%204c-4.2-4.7-20-9.2-34.1-11.6-16.4-2.9-36.7-4-58.1-4.2a361%20361%200%200%200-59.5%204.4%2097%2097%200%200%200-29.6%209.1l2.2-3.3c5.8-3%2015.2-5.8%2027-8.1a357%20357%200%200%201%2059.9-4.4zM308.4%20284a276%20276%200%200%200-52.5-4c-65.5.8-86.6%2013.5-89.2%2017.3l-5-8c16.8-12%2052.4-18.8%2094.6-18.2q32.9.5%2056.6%205l-4.5%208'/%3e%3cpath%20d='M255.6%20278.9c18.2.3%2036%201%2053.3%204.2l-1.2%202.2c-16-3-33.2-4-52-4-24.3-.2-48.7%202.1-70%208.2-6.7%201.9-17.8%206.2-19%209.8l-1.2-2c.4-2.2%207-6.6%2019.6-10%2024.4-7%2047.2-8.3%2070.5-8.4m.8-9.2a327%20327%200%200%201%2057.3%205l-1.3%202.3a299%20299%200%200%200-56-4.9c-24.2%200-49.9%201.8-73.3%208.6-7.5%202.2-20.6%207-21%2010.7l-1.2-2.2c.2-3.4%2011.5-7.9%2021.7-10.8%2023.5-6.9%2049.3-8.6%2073.8-8.7'/%3e%3cpath%20d='m349.4%20290.5-7.8%2012.3-22.7-20.1-58.6-39.5-66.2-36.3-34.3-11.7%207.3-13.6%202.5-1.3%2021.3%205.3%2070.4%2036.3%2040.6%2025.6L336%20272l13.9%2016z'/%3e%3cpath%20d='M158.6%20195.5c6-4%2050.2%2015.6%2096.6%2043.6%2046.1%2028%2090.3%2059.6%2086.3%2065.5l-1.3%202.1-.6.5c.1-.1.8-1%200-3.1-2-6.5-33.4-31.5-85.3-62.9-50.7-30.1-92.9-48.3-97-43.1zM351%20290.4c3.8-7.6-37.2-38.5-88.1-68.6-52-29.5-89.6-46.9-96.5-41.7L165%20183l.4-.5c1.2-1%203.3-1%204.2-1%2011.8.2%2045.5%2015.7%2092.8%2042.8%2020.8%2012%2087.6%2055%2087.3%2067%200%201%20.1%201.2-.3%201.8l1.7-2.6z'/%3e%3c/g%3e%3cg%20transform='translate(0%2026.7)scale(1.06667)'%3e%3cpath%20fill='%23fff'%20stroke='%23000'%20stroke-width='.7'%20d='M180.6%20211a59%2059%200%200%200%2017.5%2041.7%2059%2059%200%200%200%2041.8%2017.6%2059%2059%200%200%200%2042-17.4%2059%2059%200%200%200%2017.4-41.8v-79.2l-118.7-.2z'/%3e%3cpath%20fill='red'%20stroke='%23000'%20stroke-width='.5'%20d='M183%20211.1a56%2056%200%200%200%2016.8%2040%2057%2057%200%200%200%2040.2%2016.8%2057%2057%200%200%200%2040.2-16.6%2056%2056%200%200%200%2016.7-40v-77H183v76.8m91-53.7v48.9l-.1%205.1a33%2033%200%200%201-10%2024%2034%2034%200%200%201-24%2010c-9.4%200-17.7-4-23.9-10.2a34%2034%200%200%201-10-24v-54z'/%3e%3cg%20id='pt-e'%3e%3cg%20id='pt-d'%20fill='%23ff0'%20stroke='%23000'%20stroke-width='.5'%3e%3cpath%20stroke='none'%20d='M190.2%20154.4c.1-5.5%204-6.8%204-6.8.1%200%204.3%201.4%204.3%206.9z'/%3e%3cpath%20d='m186.8%20147.7-.7%206.3h4.2c0-5.2%204-6%204-6%20.1%200%204%201.1%204.1%206h4.2l-.8-6.4zm-1%206.4h17q.5%200%20.6.7%200%20.8-.6.8h-17q-.5%200-.6-.8%200-.7.7-.7z'/%3e%3cpath%20d='M192%20154c0-3.3%202.3-4.2%202.3-4.2s2.3%201%202.3%204.2H192m-5.8-9h16.3q.5.1.6.8%200%20.5-.6.6h-16.3q-.5%200-.6-.7%200-.5.6-.6zm.4%201.5H202q.5%200%20.6.7t-.6.7h-15.5q-.6%200-.6-.7t.6-.7zm5-10.6h1.2v.8h.9v-.8h1.3v.9h.9v-1h1.2v2q0%20.6-.5.6h-4.4q-.5%200-.6-.5zm4.6%202.7.3%206.4h-4.3l.3-6.5h3.7'/%3e%3cpath%20id='pt-a'%20d='M191%20141.6v3.4h-4v-3.4z'/%3e%3cuse%20xlink:href='%23pt-a'%20width='100%25'%20height='100%25'%20x='10.6'/%3e%3cpath%20id='pt-b'%20d='M186.3%20139h1.2v1h.9v-1h1.2v1h.9v-1h1.2v2q0%20.6-.5.6h-4.3l-.6-.6z'/%3e%3cuse%20xlink:href='%23pt-b'%20width='100%25'%20height='100%25'%20x='10.6'/%3e%3cpath%20fill='%23000001'%20stroke='none'%20d='M193.9%20140.6c0-.6.9-.6.9%200v1.6h-.9z'/%3e%3cpath%20id='pt-c'%20fill='%23000001'%20stroke='none'%20d='M188.6%20142.8c0-.6.8-.6.8%200v1.2h-.8z'/%3e%3cuse%20xlink:href='%23pt-c'%20width='100%25'%20height='100%25'%20x='10.6'/%3e%3c/g%3e%3cuse%20xlink:href='%23pt-d'%20width='100%25'%20height='100%25'%20y='46.3'/%3e%3cuse%20xlink:href='%23pt-d'%20width='100%25'%20height='100%25'%20transform='rotate(-45.2%20312.8%20180)'/%3e%3c/g%3e%3cuse%20xlink:href='%23pt-d'%20width='100%25'%20height='100%25'%20x='45.7'/%3e%3cuse%20xlink:href='%23pt-e'%20width='100%25'%20height='100%25'%20transform='matrix(-1%200%200%201%20479.8%200)'/%3e%3cg%20id='pt-f'%20fill='%23fff'%3e%3cpath%20fill='%23039'%20d='M232.6%20202.4a8%208%200%200%200%202.2%205.7%207%207%200%200%200%205.3%202.4q3.2-.2%205.3-2.4a8%208%200%200%200%202.2-5.7v-10.8h-15z'/%3e%3ccircle%20cx='236.1'%20cy='195.7'%20r='1.5'/%3e%3ccircle%20cx='244.4'%20cy='195.7'%20r='1.5'/%3e%3ccircle%20cx='240.2'%20cy='199.7'%20r='1.5'/%3e%3ccircle%20cx='236.1'%20cy='203.9'%20r='1.5'/%3e%3ccircle%20cx='244.4'%20cy='203.9'%20r='1.5'/%3e%3c/g%3e%3cuse%20xlink:href='%23pt-f'%20width='100%25'%20height='100%25'%20y='-26'/%3e%3cuse%20xlink:href='%23pt-f'%20width='100%25'%20height='100%25'%20x='-20.8'/%3e%3cuse%20xlink:href='%23pt-f'%20width='100%25'%20height='100%25'%20x='20.8'/%3e%3cuse%20xlink:href='%23pt-f'%20width='100%25'%20height='100%25'%20y='25.8'/%3e%3c/g%3e%3c/svg%3e";
const flagRU = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20id='flag-icons-ru'%20viewBox='0%200%20640%20480'%3e%3cpath%20fill='%23fff'%20d='M0%200h640v160H0z'/%3e%3cpath%20fill='%230039a6'%20d='M0%20160h640v160H0z'/%3e%3cpath%20fill='%23d52b1e'%20d='M0%20320h640v160H0z'/%3e%3c/svg%3e";
const flagES = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20id='flag-icons-es'%20viewBox='0%200%20640%20480'%3e%3cpath%20fill='%23AA151B'%20d='M0%200h640v480H0z'/%3e%3cpath%20fill='%23F1BF00'%20d='M0%20120h640v240H0z'/%3e%3cpath%20fill='%23ad1519'%20d='m127.3%20213.3-.8-.1-1-1-.7-.4-.6-.8s-.7-1.1-.4-2q.5-1.2%201.4-1.5l1.5-.5%201-.4%201.3-.3.5-.3%201-.2%201-.2%201.6.1h4.8c.4%200%201.2.3%201.4.4l2%20.7c.5.1%201.6.3%202.2.6q.8.5%201.1%201l.5%201v1.1l-.5.8-.6%201-.8.6s-.5.5-1%20.4-4.8-.8-7.6-.8-7.3.9-7.3.9'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-linejoin='round'%20stroke-width='.3'%20d='m127.3%20213.3-.8-.1-1-1-.7-.4-.6-.8s-.7-1.1-.4-2q.5-1.2%201.4-1.5l1.5-.5%201-.4%201.3-.3.5-.3%201-.2%201-.2%201.6.1h4.8c.4%200%201.2.3%201.4.4l2%20.7c.5.1%201.6.3%202.2.6q.8.5%201.1%201l.5%201v1.1l-.5.8-.6%201-.8.6s-.5.5-1%20.4-4.8-.8-7.6-.8-7.3.9-7.3.9z'/%3e%3cpath%20fill='%23c8b100'%20d='M133.3%20207q.1-2.1%201.3-2.3%201.3.1%201.4%202.4c0%201.3-.6%202.4-1.4%202.4s-1.3-1.1-1.3-2.5'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M133.3%20207q.1-2.1%201.3-2.3%201.3.1%201.4%202.4c0%201.3-.6%202.4-1.4%202.4s-1.3-1.1-1.3-2.5z'/%3e%3cpath%20fill='%23c8b100'%20d='M134%20207q0-2%20.7-2.1c.3%200%20.6%201%20.6%202.1q0%202-.6%202.2c-.4%200-.6-1-.6-2.2'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M134%20207q0-2%20.7-2.1c.3%200%20.6%201%20.6%202.1q0%202-.6%202.2c-.4%200-.6-1-.6-2.2z'/%3e%3cpath%20fill='%23c8b100'%20d='M133.8%20204.5q.1-.7.8-.8%201%200%201%20.8-.1.8-1%20.9c-.9.1-.8-.4-.8-.9'/%3e%3cpath%20fill='%23c8b100'%20d='M135.3%20204.2v.6h-1.4v-.6h.5V203h-.7v-.6h.7v-.5h.5v.5h.6v.6h-.6v1.2z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M135.3%20204.2v.6h-1.4v-.6h.5V203h-.7v-.6h.7v-.5h.5v.5h.6v.6h-.6v1.2h.4'/%3e%3cpath%20fill='%23c8b100'%20d='M135.9%20204.2v.6h-2.5v-.6h1V203h-.7v-.6h.7v-.5h.5v.5h.6v.6h-.6v1.2z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M135.9%20204.2v.6h-2.5v-.6h1V203h-.7v-.6h.7v-.5h.5v.5h.6v.6h-.6v1.2h1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M134.9%20203.7q.6.2.6.8-.1.8-.8.9-1%200-1-.9%200-.6.7-.8'/%3e%3cpath%20fill='%23c8b100'%20d='M134.7%20213.2H130v-1.1l-.3-1.2-.2-1.5c-1.3-1.7-2.5-2.8-2.9-2.5q.1-.5.5-.7c1.1-.7%203.5%201%205.2%203.6l.5.7h3.8l.4-.7c1.8-2.7%204.1-4.3%205.2-3.6q.4.2.5.7c-.4-.3-1.6.8-2.9%202.5l-.2%201.5-.2%201.2-.1%201.1z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M134.7%20213.2H130v-1.1l-.3-1.2-.2-1.5c-1.3-1.7-2.5-2.8-2.9-2.5q.1-.5.5-.7c1.1-.7%203.5%201%205.2%203.6l.5.7h3.8l.4-.7c1.8-2.7%204.1-4.3%205.2-3.6q.4.2.5.7c-.4-.3-1.6.8-2.9%202.5l-.2%201.5-.2%201.2-.1%201.1z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M126.8%20206.8c1-.5%203%201.1%204.6%203.6m11-3.6c-.8-.5-2.8%201.1-4.5%203.6'/%3e%3cpath%20fill='%23c8b100'%20d='m127.8%20215.3-.5-1a27%2027%200%200%201%2014.7%200l-.5.8-.3.8a23%2023%200%200%200-6.6-.8c-2.6%200-5.2.3-6.5.8z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m127.8%20215.3-.5-1a27%2027%200%200%201%2014.7%200l-.5.8-.3.8a23%2023%200%200%200-6.6-.8c-2.6%200-5.2.3-6.5.8l-.3-.6'/%3e%3cpath%20fill='%23c8b100'%20d='M134.6%20217.7c2.4%200%205-.4%205.9-.6q1-.3%201-.8%200-.3-.4-.4c-1.4-.5-4-.8-6.5-.8s-5%20.3-6.4.8q-.3%200-.4.3%200%20.6%201%20.9c1%20.2%203.5.6%205.8.6'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M134.6%20217.7c2.4%200%205-.4%205.9-.6q1-.3%201-.8%200-.3-.4-.4c-1.4-.5-4-.8-6.5-.8s-5%20.3-6.4.8q-.3%200-.4.3%200%20.6%201%20.9c1%20.2%203.5.6%205.8.6z'/%3e%3cpath%20fill='%23c8b100'%20d='m142.1%20213.2-.5-.5s-.6.3-1.3.2c-.6%200-.9-1-.9-1s-.7.7-1.3.7-1-.6-1-.6-.7.5-1.3.4-1.2-.8-1.2-.8-.6.8-1.2.8c-.6.1-1-.5-1-.5s-.4.6-1.1.7-1.4-.6-1.4-.6-.5.7-1%201c-.5%200-1.2-.4-1.2-.4l-.2.5-.3.1.2.5a27%2027%200%200%201%207.2-.9q4.5%200%207.4%201z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m142.1%20213.2-.5-.5s-.6.3-1.3.2c-.6%200-.9-1-.9-1s-.7.7-1.3.7-1-.6-1-.6-.7.5-1.3.4-1.2-.8-1.2-.8-.6.8-1.2.8c-.6.1-1-.5-1-.5s-.4.6-1.1.7-1.4-.6-1.4-.6-.5.7-1%201c-.5%200-1.2-.4-1.2-.4l-.2.5-.3.1.2.5a27%2027%200%200%201%207.2-.9q4.5%200%207.4%201z'/%3e%3cpath%20fill='%23c8b100'%20d='M134.7%20210.7h.2v.4q0%201%201%201a1%201%200%200%200%201-.7l.2-.3v.4q.3.8%201.1.8%201%200%201-1v-.1l.4-.4.2.5-.1.4a1%201%200%200%200%201%201q.6%200%20.9-.5l.2-.2v.3q0%20.5.4.7l1-.4.7-.7v.4s-.5.8-1%201q-.3.4-.8.3-.5%200-.7-.6-.3.3-.7.2-1%200-1.4-.8-.5.5-1.1.5a2%202%200%200%201-1.2-.6l-1%20.4a2%202%200%200%201-1.3-.6%201.6%201.6%200%200%201-2.4.2%202%202%200%200%201-1.2.6l-1.1-.5q-.4.8-1.4.8l-.7-.2q-.2.5-.7.6t-.9-.2l-1-1%20.1-.5.8.7q.8.5.9.4.4-.1.4-.7v-.3l.2.2q.3.5.9.5a1%201%200%200%200%201-1v-.9l.4.4v.1q.1%201%201%201t1.1-.9v-.3l.2.3q.3.6%201%20.7%201%200%201.1-1v-.3h.3'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M134.7%20210.7h.2v.4q0%201%201%201a1%201%200%200%200%201-.7l.2-.3v.4q.3.8%201.1.8%201%200%201-1v-.1l.4-.4.2.5-.1.4a1%201%200%200%200%201%201q.6%200%20.9-.5l.2-.2v.3q0%20.5.4.7l1-.4.7-.7v.4s-.5.8-1%201q-.3.4-.8.3-.5%200-.7-.6-.3.3-.7.2-1%200-1.4-.8-.5.5-1.1.5a2%202%200%200%201-1.2-.6l-1%20.4a2%202%200%200%201-1.3-.6%201.6%201.6%200%200%201-2.4.2%202%202%200%200%201-1.2.6l-1.1-.5q-.4.8-1.4.8l-.7-.2q-.2.5-.7.6t-.9-.2l-1-1%20.1-.5.8.7q.8.5.9.4.4-.1.4-.7v-.3l.2.2q.3.5.9.5a1%201%200%200%200%201-1v-.9l.4.4v.1q.1%201%201%201t1.1-.9v-.3l.2.3q.3.6%201%20.7%201%200%201.1-1v-.3h.3z'/%3e%3cpath%20fill='%23c8b100'%20d='M134.6%20213.3q-4.5%200-7.3%201l-.3-.2.1-.3a27%2027%200%200%201%207.5-1q4.6%200%207.6%201l.1.3-.3.2a27%2027%200%200%200-7.4-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-linejoin='round'%20stroke-width='.3'%20d='M134.6%20213.3q-4.5%200-7.3%201l-.3-.2.1-.3a27%2027%200%200%201%207.5-1q4.6%200%207.6%201l.1.3-.3.2a27%2027%200%200%200-7.4-1z'/%3e%3cpath%20fill='%23fff'%20d='M131.8%20214.4q0-.4.5-.4a.4.4%200%200%201%20.4.4q0%20.3-.4.4a.4.4%200%200%201-.5-.4'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M131.8%20214.4q0-.4.5-.4a.4.4%200%200%201%20.4.4q0%20.3-.4.4a.4.4%200%200%201-.5-.4z'/%3e%3cpath%20fill='%23ad1519'%20d='M134.7%20214.5h-1q-.2%200-.3-.3l.3-.3h2l.2.3-.3.3h-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M134.7%20214.5h-1q-.2%200-.3-.3l.3-.3h2l.2.3-.3.3h-1'/%3e%3cpath%20fill='%23058e6e'%20d='M130%20214.9h-.7q-.2%200-.3-.2l.2-.3.7-.1.7-.1q.3%200%20.4.2a.3.3%200%200%201-.3.4z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M130%20214.9h-.7q-.2%200-.3-.2l.2-.3.7-.1.7-.1q.3%200%20.4.2a.3.3%200%200%201-.3.4h-.7'/%3e%3cpath%20fill='%23ad1519'%20d='m127.3%20215.3.3-.4h.7l-.4.6z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m127.3%20215.3.3-.4h.7l-.4.6-.6-.2'/%3e%3cpath%20fill='%23fff'%20d='M136.6%20214.4q0-.4.4-.4a.4.4%200%200%201%20.5.4.4.4%200%200%201-.5.4.4.4%200%200%201-.4-.4'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M136.6%20214.4q0-.4.4-.4a.4.4%200%200%201%20.5.4.4.4%200%200%201-.5.4.4.4%200%200%201-.4-.4z'/%3e%3cpath%20fill='%23058e6e'%20d='M139.3%20214.9h.6a.3.3%200%200%200%20.4-.2l-.3-.3-.6-.1-.7-.1q-.3%200-.4.2%200%20.3.3.4z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M139.3%20214.9h.6a.3.3%200%200%200%20.4-.2l-.3-.3-.6-.1-.7-.1q-.3%200-.4.2%200%20.3.3.4h.7'/%3e%3cpath%20fill='%23ad1519'%20d='m142%20215.4-.3-.5h-.7l.3.6z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m142%20215.4-.3-.5h-.7l.3.6.6-.1'/%3e%3cpath%20fill='%23ad1519'%20d='M134.6%20217.1a25%2025%200%200%201-6-.6%2026%2026%200%200%201%2012.1%200q-2.5.6-6%20.6'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-linejoin='round'%20stroke-width='.3'%20d='M134.6%20217.1a25%2025%200%200%201-6-.6%2026%2026%200%200%201%2012.1%200q-2.5.6-6%20.6z'/%3e%3cpath%20fill='%23c8b100'%20d='m142%20212-.1-.3q-.3%200-.4.2%200%20.4.2.4z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m142%20212-.1-.3q-.3%200-.4.2%200%20.4.2.4z'/%3e%3cpath%20fill='%23c8b100'%20d='M137.3%20211.2q0-.3-.2-.4l-.2.3q0%20.3.2.4l.3-.3'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M137.3%20211.2q0-.3-.2-.4l-.2.3q0%20.3.2.4l.3-.3z'/%3e%3cpath%20fill='%23c8b100'%20d='m132%20211.2.1-.4q.3%200%20.3.3t-.2.4z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m132%20211.2.1-.4q.3%200%20.3.3t-.2.4z'/%3e%3cpath%20fill='%23c8b100'%20d='m127.3%20212%20.1-.3q.3%200%20.4.2%200%20.4-.2.4z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m127.3%20212%20.1-.3q.3%200%20.4.2%200%20.4-.2.4z'/%3e%3cpath%20fill='%23c8b100'%20d='m134.6%20208.5-.8.5.6%201.3.2.1.2-.1.7-1.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m134.6%20208.5-.8.5.6%201.3.2.1.2-.1.7-1.3-.9-.5'/%3e%3cpath%20fill='%23c8b100'%20d='m132.8%20210.5.4.5%201.3-.4.1-.2-.1-.2-1.3-.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m132.8%20210.5.4.5%201.3-.4.1-.2-.1-.2-1.3-.3-.4.6'/%3e%3cpath%20fill='%23c8b100'%20d='m136.4%20210.5-.3.5-1.3-.4-.2-.2.2-.2%201.3-.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m136.4%20210.5-.3.5-1.3-.4-.2-.2.2-.2%201.3-.3.3.6'/%3e%3cpath%20fill='%23c8b100'%20d='m129.3%20209-.7.7.9%201%20.2.1.1-.1.3-1.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m129.3%20209-.7.7.9%201%20.2.1.1-.1.3-1.3-.8-.3'/%3e%3cpath%20fill='%23c8b100'%20d='m128%20211.2.4.5%201.2-.6v-.2l-.1-.2-1.3-.1-.3.6'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m128%20211.2.4.5%201.2-.6v-.2l-.1-.2-1.3-.1-.3.6'/%3e%3cpath%20fill='%23c8b100'%20d='m131.5%20210.5-.3.6H130l-.2-.2.1-.3%201.2-.6z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m131.5%20210.5-.3.6H130l-.2-.2.1-.3%201.2-.6.5.5'/%3e%3cpath%20fill='%23c8b100'%20d='M126.6%20211.4v.6l-1.4.2-.2-.1v-.2l1-.9z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M126.6%20211.4v.6l-1.4.2-.2-.1v-.2l1-.9.6.4'/%3e%3cpath%20fill='%23c8b100'%20d='M129.2%20210.9q0-.5.5-.5t.5.5l-.5.4z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M129.2%20210.9q0-.5.5-.5t.5.5l-.5.4z'/%3e%3cpath%20fill='%23c8b100'%20d='m140%20209%20.7.7-.9%201-.2.1-.1-.1-.3-1.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m140%20209%20.7.7-.9%201-.2.1-.1-.1-.3-1.3.8-.3'/%3e%3cpath%20fill='%23c8b100'%20d='m141.4%20211.2-.5.5-1.2-.6v-.2l.1-.2%201.3-.1z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m141.4%20211.2-.5.5-1.2-.6v-.2l.1-.2%201.3-.1.3.6'/%3e%3cpath%20fill='%23c8b100'%20d='m137.8%20210.5.3.6h1.3l.2-.2-.1-.3-1.2-.6z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m137.8%20210.5.3.6h1.3l.2-.2-.1-.3-1.2-.6-.5.5'/%3e%3cpath%20fill='%23c8b100'%20d='m142.5%20211.4.1.6%201.3.2.2-.1v-.2l-1-.9z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m142.5%20211.4.1.6%201.3.2.2-.1v-.2l-1-.9-.6.4'/%3e%3cpath%20fill='%23c8b100'%20d='m134.2%20210.4.4-.4q.5%200%20.5.4l-.5.5z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m134.2%20210.4.4-.4q.5%200%20.5.4l-.5.5z'/%3e%3cpath%20fill='%23c8b100'%20d='M139.1%20210.9q.1-.5.5-.5l.5.5-.5.4z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M139.1%20210.9q.1-.5.5-.5l.5.5-.5.4z'/%3e%3cpath%20fill='%23c8b100'%20d='m124.8%20212.2-.6-.7c-.2-.2-.7-.3-.7-.3q0-.2.6-.3l.4.2v-.2s.3%200%20.4.3v1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m124.8%20212.2-.6-.7c-.2-.2-.7-.3-.7-.3q0-.2.6-.3l.4.2v-.2s.3%200%20.4.3v1z'/%3e%3cpath%20fill='%23c8b100'%20d='M124.8%20212q.3-.3.5%200t.2.5l-.5-.1q-.3-.2-.2-.5'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M124.8%20212q.3-.3.5%200t.2.5l-.5-.1q-.3-.2-.2-.5z'/%3e%3cpath%20fill='%23c8b100'%20d='m144.3%20212.2.6-.7.7-.3q0-.2-.6-.3l-.4.2v-.2s-.3%200-.4.3v.7z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m144.3%20212.2.6-.7.7-.3q0-.2-.6-.3l-.4.2v-.2s-.3%200-.4.3v.7z'/%3e%3cpath%20fill='%23c8b100'%20d='M144.3%20212q-.1-.3-.5%200-.3.2-.1.5l.5-.1q.3-.2.1-.5'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M144.3%20212q-.1-.3-.5%200-.3.2-.1.5l.5-.1q.3-.2.1-.5z'/%3e%3cpath%20fill='%23c8b100'%20d='M124%20223h21.4v-5.5H124z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M124%20223h21.4v-5.5H124z'/%3e%3cpath%20fill='%23c8b100'%20d='M126.2%20226.8h16.9a1.4%201.4%200%200%201-1-1.2q.1-1%201-1.3h-16.9q1%20.3%201%201.3a1.3%201.3%200%200%201-1%201.2'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-linejoin='round'%20stroke-width='.4'%20d='M126.2%20226.8h16.9a1.4%201.4%200%200%201-1-1.2q.1-1%201-1.3h-16.9q1%20.3%201%201.3a1.3%201.3%200%200%201-1%201.2z'/%3e%3cpath%20fill='%23c8b100'%20d='M126.6%20226.8h16q1%200%201%20.7t-1%20.8h-16q-.9-.1-1-.8%200-1%201-.8'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M126.6%20226.8h16q1%200%201%20.7t-1%20.8h-16q-.9-.1-1-.8%200-1%201-.8z'/%3e%3cpath%20fill='%23c8b100'%20d='M126.6%20223h16q1%20.1%201%20.7t-1%20.6h-16q-.9%200-1-.6.1-.5%201-.6'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M126.6%20223h16q1%20.1%201%20.7t-1%20.6h-16q-.9%200-1-.6.1-.5%201-.6z'/%3e%3cpath%20fill='%23005bbf'%20d='M149.6%20317.4q-2.2%200-3.7-.8a8%208%200%200%200-3.8-.8q-2.1%200-3.7.8a8%208%200%200%201-3.8.8q-2.3%200-3.7-.8a8%208%200%200%200-3.7-.8%208%208%200%200%200-3.7.8%208%208%200%200%201-3.8.8v2.4q2.3%200%203.8-.9a8%208%200%200%201%203.7-.8q2.2%200%203.7.8c1.5.8%202.2.9%203.7.9a8%208%200%200%200%203.8-.9q1.6-.8%203.7-.8%202.3%200%203.8.8c1.5.8%202.2.9%203.7.9z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M149.6%20317.4q-2.2%200-3.7-.8a8%208%200%200%200-3.8-.8q-2.1%200-3.7.8a8%208%200%200%201-3.8.8q-2.3%200-3.7-.8a8%208%200%200%200-3.7-.8%208%208%200%200%200-3.7.8%208%208%200%200%201-3.8.8v2.4q2.3%200%203.8-.9a8%208%200%200%201%203.7-.8q2.2%200%203.7.8c1.5.8%202.2.9%203.7.9a8%208%200%200%200%203.8-.9q1.6-.8%203.7-.8%202.3%200%203.8.8c1.5.8%202.2.9%203.7.9z'/%3e%3cpath%20fill='%23ccc'%20d='M149.6%20319.8a8%208%200%200%201-3.7-.9%208%208%200%200%200-3.8-.8q-2.1%200-3.7.8c-1.6.8-2.3.9-3.8.9s-2.8-.4-3.7-.9a8%208%200%200%200-3.7-.8%208%208%200%200%200-3.7.8q-1.5.8-3.8.9v2.3q2.3%200%203.8-.9a8%208%200%200%201%203.7-.7q2.2%200%203.7.7a8%208%200%200%200%207.5%200%209%209%200%200%201%207.5.1%208%208%200%200%200%203.7.8z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M149.6%20319.8a8%208%200%200%201-3.7-.9%208%208%200%200%200-3.8-.8q-2.1%200-3.7.8c-1.6.8-2.3.9-3.8.9s-2.8-.4-3.7-.9a8%208%200%200%200-3.7-.8%208%208%200%200%200-3.7.8q-1.5.8-3.8.9v2.3q2.3%200%203.8-.9a8%208%200%200%201%203.7-.7q2.2%200%203.7.7a8%208%200%200%200%207.5%200%209%209%200%200%201%207.5.1%208%208%200%200%200%203.7.8v-2.3'/%3e%3cpath%20fill='%23005bbf'%20d='M149.6%20322a7%207%200%200%201-3.7-.8%208%208%200%200%200-3.8-.7q-2.1%200-3.7.7-1.5.9-3.8.9c-2.3%200-2.8-.4-3.7-.9a8%208%200%200%200-3.7-.8%208%208%200%200%200-3.7.8q-1.5.8-3.8.9v2.3q2.3%200%203.8-.9a10%2010%200%200%201%207.4%200%207%207%200%200%200%203.7.9%208%208%200%200%200%203.8-.8q1.6-.8%203.7-.8%202.3%200%203.8.8c1.5.8%202.2.8%203.7.8z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M149.6%20322a7%207%200%200%201-3.7-.8%208%208%200%200%200-3.8-.7q-2.1%200-3.7.7-1.5.9-3.8.9c-2.3%200-2.8-.4-3.7-.9a8%208%200%200%200-3.7-.8%208%208%200%200%200-3.7.8q-1.5.8-3.8.9v2.3q2.3%200%203.8-.9a10%2010%200%200%201%207.4%200%207%207%200%200%200%203.7.9%208%208%200%200%200%203.8-.8q1.6-.8%203.7-.8%202.3%200%203.8.8c1.5.8%202.2.8%203.7.8V322'/%3e%3cpath%20fill='%23ccc'%20d='M149.6%20326.7a8%208%200%200%201-3.7-.8q-1.6-.8-3.7-.8a8%208%200%200%200-3.8.8q-1.5.8-3.8.8a7%207%200%200%201-3.7-.9%208%208%200%200%200-3.7-.7q-2.2%200-3.7.8c-1.5.8-2.3.8-3.8.8v-2.3a8%208%200%200%200%203.8-.9%2010%2010%200%200%201%207.4%200%208%208%200%200%200%203.7.9%208%208%200%200%200%203.8-.8q1.5-.8%203.8-.8t3.7.8c1.5.8%202.3.8%203.7.8z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M149.6%20326.7a8%208%200%200%201-3.7-.8q-1.6-.8-3.7-.8a8%208%200%200%200-3.8.8q-1.5.8-3.8.8a7%207%200%200%201-3.7-.9%208%208%200%200%200-3.7-.7q-2.2%200-3.7.8c-1.5.8-2.3.8-3.8.8v-2.3a8%208%200%200%200%203.8-.9%2010%2010%200%200%201%207.4%200%208%208%200%200%200%203.7.9%208%208%200%200%200%203.8-.8q1.5-.8%203.8-.8t3.7.8c1.5.8%202.3.8%203.7.8v2.3'/%3e%3cpath%20fill='%23005bbf'%20d='M149.6%20329a8%208%200%200%201-3.7-.8q-1.6-.8-3.7-.8a8%208%200%200%200-3.8.8q-1.5.8-3.8.8a7%207%200%200%201-3.7-.9%208%208%200%200%200-3.7-.7q-2.2%200-3.7.8c-1.5.8-2.3.8-3.8.8v-2.3a8%208%200%200%200%203.8-.8q1.5-.8%203.7-.8t3.7.7a8%208%200%200%200%207.5%200q1.5-.6%203.8-.7t3.7.8c1.5.8%202.2.8%203.7.8z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M149.6%20329a8%208%200%200%201-3.7-.8q-1.6-.8-3.7-.8a8%208%200%200%200-3.8.8q-1.5.8-3.8.8a7%207%200%200%201-3.7-.9%208%208%200%200%200-3.7-.7q-2.2%200-3.7.8c-1.5.8-2.3.8-3.8.8v-2.3a8%208%200%200%200%203.8-.8q1.5-.8%203.7-.8t3.7.7a8%208%200%200%200%207.5%200q1.5-.6%203.8-.7t3.7.8c1.5.8%202.2.8%203.7.8z'/%3e%3cpath%20fill='%23c8b100'%20d='m126.2%20308%20.2.5c0%201.5-1.3%202.6-2.7%202.6h22a3%203%200%200%201-2.7-2.6v-.5z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-linejoin='round'%20stroke-width='.4'%20d='m126.2%20308%20.2.5c0%201.5-1.3%202.6-2.7%202.6h22a3%203%200%200%201-2.7-2.6v-.5z'/%3e%3cpath%20fill='%23c8b100'%20d='M126.6%20306.5h16q1%200%201%20.8%200%20.6-1%20.7h-16q-.9%200-1-.8.1-.6%201-.7'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M126.6%20306.5h16q1%200%201%20.8%200%20.6-1%20.7h-16q-.9%200-1-.8.1-.6%201-.7z'/%3e%3cpath%20fill='%23c8b100'%20d='M123.7%20316.7h22V311h-22z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M123.7%20316.7h22V311h-22z'/%3e%3cpath%20fill='%23ad1519'%20d='M122%20286.7c-2.2%201.2-3.7%202.5-3.4%203.2q.2.8%201.8%201.6c1.5%201.1%202.5%203%201.7%204a5.5%205.5%200%200%200-.1-8.8'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M122%20286.7c-2.2%201.2-3.7%202.5-3.4%203.2q.2.8%201.8%201.6c1.5%201.1%202.5%203%201.7%204a5.5%205.5%200%200%200-.1-8.8z'/%3e%3cpath%20fill='%23ccc'%20d='M126.8%20305.6h15.6V229h-15.6v76.5z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M138%20229.2v76.3m1.7-76.3v76.3m-12.9%200h15.6v-76.4h-15.6v76.5z'/%3e%3cpath%20fill='%23ad1519'%20d='M158.4%20257.7a50%2050%200%200%200-23.3-2c-9.4%201.6-16.5%205.3-15.9%208.4v.2l-3.5-8.2c-.6-3.3%207.2-7.5%2017.6-9.2a43%2043%200%200%201%209.2-.7c6.6%200%2012.4.8%2015.8%202.1v9.4'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-linejoin='round'%20stroke-width='.4'%20d='M158.4%20257.7a50%2050%200%200%200-23.3-2c-9.4%201.6-16.5%205.3-15.9%208.4v.2l-3.5-8.2c-.6-3.3%207.2-7.5%2017.6-9.2a43%2043%200%200%201%209.2-.7c6.6%200%2012.4.8%2015.8%202.1v9.4'/%3e%3cpath%20fill='%23ad1519'%20d='M126.8%20267.3c-4.3-.3-7.3-1.4-7.6-3.2q-.3-2.2%203.8-4.5l3.8.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M126.8%20267.3c-4.3-.3-7.3-1.4-7.6-3.2q-.3-2.2%203.8-4.5l3.8.3v7.4'/%3e%3cpath%20fill='%23ad1519'%20d='M142.5%20261.5q4.1.6%205.7%201.9l.1.2c.5%201-1.9%203-5.9%205.4v-7.5'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M142.5%20261.5q4.1.6%205.7%201.9l.1.2c.5%201-1.9%203-5.9%205.4v-7.5'/%3e%3cpath%20fill='%23ad1519'%20d='M117.1%20282c-.4-1.2%203.8-3.6%209.8-5.8l7.8-3.2c8.3-3.7%2014.4-7.9%2013.6-9.4v-.2c.4.4%201%208%201%208%20.8%201.3-4.8%205.5-12.4%209.1-2.5%201.2-7.6%203-10%204-4.4%201.4-8.7%204.3-8.3%205.3l-1.5-7.7'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-linejoin='round'%20stroke-width='.4'%20d='M117.1%20282c-.4-1.2%203.8-3.6%209.8-5.8l7.8-3.2c8.3-3.7%2014.4-7.9%2013.6-9.4v-.2c.4.4%201%208%201%208%20.8%201.3-4.8%205.5-12.4%209.1-2.5%201.2-7.6%203-10%204-4.4%201.4-8.7%204.3-8.3%205.3l-1.5-7.7z'/%3e%3cpath%20fill='%23c8b100'%20d='M125.8%20254c1.9-.6%203.1-1.5%202.5-3q-.6-1.3-2.8-.6l-2.6%201%202.3%205.8.8-.3.8-.3zm-1.2-2.7.7-.3q1-.3%201.4.8.4.8-.5%201.5l-.6.3zm7.3-2.5-.9.3h-.8l1.3%206.1%204.3-.8-.2-.4v-.4l-2.5.6zm8.4%205.2q1.2-3.3%202.7-6.4h-1l-1.8%204.6-2.4-4.3-1%20.1h-1l3.5%206zm8.8-4.7.4-.9a3%203%200%200%200-1.7-.6q-2.6%200-2.8%201.7c-.2%202.1%203.2%202%203%203.4q-.2%201-1.4.8-1.3%200-1.4-1.2h-.3l-.4%201.1a4%204%200%200%200%201.8.6q2.7.2%203.2-1.7c.2-2-3.3-2.1-3.1-3.4q0-.8%201.3-.7%201%200%201.2.9z'/%3e%3cpath%20fill='%23ad1519'%20d='M277.9%20211.6s-.7.8-1.3.9c-.5%200-1.1-.5-1.1-.5s-.5.5-1%20.6-1.4-.6-1.4-.6l-1%201-1.1-.3c-.1-.1-.3.4-.7.6h-.4l-.6-.4-.7-.7-.5-.3-.4-1v-.5q0-1%202.2-1.7a4%204%200%200%201%202%200q.9-.8%203-.8c2.1%200%202.4.3%203%20.7a6%206%200%200%201%202.9-.7q2.1%200%203%20.8.8-.3%202%200%202.2.6%202.2%201.7v.5l-.4%201-.6.3-.6.7-.6.3s-.3.2-.4%200q-.6-.3-.7-.5c-.1-.2-.6.4-1%20.2s-1-1-1-1-.9.8-1.4.7c-.6-.1-1-.6-1-.6s-.7.6-1.2.5-1.2-.9-1.2-.9'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M277.9%20211.6s-.7.8-1.3.9c-.5%200-1.1-.5-1.1-.5s-.5.5-1%20.6-1.4-.6-1.4-.6l-1%201-1.1-.3c-.1-.1-.3.4-.7.6h-.4l-.6-.4-.7-.7-.5-.3-.4-1v-.5q0-1%202.2-1.7a4%204%200%200%201%202%200q.9-.8%203-.8c2.1%200%202.4.3%203%20.7a6%206%200%200%201%202.9-.7q2.1%200%203%20.8.8-.3%202%200%202.2.6%202.2%201.7v.5l-.4%201-.6.3-.6.7-.6.3s-.3.2-.4%200q-.6-.3-.7-.5c-.1-.2-.6.4-1%20.2s-1-1-1-1-.9.8-1.4.7c-.6-.1-1-.6-1-.6s-.7.6-1.2.5-1.2-.9-1.2-.9z'/%3e%3cpath%20fill='%23c8b100'%20d='M276.5%20207.6c0-1%20.6-2%201.3-2s1.3%201%201.3%202-.5%201.8-1.3%201.8q-1.2-.1-1.3-1.9'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M276.5%20207.6c0-1%20.6-2%201.3-2s1.3%201%201.3%202-.5%201.8-1.3%201.8q-1.2-.1-1.3-1.9z'/%3e%3cpath%20fill='%23c8b100'%20d='M277.3%20207.6q0-1.7.5-1.8.6.2.7%201.8c.1%201.6-.3%201.7-.6%201.7q-.6-.2-.6-1.8'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M277.3%20207.6q0-1.7.5-1.8.6.2.7%201.8c.1%201.6-.3%201.7-.6%201.7q-.6-.2-.6-1.8z'/%3e%3cpath%20fill='%23c8b100'%20d='m271%20215.3-.5-1a27%2027%200%200%201%2014.8%200l-.6.8-.3.8a23%2023%200%200%200-6.6-.8c-2.6%200-5.2.3-6.6.8z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m271%20215.3-.5-1a27%2027%200%200%201%2014.8%200l-.6.8-.3.8a23%2023%200%200%200-6.6-.8c-2.6%200-5.2.3-6.6.8l-.2-.6'/%3e%3cpath%20fill='%23c8b100'%20d='M277.8%20217.7c2.4%200%205-.4%205.9-.6q1-.3%201-.8%200-.3-.4-.4a24%2024%200%200%200-6.5-.8c-2.5%200-5%20.3-6.4.8q-.3%200-.4.3%200%20.6%201%20.9c1%20.2%203.5.6%205.8.6'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M277.8%20217.7c2.4%200%205-.4%205.9-.6q1-.3%201-.8%200-.3-.4-.4a24%2024%200%200%200-6.5-.8c-2.5%200-5%20.3-6.4.8q-.3%200-.4.3%200%20.6%201%20.9c1%20.2%203.5.6%205.8.6z'/%3e%3cpath%20fill='%23fff'%20d='M283.5%20208.4q0-.3.4-.4.5%200%20.5.4t-.5.4a.4.4%200%200%201-.4-.4'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.2'%20d='M283.5%20208.4q0-.3.4-.4.5%200%20.5.4t-.5.4a.4.4%200%200%201-.4-.4zm-.2-1.4a.4.4%200%200%201%20.4-.4q.4%200%20.4.4t-.4.4a.4.4%200%200%201-.4-.4zm-1.1-1q0-.3.4-.3t.4.4-.4.4a.4.4%200%200%201-.4-.5zm-1.4-.4q0-.3.4-.4.5%200%20.5.4t-.4.4q-.5-.1-.5-.4zm-1.4%200q0-.3.5-.3t.4.4q0%20.3-.4.4a.4.4%200%200%201-.5-.4z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-linecap='round'%20stroke-width='.3'%20d='m287.8%20211.2.2-1a2.7%202.7%200%200%200-2.7-2.8q-.8%200-1.3.3'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m283%20209.2.2-.8q-.2-1.8-2.5-2-1%200-1.6.4'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.2'%20d='M288.2%20210q0-.5.4-.5t.4.4-.4.4q-.5%200-.4-.4zm-.2-1.6q0-.3.4-.4a.4.4%200%200%201%20.5.4q0%20.3-.4.4-.5%200-.5-.4zm-1-1.1a.4.4%200%200%201%20.5-.4q.3%200%20.4.4a.4.4%200%200%201-.4.4.4.4%200%200%201-.5-.4zm-1.3-.7q0-.4.5-.4t.4.4q0%20.5-.4.5a.4.4%200%200%201-.5-.5zm-1.4.1q0-.3.5-.4.6%200%20.4.4t-.4.4q-.4-.1-.5-.4z'/%3e%3cpath%20fill='%23c8b100'%20d='m285.3%20213.2-.5-.5s-.6.3-1.3.2c-.6%200-.9-1-.9-1s-.7.7-1.3.7-1-.6-1-.6-.7.5-1.3.4-1.2-.8-1.2-.8-.6.8-1.2.8c-.6.1-1-.5-1-.5s-.3.6-1.1.7-1.4-.6-1.4-.6-.4.7-1%201c-.5%200-1.2-.4-1.2-.4l-.1.5-.3.1.1.5a27%2027%200%200%201%207.3-.9q4.3%200%207.3%201l.2-.6'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m285.3%20213.2-.5-.5s-.6.3-1.3.2c-.6%200-.9-1-.9-1s-.7.7-1.3.7-1-.6-1-.6-.7.5-1.3.4-1.2-.8-1.2-.8-.6.8-1.2.8c-.6.1-1-.5-1-.5s-.3.6-1.1.7-1.4-.6-1.4-.6-.4.7-1%201c-.5%200-1.2-.4-1.2-.4l-.1.5-.3.1.1.5a27%2027%200%200%201%207.3-.9q4.3%200%207.3%201l.2-.6z'/%3e%3cpath%20fill='%23fff'%20d='M271.3%20208.4q0-.3.4-.4.5%200%20.4.4a.4.4%200%200%201-.4.4.4.4%200%200%201-.4-.4'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.2'%20d='M271.3%20208.4q0-.3.4-.4.5%200%20.4.4a.4.4%200%200%201-.4.4.4.4%200%200%201-.4-.4zm.2-1.4q0-.4.4-.4t.5.4q0%20.5-.5.4a.4.4%200%200%201-.4-.4zm1-1q.1-.3.5-.3t.5.4q0%20.3-.5.4a.4.4%200%200%201-.4-.5zm1.4-.4q0-.3.5-.4.6%200%20.4.4t-.4.4q-.4-.1-.5-.4zm1.4%200q0-.3.5-.3.3%200%20.4.4%200%20.3-.4.4a.4.4%200%200%201-.5-.4z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-linecap='round'%20stroke-width='.3'%20d='m267.8%20211.2-.2-1a2.7%202.7%200%200%201%202.7-2.8q.8%200%201.4.3'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m272.7%20209.2-.3-.8c0-1%201.2-2%202.6-2a3%203%200%200%201%201.5.4'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.2'%20d='M266.6%20210q0-.5.4-.5t.4.4a.4.4%200%200%201-.4.4q-.3%200-.4-.4zm.1-1.6q.1-.3.5-.4.5%200%20.4.4t-.4.4q-.4-.1-.4-.4zm1-1.1q0-.4.5-.4a.4.4%200%200%201%20.4.4.4.4%200%200%201-.4.4.4.4%200%200%201-.5-.4zm1.3-.7q0-.4.5-.4.3%200%20.4.4%200%20.5-.4.5a.4.4%200%200%201-.5-.5zm1.4.1q0-.3.5-.4a.4.4%200%200%201%20.4.4.4.4%200%200%201-.4.4q-.5%200-.5-.4z'/%3e%3cpath%20fill='%23c8b100'%20d='M277.9%20210.7h.2v.4q.1%201%201%201a1%201%200%200%200%201-.7l.2-.3v.4q.3.8%201.1.8%201%200%201-1v-.1l.4-.4.2.5-.1.4a1%201%200%200%200%201%201q.6%200%20.9-.5l.2-.2v.3q0%20.5.4.7l1-.4c1-.5.7-.7.7-.7v.4s-.5.8-1%201q-.3.4-.8.3-.5%200-.7-.6l-.7.2q-1%200-1.4-.8l-1.1.5q-.8%200-1.2-.6l-1%20.4q-.9%200-1.4-.6-.4.6-1.2.6-.6%200-1-.4a2%202%200%200%201-1.3.6q-.6%200-1.1-.5-.4.8-1.4.8-.4%200-.7-.2-.2.5-.7.6t-.9-.2l-1-1%20.1-.5.8.7q.8.5.9.4.4-.1.4-.7v-.3l.2.2q.3.5.9.5a1%201%200%200%200%201-1v-.9l.4.4v.1q.1%201%201%201t1.1-.9v-.3l.2.3q.4.6%201%20.7%201%200%201.1-1v-.3h.2'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M277.9%20210.7h.2v.4q.1%201%201%201a1%201%200%200%200%201-.7l.2-.3v.4q.3.8%201.1.8%201%200%201-1v-.1l.4-.4.2.5-.1.4a1%201%200%200%200%201%201q.6%200%20.9-.5l.2-.2v.3q0%20.5.4.7l1-.4c1-.5.7-.7.7-.7v.4s-.5.8-1%201q-.3.4-.8.3-.5%200-.7-.6l-.7.2q-1%200-1.4-.8l-1.1.5q-.8%200-1.2-.6l-1%20.4q-.9%200-1.4-.6-.4.6-1.2.6-.6%200-1-.4a2%202%200%200%201-1.3.6q-.6%200-1.1-.5-.4.8-1.4.8-.4%200-.7-.2-.2.5-.7.6t-.9-.2l-1-1%20.1-.5.8.7q.8.5.9.4.4-.1.4-.7v-.3l.2.2q.3.5.9.5a1%201%200%200%200%201-1v-.9l.4.4v.1q.1%201%201%201t1.1-.9v-.3l.2.3q.4.6%201%20.7%201%200%201.1-1v-.3h.2z'/%3e%3cpath%20fill='%23c8b100'%20d='M277.8%20213.3q-4.5%200-7.3%201l-.3-.2.1-.3q3-1%207.5-1t7.6%201l.1.3-.3.2a27%2027%200%200%200-7.4-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M277.8%20213.3q-4.5%200-7.3%201l-.3-.2.1-.3q3-1%207.5-1t7.6%201l.1.3-.3.2a27%2027%200%200%200-7.4-1z'/%3e%3cpath%20fill='%23fff'%20d='M275%20214.4q0-.4.5-.4a.4.4%200%200%201%20.4.4.4.4%200%200%201-.4.4q-.5%200-.5-.4'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M275%20214.4q0-.4.5-.4a.4.4%200%200%201%20.4.4.4.4%200%200%201-.4.4q-.5%200-.5-.4z'/%3e%3cpath%20fill='%23ad1519'%20d='M277.9%20214.5h-1q-.2%200-.3-.3l.3-.3h2l.2.3-.3.3h-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M277.9%20214.5h-1q-.2%200-.3-.3l.3-.3h2l.2.3-.3.3h-1'/%3e%3cpath%20fill='%23058e6e'%20d='M273.2%20214.9h-.6a.3.3%200%200%201-.4-.2l.3-.3.6-.1.7-.1q.3%200%20.4.2a.3.3%200%200%201-.3.4z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M273.2%20214.9h-.6a.3.3%200%200%201-.4-.2l.3-.3.6-.1.7-.1q.3%200%20.4.2a.3.3%200%200%201-.3.4h-.7'/%3e%3cpath%20fill='%23ad1519'%20d='m270.5%20215.3.3-.4h.7l-.4.6z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m270.5%20215.3.3-.4h.7l-.4.6-.6-.2'/%3e%3cpath%20fill='%23fff'%20d='M279.8%20214.4q0-.4.4-.4t.5.4q0%20.3-.5.4a.4.4%200%200%201-.4-.4'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M279.8%20214.4q0-.4.4-.4t.5.4q0%20.3-.5.4a.4.4%200%200%201-.4-.4z'/%3e%3cpath%20fill='%23058e6e'%20d='M282.5%20214.9h.7l.3-.2-.2-.3-.7-.1-.7-.1q-.3%200-.4.2%200%20.3.3.4z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M282.5%20214.9h.7l.3-.2-.2-.3-.7-.1-.7-.1q-.3%200-.4.2%200%20.3.3.4h.7'/%3e%3cpath%20fill='%23ad1519'%20d='m285.1%20215.4-.2-.5h-.7l.3.6z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m285.1%20215.4-.2-.5h-.7l.3.6.6-.1'/%3e%3cpath%20fill='%23ad1519'%20d='M277.8%20217.1a25%2025%200%200%201-6-.6%2025%2025%200%200%201%206-.7q3.6%200%206.1.7-2.5.6-6%20.6'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-linejoin='round'%20stroke-width='.3'%20d='M277.8%20217.1a25%2025%200%200%201-6-.6%2025%2025%200%200%201%206-.7q3.6%200%206.1.7-2.5.6-6%20.6z'/%3e%3cpath%20fill='%23c8b100'%20d='m285.2%20212-.1-.3q-.3%200-.4.2l.1.4q.3%200%20.4-.3'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m285.2%20212-.1-.3q-.3%200-.4.2l.1.4q.3%200%20.4-.3z'/%3e%3cpath%20fill='%23c8b100'%20d='M280.6%20211.2q0-.3-.3-.4l-.2.3q0%20.3.2.4z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M280.6%20211.2q0-.3-.3-.4l-.2.3q0%20.3.2.4z'/%3e%3cpath%20fill='%23c8b100'%20d='M275.2%20211.2q0-.3.2-.4l.3.3-.2.4q-.3%200-.3-.3'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M275.2%20211.2q0-.3.2-.4l.3.3-.2.4q-.3%200-.3-.3z'/%3e%3cpath%20fill='%23c8b100'%20d='m270.5%20212%20.1-.3q.3%200%20.4.2l-.1.4q-.3%200-.4-.3'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m270.5%20212%20.1-.3q.3%200%20.4.2l-.1.4q-.3%200-.4-.3z'/%3e%3cpath%20fill='%23c8b100'%20d='m277.8%20208.5-.8.5.6%201.3.2.1.3-.1.6-1.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m277.8%20208.5-.8.5.6%201.3.2.1.3-.1.6-1.3-.9-.5'/%3e%3cpath%20fill='%23c8b100'%20d='m276%20210.5.4.5%201.3-.4.1-.2-.1-.2-1.3-.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m276%20210.5.4.5%201.3-.4.1-.2-.1-.2-1.3-.3-.4.6'/%3e%3cpath%20fill='%23c8b100'%20d='m279.6%20210.5-.3.5-1.3-.4-.1-.2v-.2l1.4-.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m279.6%20210.5-.3.5-1.3-.4-.1-.2v-.2l1.4-.3.4.6'/%3e%3cpath%20fill='%23c8b100'%20d='m272.5%20209-.7.7.9%201%20.2.1.2-.1.2-1.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m272.5%20209-.7.7.9%201%20.2.1.2-.1.2-1.3-.8-.3'/%3e%3cpath%20fill='%23c8b100'%20d='m271.1%20211.2.5.5%201.2-.6v-.2l-.1-.2-1.3-.1z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m271.1%20211.2.5.5%201.2-.6v-.2l-.1-.2-1.3-.1-.3.6'/%3e%3cpath%20fill='%23c8b100'%20d='m274.7%20210.5-.3.6h-1.3l-.2-.2.1-.3%201.2-.6z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m274.7%20210.5-.3.6h-1.3l-.2-.2.1-.3%201.2-.6.5.5'/%3e%3cpath%20fill='%23c8b100'%20d='M269.8%20211.4v.6l-1.4.2-.2-.1v-.2l1-.9z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M269.8%20211.4v.6l-1.4.2-.2-.1v-.2l1-.9.6.4'/%3e%3cpath%20fill='%23c8b100'%20d='M272.4%20210.9q0-.5.5-.5l.5.5-.5.4z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M272.4%20210.9q0-.5.5-.5l.5.5-.5.4z'/%3e%3cpath%20fill='%23c8b100'%20d='m283.2%20209%20.7.7-.9%201-.2.1-.1-.1-.3-1.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m283.2%20209%20.7.7-.9%201-.2.1-.1-.1-.3-1.3.8-.3'/%3e%3cpath%20fill='%23c8b100'%20d='m284.6%20211.2-.5.5-1.2-.6v-.2l.1-.2%201.3-.1z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m284.6%20211.2-.5.5-1.2-.6v-.2l.1-.2%201.3-.1.3.6'/%3e%3cpath%20fill='%23c8b100'%20d='m281%20210.5.3.6h1.3l.2-.2-.1-.3-1.2-.6z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m281%20210.5.3.6h1.3l.2-.2-.1-.3-1.2-.6-.5.5'/%3e%3cpath%20fill='%23c8b100'%20d='M285.7%20211.4v.6l1.4.2.2-.1v-.2l-1-.9z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M285.7%20211.4v.6l1.4.2.2-.1v-.2l-1-.9-.6.4'/%3e%3cpath%20fill='%23c8b100'%20d='M277.4%20210.4q0-.3.5-.4.4%200%20.4.4t-.4.5z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M277.4%20210.4q0-.3.5-.4.4%200%20.4.4t-.4.5z'/%3e%3cpath%20fill='%23c8b100'%20d='M282.3%20210.9q.1-.5.5-.5t.5.5q0%20.6-.5.4z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M282.3%20210.9q.1-.5.5-.5t.5.5q0%20.6-.5.4z'/%3e%3cpath%20fill='%23c8b100'%20d='M277%20205.4q.1-.8.8-.8%201%200%201%20.8c0%20.8-.5.8-1%20.8a1%201%200%200%201-.8-.8'/%3e%3cpath%20fill='%23c8b100'%20d='M278.5%20205.1v.6H277v-.6h.4v-1.3h-.5v-.5h.5v-.6h.6v.6h.6v.6h-.6v1.2h.4'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M278.5%20205.1v.6H277v-.6h.4v-1.3h-.5v-.5h.5v-.6h.6v.6h.6v.6h-.6v1.2h.4z'/%3e%3cpath%20fill='%23c8b100'%20d='M279%20205.1v.6h-2.4v-.6h1v-1.3h-.7v-.5h.6v-.6h.6v.6h.6v.6h-.6v1.2h1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M278.1%20204.6q.6.1.6.8t-.9.8a1%201%200%200%201-.8-.8q0-.6.6-.8'/%3e%3cpath%20fill='%23c8b100'%20d='m268%20212.2-.6-.7-.7-.3q0-.2.6-.3.3%200%20.4.2v-.2s.3%200%20.4.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m268%20212.2-.6-.7-.7-.3q0-.2.6-.3.3%200%20.4.2v-.2s.3%200%20.4.3z'/%3e%3cpath%20fill='%23c8b100'%20d='M268%20212q.3-.3.5%200%20.4.2.1.5l-.5-.1q-.2-.2%200-.5'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M268%20212q.3-.3.5%200%20.4.2.1.5l-.5-.1q-.2-.2%200-.5z'/%3e%3cpath%20fill='%23c8b100'%20d='m287.5%20212.2.6-.7c.2-.2.7-.3.7-.3q0-.2-.6-.3l-.4.2v-.2s-.3%200-.4.3v.7z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m287.5%20212.2.6-.7c.2-.2.7-.3.7-.3q0-.2-.6-.3l-.4.2v-.2s-.3%200-.4.3v.7z'/%3e%3cpath%20fill='%23c8b100'%20d='M287.5%20212q-.2-.3-.5%200t-.1.5l.5-.1q.3-.2.1-.5'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M287.5%20212q-.2-.3-.5%200t-.1.5l.5-.1q.3-.2.1-.5z'/%3e%3cpath%20fill='%23c8b100'%20d='M267.2%20223h21.4v-5.5h-21.4z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M267.2%20223h21.4v-5.5h-21.4z'/%3e%3cpath%20fill='%23c8b100'%20d='M286.3%20226.8h-16.9q1-.4%201-1.2%200-1-1-1.3h17-.1q-1%20.3-1%201.3%200%20.8%201%201.2'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-linejoin='round'%20stroke-width='.4'%20d='M286.3%20226.8h-16.9q1-.4%201-1.2%200-1-1-1.3h17-.1q-1%20.3-1%201.3%200%20.8%201%201.2z'/%3e%3cpath%20fill='%23c8b100'%20d='M269.9%20226.8h16q1%200%201%20.7t-1%20.8h-16q-1-.1-1-.8.1-1%201-.8'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M269.9%20226.8h16q1%200%201%20.7t-1%20.8h-16q-1-.1-1-.8.1-1%201-.8z'/%3e%3cpath%20fill='%23c8b100'%20d='M269.9%20223h16q1%20.1%201%20.7t-1%20.6h-16q-1%200-1-.6t1-.6'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M269.9%20223h16q1%20.1%201%20.7t-1%20.6h-16q-1%200-1-.6t1-.6z'/%3e%3cpath%20fill='%23005bbf'%20d='M263%20317.4q2.1%200%203.7-.8a8%208%200%200%201%203.7-.8q2.2%200%203.8.8c1.6.8%202.3.8%203.7.8q2.3%200%203.8-.8a8%208%200%200%201%203.6-.8%208%208%200%200%201%203.7.8q1.6.8%203.8.8v2.4a8%208%200%200%201-3.8-.9%208%208%200%200%200-3.7-.8q-2.2%200-3.6.8-1.5.8-3.8.9a8%208%200%200%201-3.7-.9%208%208%200%200%200-3.8-.8%208%208%200%200%200-3.7.8q-1.5.8-3.8.9v-2.4'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M263%20317.4q2.1%200%203.7-.8a8%208%200%200%201%203.7-.8q2.2%200%203.8.8c1.6.8%202.3.8%203.7.8q2.3%200%203.8-.8a8%208%200%200%201%203.6-.8%208%208%200%200%201%203.7.8q1.6.8%203.8.8v2.4a8%208%200%200%201-3.8-.9%208%208%200%200%200-3.7-.8q-2.2%200-3.6.8-1.5.8-3.8.9a8%208%200%200%201-3.7-.9%208%208%200%200%200-3.8-.8%208%208%200%200%200-3.7.8q-1.5.8-3.8.9v-2.4z'/%3e%3cpath%20fill='%23ccc'%20d='M263%20319.8q2.1%200%203.7-.9c1.6-.9%202.3-.8%203.7-.8q2.2%200%203.8.8c1.6.8%202.3.9%203.7.9a8%208%200%200%200%203.8-.9%208%208%200%200%201%203.6-.8q2.3%200%203.7.8%201.6.8%203.8.9v2.3a8%208%200%200%201-3.8-.9%208%208%200%200%200-3.7-.7q-2.2%200-3.6.7-1.5.8-3.8.9a7%207%200%200%201-3.7-.9q-1.5-.6-3.8-.7a8%208%200%200%200-3.7.7%208%208%200%200%201-3.8.9v-2.3'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M263%20319.8q2.1%200%203.7-.9c1.6-.9%202.3-.8%203.7-.8q2.2%200%203.8.8c1.6.8%202.3.9%203.7.9a8%208%200%200%200%203.8-.9%208%208%200%200%201%203.6-.8q2.3%200%203.7.8%201.6.8%203.8.9v2.3a8%208%200%200%201-3.8-.9%208%208%200%200%200-3.7-.7q-2.2%200-3.6.7-1.5.8-3.8.9a7%207%200%200%201-3.7-.9q-1.5-.6-3.8-.7a8%208%200%200%200-3.7.7%208%208%200%200%201-3.8.9v-2.3'/%3e%3cpath%20fill='%23005bbf'%20d='M263%20322q2.1%200%203.7-.8%201.6-.6%203.7-.7%202.2%200%203.8.7c1.6.7%202.3.9%203.7.9a8%208%200%200%200%203.8-.9%208%208%200%200%201%203.6-.8%208%208%200%200%201%203.7.8q1.6.8%203.8.9v2.3a8%208%200%200%201-3.8-.9%208%208%200%200%200-3.7-.7q-2.2%200-3.6.7-1.5.9-3.8.9t-3.7-.8a8%208%200%200%200-3.8-.8%208%208%200%200%200-3.7.8q-1.5.8-3.8.8V322'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M263%20322q2.1%200%203.7-.8%201.6-.6%203.7-.7%202.2%200%203.8.7c1.6.7%202.3.9%203.7.9a8%208%200%200%200%203.8-.9%208%208%200%200%201%203.6-.8%208%208%200%200%201%203.7.8q1.6.8%203.8.9v2.3a8%208%200%200%201-3.8-.9%208%208%200%200%200-3.7-.7q-2.2%200-3.6.7-1.5.9-3.8.9t-3.7-.8a8%208%200%200%200-3.8-.8%208%208%200%200%200-3.7.8q-1.5.8-3.8.8V322'/%3e%3cpath%20fill='%23ccc'%20d='M263%20326.7a8%208%200%200%200%203.7-.8q1.6-.8%203.7-.8%202.2%200%203.8.8c1.6.8%202.3.8%203.7.8q2.3%200%203.8-.9a8%208%200%200%201%203.6-.7q2.3%200%203.7.8a8%208%200%200%200%203.8.8v-2.3a8%208%200%200%201-3.8-.9%208%208%200%200%200-3.7-.7q-2.2%200-3.6.7-1.5.8-3.8.9t-3.7-.8a8%208%200%200%200-3.8-.8%208%208%200%200%200-3.7.8q-1.5.8-3.8.8v2.3'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M263%20326.7a8%208%200%200%200%203.7-.8q1.6-.8%203.7-.8%202.2%200%203.8.8c1.6.8%202.3.8%203.7.8q2.3%200%203.8-.9a8%208%200%200%201%203.6-.7q2.3%200%203.7.8a8%208%200%200%200%203.8.8v-2.3a8%208%200%200%201-3.8-.9%208%208%200%200%200-3.7-.7q-2.2%200-3.6.7-1.5.8-3.8.9t-3.7-.8a8%208%200%200%200-3.8-.8%208%208%200%200%200-3.7.8q-1.5.8-3.8.8v2.3'/%3e%3cpath%20fill='%23005bbf'%20d='M263%20329a8%208%200%200%200%203.7-.8q1.6-.8%203.7-.8%202.2%200%203.8.8c1.6.8%202.3.8%203.7.8a8%208%200%200%200%203.8-.9%208%208%200%200%201%203.6-.7q2.3%200%203.7.8%201.6.8%203.8.8v-2.3a8%208%200%200%201-3.8-.8%208%208%200%200%200-3.7-.8%208%208%200%200%200-3.6.7%208%208%200%200%201-3.8.9q-2.2%200-3.7-.8t-3.8-.8q-2.1%200-3.7.8c-1.6.8-2.3.8-3.8.8v2.3'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M263%20329a8%208%200%200%200%203.7-.8q1.6-.8%203.7-.8%202.2%200%203.8.8c1.6.8%202.3.8%203.7.8a8%208%200%200%200%203.8-.9%208%208%200%200%201%203.6-.7q2.3%200%203.7.8%201.6.8%203.8.8v-2.3a8%208%200%200%201-3.8-.8%208%208%200%200%200-3.7-.8%208%208%200%200%200-3.6.7%208%208%200%200%201-3.8.9q-2.2%200-3.7-.8t-3.8-.8q-2.1%200-3.7.8c-1.6.8-2.3.8-3.8.8v2.3z'/%3e%3cpath%20fill='%23c8b100'%20d='m286.3%20308-.1.5c0%201.5%201.2%202.6%202.7%202.6h-22c1.5%200%202.7-1.2%202.7-2.6l-.1-.5z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-linejoin='round'%20stroke-width='.4'%20d='m286.3%20308-.1.5c0%201.5%201.2%202.6%202.7%202.6h-22c1.5%200%202.7-1.2%202.7-2.6l-.1-.5z'/%3e%3cpath%20fill='%23c8b100'%20d='M269.9%20306.5h16q1%200%201%20.8%200%20.6-1%20.7h-16q-1%200-1-.8.1-.6%201-.7'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M269.9%20306.5h16q1%200%201%20.8%200%20.6-1%20.7h-16q-1%200-1-.8.1-.6%201-.7z'/%3e%3cpath%20fill='%23c8b100'%20d='M266.9%20316.7h22V311h-22z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M266.9%20316.7h22V311h-22z'/%3e%3cpath%20fill='%23ad1519'%20d='M290.6%20286.7c2.1%201.2%203.6%202.5%203.4%203.2q-.2.8-1.8%201.6c-1.6%201.1-2.5%203-1.8%204a5.5%205.5%200%200%201%20.2-8.8'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M290.6%20286.7c2.1%201.2%203.6%202.5%203.4%203.2q-.2.8-1.8%201.6c-1.6%201.1-2.5%203-1.8%204a5.5%205.5%200%200%201%20.2-8.8z'/%3e%3cpath%20fill='%23ccc'%20d='M270.1%20305.6h15.6V229h-15.6v76.5z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M281.4%20229.1v76.3m1.8-76.3v76.3m-13%20.2h15.5V229h-15.6v76.5z'/%3e%3cpath%20fill='%23ad1519'%20d='M254.2%20257.7a50%2050%200%200%201%2023.3-2c9.3%201.6%2016.4%205.3%2015.9%208.4v.2l3.5-8.2c.6-3.3-7.3-7.5-17.6-9.2a54%2054%200%200%200-9.2-.7c-6.7%200-12.4.8-15.9%202.1z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-linejoin='round'%20stroke-width='.4'%20d='M254.2%20257.7a50%2050%200%200%201%2023.3-2c9.3%201.6%2016.4%205.3%2015.9%208.4v.2l3.5-8.2c.6-3.3-7.3-7.5-17.6-9.2a54%2054%200%200%200-9.2-.7c-6.7%200-12.4.8-15.9%202.1v9.4'/%3e%3cpath%20fill='%23ad1519'%20d='M285.7%20267.3c4.4-.3%207.3-1.4%207.7-3.2q.2-2.2-3.8-4.5l-3.9.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M285.7%20267.3c4.4-.3%207.3-1.4%207.7-3.2q.2-2.2-3.8-4.5l-3.9.3v7.4'/%3e%3cpath%20fill='%23ad1519'%20d='M270%20261.5a13%2013%200%200%200-5.7%201.9v.2c-.5%201%201.8%203%205.8%205.4v-7.5'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M270%20261.5a13%2013%200%200%200-5.7%201.9v.2c-.5%201%201.8%203%205.8%205.4v-7.5'/%3e%3cpath%20fill='%23ad1519'%20d='M295.4%20282c.4-1.2-3.8-3.6-9.7-5.8-2.8-1-5-2-7.8-3.2-8.3-3.7-14.4-7.9-13.6-9.4v-.2c-.4.4-1%208-1%208-.8%201.3%204.8%205.5%2012.4%209.1%202.4%201.2%207.6%203%2010%204%204.3%201.4%208.7%204.3%208.3%205.3l1.4-7.7'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-linejoin='round'%20stroke-width='.4'%20d='M295.4%20282c.4-1.2-3.8-3.6-9.7-5.8-2.8-1-5-2-7.8-3.2-8.3-3.7-14.4-7.9-13.6-9.4v-.2c-.4.4-1%208-1%208-.8%201.3%204.8%205.5%2012.4%209.1%202.4%201.2%207.6%203%2010%204%204.3%201.4%208.7%204.3%208.3%205.3l1.4-7.7z'/%3e%3cpath%20fill='%23c8b100'%20d='m263.9%20254.4%202.1-6.6h-.5l-.5.1-1.4%204.8q-1.6-2-2.7-4.1l-1%20.2h-1l4%205.7h.5zm6-6.6h-1.8v6.2h4.2v-.7h-2.6zm6.8%201%202%20.3v-.7l-5.8-.5v.8h2l-.4%205.6h1.6l.5-5.4m2.4%206%20.8.2.8.2.7-2.9.6%201.2.8%202.1%201%20.2q.6%200%201%20.3l-.3-.7-1.3-2.9q1.6%200%202.1-1.2.3-.8-.7-1.5-.8-.4-1.7-.5l-2.4-.5zm3-5.2c.7.2%201.5.3%201.5%201v.5q-.5%201.3-2%20.9zm8%207-.2%202%20.8.5.9.5.5-7-.7-.3-6.1%203.8.5.3.4.2%201.7-1.2%202.3%201.3zm-1.7-1.5%202-1.4-.2%202.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.1'%20d='M182.2%20192.4c0-1%201-2%202-2s2.2%201%202.2%202c0%201.1-1%202-2.1%202a2%202%200%200%201-2.1-2z'/%3e%3cpath%20fill='%23ad1519'%20stroke='%23000'%20stroke-width='.3'%20d='M205.7%20175.4c6.3%200%2012%201%2015.7%202.4a32%2032%200%200%200%2014.6%202.3c2.7%200%206.5.8%2010.3%202.4a27%2027%200%200%201%207.4%204.7l-1.5%201.4-.4%203.8-4.1%204.7-2%201.8-5%203.9-2.5.2-.7%202.1-31.6-3.7-31.7%203.7-.8-2.1-2.5-.2-4.9-4-2-1.7-4.1-4.7-.5-3.8-1.5-1.4a28%2028%200%200%201%207.5-4.7%2026%2026%200%200%201%2010.2-2.4q3%20.3%206.6-.2a30%2030%200%200%200%208-2q5.6-2.4%2015.5-2.5z'/%3e%3cpath%20fill='%23c8b100'%20stroke='%23000'%20stroke-width='.4'%20d='M206.2%20217.1c-11.8%200-22.4-1.4-29.9-3.6a1%201%200%200%201-.8-1.2q0-.8.8-1.2a109%20109%200%200%201%2029.9-3.6c11.7%200%2022.3%201.4%2029.8%203.6a1.3%201.3%200%200%201%200%202.4c-7.5%202.2-18%203.6-29.8%203.6'/%3e%3cpath%20fill='%23ad1519'%20d='M206.1%20215.6c-10.6%200-20.2-1.2-27.5-3.1%207.3-2%2016.9-3%2027.5-3.1a115%20115%200%200%201%2027.6%203c-7.3%202-17%203.2-27.6%203.2'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.1'%20d='M206.9%20215.7v-6.3m-1.7%206.3v-6.3'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.2'%20d='M203.6%20215.7v-6.3m-1.6%206.3v-6.3'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M200.6%20215.7v-6.3m-2.8%205.9v-5.7m1.3%205.8v-6m-3.8%205.6v-5.2m1.3%205.4v-5.6'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M192%20214.8V210m1%204.7V210m1.2%205v-5m-3.4%204.7v-4.5'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.5'%20d='M189.7%20214.5v-4.2m-1.2%204.1v-4'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.6'%20d='M186%20214v-3m1.3%203.2v-3.5m-2.5%203.1V211'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.7'%20d='M183.7%20213.6v-2.3m-1.3%202v-1.8m-1.2%201.6v-1.3'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.9'%20d='M179.8%20212.8v-.7'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.1'%20d='M213.7%20215.3v-5.8m-2.9%206v-6.1m-2.1%206.2v-6.3'/%3e%3cpath%20fill='%23c8b100'%20stroke='%23000'%20stroke-width='.4'%20d='M206%20207.4a108%20108%200%200%200-30%203.9c.6-.3.5-1-.3-3-1-2.5-2.4-2.4-2.4-2.4%208.3-2.5%2020-4%2032.8-4a123%20123%200%200%201%2033%204s-1.5-.1-2.5%202.3q-1.2%202.8-.2%203c-7.5-2.2-18.4-3.7-30.3-3.7'/%3e%3cpath%20fill='%23c8b100'%20stroke='%23000'%20stroke-width='.4'%20d='M206.1%20201.9c-12.9%200-24.5%201.5-32.8%204a1%201%200%200%201-1.3-.6%201%201%200%200%201%20.7-1.3%20121%20121%200%200%201%2033.4-4.2c13.2%200%2025.2%201.7%2033.5%204.2q1%20.4.7%201.3t-1.3.6c-8.4-2.5-20-4-32.9-4'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-linejoin='round'%20stroke-width='.4'%20d='M206.1%20215.6c-10.6%200-20.2-1.2-27.5-3.1%207.3-2%2016.9-3%2027.5-3.1a115%20115%200%200%201%2027.6%203c-7.3%202-17%203.2-27.6%203.2z'/%3e%3cpath%20fill='%23fff'%20stroke='%23000'%20stroke-width='.4'%20d='M197%20204.8q0-.9%201-1%20.9.1%201%201%200%201.2-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='%23ad1519'%20stroke='%23000'%20stroke-width='.4'%20d='M206.1%20205.6H203a1%201%200%200%201%200-2h6.4q.9.1%201%201%200%201.2-1%201h-3.2'/%3e%3cpath%20fill='%23058e6e'%20stroke='%23000'%20stroke-width='.4'%20d='m190.3%20206.5-2.3.2q-.9%200-1.2-.8a1%201%200%200%201%201-1.1l2.2-.3%202.4-.3q.9%200%201.1.9%200%20.9-.9%201l-2.3.4'/%3e%3cpath%20fill='%23fff'%20stroke='%23000'%20stroke-width='.4'%20d='M181%20206.7q.1-1%201.1-1t1%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='%23ad1519'%20stroke='%23000'%20stroke-width='.4'%20d='m174%20208.5%201.2-1.6%203.3.4-2.6%202-1.8-.8'/%3e%3cpath%20fill='%23058e6e'%20stroke='%23000'%20stroke-width='.4'%20d='m222%20206.5%202.3.2q.9%200%201.1-.8a1%201%200%200%200-.9-1.1l-2.2-.3-2.4-.3a1%201%200%200%200-1.1.9q0%20.9.9%201l2.3.4'/%3e%3cpath%20fill='%23fff'%20stroke='%23000'%20stroke-width='.4'%20d='M213.3%20204.8q0-.9%201-1c1-.1%201%20.5%201%201s-.4%201-1%201a1%201%200%200%201-1-1m15.8%201.9q.1-1%201-1t1.1%201q0%20.9-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='%23ad1519'%20stroke='%23000'%20stroke-width='.4'%20d='m238.2%20208.5-1.1-1.6-3.3.4%202.6%202%201.8-.8'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M177.3%20212.8c7.4-2.1%2017.6-3.4%2028.8-3.4%2011.3%200%2021.4%201.3%2028.9%203.4'/%3e%3cpath%20fill='%23c8b100'%20d='m182.3%20183.8%201.4%201%202-3.2a7%207%200%200%201-3.6-7.2c.2-4.1%205.2-7.6%2011.7-7.6q5%20.1%208.5%202.4l.2-1.8a17%2017%200%200%200-8.7-2.1c-7.4%200-13.2%204.1-13.5%209.1a9%209%200%200%200%203%207.6z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='m182.3%20183.8%201.4%201%202-3.2a7%207%200%200%201-3.6-7.2c.2-4.1%205.2-7.6%2011.7-7.6q5%20.1%208.5%202.4l.2-1.8a17%2017%200%200%200-8.7-2.1c-7.4%200-13.2%204.1-13.5%209.1a9%209%200%200%200%203%207.6l-1%201.8'/%3e%3cpath%20fill='%23c8b100'%20d='M182.4%20183.8a9%209%200%200%201-4-7.3q.2-5%205.3-8a9%209%200%200%200-3.4%206.8%209%209%200%200%200%203%206.7z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M182.4%20183.8a9%209%200%200%201-4-7.3q.2-5%205.3-8a9%209%200%200%200-3.4%206.8%209%209%200%200%200%203%206.7l-.9%201.8'/%3e%3cpath%20fill='%23c8b100'%20d='M160.1%20187.1a9%209%200%200%201-2.3-5.9q0-2%201-3.8c2-4.2%208.4-7.2%2016-7.2q3%200%205.9.6l-1%201.4a26%2026%200%200%200-4.9-.4c-7%200-12.8%202.7-14.5%206.3a7%207%200%200%200-.7%203.1%207%207%200%200%200%202.7%205.6l-2.6%204.1-1.3-1z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M160.1%20187.1a9%209%200%200%201-2.3-5.9q0-2%201-3.8c2-4.2%208.4-7.2%2016-7.2q3%200%205.9.6l-1%201.4a26%2026%200%200%200-4.9-.4c-7%200-12.8%202.7-14.5%206.3a7%207%200%200%200-.7%203.1%207%207%200%200%200%202.7%205.6l-2.6%204.1-1.3-1z'/%3e%3cpath%20fill='%23c8b100'%20d='M162.7%20173.3a11%2011%200%200%200-4%204.1%209%209%200%200%200-.9%203.8q.1%203.5%202.3%205.9l-1.5%202.5a10%2010%200%200%201-2.3-6.5c0-4%202.5-7.5%206.4-9.8'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M162.7%20173.3a11%2011%200%200%200-4%204.1%209%209%200%200%200-.9%203.8q.1%203.5%202.3%205.9l-1.5%202.5a10%2010%200%200%201-2.3-6.5c0-4%202.5-7.5%206.4-9.8z'/%3e%3cpath%20fill='%23c8b100'%20d='M206%20164.4c1.7%200%203.2%201.1%203.5%202.6q.4%202.1.4%204.5v1.1c.1%203.3.6%206.3%201.3%208.1l-5.2%205-5.2-5c.7-1.8%201.2-4.8%201.3-8.1v-1.1q0-2.4.4-4.5c.3-1.5%201.8-2.6%203.5-2.6'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M206%20164.4c1.7%200%203.2%201.1%203.5%202.6q.4%202.1.4%204.5v1.1c.1%203.3.6%206.3%201.3%208.1l-5.2%205-5.2-5c.7-1.8%201.2-4.8%201.3-8.1v-1.1q0-2.4.4-4.5c.3-1.5%201.8-2.6%203.5-2.6z'/%3e%3cpath%20fill='%23c8b100'%20d='M206%20166q1.6.1%201.8%201.4.3%201.8.4%204.2v1q.2%205%201.2%207.7l-3.4%203.2-3.4-3.2q1-2.7%201.2-7.7v-1l.4-4.2a2%202%200%200%201%201.8-1.4'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M206%20166q1.6.1%201.8%201.4.3%201.8.4%204.2v1q.2%205%201.2%207.7l-3.4%203.2-3.4-3.2q1-2.7%201.2-7.7v-1l.4-4.2a2%202%200%200%201%201.8-1.4z'/%3e%3cpath%20fill='%23c8b100'%20d='m229.7%20183.8-1.3%201-2-3.2a7%207%200%200%200%203.6-6.3v-.9c-.2-4.1-5.3-7.6-11.7-7.6a15%2015%200%200%200-8.5%202.4l-.2-1.8a17%2017%200%200%201%208.7-2.1c7.4%200%2013.2%204.1%2013.4%209.1a9%209%200%200%201-3%207.6z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='m229.7%20183.8-1.3%201-2-3.2a7%207%200%200%200%203.6-6.3v-.9c-.2-4.1-5.3-7.6-11.7-7.6a15%2015%200%200%200-8.5%202.4l-.2-1.8a17%2017%200%200%201%208.7-2.1c7.4%200%2013.2%204.1%2013.4%209.1a9%209%200%200%201-3%207.6l1%201.8'/%3e%3cpath%20fill='%23c8b100'%20d='M229.6%20183.8a9%209%200%200%200%204.1-7.3c0-3.2-2.1-6.1-5.3-8a9%209%200%200%201%203.4%206.8%209%209%200%200%201-3.2%206.7z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M229.6%20183.8a9%209%200%200%200%204.1-7.3c0-3.2-2.1-6.1-5.3-8a9%209%200%200%201%203.4%206.8%209%209%200%200%201-3.2%206.7l1%201.8'/%3e%3cpath%20fill='%23c8b100'%20d='M252%20187.1a9%209%200%200%200%202.2-5.9%209%209%200%200%200-.9-3.8c-2-4.2-8.4-7.2-16-7.2a29%2029%200%200%200-6%20.6l1%201.4a25%2025%200%200%201%205-.4c7%200%2012.8%202.7%2014.4%206.3q.7%201.5.7%203.1a7%207%200%200%201-2.6%205.6l2.5%204.1%201.3-1z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M252%20187.1a9%209%200%200%200%202.2-5.9%209%209%200%200%200-.9-3.8c-2-4.2-8.4-7.2-16-7.2a29%2029%200%200%200-6%20.6l1%201.4a25%2025%200%200%201%205-.4c7%200%2012.8%202.7%2014.4%206.3q.7%201.5.7%203.1a7%207%200%200%201-2.6%205.6l2.5%204.1%201.3-1z'/%3e%3cpath%20fill='%23c8b100'%20d='M249.3%20173.3a11%2011%200%200%201%204%204.1%209%209%200%200%201%20.9%203.8%209%209%200%200%201-2.3%205.9l1.6%202.5a10%2010%200%200%200%202.3-6.5c0-4-2.6-7.5-6.5-9.8'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M249.3%20173.3a11%2011%200%200%201%204%204.1%209%209%200%200%201%20.9%203.8%209%209%200%200%201-2.3%205.9l1.6%202.5a10%2010%200%200%200%202.3-6.5c0-4-2.6-7.5-6.5-9.8z'/%3e%3cpath%20fill='%23fff'%20d='M204.2%20181.4q.1-1.7%201.8-1.8c1.7-.1%201.9.8%201.9%201.8s-.9%201.7-1.9%201.7a2%202%200%200%201-1.8-1.7'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M204.2%20181.4q.1-1.7%201.8-1.8c1.7-.1%201.9.8%201.9%201.8s-.9%201.7-1.9%201.7a2%202%200%200%201-1.8-1.7z'/%3e%3cpath%20fill='%23fff'%20stroke='%23000'%20stroke-width='.4'%20d='M204.2%20178q.1-1.7%201.8-1.8c1.7-.1%201.9.8%201.9%201.8s-.9%201.7-1.9%201.7a2%202%200%200%201-1.8-1.7m.4-3.7q.1-1.2%201.4-1.3%201.4.1%201.5%201.3-.1%201.3-1.5%201.4c-1.4.1-1.4-.6-1.4-1.4m.4-3.3q0-.9%201-1c1-.1%201%20.5%201%201s-.4%201-1%201a1%201%200%200%201-1-1m.2-2.8q.1-.8.8-.8t.9.8q0%20.7-.9.8a1%201%200%200%201-.8-.8'/%3e%3cpath%20fill='%23c8b100'%20stroke='%23000'%20stroke-width='.4'%20d='m206.2%20191.8%201.2.2a4.6%204.6%200%200%200%204.5%206%205%205%200%200%200%204.4-3c.1%200%20.5-1.7.7-1.7s.1%201.8.2%201.7c.3%202.3%202.4%203.8%204.7%203.8a4.6%204.6%200%200%200%204.7-5l1.5-1.5.7%202a4%204%200%200%200-.4%201.9%204.4%204.4%200%200%200%204.5%204.2q2.5%200%203.8-1.9l.9-1.2v1.5c0%201.5.6%202.8%202%203%200%200%201.7.1%204-1.6%202.1-1.7%203.3-3.1%203.3-3.1l.2%201.7s-1.8%202.8-3.8%204c-1%20.6-2.7%201.3-4%201q-2.1-.5-3-2.6a7%207%200%200%201-3.3%201%207%207%200%200%201-6.1-3.7%207%207%200%200%201-10.4-.3%207%207%200%200%201-4.6%201.8%207%207%200%200%201-5.7-3%207%207%200%200%201-5.7%203%207%207%200%200%201-4.7-1.8%207%207%200%200%201-10.4.3%207%207%200%200%201-6%203.7%207%207%200%200%201-3.4-1q-.8%202.1-3%202.7c-1.2.2-2.9-.5-4-1.1-2-1.2-3.8-4-3.8-4l.2-1.7s1.2%201.4%203.4%203.1%203.9%201.6%203.9%201.6c1.4-.2%202-1.5%202-3v-1.5l1%201.2a5%205%200%200%200%203.7%202c2.5%200%204.5-2%204.5-4.3a4%204%200%200%200-.4-2l.8-1.9%201.5%201.5v.6c0%202.4%202%204.4%204.6%204.4%202.4%200%204.4-1.5%204.7-3.8%200%200%200-1.6.2-1.7s.6%201.7.7%201.6a5%205%200%200%200%204.5%203.1%204.6%204.6%200%200%200%204.5-6l1.2-.2'/%3e%3cpath%20fill='%23fff'%20stroke='%23000'%20stroke-width='.4'%20d='M238.6%20197.7q.4-1.4-.6-1.8-.9-.2-1.5%201.1-.4%201.4.6%201.8.9.2%201.5-1.1m-20.5-4c0-.8-.3-1.6-1-1.6q-.8%200-1.2%201.4%200%201.3.9%201.6%201-.1%201.3-1.4m-23.9%200c0-.8.4-1.6%201-1.6q1%200%201.2%201.4%200%201.3-.9%201.6-1-.1-1.2-1.4m-20.6%204q-.3-1.4.6-1.8%201-.2%201.5%201.1t-.5%201.8q-1%20.2-1.6-1.1'/%3e%3cpath%20fill='%23c8b100'%20stroke='%23000'%20stroke-width='.4'%20d='M182.7%20184a5%205%200%200%201%202.2%202.9s0-.3.6-.6%201-.3%201-.3l-.1%201.3-.3%202.2-.7%201.6a2%202%200%200%200-1.5-.4%202%202%200%200%200-1.2.9s-.7-.6-1.2-1.3l-1.1-2-.7-1.1s.5-.2%201.1%200q.9.1.8.2a5%205%200%200%201%201-3.4m.4%209.8-.6-1q0-.7.3-1.2s-.9-.5-1.8-.7c-.7-.2-2-.2-2.3-.2h-1l.2.5.5.7a5%205%200%200%200-3%202%205%205%200%200%200%203.5%201l-.2.8v.6l1-.4c.3-.1%201.5-.5%202-1%20.8-.4%201.5-1.1%201.5-1.1m2.7-.5.2-1.1-.6-1%201.4-1.3%202-.9%201.1-.4v.6l-.2.8a5%205%200%200%201%203.4%201%205%205%200%200%201-2.9%202l.7%201.2h-1c-.4%200-1.6%200-2.3-.2l-1.8-.7'/%3e%3cpath%20fill='%23ad1519'%20stroke='%23000'%20stroke-width='.4'%20d='M182.2%20192.4c0-1%201-2%202-2s2.2%201%202.2%202c0%201.1-1%202-2.1%202a2%202%200%200%201-2.1-2'/%3e%3cpath%20fill='%23c8b100'%20stroke='%23000'%20stroke-width='.4'%20d='M206.1%20180.8a6%206%200%200%201%201.9%203.7s.2-.3.9-.5q1.1-.3%201.2-.2l-.5%201.4-.8%202.4-1%201.7a2%202%200%200%200-1.7-.7q-1%200-1.6.7-.2-.1-1-1.7l-.8-2.4-.5-1.4%201.2.2q1%20.4.9.5.2-2.2%201.8-3.7'/%3e%3cpath%20fill='%23c8b100'%20stroke='%23000'%20stroke-width='.4'%20d='M204.6%20191.8a2%202%200%200%201-.5-1.2q0-.8.4-1.3s-.8-.7-1.8-1c-.7-.4-2-.7-2.5-.7l-1.2-.2.2.6.4.9a6%206%200%200%200-3.7%201.7q1.6%201.5%203.7%201.6l-.4%201-.2.6%201.2-.2c.4-.1%201.8-.4%202.5-.7%201-.4%201.9-1%201.9-1m3%200a2%202%200%200%200%20.1-2.6s.9-.7%201.8-1a8%208%200%200%201%202.5-.7l1.2-.3-.1.7-.4.9q2.2.2%203.6%201.7a6%206%200%200%201-3.6%201.6l.5%201.6-1.2-.2-2.5-.7c-1-.4-1.8-1-1.8-1m22-8a5%205%200%200%200-2.2%203l-.7-.6-1-.3.2%201.3c0%20.3%200%201.3.3%202.2q.4%201.6.6%201.6a2%202%200%200%201%201.5-.4q.9.2%201.3.9l1.1-1.3q1-1.4%201.1-2l.7-1.1s-.4-.2-1%200l-1%20.2a5%205%200%200%200-1-3.4m-.3%209.8q.5-.4.6-1l-.2-1.2s.8-.5%201.7-.7c.7-.2%202-.2%202.3-.2h1.1l-.3.5-.4.7a5%205%200%200%201%202.9%202%205%205%200%200%201-3.5%201l.2.8v.6l-1-.4c-.3-.1-1.4-.5-2-1-.8-.4-1.4-1.1-1.4-1.1m-2.8-.5-.2-1.1q0-.7.6-1s-.6-.8-1.4-1.3c-.6-.4-1.7-.8-2-.9l-1-.4v.6l.2.8a5%205%200%200%200-3.5%201q1%201.4%203%202l-.5.7-.3.5h1c.4%200%201.7%200%202.3-.2l1.8-.7'/%3e%3cpath%20fill='%23ad1519'%20stroke='%23000'%20stroke-width='.4'%20d='M226%20192.4c0-1%201-2%202-2s2.1%201%202.1%202a2%202%200%200%201-2%202%202%202%200%200%201-2.1-2m23.2%204.4c-.4-.5-1.4-.4-2.2.2q-1.2%201.2-.5%202.2%201%20.8%202.3-.3c.7-.6%201-1.6.5-2'/%3e%3cpath%20fill='%23c8b100'%20stroke='%23000'%20stroke-width='.4'%20d='m246.3%20198%20.7-1c.7-.6%201.8-.7%202.3-.2l.1.2s1-2%202.3-2.6%203.4-.5%203.4-.5a3%203%200%200%200-2.9-2.8%203%203%200%200%200-2.4%201l-.2-1s-1.3.3-1.9%201.8%200%203.6%200%203.6-.3-.9-.7-1.5a8%208%200%200%200-2.4-1.6l-1.3-.7-.1.5v.8a8%208%200%200%200-3.7.5%205%205%200%200%200%202.5%202.2l-.8.7-.4.5%201.3.2%202.5.2%201.7-.2m-80.3%200q0-.6-.7-1c-.7-.7-1.7-.8-2.2-.3l-.2.3s-1-2-2.3-2.7-3.3-.5-3.3-.5a3%203%200%200%201%202.8-2.8q1.6%200%202.4%201l.2-1s1.3.3%202%201.8c.5%201.5-.1%203.6-.1%203.6s.3-.9.8-1.5a8%208%200%200%201%202.4-1.6l1.3-.7v1.3a8%208%200%200%201%203.7.5%205%205%200%200%201-2.5%202.2l.8.7.4.5-1.2.2-2.6.2-1.7-.2'/%3e%3cpath%20fill='%23ad1519'%20stroke='%23000'%20stroke-width='.4'%20d='M163%20196.8q1-.7%202.4.3%201.2%201%20.4%202c-.5.6-1.5.5-2.2-.2s-1-1.6-.5-2m41-6.3q.2-1.8%202-2c1.8-.2%202.1.9%202.1%202%200%201-1%202-2%202a2%202%200%200%201-2.1-2'/%3e%3cpath%20fill='%23005bbf'%20stroke='%23000'%20stroke-width='.3'%20d='M201.8%20160.6c0-2.2%201.9-4%204.3-4s4.2%201.8%204.2%204-1.9%204-4.3%204a4%204%200%200%201-4.2-4'/%3e%3cpath%20fill='%23c8b100'%20stroke='%23000'%20stroke-width='.3'%20d='M205%20149.3v2.2h-2.4v2.2h2.3v6.3H202l-.2.6q0%20.9.3%201.6h7.9q.3-.7.3-1.6l-.2-.6h-2.8v-6.3h2.3v-2.2h-2.3v-2.2z'/%3e%3cpath%20fill='%23ccc'%20d='M206.5%20330.6a82%2082%200%200%201-35.5-8.2%2023%2023%200%200%201-12.8-20.4v-32h96.4v32a23%2023%200%200%201-12.8%2020.4%2081%2081%200%200%201-35.3%208.2'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.5'%20d='M206.5%20330.6a82%2082%200%200%201-35.5-8.2%2023%2023%200%200%201-12.8-20.4v-32h96.4v32a23%2023%200%200%201-12.8%2020.4%2081%2081%200%200%201-35.3%208.2z'/%3e%3cpath%20fill='%23ccc'%20d='M206.3%20270h48.3v-53.5h-48.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.5'%20d='M206.3%20270h48.3v-53.5h-48.3z'/%3e%3cpath%20fill='%23ad1519'%20d='M206.3%20302c0%2012.6-10.7%2022.9-24%2022.9s-24.2-10.3-24.2-23v-32h48.2v32'/%3e%3cpath%20fill='%23c8b100'%20stroke='%23000'%20stroke-width='.5'%20d='M168.6%20320.9c1.5.8%203.6%202%205.8%202.6l-.1-54.7h-5.7z'/%3e%3cpath%20fill='%23c8b100'%20stroke='%23000'%20stroke-linejoin='round'%20stroke-width='.5'%20d='M158%20301.6a24%2024%200%200%200%205.5%2015v-47.5h-5.4z'/%3e%3cpath%20fill='%23c7b500'%20stroke='%23000'%20stroke-width='.5'%20d='M179.4%20324.7a27%2027%200%200%200%205.6%200v-55.9h-5.6v56z'/%3e%3cpath%20fill='%23c8b100'%20stroke='%23000'%20stroke-width='.5'%20d='M190%20323.5a19%2019%200%200%200%205.8-2.5v-52.2H190z'/%3e%3cpath%20fill='%23ad1519'%20d='M158.1%20270h48.2v-53.5H158z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.5'%20d='M158.1%20270h48.2v-53.5H158z'/%3e%3cpath%20fill='%23c8b100'%20stroke='%23000'%20stroke-width='.5'%20d='M201%20316c2.4-2%204.6-6.8%205.4-12.2l.1-35H201l.1%2047.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.5'%20d='M206.3%20302c0%2012.6-10.7%2022.9-24%2022.9s-24.2-10.3-24.2-23v-32h48.2v32'/%3e%3cpath%20fill='%23ad1519'%20d='M254.6%20270v32c0%2012.6-10.8%2022.9-24.1%2022.9s-24.2-10.3-24.2-23v-32h48.3'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.5'%20d='M254.6%20270v32c0%2012.6-10.8%2022.9-24.1%2022.9s-24.2-10.3-24.2-23v-32h48.3'/%3e%3cpath%20fill='%23c8b100'%20d='m215.1%20294.1.1.5q-.1%201-1.1%201a1%201%200%200%201-1.1-1v-.5h-1.5a2.5%202.5%200%200%200%201.8%202.9v3.9h1.6V297a3%203%200%200%200%201.7-1.6h4.4v-1.2zm21.8%200v1.2h-4l-.3.6%204.6%205.2-1.2%201-4.6-5.3-.2.1v8.7h-1.6V297h-.2l-4.8%205.2-1.2-1%204.7-5.3-.2-.4h-4V294h13zm2.6%200v1.2h4.4q.5%201.2%201.7%201.6v3.9h1.6V297a3%203%200%200%200%201.8-2.4v-.5h-1.6l.1.5q-.1%201-1%201-1.1%200-1.2-1l.1-.5zm-6.7%2022.1a16%2016%200%200%200%203.7-1l.8%201.4a18%2018%200%200%201-4.3%201.2%203%203%200%200%201-2.6%202%203%203%200%200%201-2.5-2%2018%2018%200%200%201-4.6-1.2l.8-1.4q2%20.8%204%201a3%203%200%200%201%201.5-1.3v-6.7h1.6v6.7q1.1.3%201.6%201.4zm-11-2.2-.8%201.4a17%2017%200%200%201-3.6-3.1q-1.4.3-2.5-.5a2.4%202.4%200%200%201-.3-3.5l.1-.1a15%2015%200%200%201-1.3-4.8h1.7a13%2013%200%200%200%201%204q.8%200%201.4.2l4.1-4.5%201.3%201-4.1%204.5q.8%201.5-.1%202.8a15%2015%200%200%200%203.1%202.6m-6-4.8q.6-.7%201.5%200c.9.7.5%201%20.1%201.4a1%201%200%200%201-1.6.1%201%201%200%200%201%200-1.5m-2.2-4.5-1.6-.3-.3-4.3%201.7-.6v2.5q0%201.4.2%202.7m1.4-5.3%201.7.4v2.2c0-.8.3%202.1.3%202.1l-1.7.6-.3-2.7zm5.6%2013.7a16%2016%200%200%200%204.8%202.6l.4-1.6a14%2014%200%200%201-4-2zm-.8%201.4a17%2017%200%200%200%204.8%202.6l-1.2%201.1a19%2019%200%200%201-4-2zm2.2-9.4%201.6.7%203-3.3-1-1.4zm-1.3-1-1-1.4%203-3.3%201.6.7zm18.1%209.9.8%201.4a17%2017%200%200%200%203.6-3.1q1.4.3%202.5-.5a2.4%202.4%200%200%200%20.3-3.5l-.1-.1a15%2015%200%200%200%201.3-4.8h-1.7a13%2013%200%200%201-1%204l-1.4.2-4.1-4.5-1.3%201%204.1%204.5a2.4%202.4%200%200%200%20.1%202.8%2015%2015%200%200%201-3.1%202.6m6-4.8a1%201%200%200%200-1.5%200%201%201%200%200%200-.1%201.4%201%201%200%200%200%201.6.1%201%201%200%200%200%200-1.5m2.2-4.5%201.6-.3.3-4.3-1.7-.6v2.5q0%201.5-.2%202.8zm-1.4-5.3-1.7.4v2.2c0-.8-.3%202.1-.3%202.1l1.7.6.3-2.7zm-5.6%2013.7a16%2016%200%200%201-4.8%202.6l-.4-1.6a14%2014%200%200%200%204-2zm.8%201.4a17%2017%200%200%201-4.8%202.6l1.2%201.1a19%2019%200%200%200%204-2zm-2.2-9.4-1.6.7-2.9-3.3%201-1.4zm1.3-1%201-1.4-3-3.3-1.6.7zm-20.1-8.7.5%201.6h4.5l.5-1.6zm21.1%200-.5%201.6h-4.5l-.5-1.6zm-11.6%2021.9q.1-1%201.1-1a1%201%200%200%201%201.1%201q-.1%201-1%201a1%201%200%200%201-1.2-1m1.9-7.8%201.7-.4v-4.3l-1.7-.5zm-1.6%200-1.7-.4v-4.3l1.7-.5z'/%3e%3cpath%20fill='%23c8b100'%20d='M211.5%20294.2q.4-1.5%201.8-2V287h1.6v5.3q1.3.5%201.7%201.6h4.4v.3h-6a1%201%200%200%200-1-.6q-.6%200-1%20.6zm12.2%200v-.3h4.1l.2-.3-5-5.7%201.2-1%205%205.6.2-.1V285h1.6v7.3h.3l4.9-5.5%201.2%201-4.9%205.5.3.6h4v.3zm21.6%200a1%201%200%200%201%201-.6q.7%200%201%20.6h1.6q-.4-1.5-1.8-2V287h-1.6v5.3q-1.2.4-1.7%201.6h-4.4v.3zm-30.2-15%206%206.8%201.3-1-6.1-6.7.3-.6h4.4V276h-4.4a3%203%200%200%200-2.5-1.7%202.6%202.6%200%200%200-2.7%202.5%203%203%200%200%200%201.8%202.4v5.2h1.6v-5.2zm32%200v5.3h-1.7v-5.2l-.4-.2-6%206.8-1.3-1%206.2-6.9-.1-.3h-4.5V276h4.5a3%203%200%200%201%202.4-1.7%202.6%202.6%200%200%201%202.7%202.5%202.5%202.5%200%200%201-1.9%202.4zm-16.1%200v3.3h-1.7v-3.2a3%203%200%200%201-1.7-1.6h-4V276h4a3%203%200%200%201%202.5-1.7q2%20.1%202.5%201.7h4v1.6h-4a3%203%200%200%201-1.6%201.6m-17.8%204-1.7.4v4.3l1.7.5zm1.6%200%201.7.4v4.3l-1.7.5zm30.6%200-1.7.4v4.3l1.7.5zm1.6%200%201.7.4v4.3l-1.7.5zm-25.5.8%201.6-.7%202.9%203.3-1%201.4zm-1.3%201-1%201.4%203%203.3%201.6-.7zm18.5-1.1-1.6-.7-3%203.3%201%201.4zm1.2%201%201%201.4-3%203.3-1.5-.7zm-20.3%209%20.5-1.6h4.5l.5%201.6zm-6.7-17q0-1%201.2-1a1%201%200%200%201%201%201q0%201-1%201a1%201%200%200%201-1.2-1m12.1.8-.5%201.6H220l-.5-1.6zm0-1.6-.5-1.6H220l-.5%201.6zm15.7%2017.8-.5-1.6h-4.5l-.5%201.6zm4.4-17q.1-1%201.1-1a1%201%200%200%201%201.1%201q-.1%201-1%201a1%201%200%200%201-1.2-1m-16.1%200q.1-1%201.1-1a1%201%200%200%201%201.1%201q-.1%201-1.1%201a1%201%200%200%201-1.1-1m6.2.8.5%201.6h4.6l.5-1.6zm0-1.6.5-1.6h4.6l.5%201.6zm-5.9%205-1.7.5v4.3l1.7.5V281m1.7%200%201.6.5v4.3l-1.6.5z'/%3e%3cpath%20fill='none'%20stroke='%23c8b100'%20stroke-width='.3'%20d='M232.7%20316.3a16%2016%200%200%200%203.7-1.1l.8%201.4a18%2018%200%200%201-4.3%201.2%203%203%200%200%201-2.6%202%203%203%200%200%201-2.5-2%2018%2018%200%200%201-4.6-1.2l.8-1.4q2%20.8%204%201a3%203%200%200%201%201.5-1.3v-6.7h1.6v6.7q1.1.3%201.6%201.4zm-4.7-20.4-.2-.5h-4V294h4l.2-.4-5-5.6%201.2-1%205%205.5h.2V285h1.7v7.3h.2l4.9-5.5%201.2%201-4.9%205.5.3.6h4v1.5h-4q0%20.3-.3.5l4.7%205.3-1.3%201-4.6-5.3-.2.1v8.7h-1.6V297l-.2-.1-4.8%205.3-1.2-1%204.7-5.3m-12.8-16.7%206%206.8%201.3-1-6.1-6.7.3-.6h4.4V276h-4.4a3%203%200%200%200-2.5-1.7%202.6%202.6%200%200%200-2.6%202.5%203%203%200%200%200%201.7%202.4v5.2h1.6v-5.2zm6.5%2034.8-.8%201.4a17%2017%200%200%201-3.6-3.1q-1.4.3-2.5-.5a2.4%202.4%200%200%201-.3-3.5l.1-.1a15%2015%200%200%201-1.2-4.8h1.6a13%2013%200%200%200%201%204q.8%200%201.4.2l4.1-4.5%201.3%201-4.1%204.5q.8%201.5-.1%202.8a15%2015%200%200%200%203.1%202.6zm-8.4-13.1V297a3%203%200%200%201-1.8-2.4q.2-1.6%201.8-2.4V287h1.6v5.3q1.3.4%201.7%201.6h4.4v1.5h-4.4a3%203%200%200%201-1.6%201.6v3.9h-1.7m2.3%208.3q.7-.7%201.6%200c.9.7.5%201%20.1%201.4a1%201%200%200%201-1.6.1%201%201%200%200%201%200-1.5zm-2-4.5-1.7-.3-.3-4.3%201.7-.6v2.5q0%201.4.3%202.7zm1.4-5.3%201.6.4v2.2c0-.8.3%202.1.3%202.1l-1.7.6-.3-2.7v-2.6zm5.5%2013.7a16%2016%200%200%200%204.8%202.6l.4-1.6a14%2014%200%200%201-4-2l-1.2%201m-.8%201.4a17%2017%200%200%200%204.8%202.6l-1.2%201.1a19%2019%200%200%201-4-2l.4-1.7'/%3e%3cpath%20fill='none'%20stroke='%23c8b100'%20stroke-width='.3'%20d='m221.9%20305.1%201.6.7%203-3.3-1-1.4-3.6%204m-1.3-1-1-1.4%203-3.3%201.6.7-3.6%204m-7.6-9.5q.1-1%201-1%201.1.1%201.2%201-.1%201-1.1%201.1a1%201%200%200%201-1.1-1zm25.7%2019.4.8%201.4a17%2017%200%200%200%203.6-3.1q1.4.3%202.6-.5a2.4%202.4%200%200%200%20.2-3.5l-.1-.1a15%2015%200%200%200%201.3-4.8h-1.7a13%2013%200%200%201-1%204l-1.4.2-4.1-4.5-1.3%201%204.1%204.5a2.4%202.4%200%200%200%20.1%202.8%2015%2015%200%200%201-3%202.6zm8.4-13.1V297a3%203%200%200%200%201.8-2.4q0-1.6-1.8-2.4V287h-1.6v5.3q-1.2.4-1.7%201.6h-4.4v1.5h4.4q.5%201.2%201.7%201.6v3.9zm-2.3%208.3a1%201%200%200%200-1.6%200%201%201%200%200%200-.1%201.4%201%201%200%200%200%201.6.1%201%201%200%200%200%200-1.5zm2-4.5%201.7-.3.3-4.3-1.7-.6v2.5q0%201.4-.2%202.7zm-1.3-5.3-1.7.4v2.2c0-.8-.3%202.1-.3%202.1l1.7.6.3-2.7v-2.6m1.6-20.1v5.2h-1.6v-5.2l-.4-.2-6%206.8-1.2-1%206-7v-.2h-4.5V276h4.4a3%203%200%200%201%202.5-1.7%202.6%202.6%200%200%201%202.6%202.5%203%203%200%200%201-1.8%202.4zm-16%200v3.2h-1.7v-3.2a3%203%200%200%201-1.7-1.6h-4V276h4q.7-1.6%202.5-1.7c1.8-.1%202.2.7%202.5%201.7h4v1.6h-4a3%203%200%200%201-1.6%201.6zm8.8%2033.8a16%2016%200%200%201-4.8%202.6l-.4-1.6a14%2014%200%200%200%204-2l1.2%201m.8%201.4a17%2017%200%200%201-4.8%202.6l1.2%201.1a19%2019%200%200%200%204-2l-.4-1.7m-27.4-31.4-1.7.5v4.3l1.7.5v-5.2m1.7%200%201.6.4v4.3l-1.6.5V283m30.5%200-1.7.5v4.3l1.7.5V283'/%3e%3cpath%20fill='none'%20stroke='%23c8b100'%20stroke-width='.3'%20d='m247.1%20283.1%201.7.5v4.3l-1.7.5V283m-8.6%2022-1.6.7-2.9-3.3%201-1.4%203.5%204m1.3-1%201-1.4-3-3.3-1.6.7%203.6%204m-18.2-20%201.6-.7%203%203.3-1%201.4-3.6-4m-1.3%201-1%201.4%203%203.3%201.6-.7-3.6-4m18.5-1.1-1.6-.7-3%203.3%201%201.4%203.6-4m1.2%201%201%201.4-3%203.2-1.5-.6%203.5-4m-20.3%209%20.5-1.6h4.5l.5%201.6h-5.5m0%201.5.5%201.6h4.5l.5-1.6h-5.5M213%20277q0-1%201.2-1%201%200%201%201c0%201-.4%201-1%201a1%201%200%200%201-1.2-1zm12.1.8-.5%201.6h-4.5l-.5-1.6h5.5m0-1.6-.5-1.6h-4.5l-.5%201.6h5.5m20.1%2018.5q.1-.9%201.1-1%201%20.1%201.1%201-.1%201-1%201.1a1%201%200%200%201-1.2-1zm-4.4-.7-.5-1.6h-4.5l-.5%201.6h5.5m0%201.5-.5%201.6h-4.5l-.5-1.6h5.5m-11.6%2021.9q.1-1%201.1-1t1.1%201c.1%201-.5%201-1%201a1%201%200%200%201-1.2-1zm1.9-7.8%201.7-.4v-4.3l-1.7-.5v5.2m-1.6%200-1.7-.4v-4.3l1.7-.5v5.2m15.7-32.6q.1-1%201.1-1a1%201%200%200%201%201.1%201q-.1%201-1%201a1%201%200%200%201-1.2-1zm-16.1%200q.1-1%201.1-1a1%201%200%200%201%201.1%201q-.1%201-1%201a1%201%200%200%201-1.2-1zm6.2.8.5%201.6h4.6l.5-1.6h-5.5m0-1.6.4-1.6h4.6l.5%201.6h-5.5m-6%205-1.6.5v4.3l1.6.5V281m1.7%200%201.6.5v4.3l-1.6.5V281'/%3e%3cpath%20fill='%23058e6e'%20d='M227.7%20294.7a2.6%202.6%200%200%201%202.6-2.5%202.6%202.6%200%200%201%202.6%202.5%202.6%202.6%200%200%201-2.6%202.4c-1.4%200-2.6-1-2.6-2.4'/%3e%3cpath%20fill='%23db4446'%20d='M230.9%20229.7v-.6l.1-.3-2.3-.1a6%206%200%200%201-2.3-1.2q-1-1-1.6-1.2c-1.3-.2-2.3.4-2.3.4s1%20.4%201.7%201.3%201.5%201.3%201.8%201.4c.6.2%202.6%200%203.1.1z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M230.9%20229.7v-.6l.1-.3-2.3-.1a6%206%200%200%201-2.3-1.2q-1-1-1.6-1.2c-1.3-.2-2.3.4-2.3.4s1%20.4%201.7%201.3%201.5%201.3%201.8%201.4c.6.2%202.6%200%203.1.1z'/%3e%3cpath%20fill='%23ed72aa'%20stroke='%23000'%20stroke-width='.4'%20d='M238.1%20227.5v1.4c.2.6-.1%201.2%200%201.5q0%20.5.3.9l.2.9-.7-.5-.6-.4v1l.6%201.1%201%201.3c.2.5.1%201.4.1%201.4s-.4-.7-.8-.8l-1.2-.7s.7.8.7%201.5l-.3%201.6c-.1.2-.3-.7-.8-1.1l-1-.9s.4%201.2.4%202v2.3l-.9-1-1-.7c0-.2.5.6.6%201.1s.3%202.3%201.8%204.5c1%201.3%202.3%203.6%205.3%202.9s1.9-4.8%201.3-6.7a17%2017%200%200%201-1-4.6c0-.8.6-2.9.5-3.3a8%208%200%200%201%20.2-3.1l.9-2.3.4-1.3.1-1.3.7%201.3.1%201.5s.1-1%201-1.6%201.8-1.1%202-1.4l.3-.5c-.1%200%200%201.8-.6%202.6l-1.7%202s.7-.3%201.2-.3h.9s-.6.4-1.4%201.6c-.8%201-.5%201.2-1%202.1s-1%201-1.7%201.5c-1%20.8-.5%204.2-.4%204.7.2.5%202%204.5%202%205.5s.2%203.2-1.5%204.6c-1.1%201-3%201-3.4%201.2-.4.3-1.2%201.1-1.2%202.8s.6%202%201%202.4c.6.5%201.2.2%201.3.6l.5.7q.3.3.2.8c0%20.3-.8%201.1-1.1%201.7l-.8%202.4c0%20.2-.1%201%20.1%201.3%200%200%20.9%201%20.3%201.2-.4.2-.8-.2-1-.2l-.9.5q-.3-.1-.4-.8l-.1-.7q-.3%200-.4.5c0%20.2%200%20.8-.3.8l-.8-.5c-.2%200-.8-.2-.8-.4q.1-.6.7-1%20.8-.1.5-.5t-.7%200c-.3.4-.8%200-.7-.2v-.8c0-.2-.4-.5.1-.8s.8.2%201.4.1q.8%200%201-.6.3-.6-.2-1.4l-.9-.8-.3-.9v2.2l-.7-.8c-.3-.3-.6-1.3-.6-1.3v1.3l.2.8c-.1.1-.8-.7-1-.8l-1-1-.4-1.4v-1.5l.4-1h-1.4c-.7%200-1.2-.3-1.5.2q-.4.8.2%202.8.5%201.8.4%202.1l-.7.8h-.9l-1.2-.3h-1.3l-1.1-.3c-.3.1-.8.3-.6.7q.1.8-.5.7l-.9-.2q-.8%200-.8-.4t.4-.7q.3-.5%200-.5h-.6q-.3.4-.8.4-.3-.1-.4-1c-.1-.9-.7-1.2%200-1.1.5%200%201.3.4%201.4%200q.2-.4-.2-.7c-.4-.3-.8-.4-.3-.7l.7-.5c.1-.2.4-.8.7-.6.6.2%200%20.7.6%201.3s1%201%202%20.8q1.4%200%201.3-.5l-.1-1v-1s-.4.3-.5.6l-.4.8v-2l-.2-.8-.3.9-.1%201s-.7-.5-.5-1.5l.1-2c.2-.3.7-1.5%202-1.6h2.6l2-.3s-2.8-1.4-3.5-1.9a10%2010%200%200%201-2-2l-.6-1.6s-.5%200-1%20.3l-1.2%201-.7%201%20.1-1.2v-.8s-.4%201.2-1%201.7l-1.4%201v-.8l.2-1s-.4.8-1.1%201c-.7%200-1.8%200-1.9.4q.2.8%200%201.4c0%20.3-.4.5-.4.5l-.8-.4-.7.2c-.1.1-.3-.4-.2-.7s.7-.6.5-.8l-.8.2c-.3.1-.8.3-.8-.2q.2-.6%200-1%200-.4.2-.6l1.2-.1q0-.4-.8-.6-1-.2-.5-.8.3-.2.5-.6c.1-.2.2-.7.7-.5.5.3.4.8%201%201a4%204%200%200%200%202-.2l1.5-1%201.5-1-1-.8q-.5-.7-1-1l-1.8-.6-1.7-.5.8-.3q.4-.5.8-.6h.3-1.4c-.3-.1-1-.6-1.3-.6l-.8.1s.8-.4%201.4-.5l1-.1s-.9-.3-1.1-.6l-.6-1q-.2-.3-.6-.5l-1%20.3q-.6%200-.6-.6l-.1-.5c-.2-.3-.6-.8-.2-1h1.4q-.2-.4-.8-.8c-.4-.2-1-.5-.7-.8l.8-.5c.2-.3.3-1%20.7-.7.4.2.8%201.2%201.1%201.1s.3-.8.3-1c0-.4%200-1%20.2-.9l1%20.5q.8-.1%201%20.2%200%20.5-.6%201-.4.6-.3%201.4.4%201%201.2%201.4t1.7.9c.5.3%201.7%201.2%202.1%201.3l.8.4s.5-.2%201.1-.2%202.1%200%202.6-.2%201.3-.6%201-1c-.1-.6-1.3-1-1.2-1.4q0-.5%201.2-.4c.8%200%201.8.1%202-1q.5-1.4-.8-1.8c-1-.2-1.8-.2-2-1q-.4-1-.2-1.1.3-.3%201.4-.4%201.3%200%201.9-.2l.6-.9c.3-.2%201.4-.4%201.4-.4s1.4.7%202.7%201.7l2.2%202.1'/%3e%3cpath%20d='m228.1%20226.8-.2-.6v-.3s.8%200%20.7.3q0%20.2-.3.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m228.1%20226.8-.2-.6v-.3s.8%200%20.7.3q0%20.2-.3.3z'/%3e%3cpath%20d='M232%20225.4v-.4s.7%200%201%20.3c.5.4.9%201%20.9%201l-.8-.4h-.5l-.3-.1v-.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.1'%20d='M232%20225.4v-.4s.7%200%201%20.3c.5.4.9%201%20.9%201l-.8-.4h-.5l-.3-.1v-.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m237.3%20231.3-.4-.7-.3-.4'/%3e%3cpath%20fill='%23db4446'%20d='M217.4%20226.6s.5.4.8.4h.8s.2-.5.1-.8c-.2-1.2-1.2-1.4-1.2-1.4s.3.7.1%201z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M217.4%20226.6s.5.4.8.4h.8s.2-.5.1-.8c-.2-1.2-1.2-1.4-1.2-1.4s.3.7.1%201z'/%3e%3cpath%20fill='%23db4446'%20d='M215.2%20227.6s-.4-.7-1.3-.6-1.4.8-1.4.8h1.2c.3.3.4%201%20.4%201l.7-.6z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M215.2%20227.6s-.4-.7-1.3-.6-1.4.8-1.4.8h1.2c.3.3.4%201%20.4%201l.7-.6z'/%3e%3cpath%20fill='%23db4446'%20d='M214.2%20230.6s-.8.1-1.2.6-.3%201.3-.3%201.3.4-.5.9-.5l1%20.2-.1-.8z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M214.2%20230.6s-.8.1-1.2.6-.3%201.3-.3%201.3.4-.5.9-.5l1%20.2-.1-.8z'/%3e%3cpath%20d='m228.2%20230.5.3-.5.3.5z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m228.2%20230.5.3-.5.3.5h-.7'/%3e%3cpath%20d='m229%20230.5.3-.5.4.5z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m229%20230.5.3-.5.4.5h-.8'/%3e%3cpath%20d='m228.6%20227.3.8.3-.7.4-.1-.6'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m228.6%20227.3.8.3-.7.4-.1-.6'/%3e%3cpath%20d='m229.5%20227.6.7.2-.5.4z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m229.5%20227.6.7.2-.5.4-.2-.6'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M224.2%20233.7s-.7.2-1%20.6q-.4.9-.3%201c.1.1.6-.5%201.5-.3l1.2.3%201.3-.3s-.7.8-.7%201.3l.2%201.1c0%20.7-.6%201.6-.6%201.6l1-.3%201.7-.8.9-1s-.2%201%200%201.4l.2%201.6.8-.6q.5-.2.9-.7l.3-1s0%20.8.4%201.3l.6%201.6s.3-.8.6-1.1l.7-1-.1-.9.4.8m-11%20.6s.5-.8%201-1l1.1-.8.9-.4m1%205%201.3-.8%201-1'/%3e%3cpath%20fill='%23db4446'%20d='M216.6%20240.4s-.4-.5-1.1-.3c-.7%200-1.2.9-1.2.9s.6-.2%201-.1.6.4.6.4l.4-.4z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M216.6%20240.4s-.4-.5-1.1-.3c-.7%200-1.2.9-1.2.9s.6-.2%201-.1.6.4.6.4l.4-.4z'/%3e%3cpath%20fill='%23db4446'%20d='M215.8%20243.2s-.6%200-1.1.3c-.5.4-.5%201.2-.5%201.2s.4-.4.8-.3l.9.2v-.6c.2-.4-.1-.8-.1-.8'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M215.8%20243.2s-.6%200-1.1.3c-.5.4-.5%201.2-.5%201.2s.4-.4.8-.3l.9.2v-.6c.2-.4-.1-.8-.1-.8z'/%3e%3cpath%20fill='%23db4446'%20d='M217.2%20245.8s0%20.8.3%201.3c.4.5%201.1.5%201.1.5l-.3-.7.3-.8q.1-.1-.7-.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M217.2%20245.8s0%20.8.3%201.3c.4.5%201.1.5%201.1.5l-.3-.7.3-.8q.1-.1-.7-.3zm16%201.3s2%201.2%201.9%202.2c0%201-1%202.3-1%202.3'/%3e%3cpath%20fill='%23db4446'%20d='M224.2%20252.6s-.4-.6-1.1-.6-1.4.7-1.4.7.8-.1%201%20.2l.5.6.5-.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M224.2%20252.6s-.4-.6-1.1-.6-1.4.7-1.4.7.8-.1%201%20.2l.5.6.5-.3z'/%3e%3cpath%20fill='%23db4446'%20d='M222.2%20255.3s-1-.1-1.4.3-.4%201.3-.4%201.3.6-.6%201-.5q.9.1%201%20.3v-.7l-.3-.7'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M222.2%20255.3s-1-.1-1.4.3-.4%201.3-.4%201.3.6-.6%201-.5q.9.1%201%20.3v-.7l-.3-.7z'/%3e%3cpath%20fill='%23db4446'%20d='M224%20258.1s-.3.7%200%201.1%201%20.8%201%20.8-.3-.4-.2-.8c.1-.3.7-.8.7-.8l-1.4-.2'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M224%20258.1s-.3.7%200%201.1%201%20.8%201%20.8-.3-.4-.2-.8c.1-.3.7-.8.7-.8l-1.4-.2z'/%3e%3cpath%20fill='%23db4446'%20d='M236%20259.3s-.8-.2-1.2%200c-.5.3-.8%201.4-.8%201.4s.7-.6%201.2-.5q.9.1%201%20.3v-.8z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M236%20259.3s-.8-.2-1.2%200c-.5.3-.8%201.4-.8%201.4s.7-.6%201.2-.5q.9.1%201%20.3v-.8z'/%3e%3cpath%20fill='%23db4446'%20d='M236.4%20262.2s-.6.6-.4%201.1l.6%201s0-.7.2-1l1-.3-.7-.5z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M236.4%20262.2s-.6.6-.4%201.1l.6%201s0-.7.2-1l1-.3-.7-.5z'/%3e%3cpath%20fill='%23db4446'%20d='M239.4%20263s-.3.8.2%201.3l1%20.5q-.2-.3-.2-1.1.3-.7.5-.7l-.8-.2-.7.3'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M239.4%20263s-.3.8.2%201.3l1%20.5q-.2-.3-.2-1.1.3-.7.5-.7l-.8-.2-.7.3z'/%3e%3cpath%20fill='%23ffd691'%20stroke='%23000'%20stroke-width='.5'%20d='M208.8%20316.4q3%201%203%203.8c0%202.3-2.2%204-5%204-3%200-5.3-1.7-5.3-4%200-1.7%201-3.6%203-3.8l-.2-.4-.7-.7h1.2l.8.5.5-.7.6-.5.6.6.3.5.7-.4.8-.3s0%20.4-.2.7l-.1.7'/%3e%3cpath%20fill='%23058e6e'%20stroke='%23000'%20stroke-width='.5'%20d='M206.3%20326.7s-3.8-2.6-5.5-3c-2-.4-4.5%200-5.5%200%200%200%201.2.8%201.8%201.4.5.5%202.3%201.5%203.3%201.8%203%20.8%206-.2%206-.2m1%20.2s2.4-2.5%205-2.9c3-.4%205%20.3%206.2.6l-1.5.8c-.5.3-2%201.5-4%201.6-2%200-4.4-.3-4.8-.2l-.9.1'/%3e%3cpath%20fill='%23ad1519'%20stroke='%23000'%20stroke-width='.5'%20d='M206.7%20323.8a5%205%200%200%201%200-7.1%205%205%200%200%201%201.5%203.5%205%205%200%200%201-1.5%203.6'/%3e%3cpath%20fill='%23058e6e'%20stroke='%23000'%20stroke-width='.5'%20d='M205.7%20329s.6-1.5.6-2.7l-.1-2.1h.8s.3%201.1.3%202l-.1%202.4-.7.1-.8.3'/%3e%3cpath%20fill='%23fff'%20d='M254%20190.7q.1-.9%201-1%201%20.1%201.1%201-.1%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M254%20190.7q.1-.9%201-1%201%20.1%201.1%201-.1%201-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M255.4%20188.2q.1-1%201.1-1t1%201c0%201-.4%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M255.4%20188.2q.1-1%201.1-1t1%201c0%201-.4%201-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M256.4%20185.2q.1-.9%201-1%201%20.1%201.1%201c.1.9-.5%201-1%201a1%201%200%200%201-1.1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M256.4%20185.2q.1-.9%201-1%201%20.1%201.1%201c.1.9-.5%201-1%201a1%201%200%200%201-1.1-1z'/%3e%3cpath%20fill='%23fff'%20d='M256.5%20182q.1-.9%201-1%201%20.1%201.1%201-.1%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M256.5%20182q.1-.9%201-1%201%20.1%201.1%201-.1%201-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M255.7%20179q.1-1%201-1%201.1%200%201.2%201c.1%201-.5%201-1.1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M255.7%20179q.1-1%201-1%201.1%200%201.2%201c.1%201-.5%201-1.1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M254.1%20176.1q.1-.9%201-1%201%20.1%201.1%201%200%201.2-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M254.1%20176.1q.1-.9%201-1%201%20.1%201.1%201%200%201.2-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M252%20173.8q0-1%201-1c1%200%201%20.4%201%201s-.4%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M252%20173.8q0-1%201-1c1%200%201%20.4%201%201s-.4%201-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M249.4%20171.8q.1-.9%201.1-1a1%201%200%200%201%200%202q-1%200-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M249.4%20171.8q.1-.9%201.1-1a1%201%200%200%201%200%202q-1%200-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M246.5%20170.3q0-1%201-1c1%200%201%20.4%201%201s-.4%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M246.5%20170.3q0-1%201-1c1%200%201%20.4%201%201s-.4%201-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M243.3%20169.1q.1-.9%201.1-1a1%201%200%200%201%200%202%201%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M243.3%20169.1q.1-.9%201.1-1a1%201%200%200%201%200%202%201%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M239.9%20168.5q0-.9%201-1c1-.1%201%20.5%201%201s-.4%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M239.9%20168.5q0-.9%201-1c1-.1%201%20.5%201%201s-.4%201-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M236.6%20168.3q0-.9%201-1c1-.1%201%20.5%201%201s-.4%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M236.6%20168.3q0-.9%201-1c1-.1%201%20.5%201%201s-.4%201-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M233.3%20168.5q.1-1%201-1t1.1%201c.1%201-.4%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M233.3%20168.5q.1-1%201-1t1.1%201c.1%201-.4%201-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M230.1%20168.5q.1-1%201-1t1.1%201c.1%201-.5%201-1%201a1%201%200%200%201-1.1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M230.1%20168.5q.1-1%201-1t1.1%201c.1%201-.5%201-1%201a1%201%200%200%201-1.1-1z'/%3e%3cpath%20fill='%23fff'%20stroke='%23000'%20stroke-width='.4'%20d='M231.7%20171.2q.1-.9%201-1%201%20.1%201.1%201%200%201.2-1%201a1%201%200%200%201-1-1m.6%203.1q0-1%201-1c1%200%201%20.4%201%201q0%20.9-1%201a1%201%200%200%201-1-1m0%203q.2-.9%201.1-1a1%201%200%200%201%200%202%201%201%200%200%201-1-1m-1%202.8q.1-.9%201-1%201%20.1%201.1%201%200%201-1%201a1%201%200%200%201-1-1m-1.9%202.6q.1-.9%201-1%201.1.1%201.2%201%200%201.2-1.1%201-1%200-1-1'/%3e%3cpath%20fill='%23fff'%20d='M227.6%20166.5q.1-.9%201.1-1a1%201%200%200%201%200%202%201%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M227.6%20166.5q.1-.9%201.1-1a1%201%200%200%201%200%202%201%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M224.8%20165q0-1%201-1c1%200%201%20.4%201%201s-.4%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M224.8%20165q0-1%201-1c1%200%201%20.4%201%201s-.4%201-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M221.6%20164q.1-1%201-1t1.1%201q-.1.9-1%201-1-.1-1.1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M221.6%20164q.1-1%201-1t1.1%201q-.1.9-1%201-1-.1-1.1-1z'/%3e%3cpath%20fill='%23fff'%20d='M218.3%20163.4q.1-.9%201-1%201%20.1%201.1%201%200%201.2-1%201a1%201%200%200%201-1.1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M218.3%20163.4q.1-.9%201-1%201%20.1%201.1%201%200%201.2-1%201a1%201%200%200%201-1.1-1z'/%3e%3cpath%20fill='%23fff'%20d='M215%20163.5q.1-1%201.1-1t1%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M215%20163.5q.1-1%201.1-1t1%201-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M211.7%20164q.1-.9%201-1%201%20.1%201.1%201%200%201.2-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M211.7%20164q.1-.9%201-1%201%20.1%201.1%201%200%201.2-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M208.6%20165.1q.1-.9%201-1%201%20.1%201.1%201c.1.9-.5%201-1%201a1%201%200%200%201-1.1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M208.6%20165.1q.1-.9%201-1%201%20.1%201.1%201c.1.9-.5%201-1%201a1%201%200%200%201-1.1-1z'/%3e%3cpath%20fill='%23fff'%20d='M156%20190.7q0-.9%201-1c1-.1%201%20.5%201%201q0%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M156%20190.7q0-.9%201-1c1-.1%201%20.5%201%201q0%201-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M154.5%20188.2q.1-1%201-1t1%201c0%201-.4%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M154.5%20188.2q.1-1%201-1t1%201c0%201-.4%201-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M153.5%20185.2q.1-.9%201-1%201%20.1%201.1%201%200%201.2-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M153.5%20185.2q.1-.9%201-1%201%20.1%201.1%201%200%201.2-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M153.4%20182q.1-.9%201-1%201%20.1%201.1%201-.1%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M153.4%20182q.1-.9%201-1%201%20.1%201.1%201-.1%201-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M154.2%20179q.1-1%201-1t1%201c0%201-.4%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M154.2%20179q.1-1%201-1t1%201c0%201-.4%201-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M155.8%20176.1q.1-.9%201-1%201%20.1%201.1%201%200%201.2-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M155.8%20176.1q.1-.9%201-1%201%20.1%201.1%201%200%201.2-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M158%20173.8q0-1%201-1c1%200%201%20.4%201%201s-.4%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M158%20173.8q0-1%201-1c1%200%201%20.4%201%201s-.4%201-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M160.5%20171.8q0-.9%201-1c1-.1%201%20.5%201%201s-.4%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M160.5%20171.8q0-.9%201-1c1-.1%201%20.5%201%201s-.4%201-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M163.5%20170.3q0-1%201-1c1%200%201%20.4%201%201s-.4%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M163.5%20170.3q0-1%201-1c1%200%201%20.4%201%201s-.4%201-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M166.6%20169.1q.1-.9%201-1a1%201%200%200%201%200%202%201%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M166.6%20169.1q.1-.9%201-1a1%201%200%200%201%200%202%201%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M170%20168.5q.1-.9%201.1-1a1%201%200%200%201%200%202q-1%200-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M170%20168.5q.1-.9%201.1-1a1%201%200%200%201%200%202q-1%200-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M173.4%20168.3q0-.9%201-1c1-.1%201%20.5%201%201s-.4%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M173.4%20168.3q0-.9%201-1c1-.1%201%20.5%201%201s-.4%201-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M176.6%20168.5q.1-1%201-1t1.1%201c.1%201-.5%201-1%201a1%201%200%200%201-1.1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M176.6%20168.5q.1-1%201-1t1.1%201c.1%201-.5%201-1%201a1%201%200%200%201-1.1-1z'/%3e%3cpath%20fill='%23fff'%20d='M179.8%20168.5q.1-1%201-1%201.1%200%201.2%201c.1%201-.5%201-1.1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M179.8%20168.5q.1-1%201-1%201.1%200%201.2%201c.1%201-.5%201-1.1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20stroke='%23000'%20stroke-width='.4'%20d='M178.2%20171.2q.1-.9%201-1%201%20.1%201.1%201%200%201.2-1%201a1%201%200%200%201-1-1m-.7%203.1q0-1%201-1c1%200%201%20.4%201%201q0%20.9-1%201a1%201%200%200%201-1-1m-.2%203q.1-.9%201-1%201%20.1%201.1%201%200%201.2-1%201a1%201%200%200%201-1-1m.9%202.8q.1-.9%201-1%201%20.1%201.1%201-.1%201-1%201a1%201%200%200%201-1.1-1m1.8%202.6q.1-.9%201-1a1%201%200%200%201%200%202%201%201%200%200%201-1-1'/%3e%3cpath%20fill='%23fff'%20d='M182.3%20166.5q.1-.9%201-1a1%201%200%200%201%200%202%201%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M182.3%20166.5q.1-.9%201-1a1%201%200%200%201%200%202%201%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M185.2%20165q0-1%201-1c1%200%201%20.4%201%201s-.4%201-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M185.2%20165q0-1%201-1c1%200%201%20.4%201%201s-.4%201-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M188.3%20164q.1-1%201-1t1.1%201q0%20.9-1%201c-1%20.1-1-.5-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M188.3%20164q.1-1%201-1t1.1%201q0%20.9-1%201c-1%20.1-1-.5-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M191.6%20163.4q.1-.9%201-1%201%20.1%201.1%201%200%201.2-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M191.6%20163.4q.1-.9%201-1%201%20.1%201.1%201%200%201.2-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M194.9%20163.5q0-1%201-1c1%200%201%20.4%201%201q0%20.9-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M194.9%20163.5q0-1%201-1c1%200%201%20.4%201%201q0%20.9-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M198.2%20164q.1-.9%201-1%201%20.1%201.1%201%200%201.2-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M198.2%20164q.1-.9%201-1%201%20.1%201.1%201%200%201.2-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23fff'%20d='M201.3%20165.1q.1-.9%201-1%201%20.1%201.1%201%200%201.2-1%201a1%201%200%200%201-1-1'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.4'%20d='M201.3%20165.1q.1-.9%201-1%201%20.1%201.1%201%200%201.2-1%201a1%201%200%200%201-1-1z'/%3e%3cpath%20fill='%23c8b100'%20stroke='%23000'%20stroke-width='.4'%20d='M174.7%20228.9h-1v-1h-1.5v3.6h1.6v2.5h-3.4v7h1.8v14.3h-3.5v7.3h27.2v-7.3h-3.5V241h1.8v-7h-3.4v-2.5h1.6V228h-1.6v.9h-.8v-1h-1.6v1h-1.1v-1h-1.6v3.6h1.6v2.5H184v-7.8h1.7v-3.5H184v.9h-1v-1h-1.5v1h-.9v-1H179v3.6h1.7v7.8h-3.3v-2.5h1.6V228h-1.6v.9h-.9v-1h-1.8zm-6%2033.7H196m-27.3-1.8H196m-27.3-1.8H196m-27.3-1.7H196m-27.3-2H196m-23.8-1.6h20.2m-20.2-1.8h20.2m-20.2-2h20.2m-20.2-1.7h20.2m-20.2-1.8h20.2m-20.2-1.8h20.2m-20.2-1.7h20.2m-22-1.8h23.8m-23.8-1.8h23.8m-23.8-1.8h23.8m-23.8-1.8h23.8m-20.4-1.7h17m-10.2-1.8h3.4m-3.4-1.8h3.4m-3.4-1.8h3.4m-3.4-1.7h3.4m-5.1-2.2h6.8m-12%207.5h3.6m-5-2.2h6.6m-6.7%2032.6v-1.8m0-1.8v-1.7m-1.8%201.7v1.8m3.4%200V259m1.7%203.6v-1.8m0-1.8v-1.7m0-2v-1.6m0-1.8v-2m-1.7%207.4v-2m-3.4%202v-2m7%200v2m1.5-2v-1.6m-5.1-1.8v1.8m3.5-1.8v1.8m3.3-1.8v1.8M179%20252v-2m1.7-1.7v1.7m0-5.3v1.8m-1.7-3.6v1.8m1.7-3.5v1.7m-3.3-1.7v1.7m-3.5-1.7v1.7m-1.6-3.5v1.8m3.3-1.8v1.8m3.4-1.8v1.8m1.7-3.6v1.8m-3.3-1.8v1.8m-3.5-1.8v1.8m-1.6-3.6v1.8m6.7-1.8v1.8m-3.4-5.3v1.8m15.3-1.8h-3.5m5-2.2h-6.6m6.7%2032.6v-1.8m0-1.8v-1.7m1.8%201.7v1.8m-3.4%200V259m-1.7%203.6v-1.8m0-1.8v-1.7m0-2v-1.6m0-1.8v-2m1.7%207.4v-2m3.4%202v-2m-7%200v2m-1.5-2v-1.6m5.1-1.8v1.8m-3.5-1.8v1.8m-3.3-1.8v1.8m1.7-1.8v-2m-1.7-1.7v1.7m0-5.3v1.8m1.7-3.6v1.8m-1.7-3.5v1.7m3.3-1.7v1.7m3.5-1.7v1.7m1.6-3.5v1.8m-3.3-1.8v1.8m-3.4-1.8v1.8m-1.7-3.6v1.8m3.3-1.8v1.8m3.5-1.8v1.8m1.6-3.6v1.8m-6.7-1.8v1.8m3.4-5.3v1.8m-7%2018v-2m0-5.4v-1.8m0%205.4v-1.8m0-5.3v-1.8m0-1.8v-1.7m0-3.6v-1.8m0-1.7v-1.8m-8.3%204.6h3.5m3.3-5.3h3.4m3.3%205.3h3.5'/%3e%3cpath%20fill='%23c8b100'%20stroke='%23000'%20stroke-width='.4'%20d='M186.8%20262.6v-4.7c0-.8-.4-3.5-4.6-3.5-4%200-4.4%202.7-4.4%203.5v4.7z'/%3e%3cpath%20fill='%23c8b100'%20stroke='%23000'%20stroke-width='.4'%20d='m179.3%20258.2-2.2-.3c0-.9.2-2.2.9-2.6l2%201.5c-.3.2-.7%201-.7%201.4zm6%200%202.2-.3c0-.9-.2-2.2-.9-2.6l-2%201.5c.3.2.7%201%20.7%201.4zm-2.2-2.3%201-2-2-.4-1.7.4%201.1%202zm-4.2-5.5v-4.9c0-1.3-1-2.4-2.5-2.4s-2.4%201-2.4%202.4v4.9zm6.8%200v-4.9c0-1.3%201-2.4%202.5-2.4s2.4%201%202.4%202.4v4.9zm-1.7-12%20.4-4.4h-4.2l.2%204.4zm3.3%200-.4-4.4h4.4l-.5%204.4zm-10%200%20.2-4.4h-4.2l.5%204.4z'/%3e%3cpath%20fill='%230039f0'%20d='M185.3%20262.6v-4c0-.7-.5-2.7-3.1-2.7-2.4%200-2.9%202-2.9%202.7v4zm-6.9-12.7v-4.2c0-1-.6-2.2-2-2.2s-2%201.1-2%202.2v4.3h4zm7.8%200v-4.2c0-1%20.7-2.2%202-2.2s2%201.1%202%202.2v4.3h-4z'/%3e%3cpath%20fill='%23ad1519'%20d='M190.8%20269.8c0-9.7%207-17.6%2015.6-17.6s15.6%207.9%2015.6%2017.6-7%2017.5-15.6%2017.5-15.6-7.8-15.6-17.5'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.6'%20d='M190.8%20269.8c0-9.7%207-17.6%2015.6-17.6s15.6%207.9%2015.6%2017.6-7%2017.5-15.6%2017.5-15.6-7.8-15.6-17.5z'/%3e%3cpath%20fill='%23005bbf'%20d='M195.4%20269.7c0-7%205-12.8%2011-12.8s11%205.7%2011%2012.8-5%2013-11%2013-11-5.8-11-13'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.6'%20d='M195.4%20269.7c0-7%205-12.8%2011-12.8s11%205.7%2011%2012.8-5%2013-11%2013-11-5.8-11-13z'/%3e%3cpath%20fill='%23c8b100'%20d='M201.2%20260.9s-1.3%201.4-1.3%202.7a6%206%200%200%200%20.6%202.4q-.4-.8-1.4-.8-1.3.1-1.4%201.3l.2.8.5.9q.2-.5%201-.5%201.1%200%201%201v.2h-1.2v1h1l-.8%201.5%201-.4.8.9.8-.9%201%20.4-.7-1.5h1v-1h-1.1v-.3a1%201%200%200%201%201-1q.6%200%201%20.6l.4-1%20.2-.7a1.4%201.4%200%200%200-1.4-1.3q-1%200-1.4.9s.6-1.2.6-2.5-1.4-2.7-1.4-2.7'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-linejoin='round'%20stroke-width='.3'%20d='M201.2%20260.9s-1.3%201.4-1.3%202.7a6%206%200%200%200%20.6%202.4q-.4-.8-1.4-.8-1.3.1-1.4%201.3l.2.8.5.9q.2-.5%201-.5%201.1%200%201%201v.2h-1.2v1h1l-.8%201.5%201-.4.8.9.8-.9%201%20.4-.7-1.5h1v-1h-1.1v-.3a1%201%200%200%201%201-1q.6%200%201%20.6l.4-1%20.2-.7a1.4%201.4%200%200%200-1.4-1.3q-1%200-1.4.9s.6-1.2.6-2.5-1.4-2.7-1.4-2.7z'/%3e%3cpath%20fill='%23c8b100'%20d='M199.2%20269.9h4.1v-1h-4.1z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M199.2%20269.9h4.1v-1h-4.1z'/%3e%3cpath%20fill='%23c8b100'%20d='M211.4%20260.9s-1.3%201.4-1.3%202.7.6%202.4.6%202.4q-.3-.8-1.4-.8-1.3.1-1.4%201.3l.2.8.5.9q.3-.5%201-.5a1%201%200%200%201%201%201v.2h-1.2v1h1l-.8%201.5%201-.4.8.9.8-.9%201%20.4-.7-1.5h1v-1h-1.1v-.3a1%201%200%200%201%201-1q.7%200%201%20.6l.4-1%20.2-.7a1.4%201.4%200%200%200-1.4-1.3q-1%200-1.4.9s.6-1.2.6-2.5-1.4-2.7-1.4-2.7'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-linejoin='round'%20stroke-width='.3'%20d='M211.4%20260.9s-1.3%201.4-1.3%202.7.6%202.4.6%202.4q-.3-.8-1.4-.8-1.3.1-1.4%201.3l.2.8.5.9q.3-.5%201-.5a1%201%200%200%201%201%201v.2h-1.2v1h1l-.8%201.5%201-.4.8.9.8-.9%201%20.4-.7-1.5h1v-1h-1.1v-.3a1%201%200%200%201%201-1q.7%200%201%20.6l.4-1%20.2-.7a1.4%201.4%200%200%200-1.4-1.3q-1%200-1.4.9s.6-1.2.6-2.5-1.4-2.7-1.4-2.7z'/%3e%3cpath%20fill='%23c8b100'%20d='M209.4%20269.9h4.1v-1h-4.1z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M209.4%20269.9h4.1v-1h-4.1z'/%3e%3cpath%20fill='%23c8b100'%20d='M206.3%20269.6s-1.3%201.5-1.3%202.8.6%202.4.6%202.4q-.3-.8-1.4-.9-1.3.1-1.4%201.4l.2.7.5%201q.2-.6%201-.6a1%201%200%200%201%201%201v.3h-1.2v1h1l-.8%201.5%201-.4.8.9.8-1%201%20.5-.7-1.5h1v-1h-1.1v-.3a1%201%200%200%201%201-1q.6%200%20.9.6l.5-1%20.2-.7a1.4%201.4%200%200%200-1.4-1.4q-1%200-1.4%201s.6-1.2.6-2.5-1.4-2.7-1.4-2.7'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-linejoin='round'%20stroke-width='.3'%20d='M206.3%20269.6s-1.3%201.5-1.3%202.8.6%202.4.6%202.4q-.3-.8-1.4-.9-1.3.1-1.4%201.4l.2.7.5%201q.2-.6%201-.6a1%201%200%200%201%201%201v.3h-1.2v1h1l-.8%201.5%201-.4.8.9.8-1%201%20.5-.7-1.5h1v-1h-1.1v-.3a1%201%200%200%201%201-1q.6%200%20.9.6l.5-1%20.2-.7a1.4%201.4%200%200%200-1.4-1.4q-1%200-1.4%201s.6-1.2.6-2.5-1.4-2.7-1.4-2.7z'/%3e%3cpath%20fill='%23c8b100'%20d='M204.3%20278.6h4.1v-1h-4.1z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M204.3%20278.6h4.1v-1h-4.1z'/%3e%3cpath%20fill='%23c8b100'%20d='M237.6%20223.4h-.3l-.3.4q-.4.3-.8%200l-.1-.4h-.5q-.4-.3-.1-.7v-.5h-.3l-.1.2q-.3.4-.7.2v-.2h-.3c-.5.2-.7-1-.7-1.2l-.2.2s.2.7.1%201.2l-.3%201.2a9%209%200%200%201%202.9%201.6%209%209%200%200%201%202.2%202.3l1.2-.5c.6-.2%201.3-.2%201.3-.2l.2-.2c-.3%200-1.5.1-1.5-.4v-.2h-.2q-.3-.3%200-.7l.2-.1v-.3h-.3l-.2.1q-.4.5-.8%200l-.1-.4h-.5q-.4-.3%200-.8l.2-.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M237.6%20223.4h-.3l-.3.4q-.4.3-.8%200l-.1-.4h-.5q-.4-.3-.1-.7v-.5h-.3l-.1.2q-.3.4-.7.2v-.2h-.3c-.5.2-.7-1-.7-1.2l-.2.2s.2.7.1%201.2l-.3%201.2a9%209%200%200%201%202.9%201.6%209%209%200%200%201%202.2%202.3l1.2-.5c.6-.2%201.3-.2%201.3-.2l.2-.2c-.3%200-1.5.1-1.5-.4v-.2h-.2q-.3-.3%200-.7l.2-.1v-.3h-.3l-.2.1q-.4.5-.8%200l-.1-.4h-.5q-.4-.3%200-.8l.2-.3z'/%3e%3cpath%20d='M235.4%20224h.2v.3h-.1q-.1-.1%200-.2'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.1'%20d='M235.4%20224h.2v.3h-.1q-.1-.1%200-.2z'/%3e%3cpath%20d='m236.3%20224.8-.3-.2v-.2h.1l.4.3.3.2v.2h-.2z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.1'%20d='m236.3%20224.8-.3-.2v-.2h.1l.4.3.3.2v.2h-.2l-.3-.3'/%3e%3cpath%20d='m234.6%20223.7-.2-.2s-.1%200%200-.1l.3.1.3.1v.2h-.1z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.1'%20d='m234.6%20223.7-.2-.2s-.1%200%200-.1l.3.1.3.1v.2h-.1l-.3-.1'/%3e%3cpath%20d='M233.7%20223h.2v.2h-.2s-.1-.1%200-.2'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.1'%20d='M233.7%20223h.2v.2h-.2s-.1-.1%200-.2z'/%3e%3cpath%20d='M237.3%20225.5v-.2h-.3l.1.2z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.1'%20d='M237.3%20225.5v-.2h-.3l.1.2z'/%3e%3cpath%20d='m237.9%20226.2.2.2h.1v-.2l-.2-.2-.2-.2h-.1v.2z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.1'%20d='m237.9%20226.2.2.2h.1v-.2l-.2-.2-.2-.2h-.1v.2l.2.2'/%3e%3cpath%20d='M238.8%20227v-.3h-.3v.2h.3'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.1'%20d='M238.8%20227v-.3h-.3v.2h.3z'/%3e%3cpath%20fill='%23c8b100'%20d='M236.2%20221.1h-.6l-.1.9v.1h.2l.7-.5-.3-.5'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M236.2%20221.1h-.6l-.1.9v.1h.2l.7-.5-.3-.5'/%3e%3cpath%20fill='%23c8b100'%20d='M234.6%20221.6v.5l.9.1h.1v-.2l-.5-.7z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M234.6%20221.6v.5l.9.1h.1v-.2l-.5-.7-.5.3'/%3e%3cpath%20fill='%23c8b100'%20d='m236.4%20222.6-.4.3-.6-.7v-.1h1.1z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m236.4%20222.6-.4.3-.6-.7v-.1h1.1v.5'/%3e%3cpath%20fill='%23c8b100'%20d='M235.3%20222h.4v.3h-.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M235.3%20222h.4v.3h-.3z'/%3e%3cpath%20fill='%23c8b100'%20d='m233.2%20221.1-.2-.7-.4-.4s.4-.2.8.1%200%20.9%200%20.9z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m233.2%20221.1-.2-.7-.4-.4s.4-.2.8.1%200%20.9%200%20.9z'/%3e%3cpath%20fill='%23c8b100'%20d='m234.2%20221.4-.4.4-.6-.6v-.2h1z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m234.2%20221.4-.4.4-.6-.6v-.2h1v.4'/%3e%3cpath%20fill='%23c8b100'%20d='m233.1%20221%20.3-.1v.3q0%20.3-.2.2z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m233.1%20221%20.3-.1v.3q0%20.3-.2.2z'/%3e%3cpath%20fill='%23c8b100'%20d='M238.3%20222.5h-.5l-.3.7v.2h.2l.8-.4z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M238.3%20222.5h-.5l-.3.7v.2h.2l.8-.4-.2-.5'/%3e%3cpath%20fill='%23c8b100'%20d='M236.7%20222.8v.5l.8.2h.1v-.2l-.4-.7z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M236.7%20222.8v.5l.8.2h.1v-.2l-.4-.7-.5.2'/%3e%3cpath%20fill='%23c8b100'%20d='m238.4%20224-.5.2-.4-.7v-.2h.1l.9.2z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m238.4%20224-.5.2-.4-.7v-.2h.1l.9.2-.1.5'/%3e%3cpath%20fill='%23c8b100'%20d='M237.3%20223.2h.4v.4h-.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M237.3%20223.2h.4v.4h-.3z'/%3e%3cpath%20fill='%23c8b100'%20d='m240.2%20224.3.1.5-.8.3h-.2v-.2l.4-.8z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m240.2%20224.3.1.5-.8.3h-.2v-.2l.4-.8.5.2'/%3e%3cpath%20fill='%23c8b100'%20d='m240%20225.8-.5.1-.3-.8v-.1h.2l.8.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m240%20225.8-.5.1-.3-.8v-.1h.2l.8.3-.1.5'/%3e%3cpath%20fill='%23c8b100'%20d='m238.6%20224.3-.2.5.9.3h.1v-.1l-.3-.8z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m238.6%20224.3-.2.5.9.3h.1v-.1l-.3-.8-.5.1'/%3e%3cpath%20fill='%23c8b100'%20d='M239.5%20225.2v-.3h-.4v.3z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M239.5%20225.2v-.3h-.4v.3z'/%3e%3cpath%20fill='%23c8b100'%20d='M240.8%20227h.8l.5.3s.1-.4-.3-.7c-.3-.3-.8.2-.8.2z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M240.8%20227h.8l.5.3s.1-.4-.3-.7c-.3-.3-.8.2-.8.2z'/%3e%3cpath%20fill='%23c8b100'%20d='m240.3%20226.1-.3.5.8.5v-.1h.2l-.1-1z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='m240.3%20226.1-.3.5.8.5v-.1h.2l-.1-1-.6.1'/%3e%3cpath%20fill='%23c8b100'%20d='M241%20227s.1-.1%200-.2h-.3q-.3%200-.1.2z'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.3'%20d='M241%20227s.1-.1%200-.2h-.3q-.3%200-.1.2zm38-21.9v.6h-2.4v-.6h1v-1.3h-.7v-.5h.6v-.6h.6v.6h.6v.6h-.6v1.2h1'/%3e%3cpath%20fill='none'%20d='M134.4%20217.1v-1.2m-.4%201.2v-1.2m-.2%201.2v-1.2m-.3%201.2v-1.2'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.1'%20d='M133.2%20217.1v-1.2m-.5%201.1v-1m.2%201v-1m-.7%201v-1m.2%201v-1m-.9%201v-1m.2%201v-1m.3%201v-1m-.7%201v-1m-.3.9v-.8m-.1.8v-.8m-.5.7v-.6m.2.6v-.6m-.4.5v-.5m-.2.5v-.4m-.3.3v-.3m-.3.3v-.2'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.2'%20d='M129.2%20216.6v-.2'/%3e%3cpath%20fill='none'%20d='M135.7%20217v-1m-.5%201v-1m-.4%201.2V216m143%201.1V216m-.4%201.1V216m-.3%201.1V216m-.3%201.2V216'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.1'%20d='M276.6%20217.1V216m-.6%201v-1m.3%201v-1m-.8%201v-1m.3%201v-1m-.9%201v-1m.2%201v-1m.2%201v-1m-.6%201v-1m-.3.9v-.8m-.2.8v-.8m-.4.7v-.6m.2.6v-.6m-.5.6v-.6m-.2.5v-.4m-.3.4v-.4m-.2.3v-.2'/%3e%3cpath%20fill='none'%20stroke='%23000'%20stroke-width='.2'%20d='M272.6%20216.6v-.2'/%3e%3cpath%20fill='none'%20d='M279.1%20217v-1m-.6%201v-1m-.4%201.1V216'/%3e%3c/svg%3e";
const FLAG_MAP = {
en: flagUS,
"zh-Hans": flagCN,
ar: flagSA,
ja: flagJP,
ko: flagKR,
fr: flagFR,
de: flagDE,
hi: flagIN,
pt: flagPT,
ru: flagRU,
es: flagES
};
function LanguageSelector({
dropdownClasses = "",
btnClasses = "btn-ghost",
contentClasses = "mt-16"
}) {
const { t, i18n } = useTranslation();
const currentLang = signals.useSignal(appOptionsManager.get("language") || i18n.language || "en");
hooks.useEffect(() => {
const onLng = (lng) => {
currentLang.value = lng || appOptionsManager.get("language") || "en";
};
i18n.on("languageChanged", onLng);
const unsub = appOptionsManager.signal.subscribe(() => {
const optLng = appOptionsManager.get("language");
if (optLng && optLng !== currentLang.value) currentLang.value = optLng;
});
return () => {
try {
i18n.off("languageChanged", onLng);
} catch {
}
try {
unsub?.();
} catch {
}
};
}, []);
const setLanguage = (code) => {
currentLang.value = code;
appOptionsManager.set("language", code);
i18n.changeLanguage(code);
};
const currentLabel = LANGUAGES_CONFIG[currentLang.value]?.nameEn || currentLang.value;
const currentFlag = FLAG_MAP[currentLang.value] || flagUS;
return u("div", { class: cx("dropdown dropdown-end block", dropdownClasses), children: [
u(
"div",
{
tabIndex: 0,
role: "button",
class: cx("btn group btn-sm gap-1.5 px-1.5 justify-start", btnClasses),
"aria-label": t("Change Language"),
children: [
u("div", { class: "w-5 flex items-center justify-center", children: u("img", { src: currentFlag, alt: "", class: "h-3 w-4 rounded-sm object-cover border border-base-content/10 bg-base-100" }) }),
u("div", { class: "w-24 truncate text-xs text-left", children: currentLabel }),
u(
"svg",
{
width: "12px",
height: "12px",
class: "mt-px hidden size-2 fill-current opacity-60 sm:inline-block ml-auto",
xmlns: "http://www.w3.org/2000/svg",
viewBox: "0 0 2048 2048",
children: u("path", { d: "M1799 349l242 241-1017 1017L7 590l242-241 775 775 775-775z" })
}
)
]
}
),
u(
"div",
{
tabIndex: 0,
class: cx(
"dropdown-content bg-base-200 text-base-content rounded-box mt-2 max-h-60 overflow-y-auto border-[length:var(--border)] border-white/5 shadow-2xl outline-[length:var(--border)] outline-black/5",
contentClasses
),
children: u("ul", { class: "menu w-64", children: [
u("li", { class: "menu-title text-xs", children: t("Change Language") }),
Object.entries(LANGUAGES_CONFIG).map(([langTag, langConf]) => u("li", { children: u(
"button",
{
class: cx("gap-3 px-2", currentLang.value === langTag && "[&_svg]:visible"),
onClick: () => setLanguage(langTag),
children: [
u("img", { src: FLAG_MAP[langTag] || flagUS, alt: "", class: "h-3 w-4 rounded-sm object-cover border border-base-content/10 bg-base-100" }),
u("div", { class: "flex-1 min-w-0 truncate", children: langConf.nameEn }),
u(
"svg",
{
xmlns: "http://www.w3.org/2000/svg",
width: "16",
height: "16",
viewBox: "0 0 24 24",
fill: "currentColor",
class: "invisible h-3 w-3 shrink-0",
children: u("path", { d: "M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z" })
}
)
]
}
) }, langTag))
] })
}
)
] });
}
var localizedFormat$2 = { exports: {} };
var localizedFormat$1 = localizedFormat$2.exports;
var hasRequiredLocalizedFormat;
function requireLocalizedFormat() {
if (hasRequiredLocalizedFormat) return localizedFormat$2.exports;
hasRequiredLocalizedFormat = 1;
(function(module, exports) {
!(function(e, t) {
module.exports = t();
})(localizedFormat$1, (function() {
var e = { LTS: "h:mm:ss A", LT: "h:mm A", L: "MM/DD/YYYY", LL: "MMMM D, YYYY", LLL: "MMMM D, YYYY h:mm A", LLLL: "dddd, MMMM D, YYYY h:mm A" };
return function(t, o, n) {
var r = o.prototype, i = r.format;
n.en.formats = e, r.format = function(t2) {
void 0 === t2 && (t2 = "YYYY-MM-DDTHH:mm:ssZ");
var o2 = this.$locale().formats, n2 = (function(t3, o3) {
return t3.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g, (function(t4, n3, r2) {
var i2 = r2 && r2.toUpperCase();
return n3 || o3[r2] || e[r2] || o3[i2].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, (function(e2, t5, o4) {
return t5 || o4.slice(1);
}));
}));
})(t2, void 0 === o2 ? {} : o2);
return i.call(this, n2);
};
};
}));
})(localizedFormat$2);
return localizedFormat$2.exports;
}
var localizedFormatExports = requireLocalizedFormat();
const localizedFormat = getDefaultExportFromCjs(localizedFormatExports);
dayjs.extend(localizedFormat);
function GlobalSettingsModal({ isOpen, onClose }) {
const { t, i18n } = useTranslation();
const isArabic = (i18n.language || "").startsWith("ar");
const showResetConfirm = signals.useSignal(false);
const now = dayjs();
const dateExamples = [
{ token: "YYYY-MM-DD", value: now.format("YYYY-MM-DD"), localized: false },
{ token: "DD/MM/YYYY", value: now.format("DD/MM/YYYY"), localized: false },
{ token: "MMM DD, YYYY", value: now.format("MMM DD, YYYY"), localized: false },
{ token: "L", value: now.format("L"), localized: true },
{ token: "LL", value: now.format("LL"), localized: true }
];
const timeExamples = [
{ token: "HH:mm:ss", value: now.format("HH:mm:ss"), localized: false },
{ token: "hh:mm A", value: now.format("hh:mm A"), localized: false },
{ token: "LT", value: now.format("LT"), localized: true },
{ token: "LTS", value: now.format("LTS"), localized: true }
];
const combinedExamples = [
{ token: "YYYY-MM-DD HH:mm:ss Z", value: now.format("YYYY-MM-DD HH:mm:ss Z"), localized: false },
{ token: "MMM DD, YYYY [at] hh:mm A", value: now.format("MMM DD, YYYY [at] hh:mm A"), localized: false },
{ token: "LLL", value: now.format("LLL"), localized: true }
];
return u(
Modal,
{
show: isOpen,
onClose,
title: t("Global Settings"),
actions: u(
"button",
{
class: "btn btn-sm btn-circle btn-ghost",
onClick: () => showResetConfirm.value = true,
children: u(IconRestore, { size: 16 })
}
),
children: [
u("div", { class: "space-y-4", children: [
u("div", { class: "flex justify-between items-center", children: [
u("span", { class: "text-sm", children: t("Theme") }),
u(
ThemeSelector,
{
dropdownClasses: "",
btnClasses: "btn-sm",
contentClasses: "mt-2"
}
)
] }),
u("div", { class: "flex justify-between items-center", children: [
u("span", { class: "text-sm", children: t("Language") }),
u(
LanguageSelector,
{
dropdownClasses: "",
btnClasses: "btn-sm",
contentClasses: "mt-2"
}
)
] }),
u("div", { class: "flex justify-between items-center", children: [
u("div", { class: "flex items-center", children: u("span", { class: "text-sm", children: t("Date Time Format") }) }),
u(
"input",
{
type: "text",
class: "input input-bordered input-sm w-52",
value: appOptionsManager.get("dateTimeFormat"),
onChange: (e) => {
appOptionsManager.set("dateTimeFormat", e.target?.value);
}
}
)
] }),
u("div", { class: "flex justify-between items-center", children: [
u("span", { class: "text-sm", children: t("Debug") }),
u(
"input",
{
type: "checkbox",
class: "toggle toggle-primary",
checked: appOptionsManager.get("debug"),
onChange: (e) => {
appOptionsManager.set("debug", e.target?.checked);
}
}
)
] }),
u("div", { class: `mt-1 rounded-box bg-base-200 p-2 text-xs relative ${isArabic ? "text-right" : ""}`, dir: isArabic ? "rtl" : void 0, children: [
u("div", { class: "font-semibold mb-2", children: t("Common Formats:") }),
u(
"a",
{
href: "https://day.js.org/docs/en/display/format",
target: "_blank",
rel: "noopener noreferrer",
class: `absolute ${isArabic ? "left-2" : "right-2"} top-2 cursor-pointer opacity-70 hover:opacity-100`,
children: u(IconBook, { size: 14 })
}
),
u("div", { class: "grid gap-3 sm:grid-cols-2", children: [
u("div", { children: [
u("div", { class: "font-medium mb-1", children: t("Date Formats:") }),
u("ul", { class: "space-y-1.5", children: dateExamples.map((ex) => u("li", { class: "flex items-center gap-2.5", children: [
u("span", { class: "font-mono px-2 py-0.5 rounded border border-base-300 bg-base-200/70 text-base-content/90", dir: "ltr", children: ex.token }),
u("span", { class: "opacity-60", children: isArabic ? "←" : "→" }),
u("span", { dir: "ltr", children: ex.value }),
ex.localized ? u("span", { class: "opacity-60", children: [
" (",
t("Localized"),
")"
] }) : null
] }, ex.token)) })
] }),
u("div", { children: [
u("div", { class: "font-medium mb-1", children: t("Time Formats:") }),
u("ul", { class: "space-y-1.5", children: timeExamples.map((ex) => u("li", { class: "flex items-center gap-2.5", children: [
u("span", { class: "font-mono px-2 py-0.5 rounded border border-base-300 bg-base-200/70 text-base-content/90", dir: "ltr", children: ex.token }),
u("span", { class: "opacity-60", children: isArabic ? "←" : "→" }),
u("span", { dir: "ltr", children: ex.value }),
ex.localized ? u("span", { class: "opacity-60", children: [
" (",
t("Localized"),
")"
] }) : null
] }, ex.token)) })
] })
] }),
u("div", { class: "divider my-2" }),
u("div", { children: [
u("div", { class: "font-medium mb-1", children: t("Combined Examples:") }),
u("ul", { class: "space-y-1.5", children: combinedExamples.map((ex) => u("li", { class: "flex items-center gap-2.5", children: [
u("span", { class: "font-mono px-2 py-0.5 rounded border border-base-300 bg-base-200/70 text-base-content/90", dir: "ltr", children: ex.token }),
u("span", { class: "opacity-60", children: isArabic ? "←" : "→" }),
u("span", { class: "break-all", dir: "ltr", children: ex.value }),
ex.localized ? u("span", { class: "opacity-60", children: [
" (",
t("Localized"),
")"
] }) : null
] }, ex.token)) })
] })
] })
] }),
u("div", { class: `rounded-box bg-base-200 p-2 text-xs mt-3 flex items-center justify-between ${isArabic ? "flex-row-reverse" : ""}`, children: [
u("div", { children: [
u("span", { class: "font-semibold", children: [
t("Version"),
":"
] }),
" ",
u("span", { class: "opacity-80", children: pkg.version })
] }),
u("div", { class: "flex items-center gap-4", children: [
typeof GM_info !== "undefined" && GM_info?.scriptHandler ? u(
"a",
{
class: "flex items-center gap-1 opacity-80 hover:opacity-100",
href: "https://chromewebstore.google.com/detail/aboccmnimgpjehlplnanplbhlccohhhn",
target: "_blank",
rel: "noopener noreferrer",
children: [
u(IconBrandChrome, { size: 14 }),
" ",
t("Chrome")
]
}
) : u(
"a",
{
class: "flex items-center gap-1 opacity-80 hover:opacity-100",
href: "https://greasyfork.org/en/scripts/551198",
target: "_blank",
rel: "noopener noreferrer",
children: [
u(IconFileCode, { size: 14 }),
" ",
t("Userscript")
]
}
),
u(
"a",
{
class: "flex items-center gap-1 opacity-80 hover:opacity-100",
href: "https://xbatch.online",
target: "_blank",
rel: "noopener noreferrer",
children: [
u(IconWorld, { size: 14 }),
" ",
t("Website")
]
}
),
u(
"a",
{
class: "flex items-center gap-1 opacity-80 hover:opacity-100",
href: "https://patreon.com/exyezed",
target: "_blank",
rel: "noopener noreferrer",
children: [
u(IconBrandPatreon, { size: 14 }),
" ",
t("Patreon")
]
}
)
] })
] }),
u(Modal, { show: showResetConfirm.value, onClose: () => showResetConfirm.value = false, title: t("Reset Settings"), class: "max-w-sm", children: u("div", { class: "space-y-2", children: [
u("p", { class: `text-sm${isArabic ? " text-right" : ""}`, dir: isArabic ? "rtl" : void 0, children: t("Are you sure you want to reset settings to defaults?") }),
u("div", { class: "modal-action", children: [
u("button", { class: "btn btn-sm btn-ghost", onClick: () => showResetConfirm.value = false, children: t("Cancel") }),
u(
"button",
{
class: "btn btn-sm btn-warning",
onClick: () => {
appOptionsManager.set("theme", "light");
appOptionsManager.set("language", "en");
appOptionsManager.set("debug", false);
appOptionsManager.set("dateTimeFormat", "YYYY-MM-DD HH:mm:ss Z");
appOptionsManager.set("fetchMode", "single");
appOptionsManager.set("batchSize", 100);
appOptionsManager.set("startingBatch", 0);
appOptionsManager.set("timelineType", "media");
appOptionsManager.set("mediaType", "all");
appOptionsManager.set("convertAnimatedGifs", false);
appOptionsManager.set("convertGifsExternal", false);
appOptionsManager.set("downloadConcurrency", 1);
i18n.changeLanguage("en");
showResetConfirm.value = false;
},
children: u("span", { class: "flex items-center gap-2", children: [
u(IconRestore, { size: 16 }),
t("Reset")
] })
}
)
] })
] }) })
]
}
);
}
function MediaDownloaderModal({ isOpen, onClose }) {
const { t } = useTranslation();
const activeTab = signals.useSignal("dashboard");
const showGlobalSettings = signals.useSignal(false);
const loadFromDatabaseUsername = signals.useSignal("");
hooks.useEffect(() => {
(async () => {
try {
const n = await mediaDownloaderDB.getAccountsCount();
dbState.totalAccounts.value = n;
} catch {
}
})();
}, []);
if (!isOpen) return null;
const tabs = [
{ id: "dashboard", label: t("Dashboard") },
{ id: "auth", label: t("Auth") },
{ id: "settings", label: t("Settings") },
{ id: "database", label: t("Database") }
];
return u("div", { class: "modal modal-open", children: [
u("div", { class: "modal-box transition-all duration-300 ease-in-out", children: [
u("div", { class: "flex items-center justify-between mb-4", children: [
u(Title, {}),
u("div", { class: "flex items-center gap-2", children: [
u(
"button",
{
class: "btn btn-sm btn-circle btn-ghost",
onClick: () => showGlobalSettings.value = true,
children: u(IconSettings, { size: 18 })
}
),
u(
"button",
{
class: "btn btn-sm btn-circle btn-ghost",
onClick: onClose,
children: u(IconX, { size: 18 })
}
)
] })
] }),
u("div", { role: "tablist", class: "tabs tabs-lift mb-4", children: tabs.map((tab) => {
const isActive = activeTab.value === tab.id;
const isDatabase = tab.id === "database";
const cls = `tab ${isActive ? "tab-active" : ""} ${isDatabase ? "relative" : ""}`;
return u(
"a",
{
role: "tab",
class: cls,
onClick: () => activeTab.value = tab.id,
children: [
tab.label,
isDatabase && dbState.totalAccounts.value > 0 && u("span", { class: "badge badge-accent badge-sm absolute -top-2 -right-2", children: dbState.totalAccounts.value })
]
},
tab.id
);
}) }),
u("div", { class: "flex-1 transition-[height,max-height] duration-300 ease-in-out", children: [
u("div", { class: activeTab.value === "dashboard" ? "block" : "hidden", children: u(
Dashboard,
{
loadFromDatabaseUsername
}
) }),
u("div", { class: activeTab.value === "database" ? "block" : "hidden", children: u(
Database,
{
isVisible: activeTab.value === "database",
onLoadToDashboard: (username) => {
loadFromDatabaseUsername.value = username;
activeTab.value = "dashboard";
}
}
) }),
u("div", { class: activeTab.value === "auth" ? "block" : "hidden", children: u(Auth, {}) }),
u("div", { class: activeTab.value === "settings" ? "block" : "hidden", children: u(Settings, {}) })
] })
] }),
u("div", { class: "modal-backdrop", onClick: onClose }),
u(
GlobalSettingsModal,
{
isOpen: showGlobalSettings.value,
onClose: () => showGlobalSettings.value = false
}
)
] });
}
function MediaDownloaderApp() {
useTranslation();
const currentTheme = signals.useSignal(appOptionsManager.get("theme"));
const showMediaDownloader = signals.useSignal(false);
const toggleMediaDownloader = () => {
showMediaDownloader.value = !showMediaDownloader.value;
};
appOptionsManager.signal.subscribe(() => {
currentTheme.value = appOptionsManager.get("theme");
});
return u(preact.Fragment, { children: [
u("style", { children: `
@keyframes sparkle {
0%, 100% { filter: drop-shadow(0 0 8px rgba(29, 155, 240, 0.8)) drop-shadow(0 0 16px rgba(29, 155, 240, 0.6)); }
50% { filter: drop-shadow(0 0 12px rgba(29, 155, 240, 1)) drop-shadow(0 0 20px rgba(29, 155, 240, 0.8)) drop-shadow(0 0 28px rgba(29, 155, 240, 0.6)); }
}
.sparkle-icon {
animation: sparkle 2s ease-in-out infinite;
}
` }),
u(
"div",
{
onClick: toggleMediaDownloader,
class: `sparkle-icon fixed top-[50%] left-[-15px] cursor-pointer transition-all duration-300 z-50 ${showMediaDownloader.value ? "translate-x-[15px] rotate-[15deg]" : ""} hover:translate-x-[15px] hover:rotate-[15deg]`,
children: [
u(IconBrandTwitter, { size: 48, "stroke-width": 1.25, class: "text-white" }),
dashboardState.isDownloading.value && !showMediaDownloader.value && u("div", { class: "absolute -bottom-1 -right-1 flex items-center justify-center", children: u(
"div",
{
class: "radial-progress text-info bg-base-100",
style: `--value:${dashboardState.downloadProgress.value}; --size:2rem; --thickness:4px;`,
role: "progressbar",
"aria-valuenow": Math.round(dashboardState.downloadProgress.value),
children: u("span", { class: "text-[10px] font-bold", children: Math.round(dashboardState.downloadProgress.value) })
}
) })
]
}
),
u("div", { "data-theme": currentTheme.value, children: [
u(ErrorBoundary, { children: u(
MediaDownloaderModal,
{
isOpen: showMediaDownloader.value,
onClose: () => showMediaDownloader.value = false
}
) }),
u("div", { id: "tmd-portal-root" })
] })
] });
}
const styles = `/*! tailwindcss v4.1.14 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--leading-normal:1.5;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-in-out:cubic-bezier(.4,0,.2,1);--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:where(:root),:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(45% .24 277.023);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}@media (prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(58% .233 277.117);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}}:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(45% .24 277.023);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=dark]:checked),[data-theme=dark]{color-scheme:dark;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(58% .233 277.117);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=cupcake]:checked),[data-theme=cupcake]{color-scheme:light;--color-base-100:oklch(97.788% .004 56.375);--color-base-200:oklch(93.982% .007 61.449);--color-base-300:oklch(91.586% .006 53.44);--color-base-content:oklch(23.574% .066 313.189);--color-primary:oklch(85% .138 181.071);--color-primary-content:oklch(43% .078 188.216);--color-secondary:oklch(89% .061 343.231);--color-secondary-content:oklch(45% .187 3.815);--color-accent:oklch(90% .076 70.697);--color-accent-content:oklch(47% .157 37.304);--color-neutral:oklch(27% .006 286.033);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(68% .169 237.323);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(69% .17 162.48);--color-success-content:oklch(26% .051 172.552);--color-warning:oklch(79% .184 86.047);--color-warning-content:oklch(28% .066 53.813);--color-error:oklch(64% .246 16.439);--color-error-content:oklch(27% .105 12.094);--radius-selector:1rem;--radius-field:2rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:2px;--depth:1;--noise:0}:root:has(input.theme-controller[value=bumblebee]:checked),[data-theme=bumblebee]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(97% 0 0);--color-base-300:oklch(92% 0 0);--color-base-content:oklch(20% 0 0);--color-primary:oklch(85% .199 91.936);--color-primary-content:oklch(42% .095 57.708);--color-secondary:oklch(75% .183 55.934);--color-secondary-content:oklch(40% .123 38.172);--color-accent:oklch(0% 0 0);--color-accent-content:oklch(100% 0 0);--color-neutral:oklch(37% .01 67.558);--color-neutral-content:oklch(92% .003 48.717);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(39% .09 240.876);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(70% .191 22.216);--color-error-content:oklch(39% .141 25.723);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=emerald]:checked),[data-theme=emerald]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(93% 0 0);--color-base-300:oklch(86% 0 0);--color-base-content:oklch(35.519% .032 262.988);--color-primary:oklch(76.662% .135 153.45);--color-primary-content:oklch(33.387% .04 162.24);--color-secondary:oklch(61.302% .202 261.294);--color-secondary-content:oklch(100% 0 0);--color-accent:oklch(72.772% .149 33.2);--color-accent-content:oklch(0% 0 0);--color-neutral:oklch(35.519% .032 262.988);--color-neutral-content:oklch(98.462% .001 247.838);--color-info:oklch(72.06% .191 231.6);--color-info-content:oklch(0% 0 0);--color-success:oklch(64.8% .15 160);--color-success-content:oklch(0% 0 0);--color-warning:oklch(84.71% .199 83.87);--color-warning-content:oklch(0% 0 0);--color-error:oklch(71.76% .221 22.18);--color-error-content:oklch(0% 0 0);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=corporate]:checked),[data-theme=corporate]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(93% 0 0);--color-base-300:oklch(86% 0 0);--color-base-content:oklch(22.389% .031 278.072);--color-primary:oklch(58% .158 241.966);--color-primary-content:oklch(100% 0 0);--color-secondary:oklch(55% .046 257.417);--color-secondary-content:oklch(100% 0 0);--color-accent:oklch(60% .118 184.704);--color-accent-content:oklch(100% 0 0);--color-neutral:oklch(0% 0 0);--color-neutral-content:oklch(100% 0 0);--color-info:oklch(60% .126 221.723);--color-info-content:oklch(100% 0 0);--color-success:oklch(62% .194 149.214);--color-success-content:oklch(100% 0 0);--color-warning:oklch(85% .199 91.936);--color-warning-content:oklch(0% 0 0);--color-error:oklch(70% .191 22.216);--color-error-content:oklch(0% 0 0);--radius-selector:.25rem;--radius-field:.25rem;--radius-box:.25rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=synthwave]:checked),[data-theme=synthwave]{color-scheme:dark;--color-base-100:oklch(15% .09 281.288);--color-base-200:oklch(20% .09 281.288);--color-base-300:oklch(25% .09 281.288);--color-base-content:oklch(78% .115 274.713);--color-primary:oklch(71% .202 349.761);--color-primary-content:oklch(28% .109 3.907);--color-secondary:oklch(82% .111 230.318);--color-secondary-content:oklch(29% .066 243.157);--color-accent:oklch(75% .183 55.934);--color-accent-content:oklch(26% .079 36.259);--color-neutral:oklch(45% .24 277.023);--color-neutral-content:oklch(87% .065 274.039);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(77% .152 181.912);--color-success-content:oklch(27% .046 192.524);--color-warning:oklch(90% .182 98.111);--color-warning-content:oklch(42% .095 57.708);--color-error:oklch(73.7% .121 32.639);--color-error-content:oklch(23.501% .096 290.329);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=retro]:checked),[data-theme=retro]{color-scheme:light;--color-base-100:oklch(91.637% .034 90.515);--color-base-200:oklch(88.272% .049 91.774);--color-base-300:oklch(84.133% .065 90.856);--color-base-content:oklch(41% .112 45.904);--color-primary:oklch(80% .114 19.571);--color-primary-content:oklch(39% .141 25.723);--color-secondary:oklch(92% .084 155.995);--color-secondary-content:oklch(44% .119 151.328);--color-accent:oklch(68% .162 75.834);--color-accent-content:oklch(41% .112 45.904);--color-neutral:oklch(44% .011 73.639);--color-neutral-content:oklch(86% .005 56.366);--color-info:oklch(58% .158 241.966);--color-info-content:oklch(96% .059 95.617);--color-success:oklch(51% .096 186.391);--color-success-content:oklch(96% .059 95.617);--color-warning:oklch(64% .222 41.116);--color-warning-content:oklch(96% .059 95.617);--color-error:oklch(70% .191 22.216);--color-error-content:oklch(40% .123 38.172);--radius-selector:.25rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=cyberpunk]:checked),[data-theme=cyberpunk]{color-scheme:light;--color-base-100:oklch(94.51% .179 104.32);--color-base-200:oklch(91.51% .179 104.32);--color-base-300:oklch(85.51% .179 104.32);--color-base-content:oklch(0% 0 0);--color-primary:oklch(74.22% .209 6.35);--color-primary-content:oklch(14.844% .041 6.35);--color-secondary:oklch(83.33% .184 204.72);--color-secondary-content:oklch(16.666% .036 204.72);--color-accent:oklch(71.86% .217 310.43);--color-accent-content:oklch(14.372% .043 310.43);--color-neutral:oklch(23.04% .065 269.31);--color-neutral-content:oklch(94.51% .179 104.32);--color-info:oklch(72.06% .191 231.6);--color-info-content:oklch(0% 0 0);--color-success:oklch(64.8% .15 160);--color-success-content:oklch(0% 0 0);--color-warning:oklch(84.71% .199 83.87);--color-warning-content:oklch(0% 0 0);--color-error:oklch(71.76% .221 22.18);--color-error-content:oklch(0% 0 0);--radius-selector:0rem;--radius-field:0rem;--radius-box:0rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=valentine]:checked),[data-theme=valentine]{color-scheme:light;--color-base-100:oklch(97% .014 343.198);--color-base-200:oklch(94% .028 342.258);--color-base-300:oklch(89% .061 343.231);--color-base-content:oklch(52% .223 3.958);--color-primary:oklch(65% .241 354.308);--color-primary-content:oklch(100% 0 0);--color-secondary:oklch(62% .265 303.9);--color-secondary-content:oklch(97% .014 308.299);--color-accent:oklch(82% .111 230.318);--color-accent-content:oklch(39% .09 240.876);--color-neutral:oklch(40% .153 2.432);--color-neutral-content:oklch(89% .061 343.231);--color-info:oklch(86% .127 207.078);--color-info-content:oklch(44% .11 240.79);--color-success:oklch(84% .143 164.978);--color-success-content:oklch(43% .095 166.913);--color-warning:oklch(75% .183 55.934);--color-warning-content:oklch(26% .079 36.259);--color-error:oklch(63% .237 25.331);--color-error-content:oklch(97% .013 17.38);--radius-selector:1rem;--radius-field:2rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=halloween]:checked),[data-theme=halloween]{color-scheme:dark;--color-base-100:oklch(21% .006 56.043);--color-base-200:oklch(14% .004 49.25);--color-base-300:oklch(0% 0 0);--color-base-content:oklch(84.955% 0 0);--color-primary:oklch(77.48% .204 60.62);--color-primary-content:oklch(19.693% .004 196.779);--color-secondary:oklch(45.98% .248 305.03);--color-secondary-content:oklch(89.196% .049 305.03);--color-accent:oklch(64.8% .223 136.073);--color-accent-content:oklch(0% 0 0);--color-neutral:oklch(24.371% .046 65.681);--color-neutral-content:oklch(84.874% .009 65.681);--color-info:oklch(54.615% .215 262.88);--color-info-content:oklch(90.923% .043 262.88);--color-success:oklch(62.705% .169 149.213);--color-success-content:oklch(12.541% .033 149.213);--color-warning:oklch(66.584% .157 58.318);--color-warning-content:oklch(13.316% .031 58.318);--color-error:oklch(65.72% .199 27.33);--color-error-content:oklch(13.144% .039 27.33);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=garden]:checked),[data-theme=garden]{color-scheme:light;--color-base-100:oklch(92.951% .002 17.197);--color-base-200:oklch(86.445% .002 17.197);--color-base-300:oklch(79.938% .001 17.197);--color-base-content:oklch(16.961% .001 17.32);--color-primary:oklch(62.45% .278 3.836);--color-primary-content:oklch(100% 0 0);--color-secondary:oklch(48.495% .11 355.095);--color-secondary-content:oklch(89.699% .022 355.095);--color-accent:oklch(56.273% .054 154.39);--color-accent-content:oklch(100% 0 0);--color-neutral:oklch(24.155% .049 89.07);--color-neutral-content:oklch(92.951% .002 17.197);--color-info:oklch(72.06% .191 231.6);--color-info-content:oklch(0% 0 0);--color-success:oklch(64.8% .15 160);--color-success-content:oklch(0% 0 0);--color-warning:oklch(84.71% .199 83.87);--color-warning-content:oklch(0% 0 0);--color-error:oklch(71.76% .221 22.18);--color-error-content:oklch(0% 0 0);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=forest]:checked),[data-theme=forest]{color-scheme:dark;--color-base-100:oklch(20.84% .008 17.911);--color-base-200:oklch(18.522% .007 17.911);--color-base-300:oklch(16.203% .007 17.911);--color-base-content:oklch(83.768% .001 17.911);--color-primary:oklch(68.628% .185 148.958);--color-primary-content:oklch(0% 0 0);--color-secondary:oklch(69.776% .135 168.327);--color-secondary-content:oklch(13.955% .027 168.327);--color-accent:oklch(70.628% .119 185.713);--color-accent-content:oklch(14.125% .023 185.713);--color-neutral:oklch(30.698% .039 171.364);--color-neutral-content:oklch(86.139% .007 171.364);--color-info:oklch(72.06% .191 231.6);--color-info-content:oklch(0% 0 0);--color-success:oklch(64.8% .15 160);--color-success-content:oklch(0% 0 0);--color-warning:oklch(84.71% .199 83.87);--color-warning-content:oklch(0% 0 0);--color-error:oklch(71.76% .221 22.18);--color-error-content:oklch(0% 0 0);--radius-selector:1rem;--radius-field:2rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=aqua]:checked),[data-theme=aqua]{color-scheme:dark;--color-base-100:oklch(37% .146 265.522);--color-base-200:oklch(28% .091 267.935);--color-base-300:oklch(22% .091 267.935);--color-base-content:oklch(90% .058 230.902);--color-primary:oklch(85.661% .144 198.645);--color-primary-content:oklch(40.124% .068 197.603);--color-secondary:oklch(60.682% .108 309.782);--color-secondary-content:oklch(96% .016 293.756);--color-accent:oklch(93.426% .102 94.555);--color-accent-content:oklch(18.685% .02 94.555);--color-neutral:oklch(27% .146 265.522);--color-neutral-content:oklch(80% .146 265.522);--color-info:oklch(54.615% .215 262.88);--color-info-content:oklch(90.923% .043 262.88);--color-success:oklch(62.705% .169 149.213);--color-success-content:oklch(12.541% .033 149.213);--color-warning:oklch(66.584% .157 58.318);--color-warning-content:oklch(27% .077 45.635);--color-error:oklch(73.95% .19 27.33);--color-error-content:oklch(14.79% .038 27.33);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=lofi]:checked),[data-theme=lofi]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(97% 0 0);--color-base-300:oklch(94% 0 0);--color-base-content:oklch(0% 0 0);--color-primary:oklch(15.906% 0 0);--color-primary-content:oklch(100% 0 0);--color-secondary:oklch(21.455% .001 17.278);--color-secondary-content:oklch(100% 0 0);--color-accent:oklch(26.861% 0 0);--color-accent-content:oklch(100% 0 0);--color-neutral:oklch(0% 0 0);--color-neutral-content:oklch(100% 0 0);--color-info:oklch(79.54% .103 205.9);--color-info-content:oklch(15.908% .02 205.9);--color-success:oklch(90.13% .153 164.14);--color-success-content:oklch(18.026% .03 164.14);--color-warning:oklch(88.37% .135 79.94);--color-warning-content:oklch(17.674% .027 79.94);--color-error:oklch(78.66% .15 28.47);--color-error-content:oklch(15.732% .03 28.47);--radius-selector:2rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=pastel]:checked),[data-theme=pastel]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98.462% .001 247.838);--color-base-300:oklch(92.462% .001 247.838);--color-base-content:oklch(20% 0 0);--color-primary:oklch(90% .063 306.703);--color-primary-content:oklch(49% .265 301.924);--color-secondary:oklch(89% .058 10.001);--color-secondary-content:oklch(51% .222 16.935);--color-accent:oklch(90% .093 164.15);--color-accent-content:oklch(50% .118 165.612);--color-neutral:oklch(55% .046 257.417);--color-neutral-content:oklch(92% .013 255.508);--color-info:oklch(86% .127 207.078);--color-info-content:oklch(52% .105 223.128);--color-success:oklch(87% .15 154.449);--color-success-content:oklch(52% .154 150.069);--color-warning:oklch(83% .128 66.29);--color-warning-content:oklch(55% .195 38.402);--color-error:oklch(80% .114 19.571);--color-error-content:oklch(50% .213 27.518);--radius-selector:1rem;--radius-field:2rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:2px;--depth:0;--noise:0}:root:has(input.theme-controller[value=fantasy]:checked),[data-theme=fantasy]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(93% 0 0);--color-base-300:oklch(86% 0 0);--color-base-content:oklch(27.807% .029 256.847);--color-primary:oklch(37.45% .189 325.02);--color-primary-content:oklch(87.49% .037 325.02);--color-secondary:oklch(53.92% .162 241.36);--color-secondary-content:oklch(90.784% .032 241.36);--color-accent:oklch(75.98% .204 56.72);--color-accent-content:oklch(15.196% .04 56.72);--color-neutral:oklch(27.807% .029 256.847);--color-neutral-content:oklch(85.561% .005 256.847);--color-info:oklch(72.06% .191 231.6);--color-info-content:oklch(0% 0 0);--color-success:oklch(64.8% .15 160);--color-success-content:oklch(0% 0 0);--color-warning:oklch(84.71% .199 83.87);--color-warning-content:oklch(0% 0 0);--color-error:oklch(71.76% .221 22.18);--color-error-content:oklch(0% 0 0);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=wireframe]:checked),[data-theme=wireframe]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(97% 0 0);--color-base-300:oklch(94% 0 0);--color-base-content:oklch(20% 0 0);--color-primary:oklch(87% 0 0);--color-primary-content:oklch(26% 0 0);--color-secondary:oklch(87% 0 0);--color-secondary-content:oklch(26% 0 0);--color-accent:oklch(87% 0 0);--color-accent-content:oklch(26% 0 0);--color-neutral:oklch(87% 0 0);--color-neutral-content:oklch(26% 0 0);--color-info:oklch(44% .11 240.79);--color-info-content:oklch(90% .058 230.902);--color-success:oklch(43% .095 166.913);--color-success-content:oklch(90% .093 164.15);--color-warning:oklch(47% .137 46.201);--color-warning-content:oklch(92% .12 95.746);--color-error:oklch(44% .177 26.899);--color-error-content:oklch(88% .062 18.334);--radius-selector:0rem;--radius-field:.25rem;--radius-box:.25rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=black]:checked),[data-theme=black]{color-scheme:dark;--color-base-100:oklch(0% 0 0);--color-base-200:oklch(19% 0 0);--color-base-300:oklch(22% 0 0);--color-base-content:oklch(87.609% 0 0);--color-primary:oklch(35% 0 0);--color-primary-content:oklch(100% 0 0);--color-secondary:oklch(35% 0 0);--color-secondary-content:oklch(100% 0 0);--color-accent:oklch(35% 0 0);--color-accent-content:oklch(100% 0 0);--color-neutral:oklch(35% 0 0);--color-neutral-content:oklch(100% 0 0);--color-info:oklch(45.201% .313 264.052);--color-info-content:oklch(89.04% .062 264.052);--color-success:oklch(51.975% .176 142.495);--color-success-content:oklch(90.395% .035 142.495);--color-warning:oklch(96.798% .211 109.769);--color-warning-content:oklch(19.359% .042 109.769);--color-error:oklch(62.795% .257 29.233);--color-error-content:oklch(12.559% .051 29.233);--radius-selector:0rem;--radius-field:0rem;--radius-box:0rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=luxury]:checked),[data-theme=luxury]{color-scheme:dark;--color-base-100:oklch(14.076% .004 285.822);--color-base-200:oklch(20.219% .004 308.229);--color-base-300:oklch(23.219% .004 308.229);--color-base-content:oklch(75.687% .123 76.89);--color-primary:oklch(100% 0 0);--color-primary-content:oklch(20% 0 0);--color-secondary:oklch(27.581% .064 261.069);--color-secondary-content:oklch(85.516% .012 261.069);--color-accent:oklch(36.674% .051 338.825);--color-accent-content:oklch(87.334% .01 338.825);--color-neutral:oklch(24.27% .057 59.825);--color-neutral-content:oklch(93.203% .089 90.861);--color-info:oklch(79.061% .121 237.133);--color-info-content:oklch(15.812% .024 237.133);--color-success:oklch(78.119% .192 132.154);--color-success-content:oklch(15.623% .038 132.154);--color-warning:oklch(86.127% .136 102.891);--color-warning-content:oklch(17.225% .027 102.891);--color-error:oklch(71.753% .176 22.568);--color-error-content:oklch(14.35% .035 22.568);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=dracula]:checked),[data-theme=dracula]{color-scheme:dark;--color-base-100:oklch(28.822% .022 277.508);--color-base-200:oklch(26.805% .02 277.508);--color-base-300:oklch(24.787% .019 277.508);--color-base-content:oklch(97.747% .007 106.545);--color-primary:oklch(75.461% .183 346.812);--color-primary-content:oklch(15.092% .036 346.812);--color-secondary:oklch(74.202% .148 301.883);--color-secondary-content:oklch(14.84% .029 301.883);--color-accent:oklch(83.392% .124 66.558);--color-accent-content:oklch(16.678% .024 66.558);--color-neutral:oklch(39.445% .032 275.524);--color-neutral-content:oklch(87.889% .006 275.524);--color-info:oklch(88.263% .093 212.846);--color-info-content:oklch(17.652% .018 212.846);--color-success:oklch(87.099% .219 148.024);--color-success-content:oklch(17.419% .043 148.024);--color-warning:oklch(95.533% .134 112.757);--color-warning-content:oklch(19.106% .026 112.757);--color-error:oklch(68.22% .206 24.43);--color-error-content:oklch(13.644% .041 24.43);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=cmyk]:checked),[data-theme=cmyk]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(95% 0 0);--color-base-300:oklch(90% 0 0);--color-base-content:oklch(20% 0 0);--color-primary:oklch(71.772% .133 239.443);--color-primary-content:oklch(14.354% .026 239.443);--color-secondary:oklch(64.476% .202 359.339);--color-secondary-content:oklch(12.895% .04 359.339);--color-accent:oklch(94.228% .189 105.306);--color-accent-content:oklch(18.845% .037 105.306);--color-neutral:oklch(21.778% 0 0);--color-neutral-content:oklch(84.355% 0 0);--color-info:oklch(68.475% .094 217.284);--color-info-content:oklch(13.695% .018 217.284);--color-success:oklch(46.949% .162 321.406);--color-success-content:oklch(89.389% .032 321.406);--color-warning:oklch(71.236% .159 52.023);--color-warning-content:oklch(14.247% .031 52.023);--color-error:oklch(62.013% .208 28.717);--color-error-content:oklch(12.402% .041 28.717);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=autumn]:checked),[data-theme=autumn]{color-scheme:light;--color-base-100:oklch(95.814% 0 0);--color-base-200:oklch(89.107% 0 0);--color-base-300:oklch(82.4% 0 0);--color-base-content:oklch(19.162% 0 0);--color-primary:oklch(40.723% .161 17.53);--color-primary-content:oklch(88.144% .032 17.53);--color-secondary:oklch(61.676% .169 23.865);--color-secondary-content:oklch(12.335% .033 23.865);--color-accent:oklch(73.425% .094 60.729);--color-accent-content:oklch(14.685% .018 60.729);--color-neutral:oklch(54.367% .037 51.902);--color-neutral-content:oklch(90.873% .007 51.902);--color-info:oklch(69.224% .097 207.284);--color-info-content:oklch(13.844% .019 207.284);--color-success:oklch(60.995% .08 174.616);--color-success-content:oklch(12.199% .016 174.616);--color-warning:oklch(70.081% .164 56.844);--color-warning-content:oklch(14.016% .032 56.844);--color-error:oklch(53.07% .241 24.16);--color-error-content:oklch(90.614% .048 24.16);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=business]:checked),[data-theme=business]{color-scheme:dark;--color-base-100:oklch(24.353% 0 0);--color-base-200:oklch(22.648% 0 0);--color-base-300:oklch(20.944% 0 0);--color-base-content:oklch(84.87% 0 0);--color-primary:oklch(41.703% .099 251.473);--color-primary-content:oklch(88.34% .019 251.473);--color-secondary:oklch(64.092% .027 229.389);--color-secondary-content:oklch(12.818% .005 229.389);--color-accent:oklch(67.271% .167 35.791);--color-accent-content:oklch(13.454% .033 35.791);--color-neutral:oklch(27.441% .013 253.041);--color-neutral-content:oklch(85.488% .002 253.041);--color-info:oklch(62.616% .143 240.033);--color-info-content:oklch(12.523% .028 240.033);--color-success:oklch(70.226% .094 156.596);--color-success-content:oklch(14.045% .018 156.596);--color-warning:oklch(77.482% .115 81.519);--color-warning-content:oklch(15.496% .023 81.519);--color-error:oklch(51.61% .146 29.674);--color-error-content:oklch(90.322% .029 29.674);--radius-selector:0rem;--radius-field:.25rem;--radius-box:.25rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=acid]:checked),[data-theme=acid]{color-scheme:light;--color-base-100:oklch(98% 0 0);--color-base-200:oklch(95% 0 0);--color-base-300:oklch(91% 0 0);--color-base-content:oklch(0% 0 0);--color-primary:oklch(71.9% .357 330.759);--color-primary-content:oklch(14.38% .071 330.759);--color-secondary:oklch(73.37% .224 48.25);--color-secondary-content:oklch(14.674% .044 48.25);--color-accent:oklch(92.78% .264 122.962);--color-accent-content:oklch(18.556% .052 122.962);--color-neutral:oklch(21.31% .128 278.68);--color-neutral-content:oklch(84.262% .025 278.68);--color-info:oklch(60.72% .227 252.05);--color-info-content:oklch(12.144% .045 252.05);--color-success:oklch(85.72% .266 158.53);--color-success-content:oklch(17.144% .053 158.53);--color-warning:oklch(91.01% .212 100.5);--color-warning-content:oklch(18.202% .042 100.5);--color-error:oklch(64.84% .293 29.349);--color-error-content:oklch(12.968% .058 29.349);--radius-selector:1rem;--radius-field:1rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=lemonade]:checked),[data-theme=lemonade]{color-scheme:light;--color-base-100:oklch(98.71% .02 123.72);--color-base-200:oklch(91.8% .018 123.72);--color-base-300:oklch(84.89% .017 123.72);--color-base-content:oklch(19.742% .004 123.72);--color-primary:oklch(58.92% .199 134.6);--color-primary-content:oklch(11.784% .039 134.6);--color-secondary:oklch(77.75% .196 111.09);--color-secondary-content:oklch(15.55% .039 111.09);--color-accent:oklch(85.39% .201 100.73);--color-accent-content:oklch(17.078% .04 100.73);--color-neutral:oklch(30.98% .075 108.6);--color-neutral-content:oklch(86.196% .015 108.6);--color-info:oklch(86.19% .047 224.14);--color-info-content:oklch(17.238% .009 224.14);--color-success:oklch(86.19% .047 157.85);--color-success-content:oklch(17.238% .009 157.85);--color-warning:oklch(86.19% .047 102.15);--color-warning-content:oklch(17.238% .009 102.15);--color-error:oklch(86.19% .047 25.85);--color-error-content:oklch(17.238% .009 25.85);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=night]:checked),[data-theme=night]{color-scheme:dark;--color-base-100:oklch(20.768% .039 265.754);--color-base-200:oklch(19.314% .037 265.754);--color-base-300:oklch(17.86% .034 265.754);--color-base-content:oklch(84.153% .007 265.754);--color-primary:oklch(75.351% .138 232.661);--color-primary-content:oklch(15.07% .027 232.661);--color-secondary:oklch(68.011% .158 276.934);--color-secondary-content:oklch(13.602% .031 276.934);--color-accent:oklch(72.36% .176 350.048);--color-accent-content:oklch(14.472% .035 350.048);--color-neutral:oklch(27.949% .036 260.03);--color-neutral-content:oklch(85.589% .007 260.03);--color-info:oklch(68.455% .148 237.251);--color-info-content:oklch(0% 0 0);--color-success:oklch(78.452% .132 181.911);--color-success-content:oklch(15.69% .026 181.911);--color-warning:oklch(83.242% .139 82.95);--color-warning-content:oklch(16.648% .027 82.95);--color-error:oklch(71.785% .17 13.118);--color-error-content:oklch(14.357% .034 13.118);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=coffee]:checked),[data-theme=coffee]{color-scheme:dark;--color-base-100:oklch(24% .023 329.708);--color-base-200:oklch(21% .021 329.708);--color-base-300:oklch(16% .019 329.708);--color-base-content:oklch(72.354% .092 79.129);--color-primary:oklch(71.996% .123 62.756);--color-primary-content:oklch(14.399% .024 62.756);--color-secondary:oklch(34.465% .029 199.194);--color-secondary-content:oklch(86.893% .005 199.194);--color-accent:oklch(42.621% .074 224.389);--color-accent-content:oklch(88.524% .014 224.389);--color-neutral:oklch(16.51% .015 326.261);--color-neutral-content:oklch(83.302% .003 326.261);--color-info:oklch(79.49% .063 184.558);--color-info-content:oklch(15.898% .012 184.558);--color-success:oklch(74.722% .072 131.116);--color-success-content:oklch(14.944% .014 131.116);--color-warning:oklch(88.15% .14 87.722);--color-warning-content:oklch(17.63% .028 87.722);--color-error:oklch(77.318% .128 31.871);--color-error-content:oklch(15.463% .025 31.871);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=winter]:checked),[data-theme=winter]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(97.466% .011 259.822);--color-base-300:oklch(93.268% .016 262.751);--color-base-content:oklch(41.886% .053 255.824);--color-primary:oklch(56.86% .255 257.57);--color-primary-content:oklch(91.372% .051 257.57);--color-secondary:oklch(42.551% .161 282.339);--color-secondary-content:oklch(88.51% .032 282.339);--color-accent:oklch(59.939% .191 335.171);--color-accent-content:oklch(11.988% .038 335.171);--color-neutral:oklch(19.616% .063 257.651);--color-neutral-content:oklch(83.923% .012 257.651);--color-info:oklch(88.127% .085 214.515);--color-info-content:oklch(17.625% .017 214.515);--color-success:oklch(80.494% .077 197.823);--color-success-content:oklch(16.098% .015 197.823);--color-warning:oklch(89.172% .045 71.47);--color-warning-content:oklch(17.834% .009 71.47);--color-error:oklch(73.092% .11 20.076);--color-error-content:oklch(14.618% .022 20.076);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=dim]:checked),[data-theme=dim]{color-scheme:dark;--color-base-100:oklch(30.857% .023 264.149);--color-base-200:oklch(28.036% .019 264.182);--color-base-300:oklch(26.346% .018 262.177);--color-base-content:oklch(82.901% .031 222.959);--color-primary:oklch(86.133% .141 139.549);--color-primary-content:oklch(17.226% .028 139.549);--color-secondary:oklch(73.375% .165 35.353);--color-secondary-content:oklch(14.675% .033 35.353);--color-accent:oklch(74.229% .133 311.379);--color-accent-content:oklch(14.845% .026 311.379);--color-neutral:oklch(24.731% .02 264.094);--color-neutral-content:oklch(82.901% .031 222.959);--color-info:oklch(86.078% .142 206.182);--color-info-content:oklch(17.215% .028 206.182);--color-success:oklch(86.171% .142 166.534);--color-success-content:oklch(17.234% .028 166.534);--color-warning:oklch(86.163% .142 94.818);--color-warning-content:oklch(17.232% .028 94.818);--color-error:oklch(82.418% .099 33.756);--color-error-content:oklch(16.483% .019 33.756);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=nord]:checked),[data-theme=nord]{color-scheme:light;--color-base-100:oklch(95.127% .007 260.731);--color-base-200:oklch(93.299% .01 261.788);--color-base-300:oklch(89.925% .016 262.749);--color-base-content:oklch(32.437% .022 264.182);--color-primary:oklch(59.435% .077 254.027);--color-primary-content:oklch(11.887% .015 254.027);--color-secondary:oklch(69.651% .059 248.687);--color-secondary-content:oklch(13.93% .011 248.687);--color-accent:oklch(77.464% .062 217.469);--color-accent-content:oklch(15.492% .012 217.469);--color-neutral:oklch(45.229% .035 264.131);--color-neutral-content:oklch(89.925% .016 262.749);--color-info:oklch(69.207% .062 332.664);--color-info-content:oklch(13.841% .012 332.664);--color-success:oklch(76.827% .074 131.063);--color-success-content:oklch(15.365% .014 131.063);--color-warning:oklch(85.486% .089 84.093);--color-warning-content:oklch(17.097% .017 84.093);--color-error:oklch(60.61% .12 15.341);--color-error-content:oklch(12.122% .024 15.341);--radius-selector:1rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=sunset]:checked),[data-theme=sunset]{color-scheme:dark;--color-base-100:oklch(22% .019 237.69);--color-base-200:oklch(20% .019 237.69);--color-base-300:oklch(18% .019 237.69);--color-base-content:oklch(77.383% .043 245.096);--color-primary:oklch(74.703% .158 39.947);--color-primary-content:oklch(14.94% .031 39.947);--color-secondary:oklch(72.537% .177 2.72);--color-secondary-content:oklch(14.507% .035 2.72);--color-accent:oklch(71.294% .166 299.844);--color-accent-content:oklch(14.258% .033 299.844);--color-neutral:oklch(26% .019 237.69);--color-neutral-content:oklch(70% .019 237.69);--color-info:oklch(85.559% .085 206.015);--color-info-content:oklch(17.111% .017 206.015);--color-success:oklch(85.56% .085 144.778);--color-success-content:oklch(17.112% .017 144.778);--color-warning:oklch(85.569% .084 74.427);--color-warning-content:oklch(17.113% .016 74.427);--color-error:oklch(85.511% .078 16.886);--color-error-content:oklch(17.102% .015 16.886);--radius-selector:1rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=caramellatte]:checked),[data-theme=caramellatte]{color-scheme:light;--color-base-100:oklch(98% .016 73.684);--color-base-200:oklch(95% .038 75.164);--color-base-300:oklch(90% .076 70.697);--color-base-content:oklch(40% .123 38.172);--color-primary:oklch(0% 0 0);--color-primary-content:oklch(100% 0 0);--color-secondary:oklch(22.45% .075 37.85);--color-secondary-content:oklch(90% .076 70.697);--color-accent:oklch(46.44% .111 37.85);--color-accent-content:oklch(90% .076 70.697);--color-neutral:oklch(55% .195 38.402);--color-neutral-content:oklch(98% .016 73.684);--color-info:oklch(42% .199 265.638);--color-info-content:oklch(90% .076 70.697);--color-success:oklch(43% .095 166.913);--color-success-content:oklch(90% .076 70.697);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(70% .191 22.216);--color-error-content:oklch(39% .141 25.723);--radius-selector:2rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:2px;--depth:1;--noise:1}:root:has(input.theme-controller[value=abyss]:checked),[data-theme=abyss]{color-scheme:dark;--color-base-100:oklch(20% .08 209);--color-base-200:oklch(15% .08 209);--color-base-300:oklch(10% .08 209);--color-base-content:oklch(90% .076 70.697);--color-primary:oklch(92% .2653 125);--color-primary-content:oklch(50% .2653 125);--color-secondary:oklch(83.27% .0764 298.3);--color-secondary-content:oklch(43.27% .0764 298.3);--color-accent:oklch(43% 0 0);--color-accent-content:oklch(98% 0 0);--color-neutral:oklch(30% .08 209);--color-neutral-content:oklch(90% .076 70.697);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(79% .209 151.711);--color-success-content:oklch(26% .065 152.934);--color-warning:oklch(84.8% .1962 84.62);--color-warning-content:oklch(44.8% .1962 84.62);--color-error:oklch(65% .1985 24.22);--color-error-content:oklch(27% .1985 24.22);--radius-selector:2rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=silk]:checked),[data-theme=silk]{color-scheme:light;--color-base-100:oklch(97% .0035 67.78);--color-base-200:oklch(95% .0081 61.42);--color-base-300:oklch(90% .0081 61.42);--color-base-content:oklch(40% .0081 61.42);--color-primary:oklch(23.27% .0249 284.3);--color-primary-content:oklch(94.22% .2505 117.44);--color-secondary:oklch(23.27% .0249 284.3);--color-secondary-content:oklch(73.92% .2135 50.94);--color-accent:oklch(23.27% .0249 284.3);--color-accent-content:oklch(88.92% .2061 189.9);--color-neutral:oklch(20% 0 0);--color-neutral-content:oklch(80% .0081 61.42);--color-info:oklch(80.39% .1148 241.68);--color-info-content:oklch(30.39% .1148 241.68);--color-success:oklch(83.92% .0901 136.87);--color-success-content:oklch(23.92% .0901 136.87);--color-warning:oklch(83.92% .1085 80);--color-warning-content:oklch(43.92% .1085 80);--color-error:oklch(75.1% .1814 22.37);--color-error-content:oklch(35.1% .1814 22.37);--radius-selector:2rem;--radius-field:.5rem;--radius-box:1rem;--size-selector:.25rem;--size-field:.25rem;--border:2px;--depth:1;--noise:0}:root{--fx-noise:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.34' numOctaves='4' stitchTiles='stitch'%3E%3C/feTurbulence%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23a)' opacity='0.2'%3E%3C/rect%3E%3C/svg%3E");scrollbar-color:currentColor #0000}@supports (color:color-mix(in lab,red,red)){:root{scrollbar-color:color-mix(in oklch,currentColor 35%,#0000)#0000}}@property --radialprogress{syntax: "<percentage>"; inherits: true; initial-value: 0%;}:root:has(.modal-open,.modal[open],.modal:target,.modal-toggle:checked,.drawer:not([class*=drawer-open])>.drawer-toggle:checked){overflow:hidden}:where(:root:has(.modal-open,.modal[open],.modal:target,.modal-toggle:checked,.drawer:not(.drawer-open)>.drawer-toggle:checked)){scrollbar-gutter:stable;background-image:linear-gradient(var(--color-base-100),var(--color-base-100));--root-bg:var(--color-base-100)}@supports (color:color-mix(in lab,red,red)){:where(:root:has(.modal-open,.modal[open],.modal:target,.modal-toggle:checked,.drawer:not(.drawer-open)>.drawer-toggle:checked)){--root-bg:color-mix(in srgb,var(--color-base-100),oklch(0% 0 0) 40%)}}:where(.modal[open],.modal-open,.modal-toggle:checked+.modal):not(.modal-start,.modal-end){scrollbar-gutter:stable}:root,[data-theme]{background-color:var(--root-bg,var(--color-base-100));color:var(--color-base-content)}}@layer components;@layer utilities{.diff{webkit-user-select:none;-webkit-user-select:none;user-select:none;direction:ltr;grid-template-rows:1fr 1.8rem 1fr;grid-template-columns:auto 1fr;width:100%;display:grid;position:relative;overflow:hidden;container-type:inline-size}.diff:focus-visible,.diff:has(.diff-item-1:focus-visible){outline-style:var(--tw-outline-style);outline-offset:1px;outline-width:2px;outline-color:var(--color-base-content)}.diff:focus-visible .diff-resizer{min-width:95cqi;max-width:95cqi}.diff:has(.diff-item-1:focus-visible){outline-style:var(--tw-outline-style);outline-offset:1px;outline-width:2px}.diff:has(.diff-item-1:focus-visible) .diff-resizer{min-width:5cqi;max-width:5cqi}@supports (-webkit-overflow-scrolling:touch) and (overflow:-webkit-paged-x){.diff:focus .diff-resizer{min-width:5cqi;max-width:5cqi}.diff:has(.diff-item-1:focus) .diff-resizer{min-width:95cqi;max-width:95cqi}}.modal{pointer-events:none;visibility:hidden;width:100%;max-width:none;height:100%;max-height:none;color:inherit;transition:translate .3s ease-out,visibility .3s allow-discrete,background-color .3s ease-out,opacity .1s ease-out;overscroll-behavior:contain;z-index:999;scrollbar-gutter:auto;background-color:#0000;place-items:center;margin:0;padding:0;display:grid;position:fixed;inset:0;overflow:hidden}.modal::backdrop{display:none}.modal.modal-open,.modal[open],.modal:target{pointer-events:auto;visibility:visible;opacity:1;background-color:#0006}:is(.modal.modal-open,.modal[open],.modal:target) .modal-box{opacity:1;translate:0;scale:1}@starting-style{.modal.modal-open,.modal[open],.modal:target{visibility:hidden;opacity:0}}.tooltip{--tt-bg:var(--color-neutral);--tt-off: calc(100% + .5rem) ;--tt-tail: calc(100% + 1px + .25rem) ;display:inline-block;position:relative}.tooltip>:where(.tooltip-content),.tooltip:where([data-tip]):before{border-radius:var(--radius-field);text-align:center;white-space:normal;max-width:20rem;color:var(--color-neutral-content);opacity:0;background-color:var(--tt-bg);pointer-events:none;z-index:2;--tw-content:attr(data-tip);content:var(--tw-content);width:max-content;padding-block:.25rem;padding-inline:.5rem;font-size:.875rem;line-height:1.25;position:absolute}@media (prefers-reduced-motion:no-preference){.tooltip>:where(.tooltip-content),.tooltip:where([data-tip]):before,.tooltip:after{transition:opacity .2s cubic-bezier(.4,0,.2,1) 75ms,transform .2s cubic-bezier(.4,0,.2,1) 75ms}}.tooltip:after{opacity:0;background-color:var(--tt-bg);content:"";pointer-events:none;--mask-tooltip:url("data:image/svg+xml,%3Csvg width='10' height='4' viewBox='0 0 8 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.500009 1C3.5 1 3.00001 4 5.00001 4C7 4 6.5 1 9.5 1C10 1 10 0.499897 10 0H0C-1.99338e-08 0.5 0 1 0.500009 1Z' fill='black'/%3E%3C/svg%3E%0A");width:.625rem;height:.25rem;-webkit-mask-position:-1px 0;mask-position:-1px 0;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-image:var(--mask-tooltip);mask-image:var(--mask-tooltip);display:block;position:absolute}:is(.tooltip.tooltip-open,.tooltip[data-tip]:not([data-tip=""]):hover,.tooltip:not(:has(.tooltip-content:empty)):has(.tooltip-content):hover,.tooltip:has(:focus-visible))>.tooltip-content,:is(.tooltip.tooltip-open,.tooltip[data-tip]:not([data-tip=""]):hover,.tooltip:not(:has(.tooltip-content:empty)):has(.tooltip-content):hover,.tooltip:has(:focus-visible))[data-tip]:before,:is(.tooltip.tooltip-open,.tooltip[data-tip]:not([data-tip=""]):hover,.tooltip:not(:has(.tooltip-content:empty)):has(.tooltip-content):hover,.tooltip:has(:focus-visible)):after{opacity:1;--tt-pos:0rem}@media (prefers-reduced-motion:no-preference){:is(.tooltip.tooltip-open,.tooltip[data-tip]:not([data-tip=""]):hover,.tooltip:not(:has(.tooltip-content:empty)):has(.tooltip-content):hover,.tooltip:has(:focus-visible))>.tooltip-content,:is(.tooltip.tooltip-open,.tooltip[data-tip]:not([data-tip=""]):hover,.tooltip:not(:has(.tooltip-content:empty)):has(.tooltip-content):hover,.tooltip:has(:focus-visible))[data-tip]:before,:is(.tooltip.tooltip-open,.tooltip[data-tip]:not([data-tip=""]):hover,.tooltip:not(:has(.tooltip-content:empty)):has(.tooltip-content):hover,.tooltip:has(:focus-visible)):after{transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1)}}.tooltip>.tooltip-content,.tooltip[data-tip]:before{transform:translate(-50%)translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-off)50%}.tooltip:after{transform:translate(-50%)translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-tail)50%}.tab{cursor:pointer;appearance:none;text-align:center;webkit-user-select:none;-webkit-user-select:none;user-select:none;flex-wrap:wrap;justify-content:center;align-items:center;display:inline-flex;position:relative}@media (hover:hover){.tab:hover{color:var(--color-base-content)}}.tab{--tab-p:1rem;--tab-bg:var(--color-base-100);--tab-border-color:var(--color-base-300);--tab-radius-ss:0;--tab-radius-se:0;--tab-radius-es:0;--tab-radius-ee:0;--tab-order:0;--tab-radius-min:calc(.75rem - var(--border));order:var(--tab-order);height:var(--tab-height);border-color:#0000;padding-inline-start:var(--tab-p);padding-inline-end:var(--tab-p);font-size:.875rem}.tab:is(input[type=radio]){min-width:fit-content}.tab:is(input[type=radio]):after{content:attr(aria-label)}.tab:is(label){position:relative}.tab:is(label) input{cursor:pointer;appearance:none;opacity:0;position:absolute;inset:0}:is(.tab:checked,.tab:is(label:has(:checked)),.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]))+.tab-content{height:calc(100% - var(--tab-height) + var(--border));display:block}.tab:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.tab:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:color-mix(in oklab,var(--color-base-content)50%,transparent)}}.tab:not(input):empty{cursor:default;flex-grow:1}.tab:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tab:focus{outline-offset:2px;outline:2px solid #0000}}.tab:focus-visible,.tab:is(label:has(:checked:focus-visible)){outline-offset:-5px;outline:2px solid}.tab[disabled]{pointer-events:none;opacity:.4}.menu{--menu-active-fg:var(--color-neutral-content);--menu-active-bg:var(--color-neutral);flex-flow:column wrap;width:fit-content;padding:.5rem;font-size:.875rem;display:flex}.menu :where(li ul){white-space:nowrap;margin-inline-start:1rem;padding-inline-start:.5rem;position:relative}.menu :where(li ul):before{background-color:var(--color-base-content);opacity:.1;width:var(--border);content:"";inset-inline-start:0;position:absolute;top:.75rem;bottom:.75rem}.menu :where(li>.menu-dropdown:not(.menu-dropdown-show)){display:none}.menu :where(li:not(.menu-title)>:not(ul,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--radius-field);text-align:start;text-wrap:balance;-webkit-user-select:none;user-select:none;grid-auto-columns:minmax(auto,max-content) auto max-content;grid-auto-flow:column;align-content:flex-start;align-items:center;gap:.5rem;padding-block:.375rem;padding-inline:.75rem;transition-property:color,background-color,box-shadow;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:grid}.menu :where(li>details>summary){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li>details>summary){outline-offset:2px;outline:2px solid #0000}}.menu :where(li>details>summary)::-webkit-details-marker{display:none}:is(.menu :where(li>details>summary),.menu :where(li>.menu-dropdown-toggle)):after{content:"";transform-origin:50%;pointer-events:none;justify-self:flex-end;width:.375rem;height:.375rem;transition-property:rotate,translate;transition-duration:.2s;display:block;translate:0 -1px;rotate:-135deg;box-shadow:inset 2px 2px}.menu :where(li>details[open]>summary):after,.menu :where(li>.menu-dropdown-toggle.menu-dropdown-show):after{translate:0 1px;rotate:45deg}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{background-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{color:var(--color-base-content);--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){background-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){box-shadow:inset 0 1px #00000003,inset 0 -1px #ffffff03}.menu :where(li:empty){background-color:var(--color-base-content);opacity:.1;height:1px;margin:.5rem 1rem}.menu :where(li){flex-flow:column wrap;flex-shrink:0;align-items:stretch;display:flex;position:relative}.menu :where(li) .badge{justify-self:flex-end}.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{outline-offset:2px;outline:2px solid #0000}}.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{color:var(--menu-active-fg);background-color:var(--menu-active-bg);background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise)}:is(.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):not(:is(.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):active){box-shadow:0 2px calc(var(--depth)*3px) -2px var(--menu-active-bg)}.menu :where(li).menu-disabled{pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.menu :where(li).menu-disabled{color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.menu .dropdown:focus-within .menu-dropdown-toggle:after{translate:0 1px;rotate:45deg}.menu .dropdown-content{margin-top:.5rem;padding:.5rem}.menu .dropdown-content:before{display:none}.dropdown{position-area:var(--anchor-v,bottom)var(--anchor-h,span-right);display:inline-block;position:relative}.dropdown>:not(summary):focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.dropdown>:not(summary):focus{outline-offset:2px;outline:2px solid #0000}}.dropdown .dropdown-content{position:absolute}.dropdown:not(details,.dropdown-open,.dropdown-hover:hover,:focus-within) .dropdown-content{transform-origin:top;opacity:0;display:none;scale:95%}.dropdown[popover],.dropdown .dropdown-content{z-index:999}@media (prefers-reduced-motion:no-preference){.dropdown[popover],.dropdown .dropdown-content{transition-behavior:allow-discrete;transition-property:opacity,scale,display;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);animation:.2s dropdown}}@starting-style{.dropdown[popover],.dropdown .dropdown-content{opacity:0;scale:95%}}:is(.dropdown.dropdown-open,.dropdown:not(.dropdown-hover):focus,.dropdown:focus-within)>[tabindex]:first-child{pointer-events:none}:is(.dropdown.dropdown-open,.dropdown:not(.dropdown-hover):focus,.dropdown:focus-within) .dropdown-content{opacity:1}.dropdown.dropdown-hover:hover .dropdown-content{opacity:1;scale:100%}.dropdown:is(details) summary::-webkit-details-marker{display:none}:is(.dropdown.dropdown-open,.dropdown:focus,.dropdown:focus-within) .dropdown-content{scale:100%}.dropdown:where([popover]){background:0 0}.dropdown[popover]{color:inherit;position:fixed}@supports not (position-area:bottom){.dropdown[popover]{margin:auto}.dropdown[popover].dropdown-open:not(:popover-open){transform-origin:top;opacity:0;display:none;scale:95%}.dropdown[popover]::backdrop{background-color:oklab(0% none none/.3)}}.dropdown[popover]:not(.dropdown-open,:popover-open){transform-origin:top;opacity:0;display:none;scale:95%}:where(.btn){width:unset}.btn{cursor:pointer;text-align:center;vertical-align:middle;outline-offset:2px;webkit-user-select:none;-webkit-user-select:none;user-select:none;padding-inline:var(--btn-p);color:var(--btn-fg);--tw-prose-links:var(--btn-fg);height:var(--size);font-size:var(--fontsize,.875rem);outline-color:var(--btn-color,var(--color-base-content));background-color:var(--btn-bg);background-size:auto,calc(var(--noise)*100%);background-image:none,var(--btn-noise);border-width:var(--border);border-style:solid;border-color:var(--btn-border);text-shadow:0 .5px oklch(100% 0 0/calc(var(--depth)*.15));touch-action:manipulation;box-shadow:0 .5px 0 .5px oklch(100% 0 0/calc(var(--depth)*6%)) inset,var(--btn-shadow);--size:calc(var(--size-field,.25rem)*10);--btn-bg:var(--btn-color,var(--color-base-200));--btn-fg:var(--color-base-content);--btn-p:1rem;--btn-border:var(--btn-bg);border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-wrap:nowrap;flex-shrink:0;justify-content:center;align-items:center;gap:.375rem;font-weight:600;transition-property:color,background-color,border-color,box-shadow;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:inline-flex}@supports (color:color-mix(in lab,red,red)){.btn{--btn-border:color-mix(in oklab,var(--btn-bg),#000 calc(var(--depth)*5%))}}.btn{--btn-shadow:0 3px 2px -2px var(--btn-bg),0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab,red,red)){.btn{--btn-shadow:0 3px 2px -2px color-mix(in oklab,var(--btn-bg)calc(var(--depth)*30%),#0000),0 4px 3px -2px color-mix(in oklab,var(--btn-bg)calc(var(--depth)*30%),#0000)}}.btn{--btn-noise:var(--fx-noise)}.prose .btn{text-decoration-line:none}@media (hover:hover){.btn:hover{--btn-bg:var(--btn-color,var(--color-base-200))}@supports (color:color-mix(in lab,red,red)){.btn:hover{--btn-bg:color-mix(in oklab,var(--btn-color,var(--color-base-200)),#000 7%)}}}.btn:focus-visible,.btn:has(:focus-visible){isolation:isolate;outline-width:2px;outline-style:solid}.btn:active:not(.btn-active){--btn-bg:var(--btn-color,var(--color-base-200));translate:0 .5px}@supports (color:color-mix(in lab,red,red)){.btn:active:not(.btn-active){--btn-bg:color-mix(in oklab,var(--btn-color,var(--color-base-200)),#000 5%)}}.btn:active:not(.btn-active){--btn-border:var(--btn-color,var(--color-base-200))}@supports (color:color-mix(in lab,red,red)){.btn:active:not(.btn-active){--btn-border:color-mix(in oklab,var(--btn-color,var(--color-base-200)),#000 7%)}}.btn:active:not(.btn-active){--btn-shadow:0 0 0 0 oklch(0% 0 0/0),0 0 0 0 oklch(0% 0 0/0)}.btn:is(:disabled,[disabled],.btn-disabled):not(.btn-link,.btn-ghost){background-color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.btn:is(:disabled,[disabled],.btn-disabled):not(.btn-link,.btn-ghost){background-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.btn:is(:disabled,[disabled],.btn-disabled):not(.btn-link,.btn-ghost){box-shadow:none}.btn:is(:disabled,[disabled],.btn-disabled){pointer-events:none;--btn-border:#0000;--btn-noise:none;--btn-fg:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.btn:is(:disabled,[disabled],.btn-disabled){--btn-fg:color-mix(in oklch,var(--color-base-content)20%,#0000)}}@media (hover:hover){.btn:is(:disabled,[disabled],.btn-disabled):hover{pointer-events:none;background-color:var(--color-neutral)}@supports (color:color-mix(in lab,red,red)){.btn:is(:disabled,[disabled],.btn-disabled):hover{background-color:color-mix(in oklab,var(--color-neutral)20%,transparent)}}.btn:is(:disabled,[disabled],.btn-disabled):hover{--btn-border:#0000;--btn-fg:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.btn:is(:disabled,[disabled],.btn-disabled):hover{--btn-fg:color-mix(in oklch,var(--color-base-content)20%,#0000)}}}.btn:is(input[type=checkbox],input[type=radio]){appearance:none}.btn:is(input[type=checkbox],input[type=radio]):after{content:attr(aria-label)}.btn:where(input:checked:not(.filter .btn)){--btn-color:var(--color-primary);--btn-fg:var(--color-primary-content);isolation:isolate}.loading{pointer-events:none;aspect-ratio:1;vertical-align:middle;width:calc(var(--size-selector,.25rem)*6);background-color:currentColor;display:inline-block;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.tabs-lift{--tabs-height:auto;--tabs-direction:row}.tabs-lift>.tab{--tab-border:0 0 var(--border)0;--tab-radius-ss:min(var(--radius-field),var(--tab-radius-min));--tab-radius-se:min(var(--radius-field),var(--tab-radius-min));--tab-radius-es:0;--tab-radius-ee:0;--tab-paddings:var(--border)var(--tab-p)0 var(--tab-p);--tab-border-colors:#0000 #0000 var(--tab-border-color)#0000;--tab-corner-width: calc(100% + min(var(--radius-field),var(--tab-radius-min))*2) ;--tab-corner-height:min(var(--radius-field),var(--tab-radius-min));--tab-corner-position:top left,top right;border-width:var(--tab-border);padding:var(--tab-paddings);border-color:var(--tab-border-colors);border-start-start-radius:var(--tab-radius-ss);border-start-end-radius:var(--tab-radius-se);border-end-end-radius:var(--tab-radius-ee);border-end-start-radius:var(--tab-radius-es)}.tabs-lift>.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-lift>.tab:is(input:checked,label:has(:checked)){--tab-border:var(--border)var(--border)0 var(--border);--tab-border-colors:var(--tab-border-color)var(--tab-border-color)#0000 var(--tab-border-color);--tab-paddings:0 calc(var(--tab-p) - var(--border))var(--border)calc(var(--tab-p) - var(--border));--tab-inset:auto auto 0 auto;--tab-grad:calc(69% - var(--border));--radius-start:radial-gradient(circle at top left,#0000 var(--tab-grad),var(--tab-border-color)calc(var(--tab-grad) + .25px),var(--tab-border-color)calc(var(--tab-grad) + var(--border)),var(--tab-bg)calc(var(--tab-grad) + var(--border) + .25px));--radius-end:radial-gradient(circle at top right,#0000 var(--tab-grad),var(--tab-border-color)calc(var(--tab-grad) + .25px),var(--tab-border-color)calc(var(--tab-grad) + var(--border)),var(--tab-bg)calc(var(--tab-grad) + var(--border) + .25px));background-color:var(--tab-bg)}:is(.tabs-lift>.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-lift>.tab:is(input:checked,label:has(:checked))):before{z-index:1;content:"";width:var(--tab-corner-width);height:var(--tab-corner-height);background-position:var(--tab-corner-position);background-image:var(--radius-start),var(--radius-end);background-size:min(var(--radius-field),var(--tab-radius-min))min(var(--radius-field),var(--tab-radius-min));inset:var(--tab-inset);background-repeat:no-repeat;display:block;position:absolute}:is(.tabs-lift>.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-lift>.tab:is(input:checked,label:has(:checked))):first-child:before{--radius-start:none}[dir=rtl] :is(.tabs-lift>.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-lift>.tab:is(input:checked,label:has(:checked))):first-child:before{transform:rotateY(180deg)}:is(.tabs-lift>.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-lift>.tab:is(input:checked,label:has(:checked))):last-child:before{--radius-end:none}[dir=rtl] :is(.tabs-lift>.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-lift>.tab:is(input:checked,label:has(:checked))):last-child:before{transform:rotateY(180deg)}.tabs-lift:has(>.tab-content)>.tab:first-child:not(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){--tab-border-colors:var(--tab-border-color)var(--tab-border-color)#0000 var(--tab-border-color)}.tabs-lift>.tab-content{--tabcontent-margin:calc(-1*var(--border))0 0 0;--tabcontent-radius-ss:0;--tabcontent-radius-se:var(--radius-box);--tabcontent-radius-es:var(--radius-box);--tabcontent-radius-ee:var(--radius-box)}:is(.tabs-lift :checked,.tabs-lift label:has(:checked),.tabs-lift :is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]))+.tab-content:first-child,:is(.tabs-lift :checked,.tabs-lift label:has(:checked),.tabs-lift :is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]))+.tab-content:nth-child(n+3){--tabcontent-radius-ss:var(--radius-box)}.radial-progress{height:var(--size);width:var(--size);vertical-align:middle;box-sizing:content-box;--value:0;--size:5rem;--thickness:calc(var(--size)/10);--radialprogress:calc(var(--value)*1%);background-color:#0000;border-radius:3.40282e38px;place-content:center;transition:--radialprogress .3s linear;display:inline-grid;position:relative}.radial-progress:before{content:"";background:radial-gradient(farthest-side,currentColor 98%,#0000)top/var(--thickness)var(--thickness)no-repeat,conic-gradient(currentColor var(--radialprogress),#0000 0);webkit-mask:radial-gradient(farthest-side,#0000 calc(100% - var(--thickness)),#000 calc(100% + .5px - var(--thickness)));-webkit-mask:radial-gradient(farthest-side,#0000 calc(100% - var(--thickness)),#000 calc(100% + .5px - var(--thickness)));mask:radial-gradient(farthest-side,#0000 calc(100% - var(--thickness)),#000 calc(100% + .5px - var(--thickness)));border-radius:3.40282e38px;position:absolute;inset:0}.radial-progress:after{content:"";inset:calc(50% - var(--thickness)/2);transform:rotate(calc(var(--value)*3.6deg - 90deg))translate(calc(var(--size)/2 - 50%));background-color:currentColor;border-radius:3.40282e38px;transition:transform .3s linear;position:absolute}.list{flex-direction:column;font-size:.875rem;display:flex}.list :where(.list-row){--list-grid-cols:minmax(0,auto)1fr;border-radius:var(--radius-box);word-break:break-word;grid-auto-flow:column;grid-template-columns:var(--list-grid-cols);gap:1rem;padding:1rem;display:grid;position:relative}.list :where(.list-row):has(.list-col-grow:first-child){--list-grid-cols:1fr}.list :where(.list-row):has(.list-col-grow:nth-child(2)){--list-grid-cols:minmax(0,auto)1fr}.list :where(.list-row):has(.list-col-grow:nth-child(3)){--list-grid-cols:minmax(0,auto)minmax(0,auto)1fr}.list :where(.list-row):has(.list-col-grow:nth-child(4)){--list-grid-cols:minmax(0,auto)minmax(0,auto)minmax(0,auto)1fr}.list :where(.list-row):has(.list-col-grow:nth-child(5)){--list-grid-cols:minmax(0,auto)minmax(0,auto)minmax(0,auto)minmax(0,auto)1fr}.list :where(.list-row):has(.list-col-grow:nth-child(6)){--list-grid-cols:minmax(0,auto)minmax(0,auto)minmax(0,auto)minmax(0,auto)minmax(0,auto)1fr}.list :where(.list-row) :not(.list-col-wrap){grid-row-start:1}:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{content:"";border-bottom:var(--border)solid;inset-inline:var(--radius-box);border-color:var(--color-base-content);position:absolute;bottom:0}@supports (color:color-mix(in lab,red,red)){:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{border-color:color-mix(in oklab,var(--color-base-content)5%,transparent)}}.toggle{border:var(--border)solid currentColor;color:var(--input-color);cursor:pointer;appearance:none;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--toggle-p),var(--radius-selector-max)) + min(var(--border),var(--radius-selector-max)));padding:var(--toggle-p);flex-shrink:0;grid-template-columns:0fr 1fr 1fr;place-content:center;display:inline-grid;position:relative;box-shadow:inset 0 1px}@supports (color:color-mix(in lab,red,red)){.toggle{box-shadow:0 1px color-mix(in oklab,currentColor calc(var(--depth)*10%),#0000) inset}}.toggle{--input-color:var(--color-base-content);transition:color .3s,grid-template-columns .2s}@supports (color:color-mix(in lab,red,red)){.toggle{--input-color:color-mix(in oklab,var(--color-base-content)50%,#0000)}}.toggle{--toggle-p:calc(var(--size)*.125);--size:calc(var(--size-selector,.25rem)*6);width:calc((var(--size)*2) - (var(--border) + var(--toggle-p))*2);height:var(--size)}.toggle>*{z-index:1;cursor:pointer;appearance:none;background-color:#0000;border:none;grid-column:2/span 1;grid-row-start:1;height:100%;padding:.125rem;transition:opacity .2s,rotate .4s}.toggle>:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.toggle>:focus{outline-offset:2px;outline:2px solid #0000}}.toggle>:nth-child(2){color:var(--color-base-100);rotate:none}.toggle>:nth-child(3){color:var(--color-base-100);opacity:0;rotate:-15deg}.toggle:has(:checked)>:nth-child(2){opacity:0;rotate:15deg}.toggle:has(:checked)>:nth-child(3){opacity:1;rotate:none}.toggle:before{aspect-ratio:1;border-radius:var(--radius-selector);--tw-content:"";content:var(--tw-content);height:100%;box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1)) inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1)) inset,0 1px currentColor;background-color:currentColor;grid-row-start:1;grid-column-start:2;transition:background-color .1s,translate .2s,inset-inline-start .2s;position:relative;inset-inline-start:0;translate:0}@supports (color:color-mix(in lab,red,red)){.toggle:before{box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1)) inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1)) inset,0 1px color-mix(in oklab,currentColor calc(var(--depth)*10%),#0000)}}.toggle:before{background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise)}@media (forced-colors:active){.toggle:before{outline-style:var(--tw-outline-style);outline-offset:-1px;outline-width:1px}}@media print{.toggle:before{outline-offset:-1rem;outline:.25rem solid}}.toggle:focus-visible,.toggle:has(:focus-visible){outline-offset:2px;outline:2px solid}.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked){background-color:var(--color-base-100);--input-color:var(--color-base-content);grid-template-columns:1fr 1fr 0fr}:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{background-color:currentColor}@starting-style{:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{opacity:0}}.toggle:indeterminate{grid-template-columns:.5fr 1fr .5fr}.toggle:disabled{cursor:not-allowed;opacity:.3}.toggle:disabled:before{border:var(--border)solid currentColor;background-color:#0000}.input{cursor:text;border:var(--border)solid #0000;appearance:none;background-color:var(--color-base-100);vertical-align:middle;white-space:nowrap;width:clamp(3rem,20rem,100%);height:var(--size);touch-action:manipulation;border-color:var(--input-color);box-shadow:0 1px var(--input-color) inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1)) inset;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-shrink:1;align-items:center;gap:.5rem;padding-inline:.75rem;font-size:.875rem;display:inline-flex;position:relative}@supports (color:color-mix(in lab,red,red)){.input{box-shadow:0 1px color-mix(in oklab,var(--input-color)calc(var(--depth)*10%),#0000) inset,0 -1px oklch(100% 0 0/calc(var(--depth)*.1)) inset}}.input{--size:calc(var(--size-field,.25rem)*10);--input-color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.input{--input-color:color-mix(in oklab,var(--color-base-content)20%,#0000)}}.input:where(input){display:inline-flex}.input :where(input){appearance:none;background-color:#0000;border:none;width:100%;height:100%;display:inline-flex}.input :where(input):focus,.input :where(input):focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.input :where(input):focus,.input :where(input):focus-within{outline-offset:2px;outline:2px solid #0000}}.input :where(input[type=url]),.input :where(input[type=email]){direction:ltr}.input :where(input[type=date]){display:inline-flex}.input:focus,.input:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab,red,red)){.input:focus,.input:focus-within{box-shadow:0 1px color-mix(in oklab,var(--input-color)calc(var(--depth)*10%),#0000)}}.input:focus,.input:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate;z-index:1}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{color:color-mix(in oklab,var(--color-base-content)40%,transparent)}}:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input)::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input)::placeholder{color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{box-shadow:none}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.input::-webkit-date-and-time-value{text-align:inherit}.input[type=number]::-webkit-inner-spin-button{margin-block:-.75rem;margin-inline-end:-.75rem}.input::-webkit-calendar-picker-indicator{position:absolute;inset-inline-end:.75em}.input:has(>input[type=date]) :where(input[type=date]){webkit-appearance:none;appearance:none;display:inline-flex}.input:has(>input[type=date]) input[type=date]::-webkit-calendar-picker-indicator{cursor:pointer;width:1em;height:1em;position:absolute;inset-inline-end:.75em}.table{border-radius:var(--radius-box);text-align:left;width:100%;font-size:.875rem;position:relative}.table:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:right}@media (hover:hover){:is(.table tr.row-hover,.table tr.row-hover:nth-child(2n)):hover{background-color:var(--color-base-200)}}.table :where(th,td){vertical-align:middle;padding-block:.75rem;padding-inline:1rem}.table :where(thead,tfoot){white-space:nowrap;color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.table :where(thead,tfoot){color:color-mix(in oklab,var(--color-base-content)60%,transparent)}}.table :where(thead,tfoot){font-size:.875rem;font-weight:600}.table :where(tfoot){border-top:var(--border)solid var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.table :where(tfoot){border-top:var(--border)solid color-mix(in oklch,var(--color-base-content)5%,#0000)}}.table :where(.table-pin-rows thead tr){z-index:1;background-color:var(--color-base-100);position:sticky;top:0}.table :where(.table-pin-rows tfoot tr){z-index:1;background-color:var(--color-base-100);position:sticky;bottom:0}.table :where(.table-pin-cols tr th){background-color:var(--color-base-100);position:sticky;left:0;right:0}.table :where(thead tr,tbody tr:not(:last-child)){border-bottom:var(--border)solid var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.table :where(thead tr,tbody tr:not(:last-child)){border-bottom:var(--border)solid color-mix(in oklch,var(--color-base-content)5%,#0000)}}.timeline{display:flex;position:relative}.timeline>li{grid-template-rows:var(--timeline-row-start,minmax(0,1fr))auto var(--timeline-row-end,minmax(0,1fr));grid-template-columns:var(--timeline-col-start,minmax(0,1fr))auto var(--timeline-col-end,minmax(0,1fr));flex-shrink:0;align-items:center;display:grid;position:relative}.timeline>li>hr{border:none;width:100%}.timeline>li>hr:first-child{grid-row-start:2;grid-column-start:1}.timeline>li>hr:last-child{grid-area:2/3/auto/none}@media print{.timeline>li>hr{border:.1px solid var(--color-base-300)}}.timeline :where(hr){background-color:var(--color-base-300);height:.25rem}.timeline:has(.timeline-middle hr):first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.timeline:has(.timeline-middle hr):last-child,.timeline:not(:has(.timeline-middle)) :first-child hr:last-child{border-start-start-radius:var(--radius-selector);border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:var(--radius-selector)}.timeline:not(:has(.timeline-middle)) :last-child hr:first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.card{border-radius:var(--radius-box);outline-offset:2px;outline:0 solid #0000;flex-direction:column;transition:outline .2s ease-in-out;display:flex;position:relative}.card:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.card:focus{outline-offset:2px;outline:2px solid #0000}}.card:focus-visible{outline-color:currentColor}.card :where(figure:first-child){border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-end-radius:unset;border-end-start-radius:unset;overflow:hidden}.card :where(figure:last-child){border-start-start-radius:unset;border-start-end-radius:unset;border-end-end-radius:inherit;border-end-start-radius:inherit;overflow:hidden}.card:where(.card-border){border:var(--border)solid var(--color-base-200)}.card:where(.card-dash){border:var(--border)dashed var(--color-base-200)}.card.image-full{display:grid}.card.image-full>*{grid-row-start:1;grid-column-start:1}.card.image-full>.card-body{color:var(--color-neutral-content);position:relative}.card.image-full :where(figure){border-radius:inherit;overflow:hidden}.card.image-full>figure img{object-fit:cover;filter:brightness(28%);height:100%}.card figure{justify-content:center;align-items:center;display:flex}.card:has(>input:is(input[type=checkbox],input[type=radio])){cursor:pointer;-webkit-user-select:none;user-select:none}.card:has(>:checked){outline:2px solid}.avatar{vertical-align:middle;display:inline-flex;position:relative}.avatar>div{aspect-ratio:1;display:block;overflow:hidden}.avatar img{object-fit:cover;width:100%;height:100%}.checkbox{border:var(--border)solid var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.checkbox{border:var(--border)solid var(--input-color,color-mix(in oklab,var(--color-base-content)20%,#0000))}}.checkbox{cursor:pointer;appearance:none;border-radius:var(--radius-selector);vertical-align:middle;color:var(--color-base-content);box-shadow:0 1px oklch(0% 0 0/calc(var(--depth)*.1)) inset,0 0 #0000 inset,0 0 #0000;--size:calc(var(--size-selector,.25rem)*6);width:var(--size);height:var(--size);background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise);flex-shrink:0;padding:.25rem;transition:background-color .2s,box-shadow .2s;display:inline-block;position:relative}.checkbox:before{--tw-content:"";content:var(--tw-content);opacity:0;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,70% 80%,70% 100%);width:100%;height:100%;box-shadow:0 3px oklch(100% 0 0/calc(var(--depth)*.1)) inset;background-color:currentColor;font-size:1rem;line-height:.75;transition:clip-path .3s .1s,opacity .1s .1s,rotate .3s .1s,translate .3s .1s;display:block;rotate:45deg}.checkbox:focus-visible{outline:2px solid var(--input-color,currentColor);outline-offset:2px}.checkbox:checked,.checkbox[aria-checked=true]{background-color:var(--input-color,#0000);box-shadow:0 0 #0000 inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1)) inset,0 1px oklch(0% 0 0/calc(var(--depth)*.1))}:is(.checkbox:checked,.checkbox[aria-checked=true]):before{clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 0%,70% 0%,70% 100%);opacity:1}@media (forced-colors:active){:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:"✔︎";clip-path:none;background-color:#0000;rotate:none}}@media print{:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:"✔︎";clip-path:none;background-color:#0000;rotate:none}}.checkbox:indeterminate{background-color:var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.checkbox:indeterminate{background-color:var(--input-color,color-mix(in oklab,var(--color-base-content)20%,#0000))}}.checkbox:indeterminate:before{opacity:1;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,80% 80%,80% 100%);translate:0 -35%;rotate:none}.checkbox:disabled{cursor:not-allowed;opacity:.2}.radio{cursor:pointer;appearance:none;vertical-align:middle;border:var(--border)solid var(--input-color,currentColor);border-radius:3.40282e38px;flex-shrink:0;padding:.25rem;display:inline-block;position:relative}@supports (color:color-mix(in lab,red,red)){.radio{border:var(--border)solid var(--input-color,color-mix(in srgb,currentColor 20%,#0000))}}.radio{box-shadow:0 1px oklch(0% 0 0/calc(var(--depth)*.1)) inset;--size:calc(var(--size-selector,.25rem)*6);width:var(--size);height:var(--size);color:var(--input-color,currentColor)}.radio:before{--tw-content:"";content:var(--tw-content);background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise);border-radius:3.40282e38px;width:100%;height:100%;display:block}.radio:focus-visible{outline:2px solid}.radio:checked,.radio[aria-checked=true]{background-color:var(--color-base-100);border-color:currentColor}@media (prefers-reduced-motion:no-preference){.radio:checked,.radio[aria-checked=true]{animation:.2s ease-out radio}}:is(.radio:checked,.radio[aria-checked=true]):before{box-shadow:0 -1px oklch(0% 0 0/calc(var(--depth)*.1)) inset,0 8px 0 -4px oklch(100% 0 0/calc(var(--depth)*.1)) inset,0 1px oklch(0% 0 0/calc(var(--depth)*.1));background-color:currentColor}@media (forced-colors:active){:is(.radio:checked,.radio[aria-checked=true]):before{outline-style:var(--tw-outline-style);outline-offset:-1px;outline-width:1px}}@media print{:is(.radio:checked,.radio[aria-checked=true]):before{outline-offset:-1rem;outline:.25rem solid}}.radio:disabled{cursor:not-allowed;opacity:.2}.progress{appearance:none;border-radius:var(--radius-box);background-color:currentColor;width:100%;height:.5rem;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.progress{background-color:color-mix(in oklab,currentcolor 20%,transparent)}}.progress{color:var(--color-base-content)}.progress:indeterminate{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%}@media (prefers-reduced-motion:no-preference){.progress:indeterminate{animation:5s ease-in-out infinite progress}}@supports ((-moz-appearance:none)){.progress:indeterminate::-moz-progress-bar{background-color:#0000}@media (prefers-reduced-motion:no-preference){.progress:indeterminate::-moz-progress-bar{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%;animation:5s ease-in-out infinite progress}}.progress::-moz-progress-bar{border-radius:var(--radius-box);background-color:currentColor}}@supports ((-webkit-appearance:none)){.progress::-webkit-progress-bar{border-radius:var(--radius-box);background-color:#0000}.progress::-webkit-progress-value{border-radius:var(--radius-box);background-color:currentColor}}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.tooltip-left>.tooltip-content,.tooltip-left[data-tip]:before{transform:translate(calc(var(--tt-pos,.25rem) - .25rem))translateY(-50%);inset:50% var(--tt-off)auto auto}.tooltip-left:after{transform:translate(var(--tt-pos,.25rem))translateY(-50%)rotate(-90deg);inset:50% calc(var(--tt-tail) + 1px)auto auto}.tooltip-right>.tooltip-content,.tooltip-right[data-tip]:before{transform:translate(calc(var(--tt-pos,-.25rem) + .25rem))translateY(-50%);inset:50% auto auto var(--tt-off)}.tooltip-right:after{transform:translate(var(--tt-pos,-.25rem))translateY(-50%)rotate(90deg);inset:50% auto auto calc(var(--tt-tail) + 1px)}.inset-0{inset:calc(var(--spacing)*0)}.dropdown-end{--anchor-h:span-left}.dropdown-end :where(.dropdown-content){inset-inline-end:0;translate:0}[dir=rtl] :is(.dropdown-end :where(.dropdown-content)){translate:0}.dropdown-end.dropdown-left{--anchor-h:left;--anchor-v:span-top}.dropdown-end.dropdown-left .dropdown-content{top:auto;bottom:0}.dropdown-end.dropdown-right{--anchor-h:right;--anchor-v:span-top}.dropdown-end.dropdown-right .dropdown-content{top:auto;bottom:0}.-top-2{top:calc(var(--spacing)*-2)}.top-2{top:calc(var(--spacing)*2)}.top-4{top:calc(var(--spacing)*4)}.top-\\[50\\%\\]{top:50%}.-right-1{right:calc(var(--spacing)*-1)}.-right-2{right:calc(var(--spacing)*-2)}.right-2{right:calc(var(--spacing)*2)}.right-4{right:calc(var(--spacing)*4)}.-bottom-1{bottom:calc(var(--spacing)*-1)}.bottom-4{bottom:calc(var(--spacing)*4)}.left-1\\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.left-4{left:calc(var(--spacing)*4)}.left-\\[-15px\\]{left:-15px}.btn-active{--btn-bg:var(--btn-color,var(--color-base-200))}@supports (color:color-mix(in lab,red,red)){.btn-active{--btn-bg:color-mix(in oklab,var(--btn-color,var(--color-base-200)),#000 7%)}}.btn-active{--btn-shadow:0 0 0 0 oklch(0% 0 0/0),0 0 0 0 oklch(0% 0 0/0);isolation:isolate}.modal-backdrop{color:#0000;z-index:-1;grid-row-start:1;grid-column-start:1;place-self:stretch stretch;display:grid}.modal-backdrop button{cursor:pointer}.z-10{z-index:10}.z-50{z-index:50}.z-\\[1000\\]{z-index:1000}.modal-box{background-color:var(--color-base-100);border-top-left-radius:var(--modal-tl,var(--radius-box));border-top-right-radius:var(--modal-tr,var(--radius-box));border-bottom-left-radius:var(--modal-bl,var(--radius-box));border-bottom-right-radius:var(--modal-br,var(--radius-box));opacity:0;overscroll-behavior:contain;grid-row-start:1;grid-column-start:1;width:91.6667%;max-width:32rem;max-height:100vh;padding:1.5rem;transition:translate .3s ease-out,scale .3s ease-out,opacity .2s ease-out 50ms,box-shadow .3s ease-out;overflow-y:auto;scale:95%;box-shadow:0 25px 50px -12px #00000040}.divider{white-space:nowrap;height:1rem;margin:var(--divider-m,1rem 0);--divider-color:var(--color-base-content);flex-direction:row;align-self:stretch;align-items:center;display:flex}@supports (color:color-mix(in lab,red,red)){.divider{--divider-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.divider:before,.divider:after{content:"";background-color:var(--divider-color);flex-grow:1;width:100%;height:.125rem}@media print{.divider:before,.divider:after{border:.5px solid}}.divider:not(:empty){gap:1rem}.filter{flex-wrap:wrap;display:flex}.filter input[type=radio]{width:auto}.filter input{opacity:1;transition:margin .1s,opacity .3s,padding .3s,border-width .1s;overflow:hidden;scale:1}.filter input:not(:last-child){margin-inline-end:.25rem}.filter input.filter-reset{aspect-ratio:1}.filter input.filter-reset:after{content:"×"}.filter:not(:has(input:checked:not(.filter-reset))) .filter-reset,.filter:not(:has(input:checked:not(.filter-reset))) input[type=reset],.filter:has(input:checked:not(.filter-reset)) input:not(:checked,.filter-reset,input[type=reset]){opacity:0;border-width:0;width:0;margin-inline:0;padding-inline:0;scale:0}.mx-auto{margin-inline:auto}.input-sm{--size:calc(var(--size-field,.25rem)*8);font-size:.75rem}.input-sm[type=number]::-webkit-inner-spin-button{margin-block:-.5rem;margin-inline-end:-.75rem}.my-2{margin-block:calc(var(--spacing)*2)}.label{white-space:nowrap;color:currentColor;align-items:center;gap:.375rem;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.label{color:color-mix(in oklab,currentcolor 60%,transparent)}}.label:has(input){cursor:pointer}.label:is(.input>*,.select>*){white-space:nowrap;height:calc(100% - .5rem);font-size:inherit;align-items:center;padding-inline:.75rem;display:flex}.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border)solid currentColor;margin-inline:-.75rem .75rem}@supports (color:color-mix(in lab,red,red)){.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border)solid color-mix(in oklab,currentColor 10%,#0000)}}.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border)solid currentColor;margin-inline:.75rem -.75rem}@supports (color:color-mix(in lab,red,red)){.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border)solid color-mix(in oklab,currentColor 10%,#0000)}}.join-item:where(:not(:first-child,:disabled,[disabled],.btn-disabled)){margin-block-start:0;margin-inline-start:calc(var(--border,1px)*-1)}.join-item:where(:is(:disabled,[disabled],.btn-disabled)){border-width:var(--border,1px)0 var(--border,1px)var(--border,1px)}.modal-action{justify-content:flex-end;gap:.5rem;margin-top:1.5rem;display:flex}.mt-0\\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-16{margin-top:calc(var(--spacing)*16)}.mt-px{margin-top:1px}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.ml-auto{margin-left:auto}.status{aspect-ratio:1;border-radius:var(--radius-selector);background-color:var(--color-base-content);width:.5rem;height:.5rem;display:inline-block}@supports (color:color-mix(in lab,red,red)){.status{background-color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.status{vertical-align:middle;color:#0000004d;background-position:50%;background-repeat:no-repeat}@supports (color:color-mix(in lab,red,red)){.status{color:color-mix(in oklab,var(--color-black)30%,transparent)}}.status{background-image:radial-gradient(circle at 35% 30%,oklch(1 0 0/calc(var(--depth)*.5)),#0000);box-shadow:0 2px 3px -1px}@supports (color:color-mix(in lab,red,red)){.status{box-shadow:0 2px 3px -1px color-mix(in oklab,currentColor calc(var(--depth)*100%),#0000)}}.badge{border-radius:var(--radius-selector);vertical-align:middle;color:var(--badge-fg);border:var(--border)solid var(--badge-color,var(--color-base-200));width:fit-content;padding-inline:calc(.25rem*3 - var(--border));background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise);background-color:var(--badge-bg);--badge-bg:var(--badge-color,var(--color-base-100));--badge-fg:var(--color-base-content);--size:calc(var(--size-selector,.25rem)*6);height:var(--size);justify-content:center;align-items:center;gap:.5rem;font-size:.875rem;display:inline-flex}.tabs{--tabs-height:auto;--tabs-direction:row;--tab-height:calc(var(--size-field,.25rem)*10);height:var(--tabs-height);flex-wrap:wrap;flex-direction:var(--tabs-direction);display:flex}.footer{grid-auto-flow:row;place-items:start;gap:2.5rem 1rem;width:100%;font-size:.875rem;line-height:1.25rem;display:grid}.footer>*{place-items:start;gap:.5rem;display:grid}.footer.footer-center{text-align:center;grid-auto-flow:column dense;place-items:center}.footer.footer-center>*{place-items:center}.card-body{padding:var(--card-p,1.5rem);font-size:var(--card-fs,.875rem);flex-direction:column;flex:auto;gap:.5rem;display:flex}.card-body :where(p){flex-grow:1}.alert{border-radius:var(--radius-box);color:var(--color-base-content);background-color:var(--alert-color,var(--color-base-200));text-align:start;border:var(--border)solid var(--color-base-200);background-size:auto,calc(var(--noise)*100%);background-image:none,var(--fx-noise);box-shadow:0 3px 0 -2px oklch(100% 0 0/calc(var(--depth)*.08)) inset,0 1px #000,0 4px 3px -2px oklch(0% 0 0/calc(var(--depth)*.08));grid-template-columns:auto;grid-auto-flow:column;justify-content:start;place-items:center start;gap:1rem;padding-block:.75rem;padding-inline:1rem;font-size:.875rem;line-height:1.25rem;display:grid}@supports (color:color-mix(in lab,red,red)){.alert{box-shadow:0 3px 0 -2px oklch(100% 0 0/calc(var(--depth)*.08)) inset,0 1px color-mix(in oklab,color-mix(in oklab,#000 20%,var(--alert-color,var(--color-base-200)))calc(var(--depth)*20%),#0000),0 4px 3px -2px oklch(0% 0 0/calc(var(--depth)*.08))}}.alert:has(:nth-child(2)){grid-template-columns:auto minmax(auto,1fr)}.alert.alert-outline{color:var(--alert-color);box-shadow:none;background-color:#0000;background-image:none}.alert.alert-dash{color:var(--alert-color);box-shadow:none;background-color:#0000;background-image:none;border-style:dashed}.alert.alert-soft{color:var(--alert-color,var(--color-base-content));background:var(--alert-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.alert.alert-soft{background:color-mix(in oklab,var(--alert-color,var(--color-base-content))8%,var(--color-base-100))}}.alert.alert-soft{border-color:var(--alert-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.alert.alert-soft{border-color:color-mix(in oklab,var(--alert-color,var(--color-base-content))10%,var(--color-base-100))}}.alert.alert-soft{box-shadow:none;background-image:none}.join{--join-ss:0;--join-se:0;--join-es:0;--join-ee:0;align-items:stretch;display:inline-flex}.join :where(.join-item){border-start-start-radius:var(--join-ss,0);border-start-end-radius:var(--join-se,0);border-end-end-radius:var(--join-ee,0);border-end-start-radius:var(--join-es,0)}.join :where(.join-item) *{--join-ss:var(--radius-field);--join-se:var(--radius-field);--join-es:var(--radius-field);--join-ee:var(--radius-field)}.join>.join-item:where(:first-child),.join :first-child:not(:last-child) :where(.join-item){--join-ss:var(--radius-field);--join-se:0;--join-es:var(--radius-field);--join-ee:0}.join>.join-item:where(:last-child),.join :last-child:not(:first-child) :where(.join-item){--join-ss:0;--join-se:var(--radius-field);--join-es:0;--join-ee:var(--radius-field)}.join>.join-item:where(:only-child),.join :only-child :where(.join-item){--join-ss:var(--radius-field);--join-se:var(--radius-field);--join-es:var(--radius-field);--join-ee:var(--radius-field)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.table{display:table}.btn-circle{width:var(--size);height:var(--size);border-radius:3.40282e38px;padding-inline:0}.btn-square{width:var(--size);height:var(--size);padding-inline:0}.size-1{width:calc(var(--spacing)*1);height:calc(var(--spacing)*1)}.size-2{width:calc(var(--spacing)*2);height:calc(var(--spacing)*2)}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-8{height:calc(var(--spacing)*8)}.h-16{height:calc(var(--spacing)*16)}.max-h-60{max-height:calc(var(--spacing)*60)}.max-h-full{max-height:100%}.loading-sm{width:calc(var(--size-selector,.25rem)*5)}.loading-xs{width:calc(var(--size-selector,.25rem)*4)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-8{width:calc(var(--spacing)*8)}.w-12{width:calc(var(--spacing)*12)}.w-16{width:calc(var(--spacing)*16)}.w-24{width:calc(var(--spacing)*24)}.w-28{width:calc(var(--spacing)*28)}.w-32{width:calc(var(--spacing)*32)}.w-40{width:calc(var(--spacing)*40)}.w-52{width:calc(var(--spacing)*52)}.w-56{width:calc(var(--spacing)*56)}.w-64{width:calc(var(--spacing)*64)}.w-full{width:100%}.max-w-full{max-width:100%}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing)*0)}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.-translate-x-1\\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-\\[15px\\]{--tw-translate-x:15px;translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-\\[15deg\\]{rotate:15deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skeleton{border-radius:var(--radius-box);background-color:var(--color-base-300)}@media (prefers-reduced-motion:reduce){.skeleton{transition-duration:15s}}.skeleton{will-change:background-position;background-image:linear-gradient(105deg,#0000 0% 40%,var(--color-base-100)50%,#0000 60% 100%);background-position-x:-50%;background-repeat:no-repeat;background-size:200%}@media (prefers-reduced-motion:no-preference){.skeleton{animation:1.8s ease-in-out infinite skeleton}}.link{cursor:pointer;text-decoration-line:underline}.link:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.link:focus{outline-offset:2px;outline:2px solid #0000}}.link:focus-visible{outline-offset:2px;outline:2px solid}.cursor-pointer{cursor:pointer}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-row-reverse{flex-direction:row-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-2\\.5{gap:calc(var(--spacing)*2.5)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-box{border-radius:var(--radius-box)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-\\[length\\:var\\(--border\\)\\]{border-style:var(--tw-border-style);border-width:var(--border)}.badge-soft{color:var(--badge-color,var(--color-base-content));background-color:var(--badge-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.badge-soft{background-color:color-mix(in oklab,var(--badge-color,var(--color-base-content))8%,var(--color-base-100))}}.badge-soft{border-color:var(--badge-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.badge-soft{border-color:color-mix(in oklab,var(--badge-color,var(--color-base-content))10%,var(--color-base-100))}}.badge-soft{background-image:none}.alert-error{border-color:var(--color-error);color:var(--color-error-content);--alert-color:var(--color-error)}.alert-info{border-color:var(--color-info);color:var(--color-info-content);--alert-color:var(--color-info)}.alert-success{border-color:var(--color-success);color:var(--color-success-content);--alert-color:var(--color-success)}.alert-warning{border-color:var(--color-warning);color:var(--color-warning-content);--alert-color:var(--color-warning)}.border-base-300{border-color:var(--color-base-300)}.border-base-content\\/10{border-color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.border-base-content\\/10{border-color:color-mix(in oklab,var(--color-base-content)10%,transparent)}}.border-white\\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.border-white\\/5{border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.bg-accent{background-color:var(--color-accent)}.bg-base-100{background-color:var(--color-base-100)}.bg-base-200,.bg-base-200\\/70{background-color:var(--color-base-200)}@supports (color:color-mix(in lab,red,red)){.bg-base-200\\/70{background-color:color-mix(in oklab,var(--color-base-200)70%,transparent)}}.bg-base-content{background-color:var(--color-base-content)}.bg-black\\/90{background-color:#000000e6}@supports (color:color-mix(in lab,red,red)){.bg-black\\/90{background-color:color-mix(in oklab,var(--color-black)90%,transparent)}}.bg-primary{background-color:var(--color-primary)}.bg-secondary{background-color:var(--color-secondary)}.loading-spinner{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.fill-current{fill:currentColor}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.radio-sm{padding:.1875rem}.radio-sm[type=radio]{--size:calc(var(--size-selector,.25rem)*5)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.menu-title{color:var(--color-base-content);padding-block:.5rem;padding-inline:.75rem}@supports (color:color-mix(in lab,red,red)){.menu-title{color:color-mix(in oklab,var(--color-base-content)40%,transparent)}}.menu-title{font-size:.875rem;font-weight:600}.badge-sm{--size:calc(var(--size-selector,.25rem)*5);padding-inline:calc(.25rem*2.5 - var(--border));font-size:.75rem}.px-1\\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.py-0\\.5{padding-block:calc(var(--spacing)*.5)}.py-8{padding-block:calc(var(--spacing)*8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[10px\\]{font-size:10px}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.break-all{word-break:break-all}.progress-primary{color:var(--color-primary)}.text-base-content,.text-base-content\\/90{color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.text-base-content\\/90{color:color-mix(in oklab,var(--color-base-content)90%,transparent)}}.text-info{color:var(--color-info)}.text-primary{color:var(--color-primary)}.text-warning{color:var(--color-warning)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.link-hover{text-decoration-line:none}@media (hover:hover){.link-hover:hover{text-decoration-line:underline}}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline-\\[length\\:var\\(--border\\)\\]{outline-style:var(--tw-outline-style);outline-width:var(--border)}.btn-ghost:not(.btn-active,:hover,:active:focus,:focus-visible){--btn-shadow:"";--btn-bg:#0000;--btn-border:#0000;--btn-noise:none}.btn-ghost:not(.btn-active,:hover,:active:focus,:focus-visible):not(:disabled,[disabled],.btn-disabled){--btn-fg:currentColor;outline-color:currentColor}@media (hover:none){.btn-ghost:hover:not(.btn-active,:active,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-shadow:"";--btn-bg:#0000;--btn-border:#0000;--btn-noise:none;--btn-fg:currentColor}}.outline-black\\/5{outline-color:#0000000d}@supports (color:color-mix(in lab,red,red)){.outline-black\\/5{outline-color:color-mix(in oklab,var(--color-black)5%,transparent)}}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition-\\[height\\,max-height\\]{transition-property:height,max-height;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.btn-soft:not(.btn-active,:hover,:active:focus,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-shadow:"";--btn-fg:var(--btn-color,var(--color-base-content));--btn-bg:var(--btn-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.btn-soft:not(.btn-active,:hover,:active:focus,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-bg:color-mix(in oklab,var(--btn-color,var(--color-base-content))8%,var(--color-base-100))}}.btn-soft:not(.btn-active,:hover,:active:focus,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-border:var(--btn-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.btn-soft:not(.btn-active,:hover,:active:focus,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-border:color-mix(in oklab,var(--btn-color,var(--color-base-content))10%,var(--color-base-100))}}.btn-soft:not(.btn-active,:hover,:active:focus,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-noise:none}@media (hover:none){.btn-soft:hover:not(.btn-active,:active,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-shadow:"";--btn-fg:var(--btn-color,var(--color-base-content));--btn-bg:var(--btn-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.btn-soft:hover:not(.btn-active,:active,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-bg:color-mix(in oklab,var(--btn-color,var(--color-base-content))8%,var(--color-base-100))}}.btn-soft:hover:not(.btn-active,:active,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-border:var(--btn-color,var(--color-base-content))}@supports (color:color-mix(in lab,red,red)){.btn-soft:hover:not(.btn-active,:active,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-border:color-mix(in oklab,var(--btn-color,var(--color-base-content))10%,var(--color-base-100))}}.btn-soft:hover:not(.btn-active,:active,:focus-visible,:disabled,[disabled],.btn-disabled){--btn-noise:none}}.btn-lg{--fontsize:1.125rem;--btn-p:1.25rem;--size:calc(var(--size-field,.25rem)*12)}.btn-sm{--fontsize:.75rem;--btn-p:.75rem;--size:calc(var(--size-field,.25rem)*8)}.btn-xs{--fontsize:.6875rem;--btn-p:.5rem;--size:calc(var(--size-field,.25rem)*6)}.badge-accent{--badge-color:var(--color-accent);--badge-fg:var(--color-accent-content)}.badge-info{--badge-color:var(--color-info);--badge-fg:var(--color-info-content)}.badge-primary{--badge-color:var(--color-primary);--badge-fg:var(--color-primary-content)}.badge-secondary{--badge-color:var(--color-secondary);--badge-fg:var(--color-secondary-content)}.btn-accent{--btn-color:var(--color-accent);--btn-fg:var(--color-accent-content)}.btn-error{--btn-color:var(--color-error);--btn-fg:var(--color-error-content)}.btn-info{--btn-color:var(--color-info);--btn-fg:var(--color-info-content)}.btn-neutral{--btn-color:var(--color-neutral);--btn-fg:var(--color-neutral-content)}.btn-primary{--btn-color:var(--color-primary);--btn-fg:var(--color-primary-content)}.btn-secondary{--btn-color:var(--color-secondary);--btn-fg:var(--color-secondary-content)}.btn-success{--btn-color:var(--color-success);--btn-fg:var(--color-success-content)}.btn-warning{--btn-color:var(--color-warning);--btn-fg:var(--color-warning-content)}.radio-primary,.toggle-primary:checked,.toggle-primary[aria-checked=true]{--input-color:var(--color-primary)}@media (hover:hover){.group-hover\\:border-base-content\\/20:is(:where(.group):hover *){border-color:var(--color-base-content)}@supports (color:color-mix(in lab,red,red)){.group-hover\\:border-base-content\\/20:is(:where(.group):hover *){border-color:color-mix(in oklab,var(--color-base-content)20%,transparent)}}.hover\\:translate-x-\\[15px\\]:hover{--tw-translate-x:15px;translate:var(--tw-translate-x)var(--tw-translate-y)}.hover\\:rotate-\\[15deg\\]:hover{rotate:15deg}.hover\\:opacity-100:hover{opacity:1}}@media (min-width:40rem){.sm\\:inline-block{display:inline-block}.sm\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:48rem){.md\\:flex{display:flex}}.\\[\\&_svg\\]\\:visible svg{visibility:visible}}@keyframes rating{0%,40%{filter:brightness(1.05)contrast(1.05);scale:1.1}}@keyframes dropdown{0%{opacity:0}}@keyframes radio{0%{padding:5px}50%{padding:3px}}@keyframes toast{0%{opacity:0;scale:.9}to{opacity:1;scale:1}}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}@keyframes progress{50%{background-position-x:-115%}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}`;
dayjs.extend(localizedFormat);
function mountApp() {
const root = document.createElement("div");
root.id = "tmd-root";
document.body.append(root);
const shadowRoot = root.attachShadow({ mode: "open" });
shadowRoot.adoptedStyleSheets = [prepareStyles()];
preact.render( u(MediaDownloaderApp, {}), shadowRoot);
}
function prepareStyles() {
const shadowSheet = new CSSStyleSheet();
shadowSheet.replaceSync(styles.replace(/:root/gu, ":host"));
const globalSheet = new CSSStyleSheet();
for (const rule of shadowSheet.cssRules) {
if (rule instanceof CSSPropertyRule) {
globalSheet.insertRule(rule.cssText);
}
}
document.adoptedStyleSheets.push(globalSheet);
return shadowSheet;
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", mountApp);
} else {
mountApp();
}
})(preact, preactSignals, preactHooks, i18next, dayjs, Dexie, FileSaver, fflate);