@mdguggenbichler/slugbase-core 0.0.4 → 0.0.6
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.
- package/frontend/index.tsx +3 -3
- package/frontend/public/favicon.svg +1 -0
- package/frontend/public/slugbase_icon_blue.svg +1 -0
- package/frontend/public/slugbase_icon_white.png +0 -0
- package/frontend/public/slugbase_icon_white.svg +1 -0
- package/frontend/src/App.tsx +179 -0
- package/frontend/src/api/client.ts +134 -0
- package/frontend/src/components/AppSidebar.tsx +214 -0
- package/frontend/src/components/EmptyState.tsx +33 -0
- package/frontend/src/components/Favicon.tsx +76 -0
- package/frontend/src/components/FilterChips.tsx +60 -0
- package/frontend/src/components/FolderIcon.tsx +207 -0
- package/frontend/src/components/GlobalSearch.tsx +275 -0
- package/frontend/src/components/Layout.tsx +60 -0
- package/frontend/src/components/PageHeader.tsx +31 -0
- package/frontend/src/components/ScopeSegmentedControl.tsx +42 -0
- package/frontend/src/components/SentryDebug.tsx +32 -0
- package/frontend/src/components/StatCard.tsx +66 -0
- package/frontend/src/components/TopBar.tsx +63 -0
- package/frontend/src/components/UserDropdown.tsx +86 -0
- package/frontend/src/components/admin/AdminAI.tsx +207 -0
- package/frontend/src/components/admin/AdminOIDCProviders.tsx +183 -0
- package/frontend/src/components/admin/AdminSettings.tsx +413 -0
- package/frontend/src/components/admin/AdminTeams.tsx +177 -0
- package/frontend/src/components/admin/AdminUsers.tsx +225 -0
- package/frontend/src/components/bookmarks/BookmarkCard.tsx +312 -0
- package/frontend/src/components/bookmarks/BookmarkListItem.tsx +159 -0
- package/frontend/src/components/bookmarks/BookmarkTableView.tsx +419 -0
- package/frontend/src/components/bookmarks/BulkActionModals.tsx +162 -0
- package/frontend/src/components/bookmarks/FilterChips.tsx +5 -0
- package/frontend/src/components/modals/BookmarkModal.tsx +493 -0
- package/frontend/src/components/modals/FolderModal.tsx +306 -0
- package/frontend/src/components/modals/ImportModal.tsx +232 -0
- package/frontend/src/components/modals/OIDCProviderModal.tsx +284 -0
- package/frontend/src/components/modals/SharingModal.tsx +96 -0
- package/frontend/src/components/modals/TagModal.tsx +101 -0
- package/frontend/src/components/modals/TeamAssignmentModal.tsx +354 -0
- package/frontend/src/components/modals/TeamModal.tsx +117 -0
- package/frontend/src/components/modals/UserModal.tsx +225 -0
- package/frontend/src/components/profile/CreateTokenModal.tsx +172 -0
- package/frontend/src/components/sharing/ShareResourceDialog.tsx +422 -0
- package/frontend/src/components/ui/Autocomplete.tsx +155 -0
- package/frontend/src/components/ui/Button.tsx +68 -0
- package/frontend/src/components/ui/ConfirmDialog.tsx +79 -0
- package/frontend/src/components/ui/FormFieldWrapper.tsx +36 -0
- package/frontend/src/components/ui/ModalFooterActions.tsx +49 -0
- package/frontend/src/components/ui/ModalSection.tsx +34 -0
- package/frontend/src/components/ui/PageLoadingSkeleton.tsx +24 -0
- package/frontend/src/components/ui/Select.tsx +61 -0
- package/frontend/src/components/ui/SharingField.tsx +298 -0
- package/frontend/src/components/ui/Toast.tsx +47 -0
- package/frontend/src/components/ui/Tooltip.tsx +21 -0
- package/frontend/src/components/ui/alert-dialog.tsx +139 -0
- package/frontend/src/components/ui/badge.tsx +36 -0
- package/frontend/src/components/ui/button-base.tsx +57 -0
- package/frontend/src/components/ui/card.tsx +76 -0
- package/frontend/src/components/ui/command.tsx +161 -0
- package/frontend/src/components/ui/dialog.tsx +120 -0
- package/frontend/src/components/ui/dropdown-menu.tsx +199 -0
- package/frontend/src/components/ui/input.tsx +22 -0
- package/frontend/src/components/ui/label.tsx +24 -0
- package/frontend/src/components/ui/popover.tsx +33 -0
- package/frontend/src/components/ui/progress.tsx +26 -0
- package/frontend/src/components/ui/scroll-area.tsx +48 -0
- package/frontend/src/components/ui/select-base.tsx +159 -0
- package/frontend/src/components/ui/separator.tsx +29 -0
- package/frontend/src/components/ui/sheet.tsx +140 -0
- package/frontend/src/components/ui/sidebar.tsx +783 -0
- package/frontend/src/components/ui/skeleton.tsx +15 -0
- package/frontend/src/components/ui/sonner.tsx +46 -0
- package/frontend/src/components/ui/switch.tsx +28 -0
- package/frontend/src/components/ui/table.tsx +120 -0
- package/frontend/src/components/ui/tooltip-base.tsx +30 -0
- package/frontend/src/config/api.ts +16 -0
- package/frontend/src/config/mode.ts +6 -0
- package/frontend/src/contexts/AppConfigContext.tsx +39 -0
- package/frontend/src/contexts/AuthContext.tsx +137 -0
- package/frontend/src/contexts/SearchCommandContext.tsx +28 -0
- package/frontend/src/hooks/use-mobile.tsx +19 -0
- package/frontend/src/hooks/useConfirmDialog.ts +63 -0
- package/frontend/src/hooks/useMarketingTheme.ts +47 -0
- package/frontend/src/i18n.ts +39 -0
- package/frontend/src/index.css +117 -0
- package/frontend/src/instrument.ts +20 -0
- package/frontend/src/lib/utils.ts +6 -0
- package/frontend/src/locales/de.json +899 -0
- package/frontend/src/locales/en.json +937 -0
- package/frontend/src/locales/es.json +884 -0
- package/frontend/src/locales/fr.json +550 -0
- package/frontend/src/locales/it.json +535 -0
- package/frontend/src/locales/ja.json +535 -0
- package/frontend/src/locales/nl.json +550 -0
- package/frontend/src/locales/pl.json +535 -0
- package/frontend/src/locales/pt.json +535 -0
- package/frontend/src/locales/ru.json +535 -0
- package/frontend/src/locales/zh.json +535 -0
- package/frontend/src/main.tsx +44 -0
- package/frontend/src/pages/Bookmarks.tsx +1004 -0
- package/frontend/src/pages/Dashboard.tsx +427 -0
- package/frontend/src/pages/Folders.tsx +578 -0
- package/frontend/src/pages/GoPreferences.tsx +134 -0
- package/frontend/src/pages/Login.tsx +196 -0
- package/frontend/src/pages/PasswordReset.tsx +242 -0
- package/frontend/src/pages/Profile.tsx +593 -0
- package/frontend/src/pages/SearchEngineGuide.tsx +135 -0
- package/frontend/src/pages/Setup.tsx +210 -0
- package/frontend/src/pages/Signup.tsx +199 -0
- package/frontend/src/pages/Tags.tsx +421 -0
- package/frontend/src/pages/VerifyEmail.tsx +254 -0
- package/frontend/src/pages/admin/AdminAIPage.tsx +5 -0
- package/frontend/src/pages/admin/AdminLayout.tsx +40 -0
- package/frontend/src/pages/admin/AdminMembersPage.tsx +5 -0
- package/frontend/src/pages/admin/AdminOIDCPage.tsx +5 -0
- package/frontend/src/pages/admin/AdminSettingsPage.tsx +5 -0
- package/frontend/src/pages/admin/AdminTeamsPage.tsx +5 -0
- package/frontend/src/utils/favicon.ts +36 -0
- package/frontend/src/utils/formatRelativeTime.ts +37 -0
- package/frontend/src/utils/safeHref.ts +31 -0
- package/frontend/src/vite-env.d.ts +10 -0
- package/package.json +9 -1
package/frontend/index.tsx
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @slugbase/core/frontend – re-exports App and createApiClient for self-hosted and cloud apps.
|
|
3
|
-
*
|
|
3
|
+
* Published package includes frontend/src (copied at publish); in-repo use copy-core-dist or alias to root frontend.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
export { default as App } from '
|
|
7
|
-
export { createApiClient } from '
|
|
6
|
+
export { default as App } from './src/App';
|
|
7
|
+
export { createApiClient } from './src/api/client';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 2084 2084" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;"><clipPath id="_clip1"><rect x="-1510.417" y="-549.294" width="5104.167" height="3400"/></clipPath><g clip-path="url(#_clip1)"><g><path d="M-1510.417,2850.706l5104.167,0l0,-3400l-5104.167,-0l0,3400m3004.167,-2608.333c205.917,0 400,166.042 400,379.167c12.625,130.375 4.25,270.208 4.167,404.167c-0.083,133.958 8.458,277.917 -4.167,408.333c0,136.208 -66.083,236.625 -180.125,315.708c-114.042,79.125 -281.5,68.667 -428.208,67.625c-146.708,-1.042 -348.375,-1.875 -495.833,0c-147.458,1.875 -309.917,9.958 -426.042,-69.792c-116.125,-79.792 -178.125,-183 -178.125,-321.875c-12.417,-128.5 -4.167,-268.125 -4.167,-400c0,-131.875 -8.25,-271.833 4.167,-400c0,-205.083 171.75,-383.333 379.167,-383.333c149.417,-14.458 309.417,-4.25 462.5,-4.167c153.083,0.083 317.208,-10.292 466.667,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#fefefe;stroke-width:1.25px;"/></g><g><path d="M564.583,242.373l929.167,0c-149.458,-14.458 -313.583,-4.083 -466.667,-4.167c-153.083,-0.083 -313.083,-10.292 -462.5,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#6f7e94;stroke-width:1.25px;"/></g><g><path d="M185.417,625.706l0,800c0,138.875 62,242.083 178.125,321.875c116.125,79.75 278.583,71.667 426.042,69.792c147.458,-1.875 349.125,-1.042 495.833,0c146.708,1.042 314.167,11.5 428.208,-67.625c114.042,-79.083 180.125,-179.5 180.125,-315.708l0,-812.5c0,-213.125 -194.083,-379.167 -400,-379.167l-929.167,0c-207.417,0 -379.167,178.25 -379.167,383.333m1658.333,-4.167c12.625,130.375 4.25,270.208 4.167,404.167c-0.083,133.958 8.458,277.917 -4.167,408.333c0,77.208 -32.167,148.792 -79.167,208.333c-11.042,13.958 -24.25,26.167 -37.5,37.5c-64.208,54.875 -148.458,87.5 -233.333,87.5c-146.167,14.167 -304.5,4.167 -454.167,4.167c-149.667,0 -308.292,9.958 -454.167,-4.167c-180.333,0 -350,-147.708 -350,-333.333c-12.833,-132.583 -4.167,-276.5 -4.167,-412.5c0,-136 -8.625,-280.25 4.167,-412.5c0,-121.833 66.917,-213.583 175.333,-274.667c108.375,-61.125 274.375,-46.375 408,-46.167c133.625,0.208 316.25,0.167 450,0c133.75,-0.167 296.333,-15.25 404.5,49.667c108.125,64.958 170.5,161.417 170.5,283.667Z" style="fill:none;fill-rule:nonzero;stroke:#162e51;stroke-width:1.25px;"/></g><g><path d="M235.417,609.04l0,825c0,185.625 169.667,333.333 350,333.333l908.333,0c84.875,0 169.125,-32.625 233.333,-87.5c11.917,-11.917 26.292,-25.375 37.5,-37.5c47,-59.542 79.167,-131.125 79.167,-208.333l0,-812.5c0,-122.25 -62.375,-218.708 -170.5,-283.667c-108.167,-64.917 -270.75,-49.833 -404.5,-49.667c-133.75,0.167 -316.375,0.208 -450,0c-133.625,-0.208 -299.625,-14.958 -408,46.167c-108.417,61.083 -175.333,152.833 -175.333,274.667m1100,66.667c-1.542,-10.667 -11.25,-16.167 -16.667,-25c-40.542,-66.167 18.583,-126.708 83.333,-125c64.75,1.708 106.208,97.042 53.125,136.458c-53.042,39.417 -62.833,91.208 -78.125,155.208c63.833,39.792 90.792,119.125 91.667,191.667c0.833,8.75 4.167,21.792 4.167,33.333c0,144.292 33.5,320.708 -62.5,433.333c24.667,3.917 64.083,-0.625 75,25c-47.458,16.542 -98.917,18.125 -150,20.833c-5,0.708 -13.292,3.875 -20.833,4.167c-39.792,1.583 -76.833,3.375 -116.667,4.167c-7.292,0.708 -19.167,3.958 -29.167,4.167c-36.083,0.708 -72.25,0 -108.333,0c-69.333,6.708 -151.792,6.667 -220.833,0l-83.333,0c-22.458,0 -47.333,-2.292 -66.667,-4.167c-59.417,0 -115.875,-6.667 -175,-8.333c-9.25,-0.25 -18.542,-3.167 -25,-4.167c-30.333,-1.958 -73.542,-2.083 -91.667,-25c22.5,-9.458 46.375,-14.125 70.833,-16.667c-34.917,-71.042 50.667,-137.083 116.667,-133.333c66.458,-9.5 142.75,-4.167 212.5,-4.167c50.875,0 89.292,-16.208 129.167,-45.833c7.458,-6.5 18.667,-17.75 25,-25c59.292,-79.75 50.542,-166.625 50,-266.667c-0.542,-100.042 0.375,-215.25 0,-316.667c-75.875,-19.792 -80.292,-137.292 2.833,-155.5c83.125,-18.208 135.417,71.5 85.708,135.708c-49.708,64.167 30,156.208 99.875,141.542c69.875,-14.667 144.458,-43.667 144.917,-130.083m-383.333,462.5c-1.375,36.417 -12.208,70.417 -33.333,100c-7.958,11.125 -18.25,21.375 -29.167,29.167c-86.042,61.458 -212.125,13.833 -312.5,29.167c38.25,-186 178.417,-371.75 370.833,-416.667c17.083,2.167 5.75,51.5 8.333,75c2.583,23.5 -1.917,64.667 0,91.667c1.917,27 -0.625,67 -4.167,91.667Z" style="fill:none;fill-rule:nonzero;stroke:#fdfdfd;stroke-width:1.25px;"/></g><g><path d="M952.083,1267.373c-7.208,9.708 -15.5,17.917 -25,25c-39.875,29.625 -78.292,45.833 -129.167,45.833c-67.583,6.542 -142,1.458 -212.5,4.167c-66,-3.75 -151.583,62.292 -116.667,133.333c-24.458,2.542 -48.333,7.208 -70.833,16.667c18.125,22.917 61.333,23.042 91.667,25c8.5,0.542 19.25,3.5 25,4.167c59.125,1.667 115.583,8.333 175,8.333c22.458,0 47.333,2.292 66.667,4.167l304.167,0c36.083,0 72.25,0.708 108.333,0c7.292,-0.708 19.167,-3.958 29.167,-4.167c39.833,-0.792 76.875,-2.583 116.667,-4.167c5,-0.708 13.292,-3.875 20.833,-4.167c51.083,-2.708 102.542,-4.292 150,-20.833c-10.917,-25.625 -50.333,-21.083 -75,-25c96,-112.625 62.5,-289.042 62.5,-433.333c-0.833,-8.75 -4.167,-21.792 -4.167,-33.333c-0.875,-72.542 -27.833,-151.875 -91.667,-191.667c15.292,-64 25.083,-115.792 78.125,-155.208c53.083,-39.417 11.625,-134.75 -53.125,-136.458c-64.75,-1.708 -123.875,58.833 -83.333,125c9.375,13.042 17,10.958 16.667,25c-0.458,86.417 -75.042,115.417 -144.917,130.083c-69.875,14.667 -149.583,-77.375 -99.875,-141.542c49.708,-64.208 -2.583,-153.917 -85.708,-135.708c-83.125,18.208 -78.708,135.708 -2.833,155.5c0.375,101.417 -0.542,216.625 0,316.667c0.542,100.042 9.292,186.917 -50,266.667m100,-716.667c17,4.208 44.583,49.792 20.5,53.833c-24.125,4 -49.875,-2.875 -69.208,-21.792c-19.375,-18.875 26.625,-37.5 48.708,-32.042m362.5,0c13.917,3.25 49.917,42.333 26.042,51.042c-23.917,8.667 -46.5,1.667 -68.667,-16.75c-22.167,-18.458 14.917,-40.75 42.625,-34.292m-220.833,366.667c46.292,12.417 22.792,110.917 -25,91.667c-47.792,-19.25 -24.583,-104.958 25,-91.667m150,0c44.042,11.833 28.25,104.667 -17.583,92.583c-45.875,-12.125 -34.333,-106.5 17.583,-92.583Z" style="fill:none;fill-rule:nonzero;stroke:#152d4e;stroke-width:1.25px;"/></g><g><path d="M1052.083,550.706c-22.083,-5.458 -68.083,13.167 -48.708,32.042c19.333,18.917 45.083,25.792 69.208,21.792c24.083,-4.042 -3.5,-49.625 -20.5,-53.833Z" style="fill:none;fill-rule:nonzero;stroke:#f1f2f4;stroke-width:1.25px;"/></g><g><path d="M1414.583,550.706c-27.708,-6.458 -64.792,15.833 -42.625,34.292c22.167,18.417 44.75,25.417 68.667,16.75c23.875,-8.708 -12.125,-47.792 -26.042,-51.042Z" style="fill:none;fill-rule:nonzero;stroke:#f0f1f4;stroke-width:1.25px;"/></g><g><path d="M235.417,1434.04l0,-825c-12.792,132.25 -4.167,276.5 -4.167,412.5c0,136 -8.667,279.917 4.167,412.5Z" style="fill:none;fill-rule:nonzero;stroke:#9ba5b4;stroke-width:1.25px;"/></g><g><path d="M1843.75,1434.04c12.625,-130.417 4.083,-274.375 4.167,-408.333c0.083,-133.958 8.458,-273.792 -4.167,-404.167l0,812.5Z" style="fill:none;fill-rule:nonzero;stroke:#6a7b93;stroke-width:1.25px;"/></g><g><path d="M1893.75,1434.04c12.625,-130.417 4.083,-274.375 4.167,-408.333c0.083,-133.958 8.458,-273.792 -4.167,-404.167l0,812.5Z" style="fill:none;fill-rule:nonzero;stroke:#8190a3;stroke-width:1.25px;"/></g><g><path d="M185.417,1425.706l0,-800c-12.417,128.167 -4.167,268.125 -4.167,400c0,131.875 -8.25,271.5 4.167,400Z" style="fill:none;fill-rule:nonzero;stroke:#67788f;stroke-width:1.25px;"/></g><g><path d="M1335.417,675.706c0.333,-14.042 -7.292,-11.958 -16.667,-25c5.417,8.833 15.125,14.333 16.667,25Z" style="fill:none;fill-rule:nonzero;stroke:#7d8896;stroke-width:1.25px;"/></g><g><path d="M947.917,879.873c16.833,10.833 -0.333,61.5 4.167,83.333c4.5,21.833 -1.333,62.208 0,87.5c1.333,25.292 1,61.333 0,87.5c3.542,-24.667 6.083,-64.667 4.167,-91.667c-1.917,-27 2.583,-68.167 0,-91.667c-2.583,-23.5 8.75,-72.833 -8.333,-75Z" style="fill:none;fill-rule:nonzero;stroke:#6b798f;stroke-width:1.25px;"/></g><g><path d="M889.583,1267.373c8.625,-7.208 22.125,-20.75 29.167,-29.167c21.125,-29.583 31.958,-63.583 33.333,-100c1,-26.167 1.333,-62.208 0,-87.5c-1.333,-25.292 4.5,-65.667 0,-87.5c-4.5,-21.833 12.667,-72.5 -4.167,-83.333c-192.417,44.917 -332.583,230.667 -370.833,416.667c100.375,-15.333 226.458,32.292 312.5,-29.167Z" style="fill:none;fill-rule:nonzero;stroke:#173052;stroke-width:1.25px;"/></g><g><path d="M1193.75,917.373c-49.583,-13.292 -72.792,72.417 -25,91.667c47.792,19.25 71.292,-79.25 25,-91.667Z" style="fill:none;fill-rule:nonzero;stroke:#f3f4f7;stroke-width:1.25px;"/></g><g><path d="M1343.75,917.373c-51.917,-13.917 -63.458,80.458 -17.583,92.583c45.833,12.083 61.625,-80.75 17.583,-92.583Z" style="fill:none;fill-rule:nonzero;stroke:#f5f6f8;stroke-width:1.25px;"/></g><g><path d="M1472.917,1042.373c0,-11.542 -3.333,-24.583 -4.167,-33.333c0,11.542 3.333,24.583 4.167,33.333Z" style="fill:none;fill-rule:nonzero;stroke:#798392;stroke-width:1.25px;"/></g><g><path d="M889.583,1267.373c10.917,-7.792 21.208,-18.042 29.167,-29.167c-7.042,8.417 -20.542,21.958 -29.167,29.167Z" style="fill:none;fill-rule:nonzero;stroke:#7c8da4;stroke-width:1.25px;"/></g><g><path d="M927.083,1292.373c9.5,-7.083 17.792,-15.292 25,-25c-6.333,7.25 -17.542,18.5 -25,25Z" style="fill:none;fill-rule:nonzero;stroke:#778394;stroke-width:1.25px;"/></g><g><path d="M585.417,1342.373c70.5,-2.708 144.917,2.375 212.5,-4.167c-69.75,0 -146.042,-5.333 -212.5,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#828c9b;stroke-width:1.25px;"/></g><g><path d="M514.583,1521.54c-5.75,-0.667 -16.5,-3.625 -25,-4.167c6.458,1 15.75,3.917 25,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#838fa0;stroke-width:1.25px;"/></g><g><path d="M1314.583,1525.706c7.542,-0.292 15.833,-3.458 20.833,-4.167c-7.542,0.292 -15.833,3.458 -20.833,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#7c8b9d;stroke-width:1.25px;"/></g><g><path d="M756.25,1534.04c-19.333,-1.875 -44.208,-4.167 -66.667,-4.167c19.333,1.875 44.208,4.167 66.667,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#7a8798;stroke-width:1.25px;"/></g><g><path d="M1168.75,1534.04c10,-0.208 21.875,-3.458 29.167,-4.167c-10,0.208 -21.875,3.458 -29.167,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#939fae;stroke-width:1.25px;"/></g><g><path d="M1060.417,1534.04l-220.833,0c69.042,6.667 151.5,6.708 220.833,0Z" style="fill:none;fill-rule:nonzero;stroke:#98a4b1;stroke-width:1.25px;"/></g><g><path d="M1727.083,1679.873c13.25,-11.333 26.458,-23.542 37.5,-37.5c-11.208,12.125 -25.583,25.583 -37.5,37.5Z" style="fill:none;fill-rule:nonzero;stroke:#7a899c;stroke-width:1.25px;"/></g><g><path d="M1493.75,1767.373l-908.333,0c145.875,14.125 304.5,4.167 454.167,4.167c149.667,0 308,10 454.167,-4.167Z" style="fill:none;fill-rule:nonzero;stroke:#6f7f94;stroke-width:1.25px;"/></g><g><path d="M564.583,242.373l929.167,0c-149.458,-14.458 -313.583,-4.083 -466.667,-4.167c-153.083,-0.083 -313.083,-10.292 -462.5,4.167Z" style="fill:#6f7e94;fill-rule:nonzero;"/></g><g><path d="M185.417,625.706l0,800c0,138.875 62,242.083 178.125,321.875c116.125,79.75 278.583,71.667 426.042,69.792c147.458,-1.875 349.125,-1.042 495.833,0c146.708,1.042 314.167,11.5 428.208,-67.625c114.042,-79.083 180.125,-179.5 180.125,-315.708l0,-812.5c0,-213.125 -194.083,-379.167 -400,-379.167l-929.167,0c-207.417,0 -379.167,178.25 -379.167,383.333m1658.333,-4.167c12.625,130.375 4.25,270.208 4.167,404.167c-0.083,133.958 8.458,277.917 -4.167,408.333c0,77.208 -32.167,148.792 -79.167,208.333c-11.042,13.958 -24.25,26.167 -37.5,37.5c-64.208,54.875 -148.458,87.5 -233.333,87.5c-146.167,14.167 -304.5,4.167 -454.167,4.167c-149.667,0 -308.292,9.958 -454.167,-4.167c-180.333,0 -350,-147.708 -350,-333.333c-12.833,-132.583 -4.167,-276.5 -4.167,-412.5c0,-136 -8.625,-280.25 4.167,-412.5c0,-121.833 66.917,-213.583 175.333,-274.667c108.375,-61.125 274.375,-46.375 408,-46.167c133.625,0.208 316.25,0.167 450,0c133.75,-0.167 296.333,-15.25 404.5,49.667c108.125,64.958 170.5,161.417 170.5,283.667Z" style="fill:#fff;fill-rule:nonzero;"/></g><g><path d="M952.083,1267.373c-7.208,9.708 -15.5,17.917 -25,25c-39.875,29.625 -78.292,45.833 -129.167,45.833c-67.583,6.542 -142,1.458 -212.5,4.167c-66,-3.75 -151.583,62.292 -116.667,133.333c-24.458,2.542 -48.333,7.208 -70.833,16.667c18.125,22.917 61.333,23.042 91.667,25c8.5,0.542 19.25,3.5 25,4.167c59.125,1.667 115.583,8.333 175,8.333c22.458,0 47.333,2.292 66.667,4.167l304.167,0c36.083,0 72.25,0.708 108.333,0c7.292,-0.708 19.167,-3.958 29.167,-4.167c39.833,-0.792 76.875,-2.583 116.667,-4.167c5,-0.708 13.292,-3.875 20.833,-4.167c51.083,-2.708 102.542,-4.292 150,-20.833c-10.917,-25.625 -50.333,-21.083 -75,-25c96,-112.625 62.5,-289.042 62.5,-433.333c-0.833,-8.75 -4.167,-21.792 -4.167,-33.333c-0.875,-72.542 -27.833,-151.875 -91.667,-191.667c15.292,-64 25.083,-115.792 78.125,-155.208c53.083,-39.417 11.625,-134.75 -53.125,-136.458c-64.75,-1.708 -123.875,58.833 -83.333,125c9.375,13.042 17,10.958 16.667,25c-0.458,86.417 -75.042,115.417 -144.917,130.083c-69.875,14.667 -149.583,-77.375 -99.875,-141.542c49.708,-64.208 -2.583,-153.917 -85.708,-135.708c-83.125,18.208 -78.708,135.708 -2.833,155.5c0.375,101.417 -0.542,216.625 0,316.667c0.542,100.042 9.292,186.917 -50,266.667m100,-716.667c17,4.208 44.583,49.792 20.5,53.833c-24.125,4 -49.875,-2.875 -69.208,-21.792c-19.375,-18.875 26.625,-37.5 48.708,-32.042m362.5,0c13.917,3.25 49.917,42.333 26.042,51.042c-23.917,8.667 -46.5,1.667 -68.667,-16.75c-22.167,-18.458 14.917,-40.75 42.625,-34.292m-220.833,366.667c46.292,12.417 22.792,110.917 -25,91.667c-47.792,-19.25 -24.583,-104.958 25,-91.667m150,0c44.042,11.833 28.25,104.667 -17.583,92.583c-45.875,-12.125 -34.333,-106.5 17.583,-92.583Z" style="fill:#fff;fill-rule:nonzero;"/></g><g><path d="M235.417,1434.04l0,-825c-12.792,132.25 -4.167,276.5 -4.167,412.5c0,136 -8.667,279.917 4.167,412.5Z" style="fill:#9ba5b4;fill-rule:nonzero;"/></g><g><path d="M1843.75,1434.04c12.625,-130.417 4.083,-274.375 4.167,-408.333c0.083,-133.958 8.458,-273.792 -4.167,-404.167l0,812.5Z" style="fill:#6a7b93;fill-rule:nonzero;"/></g><g><path d="M1893.75,1434.04c12.625,-130.417 4.083,-274.375 4.167,-408.333c0.083,-133.958 8.458,-273.792 -4.167,-404.167l0,812.5Z" style="fill:#8190a3;fill-rule:nonzero;"/></g><g><path d="M185.417,1425.706l0,-800c-12.417,128.167 -4.167,268.125 -4.167,400c0,131.875 -8.25,271.5 4.167,400Z" style="fill:#67788f;fill-rule:nonzero;"/></g><g><path d="M1335.417,675.706c0.333,-14.042 -7.292,-11.958 -16.667,-25c5.417,8.833 15.125,14.333 16.667,25Z" style="fill:#7d8896;fill-rule:nonzero;"/></g><g><path d="M947.917,879.873c16.833,10.833 -0.333,61.5 4.167,83.333c4.5,21.833 -1.333,62.208 0,87.5c1.333,25.292 1,61.333 0,87.5c3.542,-24.667 6.083,-64.667 4.167,-91.667c-1.917,-27 2.583,-68.167 0,-91.667c-2.583,-23.5 8.75,-72.833 -8.333,-75Z" style="fill:#6b798f;fill-rule:nonzero;"/></g><g><path d="M889.583,1267.373c8.625,-7.208 22.125,-20.75 29.167,-29.167c21.125,-29.583 31.958,-63.583 33.333,-100c1,-26.167 1.333,-62.208 0,-87.5c-1.333,-25.292 4.5,-65.667 0,-87.5c-4.5,-21.833 12.667,-72.5 -4.167,-83.333c-192.417,44.917 -332.583,230.667 -370.833,416.667c100.375,-15.333 226.458,32.292 312.5,-29.167Z" style="fill:#fff;fill-rule:nonzero;"/></g><g><path d="M1472.917,1042.373c0,-11.542 -3.333,-24.583 -4.167,-33.333c0,11.542 3.333,24.583 4.167,33.333Z" style="fill:#798392;fill-rule:nonzero;"/></g><g><path d="M889.583,1267.373c10.917,-7.792 21.208,-18.042 29.167,-29.167c-7.042,8.417 -20.542,21.958 -29.167,29.167Z" style="fill:#7c8da4;fill-rule:nonzero;"/></g><g><path d="M927.083,1292.373c9.5,-7.083 17.792,-15.292 25,-25c-6.333,7.25 -17.542,18.5 -25,25Z" style="fill:#778394;fill-rule:nonzero;"/></g><g><path d="M585.417,1342.373c70.5,-2.708 144.917,2.375 212.5,-4.167c-69.75,0 -146.042,-5.333 -212.5,4.167Z" style="fill:#828c9b;fill-rule:nonzero;"/></g><g><path d="M514.583,1521.54c-5.75,-0.667 -16.5,-3.625 -25,-4.167c6.458,1 15.75,3.917 25,4.167Z" style="fill:#838fa0;fill-rule:nonzero;"/></g><g><path d="M1314.583,1525.706c7.542,-0.292 15.833,-3.458 20.833,-4.167c-7.542,0.292 -15.833,3.458 -20.833,4.167Z" style="fill:#7c8b9d;fill-rule:nonzero;"/></g><g><path d="M756.25,1534.04c-19.333,-1.875 -44.208,-4.167 -66.667,-4.167c19.333,1.875 44.208,4.167 66.667,4.167Z" style="fill:#7a8798;fill-rule:nonzero;"/></g><g><path d="M1168.75,1534.04c10,-0.208 21.875,-3.458 29.167,-4.167c-10,0.208 -21.875,3.458 -29.167,4.167Z" style="fill:#939fae;fill-rule:nonzero;"/></g><g><path d="M1060.417,1534.04l-220.833,0c69.042,6.667 151.5,6.708 220.833,0Z" style="fill:#98a4b1;fill-rule:nonzero;"/></g><g><path d="M1727.083,1679.873c13.25,-11.333 26.458,-23.542 37.5,-37.5c-11.208,12.125 -25.583,25.583 -37.5,37.5Z" style="fill:#7a899c;fill-rule:nonzero;"/></g><g><path d="M1493.75,1767.373l-908.333,0c145.875,14.125 304.5,4.167 454.167,4.167c149.667,0 308,10 454.167,-4.167Z" style="fill:#6f7f94;fill-rule:nonzero;"/></g></g></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 2084 2084" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;"><clipPath id="_clip1"><rect x="-1510.417" y="-549.294" width="5104.167" height="3400"/></clipPath><g clip-path="url(#_clip1)"><g><path d="M-1510.417,2850.706l5104.167,0l0,-3400l-5104.167,-0l0,3400m3004.167,-2608.333c205.917,0 400,166.042 400,379.167c12.625,130.375 4.25,270.208 4.167,404.167c-0.083,133.958 8.458,277.917 -4.167,408.333c0,136.208 -66.083,236.625 -180.125,315.708c-114.042,79.125 -281.5,68.667 -428.208,67.625c-146.708,-1.042 -348.375,-1.875 -495.833,0c-147.458,1.875 -309.917,9.958 -426.042,-69.792c-116.125,-79.792 -178.125,-183 -178.125,-321.875c-12.417,-128.5 -4.167,-268.125 -4.167,-400c0,-131.875 -8.25,-271.833 4.167,-400c0,-205.083 171.75,-383.333 379.167,-383.333c149.417,-14.458 309.417,-4.25 462.5,-4.167c153.083,0.083 317.208,-10.292 466.667,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#fefefe;stroke-width:1.25px;"/></g><g><path d="M564.583,242.373l929.167,0c-149.458,-14.458 -313.583,-4.083 -466.667,-4.167c-153.083,-0.083 -313.083,-10.292 -462.5,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#6f7e94;stroke-width:1.25px;"/></g><g><path d="M185.417,625.706l0,800c0,138.875 62,242.083 178.125,321.875c116.125,79.75 278.583,71.667 426.042,69.792c147.458,-1.875 349.125,-1.042 495.833,0c146.708,1.042 314.167,11.5 428.208,-67.625c114.042,-79.083 180.125,-179.5 180.125,-315.708l0,-812.5c0,-213.125 -194.083,-379.167 -400,-379.167l-929.167,0c-207.417,0 -379.167,178.25 -379.167,383.333m1658.333,-4.167c12.625,130.375 4.25,270.208 4.167,404.167c-0.083,133.958 8.458,277.917 -4.167,408.333c0,77.208 -32.167,148.792 -79.167,208.333c-11.042,13.958 -24.25,26.167 -37.5,37.5c-64.208,54.875 -148.458,87.5 -233.333,87.5c-146.167,14.167 -304.5,4.167 -454.167,4.167c-149.667,0 -308.292,9.958 -454.167,-4.167c-180.333,0 -350,-147.708 -350,-333.333c-12.833,-132.583 -4.167,-276.5 -4.167,-412.5c0,-136 -8.625,-280.25 4.167,-412.5c0,-121.833 66.917,-213.583 175.333,-274.667c108.375,-61.125 274.375,-46.375 408,-46.167c133.625,0.208 316.25,0.167 450,0c133.75,-0.167 296.333,-15.25 404.5,49.667c108.125,64.958 170.5,161.417 170.5,283.667Z" style="fill:none;fill-rule:nonzero;stroke:#162e51;stroke-width:1.25px;"/></g><g><path d="M235.417,609.04l0,825c0,185.625 169.667,333.333 350,333.333l908.333,0c84.875,0 169.125,-32.625 233.333,-87.5c11.917,-11.917 26.292,-25.375 37.5,-37.5c47,-59.542 79.167,-131.125 79.167,-208.333l0,-812.5c0,-122.25 -62.375,-218.708 -170.5,-283.667c-108.167,-64.917 -270.75,-49.833 -404.5,-49.667c-133.75,0.167 -316.375,0.208 -450,0c-133.625,-0.208 -299.625,-14.958 -408,46.167c-108.417,61.083 -175.333,152.833 -175.333,274.667m1100,66.667c-1.542,-10.667 -11.25,-16.167 -16.667,-25c-40.542,-66.167 18.583,-126.708 83.333,-125c64.75,1.708 106.208,97.042 53.125,136.458c-53.042,39.417 -62.833,91.208 -78.125,155.208c63.833,39.792 90.792,119.125 91.667,191.667c0.833,8.75 4.167,21.792 4.167,33.333c0,144.292 33.5,320.708 -62.5,433.333c24.667,3.917 64.083,-0.625 75,25c-47.458,16.542 -98.917,18.125 -150,20.833c-5,0.708 -13.292,3.875 -20.833,4.167c-39.792,1.583 -76.833,3.375 -116.667,4.167c-7.292,0.708 -19.167,3.958 -29.167,4.167c-36.083,0.708 -72.25,0 -108.333,0c-69.333,6.708 -151.792,6.667 -220.833,0l-83.333,0c-22.458,0 -47.333,-2.292 -66.667,-4.167c-59.417,0 -115.875,-6.667 -175,-8.333c-9.25,-0.25 -18.542,-3.167 -25,-4.167c-30.333,-1.958 -73.542,-2.083 -91.667,-25c22.5,-9.458 46.375,-14.125 70.833,-16.667c-34.917,-71.042 50.667,-137.083 116.667,-133.333c66.458,-9.5 142.75,-4.167 212.5,-4.167c50.875,0 89.292,-16.208 129.167,-45.833c7.458,-6.5 18.667,-17.75 25,-25c59.292,-79.75 50.542,-166.625 50,-266.667c-0.542,-100.042 0.375,-215.25 0,-316.667c-75.875,-19.792 -80.292,-137.292 2.833,-155.5c83.125,-18.208 135.417,71.5 85.708,135.708c-49.708,64.167 30,156.208 99.875,141.542c69.875,-14.667 144.458,-43.667 144.917,-130.083m-383.333,462.5c-1.375,36.417 -12.208,70.417 -33.333,100c-7.958,11.125 -18.25,21.375 -29.167,29.167c-86.042,61.458 -212.125,13.833 -312.5,29.167c38.25,-186 178.417,-371.75 370.833,-416.667c17.083,2.167 5.75,51.5 8.333,75c2.583,23.5 -1.917,64.667 0,91.667c1.917,27 -0.625,67 -4.167,91.667Z" style="fill:none;fill-rule:nonzero;stroke:#fdfdfd;stroke-width:1.25px;"/></g><g><path d="M952.083,1267.373c-7.208,9.708 -15.5,17.917 -25,25c-39.875,29.625 -78.292,45.833 -129.167,45.833c-67.583,6.542 -142,1.458 -212.5,4.167c-66,-3.75 -151.583,62.292 -116.667,133.333c-24.458,2.542 -48.333,7.208 -70.833,16.667c18.125,22.917 61.333,23.042 91.667,25c8.5,0.542 19.25,3.5 25,4.167c59.125,1.667 115.583,8.333 175,8.333c22.458,0 47.333,2.292 66.667,4.167l304.167,0c36.083,0 72.25,0.708 108.333,0c7.292,-0.708 19.167,-3.958 29.167,-4.167c39.833,-0.792 76.875,-2.583 116.667,-4.167c5,-0.708 13.292,-3.875 20.833,-4.167c51.083,-2.708 102.542,-4.292 150,-20.833c-10.917,-25.625 -50.333,-21.083 -75,-25c96,-112.625 62.5,-289.042 62.5,-433.333c-0.833,-8.75 -4.167,-21.792 -4.167,-33.333c-0.875,-72.542 -27.833,-151.875 -91.667,-191.667c15.292,-64 25.083,-115.792 78.125,-155.208c53.083,-39.417 11.625,-134.75 -53.125,-136.458c-64.75,-1.708 -123.875,58.833 -83.333,125c9.375,13.042 17,10.958 16.667,25c-0.458,86.417 -75.042,115.417 -144.917,130.083c-69.875,14.667 -149.583,-77.375 -99.875,-141.542c49.708,-64.208 -2.583,-153.917 -85.708,-135.708c-83.125,18.208 -78.708,135.708 -2.833,155.5c0.375,101.417 -0.542,216.625 0,316.667c0.542,100.042 9.292,186.917 -50,266.667m100,-716.667c17,4.208 44.583,49.792 20.5,53.833c-24.125,4 -49.875,-2.875 -69.208,-21.792c-19.375,-18.875 26.625,-37.5 48.708,-32.042m362.5,0c13.917,3.25 49.917,42.333 26.042,51.042c-23.917,8.667 -46.5,1.667 -68.667,-16.75c-22.167,-18.458 14.917,-40.75 42.625,-34.292m-220.833,366.667c46.292,12.417 22.792,110.917 -25,91.667c-47.792,-19.25 -24.583,-104.958 25,-91.667m150,0c44.042,11.833 28.25,104.667 -17.583,92.583c-45.875,-12.125 -34.333,-106.5 17.583,-92.583Z" style="fill:none;fill-rule:nonzero;stroke:#152d4e;stroke-width:1.25px;"/></g><g><path d="M1052.083,550.706c-22.083,-5.458 -68.083,13.167 -48.708,32.042c19.333,18.917 45.083,25.792 69.208,21.792c24.083,-4.042 -3.5,-49.625 -20.5,-53.833Z" style="fill:none;fill-rule:nonzero;stroke:#f1f2f4;stroke-width:1.25px;"/></g><g><path d="M1414.583,550.706c-27.708,-6.458 -64.792,15.833 -42.625,34.292c22.167,18.417 44.75,25.417 68.667,16.75c23.875,-8.708 -12.125,-47.792 -26.042,-51.042Z" style="fill:none;fill-rule:nonzero;stroke:#f0f1f4;stroke-width:1.25px;"/></g><g><path d="M235.417,1434.04l0,-825c-12.792,132.25 -4.167,276.5 -4.167,412.5c0,136 -8.667,279.917 4.167,412.5Z" style="fill:none;fill-rule:nonzero;stroke:#9ba5b4;stroke-width:1.25px;"/></g><g><path d="M1843.75,1434.04c12.625,-130.417 4.083,-274.375 4.167,-408.333c0.083,-133.958 8.458,-273.792 -4.167,-404.167l0,812.5Z" style="fill:none;fill-rule:nonzero;stroke:#6a7b93;stroke-width:1.25px;"/></g><g><path d="M1893.75,1434.04c12.625,-130.417 4.083,-274.375 4.167,-408.333c0.083,-133.958 8.458,-273.792 -4.167,-404.167l0,812.5Z" style="fill:none;fill-rule:nonzero;stroke:#8190a3;stroke-width:1.25px;"/></g><g><path d="M185.417,1425.706l0,-800c-12.417,128.167 -4.167,268.125 -4.167,400c0,131.875 -8.25,271.5 4.167,400Z" style="fill:none;fill-rule:nonzero;stroke:#67788f;stroke-width:1.25px;"/></g><g><path d="M1335.417,675.706c0.333,-14.042 -7.292,-11.958 -16.667,-25c5.417,8.833 15.125,14.333 16.667,25Z" style="fill:none;fill-rule:nonzero;stroke:#7d8896;stroke-width:1.25px;"/></g><g><path d="M947.917,879.873c16.833,10.833 -0.333,61.5 4.167,83.333c4.5,21.833 -1.333,62.208 0,87.5c1.333,25.292 1,61.333 0,87.5c3.542,-24.667 6.083,-64.667 4.167,-91.667c-1.917,-27 2.583,-68.167 0,-91.667c-2.583,-23.5 8.75,-72.833 -8.333,-75Z" style="fill:none;fill-rule:nonzero;stroke:#6b798f;stroke-width:1.25px;"/></g><g><path d="M889.583,1267.373c8.625,-7.208 22.125,-20.75 29.167,-29.167c21.125,-29.583 31.958,-63.583 33.333,-100c1,-26.167 1.333,-62.208 0,-87.5c-1.333,-25.292 4.5,-65.667 0,-87.5c-4.5,-21.833 12.667,-72.5 -4.167,-83.333c-192.417,44.917 -332.583,230.667 -370.833,416.667c100.375,-15.333 226.458,32.292 312.5,-29.167Z" style="fill:none;fill-rule:nonzero;stroke:#173052;stroke-width:1.25px;"/></g><g><path d="M1193.75,917.373c-49.583,-13.292 -72.792,72.417 -25,91.667c47.792,19.25 71.292,-79.25 25,-91.667Z" style="fill:none;fill-rule:nonzero;stroke:#f3f4f7;stroke-width:1.25px;"/></g><g><path d="M1343.75,917.373c-51.917,-13.917 -63.458,80.458 -17.583,92.583c45.833,12.083 61.625,-80.75 17.583,-92.583Z" style="fill:none;fill-rule:nonzero;stroke:#f5f6f8;stroke-width:1.25px;"/></g><g><path d="M1472.917,1042.373c0,-11.542 -3.333,-24.583 -4.167,-33.333c0,11.542 3.333,24.583 4.167,33.333Z" style="fill:none;fill-rule:nonzero;stroke:#798392;stroke-width:1.25px;"/></g><g><path d="M889.583,1267.373c10.917,-7.792 21.208,-18.042 29.167,-29.167c-7.042,8.417 -20.542,21.958 -29.167,29.167Z" style="fill:none;fill-rule:nonzero;stroke:#7c8da4;stroke-width:1.25px;"/></g><g><path d="M927.083,1292.373c9.5,-7.083 17.792,-15.292 25,-25c-6.333,7.25 -17.542,18.5 -25,25Z" style="fill:none;fill-rule:nonzero;stroke:#778394;stroke-width:1.25px;"/></g><g><path d="M585.417,1342.373c70.5,-2.708 144.917,2.375 212.5,-4.167c-69.75,0 -146.042,-5.333 -212.5,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#828c9b;stroke-width:1.25px;"/></g><g><path d="M514.583,1521.54c-5.75,-0.667 -16.5,-3.625 -25,-4.167c6.458,1 15.75,3.917 25,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#838fa0;stroke-width:1.25px;"/></g><g><path d="M1314.583,1525.706c7.542,-0.292 15.833,-3.458 20.833,-4.167c-7.542,0.292 -15.833,3.458 -20.833,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#7c8b9d;stroke-width:1.25px;"/></g><g><path d="M756.25,1534.04c-19.333,-1.875 -44.208,-4.167 -66.667,-4.167c19.333,1.875 44.208,4.167 66.667,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#7a8798;stroke-width:1.25px;"/></g><g><path d="M1168.75,1534.04c10,-0.208 21.875,-3.458 29.167,-4.167c-10,0.208 -21.875,3.458 -29.167,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#939fae;stroke-width:1.25px;"/></g><g><path d="M1060.417,1534.04l-220.833,0c69.042,6.667 151.5,6.708 220.833,0Z" style="fill:none;fill-rule:nonzero;stroke:#98a4b1;stroke-width:1.25px;"/></g><g><path d="M1727.083,1679.873c13.25,-11.333 26.458,-23.542 37.5,-37.5c-11.208,12.125 -25.583,25.583 -37.5,37.5Z" style="fill:none;fill-rule:nonzero;stroke:#7a899c;stroke-width:1.25px;"/></g><g><path d="M1493.75,1767.373l-908.333,0c145.875,14.125 304.5,4.167 454.167,4.167c149.667,0 308,10 454.167,-4.167Z" style="fill:none;fill-rule:nonzero;stroke:#6f7f94;stroke-width:1.25px;"/></g><g><path d="M564.583,242.373l929.167,0c-149.458,-14.458 -313.583,-4.083 -466.667,-4.167c-153.083,-0.083 -313.083,-10.292 -462.5,4.167Z" style="fill:#6f7e94;fill-rule:nonzero;"/></g><g><path d="M185.417,625.706l0,800c0,138.875 62,242.083 178.125,321.875c116.125,79.75 278.583,71.667 426.042,69.792c147.458,-1.875 349.125,-1.042 495.833,0c146.708,1.042 314.167,11.5 428.208,-67.625c114.042,-79.083 180.125,-179.5 180.125,-315.708l0,-812.5c0,-213.125 -194.083,-379.167 -400,-379.167l-929.167,0c-207.417,0 -379.167,178.25 -379.167,383.333m1658.333,-4.167c12.625,130.375 4.25,270.208 4.167,404.167c-0.083,133.958 8.458,277.917 -4.167,408.333c0,77.208 -32.167,148.792 -79.167,208.333c-11.042,13.958 -24.25,26.167 -37.5,37.5c-64.208,54.875 -148.458,87.5 -233.333,87.5c-146.167,14.167 -304.5,4.167 -454.167,4.167c-149.667,0 -308.292,9.958 -454.167,-4.167c-180.333,0 -350,-147.708 -350,-333.333c-12.833,-132.583 -4.167,-276.5 -4.167,-412.5c0,-136 -8.625,-280.25 4.167,-412.5c0,-121.833 66.917,-213.583 175.333,-274.667c108.375,-61.125 274.375,-46.375 408,-46.167c133.625,0.208 316.25,0.167 450,0c133.75,-0.167 296.333,-15.25 404.5,49.667c108.125,64.958 170.5,161.417 170.5,283.667Z" style="fill:#162e51;fill-rule:nonzero;"/></g><g><path d="M952.083,1267.373c-7.208,9.708 -15.5,17.917 -25,25c-39.875,29.625 -78.292,45.833 -129.167,45.833c-67.583,6.542 -142,1.458 -212.5,4.167c-66,-3.75 -151.583,62.292 -116.667,133.333c-24.458,2.542 -48.333,7.208 -70.833,16.667c18.125,22.917 61.333,23.042 91.667,25c8.5,0.542 19.25,3.5 25,4.167c59.125,1.667 115.583,8.333 175,8.333c22.458,0 47.333,2.292 66.667,4.167l304.167,0c36.083,0 72.25,0.708 108.333,0c7.292,-0.708 19.167,-3.958 29.167,-4.167c39.833,-0.792 76.875,-2.583 116.667,-4.167c5,-0.708 13.292,-3.875 20.833,-4.167c51.083,-2.708 102.542,-4.292 150,-20.833c-10.917,-25.625 -50.333,-21.083 -75,-25c96,-112.625 62.5,-289.042 62.5,-433.333c-0.833,-8.75 -4.167,-21.792 -4.167,-33.333c-0.875,-72.542 -27.833,-151.875 -91.667,-191.667c15.292,-64 25.083,-115.792 78.125,-155.208c53.083,-39.417 11.625,-134.75 -53.125,-136.458c-64.75,-1.708 -123.875,58.833 -83.333,125c9.375,13.042 17,10.958 16.667,25c-0.458,86.417 -75.042,115.417 -144.917,130.083c-69.875,14.667 -149.583,-77.375 -99.875,-141.542c49.708,-64.208 -2.583,-153.917 -85.708,-135.708c-83.125,18.208 -78.708,135.708 -2.833,155.5c0.375,101.417 -0.542,216.625 0,316.667c0.542,100.042 9.292,186.917 -50,266.667m100,-716.667c17,4.208 44.583,49.792 20.5,53.833c-24.125,4 -49.875,-2.875 -69.208,-21.792c-19.375,-18.875 26.625,-37.5 48.708,-32.042m362.5,0c13.917,3.25 49.917,42.333 26.042,51.042c-23.917,8.667 -46.5,1.667 -68.667,-16.75c-22.167,-18.458 14.917,-40.75 42.625,-34.292m-220.833,366.667c46.292,12.417 22.792,110.917 -25,91.667c-47.792,-19.25 -24.583,-104.958 25,-91.667m150,0c44.042,11.833 28.25,104.667 -17.583,92.583c-45.875,-12.125 -34.333,-106.5 17.583,-92.583Z" style="fill:#152d4e;fill-rule:nonzero;"/></g><g><path d="M235.417,1434.04l0,-825c-12.792,132.25 -4.167,276.5 -4.167,412.5c0,136 -8.667,279.917 4.167,412.5Z" style="fill:#9ba5b4;fill-rule:nonzero;"/></g><g><path d="M1843.75,1434.04c12.625,-130.417 4.083,-274.375 4.167,-408.333c0.083,-133.958 8.458,-273.792 -4.167,-404.167l0,812.5Z" style="fill:#6a7b93;fill-rule:nonzero;"/></g><g><path d="M1893.75,1434.04c12.625,-130.417 4.083,-274.375 4.167,-408.333c0.083,-133.958 8.458,-273.792 -4.167,-404.167l0,812.5Z" style="fill:#8190a3;fill-rule:nonzero;"/></g><g><path d="M185.417,1425.706l0,-800c-12.417,128.167 -4.167,268.125 -4.167,400c0,131.875 -8.25,271.5 4.167,400Z" style="fill:#67788f;fill-rule:nonzero;"/></g><g><path d="M1335.417,675.706c0.333,-14.042 -7.292,-11.958 -16.667,-25c5.417,8.833 15.125,14.333 16.667,25Z" style="fill:#7d8896;fill-rule:nonzero;"/></g><g><path d="M947.917,879.873c16.833,10.833 -0.333,61.5 4.167,83.333c4.5,21.833 -1.333,62.208 0,87.5c1.333,25.292 1,61.333 0,87.5c3.542,-24.667 6.083,-64.667 4.167,-91.667c-1.917,-27 2.583,-68.167 0,-91.667c-2.583,-23.5 8.75,-72.833 -8.333,-75Z" style="fill:#6b798f;fill-rule:nonzero;"/></g><g><path d="M889.583,1267.373c8.625,-7.208 22.125,-20.75 29.167,-29.167c21.125,-29.583 31.958,-63.583 33.333,-100c1,-26.167 1.333,-62.208 0,-87.5c-1.333,-25.292 4.5,-65.667 0,-87.5c-4.5,-21.833 12.667,-72.5 -4.167,-83.333c-192.417,44.917 -332.583,230.667 -370.833,416.667c100.375,-15.333 226.458,32.292 312.5,-29.167Z" style="fill:#173052;fill-rule:nonzero;"/></g><g><path d="M1472.917,1042.373c0,-11.542 -3.333,-24.583 -4.167,-33.333c0,11.542 3.333,24.583 4.167,33.333Z" style="fill:#798392;fill-rule:nonzero;"/></g><g><path d="M889.583,1267.373c10.917,-7.792 21.208,-18.042 29.167,-29.167c-7.042,8.417 -20.542,21.958 -29.167,29.167Z" style="fill:#7c8da4;fill-rule:nonzero;"/></g><g><path d="M927.083,1292.373c9.5,-7.083 17.792,-15.292 25,-25c-6.333,7.25 -17.542,18.5 -25,25Z" style="fill:#778394;fill-rule:nonzero;"/></g><g><path d="M585.417,1342.373c70.5,-2.708 144.917,2.375 212.5,-4.167c-69.75,0 -146.042,-5.333 -212.5,4.167Z" style="fill:#828c9b;fill-rule:nonzero;"/></g><g><path d="M514.583,1521.54c-5.75,-0.667 -16.5,-3.625 -25,-4.167c6.458,1 15.75,3.917 25,4.167Z" style="fill:#838fa0;fill-rule:nonzero;"/></g><g><path d="M1314.583,1525.706c7.542,-0.292 15.833,-3.458 20.833,-4.167c-7.542,0.292 -15.833,3.458 -20.833,4.167Z" style="fill:#7c8b9d;fill-rule:nonzero;"/></g><g><path d="M756.25,1534.04c-19.333,-1.875 -44.208,-4.167 -66.667,-4.167c19.333,1.875 44.208,4.167 66.667,4.167Z" style="fill:#7a8798;fill-rule:nonzero;"/></g><g><path d="M1168.75,1534.04c10,-0.208 21.875,-3.458 29.167,-4.167c-10,0.208 -21.875,3.458 -29.167,4.167Z" style="fill:#939fae;fill-rule:nonzero;"/></g><g><path d="M1060.417,1534.04l-220.833,0c69.042,6.667 151.5,6.708 220.833,0Z" style="fill:#98a4b1;fill-rule:nonzero;"/></g><g><path d="M1727.083,1679.873c13.25,-11.333 26.458,-23.542 37.5,-37.5c-11.208,12.125 -25.583,25.583 -37.5,37.5Z" style="fill:#7a899c;fill-rule:nonzero;"/></g><g><path d="M1493.75,1767.373l-908.333,0c145.875,14.125 304.5,4.167 454.167,4.167c149.667,0 308,10 454.167,-4.167Z" style="fill:#6f7f94;fill-rule:nonzero;"/></g></g></svg>
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 2084 2084" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;"><clipPath id="_clip1"><rect x="-1510.417" y="-549.294" width="5104.167" height="3400"/></clipPath><g clip-path="url(#_clip1)"><g><path d="M-1510.417,2850.706l5104.167,0l0,-3400l-5104.167,-0l0,3400m3004.167,-2608.333c205.917,0 400,166.042 400,379.167c12.625,130.375 4.25,270.208 4.167,404.167c-0.083,133.958 8.458,277.917 -4.167,408.333c0,136.208 -66.083,236.625 -180.125,315.708c-114.042,79.125 -281.5,68.667 -428.208,67.625c-146.708,-1.042 -348.375,-1.875 -495.833,0c-147.458,1.875 -309.917,9.958 -426.042,-69.792c-116.125,-79.792 -178.125,-183 -178.125,-321.875c-12.417,-128.5 -4.167,-268.125 -4.167,-400c0,-131.875 -8.25,-271.833 4.167,-400c0,-205.083 171.75,-383.333 379.167,-383.333c149.417,-14.458 309.417,-4.25 462.5,-4.167c153.083,0.083 317.208,-10.292 466.667,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#fefefe;stroke-width:1.25px;"/></g><g><path d="M564.583,242.373l929.167,0c-149.458,-14.458 -313.583,-4.083 -466.667,-4.167c-153.083,-0.083 -313.083,-10.292 -462.5,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#6f7e94;stroke-width:1.25px;"/></g><g><path d="M185.417,625.706l0,800c0,138.875 62,242.083 178.125,321.875c116.125,79.75 278.583,71.667 426.042,69.792c147.458,-1.875 349.125,-1.042 495.833,0c146.708,1.042 314.167,11.5 428.208,-67.625c114.042,-79.083 180.125,-179.5 180.125,-315.708l0,-812.5c0,-213.125 -194.083,-379.167 -400,-379.167l-929.167,0c-207.417,0 -379.167,178.25 -379.167,383.333m1658.333,-4.167c12.625,130.375 4.25,270.208 4.167,404.167c-0.083,133.958 8.458,277.917 -4.167,408.333c0,77.208 -32.167,148.792 -79.167,208.333c-11.042,13.958 -24.25,26.167 -37.5,37.5c-64.208,54.875 -148.458,87.5 -233.333,87.5c-146.167,14.167 -304.5,4.167 -454.167,4.167c-149.667,0 -308.292,9.958 -454.167,-4.167c-180.333,0 -350,-147.708 -350,-333.333c-12.833,-132.583 -4.167,-276.5 -4.167,-412.5c0,-136 -8.625,-280.25 4.167,-412.5c0,-121.833 66.917,-213.583 175.333,-274.667c108.375,-61.125 274.375,-46.375 408,-46.167c133.625,0.208 316.25,0.167 450,0c133.75,-0.167 296.333,-15.25 404.5,49.667c108.125,64.958 170.5,161.417 170.5,283.667Z" style="fill:none;fill-rule:nonzero;stroke:#162e51;stroke-width:1.25px;"/></g><g><path d="M235.417,609.04l0,825c0,185.625 169.667,333.333 350,333.333l908.333,0c84.875,0 169.125,-32.625 233.333,-87.5c11.917,-11.917 26.292,-25.375 37.5,-37.5c47,-59.542 79.167,-131.125 79.167,-208.333l0,-812.5c0,-122.25 -62.375,-218.708 -170.5,-283.667c-108.167,-64.917 -270.75,-49.833 -404.5,-49.667c-133.75,0.167 -316.375,0.208 -450,0c-133.625,-0.208 -299.625,-14.958 -408,46.167c-108.417,61.083 -175.333,152.833 -175.333,274.667m1100,66.667c-1.542,-10.667 -11.25,-16.167 -16.667,-25c-40.542,-66.167 18.583,-126.708 83.333,-125c64.75,1.708 106.208,97.042 53.125,136.458c-53.042,39.417 -62.833,91.208 -78.125,155.208c63.833,39.792 90.792,119.125 91.667,191.667c0.833,8.75 4.167,21.792 4.167,33.333c0,144.292 33.5,320.708 -62.5,433.333c24.667,3.917 64.083,-0.625 75,25c-47.458,16.542 -98.917,18.125 -150,20.833c-5,0.708 -13.292,3.875 -20.833,4.167c-39.792,1.583 -76.833,3.375 -116.667,4.167c-7.292,0.708 -19.167,3.958 -29.167,4.167c-36.083,0.708 -72.25,0 -108.333,0c-69.333,6.708 -151.792,6.667 -220.833,0l-83.333,0c-22.458,0 -47.333,-2.292 -66.667,-4.167c-59.417,0 -115.875,-6.667 -175,-8.333c-9.25,-0.25 -18.542,-3.167 -25,-4.167c-30.333,-1.958 -73.542,-2.083 -91.667,-25c22.5,-9.458 46.375,-14.125 70.833,-16.667c-34.917,-71.042 50.667,-137.083 116.667,-133.333c66.458,-9.5 142.75,-4.167 212.5,-4.167c50.875,0 89.292,-16.208 129.167,-45.833c7.458,-6.5 18.667,-17.75 25,-25c59.292,-79.75 50.542,-166.625 50,-266.667c-0.542,-100.042 0.375,-215.25 0,-316.667c-75.875,-19.792 -80.292,-137.292 2.833,-155.5c83.125,-18.208 135.417,71.5 85.708,135.708c-49.708,64.167 30,156.208 99.875,141.542c69.875,-14.667 144.458,-43.667 144.917,-130.083m-383.333,462.5c-1.375,36.417 -12.208,70.417 -33.333,100c-7.958,11.125 -18.25,21.375 -29.167,29.167c-86.042,61.458 -212.125,13.833 -312.5,29.167c38.25,-186 178.417,-371.75 370.833,-416.667c17.083,2.167 5.75,51.5 8.333,75c2.583,23.5 -1.917,64.667 0,91.667c1.917,27 -0.625,67 -4.167,91.667Z" style="fill:none;fill-rule:nonzero;stroke:#fdfdfd;stroke-width:1.25px;"/></g><g><path d="M952.083,1267.373c-7.208,9.708 -15.5,17.917 -25,25c-39.875,29.625 -78.292,45.833 -129.167,45.833c-67.583,6.542 -142,1.458 -212.5,4.167c-66,-3.75 -151.583,62.292 -116.667,133.333c-24.458,2.542 -48.333,7.208 -70.833,16.667c18.125,22.917 61.333,23.042 91.667,25c8.5,0.542 19.25,3.5 25,4.167c59.125,1.667 115.583,8.333 175,8.333c22.458,0 47.333,2.292 66.667,4.167l304.167,0c36.083,0 72.25,0.708 108.333,0c7.292,-0.708 19.167,-3.958 29.167,-4.167c39.833,-0.792 76.875,-2.583 116.667,-4.167c5,-0.708 13.292,-3.875 20.833,-4.167c51.083,-2.708 102.542,-4.292 150,-20.833c-10.917,-25.625 -50.333,-21.083 -75,-25c96,-112.625 62.5,-289.042 62.5,-433.333c-0.833,-8.75 -4.167,-21.792 -4.167,-33.333c-0.875,-72.542 -27.833,-151.875 -91.667,-191.667c15.292,-64 25.083,-115.792 78.125,-155.208c53.083,-39.417 11.625,-134.75 -53.125,-136.458c-64.75,-1.708 -123.875,58.833 -83.333,125c9.375,13.042 17,10.958 16.667,25c-0.458,86.417 -75.042,115.417 -144.917,130.083c-69.875,14.667 -149.583,-77.375 -99.875,-141.542c49.708,-64.208 -2.583,-153.917 -85.708,-135.708c-83.125,18.208 -78.708,135.708 -2.833,155.5c0.375,101.417 -0.542,216.625 0,316.667c0.542,100.042 9.292,186.917 -50,266.667m100,-716.667c17,4.208 44.583,49.792 20.5,53.833c-24.125,4 -49.875,-2.875 -69.208,-21.792c-19.375,-18.875 26.625,-37.5 48.708,-32.042m362.5,0c13.917,3.25 49.917,42.333 26.042,51.042c-23.917,8.667 -46.5,1.667 -68.667,-16.75c-22.167,-18.458 14.917,-40.75 42.625,-34.292m-220.833,366.667c46.292,12.417 22.792,110.917 -25,91.667c-47.792,-19.25 -24.583,-104.958 25,-91.667m150,0c44.042,11.833 28.25,104.667 -17.583,92.583c-45.875,-12.125 -34.333,-106.5 17.583,-92.583Z" style="fill:none;fill-rule:nonzero;stroke:#152d4e;stroke-width:1.25px;"/></g><g><path d="M1052.083,550.706c-22.083,-5.458 -68.083,13.167 -48.708,32.042c19.333,18.917 45.083,25.792 69.208,21.792c24.083,-4.042 -3.5,-49.625 -20.5,-53.833Z" style="fill:none;fill-rule:nonzero;stroke:#f1f2f4;stroke-width:1.25px;"/></g><g><path d="M1414.583,550.706c-27.708,-6.458 -64.792,15.833 -42.625,34.292c22.167,18.417 44.75,25.417 68.667,16.75c23.875,-8.708 -12.125,-47.792 -26.042,-51.042Z" style="fill:none;fill-rule:nonzero;stroke:#f0f1f4;stroke-width:1.25px;"/></g><g><path d="M235.417,1434.04l0,-825c-12.792,132.25 -4.167,276.5 -4.167,412.5c0,136 -8.667,279.917 4.167,412.5Z" style="fill:none;fill-rule:nonzero;stroke:#9ba5b4;stroke-width:1.25px;"/></g><g><path d="M1843.75,1434.04c12.625,-130.417 4.083,-274.375 4.167,-408.333c0.083,-133.958 8.458,-273.792 -4.167,-404.167l0,812.5Z" style="fill:none;fill-rule:nonzero;stroke:#6a7b93;stroke-width:1.25px;"/></g><g><path d="M1893.75,1434.04c12.625,-130.417 4.083,-274.375 4.167,-408.333c0.083,-133.958 8.458,-273.792 -4.167,-404.167l0,812.5Z" style="fill:none;fill-rule:nonzero;stroke:#8190a3;stroke-width:1.25px;"/></g><g><path d="M185.417,1425.706l0,-800c-12.417,128.167 -4.167,268.125 -4.167,400c0,131.875 -8.25,271.5 4.167,400Z" style="fill:none;fill-rule:nonzero;stroke:#67788f;stroke-width:1.25px;"/></g><g><path d="M1335.417,675.706c0.333,-14.042 -7.292,-11.958 -16.667,-25c5.417,8.833 15.125,14.333 16.667,25Z" style="fill:none;fill-rule:nonzero;stroke:#7d8896;stroke-width:1.25px;"/></g><g><path d="M947.917,879.873c16.833,10.833 -0.333,61.5 4.167,83.333c4.5,21.833 -1.333,62.208 0,87.5c1.333,25.292 1,61.333 0,87.5c3.542,-24.667 6.083,-64.667 4.167,-91.667c-1.917,-27 2.583,-68.167 0,-91.667c-2.583,-23.5 8.75,-72.833 -8.333,-75Z" style="fill:none;fill-rule:nonzero;stroke:#6b798f;stroke-width:1.25px;"/></g><g><path d="M889.583,1267.373c8.625,-7.208 22.125,-20.75 29.167,-29.167c21.125,-29.583 31.958,-63.583 33.333,-100c1,-26.167 1.333,-62.208 0,-87.5c-1.333,-25.292 4.5,-65.667 0,-87.5c-4.5,-21.833 12.667,-72.5 -4.167,-83.333c-192.417,44.917 -332.583,230.667 -370.833,416.667c100.375,-15.333 226.458,32.292 312.5,-29.167Z" style="fill:none;fill-rule:nonzero;stroke:#173052;stroke-width:1.25px;"/></g><g><path d="M1193.75,917.373c-49.583,-13.292 -72.792,72.417 -25,91.667c47.792,19.25 71.292,-79.25 25,-91.667Z" style="fill:none;fill-rule:nonzero;stroke:#f3f4f7;stroke-width:1.25px;"/></g><g><path d="M1343.75,917.373c-51.917,-13.917 -63.458,80.458 -17.583,92.583c45.833,12.083 61.625,-80.75 17.583,-92.583Z" style="fill:none;fill-rule:nonzero;stroke:#f5f6f8;stroke-width:1.25px;"/></g><g><path d="M1472.917,1042.373c0,-11.542 -3.333,-24.583 -4.167,-33.333c0,11.542 3.333,24.583 4.167,33.333Z" style="fill:none;fill-rule:nonzero;stroke:#798392;stroke-width:1.25px;"/></g><g><path d="M889.583,1267.373c10.917,-7.792 21.208,-18.042 29.167,-29.167c-7.042,8.417 -20.542,21.958 -29.167,29.167Z" style="fill:none;fill-rule:nonzero;stroke:#7c8da4;stroke-width:1.25px;"/></g><g><path d="M927.083,1292.373c9.5,-7.083 17.792,-15.292 25,-25c-6.333,7.25 -17.542,18.5 -25,25Z" style="fill:none;fill-rule:nonzero;stroke:#778394;stroke-width:1.25px;"/></g><g><path d="M585.417,1342.373c70.5,-2.708 144.917,2.375 212.5,-4.167c-69.75,0 -146.042,-5.333 -212.5,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#828c9b;stroke-width:1.25px;"/></g><g><path d="M514.583,1521.54c-5.75,-0.667 -16.5,-3.625 -25,-4.167c6.458,1 15.75,3.917 25,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#838fa0;stroke-width:1.25px;"/></g><g><path d="M1314.583,1525.706c7.542,-0.292 15.833,-3.458 20.833,-4.167c-7.542,0.292 -15.833,3.458 -20.833,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#7c8b9d;stroke-width:1.25px;"/></g><g><path d="M756.25,1534.04c-19.333,-1.875 -44.208,-4.167 -66.667,-4.167c19.333,1.875 44.208,4.167 66.667,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#7a8798;stroke-width:1.25px;"/></g><g><path d="M1168.75,1534.04c10,-0.208 21.875,-3.458 29.167,-4.167c-10,0.208 -21.875,3.458 -29.167,4.167Z" style="fill:none;fill-rule:nonzero;stroke:#939fae;stroke-width:1.25px;"/></g><g><path d="M1060.417,1534.04l-220.833,0c69.042,6.667 151.5,6.708 220.833,0Z" style="fill:none;fill-rule:nonzero;stroke:#98a4b1;stroke-width:1.25px;"/></g><g><path d="M1727.083,1679.873c13.25,-11.333 26.458,-23.542 37.5,-37.5c-11.208,12.125 -25.583,25.583 -37.5,37.5Z" style="fill:none;fill-rule:nonzero;stroke:#7a899c;stroke-width:1.25px;"/></g><g><path d="M1493.75,1767.373l-908.333,0c145.875,14.125 304.5,4.167 454.167,4.167c149.667,0 308,10 454.167,-4.167Z" style="fill:none;fill-rule:nonzero;stroke:#6f7f94;stroke-width:1.25px;"/></g><g><path d="M564.583,242.373l929.167,0c-149.458,-14.458 -313.583,-4.083 -466.667,-4.167c-153.083,-0.083 -313.083,-10.292 -462.5,4.167Z" style="fill:#6f7e94;fill-rule:nonzero;"/></g><g><path d="M185.417,625.706l0,800c0,138.875 62,242.083 178.125,321.875c116.125,79.75 278.583,71.667 426.042,69.792c147.458,-1.875 349.125,-1.042 495.833,0c146.708,1.042 314.167,11.5 428.208,-67.625c114.042,-79.083 180.125,-179.5 180.125,-315.708l0,-812.5c0,-213.125 -194.083,-379.167 -400,-379.167l-929.167,0c-207.417,0 -379.167,178.25 -379.167,383.333m1658.333,-4.167c12.625,130.375 4.25,270.208 4.167,404.167c-0.083,133.958 8.458,277.917 -4.167,408.333c0,77.208 -32.167,148.792 -79.167,208.333c-11.042,13.958 -24.25,26.167 -37.5,37.5c-64.208,54.875 -148.458,87.5 -233.333,87.5c-146.167,14.167 -304.5,4.167 -454.167,4.167c-149.667,0 -308.292,9.958 -454.167,-4.167c-180.333,0 -350,-147.708 -350,-333.333c-12.833,-132.583 -4.167,-276.5 -4.167,-412.5c0,-136 -8.625,-280.25 4.167,-412.5c0,-121.833 66.917,-213.583 175.333,-274.667c108.375,-61.125 274.375,-46.375 408,-46.167c133.625,0.208 316.25,0.167 450,0c133.75,-0.167 296.333,-15.25 404.5,49.667c108.125,64.958 170.5,161.417 170.5,283.667Z" style="fill:#fff;fill-rule:nonzero;"/></g><g><path d="M952.083,1267.373c-7.208,9.708 -15.5,17.917 -25,25c-39.875,29.625 -78.292,45.833 -129.167,45.833c-67.583,6.542 -142,1.458 -212.5,4.167c-66,-3.75 -151.583,62.292 -116.667,133.333c-24.458,2.542 -48.333,7.208 -70.833,16.667c18.125,22.917 61.333,23.042 91.667,25c8.5,0.542 19.25,3.5 25,4.167c59.125,1.667 115.583,8.333 175,8.333c22.458,0 47.333,2.292 66.667,4.167l304.167,0c36.083,0 72.25,0.708 108.333,0c7.292,-0.708 19.167,-3.958 29.167,-4.167c39.833,-0.792 76.875,-2.583 116.667,-4.167c5,-0.708 13.292,-3.875 20.833,-4.167c51.083,-2.708 102.542,-4.292 150,-20.833c-10.917,-25.625 -50.333,-21.083 -75,-25c96,-112.625 62.5,-289.042 62.5,-433.333c-0.833,-8.75 -4.167,-21.792 -4.167,-33.333c-0.875,-72.542 -27.833,-151.875 -91.667,-191.667c15.292,-64 25.083,-115.792 78.125,-155.208c53.083,-39.417 11.625,-134.75 -53.125,-136.458c-64.75,-1.708 -123.875,58.833 -83.333,125c9.375,13.042 17,10.958 16.667,25c-0.458,86.417 -75.042,115.417 -144.917,130.083c-69.875,14.667 -149.583,-77.375 -99.875,-141.542c49.708,-64.208 -2.583,-153.917 -85.708,-135.708c-83.125,18.208 -78.708,135.708 -2.833,155.5c0.375,101.417 -0.542,216.625 0,316.667c0.542,100.042 9.292,186.917 -50,266.667m100,-716.667c17,4.208 44.583,49.792 20.5,53.833c-24.125,4 -49.875,-2.875 -69.208,-21.792c-19.375,-18.875 26.625,-37.5 48.708,-32.042m362.5,0c13.917,3.25 49.917,42.333 26.042,51.042c-23.917,8.667 -46.5,1.667 -68.667,-16.75c-22.167,-18.458 14.917,-40.75 42.625,-34.292m-220.833,366.667c46.292,12.417 22.792,110.917 -25,91.667c-47.792,-19.25 -24.583,-104.958 25,-91.667m150,0c44.042,11.833 28.25,104.667 -17.583,92.583c-45.875,-12.125 -34.333,-106.5 17.583,-92.583Z" style="fill:#fff;fill-rule:nonzero;"/></g><g><path d="M235.417,1434.04l0,-825c-12.792,132.25 -4.167,276.5 -4.167,412.5c0,136 -8.667,279.917 4.167,412.5Z" style="fill:#9ba5b4;fill-rule:nonzero;"/></g><g><path d="M1843.75,1434.04c12.625,-130.417 4.083,-274.375 4.167,-408.333c0.083,-133.958 8.458,-273.792 -4.167,-404.167l0,812.5Z" style="fill:#6a7b93;fill-rule:nonzero;"/></g><g><path d="M1893.75,1434.04c12.625,-130.417 4.083,-274.375 4.167,-408.333c0.083,-133.958 8.458,-273.792 -4.167,-404.167l0,812.5Z" style="fill:#8190a3;fill-rule:nonzero;"/></g><g><path d="M185.417,1425.706l0,-800c-12.417,128.167 -4.167,268.125 -4.167,400c0,131.875 -8.25,271.5 4.167,400Z" style="fill:#67788f;fill-rule:nonzero;"/></g><g><path d="M1335.417,675.706c0.333,-14.042 -7.292,-11.958 -16.667,-25c5.417,8.833 15.125,14.333 16.667,25Z" style="fill:#7d8896;fill-rule:nonzero;"/></g><g><path d="M947.917,879.873c16.833,10.833 -0.333,61.5 4.167,83.333c4.5,21.833 -1.333,62.208 0,87.5c1.333,25.292 1,61.333 0,87.5c3.542,-24.667 6.083,-64.667 4.167,-91.667c-1.917,-27 2.583,-68.167 0,-91.667c-2.583,-23.5 8.75,-72.833 -8.333,-75Z" style="fill:#6b798f;fill-rule:nonzero;"/></g><g><path d="M889.583,1267.373c8.625,-7.208 22.125,-20.75 29.167,-29.167c21.125,-29.583 31.958,-63.583 33.333,-100c1,-26.167 1.333,-62.208 0,-87.5c-1.333,-25.292 4.5,-65.667 0,-87.5c-4.5,-21.833 12.667,-72.5 -4.167,-83.333c-192.417,44.917 -332.583,230.667 -370.833,416.667c100.375,-15.333 226.458,32.292 312.5,-29.167Z" style="fill:#fff;fill-rule:nonzero;"/></g><g><path d="M1472.917,1042.373c0,-11.542 -3.333,-24.583 -4.167,-33.333c0,11.542 3.333,24.583 4.167,33.333Z" style="fill:#798392;fill-rule:nonzero;"/></g><g><path d="M889.583,1267.373c10.917,-7.792 21.208,-18.042 29.167,-29.167c-7.042,8.417 -20.542,21.958 -29.167,29.167Z" style="fill:#7c8da4;fill-rule:nonzero;"/></g><g><path d="M927.083,1292.373c9.5,-7.083 17.792,-15.292 25,-25c-6.333,7.25 -17.542,18.5 -25,25Z" style="fill:#778394;fill-rule:nonzero;"/></g><g><path d="M585.417,1342.373c70.5,-2.708 144.917,2.375 212.5,-4.167c-69.75,0 -146.042,-5.333 -212.5,4.167Z" style="fill:#828c9b;fill-rule:nonzero;"/></g><g><path d="M514.583,1521.54c-5.75,-0.667 -16.5,-3.625 -25,-4.167c6.458,1 15.75,3.917 25,4.167Z" style="fill:#838fa0;fill-rule:nonzero;"/></g><g><path d="M1314.583,1525.706c7.542,-0.292 15.833,-3.458 20.833,-4.167c-7.542,0.292 -15.833,3.458 -20.833,4.167Z" style="fill:#7c8b9d;fill-rule:nonzero;"/></g><g><path d="M756.25,1534.04c-19.333,-1.875 -44.208,-4.167 -66.667,-4.167c19.333,1.875 44.208,4.167 66.667,4.167Z" style="fill:#7a8798;fill-rule:nonzero;"/></g><g><path d="M1168.75,1534.04c10,-0.208 21.875,-3.458 29.167,-4.167c-10,0.208 -21.875,3.458 -29.167,4.167Z" style="fill:#939fae;fill-rule:nonzero;"/></g><g><path d="M1060.417,1534.04l-220.833,0c69.042,6.667 151.5,6.708 220.833,0Z" style="fill:#98a4b1;fill-rule:nonzero;"/></g><g><path d="M1727.083,1679.873c13.25,-11.333 26.458,-23.542 37.5,-37.5c-11.208,12.125 -25.583,25.583 -37.5,37.5Z" style="fill:#7a899c;fill-rule:nonzero;"/></g><g><path d="M1493.75,1767.373l-908.333,0c145.875,14.125 304.5,4.167 454.167,4.167c149.667,0 308,10 454.167,-4.167Z" style="fill:#6f7f94;fill-rule:nonzero;"/></g></g></svg>
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import React, { Suspense, lazy } from 'react';
|
|
2
|
+
import { BrowserRouter, Routes, Route, Navigate, useLocation } from 'react-router-dom';
|
|
3
|
+
import { useTranslation } from 'react-i18next';
|
|
4
|
+
import * as Sentry from '@sentry/react';
|
|
5
|
+
import { AuthProvider, useAuth } from './contexts/AuthContext';
|
|
6
|
+
import { AppConfigProvider, useAppConfig } from './contexts/AppConfigContext';
|
|
7
|
+
import { SentryDebug } from './components/SentryDebug';
|
|
8
|
+
import { ToastProvider } from './components/ui/Toast';
|
|
9
|
+
import { TooltipProvider } from './components/ui/tooltip-base';
|
|
10
|
+
import Layout from './components/Layout';
|
|
11
|
+
import api from './api/client';
|
|
12
|
+
|
|
13
|
+
const Setup = lazy(() => import('./pages/Setup'));
|
|
14
|
+
import Login from './pages/Login';
|
|
15
|
+
const Signup = lazy(() => import('./pages/Signup'));
|
|
16
|
+
const Dashboard = lazy(() => import('./pages/Dashboard'));
|
|
17
|
+
const Bookmarks = lazy(() => import('./pages/Bookmarks'));
|
|
18
|
+
const Folders = lazy(() => import('./pages/Folders'));
|
|
19
|
+
const Tags = lazy(() => import('./pages/Tags'));
|
|
20
|
+
const Profile = lazy(() => import('./pages/Profile'));
|
|
21
|
+
const AdminLayout = lazy(() => import('./pages/admin/AdminLayout'));
|
|
22
|
+
const AdminMembersPage = lazy(() => import('./pages/admin/AdminMembersPage'));
|
|
23
|
+
const AdminTeamsPage = lazy(() => import('./pages/admin/AdminTeamsPage'));
|
|
24
|
+
const AdminOIDCPage = lazy(() => import('./pages/admin/AdminOIDCPage'));
|
|
25
|
+
const AdminSettingsPage = lazy(() => import('./pages/admin/AdminSettingsPage'));
|
|
26
|
+
const AdminAIPage = lazy(() => import('./pages/admin/AdminAIPage'));
|
|
27
|
+
const PasswordReset = lazy(() => import('./pages/PasswordReset'));
|
|
28
|
+
const VerifyEmail = lazy(() => import('./pages/VerifyEmail'));
|
|
29
|
+
const SearchEngineGuide = lazy(() => import('./pages/SearchEngineGuide'));
|
|
30
|
+
const GoPreferences = lazy(() => import('./pages/GoPreferences'));
|
|
31
|
+
|
|
32
|
+
function PrivateRoute({ children }: { children: React.ReactNode }) {
|
|
33
|
+
const { user, loading } = useAuth();
|
|
34
|
+
const { t } = useTranslation();
|
|
35
|
+
const { appBasePath } = useAppConfig();
|
|
36
|
+
if (loading) return <div className="min-h-screen flex items-center justify-center"><div className="text-lg">{t('common.loading')}</div></div>;
|
|
37
|
+
if (!user) return <Navigate to={`${appBasePath}/login`} replace />;
|
|
38
|
+
return <>{children}</>;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function AdminRoute({ children }: { children: React.ReactNode }) {
|
|
42
|
+
const { user, loading } = useAuth();
|
|
43
|
+
const { t } = useTranslation();
|
|
44
|
+
const { appBasePath, appRootPath } = useAppConfig();
|
|
45
|
+
if (loading) return <div className="min-h-screen flex items-center justify-center"><div className="text-lg">{t('common.loading')}</div></div>;
|
|
46
|
+
if (!user) return <Navigate to={`${appBasePath}/login`} replace />;
|
|
47
|
+
if (!user.is_admin) return <Navigate to={appRootPath} replace />;
|
|
48
|
+
return <>{children}</>;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function SharedRedirect() {
|
|
52
|
+
const { appBasePath } = useAppConfig();
|
|
53
|
+
const to = `${appBasePath || ''}/bookmarks?scope=shared_with_me`;
|
|
54
|
+
return <Navigate to={to} replace />;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function AppRoutes() {
|
|
58
|
+
const { user, loading } = useAuth();
|
|
59
|
+
const { t } = useTranslation();
|
|
60
|
+
const { appRootPath } = useAppConfig();
|
|
61
|
+
const [setupStatus, setSetupStatus] = React.useState<{ initialized: boolean } | null>(null);
|
|
62
|
+
const [setupLoading, setSetupLoading] = React.useState(true);
|
|
63
|
+
|
|
64
|
+
React.useEffect(() => {
|
|
65
|
+
api.get('/auth/setup/status')
|
|
66
|
+
.then((res) => res.data)
|
|
67
|
+
.then((data) => { setSetupStatus(data); setSetupLoading(false); })
|
|
68
|
+
.catch(() => { setSetupStatus({ initialized: true }); setSetupLoading(false); });
|
|
69
|
+
}, []);
|
|
70
|
+
|
|
71
|
+
if (setupLoading || (loading && setupStatus?.initialized)) {
|
|
72
|
+
return <div className="min-h-screen flex items-center justify-center"><div className="text-lg">{t('common.loading')}</div></div>;
|
|
73
|
+
}
|
|
74
|
+
if (setupStatus && !setupStatus.initialized) {
|
|
75
|
+
return <Suspense fallback={<div className="min-h-screen flex items-center justify-center"><div className="text-lg">{t('common.loading')}</div></div>}><Setup /></Suspense>;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return (
|
|
79
|
+
<Suspense fallback={<div className="min-h-screen flex items-center justify-center"><div className="text-lg">{t('common.loading')}</div></div>}>
|
|
80
|
+
<Routes>
|
|
81
|
+
<Route path="/login" element={!user ? <Login /> : <Navigate to={appRootPath} replace />} />
|
|
82
|
+
<Route path="/signup" element={!user ? <Signup /> : <Navigate to={appRootPath} replace />} />
|
|
83
|
+
<Route path="/reset-password" element={<PasswordReset />} />
|
|
84
|
+
<Route path="/password-reset" element={<PasswordReset />} />
|
|
85
|
+
<Route path="/verify-email" element={<VerifyEmail />} />
|
|
86
|
+
<Route path="/go/:slug" element={<ForwardingHandler />} />
|
|
87
|
+
<Route path="/" element={<PrivateRoute><Layout /></PrivateRoute>}>
|
|
88
|
+
<Route index element={<Dashboard />} />
|
|
89
|
+
<Route path="bookmarks" element={<Bookmarks />} />
|
|
90
|
+
<Route path="folders" element={<Folders />} />
|
|
91
|
+
<Route path="tags" element={<Tags />} />
|
|
92
|
+
<Route path="shared" element={<SharedRedirect />} />
|
|
93
|
+
<Route path="profile" element={<Profile />} />
|
|
94
|
+
<Route path="go-preferences" element={<GoPreferences />} />
|
|
95
|
+
<Route path="search-engine-guide" element={<SearchEngineGuide />} />
|
|
96
|
+
<Route path="admin" element={<AdminRoute><AdminLayout /></AdminRoute>}>
|
|
97
|
+
<Route index element={<Navigate to="members" replace />} />
|
|
98
|
+
<Route path="members" element={<AdminMembersPage />} />
|
|
99
|
+
<Route path="teams" element={<AdminTeamsPage />} />
|
|
100
|
+
<Route path="oidc" element={<AdminOIDCPage />} />
|
|
101
|
+
<Route path="settings" element={<AdminSettingsPage />} />
|
|
102
|
+
<Route path="ai" element={<AdminAIPage />} />
|
|
103
|
+
</Route>
|
|
104
|
+
</Route>
|
|
105
|
+
</Routes>
|
|
106
|
+
</Suspense>
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function ForwardingHandler() {
|
|
111
|
+
const location = useLocation();
|
|
112
|
+
const { pathname } = location;
|
|
113
|
+
const { t } = useTranslation();
|
|
114
|
+
const { apiBaseUrl } = useAppConfig();
|
|
115
|
+
|
|
116
|
+
React.useEffect(() => {
|
|
117
|
+
const match = pathname.match(/\/go\/([^/]+)/);
|
|
118
|
+
const slug = match ? match[1] : '';
|
|
119
|
+
const goPath = slug ? `/go/${slug}` : '/go';
|
|
120
|
+
const isDevelopment = window.location.hostname === 'localhost';
|
|
121
|
+
const backendUrl = isDevelopment
|
|
122
|
+
? `http://localhost:5000${goPath}`
|
|
123
|
+
: apiBaseUrl
|
|
124
|
+
? `${apiBaseUrl}${goPath}`
|
|
125
|
+
: goPath;
|
|
126
|
+
window.location.href = backendUrl;
|
|
127
|
+
}, [pathname, apiBaseUrl]);
|
|
128
|
+
|
|
129
|
+
return (
|
|
130
|
+
<div className="min-h-screen flex items-center justify-center">
|
|
131
|
+
<div className="text-gray-500 dark:text-gray-400">{t('common.loading')}</div>
|
|
132
|
+
</div>
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function AppErrorFallback() {
|
|
137
|
+
const { t } = useTranslation();
|
|
138
|
+
return (
|
|
139
|
+
<div className="min-h-screen flex flex-col items-center justify-center gap-4 p-4" role="alert">
|
|
140
|
+
<p className="text-lg text-gray-700 dark:text-gray-300 text-center">{t('common.error')}</p>
|
|
141
|
+
<button
|
|
142
|
+
type="button"
|
|
143
|
+
onClick={() => window.location.reload()}
|
|
144
|
+
className="px-4 py-2 rounded-md bg-primary text-primary-foreground hover:opacity-90"
|
|
145
|
+
>
|
|
146
|
+
{t('common.reload')}
|
|
147
|
+
</button>
|
|
148
|
+
</div>
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export interface AppProps {
|
|
153
|
+
/** Base path for app routes (e.g. '/' for self-hosted, '/app' for cloud). */
|
|
154
|
+
basePath?: string;
|
|
155
|
+
/** API base URL (e.g. '' for same-origin, or full URL if frontend is on different origin). */
|
|
156
|
+
apiBaseUrl?: string;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function App({ basePath, apiBaseUrl }: AppProps = {}) {
|
|
160
|
+
const appRootPath = basePath === '/' || !basePath ? '/' : basePath;
|
|
161
|
+
return (
|
|
162
|
+
<Sentry.ErrorBoundary fallback={<AppErrorFallback />}>
|
|
163
|
+
<AppConfigProvider appBasePath={basePath} apiBaseUrl={apiBaseUrl} appRootPath={appRootPath}>
|
|
164
|
+
<BrowserRouter basename={basePath ?? ''}>
|
|
165
|
+
<AuthProvider>
|
|
166
|
+
<TooltipProvider>
|
|
167
|
+
<ToastProvider>
|
|
168
|
+
<AppRoutes />
|
|
169
|
+
<SentryDebug />
|
|
170
|
+
</ToastProvider>
|
|
171
|
+
</TooltipProvider>
|
|
172
|
+
</AuthProvider>
|
|
173
|
+
</BrowserRouter>
|
|
174
|
+
</AppConfigProvider>
|
|
175
|
+
</Sentry.ErrorBoundary>
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export default App;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import axios, { type AxiosInstance } from 'axios';
|
|
2
|
+
import * as Sentry from '@sentry/react';
|
|
3
|
+
import { apiBaseUrl } from '../config/api';
|
|
4
|
+
|
|
5
|
+
function baseURLFromOptions(options: { baseUrl?: string; basePath?: string } = {}): string {
|
|
6
|
+
if (options.baseUrl) return `${options.baseUrl.replace(/\/$/, '')}/api`;
|
|
7
|
+
if (options.basePath) return `${options.basePath.replace(/\/$/, '')}/api`;
|
|
8
|
+
return apiBaseUrl ? `${apiBaseUrl}/api` : '/api';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Create an API client with the given base URL/path. Used by package consumers (e.g. cloud).
|
|
13
|
+
*/
|
|
14
|
+
export function createApiClient(options: { baseUrl?: string; basePath?: string } = {}): AxiosInstance {
|
|
15
|
+
const client = axios.create({
|
|
16
|
+
baseURL: baseURLFromOptions(options),
|
|
17
|
+
withCredentials: true,
|
|
18
|
+
});
|
|
19
|
+
// Same CSRF and error handling as default api (simplified: no shared token state)
|
|
20
|
+
client.interceptors.request.use(async (config) => {
|
|
21
|
+
if (['POST', 'PUT', 'DELETE', 'PATCH'].includes(config.method?.toUpperCase() || '')) {
|
|
22
|
+
try {
|
|
23
|
+
const r = await client.get('/csrf-token');
|
|
24
|
+
const token = r.data?.csrfToken;
|
|
25
|
+
if (token) config.headers['X-CSRF-Token'] = token;
|
|
26
|
+
} catch {
|
|
27
|
+
// ignore
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return config;
|
|
31
|
+
});
|
|
32
|
+
client.interceptors.response.use(
|
|
33
|
+
(r) => r,
|
|
34
|
+
(error) => {
|
|
35
|
+
if (error.response?.status >= 500) Sentry.captureException(error);
|
|
36
|
+
return Promise.reject(error);
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
return client;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const api = axios.create({
|
|
43
|
+
baseURL: baseURLFromOptions({}),
|
|
44
|
+
withCredentials: true,
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// CSRF token management
|
|
48
|
+
let csrfToken: string | null = null;
|
|
49
|
+
let csrfTokenPromise: Promise<void> | null = null;
|
|
50
|
+
|
|
51
|
+
// Fetch CSRF token on initialization
|
|
52
|
+
async function fetchCSRFToken() {
|
|
53
|
+
try {
|
|
54
|
+
const response = await api.get('/csrf-token');
|
|
55
|
+
csrfToken = response.data.csrfToken;
|
|
56
|
+
} catch (error) {
|
|
57
|
+
console.warn('Failed to fetch CSRF token:', error);
|
|
58
|
+
// If token fetch fails, set to empty string to allow requests without token
|
|
59
|
+
// The backend will generate a token on first request
|
|
60
|
+
csrfToken = '';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Fetch CSRF token immediately (but don't block)
|
|
65
|
+
csrfTokenPromise = fetchCSRFToken();
|
|
66
|
+
|
|
67
|
+
// Request interceptor to add CSRF token to state-changing requests
|
|
68
|
+
api.interceptors.request.use(
|
|
69
|
+
async (config) => {
|
|
70
|
+
// Wait for initial CSRF token fetch if it's still in progress
|
|
71
|
+
if (csrfTokenPromise) {
|
|
72
|
+
await csrfTokenPromise;
|
|
73
|
+
csrfTokenPromise = null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Only add CSRF token for state-changing methods
|
|
77
|
+
if (['POST', 'PUT', 'DELETE', 'PATCH'].includes(config.method?.toUpperCase() || '')) {
|
|
78
|
+
// Skip CSRF for certain endpoints
|
|
79
|
+
const skipCSRF = [
|
|
80
|
+
'/password-reset',
|
|
81
|
+
'/auth/setup',
|
|
82
|
+
'/auth/login',
|
|
83
|
+
'/auth/logout',
|
|
84
|
+
'/auth/refresh',
|
|
85
|
+
'/auth/register',
|
|
86
|
+
'/auth/verify-signup',
|
|
87
|
+
'/auth/resend-signup-verification',
|
|
88
|
+
'/auth/request-signup-resend',
|
|
89
|
+
'/csrf-token',
|
|
90
|
+
].some((path) => config.url?.includes(path));
|
|
91
|
+
|
|
92
|
+
if (!skipCSRF) {
|
|
93
|
+
// If we don't have a token yet, try to fetch it
|
|
94
|
+
if (!csrfToken) {
|
|
95
|
+
await fetchCSRFToken();
|
|
96
|
+
}
|
|
97
|
+
if (csrfToken) {
|
|
98
|
+
config.headers['X-CSRF-Token'] = csrfToken;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return config;
|
|
103
|
+
},
|
|
104
|
+
(error) => {
|
|
105
|
+
return Promise.reject(error);
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
// Response interceptor: refresh CSRF on 403.
|
|
110
|
+
api.interceptors.response.use(
|
|
111
|
+
(response) => response,
|
|
112
|
+
async (error) => {
|
|
113
|
+
if (error.response?.status === 403 && error.config && !error.config._retry) {
|
|
114
|
+
error.config._retry = true;
|
|
115
|
+
await fetchCSRFToken();
|
|
116
|
+
if (csrfToken && error.config.headers) {
|
|
117
|
+
error.config.headers['X-CSRF-Token'] = csrfToken;
|
|
118
|
+
}
|
|
119
|
+
return api.request(error.config);
|
|
120
|
+
}
|
|
121
|
+
// Report 5xx, network errors, and unexpected 4xx to Sentry (skip 401/403/404 - auth flow)
|
|
122
|
+
const status = error.response?.status;
|
|
123
|
+
const shouldReport =
|
|
124
|
+
status === undefined ||
|
|
125
|
+
status >= 500 ||
|
|
126
|
+
(status >= 400 && status !== 401 && status !== 403 && status !== 404);
|
|
127
|
+
if (shouldReport) {
|
|
128
|
+
Sentry.captureException(error);
|
|
129
|
+
}
|
|
130
|
+
return Promise.reject(error);
|
|
131
|
+
}
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
export default api;
|