[{"data":1,"prerenderedAt":756},["ShallowReactive",2],{"i-lucide:search":3,"i-lucide:sun":8,"i-lucide:menu":10,"release-ru-1.0.0-beta.1":12,"releases-index-ru":428,"i-lucide:copy":752,"i-lucide:link":754},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m21 21l-4.34-4.34\"/>\u003Ccircle cx=\"11\" cy=\"11\" r=\"8\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"4\"/>\u003Cpath d=\"M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5h16M4 12h16M4 19h16\"/>",{"doc":13,"isFallback":6},{"id":14,"title":15,"body":16,"channel":417,"date":418,"description":419,"extension":420,"meta":421,"navigation":422,"path":423,"seo":424,"seoTitle":15,"stem":425,"version":426,"__hash__":427},"releasesRu/ru/releases/1.0.0-beta.1.md","Maran 1.0.0-beta.1 — первый устанавливаемый выпуск",{"type":17,"value":18,"toc":409},"minimark",[19,27,30,35,72,87,90,94,102,182,209,212,257,269,273,336,340,343,347,350,390,393,397,405],[20,21,22,23],"p",{},"Первый выпуск, который ставится на сервер и проводит хостинг-аккаунт через весь путь. Он опубликован\nкак бета, и слово означает ровно то, что означает: ",[24,25,26],"strong",{},"пока не сажайте на него чужих клиентов.",[20,28,29],{},"Софт ставится, работает и делает то, что написано на его экранах. Три вещи, которым платный\nхостинг-продукт обязан быть достоин доверия, проверялись только в контейнерах самого проекта — ни\nодин сертификат не выпущен настоящим удостоверяющим центром, ни одна дисковая квота не проверена\nнастоящей файловой системой, и ни одно восстановление не выполнено на настоящем железе. Это не\nизвестные ошибки, это утверждения, которые пока никто не подтвердил там, где это важно.",[31,32,34],"h2",{"id":33},"установка","Установка",[36,37,42],"pre",{"className":38,"code":39,"language":40,"meta":41,"style":41},"language-bash shiki shiki-themes github-light github-dark","curl -sSL https://get.maran.innovayse.com | sudo bash\n","bash","",[43,44,45],"code",{"__ignoreMap":41},[46,47,50,54,58,62,66,69],"span",{"class":48,"line":49},"line",1,[46,51,53],{"class":52},"sScJk","curl",[46,55,57],{"class":56},"sj4cs"," -sSL",[46,59,61],{"class":60},"sZZnC"," https://get.maran.innovayse.com",[46,63,65],{"class":64},"szBVR"," |",[46,67,68],{"class":52}," sudo",[46,70,71],{"class":60}," bash\n",[20,73,74,75,78,79,86],{},"Установщик скачивает артефакты, перечисленные в манифесте, подписанном релизным ключом проекта, и\nотказывается принимать всё, чья подпись или контрольная сумма не сходится. Манифест и названные в\nнём артефакты опубликованы на ",[43,76,77],{},"releases.maran.innovayse.com",", а исходники на теге, из которого\nсобран выпуск, — на ",[80,81,85],"a",{"href":82,"rel":83},"https://github.com/innovayse/maran",[84],"nofollow","GitHub",".",[20,88,89],{},"Посмотрите, что установщик собирается сделать, прежде чем запускать его от root — как с любым\nскриптом, которому вы отдаёте сервер: скачайте, прочитайте, потом запускайте.",[31,91,93],{"id":92},"файлы-и-как-проверить-их-самому","Файлы и как проверить их самому",[20,95,96,97,101],{},"Всё, что скачивает установщик, опубликовано на\n",[80,98,77],{"href":99,"rel":100},"https://releases.maran.innovayse.com",[84]," и перечислено в манифесте,\nподписанном ключом релизов проекта.",[103,104,105,121],"table",{},[106,107,108],"thead",{},[109,110,111,115,118],"tr",{},[112,113,114],"th",{},"Файл",[112,116,117],{},"Размер",[112,119,120],{},"SHA-256",[122,123,124,144,163],"tbody",{},[109,125,126,136,139],{},[127,128,129],"td",{},[80,130,133],{"href":131,"rel":132},"https://releases.maran.innovayse.com/beta/agent-x86_64.tar.gz",[84],[43,134,135],{},"agent-x86_64.tar.gz",[127,137,138],{},"2.9 MB",[127,140,141],{},[43,142,143],{},"f9a57621ef349cb1bfc2df5f7f812685fb3a5a690834b18bd1ae8df2493fbadc",[109,145,146,155,158],{},[127,147,148],{},[80,149,152],{"href":150,"rel":151},"https://releases.maran.innovayse.com/beta/api-x86_64.tar.gz",[84],[43,153,154],{},"api-x86_64.tar.gz",[127,156,157],{},"25.4 MB",[127,159,160],{},[43,161,162],{},"6f367807e265d06bee9db37d692d0748c5fb815967965c0e59675a0b8468c799",[109,164,165,174,177],{},[127,166,167],{},[80,168,171],{"href":169,"rel":170},"https://releases.maran.innovayse.com/beta/frontend-x86_64.tar.gz",[84],[43,172,173],{},"frontend-x86_64.tar.gz",[127,175,176],{},"340 KB",[127,178,179],{},[43,180,181],{},"27879087ddb1a0d1e05e92b9b0b4dec6da21a99263388a74e122681ada828009",[20,183,184,185,192,193,200,201,208],{},"Подписанный список — ",[80,186,189],{"href":187,"rel":188},"https://releases.maran.innovayse.com/beta/manifest.json",[84],[43,190,191],{},"manifest.json",", рядом\nс ним ",[80,194,197],{"href":195,"rel":196},"https://releases.maran.innovayse.com/beta/manifest.json.sig",[84],[43,198,199],{},"manifest.json.sig",", а\n",[80,202,205],{"href":203,"rel":204},"https://releases.maran.innovayse.com/beta/integrity-manifest.json",[84],[43,206,207],{},"integrity-manifest.json","\nзаписывает каждый файл внутри архивов, а не только сами архивы.",[20,210,211],{},"Если не хочется ничего направлять в root-шелл по трубе — та же установка без неё:",[36,213,215],{"className":38,"code":214,"language":40,"meta":41,"style":41},"curl -O https://releases.maran.innovayse.com/installer/maran-installer.tar.gz\ntar -xzf maran-installer.tar.gz\nsudo bash installer/install.sh --channel beta\n",[43,216,217,227,239],{"__ignoreMap":41},[46,218,219,221,224],{"class":48,"line":49},[46,220,53],{"class":52},[46,222,223],{"class":56}," -O",[46,225,226],{"class":60}," https://releases.maran.innovayse.com/installer/maran-installer.tar.gz\n",[46,228,230,233,236],{"class":48,"line":229},2,[46,231,232],{"class":52},"tar",[46,234,235],{"class":56}," -xzf",[46,237,238],{"class":60}," maran-installer.tar.gz\n",[46,240,242,245,248,251,254],{"class":48,"line":241},3,[46,243,244],{"class":52},"sudo",[46,246,247],{"class":60}," bash",[46,249,250],{"class":60}," installer/install.sh",[46,252,253],{"class":56}," --channel",[46,255,256],{"class":60}," beta\n",[20,258,259,260,263,264,86],{},"Публичный ключ, которым проверяет установщик, едет внутри этого пакета —\n",[43,261,262],{},"installer/keys/release-signing.pub",". Стоит сказать прямо: подпись, проверенная ключом, скачанным с\nтого же хоста, доказывает лишь, что оба пришли из одного места. Чтобы доказать больше, сверьте этот\nключ с ",[80,265,268],{"href":266,"rel":267},"https://github.com/innovayse/maran/blob/main/installer/keys/release-signing.pub",[84],"копией в репозитории",[31,270,272],{"id":271},"что-получает-сервер","Что получает сервер",[274,275,276,283,289,295,301,307,313,330],"ul",{},[277,278,279,282],"li",{},[24,280,281],{},"Хостинг-аккаунты — настоящие пользователи Linux."," Создание аккаунта заводит системного\nпользователя, домашний каталог и дисковую квоту тарифа на самом сервере; приостановка,\nвозобновление и удаление тоже доходят до хоста. Сначала действует агент, потом появляется запись\nв базе — поэтому панель никогда не заявляет аккаунт, которого на сервере нет.",[277,284,285,288],{},[24,286,287],{},"Сайты"," — статические, PHP и обратный прокси — с алиасами доменов и корнем внутри домашнего\nкаталога аккаунта. Агент рендерит конфигурацию, заставляет штатный валидатор сервера проверить\nрезультат и откатывает файл, если проверка или перезагрузка отказались, — поэтому плохой рендер\nне может уронить остальные сайты сервера.",[277,290,291,294],{},[24,292,293],{},"Несколько версий PHP одновременно",", у каждого аккаунта свой пул на версию, работающий от его\nже пользователя Linux. Клиент может менять разрешённое подмножество настроек; имя вне списка\nотклоняется, а не отбрасывается молча.",[277,296,297,300],{},[24,298,299],{},"SSL"," по ACME с проверкой HTTP-01, загрузка собственных сертификатов и продление за тридцать\nдней до истечения. Ключи пишутся в хранилище, доступное только root и лежащее вне домашних\nкаталогов, потому что PHP сайта работает от имени клиента.",[277,302,303,306],{},[24,304,305],{},"Базы данных"," с отдельным пользователем на каждую, лимитами тарифа и показом размера. Пароль\nгенерируется, показывается один раз и не хранится — поэтому восстановление это сброс, а не\nизвлечение.",[277,308,309,312],{},[24,310,311],{},"Передача файлов"," — SFTP штатным OpenSSH сервера, каждый вход заперт в jail, внутрь которого\nпримонтирован настоящий домашний каталог аккаунта, с его же uid и без шелла. FTPS поставляется\nустановленным, но выключенным: ничего не слушает, пока администратор его не включит.",[277,314,315,318,319,322,323,326,327,86],{},[24,316,317],{},"Резервные копии",", ",[24,320,321],{},"журнал аудита"," только на дозапись по каждому входу и каждому изменению,\nживой просмотр ",[24,324,325],{},"логов",", брандмауэр, мониторинг и консольная утилита ",[43,328,329],{},"maran",[277,331,332,335],{},[24,333,334],{},"Вход в панель"," с Argon2id, короткоживущими токенами доступа, ротацией refresh-токенов, где\nповторно использованный токен отзывает всё семейство, TOTP с кодами восстановления и сессиями,\nкоторые можно отозвать по одной или все разом.",[31,337,339],{"id":338},"чего-он-намеренно-не-делает","Чего он намеренно не делает",[20,341,342],{},"DNS, почта и веб-менеджер баз данных. Каждое отсутствует по решению, а не по недоделанности:\nменеджер баз данных запланирован отдельным развёртыванием со своим адресом и своей аутентификацией,\nа не наполовину сделанным здесь.",[31,344,346],{"id":345},"прежде-чем-ставить-туда-где-это-важно","Прежде чем ставить туда, где это важно",[20,348,349],{},"Три ограничения стоит знать заранее — иначе оператор узнает о них трудным путём.",[274,351,352,366,372],{},[277,353,354,357,358,361,362,365],{},[24,355,356],{},"Ни один сертификат не выпущен настоящим удостоверяющим центром."," Весь путь при этом\nпроходится целиком — регистрация, заказ, проверка HTTP-01, финализация, скачивание — против\n",[43,359,360],{},"pebble",", тестового сервера самого Let's Encrypt, причём серийный номер выданного сертификата\nсовпадает с прочитанным из PEM. Это упражнение нашло настоящий дефект, которого не видел ни один\nтест: клиент не отправлял ",[43,363,364],{},"User-Agent",", а pebble отклоняет такие запросы, Let's Encrypt же их\nтерпит. Не проверен сам центр: ни его лимиты, ни проверка из публичной сети, ни его цепочка.\nВетка продления не проверялась вовсе — тест каждый раз вынуждает новую проверку. Только HTTP-01,\nбез wildcard-сертификатов: они придут вместе с управлением DNS.",[277,367,368,371],{},[24,369,370],{},"Удаление базы данных окончательно."," Нет ни снимка, ни корзины, ни задержки, и путь удаления\nникак не обращается к модулю резервных копий. База восстановима только из копии, которая уже\nсуществовала.",[277,373,374,377,378,381,382,385,386,389],{},[24,375,376],{},"Конфигурация SSH-демона отслеживается, и у слежения названа граница."," Установщик пишет блок,\nкоторый делает вход для передачи файлов запертым, а мониторинг теперь читает этот блок обратно и\nподнимает тревогу при расхождении — причём все четыре директивы по отдельности, поэтому блок с\nуцелевшим заголовком и опустошённым телом тоже будет пойман. Читается файл конфигурации, а не\nответ демона: ",[43,379,380],{},"sshd -T"," вообще никогда не печатает содержимое блока ",[43,383,384],{},"Match",". Чего слежение не\nделает: не идёт по директивам ",[43,387,388],{},"Include"," и не доказывает, что на разошедшемся хосте действительно\nвыдаётся шелл. Оно сообщает, что конфигурация больше не говорит написанного.",[20,391,392],{},"Заметки об угрозах по привилегированным частям были прочитаны и приняты в день выпуска. Это\nудовлетворяет собственному правилу проекта о втором проверяющем. Это не внешний аудит, и эта\nстраница его не заявляет.",[31,394,396],{"id":395},"обновление-с-010","Обновление с 0.1.0",[20,398,399,400,404],{},"Пути обновления нет, и он не нужен: ",[80,401,403],{"href":402},"/releases/0.1.0","0.1.0"," был каркасом без хостинговых функций,\nи сохранять на нём было нечего.",[406,407,408],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":41,"searchDepth":229,"depth":229,"links":410},[411,412,413,414,415,416],{"id":33,"depth":229,"text":34},{"id":92,"depth":229,"text":93},{"id":271,"depth":229,"text":272},{"id":338,"depth":229,"text":339},{"id":345,"depth":229,"text":346},{"id":395,"depth":229,"text":396},"beta","2026-09-23","Первый выпуск, который ставится на сервер: аккаунты как настоящие пользователи Linux, сайты, версии PHP, SSL, базы данных, передача файлов и резервные копии — опубликован как бета, с честно очерченной границей.","md",{},true,"/ru/releases/0.0-beta.1",{"title":15,"description":419},"ru/releases/1.0.0-beta.1","1.0.0-beta.1","gtSb3_GcJDmwYc67f98G8Ey2aCD3k1DCinQ7xzdocV4",[429,496],{"id":430,"title":431,"body":432,"channel":487,"date":488,"description":489,"extension":420,"meta":490,"navigation":422,"path":491,"seo":492,"seoTitle":493,"stem":494,"version":403,"__hash__":495},"releasesRu/ru/releases/0.1.0.md","Maran 0.1.0 — основание",{"type":17,"value":433,"toc":483},[434,437,441,472,476],[20,435,436],{},"Каркас, а не продукт, который вы поставите перед клиентами хостинга. Он всё же опубликован как релиз,\nпотому что всё последующее построено на принятых здесь решениях.",[31,438,440],{"id":439},"что-входит","Что входит",[274,442,443,449,455,461,467],{},[277,444,445,448],{},[24,446,447],{},"Контракт"," между панелью и корневым агентом — типизированные операции, которыми они\nобмениваются через unix-сокет.",[277,450,451,454],{},[24,452,453],{},"Скелет агента на Rust",", включая проверку учётных данных пира на сокете: агент знает, какой\nпроцесс его просит, до того как что-либо сделает.",[277,456,457,460],{},[24,458,459],{},"Модульный монолит на C#",", который стал панелью.",[277,462,463,466],{},[24,464,465],{},"Оболочка на Vue",", в которой построен интерфейс.",[277,468,469],{},[24,470,471],{},"Среда разработки и CI.",[31,473,475],{"id":474},"чего-не-входит","Чего не входит",[20,477,478,479,86],{},"Ни одной возможности хостинга. Аккаунты, сайты, пулы PHP, SSL, базы данных, передача файлов,\nрезервные копии, брандмауэр и мониторинг собраны после этого тега и в него не входят. Они на пути к\nпервому функциональному релизу; что опубликовано — смотрите в ",[80,480,482],{"href":481},"/releases","релизах",{"title":41,"searchDepth":229,"depth":229,"links":484},[485,486],{"id":439,"depth":229,"text":440},{"id":474,"depth":229,"text":475},"stable","2026-08-29","Первая помеченная версия — контракт, скелет агента на Rust, монолит на C#, оболочка на Vue и среда разработки.",{},"/ru/releases/0.1.0",{"title":431,"description":489},"Maran 0.1.0 — релиз-основание","ru/releases/0.1.0","HWMt0R1wIPNB5ifZm8CdskBZnsuKeTy78zSeUdo74Ug",{"id":14,"title":15,"body":497,"channel":417,"date":418,"description":419,"extension":420,"meta":750,"navigation":422,"path":423,"seo":751,"seoTitle":15,"stem":425,"version":426,"__hash__":427},{"type":17,"value":498,"toc":742},[499,503,505,507,525,532,534,536,541,600,617,619,651,658,660,700,702,704,706,708,732,734,736,740],[20,500,22,501],{},[24,502,26],{},[20,504,29],{},[31,506,34],{"id":33},[36,508,509],{"className":38,"code":39,"language":40,"meta":41,"style":41},[43,510,511],{"__ignoreMap":41},[46,512,513,515,517,519,521,523],{"class":48,"line":49},[46,514,53],{"class":52},[46,516,57],{"class":56},[46,518,61],{"class":60},[46,520,65],{"class":64},[46,522,68],{"class":52},[46,524,71],{"class":60},[20,526,74,527,78,529,86],{},[43,528,77],{},[80,530,85],{"href":82,"rel":531},[84],[20,533,89],{},[31,535,93],{"id":92},[20,537,96,538,101],{},[80,539,77],{"href":99,"rel":540},[84],[103,542,543,553],{},[106,544,545],{},[109,546,547,549,551],{},[112,548,114],{},[112,550,117],{},[112,552,120],{},[122,554,555,570,585],{},[109,556,557,564,566],{},[127,558,559],{},[80,560,562],{"href":131,"rel":561},[84],[43,563,135],{},[127,565,138],{},[127,567,568],{},[43,569,143],{},[109,571,572,579,581],{},[127,573,574],{},[80,575,577],{"href":150,"rel":576},[84],[43,578,154],{},[127,580,157],{},[127,582,583],{},[43,584,162],{},[109,586,587,594,596],{},[127,588,589],{},[80,590,592],{"href":169,"rel":591},[84],[43,593,173],{},[127,595,176],{},[127,597,598],{},[43,599,181],{},[20,601,184,602,192,607,200,612,208],{},[80,603,605],{"href":187,"rel":604},[84],[43,606,191],{},[80,608,610],{"href":195,"rel":609},[84],[43,611,199],{},[80,613,615],{"href":203,"rel":614},[84],[43,616,207],{},[20,618,211],{},[36,620,621],{"className":38,"code":214,"language":40,"meta":41,"style":41},[43,622,623,631,639],{"__ignoreMap":41},[46,624,625,627,629],{"class":48,"line":49},[46,626,53],{"class":52},[46,628,223],{"class":56},[46,630,226],{"class":60},[46,632,633,635,637],{"class":48,"line":229},[46,634,232],{"class":52},[46,636,235],{"class":56},[46,638,238],{"class":60},[46,640,641,643,645,647,649],{"class":48,"line":241},[46,642,244],{"class":52},[46,644,247],{"class":60},[46,646,250],{"class":60},[46,648,253],{"class":56},[46,650,256],{"class":60},[20,652,259,653,263,655,86],{},[43,654,262],{},[80,656,268],{"href":266,"rel":657},[84],[31,659,272],{"id":271},[274,661,662,666,670,674,678,682,686,696],{},[277,663,664,282],{},[24,665,281],{},[277,667,668,288],{},[24,669,287],{},[277,671,672,294],{},[24,673,293],{},[277,675,676,300],{},[24,677,299],{},[277,679,680,306],{},[24,681,305],{},[277,683,684,312],{},[24,685,311],{},[277,687,688,318,690,322,692,326,694,86],{},[24,689,317],{},[24,691,321],{},[24,693,325],{},[43,695,329],{},[277,697,698,335],{},[24,699,334],{},[31,701,339],{"id":338},[20,703,342],{},[31,705,346],{"id":345},[20,707,349],{},[274,709,710,718,722],{},[277,711,712,357,714,361,716,365],{},[24,713,356],{},[43,715,360],{},[43,717,364],{},[277,719,720,371],{},[24,721,370],{},[277,723,724,377,726,381,728,385,730,389],{},[24,725,376],{},[43,727,380],{},[43,729,384],{},[43,731,388],{},[20,733,392],{},[31,735,396],{"id":395},[20,737,399,738,404],{},[80,739,403],{"href":402},[406,741,408],{},{"title":41,"searchDepth":229,"depth":229,"links":743},[744,745,746,747,748,749],{"id":33,"depth":229,"text":34},{"id":92,"depth":229,"text":93},{"id":271,"depth":229,"text":272},{"id":338,"depth":229,"text":339},{"id":345,"depth":229,"text":346},{"id":395,"depth":229,"text":396},{},{"title":15,"description":419},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":753},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":755},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/>\u003Cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/>\u003C/g>",1790166380290]