From 0fb08ac6aef9845c40c7ba7e852322a5a079f2cd Mon Sep 17 00:00:00 2001 From: Michael Zhang Date: Fri, 17 Mar 2023 03:41:24 -0500 Subject: [PATCH] add phoenix server --- .gitignore | 1 + CMakeLists.txt | 14 + cpp/main.cpp | 2 + default.nix | 9 + flake.lock | 11 +- flake.nix | 15 +- qml/main.qml | 56 ++ qml/qml.qrc | 16 + server/.formatter.exs | 6 + server/.gitignore | 41 ++ server/README.md | 18 + server/assets/css/app.css | 5 + server/assets/js/app.js | 41 ++ server/assets/tailwind.config.js | 67 ++ server/assets/vendor/topbar.js | 165 +++++ server/config/config.exs | 64 ++ server/config/dev.exs | 76 ++ server/config/prod.exs | 21 + server/config/runtime.exs | 111 +++ server/config/test.exs | 30 + server/lib/server.ex | 9 + server/lib/server/application.ex | 38 + server/lib/server/mailer.ex | 3 + server/lib/server/repo.ex | 5 + server/lib/server_web.ex | 113 +++ .../server_web/components/core_components.ex | 689 ++++++++++++++++++ server/lib/server_web/components/layouts.ex | 5 + .../components/layouts/app.html.heex | 43 ++ .../components/layouts/root.html.heex | 17 + .../lib/server_web/controllers/error_html.ex | 19 + .../lib/server_web/controllers/error_json.ex | 15 + .../server_web/controllers/page_controller.ex | 9 + .../lib/server_web/controllers/page_html.ex | 5 + .../controllers/page_html/home.html.heex | 237 ++++++ server/lib/server_web/endpoint.ex | 51 ++ server/lib/server_web/gettext.ex | 24 + server/lib/server_web/router.ex | 44 ++ server/lib/server_web/telemetry.ex | 92 +++ server/mix.exs | 73 ++ server/mix.lock | 45 ++ server/priv/gettext/en/LC_MESSAGES/errors.po | 112 +++ server/priv/gettext/errors.pot | 110 +++ server/priv/hero_icons/LICENSE.md | 21 + server/priv/hero_icons/UPGRADE.md | 7 + .../optimized/20/solid/academic-cap.svg | 3 + .../20/solid/adjustments-horizontal.svg | 3 + .../20/solid/adjustments-vertical.svg | 3 + .../20/solid/archive-box-arrow-down.svg | 3 + .../optimized/20/solid/archive-box-x-mark.svg | 4 + .../optimized/20/solid/archive-box.svg | 4 + .../optimized/20/solid/arrow-down-circle.svg | 3 + .../optimized/20/solid/arrow-down-left.svg | 3 + .../20/solid/arrow-down-on-square-stack.svg | 3 + .../20/solid/arrow-down-on-square.svg | 3 + .../optimized/20/solid/arrow-down-right.svg | 3 + .../optimized/20/solid/arrow-down-tray.svg | 4 + .../optimized/20/solid/arrow-down.svg | 3 + .../optimized/20/solid/arrow-left-circle.svg | 10 + .../20/solid/arrow-left-on-rectangle.svg | 4 + .../optimized/20/solid/arrow-left.svg | 3 + .../optimized/20/solid/arrow-long-down.svg | 3 + .../optimized/20/solid/arrow-long-left.svg | 3 + .../optimized/20/solid/arrow-long-right.svg | 3 + .../optimized/20/solid/arrow-long-up.svg | 3 + .../20/solid/arrow-path-rounded-square.svg | 3 + .../optimized/20/solid/arrow-path.svg | 3 + .../optimized/20/solid/arrow-right-circle.svg | 3 + .../20/solid/arrow-right-on-rectangle.svg | 4 + .../optimized/20/solid/arrow-right.svg | 3 + .../optimized/20/solid/arrow-small-down.svg | 3 + .../optimized/20/solid/arrow-small-left.svg | 3 + .../optimized/20/solid/arrow-small-right.svg | 3 + .../optimized/20/solid/arrow-small-up.svg | 3 + .../20/solid/arrow-top-right-on-square.svg | 4 + .../20/solid/arrow-trending-down.svg | 3 + .../optimized/20/solid/arrow-trending-up.svg | 3 + .../optimized/20/solid/arrow-up-circle.svg | 3 + .../optimized/20/solid/arrow-up-left.svg | 3 + .../20/solid/arrow-up-on-square-stack.svg | 3 + .../optimized/20/solid/arrow-up-on-square.svg | 3 + .../optimized/20/solid/arrow-up-right.svg | 3 + .../optimized/20/solid/arrow-up-tray.svg | 4 + .../optimized/20/solid/arrow-up.svg | 3 + .../optimized/20/solid/arrow-uturn-down.svg | 3 + .../optimized/20/solid/arrow-uturn-left.svg | 3 + .../optimized/20/solid/arrow-uturn-right.svg | 3 + .../optimized/20/solid/arrow-uturn-up.svg | 3 + .../optimized/20/solid/arrows-pointing-in.svg | 3 + .../20/solid/arrows-pointing-out.svg | 3 + .../optimized/20/solid/arrows-right-left.svg | 3 + .../optimized/20/solid/arrows-up-down.svg | 3 + .../optimized/20/solid/at-symbol.svg | 3 + .../optimized/20/solid/backspace.svg | 3 + .../optimized/20/solid/backward.svg | 3 + .../optimized/20/solid/banknotes.svg | 3 + .../hero_icons/optimized/20/solid/bars-2.svg | 3 + .../optimized/20/solid/bars-3-bottom-left.svg | 3 + .../20/solid/bars-3-bottom-right.svg | 3 + .../optimized/20/solid/bars-3-center-left.svg | 3 + .../hero_icons/optimized/20/solid/bars-3.svg | 3 + .../hero_icons/optimized/20/solid/bars-4.svg | 3 + .../optimized/20/solid/bars-arrow-down.svg | 3 + .../optimized/20/solid/bars-arrow-up.svg | 3 + .../optimized/20/solid/battery-0.svg | 3 + .../optimized/20/solid/battery-100.svg | 4 + .../optimized/20/solid/battery-50.svg | 4 + .../hero_icons/optimized/20/solid/beaker.svg | 3 + .../optimized/20/solid/bell-alert.svg | 4 + .../optimized/20/solid/bell-slash.svg | 3 + .../optimized/20/solid/bell-snooze.svg | 3 + .../hero_icons/optimized/20/solid/bell.svg | 3 + .../optimized/20/solid/bolt-slash.svg | 4 + .../hero_icons/optimized/20/solid/bolt.svg | 3 + .../optimized/20/solid/book-open.svg | 3 + .../optimized/20/solid/bookmark-slash.svg | 3 + .../optimized/20/solid/bookmark-square.svg | 3 + .../optimized/20/solid/bookmark.svg | 3 + .../optimized/20/solid/briefcase.svg | 4 + .../hero_icons/optimized/20/solid/bug-ant.svg | 3 + .../optimized/20/solid/building-library.svg | 3 + .../optimized/20/solid/building-office-2.svg | 3 + .../optimized/20/solid/building-office.svg | 3 + .../20/solid/building-storefront.svg | 3 + .../hero_icons/optimized/20/solid/cake.svg | 3 + .../optimized/20/solid/calculator.svg | 3 + .../optimized/20/solid/calendar-days.svg | 4 + .../optimized/20/solid/calendar.svg | 3 + .../hero_icons/optimized/20/solid/camera.svg | 3 + .../optimized/20/solid/chart-bar-square.svg | 3 + .../optimized/20/solid/chart-bar.svg | 3 + .../optimized/20/solid/chart-pie.svg | 4 + .../solid/chat-bubble-bottom-center-text.svg | 3 + .../20/solid/chat-bubble-bottom-center.svg | 3 + .../20/solid/chat-bubble-left-ellipsis.svg | 3 + .../20/solid/chat-bubble-left-right.svg | 4 + .../optimized/20/solid/chat-bubble-left.svg | 3 + .../solid/chat-bubble-oval-left-ellipsis.svg | 3 + .../20/solid/chat-bubble-oval-left.svg | 3 + .../optimized/20/solid/check-badge.svg | 3 + .../optimized/20/solid/check-circle.svg | 3 + .../hero_icons/optimized/20/solid/check.svg | 3 + .../20/solid/chevron-double-down.svg | 3 + .../20/solid/chevron-double-left.svg | 3 + .../20/solid/chevron-double-right.svg | 4 + .../optimized/20/solid/chevron-double-up.svg | 3 + .../optimized/20/solid/chevron-down.svg | 3 + .../optimized/20/solid/chevron-left.svg | 3 + .../optimized/20/solid/chevron-right.svg | 3 + .../optimized/20/solid/chevron-up-down.svg | 3 + .../optimized/20/solid/chevron-up.svg | 3 + .../optimized/20/solid/circle-stack.svg | 3 + .../20/solid/clipboard-document-check.svg | 4 + .../20/solid/clipboard-document-list.svg | 4 + .../optimized/20/solid/clipboard-document.svg | 4 + .../optimized/20/solid/clipboard.svg | 3 + .../hero_icons/optimized/20/solid/clock.svg | 3 + .../optimized/20/solid/cloud-arrow-down.svg | 3 + .../optimized/20/solid/cloud-arrow-up.svg | 3 + .../hero_icons/optimized/20/solid/cloud.svg | 3 + .../20/solid/code-bracket-square.svg | 3 + .../optimized/20/solid/code-bracket.svg | 3 + .../optimized/20/solid/cog-6-tooth.svg | 3 + .../optimized/20/solid/cog-8-tooth.svg | 3 + .../hero_icons/optimized/20/solid/cog.svg | 4 + .../optimized/20/solid/command-line.svg | 3 + .../optimized/20/solid/computer-desktop.svg | 3 + .../optimized/20/solid/cpu-chip.svg | 4 + .../optimized/20/solid/credit-card.svg | 3 + .../optimized/20/solid/cube-transparent.svg | 3 + .../hero_icons/optimized/20/solid/cube.svg | 3 + .../20/solid/currency-bangladeshi.svg | 3 + .../optimized/20/solid/currency-dollar.svg | 4 + .../optimized/20/solid/currency-euro.svg | 3 + .../optimized/20/solid/currency-pound.svg | 3 + .../optimized/20/solid/currency-rupee.svg | 3 + .../optimized/20/solid/currency-yen.svg | 3 + .../optimized/20/solid/cursor-arrow-rays.svg | 3 + .../20/solid/cursor-arrow-ripple.svg | 3 + .../20/solid/device-phone-mobile.svg | 4 + .../optimized/20/solid/device-tablet.svg | 3 + .../20/solid/document-arrow-down.svg | 3 + .../optimized/20/solid/document-arrow-up.svg | 3 + .../optimized/20/solid/document-chart-bar.svg | 3 + .../optimized/20/solid/document-check.svg | 3 + .../optimized/20/solid/document-duplicate.svg | 4 + .../20/solid/document-magnifying-glass.svg | 4 + .../optimized/20/solid/document-minus.svg | 3 + .../optimized/20/solid/document-plus.svg | 3 + .../optimized/20/solid/document-text.svg | 3 + .../optimized/20/solid/document.svg | 3 + .../20/solid/ellipsis-horizontal-circle.svg | 3 + .../20/solid/ellipsis-horizontal.svg | 3 + .../optimized/20/solid/ellipsis-vertical.svg | 3 + .../optimized/20/solid/envelope-open.svg | 3 + .../optimized/20/solid/envelope.svg | 4 + .../optimized/20/solid/exclamation-circle.svg | 3 + .../20/solid/exclamation-triangle.svg | 3 + .../optimized/20/solid/eye-dropper.svg | 3 + .../optimized/20/solid/eye-slash.svg | 4 + .../hero_icons/optimized/20/solid/eye.svg | 4 + .../optimized/20/solid/face-frown.svg | 3 + .../optimized/20/solid/face-smile.svg | 3 + .../hero_icons/optimized/20/solid/film.svg | 3 + .../optimized/20/solid/finger-print.svg | 3 + .../hero_icons/optimized/20/solid/fire.svg | 3 + .../hero_icons/optimized/20/solid/flag.svg | 3 + .../optimized/20/solid/folder-arrow-down.svg | 3 + .../optimized/20/solid/folder-minus.svg | 3 + .../optimized/20/solid/folder-open.svg | 3 + .../optimized/20/solid/folder-plus.svg | 3 + .../hero_icons/optimized/20/solid/folder.svg | 3 + .../hero_icons/optimized/20/solid/forward.svg | 3 + .../hero_icons/optimized/20/solid/funnel.svg | 3 + .../hero_icons/optimized/20/solid/gif.svg | 3 + .../optimized/20/solid/gift-top.svg | 3 + .../hero_icons/optimized/20/solid/gift.svg | 4 + .../optimized/20/solid/globe-alt.svg | 3 + .../optimized/20/solid/globe-americas.svg | 3 + .../20/solid/globe-asia-australia.svg | 3 + .../20/solid/globe-europe-africa.svg | 3 + .../optimized/20/solid/hand-raised.svg | 3 + .../optimized/20/solid/hand-thumb-down.svg | 3 + .../optimized/20/solid/hand-thumb-up.svg | 3 + .../hero_icons/optimized/20/solid/hashtag.svg | 3 + .../hero_icons/optimized/20/solid/heart.svg | 3 + .../optimized/20/solid/home-modern.svg | 3 + .../hero_icons/optimized/20/solid/home.svg | 3 + .../optimized/20/solid/identification.svg | 3 + .../optimized/20/solid/inbox-arrow-down.svg | 4 + .../optimized/20/solid/inbox-stack.svg | 4 + .../hero_icons/optimized/20/solid/inbox.svg | 3 + .../optimized/20/solid/information-circle.svg | 3 + .../hero_icons/optimized/20/solid/key.svg | 3 + .../optimized/20/solid/language.svg | 4 + .../optimized/20/solid/lifebuoy.svg | 3 + .../optimized/20/solid/light-bulb.svg | 3 + .../hero_icons/optimized/20/solid/link.svg | 4 + .../optimized/20/solid/list-bullet.svg | 3 + .../optimized/20/solid/lock-closed.svg | 3 + .../optimized/20/solid/lock-open.svg | 3 + .../20/solid/magnifying-glass-circle.svg | 4 + .../20/solid/magnifying-glass-minus.svg | 4 + .../20/solid/magnifying-glass-plus.svg | 4 + .../optimized/20/solid/magnifying-glass.svg | 3 + .../hero_icons/optimized/20/solid/map-pin.svg | 3 + .../hero_icons/optimized/20/solid/map.svg | 3 + .../optimized/20/solid/megaphone.svg | 3 + .../optimized/20/solid/microphone.svg | 4 + .../optimized/20/solid/minus-circle.svg | 3 + .../optimized/20/solid/minus-small.svg | 3 + .../hero_icons/optimized/20/solid/minus.svg | 3 + .../hero_icons/optimized/20/solid/moon.svg | 3 + .../optimized/20/solid/musical-note.svg | 3 + .../optimized/20/solid/newspaper.svg | 4 + .../optimized/20/solid/no-symbol.svg | 3 + .../optimized/20/solid/paint-brush.svg | 3 + .../optimized/20/solid/paper-airplane.svg | 3 + .../optimized/20/solid/paper-clip.svg | 3 + .../optimized/20/solid/pause-circle.svg | 3 + .../hero_icons/optimized/20/solid/pause.svg | 3 + .../optimized/20/solid/pencil-square.svg | 4 + .../hero_icons/optimized/20/solid/pencil.svg | 3 + .../20/solid/phone-arrow-down-left.svg | 3 + .../20/solid/phone-arrow-up-right.svg | 3 + .../optimized/20/solid/phone-x-mark.svg | 3 + .../hero_icons/optimized/20/solid/phone.svg | 3 + .../hero_icons/optimized/20/solid/photo.svg | 3 + .../optimized/20/solid/play-circle.svg | 3 + .../optimized/20/solid/play-pause.svg | 3 + .../hero_icons/optimized/20/solid/play.svg | 3 + .../optimized/20/solid/plus-circle.svg | 3 + .../optimized/20/solid/plus-small.svg | 3 + .../hero_icons/optimized/20/solid/plus.svg | 3 + .../hero_icons/optimized/20/solid/power.svg | 3 + .../20/solid/presentation-chart-bar.svg | 3 + .../20/solid/presentation-chart-line.svg | 3 + .../hero_icons/optimized/20/solid/printer.svg | 3 + .../optimized/20/solid/puzzle-piece.svg | 3 + .../hero_icons/optimized/20/solid/qr-code.svg | 3 + .../20/solid/question-mark-circle.svg | 3 + .../optimized/20/solid/queue-list.svg | 3 + .../hero_icons/optimized/20/solid/radio.svg | 3 + .../optimized/20/solid/receipt-percent.svg | 3 + .../optimized/20/solid/receipt-refund.svg | 3 + .../optimized/20/solid/rectangle-group.svg | 3 + .../optimized/20/solid/rectangle-stack.svg | 3 + .../optimized/20/solid/rocket-launch.svg | 4 + .../hero_icons/optimized/20/solid/rss.svg | 4 + .../hero_icons/optimized/20/solid/scale.svg | 3 + .../optimized/20/solid/scissors.svg | 4 + .../optimized/20/solid/server-stack.svg | 4 + .../hero_icons/optimized/20/solid/server.svg | 4 + .../hero_icons/optimized/20/solid/share.svg | 3 + .../optimized/20/solid/shield-check.svg | 3 + .../optimized/20/solid/shield-exclamation.svg | 3 + .../optimized/20/solid/shopping-bag.svg | 3 + .../optimized/20/solid/shopping-cart.svg | 3 + .../optimized/20/solid/signal-slash.svg | 3 + .../hero_icons/optimized/20/solid/signal.svg | 4 + .../optimized/20/solid/sparkles.svg | 3 + .../optimized/20/solid/speaker-wave.svg | 4 + .../optimized/20/solid/speaker-x-mark.svg | 3 + .../optimized/20/solid/square-2-stack.svg | 4 + .../optimized/20/solid/square-3-stack-3d.svg | 5 + .../optimized/20/solid/squares-2x2.svg | 3 + .../optimized/20/solid/squares-plus.svg | 3 + .../hero_icons/optimized/20/solid/star.svg | 3 + .../optimized/20/solid/stop-circle.svg | 3 + .../hero_icons/optimized/20/solid/stop.svg | 3 + .../hero_icons/optimized/20/solid/sun.svg | 3 + .../hero_icons/optimized/20/solid/swatch.svg | 3 + .../optimized/20/solid/table-cells.svg | 3 + .../hero_icons/optimized/20/solid/tag.svg | 3 + .../hero_icons/optimized/20/solid/ticket.svg | 3 + .../hero_icons/optimized/20/solid/trash.svg | 3 + .../hero_icons/optimized/20/solid/trophy.svg | 3 + .../hero_icons/optimized/20/solid/truck.svg | 4 + .../priv/hero_icons/optimized/20/solid/tv.svg | 4 + .../optimized/20/solid/user-circle.svg | 3 + .../optimized/20/solid/user-group.svg | 3 + .../optimized/20/solid/user-minus.svg | 3 + .../optimized/20/solid/user-plus.svg | 3 + .../hero_icons/optimized/20/solid/user.svg | 3 + .../hero_icons/optimized/20/solid/users.svg | 3 + .../optimized/20/solid/variable.svg | 3 + .../optimized/20/solid/video-camera-slash.svg | 3 + .../optimized/20/solid/video-camera.svg | 3 + .../optimized/20/solid/view-columns.svg | 3 + .../optimized/20/solid/viewfinder-circle.svg | 3 + .../hero_icons/optimized/20/solid/wallet.svg | 3 + .../hero_icons/optimized/20/solid/wifi.svg | 3 + .../hero_icons/optimized/20/solid/window.svg | 3 + .../optimized/20/solid/wrench-screwdriver.svg | 4 + .../hero_icons/optimized/20/solid/wrench.svg | 3 + .../optimized/20/solid/x-circle.svg | 3 + .../hero_icons/optimized/20/solid/x-mark.svg | 3 + .../optimized/24/outline/academic-cap.svg | 3 + .../24/outline/adjustments-horizontal.svg | 3 + .../24/outline/adjustments-vertical.svg | 3 + .../24/outline/archive-box-arrow-down.svg | 3 + .../24/outline/archive-box-x-mark.svg | 3 + .../optimized/24/outline/archive-box.svg | 3 + .../24/outline/arrow-down-circle.svg | 3 + .../optimized/24/outline/arrow-down-left.svg | 3 + .../24/outline/arrow-down-on-square-stack.svg | 3 + .../24/outline/arrow-down-on-square.svg | 3 + .../optimized/24/outline/arrow-down-right.svg | 3 + .../optimized/24/outline/arrow-down-tray.svg | 3 + .../optimized/24/outline/arrow-down.svg | 3 + .../24/outline/arrow-left-circle.svg | 3 + .../24/outline/arrow-left-on-rectangle.svg | 3 + .../optimized/24/outline/arrow-left.svg | 3 + .../optimized/24/outline/arrow-long-down.svg | 3 + .../optimized/24/outline/arrow-long-left.svg | 3 + .../optimized/24/outline/arrow-long-right.svg | 3 + .../optimized/24/outline/arrow-long-up.svg | 3 + .../24/outline/arrow-path-rounded-square.svg | 3 + .../optimized/24/outline/arrow-path.svg | 3 + .../24/outline/arrow-right-circle.svg | 3 + .../24/outline/arrow-right-on-rectangle.svg | 3 + .../optimized/24/outline/arrow-right.svg | 3 + .../optimized/24/outline/arrow-small-down.svg | 3 + .../optimized/24/outline/arrow-small-left.svg | 3 + .../24/outline/arrow-small-right.svg | 3 + .../optimized/24/outline/arrow-small-up.svg | 3 + .../24/outline/arrow-top-right-on-square.svg | 3 + .../24/outline/arrow-trending-down.svg | 3 + .../24/outline/arrow-trending-up.svg | 3 + .../optimized/24/outline/arrow-up-circle.svg | 3 + .../optimized/24/outline/arrow-up-left.svg | 3 + .../24/outline/arrow-up-on-square-stack.svg | 3 + .../24/outline/arrow-up-on-square.svg | 3 + .../optimized/24/outline/arrow-up-right.svg | 3 + .../optimized/24/outline/arrow-up-tray.svg | 3 + .../optimized/24/outline/arrow-up.svg | 3 + .../optimized/24/outline/arrow-uturn-down.svg | 3 + .../optimized/24/outline/arrow-uturn-left.svg | 3 + .../24/outline/arrow-uturn-right.svg | 3 + .../optimized/24/outline/arrow-uturn-up.svg | 3 + .../24/outline/arrows-pointing-in.svg | 3 + .../24/outline/arrows-pointing-out.svg | 3 + .../24/outline/arrows-right-left.svg | 3 + .../optimized/24/outline/arrows-up-down.svg | 3 + .../optimized/24/outline/at-symbol.svg | 3 + .../optimized/24/outline/backspace.svg | 3 + .../optimized/24/outline/backward.svg | 3 + .../optimized/24/outline/banknotes.svg | 3 + .../optimized/24/outline/bars-2.svg | 3 + .../24/outline/bars-3-bottom-left.svg | 3 + .../24/outline/bars-3-bottom-right.svg | 3 + .../24/outline/bars-3-center-left.svg | 3 + .../optimized/24/outline/bars-3.svg | 3 + .../optimized/24/outline/bars-4.svg | 3 + .../optimized/24/outline/bars-arrow-down.svg | 3 + .../optimized/24/outline/bars-arrow-up.svg | 3 + .../optimized/24/outline/battery-0.svg | 3 + .../optimized/24/outline/battery-100.svg | 3 + .../optimized/24/outline/battery-50.svg | 3 + .../optimized/24/outline/beaker.svg | 3 + .../optimized/24/outline/bell-alert.svg | 3 + .../optimized/24/outline/bell-slash.svg | 3 + .../optimized/24/outline/bell-snooze.svg | 3 + .../hero_icons/optimized/24/outline/bell.svg | 3 + .../optimized/24/outline/bolt-slash.svg | 3 + .../hero_icons/optimized/24/outline/bolt.svg | 3 + .../optimized/24/outline/book-open.svg | 3 + .../optimized/24/outline/bookmark-slash.svg | 3 + .../optimized/24/outline/bookmark-square.svg | 3 + .../optimized/24/outline/bookmark.svg | 3 + .../optimized/24/outline/briefcase.svg | 3 + .../optimized/24/outline/bug-ant.svg | 3 + .../optimized/24/outline/building-library.svg | 3 + .../24/outline/building-office-2.svg | 3 + .../optimized/24/outline/building-office.svg | 3 + .../24/outline/building-storefront.svg | 3 + .../hero_icons/optimized/24/outline/cake.svg | 3 + .../optimized/24/outline/calculator.svg | 3 + .../optimized/24/outline/calendar-days.svg | 3 + .../optimized/24/outline/calendar.svg | 3 + .../optimized/24/outline/camera.svg | 4 + .../optimized/24/outline/chart-bar-square.svg | 3 + .../optimized/24/outline/chart-bar.svg | 3 + .../optimized/24/outline/chart-pie.svg | 4 + .../chat-bubble-bottom-center-text.svg | 3 + .../24/outline/chat-bubble-bottom-center.svg | 3 + .../24/outline/chat-bubble-left-ellipsis.svg | 3 + .../24/outline/chat-bubble-left-right.svg | 3 + .../optimized/24/outline/chat-bubble-left.svg | 3 + .../chat-bubble-oval-left-ellipsis.svg | 3 + .../24/outline/chat-bubble-oval-left.svg | 3 + .../optimized/24/outline/check-badge.svg | 3 + .../optimized/24/outline/check-circle.svg | 3 + .../hero_icons/optimized/24/outline/check.svg | 3 + .../24/outline/chevron-double-down.svg | 3 + .../24/outline/chevron-double-left.svg | 3 + .../24/outline/chevron-double-right.svg | 3 + .../24/outline/chevron-double-up.svg | 3 + .../optimized/24/outline/chevron-down.svg | 3 + .../optimized/24/outline/chevron-left.svg | 3 + .../optimized/24/outline/chevron-right.svg | 3 + .../optimized/24/outline/chevron-up-down.svg | 3 + .../optimized/24/outline/chevron-up.svg | 3 + .../optimized/24/outline/circle-stack.svg | 3 + .../24/outline/clipboard-document-check.svg | 3 + .../24/outline/clipboard-document-list.svg | 3 + .../24/outline/clipboard-document.svg | 3 + .../optimized/24/outline/clipboard.svg | 3 + .../hero_icons/optimized/24/outline/clock.svg | 3 + .../optimized/24/outline/cloud-arrow-down.svg | 3 + .../optimized/24/outline/cloud-arrow-up.svg | 3 + .../hero_icons/optimized/24/outline/cloud.svg | 3 + .../24/outline/code-bracket-square.svg | 3 + .../optimized/24/outline/code-bracket.svg | 3 + .../optimized/24/outline/cog-6-tooth.svg | 4 + .../optimized/24/outline/cog-8-tooth.svg | 4 + .../hero_icons/optimized/24/outline/cog.svg | 3 + .../optimized/24/outline/command-line.svg | 3 + .../optimized/24/outline/computer-desktop.svg | 3 + .../optimized/24/outline/cpu-chip.svg | 3 + .../optimized/24/outline/credit-card.svg | 3 + .../optimized/24/outline/cube-transparent.svg | 3 + .../hero_icons/optimized/24/outline/cube.svg | 3 + .../24/outline/currency-bangladeshi.svg | 3 + .../optimized/24/outline/currency-dollar.svg | 3 + .../optimized/24/outline/currency-euro.svg | 3 + .../optimized/24/outline/currency-pound.svg | 3 + .../optimized/24/outline/currency-rupee.svg | 3 + .../optimized/24/outline/currency-yen.svg | 3 + .../24/outline/cursor-arrow-rays.svg | 3 + .../24/outline/cursor-arrow-ripple.svg | 3 + .../24/outline/device-phone-mobile.svg | 3 + .../optimized/24/outline/device-tablet.svg | 3 + .../24/outline/document-arrow-down.svg | 3 + .../24/outline/document-arrow-up.svg | 3 + .../24/outline/document-chart-bar.svg | 3 + .../optimized/24/outline/document-check.svg | 3 + .../24/outline/document-duplicate.svg | 3 + .../24/outline/document-magnifying-glass.svg | 3 + .../optimized/24/outline/document-minus.svg | 3 + .../optimized/24/outline/document-plus.svg | 3 + .../optimized/24/outline/document-text.svg | 3 + .../optimized/24/outline/document.svg | 3 + .../24/outline/ellipsis-horizontal-circle.svg | 3 + .../24/outline/ellipsis-horizontal.svg | 3 + .../24/outline/ellipsis-vertical.svg | 3 + .../optimized/24/outline/envelope-open.svg | 3 + .../optimized/24/outline/envelope.svg | 3 + .../24/outline/exclamation-circle.svg | 3 + .../24/outline/exclamation-triangle.svg | 3 + .../optimized/24/outline/eye-dropper.svg | 3 + .../optimized/24/outline/eye-slash.svg | 3 + .../hero_icons/optimized/24/outline/eye.svg | 4 + .../optimized/24/outline/face-frown.svg | 3 + .../optimized/24/outline/face-smile.svg | 3 + .../hero_icons/optimized/24/outline/film.svg | 3 + .../optimized/24/outline/finger-print.svg | 3 + .../hero_icons/optimized/24/outline/fire.svg | 4 + .../hero_icons/optimized/24/outline/flag.svg | 3 + .../24/outline/folder-arrow-down.svg | 3 + .../optimized/24/outline/folder-minus.svg | 3 + .../optimized/24/outline/folder-open.svg | 3 + .../optimized/24/outline/folder-plus.svg | 3 + .../optimized/24/outline/folder.svg | 3 + .../optimized/24/outline/forward.svg | 3 + .../optimized/24/outline/funnel.svg | 3 + .../hero_icons/optimized/24/outline/gif.svg | 3 + .../optimized/24/outline/gift-top.svg | 3 + .../hero_icons/optimized/24/outline/gift.svg | 3 + .../optimized/24/outline/globe-alt.svg | 3 + .../optimized/24/outline/globe-americas.svg | 3 + .../24/outline/globe-asia-australia.svg | 3 + .../24/outline/globe-europe-africa.svg | 3 + .../optimized/24/outline/hand-raised.svg | 3 + .../optimized/24/outline/hand-thumb-down.svg | 3 + .../optimized/24/outline/hand-thumb-up.svg | 3 + .../optimized/24/outline/hashtag.svg | 3 + .../hero_icons/optimized/24/outline/heart.svg | 3 + .../optimized/24/outline/home-modern.svg | 3 + .../hero_icons/optimized/24/outline/home.svg | 3 + .../optimized/24/outline/identification.svg | 3 + .../optimized/24/outline/inbox-arrow-down.svg | 3 + .../optimized/24/outline/inbox-stack.svg | 3 + .../hero_icons/optimized/24/outline/inbox.svg | 3 + .../24/outline/information-circle.svg | 3 + .../hero_icons/optimized/24/outline/key.svg | 3 + .../optimized/24/outline/language.svg | 3 + .../optimized/24/outline/lifebuoy.svg | 3 + .../optimized/24/outline/light-bulb.svg | 3 + .../hero_icons/optimized/24/outline/link.svg | 3 + .../optimized/24/outline/list-bullet.svg | 3 + .../optimized/24/outline/lock-closed.svg | 3 + .../optimized/24/outline/lock-open.svg | 3 + .../24/outline/magnifying-glass-circle.svg | 3 + .../24/outline/magnifying-glass-minus.svg | 3 + .../24/outline/magnifying-glass-plus.svg | 3 + .../optimized/24/outline/magnifying-glass.svg | 3 + .../optimized/24/outline/map-pin.svg | 4 + .../hero_icons/optimized/24/outline/map.svg | 3 + .../optimized/24/outline/megaphone.svg | 3 + .../optimized/24/outline/microphone.svg | 3 + .../optimized/24/outline/minus-circle.svg | 3 + .../optimized/24/outline/minus-small.svg | 3 + .../hero_icons/optimized/24/outline/minus.svg | 3 + .../hero_icons/optimized/24/outline/moon.svg | 3 + .../optimized/24/outline/musical-note.svg | 3 + .../optimized/24/outline/newspaper.svg | 3 + .../optimized/24/outline/no-symbol.svg | 3 + .../optimized/24/outline/paint-brush.svg | 3 + .../optimized/24/outline/paper-airplane.svg | 3 + .../optimized/24/outline/paper-clip.svg | 3 + .../optimized/24/outline/pause-circle.svg | 3 + .../hero_icons/optimized/24/outline/pause.svg | 3 + .../optimized/24/outline/pencil-square.svg | 3 + .../optimized/24/outline/pencil.svg | 3 + .../24/outline/phone-arrow-down-left.svg | 3 + .../24/outline/phone-arrow-up-right.svg | 3 + .../optimized/24/outline/phone-x-mark.svg | 3 + .../hero_icons/optimized/24/outline/phone.svg | 3 + .../hero_icons/optimized/24/outline/photo.svg | 3 + .../optimized/24/outline/play-circle.svg | 4 + .../optimized/24/outline/play-pause.svg | 3 + .../hero_icons/optimized/24/outline/play.svg | 3 + .../optimized/24/outline/plus-circle.svg | 3 + .../optimized/24/outline/plus-small.svg | 3 + .../hero_icons/optimized/24/outline/plus.svg | 3 + .../hero_icons/optimized/24/outline/power.svg | 3 + .../24/outline/presentation-chart-bar.svg | 3 + .../24/outline/presentation-chart-line.svg | 3 + .../optimized/24/outline/printer.svg | 3 + .../optimized/24/outline/puzzle-piece.svg | 3 + .../optimized/24/outline/qr-code.svg | 4 + .../24/outline/question-mark-circle.svg | 3 + .../optimized/24/outline/queue-list.svg | 3 + .../hero_icons/optimized/24/outline/radio.svg | 3 + .../optimized/24/outline/receipt-percent.svg | 3 + .../optimized/24/outline/receipt-refund.svg | 3 + .../optimized/24/outline/rectangle-group.svg | 3 + .../optimized/24/outline/rectangle-stack.svg | 3 + .../optimized/24/outline/rocket-launch.svg | 3 + .../hero_icons/optimized/24/outline/rss.svg | 3 + .../hero_icons/optimized/24/outline/scale.svg | 3 + .../optimized/24/outline/scissors.svg | 3 + .../optimized/24/outline/server-stack.svg | 3 + .../optimized/24/outline/server.svg | 3 + .../hero_icons/optimized/24/outline/share.svg | 3 + .../optimized/24/outline/shield-check.svg | 3 + .../24/outline/shield-exclamation.svg | 3 + .../optimized/24/outline/shopping-bag.svg | 3 + .../optimized/24/outline/shopping-cart.svg | 3 + .../optimized/24/outline/signal-slash.svg | 3 + .../optimized/24/outline/signal.svg | 3 + .../optimized/24/outline/sparkles.svg | 3 + .../optimized/24/outline/speaker-wave.svg | 3 + .../optimized/24/outline/speaker-x-mark.svg | 3 + .../optimized/24/outline/square-2-stack.svg | 3 + .../24/outline/square-3-stack-3d.svg | 3 + .../optimized/24/outline/squares-2x2.svg | 3 + .../optimized/24/outline/squares-plus.svg | 3 + .../hero_icons/optimized/24/outline/star.svg | 3 + .../optimized/24/outline/stop-circle.svg | 4 + .../hero_icons/optimized/24/outline/stop.svg | 3 + .../hero_icons/optimized/24/outline/sun.svg | 3 + .../optimized/24/outline/swatch.svg | 3 + .../optimized/24/outline/table-cells.svg | 3 + .../hero_icons/optimized/24/outline/tag.svg | 4 + .../optimized/24/outline/ticket.svg | 3 + .../hero_icons/optimized/24/outline/trash.svg | 3 + .../optimized/24/outline/trophy.svg | 3 + .../hero_icons/optimized/24/outline/truck.svg | 3 + .../hero_icons/optimized/24/outline/tv.svg | 3 + .../optimized/24/outline/user-circle.svg | 3 + .../optimized/24/outline/user-group.svg | 3 + .../optimized/24/outline/user-minus.svg | 3 + .../optimized/24/outline/user-plus.svg | 3 + .../hero_icons/optimized/24/outline/user.svg | 3 + .../hero_icons/optimized/24/outline/users.svg | 3 + .../optimized/24/outline/variable.svg | 3 + .../24/outline/video-camera-slash.svg | 3 + .../optimized/24/outline/video-camera.svg | 3 + .../optimized/24/outline/view-columns.svg | 3 + .../24/outline/viewfinder-circle.svg | 3 + .../optimized/24/outline/wallet.svg | 3 + .../hero_icons/optimized/24/outline/wifi.svg | 3 + .../optimized/24/outline/window.svg | 3 + .../24/outline/wrench-screwdriver.svg | 3 + .../optimized/24/outline/wrench.svg | 4 + .../optimized/24/outline/x-circle.svg | 3 + .../optimized/24/outline/x-mark.svg | 3 + .../optimized/24/solid/academic-cap.svg | 5 + .../24/solid/adjustments-horizontal.svg | 3 + .../24/solid/adjustments-vertical.svg | 3 + .../24/solid/archive-box-arrow-down.svg | 4 + .../optimized/24/solid/archive-box-x-mark.svg | 4 + .../optimized/24/solid/archive-box.svg | 4 + .../optimized/24/solid/arrow-down-circle.svg | 3 + .../optimized/24/solid/arrow-down-left.svg | 3 + .../24/solid/arrow-down-on-square-stack.svg | 4 + .../24/solid/arrow-down-on-square.svg | 3 + .../optimized/24/solid/arrow-down-right.svg | 3 + .../optimized/24/solid/arrow-down-tray.svg | 3 + .../optimized/24/solid/arrow-down.svg | 3 + .../optimized/24/solid/arrow-left-circle.svg | 3 + .../24/solid/arrow-left-on-rectangle.svg | 3 + .../optimized/24/solid/arrow-left.svg | 3 + .../optimized/24/solid/arrow-long-down.svg | 3 + .../optimized/24/solid/arrow-long-left.svg | 3 + .../optimized/24/solid/arrow-long-right.svg | 3 + .../optimized/24/solid/arrow-long-up.svg | 3 + .../24/solid/arrow-path-rounded-square.svg | 3 + .../optimized/24/solid/arrow-path.svg | 3 + .../optimized/24/solid/arrow-right-circle.svg | 3 + .../24/solid/arrow-right-on-rectangle.svg | 3 + .../optimized/24/solid/arrow-right.svg | 3 + .../optimized/24/solid/arrow-small-down.svg | 3 + .../optimized/24/solid/arrow-small-left.svg | 3 + .../optimized/24/solid/arrow-small-right.svg | 3 + .../optimized/24/solid/arrow-small-up.svg | 3 + .../24/solid/arrow-top-right-on-square.svg | 3 + .../24/solid/arrow-trending-down.svg | 3 + .../optimized/24/solid/arrow-trending-up.svg | 3 + .../optimized/24/solid/arrow-up-circle.svg | 3 + .../optimized/24/solid/arrow-up-left.svg | 3 + .../24/solid/arrow-up-on-square-stack.svg | 4 + .../optimized/24/solid/arrow-up-on-square.svg | 3 + .../optimized/24/solid/arrow-up-right.svg | 3 + .../optimized/24/solid/arrow-up-tray.svg | 3 + .../optimized/24/solid/arrow-up.svg | 3 + .../optimized/24/solid/arrow-uturn-down.svg | 3 + .../optimized/24/solid/arrow-uturn-left.svg | 3 + .../optimized/24/solid/arrow-uturn-right.svg | 3 + .../optimized/24/solid/arrow-uturn-up.svg | 3 + .../optimized/24/solid/arrows-pointing-in.svg | 3 + .../24/solid/arrows-pointing-out.svg | 3 + .../optimized/24/solid/arrows-right-left.svg | 3 + .../optimized/24/solid/arrows-up-down.svg | 3 + .../optimized/24/solid/at-symbol.svg | 3 + .../optimized/24/solid/backspace.svg | 3 + .../optimized/24/solid/backward.svg | 3 + .../optimized/24/solid/banknotes.svg | 5 + .../hero_icons/optimized/24/solid/bars-2.svg | 3 + .../optimized/24/solid/bars-3-bottom-left.svg | 3 + .../24/solid/bars-3-bottom-right.svg | 3 + .../optimized/24/solid/bars-3-center-left.svg | 3 + .../hero_icons/optimized/24/solid/bars-3.svg | 3 + .../hero_icons/optimized/24/solid/bars-4.svg | 3 + .../optimized/24/solid/bars-arrow-down.svg | 3 + .../optimized/24/solid/bars-arrow-up.svg | 3 + .../optimized/24/solid/battery-0.svg | 3 + .../optimized/24/solid/battery-100.svg | 3 + .../optimized/24/solid/battery-50.svg | 4 + .../hero_icons/optimized/24/solid/beaker.svg | 3 + .../optimized/24/solid/bell-alert.svg | 4 + .../optimized/24/solid/bell-slash.svg | 4 + .../optimized/24/solid/bell-snooze.svg | 3 + .../hero_icons/optimized/24/solid/bell.svg | 3 + .../optimized/24/solid/bolt-slash.svg | 3 + .../hero_icons/optimized/24/solid/bolt.svg | 3 + .../optimized/24/solid/book-open.svg | 3 + .../optimized/24/solid/bookmark-slash.svg | 3 + .../optimized/24/solid/bookmark-square.svg | 3 + .../optimized/24/solid/bookmark.svg | 3 + .../optimized/24/solid/briefcase.svg | 4 + .../hero_icons/optimized/24/solid/bug-ant.svg | 3 + .../optimized/24/solid/building-library.svg | 5 + .../optimized/24/solid/building-office-2.svg | 3 + .../optimized/24/solid/building-office.svg | 3 + .../24/solid/building-storefront.svg | 4 + .../hero_icons/optimized/24/solid/cake.svg | 3 + .../optimized/24/solid/calculator.svg | 3 + .../optimized/24/solid/calendar-days.svg | 4 + .../optimized/24/solid/calendar.svg | 3 + .../hero_icons/optimized/24/solid/camera.svg | 4 + .../optimized/24/solid/chart-bar-square.svg | 3 + .../optimized/24/solid/chart-bar.svg | 3 + .../optimized/24/solid/chart-pie.svg | 4 + .../solid/chat-bubble-bottom-center-text.svg | 3 + .../24/solid/chat-bubble-bottom-center.svg | 3 + .../24/solid/chat-bubble-left-ellipsis.svg | 3 + .../24/solid/chat-bubble-left-right.svg | 4 + .../optimized/24/solid/chat-bubble-left.svg | 3 + .../solid/chat-bubble-oval-left-ellipsis.svg | 3 + .../24/solid/chat-bubble-oval-left.svg | 3 + .../optimized/24/solid/check-badge.svg | 3 + .../optimized/24/solid/check-circle.svg | 3 + .../hero_icons/optimized/24/solid/check.svg | 3 + .../24/solid/chevron-double-down.svg | 3 + .../24/solid/chevron-double-left.svg | 3 + .../24/solid/chevron-double-right.svg | 3 + .../optimized/24/solid/chevron-double-up.svg | 3 + .../optimized/24/solid/chevron-down.svg | 3 + .../optimized/24/solid/chevron-left.svg | 3 + .../optimized/24/solid/chevron-right.svg | 3 + .../optimized/24/solid/chevron-up-down.svg | 3 + .../optimized/24/solid/chevron-up.svg | 3 + .../optimized/24/solid/circle-stack.svg | 6 + .../24/solid/clipboard-document-check.svg | 4 + .../24/solid/clipboard-document-list.svg | 4 + .../optimized/24/solid/clipboard-document.svg | 5 + .../optimized/24/solid/clipboard.svg | 3 + .../hero_icons/optimized/24/solid/clock.svg | 3 + .../optimized/24/solid/cloud-arrow-down.svg | 3 + .../optimized/24/solid/cloud-arrow-up.svg | 3 + .../hero_icons/optimized/24/solid/cloud.svg | 3 + .../24/solid/code-bracket-square.svg | 3 + .../optimized/24/solid/code-bracket.svg | 3 + .../optimized/24/solid/cog-6-tooth.svg | 3 + .../optimized/24/solid/cog-8-tooth.svg | 3 + .../hero_icons/optimized/24/solid/cog.svg | 4 + .../optimized/24/solid/command-line.svg | 3 + .../optimized/24/solid/computer-desktop.svg | 3 + .../optimized/24/solid/cpu-chip.svg | 4 + .../optimized/24/solid/credit-card.svg | 4 + .../optimized/24/solid/cube-transparent.svg | 3 + .../hero_icons/optimized/24/solid/cube.svg | 3 + .../24/solid/currency-bangladeshi.svg | 3 + .../optimized/24/solid/currency-dollar.svg | 4 + .../optimized/24/solid/currency-euro.svg | 3 + .../optimized/24/solid/currency-pound.svg | 3 + .../optimized/24/solid/currency-rupee.svg | 3 + .../optimized/24/solid/currency-yen.svg | 3 + .../optimized/24/solid/cursor-arrow-rays.svg | 3 + .../24/solid/cursor-arrow-ripple.svg | 3 + .../24/solid/device-phone-mobile.svg | 4 + .../optimized/24/solid/device-tablet.svg | 4 + .../24/solid/document-arrow-down.svg | 4 + .../optimized/24/solid/document-arrow-up.svg | 4 + .../optimized/24/solid/document-chart-bar.svg | 4 + .../optimized/24/solid/document-check.svg | 4 + .../optimized/24/solid/document-duplicate.svg | 4 + .../24/solid/document-magnifying-glass.svg | 5 + .../optimized/24/solid/document-minus.svg | 4 + .../optimized/24/solid/document-plus.svg | 4 + .../optimized/24/solid/document-text.svg | 4 + .../optimized/24/solid/document.svg | 4 + .../24/solid/ellipsis-horizontal-circle.svg | 3 + .../24/solid/ellipsis-horizontal.svg | 3 + .../optimized/24/solid/ellipsis-vertical.svg | 3 + .../optimized/24/solid/envelope-open.svg | 4 + .../optimized/24/solid/envelope.svg | 4 + .../optimized/24/solid/exclamation-circle.svg | 3 + .../24/solid/exclamation-triangle.svg | 3 + .../optimized/24/solid/eye-dropper.svg | 3 + .../optimized/24/solid/eye-slash.svg | 5 + .../hero_icons/optimized/24/solid/eye.svg | 4 + .../optimized/24/solid/face-frown.svg | 3 + .../optimized/24/solid/face-smile.svg | 3 + .../hero_icons/optimized/24/solid/film.svg | 3 + .../optimized/24/solid/finger-print.svg | 3 + .../hero_icons/optimized/24/solid/fire.svg | 3 + .../hero_icons/optimized/24/solid/flag.svg | 3 + .../optimized/24/solid/folder-arrow-down.svg | 3 + .../optimized/24/solid/folder-minus.svg | 3 + .../optimized/24/solid/folder-open.svg | 3 + .../optimized/24/solid/folder-plus.svg | 3 + .../hero_icons/optimized/24/solid/folder.svg | 3 + .../hero_icons/optimized/24/solid/forward.svg | 3 + .../hero_icons/optimized/24/solid/funnel.svg | 3 + .../hero_icons/optimized/24/solid/gif.svg | 3 + .../optimized/24/solid/gift-top.svg | 4 + .../hero_icons/optimized/24/solid/gift.svg | 3 + .../optimized/24/solid/globe-alt.svg | 3 + .../optimized/24/solid/globe-americas.svg | 3 + .../24/solid/globe-asia-australia.svg | 4 + .../24/solid/globe-europe-africa.svg | 3 + .../optimized/24/solid/hand-raised.svg | 3 + .../optimized/24/solid/hand-thumb-down.svg | 3 + .../optimized/24/solid/hand-thumb-up.svg | 3 + .../hero_icons/optimized/24/solid/hashtag.svg | 3 + .../hero_icons/optimized/24/solid/heart.svg | 3 + .../optimized/24/solid/home-modern.svg | 4 + .../hero_icons/optimized/24/solid/home.svg | 4 + .../optimized/24/solid/identification.svg | 3 + .../optimized/24/solid/inbox-arrow-down.svg | 4 + .../optimized/24/solid/inbox-stack.svg | 4 + .../hero_icons/optimized/24/solid/inbox.svg | 3 + .../optimized/24/solid/information-circle.svg | 3 + .../hero_icons/optimized/24/solid/key.svg | 3 + .../optimized/24/solid/language.svg | 3 + .../optimized/24/solid/lifebuoy.svg | 3 + .../optimized/24/solid/light-bulb.svg | 4 + .../hero_icons/optimized/24/solid/link.svg | 3 + .../optimized/24/solid/list-bullet.svg | 3 + .../optimized/24/solid/lock-closed.svg | 3 + .../optimized/24/solid/lock-open.svg | 3 + .../24/solid/magnifying-glass-circle.svg | 4 + .../24/solid/magnifying-glass-minus.svg | 3 + .../24/solid/magnifying-glass-plus.svg | 3 + .../optimized/24/solid/magnifying-glass.svg | 3 + .../hero_icons/optimized/24/solid/map-pin.svg | 3 + .../hero_icons/optimized/24/solid/map.svg | 3 + .../optimized/24/solid/megaphone.svg | 3 + .../optimized/24/solid/microphone.svg | 4 + .../optimized/24/solid/minus-circle.svg | 3 + .../optimized/24/solid/minus-small.svg | 3 + .../hero_icons/optimized/24/solid/minus.svg | 3 + .../hero_icons/optimized/24/solid/moon.svg | 3 + .../optimized/24/solid/musical-note.svg | 3 + .../optimized/24/solid/newspaper.svg | 4 + .../optimized/24/solid/no-symbol.svg | 3 + .../optimized/24/solid/paint-brush.svg | 3 + .../optimized/24/solid/paper-airplane.svg | 3 + .../optimized/24/solid/paper-clip.svg | 3 + .../optimized/24/solid/pause-circle.svg | 3 + .../hero_icons/optimized/24/solid/pause.svg | 3 + .../optimized/24/solid/pencil-square.svg | 4 + .../hero_icons/optimized/24/solid/pencil.svg | 3 + .../24/solid/phone-arrow-down-left.svg | 4 + .../24/solid/phone-arrow-up-right.svg | 4 + .../optimized/24/solid/phone-x-mark.svg | 3 + .../hero_icons/optimized/24/solid/phone.svg | 3 + .../hero_icons/optimized/24/solid/photo.svg | 3 + .../optimized/24/solid/play-circle.svg | 3 + .../optimized/24/solid/play-pause.svg | 3 + .../hero_icons/optimized/24/solid/play.svg | 3 + .../optimized/24/solid/plus-circle.svg | 3 + .../optimized/24/solid/plus-small.svg | 3 + .../hero_icons/optimized/24/solid/plus.svg | 3 + .../hero_icons/optimized/24/solid/power.svg | 3 + .../24/solid/presentation-chart-bar.svg | 3 + .../24/solid/presentation-chart-line.svg | 3 + .../hero_icons/optimized/24/solid/printer.svg | 3 + .../optimized/24/solid/puzzle-piece.svg | 3 + .../hero_icons/optimized/24/solid/qr-code.svg | 3 + .../24/solid/question-mark-circle.svg | 3 + .../optimized/24/solid/queue-list.svg | 3 + .../hero_icons/optimized/24/solid/radio.svg | 3 + .../optimized/24/solid/receipt-percent.svg | 3 + .../optimized/24/solid/receipt-refund.svg | 3 + .../optimized/24/solid/rectangle-group.svg | 3 + .../optimized/24/solid/rectangle-stack.svg | 3 + .../optimized/24/solid/rocket-launch.svg | 4 + .../hero_icons/optimized/24/solid/rss.svg | 3 + .../hero_icons/optimized/24/solid/scale.svg | 3 + .../optimized/24/solid/scissors.svg | 4 + .../optimized/24/solid/server-stack.svg | 4 + .../hero_icons/optimized/24/solid/server.svg | 4 + .../hero_icons/optimized/24/solid/share.svg | 3 + .../optimized/24/solid/shield-check.svg | 3 + .../optimized/24/solid/shield-exclamation.svg | 3 + .../optimized/24/solid/shopping-bag.svg | 3 + .../optimized/24/solid/shopping-cart.svg | 3 + .../optimized/24/solid/signal-slash.svg | 3 + .../hero_icons/optimized/24/solid/signal.svg | 3 + .../optimized/24/solid/sparkles.svg | 3 + .../optimized/24/solid/speaker-wave.svg | 4 + .../optimized/24/solid/speaker-x-mark.svg | 3 + .../optimized/24/solid/square-2-stack.svg | 4 + .../optimized/24/solid/square-3-stack-3d.svg | 5 + .../optimized/24/solid/squares-2x2.svg | 3 + .../optimized/24/solid/squares-plus.svg | 3 + .../hero_icons/optimized/24/solid/star.svg | 3 + .../optimized/24/solid/stop-circle.svg | 3 + .../hero_icons/optimized/24/solid/stop.svg | 3 + .../hero_icons/optimized/24/solid/sun.svg | 3 + .../hero_icons/optimized/24/solid/swatch.svg | 4 + .../optimized/24/solid/table-cells.svg | 3 + .../hero_icons/optimized/24/solid/tag.svg | 3 + .../hero_icons/optimized/24/solid/ticket.svg | 3 + .../hero_icons/optimized/24/solid/trash.svg | 3 + .../hero_icons/optimized/24/solid/trophy.svg | 3 + .../hero_icons/optimized/24/solid/truck.svg | 5 + .../priv/hero_icons/optimized/24/solid/tv.svg | 4 + .../optimized/24/solid/user-circle.svg | 3 + .../optimized/24/solid/user-group.svg | 4 + .../optimized/24/solid/user-minus.svg | 3 + .../optimized/24/solid/user-plus.svg | 3 + .../hero_icons/optimized/24/solid/user.svg | 3 + .../hero_icons/optimized/24/solid/users.svg | 3 + .../optimized/24/solid/variable.svg | 3 + .../optimized/24/solid/video-camera-slash.svg | 3 + .../optimized/24/solid/video-camera.svg | 3 + .../optimized/24/solid/view-columns.svg | 3 + .../optimized/24/solid/viewfinder-circle.svg | 3 + .../hero_icons/optimized/24/solid/wallet.svg | 3 + .../hero_icons/optimized/24/solid/wifi.svg | 3 + .../hero_icons/optimized/24/solid/window.svg | 3 + .../optimized/24/solid/wrench-screwdriver.svg | 5 + .../hero_icons/optimized/24/solid/wrench.svg | 3 + .../optimized/24/solid/x-circle.svg | 3 + .../hero_icons/optimized/24/solid/x-mark.svg | 3 + server/priv/repo/migrations/.formatter.exs | 4 + server/priv/repo/seeds.exs | 11 + server/priv/static/favicon.ico | Bin 0 -> 1258 bytes server/priv/static/robots.txt | 5 + .../controllers/error_html_test.exs | 14 + .../controllers/error_json_test.exs | 12 + .../controllers/page_controller_test.exs | 8 + server/test/support/conn_case.ex | 38 + server/test/support/data_case.ex | 58 ++ server/test/test_helper.exs | 2 + 930 files changed, 5477 insertions(+), 6 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 cpp/main.cpp create mode 100644 default.nix create mode 100644 qml/main.qml create mode 100644 qml/qml.qrc create mode 100644 server/.formatter.exs create mode 100644 server/.gitignore create mode 100644 server/README.md create mode 100644 server/assets/css/app.css create mode 100644 server/assets/js/app.js create mode 100644 server/assets/tailwind.config.js create mode 100644 server/assets/vendor/topbar.js create mode 100644 server/config/config.exs create mode 100644 server/config/dev.exs create mode 100644 server/config/prod.exs create mode 100644 server/config/runtime.exs create mode 100644 server/config/test.exs create mode 100644 server/lib/server.ex create mode 100644 server/lib/server/application.ex create mode 100644 server/lib/server/mailer.ex create mode 100644 server/lib/server/repo.ex create mode 100644 server/lib/server_web.ex create mode 100644 server/lib/server_web/components/core_components.ex create mode 100644 server/lib/server_web/components/layouts.ex create mode 100644 server/lib/server_web/components/layouts/app.html.heex create mode 100644 server/lib/server_web/components/layouts/root.html.heex create mode 100644 server/lib/server_web/controllers/error_html.ex create mode 100644 server/lib/server_web/controllers/error_json.ex create mode 100644 server/lib/server_web/controllers/page_controller.ex create mode 100644 server/lib/server_web/controllers/page_html.ex create mode 100644 server/lib/server_web/controllers/page_html/home.html.heex create mode 100644 server/lib/server_web/endpoint.ex create mode 100644 server/lib/server_web/gettext.ex create mode 100644 server/lib/server_web/router.ex create mode 100644 server/lib/server_web/telemetry.ex create mode 100644 server/mix.exs create mode 100644 server/mix.lock create mode 100644 server/priv/gettext/en/LC_MESSAGES/errors.po create mode 100644 server/priv/gettext/errors.pot create mode 100644 server/priv/hero_icons/LICENSE.md create mode 100644 server/priv/hero_icons/UPGRADE.md create mode 100644 server/priv/hero_icons/optimized/20/solid/academic-cap.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/adjustments-horizontal.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/adjustments-vertical.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/archive-box-arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/archive-box-x-mark.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/archive-box.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-down-circle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-down-left.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-down-on-square-stack.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-down-on-square.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-down-right.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-down-tray.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-left-circle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-left-on-rectangle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-left.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-long-down.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-long-left.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-long-right.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-long-up.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-path-rounded-square.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-path.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-right-circle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-right-on-rectangle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-right.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-small-down.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-small-left.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-small-right.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-small-up.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-top-right-on-square.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-trending-down.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-trending-up.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-up-circle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-up-left.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-up-on-square-stack.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-up-on-square.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-up-right.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-up-tray.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-up.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-uturn-down.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-uturn-left.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-uturn-right.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrow-uturn-up.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrows-pointing-in.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrows-pointing-out.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrows-right-left.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/arrows-up-down.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/at-symbol.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/backspace.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/backward.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/banknotes.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/bars-2.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/bars-3-bottom-left.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/bars-3-bottom-right.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/bars-3-center-left.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/bars-3.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/bars-4.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/bars-arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/bars-arrow-up.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/battery-0.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/battery-100.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/battery-50.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/beaker.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/bell-alert.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/bell-slash.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/bell-snooze.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/bell.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/bolt-slash.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/bolt.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/book-open.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/bookmark-slash.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/bookmark-square.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/bookmark.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/briefcase.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/bug-ant.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/building-library.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/building-office-2.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/building-office.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/building-storefront.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/cake.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/calculator.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/calendar-days.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/calendar.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/camera.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/chart-bar-square.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/chart-bar.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/chart-pie.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/chat-bubble-bottom-center-text.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/chat-bubble-bottom-center.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/chat-bubble-left-ellipsis.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/chat-bubble-left-right.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/chat-bubble-left.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/chat-bubble-oval-left-ellipsis.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/chat-bubble-oval-left.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/check-badge.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/check-circle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/check.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/chevron-double-down.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/chevron-double-left.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/chevron-double-right.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/chevron-double-up.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/chevron-down.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/chevron-left.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/chevron-right.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/chevron-up-down.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/chevron-up.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/circle-stack.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/clipboard-document-check.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/clipboard-document-list.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/clipboard-document.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/clipboard.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/clock.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/cloud-arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/cloud-arrow-up.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/cloud.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/code-bracket-square.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/code-bracket.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/cog-6-tooth.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/cog-8-tooth.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/cog.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/command-line.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/computer-desktop.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/cpu-chip.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/credit-card.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/cube-transparent.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/cube.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/currency-bangladeshi.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/currency-dollar.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/currency-euro.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/currency-pound.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/currency-rupee.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/currency-yen.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/cursor-arrow-rays.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/cursor-arrow-ripple.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/device-phone-mobile.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/device-tablet.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/document-arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/document-arrow-up.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/document-chart-bar.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/document-check.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/document-duplicate.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/document-magnifying-glass.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/document-minus.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/document-plus.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/document-text.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/document.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/ellipsis-horizontal-circle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/ellipsis-horizontal.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/ellipsis-vertical.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/envelope-open.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/envelope.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/exclamation-circle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/exclamation-triangle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/eye-dropper.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/eye-slash.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/eye.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/face-frown.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/face-smile.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/film.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/finger-print.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/fire.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/flag.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/folder-arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/folder-minus.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/folder-open.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/folder-plus.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/folder.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/forward.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/funnel.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/gif.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/gift-top.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/gift.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/globe-alt.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/globe-americas.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/globe-asia-australia.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/globe-europe-africa.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/hand-raised.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/hand-thumb-down.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/hand-thumb-up.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/hashtag.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/heart.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/home-modern.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/home.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/identification.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/inbox-arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/inbox-stack.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/inbox.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/information-circle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/key.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/language.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/lifebuoy.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/light-bulb.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/link.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/list-bullet.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/lock-closed.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/lock-open.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/magnifying-glass-circle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/magnifying-glass-minus.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/magnifying-glass-plus.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/magnifying-glass.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/map-pin.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/map.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/megaphone.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/microphone.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/minus-circle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/minus-small.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/minus.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/moon.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/musical-note.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/newspaper.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/no-symbol.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/paint-brush.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/paper-airplane.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/paper-clip.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/pause-circle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/pause.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/pencil-square.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/pencil.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/phone-arrow-down-left.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/phone-arrow-up-right.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/phone-x-mark.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/phone.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/photo.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/play-circle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/play-pause.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/play.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/plus-circle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/plus-small.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/plus.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/power.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/presentation-chart-bar.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/presentation-chart-line.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/printer.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/puzzle-piece.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/qr-code.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/question-mark-circle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/queue-list.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/radio.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/receipt-percent.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/receipt-refund.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/rectangle-group.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/rectangle-stack.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/rocket-launch.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/rss.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/scale.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/scissors.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/server-stack.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/server.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/share.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/shield-check.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/shield-exclamation.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/shopping-bag.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/shopping-cart.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/signal-slash.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/signal.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/sparkles.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/speaker-wave.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/speaker-x-mark.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/square-2-stack.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/square-3-stack-3d.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/squares-2x2.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/squares-plus.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/star.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/stop-circle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/stop.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/sun.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/swatch.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/table-cells.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/tag.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/ticket.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/trash.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/trophy.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/truck.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/tv.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/user-circle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/user-group.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/user-minus.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/user-plus.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/user.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/users.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/variable.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/video-camera-slash.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/video-camera.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/view-columns.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/viewfinder-circle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/wallet.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/wifi.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/window.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/wrench-screwdriver.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/wrench.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/x-circle.svg create mode 100644 server/priv/hero_icons/optimized/20/solid/x-mark.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/academic-cap.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/adjustments-horizontal.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/adjustments-vertical.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/archive-box-arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/archive-box-x-mark.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/archive-box.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-down-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-down-left.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-down-on-square-stack.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-down-on-square.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-down-right.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-down-tray.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-left-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-left-on-rectangle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-left.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-long-down.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-long-left.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-long-right.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-long-up.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-path-rounded-square.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-path.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-right-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-right-on-rectangle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-right.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-small-down.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-small-left.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-small-right.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-small-up.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-top-right-on-square.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-trending-down.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-trending-up.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-up-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-up-left.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-up-on-square-stack.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-up-on-square.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-up-right.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-up-tray.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-up.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-uturn-down.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-uturn-left.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-uturn-right.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrow-uturn-up.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrows-pointing-in.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrows-pointing-out.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrows-right-left.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/arrows-up-down.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/at-symbol.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/backspace.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/backward.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/banknotes.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/bars-2.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/bars-3-bottom-left.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/bars-3-bottom-right.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/bars-3-center-left.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/bars-3.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/bars-4.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/bars-arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/bars-arrow-up.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/battery-0.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/battery-100.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/battery-50.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/beaker.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/bell-alert.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/bell-slash.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/bell-snooze.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/bell.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/bolt-slash.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/bolt.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/book-open.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/bookmark-slash.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/bookmark-square.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/bookmark.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/briefcase.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/bug-ant.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/building-library.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/building-office-2.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/building-office.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/building-storefront.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/cake.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/calculator.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/calendar-days.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/calendar.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/camera.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/chart-bar-square.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/chart-bar.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/chart-pie.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/chat-bubble-bottom-center-text.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/chat-bubble-bottom-center.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/chat-bubble-left-ellipsis.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/chat-bubble-left-right.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/chat-bubble-left.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/chat-bubble-oval-left-ellipsis.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/chat-bubble-oval-left.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/check-badge.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/check-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/check.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/chevron-double-down.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/chevron-double-left.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/chevron-double-right.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/chevron-double-up.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/chevron-down.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/chevron-left.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/chevron-right.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/chevron-up-down.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/chevron-up.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/circle-stack.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/clipboard-document-check.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/clipboard-document-list.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/clipboard-document.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/clipboard.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/clock.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/cloud-arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/cloud-arrow-up.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/cloud.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/code-bracket-square.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/code-bracket.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/cog-6-tooth.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/cog-8-tooth.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/cog.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/command-line.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/computer-desktop.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/cpu-chip.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/credit-card.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/cube-transparent.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/cube.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/currency-bangladeshi.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/currency-dollar.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/currency-euro.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/currency-pound.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/currency-rupee.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/currency-yen.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/cursor-arrow-rays.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/cursor-arrow-ripple.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/device-phone-mobile.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/device-tablet.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/document-arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/document-arrow-up.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/document-chart-bar.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/document-check.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/document-duplicate.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/document-magnifying-glass.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/document-minus.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/document-plus.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/document-text.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/document.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/ellipsis-horizontal-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/ellipsis-horizontal.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/ellipsis-vertical.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/envelope-open.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/envelope.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/exclamation-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/exclamation-triangle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/eye-dropper.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/eye-slash.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/eye.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/face-frown.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/face-smile.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/film.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/finger-print.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/fire.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/flag.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/folder-arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/folder-minus.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/folder-open.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/folder-plus.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/folder.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/forward.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/funnel.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/gif.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/gift-top.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/gift.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/globe-alt.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/globe-americas.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/globe-asia-australia.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/globe-europe-africa.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/hand-raised.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/hand-thumb-down.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/hand-thumb-up.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/hashtag.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/heart.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/home-modern.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/home.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/identification.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/inbox-arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/inbox-stack.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/inbox.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/information-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/key.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/language.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/lifebuoy.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/light-bulb.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/link.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/list-bullet.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/lock-closed.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/lock-open.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/magnifying-glass-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/magnifying-glass-minus.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/magnifying-glass-plus.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/magnifying-glass.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/map-pin.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/map.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/megaphone.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/microphone.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/minus-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/minus-small.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/minus.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/moon.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/musical-note.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/newspaper.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/no-symbol.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/paint-brush.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/paper-airplane.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/paper-clip.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/pause-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/pause.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/pencil-square.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/pencil.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/phone-arrow-down-left.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/phone-arrow-up-right.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/phone-x-mark.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/phone.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/photo.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/play-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/play-pause.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/play.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/plus-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/plus-small.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/plus.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/power.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/presentation-chart-bar.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/presentation-chart-line.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/printer.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/puzzle-piece.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/qr-code.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/question-mark-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/queue-list.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/radio.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/receipt-percent.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/receipt-refund.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/rectangle-group.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/rectangle-stack.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/rocket-launch.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/rss.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/scale.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/scissors.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/server-stack.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/server.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/share.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/shield-check.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/shield-exclamation.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/shopping-bag.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/shopping-cart.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/signal-slash.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/signal.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/sparkles.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/speaker-wave.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/speaker-x-mark.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/square-2-stack.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/square-3-stack-3d.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/squares-2x2.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/squares-plus.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/star.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/stop-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/stop.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/sun.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/swatch.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/table-cells.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/tag.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/ticket.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/trash.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/trophy.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/truck.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/tv.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/user-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/user-group.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/user-minus.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/user-plus.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/user.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/users.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/variable.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/video-camera-slash.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/video-camera.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/view-columns.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/viewfinder-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/wallet.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/wifi.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/window.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/wrench-screwdriver.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/wrench.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/x-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/outline/x-mark.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/academic-cap.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/adjustments-horizontal.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/adjustments-vertical.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/archive-box-arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/archive-box-x-mark.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/archive-box.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-down-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-down-left.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-down-on-square-stack.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-down-on-square.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-down-right.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-down-tray.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-left-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-left-on-rectangle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-left.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-long-down.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-long-left.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-long-right.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-long-up.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-path-rounded-square.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-path.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-right-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-right-on-rectangle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-right.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-small-down.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-small-left.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-small-right.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-small-up.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-top-right-on-square.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-trending-down.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-trending-up.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-up-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-up-left.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-up-on-square-stack.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-up-on-square.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-up-right.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-up-tray.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-up.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-uturn-down.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-uturn-left.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-uturn-right.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrow-uturn-up.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrows-pointing-in.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrows-pointing-out.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrows-right-left.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/arrows-up-down.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/at-symbol.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/backspace.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/backward.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/banknotes.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/bars-2.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/bars-3-bottom-left.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/bars-3-bottom-right.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/bars-3-center-left.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/bars-3.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/bars-4.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/bars-arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/bars-arrow-up.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/battery-0.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/battery-100.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/battery-50.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/beaker.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/bell-alert.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/bell-slash.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/bell-snooze.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/bell.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/bolt-slash.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/bolt.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/book-open.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/bookmark-slash.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/bookmark-square.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/bookmark.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/briefcase.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/bug-ant.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/building-library.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/building-office-2.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/building-office.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/building-storefront.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/cake.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/calculator.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/calendar-days.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/calendar.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/camera.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/chart-bar-square.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/chart-bar.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/chart-pie.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/chat-bubble-bottom-center-text.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/chat-bubble-bottom-center.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/chat-bubble-left-ellipsis.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/chat-bubble-left-right.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/chat-bubble-left.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/chat-bubble-oval-left-ellipsis.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/chat-bubble-oval-left.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/check-badge.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/check-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/check.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/chevron-double-down.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/chevron-double-left.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/chevron-double-right.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/chevron-double-up.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/chevron-down.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/chevron-left.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/chevron-right.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/chevron-up-down.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/chevron-up.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/circle-stack.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/clipboard-document-check.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/clipboard-document-list.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/clipboard-document.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/clipboard.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/clock.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/cloud-arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/cloud-arrow-up.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/cloud.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/code-bracket-square.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/code-bracket.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/cog-6-tooth.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/cog-8-tooth.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/cog.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/command-line.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/computer-desktop.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/cpu-chip.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/credit-card.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/cube-transparent.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/cube.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/currency-bangladeshi.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/currency-dollar.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/currency-euro.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/currency-pound.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/currency-rupee.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/currency-yen.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/cursor-arrow-rays.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/cursor-arrow-ripple.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/device-phone-mobile.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/device-tablet.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/document-arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/document-arrow-up.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/document-chart-bar.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/document-check.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/document-duplicate.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/document-magnifying-glass.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/document-minus.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/document-plus.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/document-text.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/document.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/ellipsis-horizontal-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/ellipsis-horizontal.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/ellipsis-vertical.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/envelope-open.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/envelope.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/exclamation-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/exclamation-triangle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/eye-dropper.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/eye-slash.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/eye.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/face-frown.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/face-smile.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/film.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/finger-print.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/fire.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/flag.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/folder-arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/folder-minus.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/folder-open.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/folder-plus.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/folder.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/forward.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/funnel.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/gif.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/gift-top.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/gift.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/globe-alt.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/globe-americas.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/globe-asia-australia.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/globe-europe-africa.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/hand-raised.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/hand-thumb-down.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/hand-thumb-up.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/hashtag.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/heart.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/home-modern.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/home.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/identification.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/inbox-arrow-down.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/inbox-stack.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/inbox.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/information-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/key.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/language.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/lifebuoy.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/light-bulb.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/link.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/list-bullet.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/lock-closed.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/lock-open.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/magnifying-glass-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/magnifying-glass-minus.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/magnifying-glass-plus.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/magnifying-glass.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/map-pin.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/map.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/megaphone.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/microphone.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/minus-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/minus-small.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/minus.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/moon.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/musical-note.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/newspaper.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/no-symbol.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/paint-brush.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/paper-airplane.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/paper-clip.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/pause-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/pause.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/pencil-square.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/pencil.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/phone-arrow-down-left.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/phone-arrow-up-right.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/phone-x-mark.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/phone.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/photo.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/play-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/play-pause.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/play.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/plus-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/plus-small.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/plus.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/power.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/presentation-chart-bar.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/presentation-chart-line.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/printer.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/puzzle-piece.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/qr-code.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/question-mark-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/queue-list.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/radio.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/receipt-percent.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/receipt-refund.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/rectangle-group.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/rectangle-stack.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/rocket-launch.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/rss.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/scale.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/scissors.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/server-stack.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/server.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/share.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/shield-check.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/shield-exclamation.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/shopping-bag.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/shopping-cart.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/signal-slash.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/signal.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/sparkles.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/speaker-wave.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/speaker-x-mark.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/square-2-stack.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/square-3-stack-3d.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/squares-2x2.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/squares-plus.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/star.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/stop-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/stop.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/sun.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/swatch.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/table-cells.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/tag.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/ticket.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/trash.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/trophy.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/truck.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/tv.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/user-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/user-group.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/user-minus.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/user-plus.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/user.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/users.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/variable.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/video-camera-slash.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/video-camera.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/view-columns.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/viewfinder-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/wallet.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/wifi.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/window.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/wrench-screwdriver.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/wrench.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/x-circle.svg create mode 100644 server/priv/hero_icons/optimized/24/solid/x-mark.svg create mode 100644 server/priv/repo/migrations/.formatter.exs create mode 100644 server/priv/repo/seeds.exs create mode 100644 server/priv/static/favicon.ico create mode 100644 server/priv/static/robots.txt create mode 100644 server/test/server_web/controllers/error_html_test.exs create mode 100644 server/test/server_web/controllers/error_json_test.exs create mode 100644 server/test/server_web/controllers/page_controller_test.exs create mode 100644 server/test/support/conn_case.ex create mode 100644 server/test/support/data_case.ex create mode 100644 server/test/test_helper.exs diff --git a/.gitignore b/.gitignore index 75e92a9..1986484 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ target .direnv +/build diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..a44aeb1 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.24) + +set(APP_NAME cordial) +project(cordial) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +add_executable(${APP_NAME} cpp/main.cpp qml/qml.qrc) + +find_package(Qt5 5.15 COMPONENTS Core Gui Qml QuickControls2 QmlImportScanner REQUIRED) +# find_package(Qt5 COMPONENTS QuickTest Test REQUIRED) diff --git a/cpp/main.cpp b/cpp/main.cpp new file mode 100644 index 0000000..b2f9976 --- /dev/null +++ b/cpp/main.cpp @@ -0,0 +1,2 @@ +int main() { +} diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..d6cc5c3 --- /dev/null +++ b/default.nix @@ -0,0 +1,9 @@ +{ stdenv, cmake, qt6 }: + +stdenv.mkDerivation { + name = "cordial"; + src = ./.; + + buildInputs = [ qt6.full ]; + nativeBuildInputs = [ ]; +} diff --git a/flake.lock b/flake.lock index 75503b6..fa3f986 100644 --- a/flake.lock +++ b/flake.lock @@ -51,16 +51,17 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1663551060, - "narHash": "sha256-e2SR4cVx9p7aW/XnVsGsWZBplApA9ZJUjc0fejJhnYo=", + "lastModified": 1679034857, + "narHash": "sha256-sAQuKrESXfKpoOAEpkjDwRzlQHwcJYXh4uh74pkNvUY=", "owner": "nixos", "repo": "nixpkgs", - "rev": "8a5b9ee7b7a2b38267c9481f5c629c015108ab0d", + "rev": "f6e067692dd122e3d4481b34c9de7f0d4c235141", "type": "github" }, "original": { - "id": "nixpkgs", - "type": "indirect" + "owner": "nixos", + "repo": "nixpkgs", + "type": "github" } }, "root": { diff --git a/flake.nix b/flake.nix index 4ad1a69..2980549 100644 --- a/flake.nix +++ b/flake.nix @@ -1,5 +1,8 @@ { - inputs = { fenix.url = "github:nix-community/fenix"; }; + inputs = { + nixpkgs.url = "github:nixos/nixpkgs"; + fenix.url = "github:nix-community/fenix"; + }; outputs = { self, nixpkgs, flake-utils, fenix }: flake-utils.lib.eachDefaultSystem (system: @@ -10,9 +13,19 @@ }; toolchain = pkgs.fenix.stable; + + flakePkgs = rec { cordial = pkgs.callPackage ./. { }; }; in rec { devShell = pkgs.mkShell { + inputsFrom = with flakePkgs; [ cordial ]; + packages = (with pkgs; [ + cmake + ninja + + elixir + inotify-tools + cargo-deny cargo-edit cargo-expand diff --git a/qml/main.qml b/qml/main.qml new file mode 100644 index 0000000..e4ab803 --- /dev/null +++ b/qml/main.qml @@ -0,0 +1,56 @@ +// SPDX-FileCopyrightText: 2021 Klarälvdalens Datakonsult AB, a KDAB Group company +// SPDX-FileContributor: Andrew Hayzen +// SPDX-FileContributor: Gerhard de Clercq +// +// SPDX-License-Identifier: MIT OR Apache-2.0 + +// ANCHOR: book_main_qml +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Window 2.12 + +// ANCHOR: book_qml_import +// This must match the qml_uri and qml_version +// specified with the #[cxx_qt::qobject] macro in Rust. +import com.kdab.cxx_qt.demo 1.0 +// ANCHOR_END: book_qml_import + +Window { + height: 480 + title: qsTr("Hello World") + visible: true + width: 640 + + MyObject { + id: myObject + number: 1 + string: "My String with my number: " + myObject.number + } + + Column { + anchors.fill: parent + anchors.margins: 10 + spacing: 10 + + Label { + text: "Number: " + myObject.number + } + + Label { + text: "String: " + myObject.string + } + + Button { + text: "Increment Number" + + onClicked: myObject.incrementNumber() + } + + Button { + text: "Say Hi!" + + onClicked: myObject.sayHi(myObject.string, myObject.number) + } + } +} +// ANCHOR_END: book_main_qml diff --git a/qml/qml.qrc b/qml/qml.qrc new file mode 100644 index 0000000..225ac42 --- /dev/null +++ b/qml/qml.qrc @@ -0,0 +1,16 @@ + + + + + + + main.qml + + + diff --git a/server/.formatter.exs b/server/.formatter.exs new file mode 100644 index 0000000..ef8840c --- /dev/null +++ b/server/.formatter.exs @@ -0,0 +1,6 @@ +[ + import_deps: [:ecto, :ecto_sql, :phoenix], + subdirectories: ["priv/*/migrations"], + plugins: [Phoenix.LiveView.HTMLFormatter], + inputs: ["*.{heex,ex,exs}", "{config,lib,test}/**/*.{heex,ex,exs}", "priv/*/seeds.exs"] +] diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 0000000..338b420 --- /dev/null +++ b/server/.gitignore @@ -0,0 +1,41 @@ +# The directory Mix will write compiled artifacts to. +/_build/ + +# If you run "mix test --cover", coverage assets end up here. +/cover/ + +# The directory Mix downloads your dependencies sources to. +/deps/ + +# Where 3rd-party dependencies like ExDoc output generated docs. +/doc/ + +# Ignore .fetch files in case you like to edit your project deps locally. +/.fetch + +# If the VM crashes, it generates a dump, let's ignore it too. +erl_crash.dump + +# Also ignore archive artifacts (built via "mix archive.build"). +*.ez + +# Temporary files, for example, from tests. +/tmp/ + +# Ignore package tarball (built via "mix hex.build"). +server-*.tar + +# Ignore assets that are produced by build tools. +/priv/static/assets/ + +# Ignore digested assets cache. +/priv/static/cache_manifest.json + +# In case you use Node.js/npm, you want to ignore these. +npm-debug.log +/assets/node_modules/ + +# Database files +*.db +*.db-* + diff --git a/server/README.md b/server/README.md new file mode 100644 index 0000000..fd55506 --- /dev/null +++ b/server/README.md @@ -0,0 +1,18 @@ +# Server + +To start your Phoenix server: + + * Run `mix setup` to install and setup dependencies + * Start Phoenix endpoint with `mix phx.server` or inside IEx with `iex -S mix phx.server` + +Now you can visit [`localhost:4000`](http://localhost:4000) from your browser. + +Ready to run in production? Please [check our deployment guides](https://hexdocs.pm/phoenix/deployment.html). + +## Learn more + + * Official website: https://www.phoenixframework.org/ + * Guides: https://hexdocs.pm/phoenix/overview.html + * Docs: https://hexdocs.pm/phoenix + * Forum: https://elixirforum.com/c/phoenix-forum + * Source: https://github.com/phoenixframework/phoenix diff --git a/server/assets/css/app.css b/server/assets/css/app.css new file mode 100644 index 0000000..378c8f9 --- /dev/null +++ b/server/assets/css/app.css @@ -0,0 +1,5 @@ +@import "tailwindcss/base"; +@import "tailwindcss/components"; +@import "tailwindcss/utilities"; + +/* This file is for your main application CSS */ diff --git a/server/assets/js/app.js b/server/assets/js/app.js new file mode 100644 index 0000000..df0cdd9 --- /dev/null +++ b/server/assets/js/app.js @@ -0,0 +1,41 @@ +// If you want to use Phoenix channels, run `mix help phx.gen.channel` +// to get started and then uncomment the line below. +// import "./user_socket.js" + +// You can include dependencies in two ways. +// +// The simplest option is to put them in assets/vendor and +// import them using relative paths: +// +// import "../vendor/some-package.js" +// +// Alternatively, you can `npm install some-package --prefix assets` and import +// them using a path starting with the package name: +// +// import "some-package" +// + +// Include phoenix_html to handle method=PUT/DELETE in forms and buttons. +import "phoenix_html" +// Establish Phoenix Socket and LiveView configuration. +import {Socket} from "phoenix" +import {LiveSocket} from "phoenix_live_view" +import topbar from "../vendor/topbar" + +let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content") +let liveSocket = new LiveSocket("/live", Socket, {params: {_csrf_token: csrfToken}}) + +// Show progress bar on live navigation and form submits +topbar.config({barColors: {0: "#29d"}, shadowColor: "rgba(0, 0, 0, .3)"}) +window.addEventListener("phx:page-loading-start", _info => topbar.show(300)) +window.addEventListener("phx:page-loading-stop", _info => topbar.hide()) + +// connect if there are any LiveViews on the page +liveSocket.connect() + +// expose liveSocket on window for web console debug logs and latency simulation: +// >> liveSocket.enableDebug() +// >> liveSocket.enableLatencySim(1000) // enabled for duration of browser session +// >> liveSocket.disableLatencySim() +window.liveSocket = liveSocket + diff --git a/server/assets/tailwind.config.js b/server/assets/tailwind.config.js new file mode 100644 index 0000000..cc9e6a2 --- /dev/null +++ b/server/assets/tailwind.config.js @@ -0,0 +1,67 @@ +// See the Tailwind configuration guide for advanced usage +// https://tailwindcss.com/docs/configuration + +const plugin = require("tailwindcss/plugin") +const fs = require("fs") +const path = require("path") + +module.exports = { + content: [ + "./js/**/*.js", + "../lib/*_web.ex", + "../lib/*_web/**/*.*ex" + ], + theme: { + extend: { + colors: { + brand: "#FD4F00", + } + }, + }, + plugins: [ + require("@tailwindcss/forms"), + // Allows prefixing tailwind classes with LiveView classes to add rules + // only when LiveView classes are applied, for example: + // + //
+ // + plugin(({addVariant}) => addVariant("phx-no-feedback", [".phx-no-feedback&", ".phx-no-feedback &"])), + plugin(({addVariant}) => addVariant("phx-click-loading", [".phx-click-loading&", ".phx-click-loading &"])), + plugin(({addVariant}) => addVariant("phx-submit-loading", [".phx-submit-loading&", ".phx-submit-loading &"])), + plugin(({addVariant}) => addVariant("phx-change-loading", [".phx-change-loading&", ".phx-change-loading &"])), + + // Embeds Hero Icons (https://heroicons.com) into your app.css bundle + // See your `CoreComponents.icon/1` for more information. + // + plugin(function({matchComponents, theme}) { + let iconsDir = path.join(__dirname, "../priv/hero_icons/optimized") + let values = {} + let icons = [ + ["", "/24/outline"], + ["-solid", "/24/solid"], + ["-mini", "/20/solid"] + ] + icons.forEach(([suffix, dir]) => { + fs.readdirSync(path.join(iconsDir, dir)).map(file => { + let name = path.basename(file, ".svg") + suffix + values[name] = {name, fullPath: path.join(iconsDir, dir, file)} + }) + }) + matchComponents({ + "hero": ({name, fullPath}) => { + let content = fs.readFileSync(fullPath).toString().replace(/\r?\n|\r/g, "") + return { + [`--hero-${name}`]: `url('data:image/svg+xml;utf8,${content}')`, + "-webkit-mask": `var(--hero-${name})`, + "mask": `var(--hero-${name})`, + "background-color": "currentColor", + "vertical-align": "middle", + "display": "inline-block", + "width": theme("spacing.5"), + "height": theme("spacing.5") + } + } + }, {values}) + }) + ] +} diff --git a/server/assets/vendor/topbar.js b/server/assets/vendor/topbar.js new file mode 100644 index 0000000..4195727 --- /dev/null +++ b/server/assets/vendor/topbar.js @@ -0,0 +1,165 @@ +/** + * @license MIT + * topbar 2.0.0, 2023-02-04 + * https://buunguyen.github.io/topbar + * Copyright (c) 2021 Buu Nguyen + */ +(function (window, document) { + "use strict"; + + // https://gist.github.com/paulirish/1579671 + (function () { + var lastTime = 0; + var vendors = ["ms", "moz", "webkit", "o"]; + for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { + window.requestAnimationFrame = + window[vendors[x] + "RequestAnimationFrame"]; + window.cancelAnimationFrame = + window[vendors[x] + "CancelAnimationFrame"] || + window[vendors[x] + "CancelRequestAnimationFrame"]; + } + if (!window.requestAnimationFrame) + window.requestAnimationFrame = function (callback, element) { + var currTime = new Date().getTime(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); + var id = window.setTimeout(function () { + callback(currTime + timeToCall); + }, timeToCall); + lastTime = currTime + timeToCall; + return id; + }; + if (!window.cancelAnimationFrame) + window.cancelAnimationFrame = function (id) { + clearTimeout(id); + }; + })(); + + var canvas, + currentProgress, + showing, + progressTimerId = null, + fadeTimerId = null, + delayTimerId = null, + addEvent = function (elem, type, handler) { + if (elem.addEventListener) elem.addEventListener(type, handler, false); + else if (elem.attachEvent) elem.attachEvent("on" + type, handler); + else elem["on" + type] = handler; + }, + options = { + autoRun: true, + barThickness: 3, + barColors: { + 0: "rgba(26, 188, 156, .9)", + ".25": "rgba(52, 152, 219, .9)", + ".50": "rgba(241, 196, 15, .9)", + ".75": "rgba(230, 126, 34, .9)", + "1.0": "rgba(211, 84, 0, .9)", + }, + shadowBlur: 10, + shadowColor: "rgba(0, 0, 0, .6)", + className: null, + }, + repaint = function () { + canvas.width = window.innerWidth; + canvas.height = options.barThickness * 5; // need space for shadow + + var ctx = canvas.getContext("2d"); + ctx.shadowBlur = options.shadowBlur; + ctx.shadowColor = options.shadowColor; + + var lineGradient = ctx.createLinearGradient(0, 0, canvas.width, 0); + for (var stop in options.barColors) + lineGradient.addColorStop(stop, options.barColors[stop]); + ctx.lineWidth = options.barThickness; + ctx.beginPath(); + ctx.moveTo(0, options.barThickness / 2); + ctx.lineTo( + Math.ceil(currentProgress * canvas.width), + options.barThickness / 2 + ); + ctx.strokeStyle = lineGradient; + ctx.stroke(); + }, + createCanvas = function () { + canvas = document.createElement("canvas"); + var style = canvas.style; + style.position = "fixed"; + style.top = style.left = style.right = style.margin = style.padding = 0; + style.zIndex = 100001; + style.display = "none"; + if (options.className) canvas.classList.add(options.className); + document.body.appendChild(canvas); + addEvent(window, "resize", repaint); + }, + topbar = { + config: function (opts) { + for (var key in opts) + if (options.hasOwnProperty(key)) options[key] = opts[key]; + }, + show: function (delay) { + if (showing) return; + if (delay) { + if (delayTimerId) return; + delayTimerId = setTimeout(() => topbar.show(), delay); + } else { + showing = true; + if (fadeTimerId !== null) window.cancelAnimationFrame(fadeTimerId); + if (!canvas) createCanvas(); + canvas.style.opacity = 1; + canvas.style.display = "block"; + topbar.progress(0); + if (options.autoRun) { + (function loop() { + progressTimerId = window.requestAnimationFrame(loop); + topbar.progress( + "+" + 0.05 * Math.pow(1 - Math.sqrt(currentProgress), 2) + ); + })(); + } + } + }, + progress: function (to) { + if (typeof to === "undefined") return currentProgress; + if (typeof to === "string") { + to = + (to.indexOf("+") >= 0 || to.indexOf("-") >= 0 + ? currentProgress + : 0) + parseFloat(to); + } + currentProgress = to > 1 ? 1 : to; + repaint(); + return currentProgress; + }, + hide: function () { + clearTimeout(delayTimerId); + delayTimerId = null; + if (!showing) return; + showing = false; + if (progressTimerId != null) { + window.cancelAnimationFrame(progressTimerId); + progressTimerId = null; + } + (function loop() { + if (topbar.progress("+.1") >= 1) { + canvas.style.opacity -= 0.05; + if (canvas.style.opacity <= 0.05) { + canvas.style.display = "none"; + fadeTimerId = null; + return; + } + } + fadeTimerId = window.requestAnimationFrame(loop); + })(); + }, + }; + + if (typeof module === "object" && typeof module.exports === "object") { + module.exports = topbar; + } else if (typeof define === "function" && define.amd) { + define(function () { + return topbar; + }); + } else { + this.topbar = topbar; + } +}.call(this, window, document)); diff --git a/server/config/config.exs b/server/config/config.exs new file mode 100644 index 0000000..8a43dd4 --- /dev/null +++ b/server/config/config.exs @@ -0,0 +1,64 @@ +# This file is responsible for configuring your application +# and its dependencies with the aid of the Config module. +# +# This configuration file is loaded before any dependency and +# is restricted to this project. + +# General application configuration +import Config + +config :server, + ecto_repos: [Server.Repo] + +# Configures the endpoint +config :server, ServerWeb.Endpoint, + url: [host: "localhost"], + render_errors: [ + formats: [html: ServerWeb.ErrorHTML, json: ServerWeb.ErrorJSON], + layout: false + ], + pubsub_server: Server.PubSub, + live_view: [signing_salt: "MeV8jzfx"] + +# Configures the mailer +# +# By default it uses the "Local" adapter which stores the emails +# locally. You can see the emails in your browser, at "/dev/mailbox". +# +# For production it's recommended to configure a different adapter +# at the `config/runtime.exs`. +config :server, Server.Mailer, adapter: Swoosh.Adapters.Local + +# Configure esbuild (the version is required) +config :esbuild, + version: "0.14.41", + default: [ + args: + ~w(js/app.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/fonts/* --external:/images/*), + cd: Path.expand("../assets", __DIR__), + env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)} + ] + +# Configure tailwind (the version is required) +config :tailwind, + version: "3.2.4", + default: [ + args: ~w( + --config=tailwind.config.js + --input=css/app.css + --output=../priv/static/assets/app.css + ), + cd: Path.expand("../assets", __DIR__) + ] + +# Configures Elixir's Logger +config :logger, :console, + format: "$time $metadata[$level] $message\n", + metadata: [:request_id] + +# Use Jason for JSON parsing in Phoenix +config :phoenix, :json_library, Jason + +# Import environment specific config. This must remain at the bottom +# of this file so it overrides the configuration defined above. +import_config "#{config_env()}.exs" diff --git a/server/config/dev.exs b/server/config/dev.exs new file mode 100644 index 0000000..8fd9c1c --- /dev/null +++ b/server/config/dev.exs @@ -0,0 +1,76 @@ +import Config + +# Configure your database +config :server, Server.Repo, + database: Path.expand("../server_dev.db", Path.dirname(__ENV__.file)), + pool_size: 5, + stacktrace: true, + show_sensitive_data_on_connection_error: true + +# For development, we disable any cache and enable +# debugging and code reloading. +# +# The watchers configuration can be used to run external +# watchers to your application. For example, we use it +# with esbuild to bundle .js and .css sources. +config :server, ServerWeb.Endpoint, + # Binding to loopback ipv4 address prevents access from other machines. + # Change to `ip: {0, 0, 0, 0}` to allow access from other machines. + http: [ip: {0, 0, 0, 0}, port: System.get_env("CORDIAL_PORT") || 4000], + check_origin: false, + code_reloader: true, + debug_errors: true, + secret_key_base: "+AnNqvq22MzWyZwRlG9BldCGpl8b+bRcPcXDaDFSPvv+VhK0gaJC/w1LHJ43xOt7", + watchers: [ + esbuild: {Esbuild, :install_and_run, [:default, ~w(--sourcemap=inline --watch)]}, + tailwind: {Tailwind, :install_and_run, [:default, ~w(--watch)]} + ] + +# ## SSL Support +# +# In order to use HTTPS in development, a self-signed +# certificate can be generated by running the following +# Mix task: +# +# mix phx.gen.cert +# +# Run `mix help phx.gen.cert` for more information. +# +# The `http:` config above can be replaced with: +# +# https: [ +# port: 4001, +# cipher_suite: :strong, +# keyfile: "priv/cert/selfsigned_key.pem", +# certfile: "priv/cert/selfsigned.pem" +# ], +# +# If desired, both `http:` and `https:` keys can be +# configured to run both http and https servers on +# different ports. + +# Watch static and templates for browser reloading. +config :server, ServerWeb.Endpoint, + live_reload: [ + patterns: [ + ~r"priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$", + ~r"priv/gettext/.*(po)$", + ~r"lib/server_web/(controllers|live|components)/.*(ex|heex)$" + ] + ] + +# Enable dev routes for dashboard and mailbox +config :server, dev_routes: true + +# Do not include metadata nor timestamps in development logs +config :logger, :console, format: "[$level] $message\n" + +# Set a higher stacktrace during development. Avoid configuring such +# in production as building large stacktraces may be expensive. +config :phoenix, :stacktrace_depth, 20 + +# Initialize plugs at runtime for faster development compilation +config :phoenix, :plug_init_mode, :runtime + +# Disable swoosh api client as it is only required for production adapters. +config :swoosh, :api_client, false diff --git a/server/config/prod.exs b/server/config/prod.exs new file mode 100644 index 0000000..791cd57 --- /dev/null +++ b/server/config/prod.exs @@ -0,0 +1,21 @@ +import Config + +# For production, don't forget to configure the url host +# to something meaningful, Phoenix uses this information +# when generating URLs. + +# Note we also include the path to a cache manifest +# containing the digested version of static files. This +# manifest is generated by the `mix phx.digest` task, +# which you should run after static files are built and +# before starting your production server. +config :server, ServerWeb.Endpoint, cache_static_manifest: "priv/static/cache_manifest.json" + +# Configures Swoosh API Client +config :swoosh, api_client: Swoosh.ApiClient.Finch, finch_name: Server.Finch + +# Do not print debug messages in production +config :logger, level: :info + +# Runtime production configuration, including reading +# of environment variables, is done on config/runtime.exs. diff --git a/server/config/runtime.exs b/server/config/runtime.exs new file mode 100644 index 0000000..7186344 --- /dev/null +++ b/server/config/runtime.exs @@ -0,0 +1,111 @@ +import Config + +# config/runtime.exs is executed for all environments, including +# during releases. It is executed after compilation and before the +# system starts, so it is typically used to load production configuration +# and secrets from environment variables or elsewhere. Do not define +# any compile-time configuration in here, as it won't be applied. +# The block below contains prod specific runtime configuration. + +# ## Using releases +# +# If you use `mix release`, you need to explicitly enable the server +# by passing the PHX_SERVER=true when you start it: +# +# PHX_SERVER=true bin/server start +# +# Alternatively, you can use `mix phx.gen.release` to generate a `bin/server` +# script that automatically sets the env var above. +if System.get_env("PHX_SERVER") do + config :server, ServerWeb.Endpoint, server: true +end + +if config_env() == :prod do + database_path = + System.get_env("DATABASE_PATH") || + raise """ + environment variable DATABASE_PATH is missing. + For example: /etc/server/server.db + """ + + config :server, Server.Repo, + database: database_path, + pool_size: String.to_integer(System.get_env("POOL_SIZE") || "5") + + # The secret key base is used to sign/encrypt cookies and other secrets. + # A default value is used in config/dev.exs and config/test.exs but you + # want to use a different value for prod and you most likely don't want + # to check this value into version control, so we use an environment + # variable instead. + secret_key_base = + System.get_env("SECRET_KEY_BASE") || + raise """ + environment variable SECRET_KEY_BASE is missing. + You can generate one by calling: mix phx.gen.secret + """ + + host = System.get_env("PHX_HOST") || "example.com" + port = String.to_integer(System.get_env("PORT") || "4000") + + config :server, ServerWeb.Endpoint, + url: [host: host, port: 443, scheme: "https"], + http: [ + # Enable IPv6 and bind on all interfaces. + # Set it to {0, 0, 0, 0, 0, 0, 0, 1} for local network only access. + # See the documentation on https://hexdocs.pm/plug_cowboy/Plug.Cowboy.html + # for details about using IPv6 vs IPv4 and loopback vs public addresses. + ip: {0, 0, 0, 0, 0, 0, 0, 0}, + port: port + ], + secret_key_base: secret_key_base + + # ## SSL Support + # + # To get SSL working, you will need to add the `https` key + # to your endpoint configuration: + # + # config :server, ServerWeb.Endpoint, + # https: [ + # ..., + # port: 443, + # cipher_suite: :strong, + # keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"), + # certfile: System.get_env("SOME_APP_SSL_CERT_PATH") + # ] + # + # The `cipher_suite` is set to `:strong` to support only the + # latest and more secure SSL ciphers. This means old browsers + # and clients may not be supported. You can set it to + # `:compatible` for wider support. + # + # `:keyfile` and `:certfile` expect an absolute path to the key + # and cert in disk or a relative path inside priv, for example + # "priv/ssl/server.key". For all supported SSL configuration + # options, see https://hexdocs.pm/plug/Plug.SSL.html#configure/1 + # + # We also recommend setting `force_ssl` in your endpoint, ensuring + # no data is ever sent via http, always redirecting to https: + # + # config :server, ServerWeb.Endpoint, + # force_ssl: [hsts: true] + # + # Check `Plug.SSL` for all available options in `force_ssl`. + + # ## Configuring the mailer + # + # In production you need to configure the mailer to use a different adapter. + # Also, you may need to configure the Swoosh API client of your choice if you + # are not using SMTP. Here is an example of the configuration: + # + # config :server, Server.Mailer, + # adapter: Swoosh.Adapters.Mailgun, + # api_key: System.get_env("MAILGUN_API_KEY"), + # domain: System.get_env("MAILGUN_DOMAIN") + # + # For this example you need include a HTTP client required by Swoosh API client. + # Swoosh supports Hackney and Finch out of the box: + # + # config :swoosh, :api_client, Swoosh.ApiClient.Hackney + # + # See https://hexdocs.pm/swoosh/Swoosh.html#module-installation for details. +end diff --git a/server/config/test.exs b/server/config/test.exs new file mode 100644 index 0000000..ded9457 --- /dev/null +++ b/server/config/test.exs @@ -0,0 +1,30 @@ +import Config + +# Configure your database +# +# The MIX_TEST_PARTITION environment variable can be used +# to provide built-in test partitioning in CI environment. +# Run `mix help test` for more information. +config :server, Server.Repo, + database: Path.expand("../server_test.db", Path.dirname(__ENV__.file)), + pool_size: 5, + pool: Ecto.Adapters.SQL.Sandbox + +# We don't run a server during test. If one is required, +# you can enable the server option below. +config :server, ServerWeb.Endpoint, + http: [ip: {127, 0, 0, 1}, port: 4002], + secret_key_base: "tSIBQf4d250WmLCVFllt8X8srueitBYHj54xibPzmJrFjSFfTFDGSjZSxOvEfTBA", + server: false + +# In test we don't send emails. +config :server, Server.Mailer, adapter: Swoosh.Adapters.Test + +# Disable swoosh api client as it is only required for production adapters. +config :swoosh, :api_client, false + +# Print only warnings and errors during test +config :logger, level: :warning + +# Initialize plugs at runtime for faster test compilation +config :phoenix, :plug_init_mode, :runtime diff --git a/server/lib/server.ex b/server/lib/server.ex new file mode 100644 index 0000000..385f64c --- /dev/null +++ b/server/lib/server.ex @@ -0,0 +1,9 @@ +defmodule Server do + @moduledoc """ + Server keeps the contexts that define your domain + and business logic. + + Contexts are also responsible for managing your data, regardless + if it comes from the database, an external API or others. + """ +end diff --git a/server/lib/server/application.ex b/server/lib/server/application.ex new file mode 100644 index 0000000..7cec627 --- /dev/null +++ b/server/lib/server/application.ex @@ -0,0 +1,38 @@ +defmodule Server.Application do + # See https://hexdocs.pm/elixir/Application.html + # for more information on OTP Applications + @moduledoc false + + use Application + + @impl true + def start(_type, _args) do + children = [ + # Start the Telemetry supervisor + ServerWeb.Telemetry, + # Start the Ecto repository + Server.Repo, + # Start the PubSub system + {Phoenix.PubSub, name: Server.PubSub}, + # Start Finch + {Finch, name: Server.Finch}, + # Start the Endpoint (http/https) + ServerWeb.Endpoint + # Start a worker by calling: Server.Worker.start_link(arg) + # {Server.Worker, arg} + ] + + # See https://hexdocs.pm/elixir/Supervisor.html + # for other strategies and supported options + opts = [strategy: :one_for_one, name: Server.Supervisor] + Supervisor.start_link(children, opts) + end + + # Tell Phoenix to update the endpoint configuration + # whenever the application is updated. + @impl true + def config_change(changed, _new, removed) do + ServerWeb.Endpoint.config_change(changed, removed) + :ok + end +end diff --git a/server/lib/server/mailer.ex b/server/lib/server/mailer.ex new file mode 100644 index 0000000..eafa4de --- /dev/null +++ b/server/lib/server/mailer.ex @@ -0,0 +1,3 @@ +defmodule Server.Mailer do + use Swoosh.Mailer, otp_app: :server +end diff --git a/server/lib/server/repo.ex b/server/lib/server/repo.ex new file mode 100644 index 0000000..37933ac --- /dev/null +++ b/server/lib/server/repo.ex @@ -0,0 +1,5 @@ +defmodule Server.Repo do + use Ecto.Repo, + otp_app: :server, + adapter: Ecto.Adapters.SQLite3 +end diff --git a/server/lib/server_web.ex b/server/lib/server_web.ex new file mode 100644 index 0000000..ea30d57 --- /dev/null +++ b/server/lib/server_web.ex @@ -0,0 +1,113 @@ +defmodule ServerWeb do + @moduledoc """ + The entrypoint for defining your web interface, such + as controllers, components, channels, and so on. + + This can be used in your application as: + + use ServerWeb, :controller + use ServerWeb, :html + + The definitions below will be executed for every controller, + component, etc, so keep them short and clean, focused + on imports, uses and aliases. + + Do NOT define functions inside the quoted expressions + below. Instead, define additional modules and import + those modules here. + """ + + def static_paths, do: ~w(assets fonts images favicon.ico robots.txt) + + def router do + quote do + use Phoenix.Router, helpers: false + + # Import common connection and controller functions to use in pipelines + import Plug.Conn + import Phoenix.Controller + import Phoenix.LiveView.Router + end + end + + def channel do + quote do + use Phoenix.Channel + end + end + + def controller do + quote do + use Phoenix.Controller, + formats: [:html, :json], + layouts: [html: ServerWeb.Layouts] + + import Plug.Conn + import ServerWeb.Gettext + + unquote(verified_routes()) + end + end + + def live_view do + quote do + use Phoenix.LiveView, + layout: {ServerWeb.Layouts, :app} + + unquote(html_helpers()) + end + end + + def live_component do + quote do + use Phoenix.LiveComponent + + unquote(html_helpers()) + end + end + + def html do + quote do + use Phoenix.Component + + # Import convenience functions from controllers + import Phoenix.Controller, + only: [get_csrf_token: 0, view_module: 1, view_template: 1] + + # Include general helpers for rendering HTML + unquote(html_helpers()) + end + end + + defp html_helpers do + quote do + # HTML escaping functionality + import Phoenix.HTML + # Core UI components and translation + import ServerWeb.CoreComponents + import ServerWeb.Gettext + + # Shortcut for generating JS commands + alias Phoenix.LiveView.JS + + # Routes generation with the ~p sigil + unquote(verified_routes()) + end + end + + def verified_routes do + quote do + use Phoenix.VerifiedRoutes, + endpoint: ServerWeb.Endpoint, + router: ServerWeb.Router, + statics: ServerWeb.static_paths() + end + end + + @doc """ + When used, dispatch to the appropriate controller/view/etc. + """ + defmacro __using__(which) when is_atom(which) do + apply(__MODULE__, which, []) + end +end diff --git a/server/lib/server_web/components/core_components.ex b/server/lib/server_web/components/core_components.ex new file mode 100644 index 0000000..4a1c0f8 --- /dev/null +++ b/server/lib/server_web/components/core_components.ex @@ -0,0 +1,689 @@ +defmodule ServerWeb.CoreComponents do + @moduledoc """ + Provides core UI components. + + The components in this module use Tailwind CSS, a utility-first CSS framework. + See the [Tailwind CSS documentation](https://tailwindcss.com) to learn how to + customize the generated components in this module. + + Icons are provided by [heroicons](https://heroicons.com). See `icon/1` for usage. + """ + use Phoenix.Component + + alias Phoenix.LiveView.JS + import ServerWeb.Gettext + + @doc """ + Renders a modal. + + ## Examples + + <.modal id="confirm-modal"> + Are you sure? + <:confirm>OK + <:cancel>Cancel + + + JS commands may be passed to the `:on_cancel` and `on_confirm` attributes + for the caller to react to each button press, for example: + + <.modal id="confirm" on_confirm={JS.push("delete")} on_cancel={JS.navigate(~p"/posts")}> + Are you sure you? + <:confirm>OK + <:cancel>Cancel + + """ + attr :id, :string, required: true + attr :show, :boolean, default: false + attr :on_cancel, JS, default: %JS{} + attr :on_confirm, JS, default: %JS{} + + slot :inner_block, required: true + slot :title + slot :subtitle + slot :confirm + slot :cancel + + def modal(assigns) do + ~H""" +