Files
ComfyUI-Lora-Manager/web/comfyui/top_menu_extension.js
Will Miao 5c29e26c4e fix(top-menu): add backward compatibility for actionBarButtons API (#853)
- Implement version detection using __COMFYUI_FRONTEND_VERSION__ and /system_stats API
- Add version parsing and comparison utilities
- Dynamically register extension based on frontend version
- Use actionBarButtons API for frontend >= 1.33.9
- Fallback to legacy ComfyButton approach for older versions
- Add comprehensive version detection tests
2026-03-12 07:41:29 +08:00

267 lines
26 KiB
JavaScript

import { app } from "../../scripts/app.js";
import { ComfyButtonGroup } from "../../scripts/ui/components/buttonGroup.js";
import { ComfyButton } from "../../scripts/ui/components/button.js";
const BUTTON_TOOLTIP = "Launch LoRA Manager (Shift+Click opens in new window)";
const LORA_MANAGER_PATH = "/loras";
const NEW_WINDOW_FEATURES = "width=1200,height=800,resizable=yes,scrollbars=yes,status=yes";
const MAX_ATTACH_ATTEMPTS = 120;
const BUTTON_GROUP_CLASS = "lora-manager-top-menu-group";
const MIN_VERSION_FOR_ACTION_BAR = [1, 33, 9];
const openLoraManager = (event) => {
const url = `${window.location.origin}${LORA_MANAGER_PATH}`;
if (event.shiftKey) {
window.open(url, "_blank", NEW_WINDOW_FEATURES);
return;
}
window.open(url, "_blank");
};
const getComfyUIFrontendVersion = async () => {
try {
if (window['__COMFYUI_FRONTEND_VERSION__']) {
return window['__COMFYUI_FRONTEND_VERSION__'];
}
} catch (error) {
console.warn("LoRA Manager: unable to read __COMFYUI_FRONTEND_VERSION__:", error);
}
try {
const response = await fetch("/system_stats");
const data = await response.json();
if (data?.system?.comfyui_frontend_version) {
return data.system.comfyui_frontend_version;
}
if (data?.system?.required_frontend_version) {
return data.system.required_frontend_version;
}
} catch (error) {
console.warn("LoRA Manager: unable to fetch system_stats:", error);
}
return "0.0.0";
};
const parseVersion = (versionStr) => {
if (!versionStr || typeof versionStr !== 'string') {
return [0, 0, 0];
}
const cleanVersion = versionStr.replace(/^[vV]/, '').split('-')[0];
const parts = cleanVersion.split('.').map(part => parseInt(part, 10) || 0);
while (parts.length < 3) {
parts.push(0);
}
return parts;
};
const compareVersions = (version1, version2) => {
const v1 = typeof version1 === 'string' ? parseVersion(version1) : version1;
const v2 = typeof version2 === 'string' ? parseVersion(version2) : version2;
for (let i = 0; i < 3; i++) {
if (v1[i] > v2[i]) return 1;
if (v1[i] < v2[i]) return -1;
}
return 0;
};
const supportsActionBarButtons = async () => {
const version = await getComfyUIFrontendVersion();
return compareVersions(version, MIN_VERSION_FOR_ACTION_BAR) >= 0;
};
const fetchVersionInfo = async () => {
try {
const response = await fetch("/api/lm/version-info");
const data = await response.json();
if (data.success) {
return data.version;
}
} catch (error) {
console.error("LoRA Manager: error fetching version info:", error);
}
return "";
};
const createTopMenuButton = () => {
const button = new ComfyButton({
icon: "loramanager",
tooltip: BUTTON_TOOLTIP,
app,
enabled: true,
classList: "comfyui-button comfyui-menu-mobile-collapse primary",
});
button.element.setAttribute("aria-label", BUTTON_TOOLTIP);
button.element.title = BUTTON_TOOLTIP;
if (button.iconElement) {
button.iconElement.innerHTML = getLoraManagerIcon();
button.iconElement.style.width = "1.2rem";
button.iconElement.style.height = "1.2rem";
}
button.element.addEventListener("click", openLoraManager);
return button;
};
const attachTopMenuButton = (attempt = 0) => {
if (document.querySelector(`.${BUTTON_GROUP_CLASS}`)) {
return;
}
const settingsGroup = app.menu?.settingsGroup;
if (!settingsGroup?.element?.parentElement) {
if (attempt >= MAX_ATTACH_ATTEMPTS) {
console.warn("LoRA Manager: unable to locate the ComfyUI settings button group.");
return;
}
requestAnimationFrame(() => attachTopMenuButton(attempt + 1));
return;
}
const loraManagerButton = createTopMenuButton();
const buttonGroup = new ComfyButtonGroup(loraManagerButton);
buttonGroup.element.classList.add(BUTTON_GROUP_CLASS);
settingsGroup.element.before(buttonGroup.element);
};
const createAboutBadge = (version) => {
const label = version ? `LoRA Manager v${version}` : "LoRA Manager";
return {
label,
url: "https://github.com/willmiao/ComfyUI-Lora-Manager",
icon: "pi pi-tags",
};
};
const createExtensionObject = (useActionBar) => {
const extensionObj = {
name: "LoraManager.TopMenu",
async setup() {
const version = await fetchVersionInfo();
if (!useActionBar) {
console.log("LoRA Manager: using legacy button attachment (frontend version < 1.33.9)");
attachTopMenuButton();
} else {
console.log("LoRA Manager: using actionBarButtons API (frontend version >= 1.33.9)");
}
this.aboutPageBadges = [createAboutBadge(version)];
const injectStyles = () => {
const styleId = 'lm-top-menu-button-styles';
if (document.getElementById(styleId)) return;
const style = document.createElement('style');
style.id = styleId;
style.textContent = `
button[aria-label="Launch LoRA Manager (Shift+Click opens in new window)"].lm-top-menu-button {
transition: all 0.2s ease;
border: 1px solid transparent;
}
button[aria-label="Launch LoRA Manager (Shift+Click opens in new window)"].lm-top-menu-button:hover {
background-color: var(--primary-hover-bg) !important;
}
`;
document.head.appendChild(style);
};
injectStyles();
const replaceButtonIcon = () => {
const buttons = document.querySelectorAll('button[aria-label="Launch LoRA Manager (Shift+Click opens in new window)"]');
buttons.forEach(button => {
button.classList.add('lm-top-menu-button');
button.innerHTML = getLoraManagerIcon();
button.style.borderRadius = '4px';
button.style.padding = '6px';
button.style.backgroundColor = 'var(--primary-bg)';
const svg = button.querySelector('svg');
if (svg) {
svg.style.width = '20px';
svg.style.height = '20px';
}
});
if (buttons.length === 0) {
requestAnimationFrame(replaceButtonIcon);
}
};
requestAnimationFrame(replaceButtonIcon);
},
};
if (useActionBar) {
extensionObj.actionBarButtons = [
{
icon: "icon-[mdi--alpha-l-box] size-4",
tooltip: BUTTON_TOOLTIP,
onClick: openLoraManager
}
];
}
return extensionObj;
};
(async () => {
const useActionBar = await supportsActionBarButtons();
const extensionObj = createExtensionObject(useActionBar);
app.registerExtension(extensionObj);
})();
const getLoraManagerIcon = () => {
return `
<svg enable-background="new 0 0 512 512" version="1.1" viewBox="0 0 512 512" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<path d="m246 513h-244.97v-511.91h511.82v511.91h-266.85m49.085-213.94c-4.361 0.0607-8.722 0.1214-14.003 0.011933-5.0363 0.055023-10.073 0.11005-15.58 0.032653 0 0-0.46661 0.14719-1.32 0.005707-1.7251 0.050324-3.4501 0.10065-6.0804-0.02182-3.3896 0.055725-6.7792 0.11145-11.079-0.006653h-14.108c0-10.968 0-21.029 0.16602-32.015-0.053467-12.694-0.10693-25.387 0.010132-39.003-0.061066-8.6906-0.12212-17.381-0.022263-26.997-0.056701-9.6923-0.1134-19.385-0.005004-30.001v-40.96c-13.187 0-25.623 0-38.981-0.18008-9.6981 0.050782-19.396 0.10156-29.956 0.039337-0.31555 4.0221-0.6311 8.0442-1.1103 12.9 0.055817 1.6951 0.11165 3.3903 0.017471 5.9173 0.051193 1.4047 0.1024 2.8093-0.011429 5.1036 0.049881 2.7127 0.099747 5.4254-0.006973 8.7772 0.052658 0.43225 0.1053 0.86449 0.00795 2.2206 0.049942 4.3812 0.099899 8.7625-0.015915 14.041 0.055603 3.3429 0.11122 6.6859 0.022659 10.715 0.050782 0.46198 0.10156 0.92394-0.013916 2.3056 0.054154 16.334 0.10831 32.669 7.7e-5 49.934 0.051117 8.3853 0.10223 16.771-0.010285 26.074 0.054642 14.003 0.10928 28.006 0.010132 42.934 0.042496 4.7077 0.084976 9.4154-0.039978 15.044v42.686c11.969 0 23.056 0 35 0.10275 5.3469-0.057068 10.694-0.11414 16.94 0.009217 3.3708-0.088257 6.7415-0.17648 11.019-0.068421 4.3607-0.053772 8.7214-0.10754 13.951 0.02652 2.3679-0.049103 4.7359-0.098206 7.8977 0.039673 1.0772-0.079254 2.1544-0.15851 4.1191-0.03656 3.0312-0.065155 6.0624-0.13031 10.013-0.002472 8.3593-0.077851 16.719-0.1557 25.976-0.019043 3.3658-0.090363 6.7315-0.18076 10.973-0.02536 2.7193-0.061676 5.4385-0.12332 9.0656 0.04187 7.3558-0.081452 14.712-0.1629 22.981-0.02002h35.448c-7.6203-9.7498-14.395-18.417-21.336-27.726-9.6361-12.402-19.272-24.804-29.066-37.903-1.4952-3.2602-3.9758-4.3957-7.559-4.0944-4.1114 0.3457-8.2635 0.20969-13.314 0.11584z" fill="#D3E2E7"/>
<path d="m163.17 178.03c-0.049942-4.3812-0.099899-8.7625 0.1004-13.765 0.13296-1.1603 0.015686-1.6994-0.10159-2.2386-0.049881-2.7127-0.099747-5.4254 0.28459-8.5737 3.8217 2.5891 7.3571 5.4659 10.565 8.6709 5.9298 5.9253 11.631 12.079 17.499 18.067 3.4437 3.5142 7.1115 6.8102 10.524 10.353 4.3965 4.5639 8.563 9.3511 13.01 13.864 0.91469 0.92827 2.6273 1.0703 4.2242 1.8514 0.42363 1.0752 0.57736 1.8779 0.76941 2.6714 1.9774 8.1697 5.1124 15.599 12.873 20.058 0.053467 12.694 0.10693 25.387-0.28078 38.535-3.872-3.0729-7.9882-6.1637-10.577-10.228-4.1268-6.4786-7.9211-12.949-14.658-17.218-3.068-1.944-6.3081-4.2533-8.2322-7.2042-2.3936-3.6709-3.3376-8.2585-5.2787-12.271-0.56981-1.1778-2.3726-2.4215-3.6576-2.4739-5.0481-0.20583-9.1619-1.3178-10.283-7.0932-0.11482-0.59161-0.69144-1.1186-1.1181-1.6209-5.2109-6.1347-10.434-12.259-15.654-18.386-0.050781-0.46198-0.10156-0.92394 0.15042-2.0509 0.14862-4.0924-0.005524-7.5198-0.15967-10.947z" fill="#1B3F68"/>
<path d="m261 368.5c-3.0312 0.065155-6.0624 0.13031-9.5385-0.2673-1.4572-2.1863-2.1912-4.1754-3.5345-5.583-3.8645-4.0493-8.1532-7.6989-11.949-11.807-6.4842-7.0166-12.597-14.377-19.093-21.382-7.4859-8.0734-15.183-15.953-22.86-23.846-3.0967-3.1842-6.0108-6.7592-9.6728-9.1294-5.1727-3.348-9.4425-6.9757-13.205-12.135-3.9731-5.4479-8.1443-10.193-7.9737-17.31-0.051117-8.3853-0.10223-16.771 0.15355-25.931 0.43352-2.8878 0.56012-5.0001 1.0604-7.0455 2.7328 4.7317 5.6544 9.2049 7.3238 14.105 2.7444 8.0549 8.1924 14.329 14.377 19.115 9.0527 7.0058 15.908 15.581 22.43 24.635 2.6803 3.7206 4.9222 7.7571 7.6141 12.05 0 1.0439-0.65512 4.1595 0.11708 4.5664 2.8505 1.5021 2.2144 3.2966 2.1128 5.7618-0.068939 1.6719 1.899 3.4408 3.0126 5.1289 0.11246 0.17047 0.61665 0.08252 1.1333 0.13376 4.5254-3.744-1.7202-8.3744 1.0756-12.557 2.2374 3.1289 3.7238 6.486 5.4377 9.7227 0.58263 1.1003 1.6324 2.5513 2.6507 2.7158 3.6856 0.59546 8.304 4.3628 8.0555 7.9741-0.19208 2.7921-3.1169 5.859-2.4652 8.1243 0.74419 2.5866 4.3953 4.1964 6.2695 6.6267 4.3205 5.6028 8.4418 11.369 12.418 17.223 1.9435 2.861 3.3824 6.0647 5.0498 9.1133z" fill="#20487B"/>
<path d="m164.01 234c-0.12662 2.1123-0.25322 4.2246-0.60553 6.647-0.27988-16.024-0.33403-32.359-0.30505-49.153 5.3029 5.6673 10.526 11.792 15.737 17.927 0.42668 0.50234 1.0033 1.0293 1.1181 1.6209 1.1207 5.7754 5.2345 6.8874 10.283 7.0932 1.285 0.052383 3.0878 1.2961 3.6576 2.4739 1.941 4.0122 2.885 8.5998 5.2787 12.271 1.9241 2.9508 5.1642 5.2602 8.2322 7.2042 6.7366 4.2685 10.531 10.739 14.658 17.218 2.5887 4.0638 6.7048 7.1546 10.494 10.689 0.35817 10.069 0.35817 20.131 0.35817 31.099 5.0242 0 9.5659 0 14.302 0.2839-1.2759 1.3997-2.7459 2.5155-4.6252 3.5673-2.8419-0.35477-5.2686-0.81348-7.7086-0.9018-5.2419-0.18964-5.998-1.4115-5.6746-6.6582 0.13591-2.2049-1.5483-4.522-2.4051-6.7881-1.6008 1.1373-3.2017 2.2747-5.1789 3.4019-1.6066-0.73352-3.3214-1.1555-3.9889-2.2289-4.5555-7.3251-8.7257-14.894-13.401-22.138-1.3535-2.0974-3.8807-3.4899-6.0026-5.0216-1.5974-1.153-3.8721-1.6329-5.0419-3.0675-5.2293-6.4128-10.147-13.079-15.223-19.617-3.9326-5.0652-7.923-10.086-11.936-15.087-0.20993-0.2616-0.87709-0.15622-2.0206-0.32098v9.4876z" fill="#1F4371"/>
<path d="m164.38 234.06c-0.37366-3.1555-0.37366-6.2441-0.37366-9.5545 1.1435 0.16476 1.8107 0.059387 2.0206 0.32098 4.0135 5.0013 8.0038 10.022 11.936 15.087 5.0766 6.5386 9.994 13.205 15.223 19.617 1.1698 1.4346 3.4445 1.9145 5.0419 3.0675 2.1219 1.5317 4.6491 2.9242 6.0026 5.0216 4.6751 7.2444 8.8453 14.813 13.401 22.138 0.66753 1.0733 2.3823 1.4954 4.0579 2.5667 2.1118 3.1135 3.4078 6.2109 5.5241 8.5737 4.0553 4.5276 8.5237 8.6932 12.924 12.901 2.76 2.6395 6.2639 4.6784 8.4577 7.6964 4.8588 6.6841 9.0249 13.868 13.681 20.707 0.67825 0.99628 2.5421 1.1342 3.7758 1.8167 1.4779 0.8176 3.1536 1.5408 4.2315 2.7583 1.7444 1.9703 2.923 4.4335 4.6107 6.464 2.2428 2.6984 4.3207 5.96 7.2462 7.5534 3.4221 1.8639 5.2011 3.8418 4.8499 7.6612-8.3593 0.07785-16.719 0.1557-25.538 0.13705-2.1272-3.1451-3.5662-6.3488-5.5096-9.2098-3.9763-5.8535-8.0976-11.62-12.418-17.223-1.8742-2.4304-5.5253-4.0401-6.2695-6.6267-0.65172-2.2653 2.2731-5.3322 2.4652-8.1243 0.24843-3.6113-4.37-7.3786-8.0555-7.9741-1.0182-0.16452-2.068-1.6155-2.6507-2.7158-1.7138-3.2367-3.2003-6.5938-5.4377-9.7227-2.7958 4.1831 3.4498 8.8134-1.0756 12.557-0.51665-0.051239-1.0208 0.036712-1.1333-0.13376-1.1136-1.6881-3.0815-3.4569-3.0126-5.1289 0.10164-2.4652 0.73772-4.2597-2.1128-5.7618-0.7722-0.40692-0.11708-3.5225-0.11708-4.5664-2.6919-4.2924-4.9337-8.329-7.6141-12.05-6.5222-9.0535-13.378-17.629-22.43-24.635-6.1847-4.7863-11.633-11.06-14.377-19.115-1.6694-4.8998-4.591-9.373-7.3238-14.105z" fill="#1F4477"/>
<path d="m163.09 267.5c-0.088852 6.6577 4.0824 11.403 8.0555 16.851 3.7628 5.1596 8.0326 8.7873 13.205 12.135 3.6619 2.3702 6.576 5.9452 9.6728 9.1294 7.677 7.8939 15.374 15.773 22.86 23.846 6.4957 7.0055 12.608 14.366 19.093 21.382 3.7961 4.1079 8.0849 7.7575 11.949 11.807 1.3433 1.4076 2.0773 3.3967 3.0907 5.4824-1.076 0.44141-2.1532 0.52066-3.7775 0.1886-3.1047-0.21295-5.6623-0.014557-8.2198 0.18381-4.3607 0.053772-8.7214 0.10754-13.541-0.29996-1.5454-2.554-2.2343-5.0296-3.8026-6.6587-3.147-3.2689-6.3859-5.9846-5.0509-11.439 0.92644-3.7853-6.1297-11.692-9.6324-10.915-4.151 0.92041-5.4897-0.83734-5.9998-4.3052-0.57637-3.9187-2.9089-5.2247-6.6835-4.9406-1.952 0.14694-4.6043 0.49539-5.8116-0.55026-6.6335-5.7454-15.781-8.6921-19.66-17.563-1.0527-2.4074-3.0045-3.5915-5.6648-1.8667-0.054657-14.003-0.1093-28.006-0.082123-42.467z" fill="#215186"/>
<path d="m164.99 130.08c9.6981-0.050766 19.396-0.10155 29.608 0.27655 4.9553 5.2508 9.4102 10.061 13.835 14.898 4.6498 5.084 9.2589 10.205 13.907 15.29 3.5025 3.8317 7.0389 7.6324 10.56 11.447 0.056702 9.6923 0.1134 19.385-0.25523 29.485-1.551-0.90834-2.7495-2.17-3.7884-3.5517-2.9725-3.9534-5.8802-7.9555-8.8201-12.335-0.021423-1.4535-0.035995-2.5105-0.054641-3.9371-0.7488-1.3965-1.4935-2.4236-2.2382-3.4506-0.58057 0.59474-1.1611 1.1895-2.0424 1.6254-2.6653-2.3578-4.9708-4.2704-8.6981-3.0048-1.3601 0.46181-3.2618-0.2393-4.7898-0.77266-11.62-4.056-15.665-13.424-17.277-24.593-0.27052-1.8745-1.035-4.2184-2.3999-5.278-2.5799-2.0029-5.9129-3.0036-8.6579-4.8335-4.1301-2.7532-8.4173-5.5533-8.8882-11.266z" fill="#1B234D"/>
<path d="m265.97 299.24c5.0363-0.055023 10.073-0.11005 15.572 0.28528 1.5204 2.3517 2.5758 4.2544 3.6367 6.154 1.9278 3.4516 3.8589 6.9014 5.4102 10.353-2.4442 1.0115-4.51 2.0221-6.5549 3.0223 4.5836 1.3154 10.028 1.2878 11.388 3.6308 2.1848 3.7645 5.6104 6.186 7.6917 9.4691 4.8528 7.6547 11.882 11.222 19.892 14.218 1.479 2.2007 2.7889 4.1961 4.4487 5.838 3.8219 3.7806 7.8139 7.3893 11.462 10.81-3.6179 2.2006-6.2695 3.8135-8.9212 5.4264-7.3558 0.081421-14.712 0.16287-22.526-0.25156-0.57544-6.3293-2.9707-10.911-7.7153-14.389-1.9605-1.4371-4.5201-3.0302-5.1881-5.08-2.253-6.9132-9.4272-8.1822-13.614-12.799-3.0734-3.3893-6.6507-6.3216-10.462-9.8861 2.8946-0.90228 4.697-1.4641 6.86-2.0436 0.79562-1.1476 1.7468-3.1784 1.5869-3.2701-1.8857-1.0805-3.9377-1.8707-5.9914-3.0901-3.068-3.1406-5.7419-6.519-9.2036-8.5631-4.11-2.427-6.2817-5.0145-4.7388-9.81 1.7251-0.050354 3.4501-0.10068 5.6988 0.034546 0.52362 0.18555 0.94125 0.2326 0.94125 0.2326l0.32617-0.29144z" fill="#1C3968"/>
<path d="m323 346.01c-8-2.6294-15.029-6.1971-19.882-13.852-2.0813-3.2831-5.507-5.7046-7.6917-9.4691-1.3598-2.343-6.8044-2.3154-11.388-3.6308 2.0448-1.0002 4.1107-2.0108 6.5657-3.0335 0.38919-0.012146 0.38104 0.003021 0.5647 0.2327 0.73486 0.40274 1.2861 0.57581 2.1561 0.927 5.2222 4.1615 9.2332-0.65744 13.987-1.3346 1.722-2.1187 4.2692-4.0591 4.3045-6.0442 0.063507-3.5712 2.1678-4.6829 4.5013-6.0638 9.6361 12.402 19.272 24.804 28.893 37.906-3.265 2.2009-6.3964 4.4832-9.7952 4.9973-3.9494 0.59738-8.1332-0.35556-12.215-0.63565z" fill="#1B234D"/>
<path d="m164.56 130.03c0.90184 5.7692 5.1891 8.5692 9.3192 11.322 2.745 1.8298 6.078 2.8306 8.6579 4.8335 1.3649 1.0596 2.1293 3.4035 2.3999 5.278 1.6119 11.169 5.6572 20.537 17.277 24.593 1.528 0.53336 3.4297 1.2345 4.7898 0.77266 3.7272-1.2656 6.0328 0.64702 8.9003 3.2615 1.6961 0.92305 2.8893 1.4306 4.0826 1.9381 0.014572 1.0571 0.029144 2.1142 0.038086 4.0155-0.34665 4.2182-0.68764 7.5922-1.2797 11.229-0.083618 2.0829 0.083862 3.903 0.25626 6.0971 0.012314 1.1219 0.019699 1.8696 0.027069 2.6174-1.3448-0.50441-3.0574-0.64644-3.9721-1.5747-4.4466-4.5126-8.6131-9.2998-13.01-13.864-3.4128-3.5427-7.0805-6.8388-10.524-10.353-5.8681-5.9881-11.569-12.141-17.499-18.067-3.2074-3.205-6.7429-6.0818-10.482-9.1157-0.40289-1.4138-0.4541-2.8184-0.21498-4.9156 0.14549-2.4813 6.71e-4 -4.2701-0.14415-6.059 0.31557-4.0221 0.63112-8.0442 1.3776-12.01z" fill="#193A60"/>
<path d="m287.44 368.57c-0.097748-3.9267-1.8767-5.9046-5.2988-7.7685-2.9255-1.5934-5.0034-4.855-7.2462-7.5534-1.6877-2.0305-2.8663-4.4937-4.6107-6.464-1.0779-1.2175-2.7536-1.9407-4.2315-2.7583-1.2337-0.68253-3.0975-0.8204-3.7758-1.8167-4.656-6.839-8.8222-14.023-13.681-20.707-2.1938-3.018-5.6977-5.0569-8.4577-7.6964-4.4-4.208-8.8684-8.3736-12.924-12.901-2.1163-2.3628-3.4123-5.4602-5.1478-8.5635 1.5319-1.4751 3.1327-2.6125 4.7336-3.7498 0.85676 2.2661 2.541 4.5832 2.4051 6.7881-0.32344 5.2468 0.43274 6.4686 5.6746 6.6582 2.44 0.088318 4.8667 0.54703 7.8706 1.2027 3.3171 3.0078 7.7289 5.2561 8.4678 8.3746 1.62 6.8377 8.4818 7.0446 11.891 11.598 0.3316 0.46524 0.58518 0.66095 0.93484 1.1372 2.4323 3.4736 4.5685 6.8373 7.2491 9.6894 7.6806 8.1717 15.674 16.049 23.345 24.23 2.5526 2.7224 5.131 5.8085 3.3483 10.136-3.3658 0.090362-6.7315 0.18076-10.546 0.16385z" fill="#1E3F74"/>
<path d="m163.09 310.43c2.7372-2.1877 4.689-1.0036 5.7417 1.4038 3.8792 8.871 13.027 11.818 19.66 17.563 1.2073 1.0457 3.8596 0.6972 5.8116 0.55026 3.7746-0.28406 6.1071 1.0219 6.6835 4.9406 0.51004 3.4679 1.8487 5.2256 5.9998 4.3052 3.5028-0.77667 10.559 7.1297 9.6324 10.915-1.335 5.4545 1.9039 8.1701 5.0509 11.439 1.5683 1.6291 2.2572 4.1047 3.3494 6.5605-3.3652 0.45136-6.736 0.53958-10.558 0.14337-0.23926-4.488-0.57546-8.1761-5.793-9.3803-1.9634-1.1939-3.7083-2.1326-5.2005-3.3748-0.30966-0.25778 0.31806-1.6416 0.90298-2.5031 1.7193-0.68613 3.0493-1.3755 4.3793-2.065-0.6879-1.2318-1.1949-2.6195-2.0974-3.6662-2.7884-3.2339-6.3106-1.7596-9.6588-1.6361-0.005234-1.1191-0.007752-1.8652-0.005921-2.9953-1.0159-1.9848-2.0361-3.5856-3.0562-5.1863-0.69019 1.4736-1.5445 2.8977-2.0099 4.4392-0.28595 0.94711 0.02301 2.0739 0.008179 3.4223-1.6748 0.092224-3.2929-0.11795-4.9242-0.69904-1.2951-1.9119-2.3381-3.7785-3.9065-4.9288-3.7422-2.7446-7.6403-5.3104-11.658-7.6327-2.2971-1.3278-4.9517-2.037-7.4509-3.3801-0.28717-1.4532-0.56871-2.551-0.85025-3.6488-0.042496-4.7077-0.084976-9.4154-0.050568-14.586z" fill="#235A8F"/>
<path d="m232.98 171.53c-3.6039-3.3526-7.1403-7.1533-10.643-10.985-4.6484-5.0852-9.2576-10.206-13.907-15.29-4.4244-4.8376-8.8792-9.6472-13.373-14.808 12.383-0.33884 24.819-0.33884 38.006-0.33884 0 13.592 0 27.276-0.082551 41.422z" fill="#181D3F"/>
<path d="m203.98 352.99c-0.19568 0.86487-0.8234 2.2487-0.51373 2.5065 1.4922 1.2422 3.2371 2.1808 5.2018 3.743-0.5274 2.247-1.3643 3.9783-1.9142 5.1157-3.4445-1.5289-5.9633-2.6469-8.4821-3.7649-0.386 2.6779-0.772 5.3559-1.158 8.0338h-34.143c0-14.325 0-28.506 0.083725-43.147 0.36526 0.63727 0.6468 1.7351 0.93103 3.6547 0.002167 5.309-0.001785 9.7962 0.001847 14.283 0.006713 8.2924 0.1274 8.4656 7.9234 11.551 4.0751 1.6125 12.124-0.5679 14.729-4.1378-2.8344-2.5004-5.6846-5.0147-8.5349-7.5291 0.19946-0.28909 0.39893-0.57816 0.59837-0.86725 2.7712 0.84872 5.5425 1.6975 8.3137 2.5463 1.6181 0.21018 3.2362 0.42035 5.1516 0.11582 0.95975-3.4691 2.9843-2.4913 4.813-2.0789 0.002517 0.74606 0.005035 1.4922 0.083114 2.9543 2.3553 2.8177 4.635 4.9193 6.9148 7.021z" fill="#3674A0"/>
<path d="m323.01 346.37c4.0718-0.085663 8.2557 0.86728 12.205 0.2699 3.3988-0.51407 6.5302-2.7964 9.8787-4.6761 6.873 8.2879 13.647 16.955 21.268 26.705-12.773 0-24.11 0-35.905-0.11215 2.1946-1.725 4.8463-3.3379 8.4642-5.5385-3.6481-3.4208-7.6401-7.0295-11.462-10.81-1.6598-1.6418-2.9697-3.6373-4.4487-5.838z" fill="#1A345D"/>
<path d="m218.99 197.01c0.34099-3.3739 0.68198-6.7479 1.0355-10.57 2.9456 3.535 5.8533 7.5371 8.8258 11.49 1.0389 1.3817 2.2375 2.6434 3.708 4.0141 0.40593 8.7448 0.46698 17.435 0.44278 26.587-7.8458-3.9978-10.981-11.427-12.958-19.597-0.19205-0.79347-0.34578-1.5962-0.76941-2.6714-0.25948-1.0245-0.26686-1.7722-0.27548-3.3213-0.003769-2.5118-0.006318-4.2223-0.008866-5.9328z" fill="#1C2753"/>
<path d="m298.43 368.53c1.3447-4.4504-1.2337-7.5365-3.7863-10.259-7.6704-8.181-15.664-16.059-23.345-24.23-2.6806-2.852-4.8168-6.2158-6.7858-9.6917 4.4381-0.34052 8.4604-0.33502 12.483-0.32953-1.8024 0.56183-3.6048 1.1237-6.4994 2.0259 3.8109 3.5645 7.3882 6.4969 10.462 9.8861 4.1864 4.6167 11.361 5.8856 13.614 12.799 0.668 2.0498 3.2276 3.6429 5.1881 5.08 4.7446 3.4777 7.1399 8.0593 7.2614 14.275-2.7148 0.44412-5.4341 0.50577-8.5913 0.44458z" fill="#1E3E6E"/>
<path d="m262.98 323c-3.2823-4.3473-10.144-4.5542-11.764-11.392-0.73885-3.1185-5.1507-5.3668-8.0586-8.3107 1.3081-1.4167 2.7781-2.5325 4.5092-3.8452 3.6505-0.25272 7.0401-0.30844 10.882-0.27777-1.0903 4.8819 1.0814 7.4694 5.1914 9.8964 3.4617 2.0441 6.1355 5.4225 8.8951 8.7333-3.3938 2.0807-6.5245 3.6383-9.6553 5.1959z" fill="#1E3E6E"/>
<path d="m307 316c-4.4469 0.51892-8.4579 5.3379-13.866 0.94809-1.0544-0.58035-1.6041-0.7544-2.1538-0.92841 0 0 0.008148-0.015167-0.002655-0.003967-1.9405-3.4393-3.8716-6.8891-5.7993-10.341-1.0609-1.8996-2.1163-3.8024-3.1766-6.0689 4.3587-0.42596 8.7197-0.48666 13.541-0.091126 1.5636 2.7365 2.3816 5.2209 3.835 7.2502 2.3185 3.2374 5.0597 6.1722 7.6221 9.2348z" fill="#193A60"/>
<path d="m307.31 315.85c-2.8694-2.9044-5.6105-5.8392-7.929-9.0766-1.4533-2.0294-2.2713-4.5137-3.3769-7.1667 4.1318-0.44595 8.2838-0.30994 12.395-0.65564 3.5832-0.3013 6.0638 0.83426 7.6377 4.4427-2.2548 1.7291-4.359 2.8408-4.4225 6.412-0.035309 1.985-2.5825 3.9254-4.3045 6.0442z" fill="#1A345D"/>
<path d="m197.55 368.67c-0.042725-2.7293 0.34328-5.4073 0.72928-8.0852 2.5188 1.118 5.0376 2.236 8.4821 3.7649 0.54982-1.1374 1.3867-2.8687 2.2224-4.9682 4.9081 0.68854 5.2443 4.3766 5.0339 8.7744-5.3452 0.45132-10.692 0.50839-16.468 0.5141z" fill="#26669A"/>
<path d="m239.45 368.6c2.1229-0.29227 4.6805-0.49066 7.3882-0.37122-2.2177 0.36694-4.5857 0.41605-7.3882 0.37122z" fill="#20487B"/>
<path d="m163.09 178.48c0.23703 2.9787 0.39118 6.4061 0.31464 10.155-0.28629-3.0209-0.3419-6.3638-0.31464-10.155z" fill="#1F4371"/>
<path d="m163.1 142.45c0.22664 1.3718 0.37146 3.1606 0.30096 5.226-0.27113-1.4186-0.32696-3.1138-0.30096-5.226z" fill="#1B3F68"/>
<path d="m163.09 162.35c0.19559 0.21962 0.31287 0.7588 0.2549 1.4571-0.22789-0.27309-0.28053-0.70532-0.2549-1.4571z" fill="#1F4371"/>
<path d="m265.74 299.17c0.2355 0.066223-0.090667 0.35767-0.090667 0.35767s-0.41763-0.047058-0.51456-0.16186 0.36969-0.26199 0.60522-0.1958z" fill="#1F4371"/>
<path d="m219.98 181.66c-1.1891-0.13806-2.3824-0.64558-3.7778-1.4098 0.37839-0.85141 0.95897-1.4462 1.5395-2.0409 0.74472 1.0271 1.4894 2.0541 2.2382 3.4507z" fill="#1C2753"/>
<path d="m263.11 323.21c3.0041-1.7641 6.1349-3.3217 9.5741-5.0496 2.3167 0.69644 4.3687 1.4867 6.2543 2.5671 0.15994 0.091644-0.79126 2.1225-1.5869 3.2701-4.3829 0.012146-8.4052 0.006652-12.891 0.003601-0.7655-0.13031-1.0191-0.32602-1.3507-0.79126z" fill="#1A345D"/>
<path d="m291.17 316.25c0.36606-0.055664 0.91574 0.11838 1.6514 0.52063-0.3653 0.055176-0.9165-0.11789-1.6514-0.52063z" fill="#1C3968"/>
<path d="m218.74 197.27c0.25363 1.4476 0.25618 3.1581 0.25502 5.2958-0.17116-1.3928-0.33864-3.2129-0.25502-5.2958z" fill="#1B3F68"/>
<path d="m187.01 344.61c-2.758-0.47788-5.5292-1.3266-8.3005-2.1754-0.19945 0.28909-0.39891 0.57816-0.59837 0.86725 2.8502 2.5143 5.7005 5.0287 8.5349 7.5291-2.6056 3.5699-10.654 5.7503-14.729 4.1378-7.796-3.0849-7.9167-3.2581-7.9234-11.551-0.003632-4.4872 3.2e-4 -8.9744 0.003799-13.928 2.4966 0.5213 5.1512 1.2305 7.4482 2.5583 4.0176 2.3223 7.9157 4.8882 11.658 7.6327 1.5684 1.1503 2.6114 3.0169 3.9065 4.9288z" fill="#26669A"/>
<path d="m204.37 352.99c-2.669-2.105-4.9487-4.2066-7.3013-6.6513 3.2727-0.83951 6.7949-2.3138 9.5833 0.92007 0.90251 1.0467 1.4095 2.4344 2.0974 3.6662-1.33 0.68945-2.6601 1.3789-4.3793 2.065z" fill="#26669A"/>
<path d="m196.99 342.63c-1.8331-0.028381-3.8576-1.0062-4.7607 2.1605-0.28242-0.83374-0.59138-1.9605-0.30544-2.9076 0.46542-1.5415 1.3197-2.9656 2.0099-4.4392 1.0202 1.6008 2.0404 3.2015 3.0562 5.1863z" fill="#26669A"/>
</svg>
`;
};