codex-telegram 0.4.16__tar.gz → 0.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/PKG-INFO +6 -2
  2. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex_telegram/__init__.py +1 -1
  3. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex_telegram.egg-info/PKG-INFO +6 -2
  4. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex_telegram.egg-info/SOURCES.txt +5 -4
  5. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/tests/test_web_server_local_command.py +51 -1
  6. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/web/routes.py +23 -0
  7. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/web/server.py +1 -1
  8. codex_telegram-0.5.0/web/static/dist/assets/codex-telegram-icon-black.svg +37 -0
  9. codex_telegram-0.5.0/web/static/dist/assets/codex-telegram-icon-ivory.svg +37 -0
  10. codex_telegram-0.5.0/web/static/dist/assets/codex-telegram-login-image.png +0 -0
  11. codex_telegram-0.5.0/web/static/dist/assets/index-CAl6dA4Q.js +53 -0
  12. codex_telegram-0.5.0/web/static/dist/assets/index-C_g51sA5.css +1 -0
  13. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/web/static/dist/index.html +3 -3
  14. codex-telegram-0.4.16/web/static/dist/assets/index-C8IolvBK.css +0 -1
  15. codex-telegram-0.4.16/web/static/dist/assets/index-ERTv2jbE.js +0 -53
  16. codex-telegram-0.4.16/web/static/dist/icons-tab-add.svg +0 -3
  17. codex-telegram-0.4.16/web/static/dist/icons-tab-close.svg +0 -3
  18. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/LICENSE +0 -0
  19. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/MANIFEST.in +0 -0
  20. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/README.md +0 -0
  21. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/TELEGRAM.md +0 -0
  22. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/WEB.md +0 -0
  23. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/app_runtime/__init__.py +0 -0
  24. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/app_runtime/bootstrap.py +0 -0
  25. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/app_runtime/telegram_app.py +0 -0
  26. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/app_runtime/web_server.py +0 -0
  27. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/bot/__init__.py +0 -0
  28. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/bot/callbacks.py +0 -0
  29. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/bot/features_ui.py +0 -0
  30. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/bot/handlers.py +0 -0
  31. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/bot/keyboard.py +0 -0
  32. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/bot/projects_ui.py +0 -0
  33. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/bot/skills_ui.py +0 -0
  34. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/bot/thread_ui.py +0 -0
  35. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex/__init__.py +0 -0
  36. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex/approval_flow.py +0 -0
  37. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex/approval_guardian.py +0 -0
  38. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex/client.py +0 -0
  39. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex/client_pool.py +0 -0
  40. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex/collaboration_mode.py +0 -0
  41. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex/command_router/__init__.py +0 -0
  42. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex/command_router/common.py +0 -0
  43. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex/command_router/context.py +0 -0
  44. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex/command_router/contracts.py +0 -0
  45. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex/command_router/core.py +0 -0
  46. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex/command_router/projects.py +0 -0
  47. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex/command_router/review.py +0 -0
  48. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex/command_router/system.py +0 -0
  49. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex/command_router/threads.py +0 -0
  50. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex/commands.py +0 -0
  51. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex/event_forwarding.py +0 -0
  52. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex/events.py +0 -0
  53. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex/protocol.py +0 -0
  54. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex_telegram/cli.py +0 -0
  55. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex_telegram.egg-info/dependency_links.txt +0 -0
  56. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex_telegram.egg-info/entry_points.txt +0 -0
  57. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex_telegram.egg-info/requires.txt +1 -1
  58. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/codex_telegram.egg-info/top_level.txt +0 -0
  59. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/conf.toml.example +0 -0
  60. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/main.py +0 -0
  61. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/models/__init__.py +0 -0
  62. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/models/state.py +0 -0
  63. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/models/thread.py +0 -0
  64. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/models/user.py +0 -0
  65. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/pyproject.toml +0 -0
  66. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/setup.cfg +0 -0
  67. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/tests/test_approval_guardian.py +0 -0
  68. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/tests/test_approval_policy.py +0 -0
  69. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/tests/test_bootstrap_update_check.py +0 -0
  70. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/tests/test_callbacks_results.py +0 -0
  71. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/tests/test_cli_entrypoint.py +0 -0
  72. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/tests/test_codex_client.py +0 -0
  73. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/tests/test_codex_client_pool.py +0 -0
  74. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/tests/test_command_router.py +0 -0
  75. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/tests/test_guardian_config.py +0 -0
  76. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/tests/test_handlers_results.py +0 -0
  77. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/tests/test_keyboard.py +0 -0
  78. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/tests/test_main_approval_flow.py +0 -0
  79. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/tests/test_normalize.py +0 -0
  80. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/tests/test_pypi_check.py +0 -0
  81. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/tests/test_single_instance.py +0 -0
  82. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/tests/test_telegram_bot_config.py +0 -0
  83. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/tests/test_thread_history.py +0 -0
  84. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/tests/test_web_runtime.py +0 -0
  85. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/utils/__init__.py +0 -0
  86. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/utils/approval_policy.py +0 -0
  87. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/utils/config.py +0 -0
  88. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/utils/local_command.py +0 -0
  89. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/utils/logger.py +0 -0
  90. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/utils/normalize.py +0 -0
  91. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/utils/pypi_check.py +0 -0
  92. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/utils/single_instance.py +0 -0
  93. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/utils/web_config.py +0 -0
  94. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/web/__init__.py +0 -0
  95. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/web/dependencies.py +0 -0
  96. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/web/runtime.py +0 -0
  97. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/web/thread_history.py +0 -0
  98. {codex-telegram-0.4.16 → codex_telegram-0.5.0}/web/workspace.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: codex-telegram
3
- Version: 0.4.16
3
+ Version: 0.5.0
4
4
  Summary: Bridge for controlling the Codex App Server from Telegram and Web UI
5
5
  Author: heungtae
6
6
  License: Apache License
@@ -218,6 +218,10 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
218
218
  Requires-Python: >=3.11
219
219
  Description-Content-Type: text/markdown
220
220
  License-File: LICENSE
221
+ Requires-Dist: python-telegram-bot>=20.0
222
+ Requires-Dist: fastapi>=0.111.0
223
+ Requires-Dist: uvicorn>=0.30.0
224
+ Dynamic: license-file
221
225
 
222
226
  # Codex Telegram + Web
223
227
 
@@ -1,3 +1,3 @@
1
1
  """codex-telegram package."""
2
2
 
3
- __version__ = "0.4.16"
3
+ __version__ = "0.5.0"
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: codex-telegram
3
- Version: 0.4.16
3
+ Version: 0.5.0
4
4
  Summary: Bridge for controlling the Codex App Server from Telegram and Web UI
5
5
  Author: heungtae
6
6
  License: Apache License
@@ -218,6 +218,10 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
218
218
  Requires-Python: >=3.11
219
219
  Description-Content-Type: text/markdown
220
220
  License-File: LICENSE
221
+ Requires-Dist: python-telegram-bot>=20.0
222
+ Requires-Dist: fastapi>=0.111.0
223
+ Requires-Dist: uvicorn>=0.30.0
224
+ Dynamic: license-file
221
225
 
222
226
  # Codex Telegram + Web
223
227
 
@@ -84,8 +84,9 @@ web/runtime.py
84
84
  web/server.py
85
85
  web/thread_history.py
86
86
  web/workspace.py
87
- web/static/dist/icons-tab-add.svg
88
- web/static/dist/icons-tab-close.svg
89
87
  web/static/dist/index.html
90
- web/static/dist/assets/index-C8IolvBK.css
91
- web/static/dist/assets/index-ERTv2jbE.js
88
+ web/static/dist/assets/codex-telegram-icon-black.svg
89
+ web/static/dist/assets/codex-telegram-icon-ivory.svg
90
+ web/static/dist/assets/codex-telegram-login-image.png
91
+ web/static/dist/assets/index-CAl6dA4Q.js
92
+ web/static/dist/assets/index-C_g51sA5.css
@@ -105,7 +105,7 @@ class WebServerLocalCommandTests(unittest.TestCase):
105
105
  body = response.body.decode("utf-8")
106
106
 
107
107
  self.assertIn("<!doctype html>", body)
108
- self.assertIn("<title>Codex Web</title>", body)
108
+ self.assertIn("<title>Codex Bridge</title>", body)
109
109
  self.assertIn("/assets/", body)
110
110
 
111
111
  def test_chat_messages_propagates_turn_start_failures(self):
@@ -365,6 +365,56 @@ class WebServerLocalCommandTests(unittest.TestCase):
365
365
  self.assertEqual(409, ctx.exception.status_code)
366
366
  self.assertEqual("Cannot switch project while a turn is running.", ctx.exception.detail)
367
367
 
368
+ def test_projects_open_explorer_resolves_path_from_project_profile(self):
369
+ app = create_web_app()
370
+ endpoint = next(
371
+ route.endpoint
372
+ for route in app.routes
373
+ if getattr(route, "path", None) == "/api/projects/open-explorer"
374
+ )
375
+ request = SimpleNamespace(cookies={COOKIE_NAME: self.session.token})
376
+ state.command_router.projects = SimpleNamespace(
377
+ load_project_profiles=lambda: (
378
+ [
379
+ {
380
+ "key": "work",
381
+ "name": "Work",
382
+ "path": "C:/Work/TCK/source/kosmos-application",
383
+ }
384
+ ],
385
+ "default",
386
+ ),
387
+ )
388
+
389
+ with (
390
+ patch("web.routes.platform.system", return_value="Windows"),
391
+ patch("web.routes.subprocess.Popen") as mock_popen,
392
+ ):
393
+ body = asyncio.run(endpoint({"project_key": "work"}, request))
394
+
395
+ self.assertEqual({"ok": True}, body)
396
+ mock_popen.assert_called_once_with(
397
+ 'explorer.exe /n,/e,"C:\\Work\\TCK\\source\\kosmos-application"'
398
+ )
399
+
400
+ def test_projects_open_explorer_rejects_unknown_project_key(self):
401
+ app = create_web_app()
402
+ endpoint = next(
403
+ route.endpoint
404
+ for route in app.routes
405
+ if getattr(route, "path", None) == "/api/projects/open-explorer"
406
+ )
407
+ request = SimpleNamespace(cookies={COOKIE_NAME: self.session.token})
408
+ state.command_router.projects = SimpleNamespace(
409
+ load_project_profiles=lambda: ([], "default"),
410
+ )
411
+
412
+ with self.assertRaises(HTTPException) as ctx:
413
+ asyncio.run(endpoint({"project_key": "missing"}, request))
414
+
415
+ self.assertEqual(404, ctx.exception.status_code)
416
+ self.assertEqual("project_key was not found", ctx.exception.detail)
417
+
368
418
  def test_projects_open_thread_creates_thread_without_switching_selected_project(self):
369
419
  app = create_web_app()
370
420
  endpoint = next(
@@ -1,7 +1,10 @@
1
1
  import asyncio
2
2
  import json
3
3
  import logging
4
+ import os
5
+ import platform
4
6
  import shlex
7
+ import subprocess
5
8
  from importlib import import_module
6
9
  from typing import Any
7
10
 
@@ -597,6 +600,26 @@ def register_project_routes(app: FastAPI) -> None:
597
600
  raise HTTPException(status_code=409, detail="Cannot switch project while a turn is running.")
598
601
  return await route_command("/project", [target], session.user_id)
599
602
 
603
+ @app.post("/api/projects/open-explorer")
604
+ async def open_project_in_explorer(payload: dict[str, Any], request: Request) -> dict[str, Any]:
605
+ await session_from_request(request)
606
+ project_key = _required_str(payload, "project_key")
607
+ project = _project_profile_by_key(project_key)
608
+ if project is None:
609
+ raise HTTPException(status_code=404, detail="project_key was not found")
610
+ path = project["path"]
611
+ try:
612
+ if platform.system() == "Windows":
613
+ windows_path = os.path.normpath(path)
614
+ subprocess.Popen(f'explorer.exe /n,/e,"{windows_path}"')
615
+ elif platform.system() == "Darwin":
616
+ subprocess.Popen(["open", path])
617
+ else:
618
+ subprocess.Popen(["xdg-open", path])
619
+ except Exception as exc:
620
+ raise HTTPException(status_code=500, detail=str(exc)) from exc
621
+ return {"ok": True}
622
+
600
623
  @app.post("/api/projects/open-thread")
601
624
  async def open_project_thread(payload: dict[str, Any], request: Request) -> dict[str, Any]:
602
625
  session = await session_from_request(request)
@@ -18,7 +18,7 @@ def create_web_app() -> FastAPI:
18
18
  route_module.run_bang_command = run_bang_command
19
19
  route_module.get_guardian_settings = get_guardian_settings
20
20
  route_module.save_guardian_settings = save_guardian_settings
21
- app = FastAPI(title="Codex Web", version=__version__)
21
+ app = FastAPI(title="Codex Bridge", version=__version__)
22
22
  app.mount("/assets", StaticFiles(directory=str(resolved_assets_dir())), name="assets")
23
23
  route_module.register_web_routes(app)
24
24
  return app
@@ -0,0 +1,37 @@
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
3
+ "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
4
+ <svg version="1.0" xmlns="http://www.w3.org/2000/svg"
5
+ width="1080.000000pt" height="1080.000000pt" viewBox="0 0 1080.000000 1080.000000"
6
+ preserveAspectRatio="xMidYMid meet">
7
+
8
+ <g transform="translate(0.000000,1080.000000) scale(0.100000,-0.100000)"
9
+ fill="#201D1D" stroke="none">
10
+ <path d="M7752 8284 c-82 -41 -132 -121 -132 -211 0 -81 18 -124 74 -179 70
11
+ -71 139 -89 241 -63 56 14 131 79 156 134 39 85 13 222 -52 282 -73 66 -196
12
+ 82 -287 37z"/>
13
+ <path d="M2544 7381 c-40 -10 -121 -55 -160 -89 -25 -21 -723 -934 -1324
14
+ -1732 -119 -158 -144 -215 -144 -330 0 -63 6 -99 22 -140 16 -40 215 -308 708
15
+ -955 377 -495 704 -920 727 -943 23 -24 69 -58 102 -75 57 -30 66 -32 170 -32
16
+ 99 0 116 3 167 27 77 36 152 112 191 196 29 60 32 76 31 157 -1 134 -15 162
17
+ -231 445 -575 755 -1003 1320 -1003 1325 0 3 260 346 577 763 317 416 589 777
18
+ 605 802 66 107 73 251 19 364 -43 90 -91 140 -177 183 -67 33 -85 37 -162 40
19
+ -48 1 -101 -1 -118 -6z"/>
20
+ <path d="M8029 7372 c-108 -36 -184 -106 -237 -219 -23 -50 -27 -71 -27 -153
21
+ 0 -82 4 -103 27 -152 15 -33 269 -376 617 -832 325 -427 591 -778 591 -781 0
22
+ -3 -268 -357 -595 -788 -420 -552 -602 -798 -617 -837 -17 -42 -22 -76 -23
23
+ -146 0 -84 2 -95 38 -166 43 -88 102 -146 187 -187 49 -23 67 -26 165 -26 101
24
+ 0 115 2 166 29 31 15 79 51 107 80 69 72 1389 1809 1418 1867 32 62 47 149 39
25
+ 213 -12 86 -47 156 -145 286 -589 782 -1272 1675 -1309 1713 -25 26 -75 62
26
+ -110 79 -82 41 -203 49 -292 20z"/>
27
+ <path d="M7025 7251 c-27 -9 -462 -198 -965 -418 -503 -220 -1363 -595 -1910
28
+ -834 -646 -282 -1007 -444 -1028 -463 -98 -86 -105 -250 -14 -344 27 -28 143
29
+ -93 439 -246 l403 -207 377 262 c208 144 518 360 688 479 803 560 1232 858
30
+ 1251 868 23 12 48 1 42 -20 -3 -13 -453 -446 -1586 -1528 -272 -259 -378 -367
31
+ -395 -400 -22 -44 -22 -52 -25 -495 -2 -247 0 -474 3 -502 9 -72 55 -140 120
32
+ -175 40 -22 63 -28 118 -28 80 0 122 15 168 62 19 19 141 211 272 426 l239
33
+ 391 81 -41 c45 -22 277 -142 515 -265 360 -186 443 -226 487 -230 90 -9 187
34
+ 37 230 111 17 30 135 501 425 1696 432 1782 415 1701 371 1788 -57 111 -183
35
+ 158 -306 113z"/>
36
+ </g>
37
+ </svg>
@@ -0,0 +1,37 @@
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
3
+ "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
4
+ <svg version="1.0" xmlns="http://www.w3.org/2000/svg"
5
+ width="1080.000000pt" height="1080.000000pt" viewBox="0 0 1080.000000 1080.000000"
6
+ preserveAspectRatio="xMidYMid meet">
7
+
8
+ <g transform="translate(0.000000,1080.000000) scale(0.100000,-0.100000)"
9
+ fill="#FBFAF5" stroke="none">
10
+ <path d="M7752 8284 c-82 -41 -132 -121 -132 -211 0 -81 18 -124 74 -179 70
11
+ -71 139 -89 241 -63 56 14 131 79 156 134 39 85 13 222 -52 282 -73 66 -196
12
+ 82 -287 37z"/>
13
+ <path d="M2544 7381 c-40 -10 -121 -55 -160 -89 -25 -21 -723 -934 -1324
14
+ -1732 -119 -158 -144 -215 -144 -330 0 -63 6 -99 22 -140 16 -40 215 -308 708
15
+ -955 377 -495 704 -920 727 -943 23 -24 69 -58 102 -75 57 -30 66 -32 170 -32
16
+ 99 0 116 3 167 27 77 36 152 112 191 196 29 60 32 76 31 157 -1 134 -15 162
17
+ -231 445 -575 755 -1003 1320 -1003 1325 0 3 260 346 577 763 317 416 589 777
18
+ 605 802 66 107 73 251 19 364 -43 90 -91 140 -177 183 -67 33 -85 37 -162 40
19
+ -48 1 -101 -1 -118 -6z"/>
20
+ <path d="M8029 7372 c-108 -36 -184 -106 -237 -219 -23 -50 -27 -71 -27 -153
21
+ 0 -82 4 -103 27 -152 15 -33 269 -376 617 -832 325 -427 591 -778 591 -781 0
22
+ -3 -268 -357 -595 -788 -420 -552 -602 -798 -617 -837 -17 -42 -22 -76 -23
23
+ -146 0 -84 2 -95 38 -166 43 -88 102 -146 187 -187 49 -23 67 -26 165 -26 101
24
+ 0 115 2 166 29 31 15 79 51 107 80 69 72 1389 1809 1418 1867 32 62 47 149 39
25
+ 213 -12 86 -47 156 -145 286 -589 782 -1272 1675 -1309 1713 -25 26 -75 62
26
+ -110 79 -82 41 -203 49 -292 20z"/>
27
+ <path d="M7025 7251 c-27 -9 -462 -198 -965 -418 -503 -220 -1363 -595 -1910
28
+ -834 -646 -282 -1007 -444 -1028 -463 -98 -86 -105 -250 -14 -344 27 -28 143
29
+ -93 439 -246 l403 -207 377 262 c208 144 518 360 688 479 803 560 1232 858
30
+ 1251 868 23 12 48 1 42 -20 -3 -13 -453 -446 -1586 -1528 -272 -259 -378 -367
31
+ -395 -400 -22 -44 -22 -52 -25 -495 -2 -247 0 -474 3 -502 9 -72 55 -140 120
32
+ -175 40 -22 63 -28 118 -28 80 0 122 15 168 62 19 19 141 211 272 426 l239
33
+ 391 81 -41 c45 -22 277 -142 515 -265 360 -186 443 -226 487 -230 90 -9 187
34
+ 37 230 111 17 30 135 501 425 1696 432 1782 415 1701 371 1788 -57 111 -183
35
+ 158 -306 113z"/>
36
+ </g>
37
+ </svg>